From 4fb6f75173098a51c530e33b28bb8ba5e856ec43 Mon Sep 17 00:00:00 2001 From: Jacob Gadikian Date: Tue, 2 May 2023 15:21:31 +0700 Subject: [PATCH 001/108] fix: buf.yaml should specify the repository (#872) Update buf.yaml name the buf module --- proto/buf.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proto/buf.yaml b/proto/buf.yaml index 7e3b6848dd..5208a19c81 100644 --- a/proto/buf.yaml +++ b/proto/buf.yaml @@ -4,7 +4,7 @@ # This module represents the "proto" root found in # the previous configuration. version: v1 -name: buf.build/cosmos/cosmos-sdk +name: buf.build/cosmos/interchain-security deps: - buf.build/cosmos/gogo-proto - buf.build/googleapis/googleapis From 18895530b5f5fb69613b841e3406ce213b9f122a Mon Sep 17 00:00:00 2001 From: MSalopek <35486649+MSalopek@users.noreply.github.com> Date: Tue, 2 May 2023 19:53:54 +0200 Subject: [PATCH 002/108] docs: update links; add withdraw rewards (#910) * docs: update links; add withdraw rewards * docs: fix broken list --- docs/docs/adrs/adr-001-key-assignment.md | 5 ++ docs/docs/adrs/adr-002-throttle.md | 5 ++ .../adrs/adr-003-equivocation-gov-proposal.md | 4 ++ docs/docs/adrs/adr-template.md | 2 +- docs/docs/adrs/{Readme.md => intro.md} | 5 ++ docs/docs/validators/withdraw_rewards.md | 64 +++++++++++++++++++ docs/docusaurus.config.js | 5 ++ .../components/Cards/card-data/home-cards.js | 12 ++-- 8 files changed, 95 insertions(+), 7 deletions(-) rename docs/docs/adrs/{Readme.md => intro.md} (97%) create mode 100644 docs/docs/validators/withdraw_rewards.md diff --git a/docs/docs/adrs/adr-001-key-assignment.md b/docs/docs/adrs/adr-001-key-assignment.md index 66d983132b..f800219fcc 100644 --- a/docs/docs/adrs/adr-001-key-assignment.md +++ b/docs/docs/adrs/adr-001-key-assignment.md @@ -1,3 +1,8 @@ +--- +sidebar_position: 3 +title: Key Assignment +--- + # ADR 001: Key Assignment ## Changelog diff --git a/docs/docs/adrs/adr-002-throttle.md b/docs/docs/adrs/adr-002-throttle.md index bccd8e053a..ffa353c3cc 100644 --- a/docs/docs/adrs/adr-002-throttle.md +++ b/docs/docs/adrs/adr-002-throttle.md @@ -1,3 +1,8 @@ +--- +sidebar_position: 3 +title: Jail Throttling +--- + # ADR 002: Jail Throttling ## Changelog diff --git a/docs/docs/adrs/adr-003-equivocation-gov-proposal.md b/docs/docs/adrs/adr-003-equivocation-gov-proposal.md index 493c46d751..242c023010 100644 --- a/docs/docs/adrs/adr-003-equivocation-gov-proposal.md +++ b/docs/docs/adrs/adr-003-equivocation-gov-proposal.md @@ -1,3 +1,7 @@ +--- +sidebar_position: 4 +title: Equivocation governance proposal +--- # ADR 003: Equivocation governance proposal ## Changelog diff --git a/docs/docs/adrs/adr-template.md b/docs/docs/adrs/adr-template.md index a7a64f86ef..2e085330df 100644 --- a/docs/docs/adrs/adr-template.md +++ b/docs/docs/adrs/adr-template.md @@ -1,5 +1,5 @@ --- -sidebar_position: 4 +sidebar_position: 2 title: ADR Template --- # ADR {ADR-NUMBER}: {TITLE} diff --git a/docs/docs/adrs/Readme.md b/docs/docs/adrs/intro.md similarity index 97% rename from docs/docs/adrs/Readme.md rename to docs/docs/adrs/intro.md index cf13993455..aa6b7781c9 100644 --- a/docs/docs/adrs/Readme.md +++ b/docs/docs/adrs/intro.md @@ -1,3 +1,8 @@ +--- +sidebar_position: 1 +title: ADRs +--- + # Architecture Decision Records (ADR) This is a location to record all high-level architecture decisions in the Interchain Security project. diff --git a/docs/docs/validators/withdraw_rewards.md b/docs/docs/validators/withdraw_rewards.md new file mode 100644 index 0000000000..0963a4137a --- /dev/null +++ b/docs/docs/validators/withdraw_rewards.md @@ -0,0 +1,64 @@ +# Withdrawing consumer chain validator rewards + +Here are example steps for withdrawing rewards from consumer chains in the provider chain + +:::info +The examples used are from `rs-testnet`, the replicated security persistent testnet. + +Validator operator address: `cosmosvaloper1e5yfpc8l6g4808fclmlyd38tjgxuwshnmjkrq6` +Self-delegation address: `cosmos1e5yfpc8l6g4808fclmlyd38tjgxuwshn7xzkvf` +::: + +Prior to withdrawing rewards, query balances for self-delegation address: + +```bash +gaiad q bank balances cosmos1e5yfpc8l6g4808fclmlyd38tjgxuwshn7xzkvf + +balances: +- amount: "1000000000000" + denom: uatom +pagination: + next_key: null + total: "0" +``` + +## Querying validator rewards +Query rewards for the validator address: + +```bash +gaiad q distribution rewards cosmos1e5yfpc8l6g4808fclmlyd38tjgxuwshn7xzkvf cosmosvaloper1e5yfpc8l6g4808fclmlyd38tjgxuwshnmjkrq6 + +rewards: +- amount: "158.069895000000000000" + denom: ibc/2CB0E87E2A742166FEC0A18D6FBF0F6AD4AA1ADE694792C1BD6F5E99088D67FD +- amount: "841842390516.072526500000000000" + denom: uatom +``` + +The `ibc/2CB0E87E2A742166FEC0A18D6FBF0F6AD4AA1ADE694792C1BD6F5E99088D67FD` denom represents rewards from a consumer chain. + + +## Withdrawing rewards and commission + +### 1. Withdraw rewards +```bash +gaiad tx distribution withdraw-rewards cosmosvaloper1e5yfpc8l6g4808fclmlyd38tjgxuwshnmjkrq6 --from cosmos1e5yfpc8l6g4808fclmlyd38tjgxuwshn7xzkvf --commission --chain-id provider --gas auto --fees 500uatom -b block -y + +txhash: A7E384FB1958211B43B7C06527FC7D4471FB6B491EE56FDEA9C5634D76FF1B9A +``` + +### 2. Confirm withdrawal +After withdrawing rewards self-delegation address balance to confirm rewards were withdrawn: + +```bash +gaiad q bank balances cosmos1e5yfpc8l6g4808fclmlyd38tjgxuwshn7xzkvf + +balances: +- amount: "216" + denom: ibc/2CB0E87E2A742166FEC0A18D6FBF0F6AD4AA1ADE694792C1BD6F5E99088D67FD +- amount: "2233766225342" + denom: uatom +pagination: + next_key: null + total: "0" +``` diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index e9fde18889..46a3678310 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -61,6 +61,11 @@ const config = { autoCollapseCategories: true, }, }, + colorMode: { + defaultMode: 'dark', + disableSwitch: true, + respectPrefersColorScheme: false, + }, navbar: { title: "Interchain Security", hideOnScroll: false, diff --git a/docs/src/components/Cards/card-data/home-cards.js b/docs/src/components/Cards/card-data/home-cards.js index 01683b5f1a..fa2a7f4b69 100644 --- a/docs/src/components/Cards/card-data/home-cards.js +++ b/docs/src/components/Cards/card-data/home-cards.js @@ -1,31 +1,31 @@ const homeCards = [ { - href: '/introduction/overview', + href: '/interchain-security/introduction/overview', header: 'Basic concepts', summary: 'Get started with the basic concepts and ideas.' }, { - href: '/consumer-development/app-integration', + href: '/interchain-security/consumer-development/app-integration', header: 'Start building', summary: 'Click here to start building with Interchain security' }, { - href: '/features/key-assignment', + href: '/interchain-security/features/key-assignment', header: 'Feature: Key Assignment', summary: 'Learn about the key assignment feature', }, { - href: '/features/reward-distribution', + href: '/interchain-security/features/reward-distribution', header: 'Feature: Reward Distribution', summary: 'Learn about consumer chain rewards distribution', }, { - href: '/consumer-development/onboarding', + href: '/interchain-security/consumer-development/onboarding', header: 'Onboarding Checklist', summary: 'Checklist to help you integrate Interchain Security, get support and onboard validators' }, { - href: '/faq', + href: '/interchain-security/faq', header: 'FAQ', summary: 'Frequently asked questions about the protocol and its implications' }, From 0a000ff33958067b65a32a76009a7fbc13999727 Mon Sep 17 00:00:00 2001 From: Marius Poke Date: Wed, 3 May 2023 14:33:39 +0200 Subject: [PATCH 003/108] ci: add check for markdown links (#912) * add check for .md links * fixing links * fix broken links * fix broken link * adding config file * ignore false positive * check also README.md * fix broken links in README --- .github/workflows/linkchecker.yml | 14 +++++ README.md | 4 +- docs/docs/adrs/adr-002-throttle.md | 2 +- .../consumer-chain-governance.md | 2 +- docs/docs/features/proposals.md | 2 +- docs/docs/features/slashing.md | 1 + docs/docs/validators/overview.md | 2 +- docs/old/protocol_audit.md | 8 +-- docs/old/quality_assurance.md | 52 +++++++++---------- docs/old/testing.md | 12 ++--- mlc_config.json | 10 ++++ 11 files changed, 67 insertions(+), 42 deletions(-) create mode 100644 .github/workflows/linkchecker.yml create mode 100644 mlc_config.json diff --git a/.github/workflows/linkchecker.yml b/.github/workflows/linkchecker.yml new file mode 100644 index 0000000000..fb846d6a74 --- /dev/null +++ b/.github/workflows/linkchecker.yml @@ -0,0 +1,14 @@ +name: Check Markdown links +on: push +jobs: + markdown-link-check: + runs-on: ubuntu-latest + steps: + # Check out the latest version of the code + - uses: actions/checkout@v3.5.2 + + # Checks the status of hyperlinks in *.md files in docs/ + - uses: gaurav-nelson/github-action-markdown-link-check@1.0.13 + with: + folder-path: "docs" + file-path: './README.md' \ No newline at end of file diff --git a/README.md b/README.md index 80b42bb828..d7e63d11f5 100644 --- a/README.md +++ b/README.md @@ -45,11 +45,11 @@ Inspect the [Makefile](./Makefile) if curious. ## Testing -See [testing docs](./docs/testing.md). +See [testing docs](./docs/old/testing.md). ## Learn more -- [IBC Docs](https://docs.cosmos.network/master/ibc/) +- [IBC Docs](https://ibc.cosmos.network/) - [IBC Protocol](https://ibcprotocol.org/) - [IBC Specs](https://github.com/cosmos/ibc) - [Cosmos SDK documentation](https://docs.cosmos.network) diff --git a/docs/docs/adrs/adr-002-throttle.md b/docs/docs/adrs/adr-002-throttle.md index ffa353c3cc..e60c619ca9 100644 --- a/docs/docs/adrs/adr-002-throttle.md +++ b/docs/docs/adrs/adr-002-throttle.md @@ -93,7 +93,7 @@ while meter.IsPositiveOrZero() && entriesExist() { All CCV system properties should be maintained by implementing this feature, see: [CCV spec - Consumer Initiated Slashing](https://github.com/cosmos/ibc/blob/main/spec/app/ics-028-cross-chain-validation/system_model_and_properties.md#consumer-initiated-slashing). -One implementation-specific property introduced is that if any of the chain-specific packet data queues become larger than `MaxThrottledPackets (param)`, then the provider binary will panic, and the provider chain will halt. Therefore this param should be set carefully. See [SetThrottledPacketDataSize](../x/ccv/provider/keeper/throttle.go#L269). This behavior ensures that if the provider binaries are queuing up more packet data than machines can handle, the provider chain halts deterministically between validators. +One implementation-specific property introduced is that if any of the chain-specific packet data queues become larger than `MaxThrottledPackets (param)`, then the provider binary will panic, and the provider chain will halt. Therefore this param should be set carefully. See `SetThrottledPacketDataSize`. This behavior ensures that if the provider binaries are queuing up more packet data than machines can handle, the provider chain halts deterministically between validators. ### Main Throttling Property diff --git a/docs/docs/consumer-development/consumer-chain-governance.md b/docs/docs/consumer-development/consumer-chain-governance.md index fce5a7014e..ca99286d93 100644 --- a/docs/docs/consumer-development/consumer-chain-governance.md +++ b/docs/docs/consumer-development/consumer-chain-governance.md @@ -22,4 +22,4 @@ For an example, see [Neutron](https://github.com/neutron-org/neutron/). ## The Whitelist -Not everything on a consumer chain can be changed by the consumer's governance. Some settings having to do with consensus etc. can only be changed by the provider chain. Consumer chains include a whitelist of parameters that are allowed to be changed by the consumer chain governance. For an example whitelist, see [Neutron's](https://github.com/neutron-org/neutron/blob/main/app/proposals_whitelisting.go). +Not everything on a consumer chain can be changed by the consumer's governance. Some settings having to do with consensus etc. can only be changed by the provider chain. Consumer chains include a whitelist of parameters that are allowed to be changed by the consumer chain governance. For an example, see [Neutron's](https://github.com/neutron-org/neutron/blob/main/app/proposals_allowlisting.go) whitelist. diff --git a/docs/docs/features/proposals.md b/docs/docs/features/proposals.md index 3ba208b342..9285baa62b 100644 --- a/docs/docs/features/proposals.md +++ b/docs/docs/features/proposals.md @@ -45,7 +45,7 @@ Minimal example: "binary_hash": "376cdbd3a222a3d5c730c9637454cd4dd925e2f9e2e0d0f3702fc922928583f1" } ``` -More examples can be found in the replicated security testnet repository [here](https://github.com/cosmos/testnets/blob/master/replicated-security/baryon-1/proposal-baryon-1.json) and [here](https://github.com/cosmos/testnets/blob/master/replicated-security/noble-1/proposal-noble-1.json). +More examples can be found in the replicated security testnet repository [here](https://github.com/cosmos/testnets/blob/master/replicated-security/baryon-1/proposal-baryon-1.json) and [here](https://github.com/cosmos/testnets/blob/master/replicated-security/noble-1/start-proposal-noble-1.json). ## `ConsumerRemovalProposal` Proposal type used to suggest removing an existing consumer chain. diff --git a/docs/docs/features/slashing.md b/docs/docs/features/slashing.md index 65d14c0b41..a28b16e8c2 100644 --- a/docs/docs/features/slashing.md +++ b/docs/docs/features/slashing.md @@ -32,4 +32,5 @@ The offending validator will only be slashed (and tombstoned) if an `Equivocatio The offending validator will effectively get slashed and tombstoned on all consumer chains. ::: + You can find instructions on creating `EquivocationProposal`s [here](./proposals#equivocationproposal). diff --git a/docs/docs/validators/overview.md b/docs/docs/validators/overview.md index 2f5cdc4369..5a670f0780 100644 --- a/docs/docs/validators/overview.md +++ b/docs/docs/validators/overview.md @@ -101,5 +101,5 @@ For more information check our the [Key assignment overview and guide](../featur ## References: - [Cosmos Hub Validators FAQ](https://hub.cosmos.network/main/validators/validator-faq.html) - [Cosmos Hub Running a validator](https://hub.cosmos.network/main/validators/validator-setup.html) -- [Startup Sequence](https://github.com/cosmos/ics-testnets/blob/main/docs/Consumer-Chain-Start-Process.md) +- [Startup Sequence](https://github.com/cosmos/testnets/blob/master/replicated-security/CONSUMER_LAUNCH_GUIDE.md#chain-launch) - [Submit Unjailing Transaction](https://hub.cosmos.network/main/validators/validator-setup.html#unjail-validator) diff --git a/docs/old/protocol_audit.md b/docs/old/protocol_audit.md index 878f41ab12..66a164c678 100644 --- a/docs/old/protocol_audit.md +++ b/docs/old/protocol_audit.md @@ -6,7 +6,7 @@ For a general overview of the quality assurance process necessary for the releas ## Reading / onboarding materials -- Interchain Security [specification](https://github.com/cosmos/ibc/blob/marius/ccv/spec/app/ics-028-cross-chain-validation/README.md) +- Interchain Security [specification](https://github.com/cosmos/ibc/blob/main/spec/app/ics-028-cross-chain-validation/README.md) - Quality Assurance [overview](./quality_assurance.md) ## Plan @@ -16,11 +16,11 @@ Priority of concerns: 2. The correctness (safety and liveness) of the Interchain Security protocol, see [QA overview](./quality_assurance.md#interchain-security-protocol-correctness). Sub-protocols to focus on: -- [Channel Initialization](https://github.com/cosmos/ibc/blob/marius/ccv/spec/app/ics-028-cross-chain-validation/overview_and_basic_concepts.md#channel-initialization) +- [Channel Initialization](https://github.com/cosmos/ibc/blob/main/spec/app/ics-028-cross-chain-validation/overview_and_basic_concepts.md#channel-initialization) -- [Validator Set Update](https://github.com/cosmos/ibc/blob/marius/ccv/spec/app/ics-028-cross-chain-validation/overview_and_basic_concepts.md#validator-set-update) with a focus on [Completion of Unbonding Operations](https://github.com/cosmos/ibc/blob/marius/ccv/spec/app/ics-028-cross-chain-validation/overview_and_basic_concepts.md#completion-of-unbonding-operations) (**good starting point**) +- [Validator Set Update](https://github.com/cosmos/ibc/blob/main/spec/app/ics-028-cross-chain-validation/overview_and_basic_concepts.md#validator-set-update) with a focus on [Completion of Unbonding Operations](https://github.com/cosmos/ibc/blob/main/spec/app/ics-028-cross-chain-validation/overview_and_basic_concepts.md#completion-of-unbonding-operations) (**good starting point**) -- [Consumer Initiated Slashing](https://github.com/cosmos/ibc/blob/marius/ccv/spec/app/ics-028-cross-chain-validation/overview_and_basic_concepts.md#consumer-initiated-slashing) +- [Consumer Initiated Slashing](https://github.com/cosmos/ibc/blob/main/spec/app/ics-028-cross-chain-validation/overview_and_basic_concepts.md#consumer-initiated-slashing) diff --git a/docs/old/quality_assurance.md b/docs/old/quality_assurance.md index 70d24630be..327e5acb7e 100644 --- a/docs/old/quality_assurance.md +++ b/docs/old/quality_assurance.md @@ -47,25 +47,25 @@ IBC packets: | ID | Concern | Code Review | Unit Testing | Integration Testing | Diff. Testing | Testnet | | -- | ------- | ----------- | ------------ | ----------- | ------------- | ------- | -| 2.01 | Create IBC clients | `Scheduled` (ibc-go) | `Done` [TestCreateConsumerClient](../x/ccv/provider/keeper/proposal_test.go#117), [TestInitGenesis](../x/ccv/consumer/keeper/genesis_test.go#26) | `Done` [SetupTest](../tests/integration/setup.go) | `Future work` | `Scheduled` | -| 2.02 | Create CCV channel (handshake) | `Scheduled` (ibc-go) | `Done` [provider/ibc_module_test.go](../x/ccv/provider/ibc_module_test.go), [consumer/ibc_module_test.go](../x/ccv/consumer/ibc_module_test.go) | `Done` [SetupCCVChannel](../tests/integration/setup.go) | `Future work` | `Scheduled` | -| 2.03 | Sending IBC packets | `Scheduled` (ibc-go) | `NA` | `Done` [TestSendVSCMaturedPackets](../tests/integration/valset_update.go), [TestSendSlashPacket](../tests/integration/slashing.go) | `Done` | `Scheduled` | -| 2.04 | Handling acknowledgments | `Scheduled` (ibc-go) | [Scheduled](https://github.com/cosmos/interchain-security/issues/362) | `Partial coverage` [TestOnAcknowledgementPacket](../x/ccv/consumer/keeper/relay_test.go#152), [TestSlashPacketAcknowldgement](../tests/integration/slashing.go) | `Done` | `Scheduled` | +| 2.01 | Create IBC clients | `Scheduled` (ibc-go) | `Done` [TestCreateConsumerClient](../../x/ccv/provider/keeper/proposal_test.go#117), [TestInitGenesis](../../x/ccv/consumer/keeper/genesis_test.go#26) | `Done` [SetupTest](../../tests/integration/setup.go) | `Future work` | `Scheduled` | +| 2.02 | Create CCV channel (handshake) | `Scheduled` (ibc-go) | `Done` [provider/ibc_module_test.go](../../x/ccv/provider/ibc_module_test.go), [consumer/ibc_module_test.go](../../x/ccv/consumer/ibc_module_test.go) | `Done` [SetupCCVChannel](../../tests/integration/setup.go) | `Future work` | `Scheduled` | +| 2.03 | Sending IBC packets | `Scheduled` (ibc-go) | `NA` | `Done` [TestSendVSCMaturedPackets](../../tests/integration/valset_update.go), [TestSendSlashPacket](../../tests/integration/slashing.go) | `Done` | `Scheduled` | +| 2.04 | Handling acknowledgments | `Scheduled` (ibc-go) | [Scheduled](https://github.com/cosmos/interchain-security/issues/362) | `Partial coverage` [TestOnAcknowledgementPacket](../../x/ccv/consumer/keeper/relay_test.go#152), [TestSlashPacketAcknowldgement](../../tests/integration/slashing.go) | `Done` | `Scheduled` | | 2.05 | Handling timeouts | `Scheduled` (ibc-go) | [Scheduled](https://github.com/cosmos/interchain-security/issues/362) |`NA` | `Future work` | `Scheduled` | -| 2.06 | Handling IBC client expiration | `Scheduled` (ibc-go) | `NA` | `Done` [expired_client.go](../tests/integration/expired_client.go) | `Future work` | `Scheduled` | -| 2.07 | ICS-20 channel creation | `Scheduled` (ibc-go) | `NA` | `Done` [SetupTransferChannel](../tests/integration/setup.go) |`Future work` | `Scheduled` | -| 2.08 | ICS-20 transfer | `Scheduled` (ibc-go) | `NA` | `Done` [TestRewardsDistribution](../tests/integration/distribution.go) | `NA` | `Scheduled` | +| 2.06 | Handling IBC client expiration | `Scheduled` (ibc-go) | `NA` | `Done` [expired_client.go](../../tests/integration/expired_client.go) | `Future work` | `Scheduled` | +| 2.07 | ICS-20 channel creation | `Scheduled` (ibc-go) | `NA` | `Done` [SetupTransferChannel](../../tests/integration/setup.go) |`Future work` | `Scheduled` | +| 2.08 | ICS-20 transfer | `Scheduled` (ibc-go) | `NA` | `Done` [TestRewardsDistribution](../../tests/integration/distribution.go) | `NA` | `Scheduled` | | 2.09 | Changes in IBC-GO testing suite | `Scheduled` (ibc-go) | `NA` | `NA` | `Partial coverage` | `NA` | ### Integration with Cosmos SDK -- [x] A prerequisite of the code review is to open a PR with all the [SDK changes](https://github.com/cosmos/cosmos-sdk/tree/interchain-security-rebase) needed by Interchain Security. +- [x] A prerequisite of the code review is to open a PR with all the SDK changes needed by Interchain Security. | ID | Concern | Code Review | Unit Testing | Integration Testing | Diff. Testing | Testnet | | -- | ------- | ----------- | ------------ | ----------- | ------------- | ------- | -| 3.01 | Changes to staking module | `Done` | `Done` [unbonding_test.go](https://github.com/cosmos/cosmos-sdk/blob/interchain-security-rebase.0.45.6/x/staking/keeper/unbonding_test.go) | `Partial coverage`
[unbonding_test.go](../tests/integration/unbonding.go)
redelegation could be expanded, validator unbonding missing | `Partial coverage` | `Scheduled` | -| 3.02 | Changes to slashing module | `Done` | `NA` | `Done`
[TestValidatorDowntime](../tests/integration/slashing.go)
| `Partial coverage` | `Scheduled` | -| 3.03 | Changes to evidence module | `Done` | `NA` | `Done`
[TestValidatorDoubleSigning](../tests/integration/slashing.go)
| `NA` | `Scheduled` | +| 3.01 | Changes to staking module | `Done` | `Done` [unbonding_test.go](https://github.com/cosmos/cosmos-sdk/blob/main/x/staking/keeper/unbonding_test.go) | `Partial coverage`
[unbonding_test.go](../../tests/integration/unbonding.go)
redelegation could be expanded, validator unbonding missing | `Partial coverage` | `Scheduled` | +| 3.02 | Changes to slashing module | `Done` | `NA` | `Done`
[TestValidatorDowntime](../../tests/integration/slashing.go)
| `Partial coverage` | `Scheduled` | +| 3.03 | Changes to evidence module | `Done` | `NA` | `Done`
[TestValidatorDoubleSigning](../../tests/integration/slashing.go)
| `NA` | `Scheduled` | ### Provider Chain Correctness @@ -77,18 +77,18 @@ The main concern addressed in this section is the correctness of the provider ch | ID | Concern | Code Review | Unit Testing | Integration Testing | Diff. Testing | Testnet | Protocol audit | | -- | ------- | ----------- | ------------ | --- | ------------- | ------- | -------------- | -| 4.01 | Liveness of undelegations
- unbonding delegation entries are eventually removed from `UnbondingDelegation` | `Scheduled` | `NA` | `Done`
[unbonding_test.go](../tests/integration/unbonding.go) | `Done` | `Scheduled` | `NA` | +| 4.01 | Liveness of undelegations
- unbonding delegation entries are eventually removed from `UnbondingDelegation` | `Scheduled` | `NA` | `Done`
[unbonding_test.go](../../tests/integration/unbonding.go) | `Done` | `Scheduled` | `NA` | | 4.02 | Liveness of redelegations
- redelegations entries are eventually removed from `Redelegations` | `Scheduled` | `NA` | `Scheduled` | `Scheduled` | `Scheduled` | `NA` | | 4.03 | Liveness of validator unbondings
- unbonding validators with no delegations are eventually removed from `Validators` | `Scheduled` | `NA` | `NA` | `Done` | `Scheduled` | `NA` | -| 4.04 | Unbonding operations (undelegations, redelegations, validator unbondings) should eventually complete even if the CCV channel is never established (due to error)
- expected outcome: the channel initialization sub-protocol eventually times out, which leads to the consumer chain removal | `Scheduled` | `NA` | `Done` [TestUndelegationDuringInit](../tests/integration/unbonding.go) | `Future work` | `Scheduled` | `Done` | -| 4.05 | Unbonding operations (undelegations, redelegations, validator unbondings) should eventually complete even if one of the clients expire
- expected outcome: the pending VSC packets eventually timeout, which leads to the consumer chain removal | `Scheduled` | `NA` | `Done` [TestUndelegationVscTimeout](../tests/integration/unbonding.go) | `Future work` | `Scheduled` | `NA` | -| 4.06 | A validator cannot get slashed more than once for double signing, regardless of how many times it double signs on different chains (consumers or provider) | `Scheduled` | `NA` |`Done`
[TestHandleSlashPacketErrors](../tests/integration/slashing.go) | `Done` | `Scheduled` | `NA` | -| 4.07 | A validator cannot get slashed multiple times for downtime on the same consumer chain without requesting to `Unjail` itself on the provider chain in between | `Scheduled` | `NA` | `Partial coverage`
[TestSendSlashPacket](../tests/integration/slashing.go) | `Partial coverage` | `Scheduled` | `NA` | +| 4.04 | Unbonding operations (undelegations, redelegations, validator unbondings) should eventually complete even if the CCV channel is never established (due to error)
- expected outcome: the channel initialization sub-protocol eventually times out, which leads to the consumer chain removal | `Scheduled` | `NA` | `Done` [TestUndelegationDuringInit](../../tests/integration/unbonding.go) | `Future work` | `Scheduled` | `Done` | +| 4.05 | Unbonding operations (undelegations, redelegations, validator unbondings) should eventually complete even if one of the clients expire
- expected outcome: the pending VSC packets eventually timeout, which leads to the consumer chain removal | `Scheduled` | `NA` | `Done` [TestUndelegationVscTimeout](../../tests/integration/unbonding.go) | `Future work` | `Scheduled` | `NA` | +| 4.06 | A validator cannot get slashed more than once for double signing, regardless of how many times it double signs on different chains (consumers or provider) | `Scheduled` | `NA` |`Done`
[TestHandleSlashPacketErrors](../../tests/integration/slashing.go) | `Done` | `Scheduled` | `NA` | +| 4.07 | A validator cannot get slashed multiple times for downtime on the same consumer chain without requesting to `Unjail` itself on the provider chain in between | `Scheduled` | `NA` | `Partial coverage`
[TestSendSlashPacket](../../tests/integration/slashing.go) | `Partial coverage` | `Scheduled` | `NA` | | 4.08 | A validator can be slashed multiple times for downtime on different chains | `Scheduled` | `NA` | `Future work` | `NA` | `Scheduled` | `NA` | -| 4.09 | The provider chain can easily be restarted with IS enabled
- `ExportGenesis` & `InitGenesis`
- requires https://github.com/informalsystems/hermes/issues/1152| `Scheduled` | `Done`
[TestInitAndExportGenesis](../x/ccv/provider/keeper/genesis_test.go#L20) | `Future work` | `Future work` | `Scheduled` | `NA` | +| 4.09 | The provider chain can easily be restarted with IS enabled
- `ExportGenesis` & `InitGenesis`
- requires https://github.com/informalsystems/hermes/issues/1152| `Scheduled` | `Done`
[TestInitAndExportGenesis](../../x/ccv/provider/keeper/genesis_test.go#L20) | `Future work` | `Future work` | `Scheduled` | `NA` | | 4.10 | The provider chain can graciously handle a CCV packet timing out (without shuting down)
- expected outcome: consumer chain shuts down and its state in provider CCV module is removed | `Scheduled` | `Scheduled` | `NA` | `Future work` | `Scheduled` | `NA` | -| 4.11 | The provider chain can graciously handle a `ConsumerRemovalProposal`
- expected outcome: consumer chain shuts down and its state in provider CCV module is removed | `Scheduled` | `Done`
[TestHandleConsumerRemovalProposal](../x/ccv/provider/keeper/proposal_test.go#L313) | `NA` | `Future work` | `Scheduled` | `NA` | -| 4.12 | The provider chain can graciously handle a `ConsumerAdditionProposal`
- expected outcome: a consumer chain is registered and a client is created | `Scheduled` |`Done`
[TestHandleConsumerAdditionProposal](../x/ccv/provider/keeper/proposal_test.go#L31) | `NA` | `Future work` | `Scheduled` | `NA` | +| 4.11 | The provider chain can graciously handle a `ConsumerRemovalProposal`
- expected outcome: consumer chain shuts down and its state in provider CCV module is removed | `Scheduled` | `Done`
[TestHandleConsumerRemovalProposal](../../x/ccv/provider/keeper/proposal_test.go#L313) | `NA` | `Future work` | `Scheduled` | `NA` | +| 4.12 | The provider chain can graciously handle a `ConsumerAdditionProposal`
- expected outcome: a consumer chain is registered and a client is created | `Scheduled` |`Done`
[TestHandleConsumerAdditionProposal](../../x/ccv/provider/keeper/proposal_test.go#L31) | `NA` | `Future work` | `Scheduled` | `NA` | ### Interchain Security Protocol Correctness @@ -107,8 +107,8 @@ In addition, the implementation MUST guarantee the following [system properties] | ID | Concern re. _Channel Uniqueness_ | Code Review | Unit Testing | Intg Testing | Diff. Testing | Testnet | Protocol audit | | -- | -------------------------------- | ----------- | ------------ | ----------- | ------------- | ------- | -------------- | -| 5.01 | `HandleConsumerAdditionProposal()` should fail if a consumer with `chainId` is already registered | `Scheduled` | `Done` [TestCreateConsumerClient](../x/ccv/provider/keeper/proposal_test.go#L116) | `NA` | `NA` | `Scheduled` | `NA` | -| 5.02 | The channel handshake for a consumer with `chainId` should fail if there is already an established CCV channel for `chainId` | `Scheduled` | `Done` [TestOnChanOpenTry](../x/ccv/provider/ibc_module_test.go#L103), [TestOnChanOpenInit](../x/ccv/consumer/ibc_module_test.go#L59) | `NA` | `NA` | `Scheduled` | `NA` | +| 5.01 | `HandleConsumerAdditionProposal()` should fail if a consumer with `chainId` is already registered | `Scheduled` | `Done` [TestCreateConsumerClient](../../x/ccv/provider/keeper/proposal_test.go#L116) | `NA` | `NA` | `Scheduled` | `NA` | +| 5.02 | The channel handshake for a consumer with `chainId` should fail if there is already an established CCV channel for `chainId` | `Scheduled` | `Done` [TestOnChanOpenTry](../../x/ccv/provider/ibc_module_test.go#L103), [TestOnChanOpenInit](../../x/ccv/consumer/ibc_module_test.go#L59) | `NA` | `NA` | `Scheduled` | `NA` | | 5.03 | _Channel Uniqueness_ should hold even if a consumer chain restarts | `Scheduled` | `NA` | `Scheduled` | `NA` | `Scheduled` | `NA` | | 5.04 | _Channel Uniqueness_ should hold even when a client expires | `Scheduled` | `NA` | `Scheduled` | `NA` | `Scheduled` | `NA` | @@ -138,7 +138,7 @@ In addition, the implementation MUST guarantee the following [system properties] | ID | Concern re. _Consumer Rewards Distribution_ | Code Review | Unit Testing | Integration Testing | Diff. testing | Testnet | Protocol audit | | -- | ------------------------------------------- | ----------- | ------------ | ----------- | ------------- | ------- | -------------- | -| 9.01 | Validators on the provider chain receive rewards for participating in IS | `Scheduled` | `NA` | `Done` [TestRewardsDistribution](../tests/integration/distribution.go) | `NA` | `Scheduled` | `NA` | +| 9.01 | Validators on the provider chain receive rewards for participating in IS | `Scheduled` | `NA` | `Done` [TestRewardsDistribution](../../tests/integration/distribution.go) | `NA` | `Scheduled` | `NA` | | 9.02 | The rewards sent to the provider chain are escrowed on the consumer chains (no double spend) | `Scheduled` | `NA` | `Scheduled` | `NA` | `Scheduled` | `NA` | --- @@ -157,7 +157,7 @@ The main concern addressed in this section is the correctness of the consumer ch | 10.02 | A chain has the ability to restart as a consumer chain with no more than 24 hours downtime | `Scheduled` | `NA` | `NA` | `NA` | `Scheduled` | `NA` | | 10.03 | A consumer chain has the ability to restart as a normal chain after shutting down, either controlled (via `ConsumerRemovalProposal`) or due to timing out | `Scheduled` | `NA` | `NA` | `NA` | `Scheduled` | `NA` | | 10.04 | A consumer chain has the ability to restart as a consumer chain with the same `chainId` after shutting down, either controlled (via `ConsumerRemovalProposal`) or due to timing out | `Scheduled` | `NA` | `Scheduled` | `NA` | `Scheduled` | `NA` | -| 10.05 | Governance on `gov-cc` | `Scheduled` | `NA` | `Partial Coverage` [TestDemocracyGovernanceWhitelisting](../tests/integration/distribution.go) | `Scheduled` | `Scheduled` | `NA` | +| 10.05 | Governance on `gov-cc` | `Scheduled` | `NA` | `Partial Coverage` [TestDemocracyGovernanceWhitelisting](../../tests/integration/distribution.go) | `Scheduled` | `Scheduled` | `NA` | | 10.06 | CosmWasm on `wasm-cc` | `Scheduled` | `NA` | `Scheduled` | `NA` | `Scheduled` | `NA` | | TBA ... @@ -167,8 +167,8 @@ The main concern addressed in this section is the correctness of the consumer ch The following diagrams show (in orange) the events that influence the operation of Interchain Security -- during creating consumer chains, normal operation, and removing consumer chains. These events are the result of actions that can be performed by the existing actors, i.e., users (token holders), validators, and relayers. -![Creating Consumer Chains](./figures/is_init_overview.png?raw=true) +![Creating Consumer Chains](./../figures/is_init_overview.png?raw=true) -![Normal Operation](./figures/is_normalop_overview.png?raw=true) +![Normal Operation](./../figures/is_normalop_overview.png?raw=true) -![Remove Consumer Chains](./figures/is_remove_overview.png?raw=true) +![Remove Consumer Chains](./../figures/is_remove_overview.png?raw=true) diff --git a/docs/old/testing.md b/docs/old/testing.md index 826da0ad84..4c288f5136 100644 --- a/docs/old/testing.md +++ b/docs/old/testing.md @@ -6,21 +6,21 @@ To increase confidence in the correctness of the Interchain Security code we con Unit tests are useful for simple standalone functionality, and CRUD operations. Unit tests should use golang's standard testing package, and be defined in files formatted as ```_test.go``` in the same directory as the file being tested, following standard conventions. -[Mocked external keepers](./testutil/keeper/mocks.go) (implemented with [gomock](https://github.com/golang/mock)) are available for testing code that briefly interacts with external modules, but still only a single function/method relevant to ccv, and a single chain. Ie. do not use mocked external keepers to test the integration of the ccv module with external modules, or integration between consumer and provider. +[Mocked external keepers](../../testutil/keeper/mocks.go) (implemented with [gomock](https://github.com/golang/mock)) are available for testing code that briefly interacts with external modules, but still only a single function/method relevant to ccv, and a single chain. Ie. do not use mocked external keepers to test the integration of the ccv module with external modules, or integration between consumer and provider. ## Integration Tests -[integration-tests](./tests/integration/) utilize the [IBC Testing Package](https://github.com/cosmos/ibc-go/tree/main/testing), and test functionality that is wider in scope than a unit test, but still able to be validated in-memory. Ie. code where advancing blocks would be useful, simulated handshakes, simulated packet relays, etc. +[integration-tests](../../tests/integration/) utilize the [IBC Testing Package](https://github.com/cosmos/ibc-go/tree/main/testing), and test functionality that is wider in scope than a unit test, but still able to be validated in-memory. Ie. code where advancing blocks would be useful, simulated handshakes, simulated packet relays, etc. -To run integration tests against your own consumer/provider implementations, use [instance_test.go](./tests/integration/instance_test.go) as an example. All you'll need to do is make sure your applications implement the necessary interfaces defined in [interfaces.go](./testutil/integration/interfaces.go), pattern match [specific_setup.go](./testutil/ibc_testing/specific_setup.go), then pass in the appropriate types and parameters to the suite, as is done in `instance_test.go` for the dummy provider/consumer implementations. +To run integration tests against your own consumer/provider implementations, use [instance_test.go](../../tests/integration/instance_test.go) as an example. All you'll need to do is make sure your applications implement the necessary interfaces defined in [interfaces.go](../../testutil/integration/interfaces.go), pattern match [specific_setup.go](../../testutil/ibc_testing/specific_setup.go), then pass in the appropriate types and parameters to the suite, as is done in `instance_test.go` for the dummy provider/consumer implementations. ## Differential Tests (WIP) -[Differential tests](./tests/difference/) is similar to integration tests, but they compare the system state to an expected state generated from a model implementation. +[Differential tests](../../tests/difference/) is similar to integration tests, but they compare the system state to an expected state generated from a model implementation. ## End-to-End (E2E) Tests -[E2E tests](./tests/e2e/) run true consumer and provider chain binaries within a docker container and are relevant to the highest level of functionality. E2E tests use queries/transactions invoked from CLI to drive and validate the code. +[E2E tests](../../tests/e2e/) run true consumer and provider chain binaries within a docker container and are relevant to the highest level of functionality. E2E tests use queries/transactions invoked from CLI to drive and validate the code. ## Running Tests Tests can be run using `make`: @@ -94,7 +94,7 @@ gofmt -w -s -e . go vet ./... ``` -Some useful tools are included in the repository using [pre-commit](https://pre-commit.com/hooks.html). pre-commit lets you run developer tools either on every git commit, or manually with `pre-commit run --all-files`. See the [config](./.pre-commit-config.yaml) for details. In this repo the hooks are not installed to git, as that can be cumbersome, but it is still possible to benefit from them. +Some useful tools are included in the repository using [pre-commit](https://pre-commit.com/hooks.html). pre-commit lets you run developer tools either on every git commit, or manually with `pre-commit run --all-files`. See the [config](../../.pre-commit-config.yaml) for details. In this repo the hooks are not installed to git, as that can be cumbersome, but it is still possible to benefit from them. ```bash ## Prerequisites diff --git a/mlc_config.json b/mlc_config.json new file mode 100644 index 0000000000..cb4ad264b2 --- /dev/null +++ b/mlc_config.json @@ -0,0 +1,10 @@ +{ + "ignorePatterns": [ ], + "replacementPatterns": [ ], + "httpHeaders": [ ], + "timeout": "20s", + "retryOn429": true, + "retryCount": 5, + "fallbackRetryDelay": "30s", + "aliveStatusCodes": [200, 206] + } \ No newline at end of file From 94fc6c5d7b1d469950428ea60b6df70929487e51 Mon Sep 17 00:00:00 2001 From: Jacob Gadikian Date: Thu, 4 May 2023 23:29:06 +0700 Subject: [PATCH 004/108] update golangci-lint configuration (#914) * break gofumpt settings into the proper location and account for multi-module style by not specifying a global module path * Properly use the gofumpt extra settings --- .golangci.yml | 15 ++++++++------- tests/difference/core/driver/core_test.go | 4 ++-- tests/difference/core/driver/setup.go | 4 ++-- tests/e2e/actions.go | 2 +- tests/integration/common.go | 4 ++-- tests/integration/setup.go | 2 +- x/ccv/consumer/types/params.go | 2 +- x/ccv/provider/keeper/proposal_test.go | 4 ++-- 8 files changed, 19 insertions(+), 18 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 316bf3c57e..430440a76f 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -31,14 +31,11 @@ linters: - unconvert - unused + + + + issues: - gofumpt: - # Module path which contains the source code being formatted. - # Default: "" - module-path: github.com/cosmos/interchain-security - # Choose whether to use the extra rules. - # Default: false - extra-rules: true exclude-rules: - text: "Use of weak random number generator" linters: @@ -63,6 +60,10 @@ issues: max-same-issues: 10000 linters-settings: + gofumpt: + # Choose whether to use the extra rules. + # Default: false + extra-rules: true gocritic: disabled-checks: - appendAssign diff --git a/tests/difference/core/driver/core_test.go b/tests/difference/core/driver/core_test.go index 265dcd4227..8d54f2560a 100644 --- a/tests/difference/core/driver/core_test.go +++ b/tests/difference/core/driver/core_test.go @@ -151,7 +151,7 @@ func (s *CoreSuite) delegatorBalance() int64 { } // delegate delegates amt tokens to validator val -func (s *CoreSuite) delegate(val int64, amt int64) { +func (s *CoreSuite) delegate(val, amt int64) { server := stakingkeeper.NewMsgServerImpl(s.providerStakingKeeper()) coin := sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(amt)) d := s.delegator() @@ -163,7 +163,7 @@ func (s *CoreSuite) delegate(val int64, amt int64) { } // undelegate undelegates amt tokens from validator val -func (s *CoreSuite) undelegate(val int64, amt int64) { +func (s *CoreSuite) undelegate(val, amt int64) { server := stakingkeeper.NewMsgServerImpl(s.providerStakingKeeper()) coin := sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(amt)) d := s.delegator() diff --git a/tests/difference/core/driver/setup.go b/tests/difference/core/driver/setup.go index 349ec74fa5..64611da7cc 100644 --- a/tests/difference/core/driver/setup.go +++ b/tests/difference/core/driver/setup.go @@ -356,7 +356,7 @@ func (b *Builder) setSigningInfos() { // Checks that the lexicographic ordering of validator addresses as computed in // the staking module match the ordering of validators in the model. func (b *Builder) ensureValidatorLexicographicOrderingMatchesModel() { - check := func(lesser sdk.ValAddress, greater sdk.ValAddress) { + check := func(lesser, greater sdk.ValAddress) { lesserV, _ := b.providerStakingKeeper().GetValidator(b.providerCtx(), lesser) greaterV, _ := b.providerStakingKeeper().GetValidator(b.providerCtx(), greater) lesserKey := stakingtypes.GetValidatorsByPowerIndexKey(lesserV, sdk.DefaultPowerReduction) @@ -525,7 +525,7 @@ func (b *Builder) createConsumerGenesis(client *ibctmtypes.ClientState) *consume func GetZeroState( suite *suite.Suite, initState InitState, -) (path *ibctesting.Path, addrs []sdk.ValAddress, heightLastCommitted int64, timeLastCommitted int64) { +) (path *ibctesting.Path, addrs []sdk.ValAddress, heightLastCommitted, timeLastCommitted int64) { b := Builder{initState: initState, suite: suite} b.createProviderAndConsumer() diff --git a/tests/e2e/actions.go b/tests/e2e/actions.go index f5b8946188..e17d751c24 100644 --- a/tests/e2e/actions.go +++ b/tests/e2e/actions.go @@ -1036,7 +1036,7 @@ func (tr TestRun) invokeDowntimeSlash(action downtimeSlashAction, verbose bool) } // Sets validator downtime by setting the virtual ethernet interface of a node to "up" or "down" -func (tr TestRun) setValidatorDowntime(chain chainID, validator validatorID, down bool, verbose bool) { +func (tr TestRun) setValidatorDowntime(chain chainID, validator validatorID, down, verbose bool) { var lastArg string if down { lastArg = "down" diff --git a/tests/integration/common.go b/tests/integration/common.go index 77fa7c30c3..6daff30e02 100644 --- a/tests/integration/common.go +++ b/tests/integration/common.go @@ -112,7 +112,7 @@ func delegateAndUndelegate(s *CCVTestSuite, delAddr sdk.AccAddress, bondAmt sdk. // Note: This function advances blocks in-between operations, where validator powers are // not checked, since they are checked in integration tests. func delegateAndRedelegate(s *CCVTestSuite, delAddr sdk.AccAddress, - srcValAddr sdk.ValAddress, dstValAddr sdk.ValAddress, amount sdk.Int, + srcValAddr, dstValAddr sdk.ValAddress, amount sdk.Int, ) { // Delegate to src validator srcValTokensBefore := s.getVal(s.providerCtx(), srcValAddr).GetBondedTokens() @@ -284,7 +284,7 @@ func incrementTimeByUnbondingPeriod(s *CCVTestSuite, chainType ChainType) { incrementTime(s, jumpPeriod) } -func checkStakingUnbondingOps(s *CCVTestSuite, id uint64, found bool, onHold bool, msgAndArgs ...interface{}) { +func checkStakingUnbondingOps(s *CCVTestSuite, id uint64, found, onHold bool, msgAndArgs ...interface{}) { stakingUnbondingOp, wasFound := getStakingUnbondingDelegationEntry(s.providerCtx(), s.providerApp.GetTestStakingKeeper(), id) s.Require().Equal( found, diff --git a/tests/integration/setup.go b/tests/integration/setup.go index ae7d264df0..3903175214 100644 --- a/tests/integration/setup.go +++ b/tests/integration/setup.go @@ -63,7 +63,7 @@ type CCVTestSuite struct { // NewCCVTestSuite returns a new instance of CCVTestSuite, ready to be tested against using suite.Run(). func NewCCVTestSuite[Tp testutil.ProviderApp, Tc testutil.ConsumerApp]( - providerAppIniter ibctesting.AppIniter, consumerAppIniter ibctesting.AppIniter, skippedTests []string, + providerAppIniter, consumerAppIniter ibctesting.AppIniter, skippedTests []string, ) *CCVTestSuite { ccvSuite := new(CCVTestSuite) diff --git a/x/ccv/consumer/types/params.go b/x/ccv/consumer/types/params.go index b730c86100..928900b207 100644 --- a/x/ccv/consumer/types/params.go +++ b/x/ccv/consumer/types/params.go @@ -63,7 +63,7 @@ func ParamKeyTable() paramtypes.KeyTable { // NewParams creates new consumer parameters with provided arguments func NewParams(enabled bool, blocksPerDistributionTransmission int64, distributionTransmissionChannel, providerFeePoolAddrStr string, - ccvTimeoutPeriod time.Duration, transferTimeoutPeriod time.Duration, + ccvTimeoutPeriod, transferTimeoutPeriod time.Duration, consumerRedistributionFraction string, historicalEntries int64, consumerUnbondingPeriod time.Duration, softOptOutThreshold string, ) Params { diff --git a/x/ccv/provider/keeper/proposal_test.go b/x/ccv/provider/keeper/proposal_test.go index 828ae86903..9ef1d594aa 100644 --- a/x/ccv/provider/keeper/proposal_test.go +++ b/x/ccv/provider/keeper/proposal_test.go @@ -196,7 +196,7 @@ func TestCreateConsumerClient(t *testing.T) { // // Note: Separated from TestCreateConsumerClient to also be called from TestCreateConsumerChainProposal. func testCreatedConsumerClient(t *testing.T, - ctx sdk.Context, providerKeeper providerkeeper.Keeper, expectedChainID string, expectedClientID string, + ctx sdk.Context, providerKeeper providerkeeper.Keeper, expectedChainID, expectedClientID string, ) { t.Helper() // ClientID should be stored. @@ -574,7 +574,7 @@ func TestStopConsumerChain(t *testing.T) { // testProviderStateIsCleaned executes test assertions for the proposer's state being cleaned after a stopped consumer chain. func testProviderStateIsCleaned(t *testing.T, ctx sdk.Context, providerKeeper providerkeeper.Keeper, - expectedChainID string, expectedChannelID string, + expectedChainID, expectedChannelID string, ) { t.Helper() _, found := providerKeeper.GetConsumerClientId(ctx, expectedChainID) From 504811dd2c1c480a69f015f648af7cc260e62350 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Thu, 4 May 2023 13:55:37 -0700 Subject: [PATCH 005/108] fix: multisig for assigning consumer key, use json (#916) * json for consumer key * lint fix * comment * lint --- .../ccv/provider/v1/tx.proto | 7 +- x/ccv/consumer/types/consumer.pb.go | 2 +- x/ccv/provider/client/cli/tx.go | 7 +- x/ccv/provider/handler_test.go | 4 +- x/ccv/provider/keeper/msg_server.go | 54 +++++++---- x/ccv/provider/types/msg.go | 41 ++++---- x/ccv/provider/types/tx.pb.go | 93 +++++++++---------- 7 files changed, 108 insertions(+), 100 deletions(-) diff --git a/proto/interchain_security/ccv/provider/v1/tx.proto b/proto/interchain_security/ccv/provider/v1/tx.proto index 567a7d9daa..1e1a3d3fe6 100644 --- a/proto/interchain_security/ccv/provider/v1/tx.proto +++ b/proto/interchain_security/ccv/provider/v1/tx.proto @@ -21,9 +21,10 @@ message MsgAssignConsumerKey { // The validator address on the provider string provider_addr = 2 [ (gogoproto.moretags) = "yaml:\"address\"" ]; - // The consensus public key to use on the consumer - google.protobuf.Any consumer_key = 3 - [ (cosmos_proto.accepts_interface) = "cosmos.crypto.PubKey" ]; + // The consensus public key to use on the consumer. + // in json string format corresponding to proto-any, ex: + // `{"@type":"/cosmos.crypto.ed25519.PubKey","key":"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is="}` + string consumer_key = 3; } message MsgAssignConsumerKeyResponse {} \ No newline at end of file diff --git a/x/ccv/consumer/types/consumer.pb.go b/x/ccv/consumer/types/consumer.pb.go index 5a7c84bacc..3c3e3e8d04 100644 --- a/x/ccv/consumer/types/consumer.pb.go +++ b/x/ccv/consumer/types/consumer.pb.go @@ -65,7 +65,7 @@ type Params struct { UnbondingPeriod time.Duration `protobuf:"bytes,9,opt,name=unbonding_period,json=unbondingPeriod,proto3,stdduration" json:"unbonding_period"` // 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 5% means that the validators in the smallest 5% of the set can opt out + // value of 0.05 means that the validators in the bottom 5% of the set can opt out SoftOptOutThreshold string `protobuf:"bytes,10,opt,name=soft_opt_out_threshold,json=softOptOutThreshold,proto3" json:"soft_opt_out_threshold,omitempty"` } diff --git a/x/ccv/provider/client/cli/tx.go b/x/ccv/provider/client/cli/tx.go index 98c9eb6585..667ae4425b 100644 --- a/x/ccv/provider/client/cli/tx.go +++ b/x/ccv/provider/client/cli/tx.go @@ -8,7 +8,6 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/client/tx" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/interchain-security/x/ccv/provider/types" @@ -44,12 +43,8 @@ func NewAssignConsumerKeyCmd() *cobra.Command { WithTxConfig(clientCtx.TxConfig).WithAccountRetriever(clientCtx.AccountRetriever) providerValAddr := clientCtx.GetFromAddress() - var consumerPubKey cryptotypes.PubKey - if err := clientCtx.Codec.UnmarshalInterfaceJSON([]byte(args[1]), &consumerPubKey); err != nil { - return err - } - msg, err := types.NewMsgAssignConsumerKey(args[0], sdk.ValAddress(providerValAddr), consumerPubKey) + msg, err := types.NewMsgAssignConsumerKey(args[0], sdk.ValAddress(providerValAddr), args[1]) if err != nil { return err } diff --git a/x/ccv/provider/handler_test.go b/x/ccv/provider/handler_test.go index fa526b6ad6..9e723d9858 100644 --- a/x/ccv/provider/handler_test.go +++ b/x/ccv/provider/handler_test.go @@ -1,6 +1,7 @@ package provider_test import ( + "encoding/base64" "strings" "testing" @@ -33,7 +34,8 @@ func TestAssignConsensusKeyForConsumerChain(t *testing.T) { consumerCryptoId := testcrypto.NewCryptoIdentityFromIntSeed(1) consumerConsAddr := consumerCryptoId.ConsumerConsAddress() - consumerKey := consumerCryptoId.ConsensusSDKPubKey() + consumerKeyBz := base64.StdEncoding.EncodeToString(consumerCryptoId.ConsensusSDKPubKey().Bytes()) + consumerKey := `{"@type":"/cosmos.crypto.ed25519.PubKey","key":"` + consumerKeyBz + `"}` testCases := []struct { name string diff --git a/x/ccv/provider/keeper/msg_server.go b/x/ccv/provider/keeper/msg_server.go index 9bb23ddae9..f4e3a9038e 100644 --- a/x/ccv/provider/keeper/msg_server.go +++ b/x/ccv/provider/keeper/msg_server.go @@ -2,15 +2,14 @@ package keeper import ( "context" + "encoding/base64" - cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/cosmos/interchain-security/x/ccv/provider/types" ccvtypes "github.com/cosmos/interchain-security/x/ccv/types" - tmstrings "github.com/tendermint/tendermint/libs/strings" + tmprotocrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" ) type msgServer struct { @@ -46,42 +45,61 @@ func (k msgServer) AssignConsumerKey(goCtx context.Context, msg *types.MsgAssign return nil, stakingtypes.ErrNoValidatorFound } - // make sure the consumer key is in the correct format - consumerSDKPublicKey, ok := msg.ConsumerKey.GetCachedValue().(cryptotypes.PubKey) - if !ok { - return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidType, "Expecting cryptotypes.PubKey, got %T", consumerSDKPublicKey) + // parse consumer key as long as it's in the right format + pkType, keyStr, err := types.ParseConsumerKeyFromJson(msg.ConsumerKey) + if err != nil { + return nil, err } + // Note: the correct way to decide if a key type is supported is to check the + // consensus params. However this functionality was disabled in https://github.com/cosmos/interchain-security/pull/916 + // as a quick way to get ed25519 working, avoiding amino/proto-any marshalling issues. + // make sure the consumer key type is supported - cp := ctx.ConsensusParams() - if cp != nil && cp.Validator != nil { - if !tmstrings.StringInSlice(consumerSDKPublicKey.Type(), cp.Validator.PubKeyTypes) { - return nil, sdkerrors.Wrapf( - stakingtypes.ErrValidatorPubKeyTypeNotSupported, - "got: %s, expected: %s", consumerSDKPublicKey.Type(), cp.Validator.PubKeyTypes, - ) - } + // cp := ctx.ConsensusParams() + // if cp != nil && cp.Validator != nil { + // if !tmstrings.StringInSlice(pkType, cp.Validator.PubKeyTypes) { + // return nil, sdkerrors.Wrapf( + // stakingtypes.ErrValidatorPubKeyTypeNotSupported, + // "got: %s, expected one of: %s", pkType, cp.Validator.PubKeyTypes, + // ) + // } + // } + + // For now, only accept ed25519. + // TODO: decide what types should be supported. + if pkType != "/cosmos.crypto.ed25519.PubKey" { + return nil, sdkerrors.Wrapf( + stakingtypes.ErrValidatorPubKeyTypeNotSupported, + "got: %s, expected: %s", pkType, "/cosmos.crypto.ed25519.PubKey", + ) } - consumerTMPublicKey, err := cryptocodec.ToTmProtoPublicKey(consumerSDKPublicKey) + pubKeyBytes, err := base64.StdEncoding.DecodeString(keyStr) if err != nil { return nil, err } + consumerTMPublicKey := tmprotocrypto.PublicKey{ + Sum: &tmprotocrypto.PublicKey_Ed25519{ + Ed25519: pubKeyBytes, + }, + } + if err := k.Keeper.AssignConsumerKey(ctx, msg.ChainId, validator, consumerTMPublicKey); err != nil { return nil, err } k.Logger(ctx).Info("assigned consumer key", "consumer chainID", msg.ChainId, "validator operator addr", msg.ProviderAddr, - "consumer pubkey", consumerSDKPublicKey.String(), + "consumer tm pubkey", consumerTMPublicKey.String(), ) ctx.EventManager().EmitEvents(sdk.Events{ sdk.NewEvent( ccvtypes.EventTypeAssignConsumerKey, sdk.NewAttribute(ccvtypes.AttributeProviderValidatorAddress, msg.ProviderAddr), - sdk.NewAttribute(ccvtypes.AttributeConsumerConsensusPubKey, consumerSDKPublicKey.String()), + sdk.NewAttribute(ccvtypes.AttributeConsumerConsensusPubKey, consumerTMPublicKey.String()), ), }) diff --git a/x/ccv/provider/types/msg.go b/x/ccv/provider/types/msg.go index 0e711869c0..901aa03600 100644 --- a/x/ccv/provider/types/msg.go +++ b/x/ccv/provider/types/msg.go @@ -1,10 +1,9 @@ package types import ( + "encoding/json" "strings" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -13,27 +12,17 @@ const ( TypeMsgAssignConsumerKey = "assign_consumer_key" ) -var ( - _ sdk.Msg = &MsgAssignConsumerKey{} - _ codectypes.UnpackInterfacesMessage = (*MsgAssignConsumerKey)(nil) -) +var _ sdk.Msg = &MsgAssignConsumerKey{} // NewMsgAssignConsumerKey creates a new MsgAssignConsumerKey instance. // Delegator address and validator address are the same. func NewMsgAssignConsumerKey(chainID string, providerValidatorAddress sdk.ValAddress, - consumerConsensusPubKey cryptotypes.PubKey, + consumerConsensusPubKey string, ) (*MsgAssignConsumerKey, error) { - var keyAsAny *codectypes.Any - if consumerConsensusPubKey != nil { - var err error - if keyAsAny, err = codectypes.NewAnyWithValue(consumerConsensusPubKey); err != nil { - return nil, err - } - } return &MsgAssignConsumerKey{ ChainId: chainID, ProviderAddr: providerValidatorAddress.String(), - ConsumerKey: keyAsAny, + ConsumerKey: consumerConsensusPubKey, }, nil } @@ -81,14 +70,26 @@ func (msg MsgAssignConsumerKey) ValidateBasic() error { if err != nil { return ErrInvalidProviderAddress } - if msg.ConsumerKey == nil { + if msg.ConsumerKey == "" { + return ErrInvalidConsumerConsensusPubKey + } + if _, _, err := ParseConsumerKeyFromJson(msg.ConsumerKey); err != nil { return ErrInvalidConsumerConsensusPubKey } return nil } -// UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces -func (msg MsgAssignConsumerKey) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { - var pubKey cryptotypes.PubKey - return unpacker.UnpackAny(msg.ConsumerKey, &pubKey) +// ParseConsumerKeyFromJson parses the consumer key from a JSON string, +// this replaces deserializing a protobuf any. +func ParseConsumerKeyFromJson(jsonStr string) (pkType, key string, err error) { + type PubKey struct { + Type string `json:"@type"` + Key string `json:"key"` + } + var pubKey PubKey + err = json.Unmarshal([]byte(jsonStr), &pubKey) + if err != nil { + return "", "", err + } + return pubKey.Type, pubKey.Key, nil } diff --git a/x/ccv/provider/types/tx.pb.go b/x/ccv/provider/types/tx.pb.go index fcf29bb203..89366fc381 100644 --- a/x/ccv/provider/types/tx.pb.go +++ b/x/ccv/provider/types/tx.pb.go @@ -6,7 +6,7 @@ package types import ( context "context" fmt "fmt" - types "github.com/cosmos/cosmos-sdk/codec/types" + _ "github.com/cosmos/cosmos-sdk/codec/types" _ "github.com/gogo/protobuf/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" @@ -36,8 +36,10 @@ type MsgAssignConsumerKey struct { ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` // The validator address on the provider ProviderAddr string `protobuf:"bytes,2,opt,name=provider_addr,json=providerAddr,proto3" json:"provider_addr,omitempty" yaml:"address"` - // The consensus public key to use on the consumer - ConsumerKey *types.Any `protobuf:"bytes,3,opt,name=consumer_key,json=consumerKey,proto3" json:"consumer_key,omitempty"` + // The consensus public key to use on the consumer. + // in json string format corresponding to proto-any, ex: + // `{"@type":"/cosmos.crypto.ed25519.PubKey","key":"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is="}` + ConsumerKey string `protobuf:"bytes,3,opt,name=consumer_key,json=consumerKey,proto3" json:"consumer_key,omitempty"` } func (m *MsgAssignConsumerKey) Reset() { *m = MsgAssignConsumerKey{} } @@ -119,33 +121,31 @@ func init() { } var fileDescriptor_43221a4391e9fbf4 = []byte{ - // 406 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x92, 0xbd, 0x8e, 0xd3, 0x40, - 0x10, 0xc7, 0xbd, 0x9c, 0x04, 0xc7, 0xde, 0x81, 0x84, 0xe5, 0xc2, 0x17, 0x9d, 0x9c, 0x93, 0x69, - 0xae, 0xe0, 0x76, 0x75, 0xa1, 0x40, 0xa4, 0x73, 0xa8, 0x50, 0x14, 0x09, 0x2c, 0x2a, 0x1a, 0xcb, - 0x5e, 0x2f, 0x9b, 0x15, 0xf1, 0xae, 0xb5, 0xbb, 0xb6, 0xb2, 0x6f, 0x40, 0x09, 0x25, 0x5d, 0x1e, - 0x82, 0x77, 0x00, 0x51, 0xa5, 0xa4, 0x42, 0x28, 0x69, 0xa8, 0x79, 0x02, 0x14, 0x7f, 0x10, 0x21, - 0x52, 0xa0, 0xeb, 0x66, 0xe6, 0x3f, 0x3b, 0xf3, 0x9b, 0x9d, 0x81, 0x8f, 0xb8, 0x30, 0x54, 0x91, - 0x79, 0xca, 0x45, 0xa2, 0x29, 0xa9, 0x14, 0x37, 0x16, 0x13, 0x52, 0xe3, 0x52, 0xc9, 0x9a, 0xe7, - 0x54, 0xe1, 0xfa, 0x1a, 0x9b, 0x25, 0x2a, 0x95, 0x34, 0xd2, 0x7d, 0x78, 0x20, 0x1b, 0x11, 0x52, - 0xa3, 0x3e, 0x1b, 0xd5, 0xd7, 0x83, 0x73, 0x26, 0x25, 0x5b, 0x50, 0x9c, 0x96, 0x1c, 0xa7, 0x42, - 0x48, 0x93, 0x1a, 0x2e, 0x85, 0x6e, 0x4b, 0x0c, 0x3c, 0x26, 0x99, 0x6c, 0x4c, 0xbc, 0xb3, 0xba, - 0xe8, 0x19, 0x91, 0xba, 0x90, 0x3a, 0x69, 0x85, 0xd6, 0xe9, 0xa5, 0xae, 0x5c, 0xe3, 0x65, 0xd5, - 0x1b, 0x9c, 0x0a, 0xdb, 0x4a, 0xe1, 0x67, 0x00, 0xbd, 0x99, 0x66, 0x91, 0xd6, 0x9c, 0x89, 0x67, - 0x52, 0xe8, 0xaa, 0xa0, 0x6a, 0x4a, 0xad, 0x7b, 0x06, 0x8f, 0x5b, 0x48, 0x9e, 0xfb, 0xe0, 0x02, - 0x5c, 0xde, 0x8d, 0xef, 0x34, 0xfe, 0xf3, 0xdc, 0x7d, 0x02, 0xef, 0xf5, 0xb0, 0x49, 0x9a, 0xe7, - 0xca, 0xbf, 0xb5, 0xd3, 0x27, 0xee, 0xaf, 0xef, 0xc3, 0xfb, 0x36, 0x2d, 0x16, 0xe3, 0x70, 0x17, - 0xa5, 0x5a, 0x87, 0xf1, 0x69, 0x9f, 0x18, 0xe5, 0xb9, 0x72, 0x5f, 0xc2, 0x53, 0xd2, 0xb5, 0x48, - 0xde, 0x52, 0xeb, 0x1f, 0x5d, 0x80, 0xcb, 0x93, 0x91, 0x87, 0x5a, 0x3c, 0xd4, 0xe3, 0xa1, 0x48, - 0xd8, 0x89, 0xff, 0xf5, 0xd3, 0x95, 0xd7, 0x4d, 0x41, 0x94, 0x2d, 0x8d, 0x44, 0x2f, 0xaa, 0x6c, - 0x4a, 0x6d, 0x7c, 0x42, 0xf6, 0x98, 0xe3, 0xe3, 0x77, 0xab, 0xa1, 0xf3, 0x73, 0x35, 0x74, 0xc2, - 0x00, 0x9e, 0x1f, 0x1a, 0x24, 0xa6, 0xba, 0x94, 0x42, 0xd3, 0xd1, 0x47, 0x00, 0x8f, 0x66, 0x9a, - 0xb9, 0x1f, 0x00, 0x7c, 0xf0, 0xef, 0xb8, 0x4f, 0xd1, 0x7f, 0xec, 0x05, 0x1d, 0x6a, 0x30, 0x88, - 0x6e, 0xfc, 0xb4, 0x67, 0x9b, 0xbc, 0xfa, 0xb2, 0x09, 0xc0, 0x7a, 0x13, 0x80, 0x1f, 0x9b, 0x00, - 0xbc, 0xdf, 0x06, 0xce, 0x7a, 0x1b, 0x38, 0xdf, 0xb6, 0x81, 0xf3, 0x7a, 0xcc, 0xb8, 0x99, 0x57, - 0x19, 0x22, 0xb2, 0xe8, 0x76, 0x8a, 0xf7, 0xdd, 0xae, 0xfe, 0x9c, 0xdb, 0xf2, 0xef, 0x83, 0x33, - 0xb6, 0xa4, 0x3a, 0xbb, 0xdd, 0x7c, 0xe8, 0xe3, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x78, 0xcb, - 0x05, 0x85, 0xa1, 0x02, 0x00, 0x00, + // 369 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x52, 0x3d, 0x4f, 0xeb, 0x30, + 0x14, 0x8d, 0x5f, 0xa5, 0xf7, 0xfa, 0x4c, 0x41, 0x22, 0xea, 0xd0, 0x56, 0x55, 0x0a, 0x61, 0x61, + 0x80, 0x58, 0x85, 0x01, 0xd1, 0xad, 0x65, 0x42, 0xa8, 0x4b, 0xc5, 0xc4, 0x12, 0xa5, 0x8e, 0x71, + 0x2d, 0x1a, 0x3b, 0xb2, 0x9d, 0xa8, 0xf9, 0x07, 0x8c, 0x30, 0x21, 0xb6, 0xfe, 0x1c, 0xc6, 0x8e, + 0x4c, 0x08, 0xb5, 0x0b, 0x33, 0xbf, 0x00, 0x35, 0x1f, 0x54, 0x88, 0x0e, 0x88, 0xed, 0xde, 0x7b, + 0x8e, 0xcf, 0x39, 0xf2, 0xbd, 0xf0, 0x80, 0x71, 0x4d, 0x24, 0x1e, 0x79, 0x8c, 0xbb, 0x8a, 0xe0, + 0x48, 0x32, 0x9d, 0x20, 0x8c, 0x63, 0x14, 0x4a, 0x11, 0x33, 0x9f, 0x48, 0x14, 0xb7, 0x91, 0x9e, + 0x38, 0xa1, 0x14, 0x5a, 0x98, 0x7b, 0x6b, 0xd8, 0x0e, 0xc6, 0xb1, 0x53, 0xb0, 0x9d, 0xb8, 0xdd, + 0x68, 0x52, 0x21, 0xe8, 0x98, 0x20, 0x2f, 0x64, 0xc8, 0xe3, 0x5c, 0x68, 0x4f, 0x33, 0xc1, 0x55, + 0x26, 0xd1, 0xa8, 0x52, 0x41, 0x45, 0x5a, 0xa2, 0x65, 0x95, 0x4f, 0xeb, 0x58, 0xa8, 0x40, 0x28, + 0x37, 0x03, 0xb2, 0xa6, 0x80, 0x72, 0xb9, 0xb4, 0x1b, 0x46, 0xd7, 0xc8, 0xe3, 0x49, 0x06, 0xd9, + 0x0f, 0x00, 0x56, 0xfb, 0x8a, 0x76, 0x95, 0x62, 0x94, 0x9f, 0x09, 0xae, 0xa2, 0x80, 0xc8, 0x0b, + 0x92, 0x98, 0x75, 0x58, 0xce, 0x42, 0x32, 0xbf, 0x06, 0x76, 0xc0, 0xfe, 0xff, 0xc1, 0xbf, 0xb4, + 0x3f, 0xf7, 0xcd, 0x13, 0xb8, 0x59, 0x84, 0x75, 0x3d, 0xdf, 0x97, 0xb5, 0x3f, 0x4b, 0xbc, 0x67, + 0xbe, 0xbf, 0xb4, 0xb6, 0x12, 0x2f, 0x18, 0x77, 0xec, 0xe5, 0x94, 0x28, 0x65, 0x0f, 0x2a, 0x05, + 0xb1, 0xeb, 0xfb, 0xd2, 0xdc, 0x85, 0x15, 0x9c, 0x5b, 0xb8, 0x37, 0x24, 0xa9, 0x95, 0x52, 0xdd, + 0x0d, 0xbc, 0xb2, 0xed, 0x94, 0x6f, 0xa7, 0x2d, 0xe3, 0x6d, 0xda, 0x32, 0x6c, 0x0b, 0x36, 0xd7, + 0x05, 0x1b, 0x10, 0x15, 0x0a, 0xae, 0xc8, 0xd1, 0x23, 0x80, 0xa5, 0xbe, 0xa2, 0xe6, 0x3d, 0x80, + 0xdb, 0xdf, 0xe3, 0x9f, 0x3a, 0x3f, 0xf8, 0x67, 0x67, 0x9d, 0x41, 0xa3, 0xfb, 0xeb, 0xa7, 0x45, + 0xb6, 0xde, 0xe5, 0xd3, 0xdc, 0x02, 0xb3, 0xb9, 0x05, 0x5e, 0xe7, 0x16, 0xb8, 0x5b, 0x58, 0xc6, + 0x6c, 0x61, 0x19, 0xcf, 0x0b, 0xcb, 0xb8, 0xea, 0x50, 0xa6, 0x47, 0xd1, 0xd0, 0xc1, 0x22, 0xc8, + 0x77, 0x84, 0x56, 0x6e, 0x87, 0x9f, 0xe7, 0x33, 0xf9, 0x7a, 0x40, 0x3a, 0x09, 0x89, 0x1a, 0xfe, + 0x4d, 0x57, 0x76, 0xfc, 0x11, 0x00, 0x00, 0xff, 0xff, 0x4b, 0x60, 0x67, 0xb6, 0x71, 0x02, 0x00, + 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -248,15 +248,10 @@ func (m *MsgAssignConsumerKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.ConsumerKey != nil { - { - size, err := m.ConsumerKey.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } + if len(m.ConsumerKey) > 0 { + i -= len(m.ConsumerKey) + copy(dAtA[i:], m.ConsumerKey) + i = encodeVarintTx(dAtA, i, uint64(len(m.ConsumerKey))) i-- dAtA[i] = 0x1a } @@ -325,8 +320,8 @@ func (m *MsgAssignConsumerKey) Size() (n int) { if l > 0 { n += 1 + l + sovTx(uint64(l)) } - if m.ConsumerKey != nil { - l = m.ConsumerKey.Size() + l = len(m.ConsumerKey) + if l > 0 { n += 1 + l + sovTx(uint64(l)) } return n @@ -444,7 +439,7 @@ func (m *MsgAssignConsumerKey) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ConsumerKey", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTx @@ -454,27 +449,23 @@ func (m *MsgAssignConsumerKey) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTx } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTx } if postIndex > l { return io.ErrUnexpectedEOF } - if m.ConsumerKey == nil { - m.ConsumerKey = &types.Any{} - } - if err := m.ConsumerKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.ConsumerKey = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex From a8b93f3e7cf251fecf76734cf5745bca96a26343 Mon Sep 17 00:00:00 2001 From: Marius Poke Date: Fri, 5 May 2023 12:50:15 +0200 Subject: [PATCH 006/108] chore: Update CODEOWNERS (#892) Update CODEOWNERS Co-authored-by: Milan Mulji <98309852+mmulji-ic@users.noreply.github.com> --- .github/CODEOWNERS | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 650813ac8a..65ba34f57b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,3 +1,5 @@ # CODEOWNERS: https://help.github.com/articles/about-codeowners/ -* @jtremback @mpoke @sainoe @smarshall-spitzbart @MSalopek @mmulji-ic @glnro @yaruwangway +# Primary repo maintainers + +* @cosmos/informal_interchain-security_maintain From dfa005865a34bd4a7df7d1999338e4b2a7c994bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 May 2023 12:28:31 -0700 Subject: [PATCH 007/108] build(deps): bump gaurav-nelson/github-action-markdown-link-check from 1.0.13 to 1.0.15 (#928) build(deps): bump gaurav-nelson/github-action-markdown-link-check Bumps [gaurav-nelson/github-action-markdown-link-check](https://github.com/gaurav-nelson/github-action-markdown-link-check) from 1.0.13 to 1.0.15. - [Release notes](https://github.com/gaurav-nelson/github-action-markdown-link-check/releases) - [Commits](https://github.com/gaurav-nelson/github-action-markdown-link-check/compare/1.0.13...1.0.15) --- updated-dependencies: - dependency-name: gaurav-nelson/github-action-markdown-link-check dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/linkchecker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/linkchecker.yml b/.github/workflows/linkchecker.yml index fb846d6a74..91242e5992 100644 --- a/.github/workflows/linkchecker.yml +++ b/.github/workflows/linkchecker.yml @@ -8,7 +8,7 @@ jobs: - uses: actions/checkout@v3.5.2 # Checks the status of hyperlinks in *.md files in docs/ - - uses: gaurav-nelson/github-action-markdown-link-check@1.0.13 + - uses: gaurav-nelson/github-action-markdown-link-check@1.0.15 with: folder-path: "docs" file-path: './README.md' \ No newline at end of file From 7d203938857aa4c41f965713905d1dc87f0885bb Mon Sep 17 00:00:00 2001 From: Jacob Gadikian Date: Thu, 11 May 2023 21:39:45 +0700 Subject: [PATCH 008/108] chore: bump hermes (#921) * bump the version of hermes used in docs and images * use the multiplatform ghcr.io build of hermes --- Dockerfile | 2 +- Dockerfile.gaia | 2 +- docs/docs/consumer-development/onboarding.md | 2 +- docs/docs/frequently-asked-questions.md | 21 +++++++++++++++++--- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6f9355be52..0da9141620 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,7 +28,7 @@ RUN go mod tidy RUN make install # Get Hermes build -FROM informalsystems/hermes:1.2.0 AS hermes-builder +FROM ghcr.io/informalsystems/hermes:1.4.1 AS hermes-builder FROM --platform=linux/amd64 fedora:36 RUN dnf update -y diff --git a/Dockerfile.gaia b/Dockerfile.gaia index 47b7f3707f..196f7dfa74 100644 --- a/Dockerfile.gaia +++ b/Dockerfile.gaia @@ -61,7 +61,7 @@ WORKDIR /interchain-security RUN make install # Get Hermes build -FROM informalsystems/hermes:1.2.0 AS hermes-builder +FROM ghcr.io/informalsystems/hermes:1.4.1 AS hermes-builder FROM --platform=linux/amd64 fedora:36 RUN dnf update -y diff --git a/docs/docs/consumer-development/onboarding.md b/docs/docs/consumer-development/onboarding.md index 37c2718e8c..faa2969e63 100644 --- a/docs/docs/consumer-development/onboarding.md +++ b/docs/docs/consumer-development/onboarding.md @@ -11,7 +11,7 @@ Additionally, you can check the [testnet repo](https://github.com/cosmos/testnet ## 1. Complete testing & integration - [ ] test integration with gaia -- [ ] test your protocol with supported relayer versions (minimum hermes 1.3) +- [ ] test your protocol with supported relayer versions (minimum hermes 1.4.1) - [ ] reach out to the ICS team if you are facing issues ## 2. Create an Onboarding Repository diff --git a/docs/docs/frequently-asked-questions.md b/docs/docs/frequently-asked-questions.md index 6e2f4957b5..6cbf364a36 100644 --- a/docs/docs/frequently-asked-questions.md +++ b/docs/docs/frequently-asked-questions.md @@ -5,6 +5,7 @@ slug: /faq --- ## What is the meaning of Validator Set Replication? + VSR simply means that the same validator set is used to secure both the provider and consumer chains. VSR is ensured through ICS protocol which keeps consumers up to date with the validator set of the provider. ## What even is a consumer chain? @@ -14,6 +15,7 @@ Consumer chain is blockchain operated by the same validator operators as the pro Consumer chains are run on infrastructure (virtual or physical machines) distinct from the provider, have their own configurations and operating requirements. ## What happens to consumer if provider is down? + In case the provider chain halts or experiences difficulties the consumer chain will keep operating - the provider chain and consumer chains represent different networks, which only share the validator set. The consumer chain will not halt if the provider halts because they represent distinct networks and distinct infrastructures. Provider chain liveness does not impact consumer chain liveness. @@ -25,31 +27,37 @@ Steps to recover from this scenario and steps to "release" the validators from t At the very least, the consumer chain could replace the validator set, remove the ICS module and perform a genesis restart. The impact of this on the IBC clients and connections is currently under careful consideration. ## What happens to provider if consumer is down? + Consumer chains do not impact the provider chain. The ICS protocol is concerned only with validator set replication and the only communication that the provider requires from the consumer is information about validator activity (essentially keeping the provider informed about slash events). ## Can I run the provider and consumer chains on the same machine? + Yes, but you should favor running them in separate environments so failure of one machine does not impact your whole operation. ## Can the consumer chain have its own token? + As any other cosmos-sdk chain the consumer chain can issue its own token, manage inflation parameters and use them to pay gas fees. ## How are Tx fees paid on consumer? + The consumer chain operates as any other cosmos-sdk chain. The ICS protocol does not impact the normal chain operations. ## Are there any restrictions the consumer chains need to abide by? + No. Consumer chains are free to choose how they wish to operate, which modules to include, use CosmWASM in a permissioned or a permissionless way. The only thing that separates consumer chains from standalone chains is that they share their validator set with the provider chain. ## What's in it for the validators and stakers? + The consumer chains sends a portion of its fees and inflation as reward to the provider chain as defined by `consumer_redistribution_fraction`. The rewards are distributed (sent to the provider) every `blocks_per_distribution_transmission`. :::note `consumer_redistribution_fraction` and `blocks_per_distribution_transmission` are parameters defined in the `ConsumerAdditionProposal` used to create the consumer chain. These parameters can be changed via consumer chain governance. ::: - ## Can the consumer chain have its own governance? + **Yes.** In that case the validators are not necessarily part of the governance structure. Instead, their place in governance is replaced by "representatives" (governors). The representatives do not need to run validators, they simply represent the interests of a particular interest group on the consumer chain. @@ -58,13 +66,14 @@ Validators can also be representatives but representatives are not required to r This feature discerns between validator operators (infrastructure) and governance representatives which further democratizes the ecosystem. This also reduces the pressure on validators to be involved in on-chain governance. - ## Can validators opt-out of replicated security? + At present, the validators cannot opt-out of validating consumer chains. There are multiple opt-out mechanisms under active research. ## How does Equivocation Governance Slashing work? + To avoid potential attacks directed at provider chain validators, a new mechanism was introduced: When a validator double-signs on the consumer chain, a special type of slash packet is relayed to the provider chain. The provider will store information about the double signing validator and allow a governance proposal to be submitted. @@ -75,19 +84,25 @@ An equivocation proposal cannot be submitted for a validator that did not double ::: ## Can Consumer Chains perform Software Upgrades? + Consumer chains are standalone chains, in the sense that they can run arbitrary logic and use any modules they want (ie CosmWASM). Consumer chain upgrades are unlikely to impact the provider chain, as long as there are no changes to the ICS module. ## How can I connect to the testnets? + Check out the [Joining Replicated Security testnet](./validators/joining-testnet.md) section. ## How do I start using ICS? + To become a consumer chain use this [checklist](./consumer-development/onboarding.md) and check the [App integration section](./consumer-development/app-integration.md) ## Which relayers are supported? + Currently supported versions: -- Hermes 1.3 + +- Hermes 1.4.1 ## How does key delegation work in ICS? + You can check the [Key Assignment Guide](./features/key-assignment.md) for specific instructions. From 2322e25e4f73e843dd589cc57e5e58e60598cfad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 May 2023 19:01:46 +0200 Subject: [PATCH 009/108] build(deps): bump github.com/spf13/cast from 1.5.0 to 1.5.1 (#961) Bumps [github.com/spf13/cast](https://github.com/spf13/cast) from 1.5.0 to 1.5.1. - [Release notes](https://github.com/spf13/cast/releases) - [Commits](https://github.com/spf13/cast/compare/v1.5.0...v1.5.1) --- updated-dependencies: - dependency-name: github.com/spf13/cast dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 52c881b697..7bd171a069 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/oxyno-zeta/gomock-extra-matcher v1.1.0 github.com/rakyll/statik v0.1.7 github.com/regen-network/cosmos-proto v0.3.1 - github.com/spf13/cast v1.5.0 + github.com/spf13/cast v1.5.1 github.com/spf13/cobra v1.7.0 github.com/stretchr/testify v1.8.2 github.com/tendermint/tendermint v0.34.27 diff --git a/go.sum b/go.sum index 03e0962615..eb7e1591cb 100644 --- a/go.sum +++ b/go.sum @@ -321,7 +321,7 @@ github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/ github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= @@ -933,8 +933,8 @@ github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= From aba4eb75f73eb9a209bed4d641076b811ffddd18 Mon Sep 17 00:00:00 2001 From: Jacob Gadikian Date: Tue, 16 May 2023 04:06:54 +0700 Subject: [PATCH 010/108] refactor: adopt the errors module to reduce the changeset for 47 (#920) adopt the errors module to reduce the changeset for 47 Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> --- app/consumer-democracy/ante_handler.go | 7 +++-- app/consumer/ante_handler.go | 7 +++-- app/provider/ante_handler.go | 7 +++-- go.mod | 2 ++ go.sum | 2 ++ legacy_ibc_testing/testing/chain.go | 4 +-- testutil/simibc/relay_util.go | 4 +-- x/ccv/consumer/ibc_module.go | 25 ++++++++------- x/ccv/consumer/keeper/distribution.go | 4 +-- x/ccv/consumer/keeper/keeper.go | 12 +++---- x/ccv/consumer/keeper/relay.go | 4 +-- x/ccv/consumer/types/errors.go | 4 +-- x/ccv/consumer/types/genesis.go | 42 ++++++++++++------------- x/ccv/consumer/types/validator.go | 3 +- x/ccv/provider/handler.go | 3 +- x/ccv/provider/ibc_module.go | 19 +++++------ x/ccv/provider/keeper/grpc_query.go | 4 +-- x/ccv/provider/keeper/keeper.go | 24 +++++++------- x/ccv/provider/keeper/key_assignment.go | 8 ++--- x/ccv/provider/keeper/msg_server.go | 6 ++-- x/ccv/provider/keeper/proposal.go | 11 ++++--- x/ccv/provider/keeper/relay.go | 6 ++-- x/ccv/provider/proposal_handler.go | 3 +- x/ccv/provider/types/errors.go | 28 ++++++++--------- x/ccv/provider/types/genesis.go | 16 +++++----- x/ccv/provider/types/key_assignment.go | 18 +++++------ x/ccv/provider/types/proposal.go | 28 ++++++++--------- x/ccv/types/ccv.go | 12 +++---- x/ccv/types/errors.go | 40 +++++++++++------------ x/ccv/types/utils.go | 8 ++--- 30 files changed, 187 insertions(+), 174 deletions(-) diff --git a/app/consumer-democracy/ante_handler.go b/app/consumer-democracy/ante_handler.go index af809944f4..8182b51095 100644 --- a/app/consumer-democracy/ante_handler.go +++ b/app/consumer-democracy/ante_handler.go @@ -1,6 +1,7 @@ package app import ( + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/x/auth/ante" @@ -22,13 +23,13 @@ type HandlerOptions struct { func NewAnteHandler(options HandlerOptions) (sdk.AnteHandler, error) { if options.AccountKeeper == nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrLogic, "account keeper is required for AnteHandler") + return nil, errorsmod.Wrap(sdkerrors.ErrLogic, "account keeper is required for AnteHandler") } if options.BankKeeper == nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrLogic, "bank keeper is required for AnteHandler") + return nil, errorsmod.Wrap(sdkerrors.ErrLogic, "bank keeper is required for AnteHandler") } if options.SignModeHandler == nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrLogic, "sign mode handler is required for ante builder") + return nil, errorsmod.Wrap(sdkerrors.ErrLogic, "sign mode handler is required for ante builder") } sigGasConsumer := options.SigGasConsumer diff --git a/app/consumer/ante_handler.go b/app/consumer/ante_handler.go index 66fcae73c7..a070967551 100644 --- a/app/consumer/ante_handler.go +++ b/app/consumer/ante_handler.go @@ -1,6 +1,7 @@ package app import ( + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/x/auth/ante" @@ -21,13 +22,13 @@ type HandlerOptions struct { func NewAnteHandler(options HandlerOptions) (sdk.AnteHandler, error) { if options.AccountKeeper == nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrLogic, "account keeper is required for AnteHandler") + return nil, errorsmod.Wrap(sdkerrors.ErrLogic, "account keeper is required for AnteHandler") } if options.BankKeeper == nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrLogic, "bank keeper is required for AnteHandler") + return nil, errorsmod.Wrap(sdkerrors.ErrLogic, "bank keeper is required for AnteHandler") } if options.SignModeHandler == nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrLogic, "sign mode handler is required for ante builder") + return nil, errorsmod.Wrap(sdkerrors.ErrLogic, "sign mode handler is required for ante builder") } sigGasConsumer := options.SigGasConsumer diff --git a/app/provider/ante_handler.go b/app/provider/ante_handler.go index 7e306ddd00..3b1a3b7d38 100644 --- a/app/provider/ante_handler.go +++ b/app/provider/ante_handler.go @@ -1,6 +1,7 @@ package app import ( + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/x/auth/ante" @@ -18,13 +19,13 @@ type HandlerOptions struct { func NewAnteHandler(options HandlerOptions) (sdk.AnteHandler, error) { if options.AccountKeeper == nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrLogic, "account keeper is required for AnteHandler") + return nil, errorsmod.Wrap(sdkerrors.ErrLogic, "account keeper is required for AnteHandler") } if options.BankKeeper == nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrLogic, "bank keeper is required for AnteHandler") + return nil, errorsmod.Wrap(sdkerrors.ErrLogic, "bank keeper is required for AnteHandler") } if options.SignModeHandler == nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrLogic, "sign mode handler is required for ante builder") + return nil, errorsmod.Wrap(sdkerrors.ErrLogic, "sign mode handler is required for ante builder") } sigGasConsumer := options.SigGasConsumer diff --git a/go.mod b/go.mod index 7bd171a069..46b5ed0e98 100644 --- a/go.mod +++ b/go.mod @@ -31,6 +31,8 @@ require ( gopkg.in/yaml.v2 v2.4.0 ) +require cosmossdk.io/errors v1.0.0-beta.7 + require ( cosmossdk.io/api v0.2.6 // indirect cosmossdk.io/core v0.5.1 // indirect diff --git a/go.sum b/go.sum index eb7e1591cb..1f9035e685 100644 --- a/go.sum +++ b/go.sum @@ -44,6 +44,8 @@ cosmossdk.io/core v0.5.1 h1:vQVtFrIYOQJDV3f7rw4pjjVqc1id4+mE0L9hHP66pyI= cosmossdk.io/core v0.5.1/go.mod h1:KZtwHCLjcFuo0nmDc24Xy6CRNEL9Vl/MeimQ2aC7NLE= cosmossdk.io/depinject v1.0.0-alpha.3 h1:6evFIgj//Y3w09bqOUOzEpFj5tsxBqdc5CfkO7z+zfw= cosmossdk.io/depinject v1.0.0-alpha.3/go.mod h1:eRbcdQ7MRpIPEM5YUJh8k97nxHpYbc3sMUnEtt8HPWU= +cosmossdk.io/errors v1.0.0-beta.7 h1:gypHW76pTQGVnHKo6QBkb4yFOJjC+sUGRc5Al3Odj1w= +cosmossdk.io/errors v1.0.0-beta.7/go.mod h1:mz6FQMJRku4bY7aqS/Gwfcmr/ue91roMEKAmDUDpBfE= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.0.0-rc.1 h1:m0VOOB23frXZvAOK44usCgLWvtsxIoMCTBGJZlpmGfU= filippo.io/edwards25519 v1.0.0-rc.1/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= diff --git a/legacy_ibc_testing/testing/chain.go b/legacy_ibc_testing/testing/chain.go index 6664757136..abea4131d9 100644 --- a/legacy_ibc_testing/testing/chain.go +++ b/legacy_ibc_testing/testing/chain.go @@ -6,12 +6,12 @@ import ( "testing" "time" + errorsmod "cosmossdk.io/errors" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" @@ -455,7 +455,7 @@ func (chain *TestChain) ConstructUpdateTMClientHeaderWithTrustedHeight(counterpa // NextValidatorsHash tmTrustedVals, ok = counterparty.GetValsAtHeight(int64(trustedHeight.RevisionHeight + 1)) if !ok { - return nil, sdkerrors.Wrapf(ibctmtypes.ErrInvalidHeaderHeight, "could not retrieve trusted validators at trustedHeight: %d", trustedHeight) + return nil, errorsmod.Wrapf(ibctmtypes.ErrInvalidHeaderHeight, "could not retrieve trusted validators at trustedHeight: %d", trustedHeight) } } // inject trusted fields into last header diff --git a/testutil/simibc/relay_util.go b/testutil/simibc/relay_util.go index 5a9cf17e99..267ec33a4b 100644 --- a/testutil/simibc/relay_util.go +++ b/testutil/simibc/relay_util.go @@ -1,8 +1,8 @@ package simibc import ( + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" host "github.com/cosmos/ibc-go/v4/modules/core/24-host" @@ -160,7 +160,7 @@ func augmentHeader(sender *ibctesting.TestChain, receiver *ibctesting.TestChain, // NextValidatorsHash tmTrustedVals, ok = sender.GetValsAtHeight(int64(trustedHeight.RevisionHeight + 1)) if !ok { - return sdkerrors.Wrapf(ibctmtypes.ErrInvalidHeaderHeight, "could not retrieve trusted validators at trustedHeight: %d", trustedHeight) + return errorsmod.Wrapf(ibctmtypes.ErrInvalidHeaderHeight, "could not retrieve trusted validators at trustedHeight: %d", trustedHeight) } } trustedVals, err := tmTrustedVals.ToProto() diff --git a/x/ccv/consumer/ibc_module.go b/x/ccv/consumer/ibc_module.go index 87c876097b..ab2dad74dc 100644 --- a/x/ccv/consumer/ibc_module.go +++ b/x/ccv/consumer/ibc_module.go @@ -4,6 +4,7 @@ import ( "fmt" "strings" + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" @@ -38,7 +39,7 @@ func (am AppModule) OnChanOpenInit( // ensure provider channel hasn't already been created if providerChannel, ok := am.keeper.GetProviderChannel(ctx); ok { - return "", sdkerrors.Wrapf(types.ErrDuplicateChannel, + return "", errorsmod.Wrapf(types.ErrDuplicateChannel, "provider channel: %s already set", providerChannel) } @@ -51,7 +52,7 @@ func (am AppModule) OnChanOpenInit( // ensure the counterparty port ID matches the expected provider port ID if counterparty.PortId != types.ProviderPortID { - return "", sdkerrors.Wrapf(porttypes.ErrInvalidPort, + return "", errorsmod.Wrapf(porttypes.ErrInvalidPort, "invalid counterparty port: %s, expected %s", counterparty.PortId, types.ProviderPortID) } @@ -79,18 +80,18 @@ func validateCCVChannelParams( ) error { // Only ordered channels allowed if order != channeltypes.ORDERED { - return sdkerrors.Wrapf(channeltypes.ErrInvalidChannelOrdering, "expected %s channel, got %s ", channeltypes.ORDERED, order) + return errorsmod.Wrapf(channeltypes.ErrInvalidChannelOrdering, "expected %s channel, got %s ", channeltypes.ORDERED, order) } // the port ID must match the port ID the CCV module is bounded to boundPort := keeper.GetPort(ctx) if boundPort != portID { - return sdkerrors.Wrapf(porttypes.ErrInvalidPort, "invalid port: %s, expected %s", portID, boundPort) + return errorsmod.Wrapf(porttypes.ErrInvalidPort, "invalid port: %s, expected %s", portID, boundPort) } // the version must match the expected version if version != types.Version { - return sdkerrors.Wrapf(types.ErrInvalidVersion, "got %s, expected %s", version, types.Version) + return errorsmod.Wrapf(types.ErrInvalidVersion, "got %s, expected %s", version, types.Version) } return nil } @@ -106,7 +107,7 @@ func (am AppModule) OnChanOpenTry( counterparty channeltypes.Counterparty, counterpartyVersion string, ) (string, error) { - return "", sdkerrors.Wrap(types.ErrInvalidChannelFlow, "channel handshake must be initiated by consumer chain") + return "", errorsmod.Wrap(types.ErrInvalidChannelFlow, "channel handshake must be initiated by consumer chain") } // OnChanOpenAck implements the IBCModule interface @@ -119,18 +120,18 @@ func (am AppModule) OnChanOpenAck( ) error { // ensure provider channel has not already been created if providerChannel, ok := am.keeper.GetProviderChannel(ctx); ok { - return sdkerrors.Wrapf(types.ErrDuplicateChannel, + return errorsmod.Wrapf(types.ErrDuplicateChannel, "provider channel: %s already established", providerChannel) } var md providertypes.HandshakeMetadata if err := (&md).Unmarshal([]byte(counterpartyMetadata)); err != nil { - return sdkerrors.Wrapf(types.ErrInvalidHandshakeMetadata, + return errorsmod.Wrapf(types.ErrInvalidHandshakeMetadata, "error unmarshalling ibc-ack metadata: \n%v; \nmetadata: %v", err, counterpartyMetadata) } if md.Version != types.Version { - return sdkerrors.Wrapf(types.ErrInvalidVersion, + return errorsmod.Wrapf(types.ErrInvalidVersion, "invalid counterparty version: %s, expected %s", md.Version, types.Version) } @@ -194,7 +195,7 @@ func (am AppModule) OnChanOpenConfirm( portID, channelID string, ) error { - return sdkerrors.Wrap(types.ErrInvalidChannelFlow, "channel handshake must be initiated by consumer chain") + return errorsmod.Wrap(types.ErrInvalidChannelFlow, "channel handshake must be initiated by consumer chain") } // OnChanCloseInit implements the IBCModule interface @@ -207,7 +208,7 @@ func (am AppModule) OnChanCloseInit( if providerChannel, ok := am.keeper.GetProviderChannel(ctx); ok && providerChannel != channelID { return nil } - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "user cannot close channel") + return errorsmod.Wrap(sdkerrors.ErrInvalidRequest, "user cannot close channel") } // OnChanCloseConfirm implements the IBCModule interface @@ -258,7 +259,7 @@ func (am AppModule) OnAcknowledgementPacket( ) error { var ack channeltypes.Acknowledgement if err := types.ModuleCdc.UnmarshalJSON(acknowledgement, &ack); err != nil { - return sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "cannot unmarshal consumer packet acknowledgement: %v", err) + return errorsmod.Wrapf(sdkerrors.ErrUnknownRequest, "cannot unmarshal consumer packet acknowledgement: %v", err) } if err := am.keeper.OnAcknowledgementPacket(ctx, packet, ack); err != nil { diff --git a/x/ccv/consumer/keeper/distribution.go b/x/ccv/consumer/keeper/distribution.go index 140e135c12..8400ae9c63 100644 --- a/x/ccv/consumer/keeper/distribution.go +++ b/x/ccv/consumer/keeper/distribution.go @@ -4,8 +4,8 @@ import ( "fmt" "strconv" + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" transfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" @@ -186,7 +186,7 @@ func (k Keeper) TransferChannelExists(ctx sdk.Context, channelID string) bool { func (k Keeper) GetConnectionHops(ctx sdk.Context, srcPort, srcChan string) ([]string, error) { ch, found := k.channelKeeper.GetChannel(ctx, srcPort, srcChan) if !found { - return []string{}, sdkerrors.Wrapf(ccv.ErrChannelNotFound, + return []string{}, errorsmod.Wrapf(ccv.ErrChannelNotFound, "cannot get connection hops from non-existent channel") } return ch.ConnectionHops, nil diff --git a/x/ccv/consumer/keeper/keeper.go b/x/ccv/consumer/keeper/keeper.go index c3216d2459..d24f5fbd39 100644 --- a/x/ccv/consumer/keeper/keeper.go +++ b/x/ccv/consumer/keeper/keeper.go @@ -6,8 +6,8 @@ import ( "reflect" "time" + errorsmod "cosmossdk.io/errors" "github.com/cosmos/cosmos-sdk/codec" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -143,7 +143,7 @@ func (k Keeper) ChanCloseInit(ctx sdk.Context, portID, channelID string) error { capName := host.ChannelCapabilityPath(portID, channelID) chanCap, ok := k.scopedKeeper.GetCapability(ctx, capName) if !ok { - return sdkerrors.Wrapf(channeltypes.ErrChannelCapabilityNotFound, "could not retrieve channel capability at: %s", capName) + return errorsmod.Wrapf(channeltypes.ErrChannelCapabilityNotFound, "could not retrieve channel capability at: %s", capName) } return k.channelKeeper.ChanCloseInit(ctx, portID, channelID, chanCap) } @@ -402,20 +402,20 @@ func (k Keeper) DeletePacketMaturityTimes(ctx sdk.Context, vscId uint64, maturit // is the expected provider chain. func (k Keeper) VerifyProviderChain(ctx sdk.Context, connectionHops []string) error { if len(connectionHops) != 1 { - return sdkerrors.Wrap(channeltypes.ErrTooManyConnectionHops, "must have direct connection to provider chain") + return errorsmod.Wrap(channeltypes.ErrTooManyConnectionHops, "must have direct connection to provider chain") } connectionID := connectionHops[0] conn, ok := k.connectionKeeper.GetConnection(ctx, connectionID) if !ok { - return sdkerrors.Wrapf(conntypes.ErrConnectionNotFound, "connection not found for connection ID: %s", connectionID) + return errorsmod.Wrapf(conntypes.ErrConnectionNotFound, "connection not found for connection ID: %s", connectionID) } // Verify that client id is expected clientID expectedClientId, ok := k.GetProviderClientID(ctx) if !ok { - return sdkerrors.Wrapf(clienttypes.ErrInvalidClient, "could not find provider client id") + return errorsmod.Wrapf(clienttypes.ErrInvalidClient, "could not find provider client id") } if expectedClientId != conn.ClientId { - return sdkerrors.Wrapf(clienttypes.ErrInvalidClient, "invalid client: %s, channel must be built on top of client: %s", conn.ClientId, expectedClientId) + return errorsmod.Wrapf(clienttypes.ErrInvalidClient, "invalid client: %s, channel must be built on top of client: %s", conn.ClientId, expectedClientId) } return nil diff --git a/x/ccv/consumer/keeper/relay.go b/x/ccv/consumer/keeper/relay.go index 072adf2438..c690ef3701 100644 --- a/x/ccv/consumer/keeper/relay.go +++ b/x/ccv/consumer/keeper/relay.go @@ -4,8 +4,8 @@ import ( "fmt" "strconv" + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" @@ -232,7 +232,7 @@ func (k Keeper) OnAcknowledgementPacket(ctx sdk.Context, packet channeltypes.Pac // check if there is an established CCV channel to provider channelID, found := k.GetProviderChannel(ctx) if !found { - return sdkerrors.Wrapf(types.ErrNoProposerChannelId, "recv ErrorAcknowledgement on non-established channel %s", packet.SourceChannel) + return errorsmod.Wrapf(types.ErrNoProposerChannelId, "recv ErrorAcknowledgement on non-established channel %s", packet.SourceChannel) } if channelID != packet.SourceChannel { // Close the established CCV channel as well diff --git a/x/ccv/consumer/types/errors.go b/x/ccv/consumer/types/errors.go index 486281139e..9a2a729737 100644 --- a/x/ccv/consumer/types/errors.go +++ b/x/ccv/consumer/types/errors.go @@ -1,10 +1,10 @@ package types import ( - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + errorsmod "cosmossdk.io/errors" ) // Consumer sentinel errors var ( - ErrNoProposerChannelId = sdkerrors.Register(ModuleName, 1, "no established CCV channel") + ErrNoProposerChannelId = errorsmod.Register(ModuleName, 1, "no established CCV channel") ) diff --git a/x/ccv/consumer/types/genesis.go b/x/ccv/consumer/types/genesis.go index 052bc7f822..c3856ab1de 100644 --- a/x/ccv/consumer/types/genesis.go +++ b/x/ccv/consumer/types/genesis.go @@ -1,7 +1,7 @@ package types import ( - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + errorsmod "cosmossdk.io/errors" ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" ccv "github.com/cosmos/interchain-security/x/ccv/types" @@ -76,7 +76,7 @@ func (gs GenesisState) Validate() error { return nil } if len(gs.InitialValSet) == 0 { - return sdkerrors.Wrap(ccv.ErrInvalidGenesis, "initial validator set is empty") + return errorsmod.Wrap(ccv.ErrInvalidGenesis, "initial validator set is empty") } if err := gs.Params.Validate(); err != nil { return err @@ -84,72 +84,72 @@ func (gs GenesisState) Validate() error { if gs.NewChain { if gs.ProviderClientState == nil { - return sdkerrors.Wrap(ccv.ErrInvalidGenesis, "provider client state cannot be nil for new chain") + return errorsmod.Wrap(ccv.ErrInvalidGenesis, "provider client state cannot be nil for new chain") } if err := gs.ProviderClientState.Validate(); err != nil { - return sdkerrors.Wrapf(ccv.ErrInvalidGenesis, "provider client state invalid for new chain %s", err.Error()) + return errorsmod.Wrapf(ccv.ErrInvalidGenesis, "provider client state invalid for new chain %s", err.Error()) } if gs.ProviderConsensusState == nil { - return sdkerrors.Wrap(ccv.ErrInvalidGenesis, "provider consensus state cannot be nil for new chain") + return errorsmod.Wrap(ccv.ErrInvalidGenesis, "provider consensus state cannot be nil for new chain") } if err := gs.ProviderConsensusState.ValidateBasic(); err != nil { - return sdkerrors.Wrapf(ccv.ErrInvalidGenesis, "provider consensus state invalid for new chain %s", err.Error()) + return errorsmod.Wrapf(ccv.ErrInvalidGenesis, "provider consensus state invalid for new chain %s", err.Error()) } if gs.ProviderClientId != "" { - return sdkerrors.Wrap(ccv.ErrInvalidGenesis, "provider client id cannot be set for new chain. It must be established on handshake") + return errorsmod.Wrap(ccv.ErrInvalidGenesis, "provider client id cannot be set for new chain. It must be established on handshake") } if gs.ProviderChannelId != "" { - return sdkerrors.Wrap(ccv.ErrInvalidGenesis, "provider channel id cannot be set for new chain. It must be established on handshake") + return errorsmod.Wrap(ccv.ErrInvalidGenesis, "provider channel id cannot be set for new chain. It must be established on handshake") } if len(gs.MaturingPackets) != 0 { - return sdkerrors.Wrap(ccv.ErrInvalidGenesis, "maturing packets must be empty for new chain") + return errorsmod.Wrap(ccv.ErrInvalidGenesis, "maturing packets must be empty for new chain") } if len(gs.PendingConsumerPackets.List) != 0 { - return sdkerrors.Wrap(ccv.ErrInvalidGenesis, "pending consumer packets must be empty for new chain") + return errorsmod.Wrap(ccv.ErrInvalidGenesis, "pending consumer packets must be empty for new chain") } if gs.LastTransmissionBlockHeight.Height != 0 { - return sdkerrors.Wrap(ccv.ErrInvalidGenesis, "last transmission block height must be empty for new chain") + return errorsmod.Wrap(ccv.ErrInvalidGenesis, "last transmission block height must be empty for new chain") } } else { // NOTE: For restart genesis, we will verify initial validator set in InitGenesis. if gs.ProviderClientId == "" { - return sdkerrors.Wrap(ccv.ErrInvalidGenesis, "provider client id must be set for a restarting consumer genesis state") + return errorsmod.Wrap(ccv.ErrInvalidGenesis, "provider client id must be set for a restarting consumer genesis state") } // handshake is still in progress handshakeInProgress := gs.ProviderChannelId == "" if handshakeInProgress { if len(gs.MaturingPackets) != 0 { - return sdkerrors.Wrap( + return errorsmod.Wrap( ccv.ErrInvalidGenesis, "maturing packets must be empty when handshake isn't completed") } if len(gs.OutstandingDowntimeSlashing) != 0 { - return sdkerrors.Wrap( + return errorsmod.Wrap( ccv.ErrInvalidGenesis, "outstanding downtime must be empty when handshake isn't completed") } if gs.LastTransmissionBlockHeight.Height != 0 { - return sdkerrors.Wrap( + return errorsmod.Wrap( ccv.ErrInvalidGenesis, "last transmission block height must be zero when handshake isn't completed") } if len(gs.PendingConsumerPackets.List) != 0 { for _, packet := range gs.PendingConsumerPackets.List { if packet.Type == ccv.VscMaturedPacket { - return sdkerrors.Wrap(ccv.ErrInvalidGenesis, "pending maturing packets must be empty when handshake isn't completed") + return errorsmod.Wrap(ccv.ErrInvalidGenesis, "pending maturing packets must be empty when handshake isn't completed") } } } } if gs.HeightToValsetUpdateId == nil { - return sdkerrors.Wrap( + return errorsmod.Wrap( ccv.ErrInvalidGenesis, "empty height to validator set update id mapping", ) } if gs.ProviderClientState != nil || gs.ProviderConsensusState != nil { - return sdkerrors.Wrap(ccv.ErrInvalidGenesis, "provider client state and consensus state must be nil for a restarting genesis state") + return errorsmod.Wrap(ccv.ErrInvalidGenesis, "provider client state and consensus state must be nil for a restarting genesis state") } for _, mat := range gs.MaturingPackets { if err := mat.Validate(); err != nil { - return sdkerrors.Wrap(err, "invalid unbonding sequences") + return errorsmod.Wrap(err, "invalid unbonding sequences") } } } @@ -158,10 +158,10 @@ func (gs GenesisState) Validate() error { func (mat MaturingVSCPacket) Validate() error { if mat.MaturityTime.IsZero() { - return sdkerrors.Wrap(ccv.ErrInvalidVSCMaturedTime, "cannot have 0 maturity time") + return errorsmod.Wrap(ccv.ErrInvalidVSCMaturedTime, "cannot have 0 maturity time") } if mat.VscId == 0 { - return sdkerrors.Wrap(ccv.ErrInvalidVSCMaturedId, "cannot have 0 maturity time") + return errorsmod.Wrap(ccv.ErrInvalidVSCMaturedId, "cannot have 0 maturity time") } return nil } diff --git a/x/ccv/consumer/types/validator.go b/x/ccv/consumer/types/validator.go index 69314b15d3..c546a68440 100644 --- a/x/ccv/consumer/types/validator.go +++ b/x/ccv/consumer/types/validator.go @@ -1,6 +1,7 @@ package types import ( + errorsmod "cosmossdk.io/errors" codectypes "github.com/cosmos/cosmos-sdk/codec/types" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -29,7 +30,7 @@ func (ccv CrossChainValidator) UnpackInterfaces(unpacker codectypes.AnyUnpacker) func (ccv CrossChainValidator) ConsPubKey() (cryptotypes.PubKey, error) { pk, ok := ccv.Pubkey.GetCachedValue().(cryptotypes.PubKey) if !ok { - return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidType, "expecting cryptotypes.PubKey, got %T", pk) + return nil, errorsmod.Wrapf(sdkerrors.ErrInvalidType, "expecting cryptotypes.PubKey, got %T", pk) } return pk, nil diff --git a/x/ccv/provider/handler.go b/x/ccv/provider/handler.go index 4751b8460c..10b92c0f71 100644 --- a/x/ccv/provider/handler.go +++ b/x/ccv/provider/handler.go @@ -1,6 +1,7 @@ package provider import ( + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/interchain-security/x/ccv/provider/keeper" @@ -18,7 +19,7 @@ func NewHandler(k *keeper.Keeper) sdk.Handler { res, err := msgServer.AssignConsumerKey(sdk.WrapSDKContext(ctx), msg) return sdk.WrapServiceResult(ctx, res, err) default: - return nil, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "unrecognized %s message type: %T", types.ModuleName, msg) + return nil, errorsmod.Wrapf(sdkerrors.ErrUnknownRequest, "unrecognized %s message type: %T", types.ModuleName, msg) } } } diff --git a/x/ccv/provider/ibc_module.go b/x/ccv/provider/ibc_module.go index 265310d283..06bd9e39f6 100644 --- a/x/ccv/provider/ibc_module.go +++ b/x/ccv/provider/ibc_module.go @@ -3,6 +3,7 @@ package provider import ( "fmt" + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" @@ -29,7 +30,7 @@ func (am AppModule) OnChanOpenInit( counterparty channeltypes.Counterparty, version string, ) (string, error) { - return version, sdkerrors.Wrap(ccv.ErrInvalidChannelFlow, "channel handshake must be initiated by consumer chain") + return version, errorsmod.Wrap(ccv.ErrInvalidChannelFlow, "channel handshake must be initiated by consumer chain") } // OnChanOpenTry implements the IBCModule interface @@ -55,13 +56,13 @@ func (am AppModule) OnChanOpenTry( // ensure the counterparty port ID matches the expected consumer port ID if counterparty.PortId != ccv.ConsumerPortID { - return "", sdkerrors.Wrapf(porttypes.ErrInvalidPort, + return "", errorsmod.Wrapf(porttypes.ErrInvalidPort, "invalid counterparty port: %s, expected %s", counterparty.PortId, ccv.ConsumerPortID) } // ensure the counter party version matches the expected version if counterpartyVersion != ccv.Version { - return "", sdkerrors.Wrapf( + return "", errorsmod.Wrapf( ccv.ErrInvalidVersion, "invalid counterparty version: got: %s, expected %s", counterpartyVersion, ccv.Version) } @@ -89,7 +90,7 @@ func (am AppModule) OnChanOpenTry( } mdBz, err := (&md).Marshal() if err != nil { - return "", sdkerrors.Wrapf(ccv.ErrInvalidHandshakeMetadata, + return "", errorsmod.Wrapf(ccv.ErrInvalidHandshakeMetadata, "error marshalling ibc-try metadata: %v", err) } return string(mdBz), nil @@ -103,13 +104,13 @@ func validateCCVChannelParams( portID string, ) error { if order != channeltypes.ORDERED { - return sdkerrors.Wrapf(channeltypes.ErrInvalidChannelOrdering, "expected %s channel, got %s ", channeltypes.ORDERED, order) + return errorsmod.Wrapf(channeltypes.ErrInvalidChannelOrdering, "expected %s channel, got %s ", channeltypes.ORDERED, order) } // the port ID must match the port ID the CCV module is bounded to boundPort := keeper.GetPort(ctx) if boundPort != portID { - return sdkerrors.Wrapf(porttypes.ErrInvalidPort, "invalid port: %s, expected %s", portID, boundPort) + return errorsmod.Wrapf(porttypes.ErrInvalidPort, "invalid port: %s, expected %s", portID, boundPort) } return nil } @@ -125,7 +126,7 @@ func (am AppModule) OnChanOpenAck( counterpartyChannelID string, counterpartyVersion string, ) error { - return sdkerrors.Wrap(ccv.ErrInvalidChannelFlow, "channel handshake must be initiated by consumer chain") + return errorsmod.Wrap(ccv.ErrInvalidChannelFlow, "channel handshake must be initiated by consumer chain") } // OnChanOpenConfirm implements the IBCModule interface @@ -151,7 +152,7 @@ func (am AppModule) OnChanCloseInit( channelID string, ) error { // Disallow user-initiated channel closing for provider channels - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "user cannot close channel") + return errorsmod.Wrap(sdkerrors.ErrInvalidRequest, "user cannot close channel") } // OnChanCloseConfirm implements the IBCModule interface @@ -216,7 +217,7 @@ func (am AppModule) OnAcknowledgementPacket( ) error { var ack channeltypes.Acknowledgement if err := ccv.ModuleCdc.UnmarshalJSON(acknowledgement, &ack); err != nil { - return sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "cannot unmarshal provider packet acknowledgement: %v", err) + return errorsmod.Wrapf(sdkerrors.ErrUnknownRequest, "cannot unmarshal provider packet acknowledgement: %v", err) } if err := am.keeper.OnAcknowledgementPacket(ctx, packet, ack); err != nil { diff --git a/x/ccv/provider/keeper/grpc_query.go b/x/ccv/provider/keeper/grpc_query.go index caebb91deb..cddae5f8cf 100644 --- a/x/ccv/provider/keeper/grpc_query.go +++ b/x/ccv/provider/keeper/grpc_query.go @@ -4,8 +4,8 @@ import ( "context" "fmt" + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/interchain-security/x/ccv/provider/types" ccvtypes "github.com/cosmos/interchain-security/x/ccv/types" "google.golang.org/grpc/codes" @@ -27,7 +27,7 @@ func (k Keeper) QueryConsumerGenesis(c context.Context, req *types.QueryConsumer gen, ok := k.GetConsumerGenesis(ctx, req.ChainId) if !ok { - return nil, sdkerrors.Wrap(types.ErrUnknownConsumerChainId, req.ChainId) + return nil, errorsmod.Wrap(types.ErrUnknownConsumerChainId, req.ChainId) } return &types.QueryConsumerGenesisResponse{GenesisState: gen}, nil diff --git a/x/ccv/provider/keeper/keeper.go b/x/ccv/provider/keeper/keeper.go index 2a6638cfef..34dfa47aa5 100644 --- a/x/ccv/provider/keeper/keeper.go +++ b/x/ccv/provider/keeper/keeper.go @@ -6,9 +6,9 @@ import ( "reflect" "time" + errorsmod "cosmossdk.io/errors" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" @@ -272,7 +272,7 @@ func (k Keeper) DeleteConsumerGenesis(ctx sdk.Context, chainID string) { // is the expected consumer chain. func (k Keeper) VerifyConsumerChain(ctx sdk.Context, channelID string, connectionHops []string) error { if len(connectionHops) != 1 { - return sdkerrors.Wrap(channeltypes.ErrTooManyConnectionHops, "must have direct connection to provider chain") + return errorsmod.Wrap(channeltypes.ErrTooManyConnectionHops, "must have direct connection to provider chain") } connectionID := connectionHops[0] clientID, tmClient, err := k.getUnderlyingClient(ctx, connectionID) @@ -281,15 +281,15 @@ func (k Keeper) VerifyConsumerChain(ctx sdk.Context, channelID string, connectio } ccvClientId, found := k.GetConsumerClientId(ctx, tmClient.ChainId) if !found { - return sdkerrors.Wrapf(ccv.ErrClientNotFound, "cannot find client for consumer chain %s", tmClient.ChainId) + return errorsmod.Wrapf(ccv.ErrClientNotFound, "cannot find client for consumer chain %s", tmClient.ChainId) } if ccvClientId != clientID { - return sdkerrors.Wrapf(ccv.ErrInvalidConsumerClient, "CCV channel must be built on top of CCV client. expected %s, got %s", ccvClientId, clientID) + return errorsmod.Wrapf(ccv.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 if prevChannel, ok := k.GetChainToChannel(ctx, tmClient.ChainId); ok { - return sdkerrors.Wrapf(ccv.ErrDuplicateChannel, "CCV channel with ID: %s already created for consumer chain %s", prevChannel, tmClient.ChainId) + return errorsmod.Wrapf(ccv.ErrDuplicateChannel, "CCV channel with ID: %s already created for consumer chain %s", prevChannel, tmClient.ChainId) } return nil } @@ -304,10 +304,10 @@ func (k Keeper) VerifyConsumerChain(ctx sdk.Context, channelID string, connectio func (k Keeper) SetConsumerChain(ctx sdk.Context, channelID string) error { channel, ok := k.channelKeeper.GetChannel(ctx, ccv.ProviderPortID, channelID) if !ok { - return sdkerrors.Wrapf(channeltypes.ErrChannelNotFound, "channel not found for channel ID: %s", channelID) + return errorsmod.Wrapf(channeltypes.ErrChannelNotFound, "channel not found for channel ID: %s", channelID) } if len(channel.ConnectionHops) != 1 { - return sdkerrors.Wrap(channeltypes.ErrTooManyConnectionHops, "must have direct connection to consumer chain") + return errorsmod.Wrap(channeltypes.ErrTooManyConnectionHops, "must have direct connection to consumer chain") } connectionID := channel.ConnectionHops[0] clientID, tmClient, err := k.getUnderlyingClient(ctx, connectionID) @@ -317,7 +317,7 @@ func (k Keeper) SetConsumerChain(ctx sdk.Context, channelID string) error { // Verify that there isn't already a CCV channel for the consumer chain chainID := tmClient.ChainId if prevChannelID, ok := k.GetChainToChannel(ctx, chainID); ok { - return sdkerrors.Wrapf(ccv.ErrDuplicateChannel, "CCV channel with ID: %s already created for consumer chain %s", prevChannelID, chainID) + return errorsmod.Wrapf(ccv.ErrDuplicateChannel, "CCV channel with ID: %s already created for consumer chain %s", prevChannelID, chainID) } // the CCV channel is established: @@ -603,18 +603,18 @@ func (k Keeper) getUnderlyingClient(ctx sdk.Context, connectionID string) ( ) { conn, ok := k.connectionKeeper.GetConnection(ctx, connectionID) if !ok { - return "", nil, sdkerrors.Wrapf(conntypes.ErrConnectionNotFound, + return "", nil, errorsmod.Wrapf(conntypes.ErrConnectionNotFound, "connection not found for connection ID: %s", connectionID) } clientID = conn.ClientId clientState, ok := k.clientKeeper.GetClientState(ctx, clientID) if !ok { - return "", nil, sdkerrors.Wrapf(clienttypes.ErrClientNotFound, + return "", nil, errorsmod.Wrapf(clienttypes.ErrClientNotFound, "client not found for client ID: %s", conn.ClientId) } tmClient, ok = clientState.(*ibctmtypes.ClientState) if !ok { - return "", nil, sdkerrors.Wrapf(clienttypes.ErrInvalidClientType, + return "", nil, errorsmod.Wrapf(clienttypes.ErrInvalidClientType, "invalid client type. expected %s, got %s", ibcexported.Tendermint, clientState.ClientType()) } return clientID, tmClient, nil @@ -625,7 +625,7 @@ func (k Keeper) chanCloseInit(ctx sdk.Context, channelID string) error { capName := host.ChannelCapabilityPath(ccv.ProviderPortID, channelID) chanCap, ok := k.scopedKeeper.GetCapability(ctx, capName) if !ok { - return sdkerrors.Wrapf(channeltypes.ErrChannelCapabilityNotFound, "could not retrieve channel capability at: %s", capName) + return errorsmod.Wrapf(channeltypes.ErrChannelCapabilityNotFound, "could not retrieve channel capability at: %s", capName) } return k.channelKeeper.ChanCloseInit(ctx, ccv.ProviderPortID, channelID, chanCap) } diff --git a/x/ccv/provider/keeper/key_assignment.go b/x/ccv/provider/keeper/key_assignment.go index b74a722d87..31dcade941 100644 --- a/x/ccv/provider/keeper/key_assignment.go +++ b/x/ccv/provider/keeper/key_assignment.go @@ -3,8 +3,8 @@ package keeper import ( "fmt" + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/cosmos/interchain-security/x/ccv/provider/types" @@ -409,13 +409,13 @@ func (k Keeper) AssignConsumerKey( // This ensures that a validator joining the active set who has not explicitly assigned // a consumer key, will be able to use their provider key as consumer key (as per default). if existingVal.OperatorAddress != validator.OperatorAddress { - return sdkerrors.Wrapf( + return errorsmod.Wrapf( types.ErrConsumerKeyInUse, "a different validator already uses the consumer key", ) } _, found := k.GetValidatorConsumerPubKey(ctx, chainID, providerAddr) if !found { - return sdkerrors.Wrapf( + return errorsmod.Wrapf( types.ErrCannotAssignDefaultKeyAssignment, "a validator cannot assign the default key assignment unless its key on that consumer has already been assigned", ) @@ -425,7 +425,7 @@ func (k Keeper) AssignConsumerKey( if _, found := k.GetValidatorByConsumerAddr(ctx, chainID, consumerAddr); found { // consumer key is already in use // prevent multiple validators from assigning the same key - return sdkerrors.Wrapf( + return errorsmod.Wrapf( types.ErrConsumerKeyInUse, "a validator has assigned the consumer key already", ) } diff --git a/x/ccv/provider/keeper/msg_server.go b/x/ccv/provider/keeper/msg_server.go index f4e3a9038e..184984494f 100644 --- a/x/ccv/provider/keeper/msg_server.go +++ b/x/ccv/provider/keeper/msg_server.go @@ -4,8 +4,8 @@ import ( "context" "encoding/base64" + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/cosmos/interchain-security/x/ccv/provider/types" ccvtypes "github.com/cosmos/interchain-security/x/ccv/types" @@ -59,7 +59,7 @@ func (k msgServer) AssignConsumerKey(goCtx context.Context, msg *types.MsgAssign // cp := ctx.ConsensusParams() // if cp != nil && cp.Validator != nil { // if !tmstrings.StringInSlice(pkType, cp.Validator.PubKeyTypes) { - // return nil, sdkerrors.Wrapf( + // return nil, errorsmod.Wrapf( // stakingtypes.ErrValidatorPubKeyTypeNotSupported, // "got: %s, expected one of: %s", pkType, cp.Validator.PubKeyTypes, // ) @@ -69,7 +69,7 @@ func (k msgServer) AssignConsumerKey(goCtx context.Context, msg *types.MsgAssign // For now, only accept ed25519. // TODO: decide what types should be supported. if pkType != "/cosmos.crypto.ed25519.PubKey" { - return nil, sdkerrors.Wrapf( + return nil, errorsmod.Wrapf( stakingtypes.ErrValidatorPubKeyTypeNotSupported, "got: %s, expected: %s", pkType, "/cosmos.crypto.ed25519.PubKey", ) diff --git a/x/ccv/provider/keeper/proposal.go b/x/ccv/provider/keeper/proposal.go index 158b4af3ce..aa3147b74b 100644 --- a/x/ccv/provider/keeper/proposal.go +++ b/x/ccv/provider/keeper/proposal.go @@ -7,6 +7,7 @@ import ( channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -54,7 +55,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 sdkerrors.Wrap(ccv.ErrDuplicateConsumerChain, + return errorsmod.Wrap(ccv.ErrDuplicateConsumerChain, fmt.Sprintf("cannot create client for existent consumer chain: %s", chainID)) } @@ -153,7 +154,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 sdkerrors.Wrap(ccv.ErrConsumerChainNotFound, + return errorsmod.Wrap(ccv.ErrConsumerChainNotFound, fmt.Sprintf("cannot stop non-existent consumer chain: %s", chainID)) } @@ -249,14 +250,14 @@ func (k Keeper) MakeConsumerGenesis( clientState.LatestHeight = height trustPeriod, err := ccv.CalculateTrustPeriod(providerUnbondingPeriod, k.GetTrustingPeriodFraction(ctx)) if err != nil { - return gen, nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidHeight, "error %s calculating trusting_period for: %s", err, height) + return gen, nil, errorsmod.Wrapf(sdkerrors.ErrInvalidHeight, "error %s calculating trusting_period for: %s", err, height) } clientState.TrustingPeriod = trustPeriod clientState.UnbondingPeriod = providerUnbondingPeriod consState, err := k.clientKeeper.GetSelfConsensusState(ctx, height) if err != nil { - return gen, nil, sdkerrors.Wrapf(clienttypes.ErrConsensusStateNotFound, "error %s getting self consensus state for: %s", err, height) + return gen, nil, errorsmod.Wrapf(clienttypes.ErrConsensusStateNotFound, "error %s getting self consensus state for: %s", err, height) } var lastPowers []stakingtypes.LastValidatorPower @@ -275,7 +276,7 @@ func (k Keeper) MakeConsumerGenesis( val, found := k.stakingKeeper.GetValidator(ctx, addr) if !found { - return gen, nil, sdkerrors.Wrapf(stakingtypes.ErrNoValidatorFound, "error getting validator from LastValidatorPowers: %s", err) + return gen, nil, errorsmod.Wrapf(stakingtypes.ErrNoValidatorFound, "error getting validator from LastValidatorPowers: %s", err) } tmProtoPk, err := val.TmConsPublicKey() diff --git a/x/ccv/provider/keeper/relay.go b/x/ccv/provider/keeper/relay.go index eeaa0edfb3..a669d47697 100644 --- a/x/ccv/provider/keeper/relay.go +++ b/x/ccv/provider/keeper/relay.go @@ -4,8 +4,8 @@ import ( "fmt" "strconv" + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" @@ -125,7 +125,7 @@ func (k Keeper) OnAcknowledgementPacket(ctx sdk.Context, packet channeltypes.Pac // stop consumer chain and release unbonding return k.StopConsumerChain(ctx, chainID, false) } - return sdkerrors.Wrapf(providertypes.ErrUnknownConsumerChannelId, "recv ErrorAcknowledgement on unknown channel %s", packet.SourceChannel) + return errorsmod.Wrapf(providertypes.ErrUnknownConsumerChannelId, "recv ErrorAcknowledgement on unknown channel %s", packet.SourceChannel) } return nil } @@ -137,7 +137,7 @@ func (k Keeper) OnTimeoutPacket(ctx sdk.Context, packet channeltypes.Packet) err if !found { k.Logger(ctx).Error("packet timeout, unknown channel:", "channelID", packet.SourceChannel) // abort transaction - return sdkerrors.Wrap( + return errorsmod.Wrap( channeltypes.ErrInvalidChannelState, packet.SourceChannel, ) diff --git a/x/ccv/provider/proposal_handler.go b/x/ccv/provider/proposal_handler.go index 01ffd88dac..f3d51c3947 100644 --- a/x/ccv/provider/proposal_handler.go +++ b/x/ccv/provider/proposal_handler.go @@ -1,6 +1,7 @@ package provider import ( + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" @@ -21,7 +22,7 @@ func NewProviderProposalHandler(k keeper.Keeper) govtypes.Handler { case *types.EquivocationProposal: return k.HandleEquivocationProposal(ctx, c) default: - return sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "unrecognized ccv proposal content type: %T", c) + return errorsmod.Wrapf(sdkerrors.ErrUnknownRequest, "unrecognized ccv proposal content type: %T", c) } } } diff --git a/x/ccv/provider/types/errors.go b/x/ccv/provider/types/errors.go index 89505e3fd4..bc5af3cacf 100644 --- a/x/ccv/provider/types/errors.go +++ b/x/ccv/provider/types/errors.go @@ -1,22 +1,22 @@ package types import ( - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + errorsmod "cosmossdk.io/errors" ) // Provider sentinel errors var ( - ErrInvalidConsumerAdditionProposal = sdkerrors.Register(ModuleName, 1, "invalid consumer addition proposal") - ErrInvalidConsumerRemovalProp = sdkerrors.Register(ModuleName, 2, "invalid consumer removal proposal") - ErrUnknownConsumerChainId = sdkerrors.Register(ModuleName, 3, "no consumer chain with this chain id") - ErrUnknownConsumerChannelId = sdkerrors.Register(ModuleName, 4, "no consumer chain with this channel id") - ErrInvalidConsumerConsensusPubKey = sdkerrors.Register(ModuleName, 5, "empty consumer consensus public key") - ErrBlankConsumerChainID = sdkerrors.Register(ModuleName, 6, "consumer chain id must not be blank") - ErrConsumerKeyNotFound = sdkerrors.Register(ModuleName, 7, "consumer key not found") - ErrNoValidatorConsumerAddress = sdkerrors.Register(ModuleName, 8, "error getting validator consumer address") - ErrNoValidatorProviderAddress = sdkerrors.Register(ModuleName, 9, "error getting validator provider address") - ErrConsumerKeyInUse = sdkerrors.Register(ModuleName, 10, "consumer key is already in use by a validator") - ErrCannotAssignDefaultKeyAssignment = sdkerrors.Register(ModuleName, 11, "cannot re-assign default key assignment") - ErrInvalidConsumerParams = sdkerrors.Register(ModuleName, 12, "invalid consumer params") - ErrInvalidProviderAddress = sdkerrors.Register(ModuleName, 13, "invalid provider address") + ErrInvalidConsumerAdditionProposal = errorsmod.Register(ModuleName, 1, "invalid consumer addition proposal") + ErrInvalidConsumerRemovalProp = errorsmod.Register(ModuleName, 2, "invalid consumer removal proposal") + ErrUnknownConsumerChainId = errorsmod.Register(ModuleName, 3, "no consumer chain with this chain id") + ErrUnknownConsumerChannelId = errorsmod.Register(ModuleName, 4, "no consumer chain with this channel id") + ErrInvalidConsumerConsensusPubKey = errorsmod.Register(ModuleName, 5, "empty consumer consensus public key") + ErrBlankConsumerChainID = errorsmod.Register(ModuleName, 6, "consumer chain id must not be blank") + ErrConsumerKeyNotFound = errorsmod.Register(ModuleName, 7, "consumer key not found") + ErrNoValidatorConsumerAddress = errorsmod.Register(ModuleName, 8, "error getting validator consumer address") + ErrNoValidatorProviderAddress = errorsmod.Register(ModuleName, 9, "error getting validator provider address") + ErrConsumerKeyInUse = errorsmod.Register(ModuleName, 10, "consumer key is already in use by a validator") + ErrCannotAssignDefaultKeyAssignment = errorsmod.Register(ModuleName, 11, "cannot re-assign default key assignment") + ErrInvalidConsumerParams = errorsmod.Register(ModuleName, 12, "invalid consumer params") + ErrInvalidProviderAddress = errorsmod.Register(ModuleName, 13, "invalid provider address") ) diff --git a/x/ccv/provider/types/genesis.go b/x/ccv/provider/types/genesis.go index 0098076818..f9f804b24c 100644 --- a/x/ccv/provider/types/genesis.go +++ b/x/ccv/provider/types/genesis.go @@ -3,8 +3,8 @@ package types import ( "fmt" + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" host "github.com/cosmos/ibc-go/v4/modules/core/24-host" ccv "github.com/cosmos/interchain-security/x/ccv/types" ) @@ -47,7 +47,7 @@ func DefaultGenesisState() *GenesisState { func (gs GenesisState) Validate() error { if gs.ValsetUpdateId == 0 { - return sdkerrors.Wrap(ccv.ErrInvalidGenesis, "valset update ID cannot be equal to zero") + return errorsmod.Wrap(ccv.ErrInvalidGenesis, "valset update ID cannot be equal to zero") } for _, ubdOp := range gs.UnbondingOps { @@ -58,26 +58,26 @@ func (gs GenesisState) Validate() error { for _, prop := range gs.ConsumerAdditionProposals { if err := prop.ValidateBasic(); err != nil { - return sdkerrors.Wrap(ccv.ErrInvalidGenesis, err.Error()) + return errorsmod.Wrap(ccv.ErrInvalidGenesis, err.Error()) } } for _, prop := range gs.ConsumerRemovalProposals { if err := prop.ValidateBasic(); err != nil { - return sdkerrors.Wrap(ccv.ErrInvalidGenesis, err.Error()) + return errorsmod.Wrap(ccv.ErrInvalidGenesis, err.Error()) } } if len(gs.ValsetUpdateIdToHeight) > 0 { // check only the first tuple of the list since it is ordered by VSC ID if gs.ValsetUpdateIdToHeight[0].ValsetUpdateId == 0 { - return sdkerrors.Wrap(ccv.ErrInvalidGenesis, "valset update ID cannot be equal to zero") + return errorsmod.Wrap(ccv.ErrInvalidGenesis, "valset update ID cannot be equal to zero") } } for _, cs := range gs.ConsumerStates { if err := cs.Validate(); err != nil { - return sdkerrors.Wrap(ccv.ErrInvalidGenesis, fmt.Sprintf("%s: for consumer chain id: %s", err, cs.ChainId)) + return errorsmod.Wrap(ccv.ErrInvalidGenesis, fmt.Sprintf("%s: for consumer chain id: %s", err, cs.ChainId)) } } @@ -97,7 +97,7 @@ func (gs GenesisState) Validate() error { func (gs GenesisState) ValidateUnbondingOp(ubdOp UnbondingOp) error { if len(ubdOp.UnbondingConsumerChains) == 0 { - return sdkerrors.Wrap(ccv.ErrInvalidGenesis, "unbonding operations cannot have an empty consumer chain list") + return errorsmod.Wrap(ccv.ErrInvalidGenesis, "unbonding operations cannot have an empty consumer chain list") } // Check that the ID is set correctly in the UnbondingOpsIndex @@ -119,7 +119,7 @@ func (gs GenesisState) ValidateUnbondingOp(ubdOp UnbondingOp) error { } } if !found { - return sdkerrors.Wrap(ccv.ErrInvalidGenesis, + return errorsmod.Wrap(ccv.ErrInvalidGenesis, fmt.Sprintf("unbonding operation without UnbondingOpsIndex, opID=%d, chainID=%s", ubdOp.Id, chainID)) } } diff --git a/x/ccv/provider/types/key_assignment.go b/x/ccv/provider/types/key_assignment.go index 380b70c847..450f32c918 100644 --- a/x/ccv/provider/types/key_assignment.go +++ b/x/ccv/provider/types/key_assignment.go @@ -4,8 +4,8 @@ import ( "fmt" "strings" + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ccvtypes "github.com/cosmos/interchain-security/x/ccv/types" ) @@ -57,34 +57,34 @@ func KeyAssignmentValidateBasic( ) error { for _, e := range assignedKeys { if strings.TrimSpace(e.ChainId) == "" { - return sdkerrors.Wrap(ccvtypes.ErrInvalidGenesis, "consumer chain id must not be blank") + return errorsmod.Wrap(ccvtypes.ErrInvalidGenesis, "consumer chain id must not be blank") } if err := sdk.VerifyAddressFormat(e.ProviderAddr.ToSdkConsAddr()); err != nil { - return sdkerrors.Wrap(ccvtypes.ErrInvalidGenesis, fmt.Sprintf("invalid provider address: %s", e.ProviderAddr)) + return errorsmod.Wrap(ccvtypes.ErrInvalidGenesis, fmt.Sprintf("invalid provider address: %s", e.ProviderAddr)) } if e.ConsumerKey == nil { - return sdkerrors.Wrap(ccvtypes.ErrInvalidGenesis, fmt.Sprintf("invalid consumer key: %s", e.ConsumerKey)) + return errorsmod.Wrap(ccvtypes.ErrInvalidGenesis, fmt.Sprintf("invalid consumer key: %s", e.ConsumerKey)) } } for _, e := range byConsumerAddrs { if strings.TrimSpace(e.ChainId) == "" { - return sdkerrors.Wrap(ccvtypes.ErrInvalidGenesis, "consumer chain id must not be blank") + return errorsmod.Wrap(ccvtypes.ErrInvalidGenesis, "consumer chain id must not be blank") } if err := sdk.VerifyAddressFormat(e.ProviderAddr.ToSdkConsAddr()); err != nil { - return sdkerrors.Wrap(ccvtypes.ErrInvalidGenesis, fmt.Sprintf("invalid provider address: %s", e.ProviderAddr)) + return errorsmod.Wrap(ccvtypes.ErrInvalidGenesis, fmt.Sprintf("invalid provider address: %s", e.ProviderAddr)) } if err := sdk.VerifyAddressFormat(e.ConsumerAddr.ToSdkConsAddr()); err != nil { - return sdkerrors.Wrap(ccvtypes.ErrInvalidGenesis, fmt.Sprintf("invalid consumer address: %s", e.ConsumerAddr)) + return errorsmod.Wrap(ccvtypes.ErrInvalidGenesis, fmt.Sprintf("invalid consumer address: %s", e.ConsumerAddr)) } } for _, e := range consumerAddrsToPrune { if strings.TrimSpace(e.ChainId) == "" { - return sdkerrors.Wrap(ccvtypes.ErrInvalidGenesis, "consumer chain id must not be blank") + return errorsmod.Wrap(ccvtypes.ErrInvalidGenesis, "consumer chain id must not be blank") } // Don't check e.vscid, it's an unsigned integer for _, a := range e.ConsumerAddrs.Addresses { if err := sdk.VerifyAddressFormat(a.ToSdkConsAddr()); err != nil { - return sdkerrors.Wrap(ccvtypes.ErrInvalidGenesis, fmt.Sprintf("invalid consumer address: %s", a)) + return errorsmod.Wrap(ccvtypes.ErrInvalidGenesis, fmt.Sprintf("invalid consumer address: %s", a)) } } } diff --git a/x/ccv/provider/types/proposal.go b/x/ccv/provider/types/proposal.go index f5c702a322..bf7ed68ce2 100644 --- a/x/ccv/provider/types/proposal.go +++ b/x/ccv/provider/types/proposal.go @@ -6,7 +6,7 @@ import ( "strings" time "time" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + errorsmod "cosmossdk.io/errors" evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" @@ -80,46 +80,46 @@ func (cccp *ConsumerAdditionProposal) ValidateBasic() error { } if strings.TrimSpace(cccp.ChainId) == "" { - return sdkerrors.Wrap(ErrInvalidConsumerAdditionProposal, "consumer chain id must not be blank") + return errorsmod.Wrap(ErrInvalidConsumerAdditionProposal, "consumer chain id must not be blank") } if cccp.InitialHeight.IsZero() { - return sdkerrors.Wrap(ErrInvalidConsumerAdditionProposal, "initial height cannot be zero") + return errorsmod.Wrap(ErrInvalidConsumerAdditionProposal, "initial height cannot be zero") } if len(cccp.GenesisHash) == 0 { - return sdkerrors.Wrap(ErrInvalidConsumerAdditionProposal, "genesis hash cannot be empty") + return errorsmod.Wrap(ErrInvalidConsumerAdditionProposal, "genesis hash cannot be empty") } if len(cccp.BinaryHash) == 0 { - return sdkerrors.Wrap(ErrInvalidConsumerAdditionProposal, "binary hash cannot be empty") + return errorsmod.Wrap(ErrInvalidConsumerAdditionProposal, "binary hash cannot be empty") } if cccp.SpawnTime.IsZero() { - return sdkerrors.Wrap(ErrInvalidConsumerAdditionProposal, "spawn time cannot be zero") + return errorsmod.Wrap(ErrInvalidConsumerAdditionProposal, "spawn time cannot be zero") } if err := ccvtypes.ValidateStringFraction(cccp.ConsumerRedistributionFraction); err != nil { - return sdkerrors.Wrapf(ErrInvalidConsumerAdditionProposal, "consumer redistribution fraction is invalid: %s", err) + return errorsmod.Wrapf(ErrInvalidConsumerAdditionProposal, "consumer redistribution fraction is invalid: %s", err) } if err := ccvtypes.ValidatePositiveInt64(cccp.BlocksPerDistributionTransmission); err != nil { - return sdkerrors.Wrap(ErrInvalidConsumerAdditionProposal, "blocks per distribution transmission cannot be < 1") + return errorsmod.Wrap(ErrInvalidConsumerAdditionProposal, "blocks per distribution transmission cannot be < 1") } if err := ccvtypes.ValidatePositiveInt64(cccp.HistoricalEntries); err != nil { - return sdkerrors.Wrap(ErrInvalidConsumerAdditionProposal, "historical entries cannot be < 1") + return errorsmod.Wrap(ErrInvalidConsumerAdditionProposal, "historical entries cannot be < 1") } if err := ccvtypes.ValidateDuration(cccp.CcvTimeoutPeriod); err != nil { - return sdkerrors.Wrap(ErrInvalidConsumerAdditionProposal, "ccv timeout period cannot be zero") + return errorsmod.Wrap(ErrInvalidConsumerAdditionProposal, "ccv timeout period cannot be zero") } if err := ccvtypes.ValidateDuration(cccp.TransferTimeoutPeriod); err != nil { - return sdkerrors.Wrap(ErrInvalidConsumerAdditionProposal, "transfer timeout period cannot be zero") + return errorsmod.Wrap(ErrInvalidConsumerAdditionProposal, "transfer timeout period cannot be zero") } if err := ccvtypes.ValidateDuration(cccp.UnbondingPeriod); err != nil { - return sdkerrors.Wrap(ErrInvalidConsumerAdditionProposal, "unbonding period cannot be zero") + return errorsmod.Wrap(ErrInvalidConsumerAdditionProposal, "unbonding period cannot be zero") } return nil @@ -179,11 +179,11 @@ func (sccp *ConsumerRemovalProposal) ValidateBasic() error { } if strings.TrimSpace(sccp.ChainId) == "" { - return sdkerrors.Wrap(ErrInvalidConsumerRemovalProp, "consumer chain id must not be blank") + return errorsmod.Wrap(ErrInvalidConsumerRemovalProp, "consumer chain id must not be blank") } if sccp.StopTime.IsZero() { - return sdkerrors.Wrap(ErrInvalidConsumerRemovalProp, "spawn time cannot be zero") + return errorsmod.Wrap(ErrInvalidConsumerRemovalProp, "spawn time cannot be zero") } return nil } diff --git a/x/ccv/types/ccv.go b/x/ccv/types/ccv.go index a94a4dc549..6ec3a6c7c3 100644 --- a/x/ccv/types/ccv.go +++ b/x/ccv/types/ccv.go @@ -3,7 +3,7 @@ package types import ( "fmt" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + errorsmod "cosmossdk.io/errors" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" abci "github.com/tendermint/tendermint/abci/types" ) @@ -19,10 +19,10 @@ func NewValidatorSetChangePacketData(valUpdates []abci.ValidatorUpdate, valUpdat // ValidateBasic is used for validating the CCV packet data. func (vsc ValidatorSetChangePacketData) ValidateBasic() error { if len(vsc.ValidatorUpdates) == 0 { - return sdkerrors.Wrap(ErrInvalidPacketData, "validator updates cannot be empty") + return errorsmod.Wrap(ErrInvalidPacketData, "validator updates cannot be empty") } if vsc.ValsetUpdateId == 0 { - return sdkerrors.Wrap(ErrInvalidPacketData, "valset update id cannot be equal to zero") + return errorsmod.Wrap(ErrInvalidPacketData, "valset update id cannot be equal to zero") } return nil } @@ -41,7 +41,7 @@ func NewVSCMaturedPacketData(valUpdateID uint64) *VSCMaturedPacketData { // ValidateBasic is used for validating the VSCMatured packet data. func (mat VSCMaturedPacketData) ValidateBasic() error { if mat.ValsetUpdateId == 0 { - return sdkerrors.Wrap(ErrInvalidPacketData, "vscId cannot be equal to zero") + return errorsmod.Wrap(ErrInvalidPacketData, "vscId cannot be equal to zero") } return nil } @@ -61,11 +61,11 @@ func NewSlashPacketData(validator abci.Validator, valUpdateId uint64, infraction func (vdt SlashPacketData) ValidateBasic() error { if len(vdt.Validator.Address) == 0 || vdt.Validator.Power == 0 { - return sdkerrors.Wrap(ErrInvalidPacketData, "validator fields cannot be empty") + return errorsmod.Wrap(ErrInvalidPacketData, "validator fields cannot be empty") } if vdt.Infraction == stakingtypes.InfractionEmpty { - return sdkerrors.Wrap(ErrInvalidPacketData, "invalid infraction type") + return errorsmod.Wrap(ErrInvalidPacketData, "invalid infraction type") } return nil diff --git a/x/ccv/types/errors.go b/x/ccv/types/errors.go index 7b67a02d60..79c0e1e31c 100644 --- a/x/ccv/types/errors.go +++ b/x/ccv/types/errors.go @@ -1,28 +1,28 @@ package types import ( - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + errorsmod "cosmossdk.io/errors" ) // CCV sentinel errors var ( - ErrInvalidPacketData = sdkerrors.Register(ModuleName, 2, "invalid CCV packet data") - ErrInvalidPacketTimeout = sdkerrors.Register(ModuleName, 3, "invalid packet timeout") - ErrInvalidVersion = sdkerrors.Register(ModuleName, 4, "invalid CCV version") - ErrInvalidChannelFlow = sdkerrors.Register(ModuleName, 5, "invalid message sent to channel end") - ErrInvalidConsumerChain = sdkerrors.Register(ModuleName, 6, "invalid consumer chain") - ErrInvalidProviderChain = sdkerrors.Register(ModuleName, 7, "invalid provider chain") - ErrInvalidStatus = sdkerrors.Register(ModuleName, 8, "invalid channel status") - ErrInvalidGenesis = sdkerrors.Register(ModuleName, 9, "invalid genesis state") - ErrDuplicateChannel = sdkerrors.Register(ModuleName, 10, "CCV channel already exists") - ErrInvalidVSCMaturedId = sdkerrors.Register(ModuleName, 11, "invalid vscId for VSC packet") - ErrInvalidVSCMaturedTime = sdkerrors.Register(ModuleName, 12, "invalid maturity time for VSC packet") - ErrInvalidConsumerState = sdkerrors.Register(ModuleName, 13, "provider chain has invalid state for consumer chain") - ErrInvalidConsumerClient = sdkerrors.Register(ModuleName, 14, "ccv channel is not built on correct client") - ErrInvalidProposal = sdkerrors.Register(ModuleName, 15, "invalid proposal") - ErrInvalidHandshakeMetadata = sdkerrors.Register(ModuleName, 16, "invalid provider handshake metadata") - ErrChannelNotFound = sdkerrors.Register(ModuleName, 17, "channel not found") - ErrClientNotFound = sdkerrors.Register(ModuleName, 18, "client not found") - ErrDuplicateConsumerChain = sdkerrors.Register(ModuleName, 19, "consumer chain already exists") - ErrConsumerChainNotFound = sdkerrors.Register(ModuleName, 20, "consumer chain not found") + 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") ) diff --git a/x/ccv/types/utils.go b/x/ccv/types/utils.go index 7cb8e64d98..1d75152186 100644 --- a/x/ccv/types/utils.go +++ b/x/ccv/types/utils.go @@ -5,9 +5,9 @@ import ( "sort" "time" + errorsmod "cosmossdk.io/errors" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" host "github.com/cosmos/ibc-go/v4/modules/core/24-host" @@ -67,17 +67,17 @@ func SendIBCPacket( ) error { channel, ok := channelKeeper.GetChannel(ctx, portID, channelID) if !ok { - return sdkerrors.Wrapf(channeltypes.ErrChannelNotFound, "channel not found for channel ID: %s", channelID) + return errorsmod.Wrapf(channeltypes.ErrChannelNotFound, "channel not found for channel ID: %s", channelID) } channelCap, ok := scopedKeeper.GetCapability(ctx, host.ChannelCapabilityPath(portID, channelID)) if !ok { - return sdkerrors.Wrap(channeltypes.ErrChannelCapabilityNotFound, "module does not own channel capability") + return errorsmod.Wrap(channeltypes.ErrChannelCapabilityNotFound, "module does not own channel capability") } // get the next sequence sequence, found := channelKeeper.GetNextSequenceSend(ctx, portID, channelID) if !found { - return sdkerrors.Wrapf( + return errorsmod.Wrapf( channeltypes.ErrSequenceSendNotFound, "source port: %s, source channel: %s", portID, channelID, ) From da06d177be82cce19507689f9be1a659601b2c8e Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Mon, 15 May 2023 16:41:55 -0700 Subject: [PATCH 011/108] fix!: prevent denom DOS (#931) * Merge pull request from GHSA-chqw-ff63-95r8 * squash commit of multisig fix + everything involving denom fix * rebuild proto * fix todos --------- Co-authored-by: Jehan Tremback * regen proto * fix cherrypick issues * lint * cleans * gosec * restore param, remove tech debt from tests * ibc denom as const * add check for consumer reward denom already registered * lint * remove unneeded expect --------- Co-authored-by: Jehan Tremback Co-authored-by: Marius Poke --- app/provider/app.go | 26 +- .../ccv/consumer/v1/consumer.proto | 7 + .../ccv/provider/v1/provider.proto | 5 + .../ccv/provider/v1/query.proto | 12 + .../ccv/provider/v1/tx.proto | 17 +- tests/difference/core/driver/setup.go | 2 + tests/e2e/actions.go | 30 ++ tests/e2e/config.go | 21 +- tests/e2e/main.go | 5 +- tests/e2e/state.go | 50 +- tests/e2e/steps.go | 8 + tests/e2e/steps_democracy.go | 43 ++ tests/e2e/steps_reward_denom.go | 281 ++++++++++ tests/integration/distribution.go | 98 +++- testutil/integration/interfaces.go | 11 +- testutil/keeper/mocks.go | 51 ++ testutil/keeper/unit_test_helpers.go | 28 +- x/ccv/consumer/keeper/distribution.go | 69 ++- x/ccv/consumer/keeper/distribution_test.go | 23 + x/ccv/consumer/keeper/params.go | 14 + x/ccv/consumer/keeper/params_test.go | 6 +- x/ccv/consumer/types/consumer.pb.go | 211 ++++++-- x/ccv/consumer/types/errors.go | 3 +- x/ccv/consumer/types/genesis_test.go | 4 + x/ccv/consumer/types/params.go | 41 +- x/ccv/consumer/types/params_test.go | 38 +- x/ccv/provider/client/cli/query.go | 36 ++ x/ccv/provider/client/cli/tx.go | 37 ++ x/ccv/provider/handler.go | 3 + x/ccv/provider/ibc_module.go | 2 +- x/ccv/provider/ibc_module_test.go | 4 +- x/ccv/provider/keeper/distribution.go | 90 +++- x/ccv/provider/keeper/distribution_test.go | 48 ++ x/ccv/provider/keeper/grpc_query.go | 14 + x/ccv/provider/keeper/keeper.go | 89 ++-- x/ccv/provider/keeper/msg_server.go | 21 + x/ccv/provider/keeper/params.go | 10 + x/ccv/provider/keeper/params_test.go | 5 + x/ccv/provider/keeper/proposal.go | 2 + x/ccv/provider/keeper/proposal_test.go | 6 +- x/ccv/provider/module.go | 2 + x/ccv/provider/types/codec.go | 5 + x/ccv/provider/types/errors.go | 2 + x/ccv/provider/types/genesis_test.go | 63 ++- x/ccv/provider/types/keys.go | 11 + x/ccv/provider/types/msg.go | 48 +- x/ccv/provider/types/params.go | 57 +- x/ccv/provider/types/params_test.go | 29 +- x/ccv/provider/types/provider.pb.go | 312 ++++++----- x/ccv/provider/types/query.pb.go | 501 +++++++++++++++--- x/ccv/provider/types/query.pb.gw.go | 65 +++ x/ccv/provider/types/tx.pb.go | 422 ++++++++++++++- x/ccv/types/events.go | 16 +- x/ccv/types/expected_keepers.go | 6 +- 54 files changed, 2557 insertions(+), 453 deletions(-) create mode 100644 tests/e2e/steps_reward_denom.go create mode 100644 x/ccv/provider/keeper/distribution_test.go diff --git a/app/provider/app.go b/app/provider/app.go index 5546f60b51..27100a3c83 100644 --- a/app/provider/app.go +++ b/app/provider/app.go @@ -155,13 +155,14 @@ var ( // module account permissions maccPerms = map[string][]string{ - authtypes.FeeCollectorName: nil, - distrtypes.ModuleName: nil, - minttypes.ModuleName: {authtypes.Minter}, - stakingtypes.BondedPoolName: {authtypes.Burner, authtypes.Staking}, - stakingtypes.NotBondedPoolName: {authtypes.Burner, authtypes.Staking}, - govtypes.ModuleName: {authtypes.Burner}, - ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner}, + authtypes.FeeCollectorName: nil, + distrtypes.ModuleName: nil, + minttypes.ModuleName: {authtypes.Minter}, + stakingtypes.BondedPoolName: {authtypes.Burner, authtypes.Staking}, + stakingtypes.NotBondedPoolName: {authtypes.Burner, authtypes.Staking}, + govtypes.ModuleName: {authtypes.Burner}, + ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner}, + providertypes.ConsumerRewardsPool: nil, } ) @@ -308,12 +309,12 @@ func New( maccPerms, ) - // Remove the fee-pool from the group of blocked recipient addresses in bank + // Remove the ConsumerRewardsPool from the group of blocked recipient addresses in bank // this is required for the provider chain to be able to receive tokens from // the consumer chain bankBlockedAddrs := app.ModuleAccountAddrs() delete(bankBlockedAddrs, authtypes.NewModuleAddress( - authtypes.FeeCollectorName).String()) + providertypes.ConsumerRewardsPool).String()) app.BankKeeper = bankkeeper.NewBaseKeeper( appCodec, @@ -409,6 +410,8 @@ func New( app.SlashingKeeper, app.AccountKeeper, app.EvidenceKeeper, + app.DistrKeeper, + app.BankKeeper, authtypes.FeeCollectorName, ) @@ -777,6 +780,11 @@ func (app *App) GetTestDistributionKeeper() testutil.TestDistributionKeeper { return app.DistrKeeper } +// GetTestAccountKeeper implements the ProviderApp interface. +func (app *App) GetTestAccountKeeper() testutil.TestAccountKeeper { + return app.AccountKeeper +} + // TestingApp functions // GetBaseApp implements the TestingApp interface. diff --git a/proto/interchain_security/ccv/consumer/v1/consumer.proto b/proto/interchain_security/ccv/consumer/v1/consumer.proto index 3ee887c22b..d2959983a4 100644 --- a/proto/interchain_security/ccv/consumer/v1/consumer.proto +++ b/proto/interchain_security/ccv/consumer/v1/consumer.proto @@ -57,6 +57,13 @@ message Params { // 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; } // LastTransmissionBlockHeight is the last time validator holding diff --git a/proto/interchain_security/ccv/provider/v1/provider.proto b/proto/interchain_security/ccv/provider/v1/provider.proto index 0f3e4f3c9f..8a3861f55a 100644 --- a/proto/interchain_security/ccv/provider/v1/provider.proto +++ b/proto/interchain_security/ccv/provider/v1/provider.proto @@ -11,6 +11,7 @@ import "ibc/core/client/v1/client.proto"; import "ibc/lightclients/tendermint/v1/tendermint.proto"; import "tendermint/crypto/keys.proto"; import "cosmos/evidence/v1beta1/evidence.proto"; +import "cosmos/base/v1beta1/coin.proto"; // ConsumerAdditionProposal is a governance proposal on the provider chain to spawn a new consumer chain. // If it passes, then all validators on the provider chain are expected to validate the consumer chain at spawn time @@ -136,6 +137,10 @@ message Params { // 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]; } message HandshakeMetadata { diff --git a/proto/interchain_security/ccv/provider/v1/query.proto b/proto/interchain_security/ccv/provider/v1/query.proto index b1ef9a620c..3100502699 100644 --- a/proto/interchain_security/ccv/provider/v1/query.proto +++ b/proto/interchain_security/ccv/provider/v1/query.proto @@ -68,6 +68,12 @@ service Query { 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(QueryRegisteredConsumerRewardDenomsRequest) + returns (QueryRegisteredConsumerRewardDenomsResponse) { + option (google.api.http).get = "/interchain_security/ccv/provider/registered_consumer_reward_denoms"; + } } message QueryConsumerGenesisRequest { string chain_id = 1; } @@ -169,3 +175,9 @@ message ThrottledPacketDataWrapper { interchain_security.ccv.v1.VSCMaturedPacketData vsc_matured_packet = 2; } } + +message QueryRegisteredConsumerRewardDenomsRequest {} + +message QueryRegisteredConsumerRewardDenomsResponse { + repeated string denoms = 1; +} diff --git a/proto/interchain_security/ccv/provider/v1/tx.proto b/proto/interchain_security/ccv/provider/v1/tx.proto index 1e1a3d3fe6..f69bb93e08 100644 --- a/proto/interchain_security/ccv/provider/v1/tx.proto +++ b/proto/interchain_security/ccv/provider/v1/tx.proto @@ -11,6 +11,7 @@ import "google/protobuf/any.proto"; // Msg defines the Msg service. service Msg { rpc AssignConsumerKey(MsgAssignConsumerKey) returns (MsgAssignConsumerKeyResponse); + rpc RegisterConsumerRewardDenom(MsgRegisterConsumerRewardDenom) returns (MsgRegisterConsumerRewardDenomResponse); } message MsgAssignConsumerKey { @@ -27,4 +28,18 @@ message MsgAssignConsumerKey { string consumer_key = 3; } -message MsgAssignConsumerKeyResponse {} \ No newline at end of file +message MsgAssignConsumerKeyResponse {} + +// MsgRegisterConsumerRewardDenom allows an account to register +// a consumer reward denom, i.e., add it to the list of denoms +// accepted by the provider as rewards. +message MsgRegisterConsumerRewardDenom { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + string denom = 1; + string depositor = 2; +} + +// MsgRegisterConsumerRewardDenomResponse defines the Msg/RegisterConsumerRewardDenom response type. +message MsgRegisterConsumerRewardDenomResponse {} \ No newline at end of file diff --git a/tests/difference/core/driver/setup.go b/tests/difference/core/driver/setup.go index 64611da7cc..905869441e 100644 --- a/tests/difference/core/driver/setup.go +++ b/tests/difference/core/driver/setup.go @@ -514,6 +514,8 @@ func (b *Builder) createConsumerGenesis(client *ibctmtypes.ClientState) *consume consumertypes.DefaultHistoricalEntries, b.initState.UnbondingC, "0", // disable soft opt-out + []string{}, + []string{}, ) return consumertypes.NewInitialGenesisState(client, providerConsState, valUpdates, params) } diff --git a/tests/e2e/actions.go b/tests/e2e/actions.go index e17d751c24..3455b41075 100644 --- a/tests/e2e/actions.go +++ b/tests/e2e/actions.go @@ -1160,6 +1160,36 @@ func (tr TestRun) registerRepresentative( wg.Wait() } +type registerConsumerRewardDenomAction struct { + chain chainID + from validatorID + denom string +} + +func (tr TestRun) registerConsumerRewardDenom(action registerConsumerRewardDenomAction, verbose bool) { + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. + bz, err := exec.Command("docker", "exec", tr.containerConfig.instanceName, tr.chainConfigs[action.chain].binaryName, + "tx", "provider", "register-consumer-reward-denom", action.denom, + + `--from`, `validator`+fmt.Sprint(action.from), + `--chain-id`, string(action.chain), + `--home`, tr.getValidatorHome(action.chain, action.from), + `--node`, tr.getValidatorNode(action.chain, action.from), + `--gas`, "9000000", + `--keyring-backend`, `test`, + `-b`, `block`, + `-y`, + ).CombinedOutput() + + if verbose { + fmt.Println("redelegate cmd:", string(bz)) + } + + if err != nil { + log.Fatal(err, "\n", string(bz)) + } +} + // Creates an additional node on selected chain // by copying an existing validator's home folder // diff --git a/tests/e2e/config.go b/tests/e2e/config.go index 0379ef2c90..fe21208834 100644 --- a/tests/e2e/config.go +++ b/tests/e2e/config.go @@ -223,7 +223,19 @@ func DefaultTestRun() TestRun { } } -func DemocracyTestRun() TestRun { +func DemocracyTestRun(allowReward bool) TestRun { + consumerGenChanges := ".app_state.ccvconsumer.params.blocks_per_distribution_transmission = \"20\" | " + + ".app_state.gov.voting_params.voting_period = \"10s\" | " + + ".app_state.slashing.params.signed_blocks_window = \"2\" | " + + ".app_state.slashing.params.min_signed_per_window = \"0.500000000000000000\" | " + + ".app_state.slashing.params.downtime_jail_duration = \"2s\" | " + + ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\"" + + if allowReward { + // This allows the consumer chain to send rewards in the stake denom + consumerGenChanges += " | .app_state.ccvconsumer.params.reward_denoms = [\"stake\"]" + } + return TestRun{ name: "democracy", containerConfig: ContainerConfig{ @@ -253,12 +265,7 @@ func DemocracyTestRun() TestRun { binaryName: "interchain-security-cdd", ipPrefix: "7.7.9", votingWaitTime: 20, - genesisChanges: ".app_state.ccvconsumer.params.blocks_per_distribution_transmission = \"20\" | " + - ".app_state.gov.voting_params.voting_period = \"10s\" | " + - ".app_state.slashing.params.signed_blocks_window = \"2\" | " + - ".app_state.slashing.params.min_signed_per_window = \"0.500000000000000000\" | " + - ".app_state.slashing.params.downtime_jail_duration = \"2s\" | " + - ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\"", + genesisChanges: consumerGenChanges, }, }, tendermintConfigOverride: `s/timeout_commit = "5s"/timeout_commit = "1s"/;` + diff --git a/tests/e2e/main.go b/tests/e2e/main.go index 07253693a3..8ef9d93b7a 100644 --- a/tests/e2e/main.go +++ b/tests/e2e/main.go @@ -44,7 +44,8 @@ func main() { testRuns := []testRunWithSteps{ {DefaultTestRun(), happyPathSteps}, - {DemocracyTestRun(), democracySteps}, + {DemocracyTestRun(true), democracySteps}, + {DemocracyTestRun(false), rewardDenomConsumerSteps}, {SlashThrottleTestRun(), slashThrottleSteps}, } if includeMultiConsumer != nil && *includeMultiConsumer { @@ -143,6 +144,8 @@ func (tr *TestRun) runStep(step Step, verbose bool) { tr.waitForSlashThrottleDequeue(action, verbose) case startHermesAction: tr.startHermes(action, verbose) + case registerConsumerRewardDenomAction: + tr.registerConsumerRewardDenom(action, verbose) default: log.Fatalf("unknown action in testRun %s: %#v", tr.name, action) } diff --git a/tests/e2e/state.go b/tests/e2e/state.go index 68a9ff0d2f..98483ffb7e 100644 --- a/tests/e2e/state.go +++ b/tests/e2e/state.go @@ -16,17 +16,18 @@ import ( type State map[chainID]ChainState type ChainState struct { - ValBalances *map[validatorID]uint - Proposals *map[uint]Proposal - ValPowers *map[validatorID]uint - RepresentativePowers *map[validatorID]uint - Params *[]Param - Rewards *Rewards - ConsumerChains *map[chainID]bool - AssignedKeys *map[validatorID]string - ProviderKeys *map[validatorID]string // validatorID: validator provider key - ConsumerChainQueueSizes *map[chainID]uint - GlobalSlashQueueSize *uint + ValBalances *map[validatorID]uint + Proposals *map[uint]Proposal + ValPowers *map[validatorID]uint + RepresentativePowers *map[validatorID]uint + Params *[]Param + Rewards *Rewards + ConsumerChains *map[chainID]bool + AssignedKeys *map[validatorID]string + ProviderKeys *map[validatorID]string // validatorID: validator provider key + ConsumerChainQueueSizes *map[chainID]uint + GlobalSlashQueueSize *uint + RegisteredConsumerRewardDenoms *[]string } type Proposal interface { @@ -167,6 +168,11 @@ func (tr TestRun) getChainState(chain chainID, modelState ChainState) ChainState chainState.ConsumerChainQueueSizes = &consumerChainQueueSizes } + if modelState.RegisteredConsumerRewardDenoms != nil { + registeredConsumerRewardDenoms := tr.getRegisteredConsumerRewardDenoms(chain) + chainState.RegisteredConsumerRewardDenoms = ®isteredConsumerRewardDenoms + } + return chainState } @@ -640,6 +646,28 @@ func (tr TestRun) getConsumerChainPacketQueueSize(consumerChain chainID) uint { return uint(size) } +func (tr TestRun) 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[chain].binaryName, + + "query", "provider", "registered-consumer-reward-denoms", + `--node`, tr.getQueryNode(chain), + `-o`, `json`, + ) + bz, err := cmd.CombinedOutput() + if err != nil { + 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() + } + + return rewardDenoms +} + func (tr TestRun) getValidatorNode(chain chainID, validator validatorID) string { return "tcp://" + tr.getValidatorIP(chain, validator) + ":26658" } diff --git a/tests/e2e/steps.go b/tests/e2e/steps.go index 286115da84..234672546b 100644 --- a/tests/e2e/steps.go +++ b/tests/e2e/steps.go @@ -45,6 +45,14 @@ var democracySteps = concatSteps( stepsDemocracy("democ"), ) +var rewardDenomConsumerSteps = concatSteps( + // democracySteps requires a transfer channel + stepsStartChains([]string{"democ"}, true), + // delegation needs to happen so the first VSC packet can be delivered + stepsDelegate("democ"), + stepsRewardDenomConsumer("democ"), +) + var multipleConsumers = concatSteps( stepsStartChains([]string{"consu", "densu"}, false), stepsMultiConsumerDelegate("consu", "densu"), diff --git a/tests/e2e/steps_democracy.go b/tests/e2e/steps_democracy.go index 376b176c0c..9f5915f71d 100644 --- a/tests/e2e/steps_democracy.go +++ b/tests/e2e/steps_democracy.go @@ -1,5 +1,7 @@ package main +const consumerRewardDenom = "ibc/3C3D7B3BE4ECC85A0E5B52A3AEC3B7DFC2AA9CA47C37821E57020D6807043BE9" + func stepsDemocracy(consumerName string) []Step { return []Step{ { @@ -105,6 +107,47 @@ func stepsDemocracy(consumerName string) []Step { }, }, }, + { + action: relayRewardPacketsToProviderAction{ + consumerChain: chainID(consumerName), + providerChain: chainID("provi"), + port: "transfer", + channel: 1, + }, + state: State{ + chainID("provi"): ChainState{ + // Check that tokens are not distributed before the denom has been registered + Rewards: &Rewards{ + IsRewarded: map[validatorID]bool{ + validatorID("alice"): false, + validatorID("bob"): false, + validatorID("carol"): false, + }, + IsIncrementalReward: false, + IsNativeDenom: false, + }, + // Check that the denom is not registered on provider chain + RegisteredConsumerRewardDenoms: &[]string{}, + }, + }, + }, + { + action: registerConsumerRewardDenomAction{ + chain: chainID("provi"), + from: validatorID("bob"), + denom: consumerRewardDenom, + }, + state: State{ + chainID("provi"): ChainState{ + // Check that the denom is registered on provider chain + RegisteredConsumerRewardDenoms: &[]string{consumerRewardDenom}, + ValBalances: &map[validatorID]uint{ + // make sure that bob's account was debited + validatorID("bob"): 9490000000, + }, + }, + }, + }, { action: relayRewardPacketsToProviderAction{ consumerChain: chainID(consumerName), diff --git a/tests/e2e/steps_reward_denom.go b/tests/e2e/steps_reward_denom.go new file mode 100644 index 0000000000..bc26f38d27 --- /dev/null +++ b/tests/e2e/steps_reward_denom.go @@ -0,0 +1,281 @@ +package main + +func stepsRewardDenomConsumer(consumerName string) []Step { + return []Step{ + { + action: registerRepresentativeAction{ + chain: chainID(consumerName), + representatives: []validatorID{validatorID("alice"), validatorID("bob")}, + stakes: []uint{100000000, 40000000}, + }, + state: State{ + chainID(consumerName): ChainState{ + RepresentativePowers: &map[validatorID]uint{ + validatorID("alice"): 100000000, + validatorID("bob"): 40000000, + }, + Rewards: &Rewards{ + IsRewarded: map[validatorID]bool{ + validatorID("alice"): true, + validatorID("bob"): true, + validatorID("carol"): false, + }, + IsIncrementalReward: true, + IsNativeDenom: true, + }, + }, + }, + }, + { + action: delegateTokensAction{ + chain: chainID(consumerName), + from: validatorID("carol"), + to: validatorID("alice"), + amount: 500000, + }, + state: State{ + chainID(consumerName): ChainState{ + // Check that delegators on gov-consumer chain can change representative powers + RepresentativePowers: &map[validatorID]uint{ + validatorID("alice"): 100500000, + validatorID("bob"): 40000000, + }, + // Check that delegating on gov-consumer does not change validator powers + ValPowers: &map[validatorID]uint{ + validatorID("alice"): 511, + validatorID("bob"): 500, + validatorID("carol"): 500, + }, + // Check that tokens are minted and distributed to representatives and their delegators + Rewards: &Rewards{ + IsRewarded: map[validatorID]bool{ + validatorID("alice"): true, + validatorID("bob"): true, + validatorID("carol"): true, + }, + IsIncrementalReward: true, + IsNativeDenom: true, + }, + }, + }, + }, + { + action: submitParamChangeProposalAction{ + chain: chainID(consumerName), + from: validatorID("alice"), + deposit: 10000001, + subspace: "staking", + key: "MaxValidators", + value: 105, + }, + state: State{ + chainID(consumerName): ChainState{ + ValBalances: &map[validatorID]uint{ + validatorID("alice"): 9889999998, + validatorID("bob"): 9960000001, + }, + Proposals: &map[uint]Proposal{ + 1: ParamsProposal{ + Deposit: 10000001, + Status: "PROPOSAL_STATUS_VOTING_PERIOD", + Subspace: "staking", + Key: "MaxValidators", + Value: "105", + }, + }, + }, + }, + }, + { + // Have accounts vote on something on the gov-consumer chain + action: voteGovProposalAction{ + chain: chainID(consumerName), + from: []validatorID{validatorID("alice"), validatorID("bob")}, + vote: []string{"yes", "no"}, + propNumber: 1, + }, + state: State{ + chainID(consumerName): ChainState{ + ValBalances: &map[validatorID]uint{ + validatorID("alice"): 9899999999, + validatorID("bob"): 9960000001, + }, + // Check that the parameter is changed on gov-consumer chain + Params: &([]Param{{Subspace: "staking", Key: "MaxValidators", Value: "105"}}), + }, + }, + }, + { + action: relayRewardPacketsToProviderAction{ + consumerChain: chainID(consumerName), + providerChain: chainID("provi"), + port: "transfer", + channel: 1, + }, + state: State{ + chainID("provi"): ChainState{ + // Check that tokens are not distributed before the denom has been registered + Rewards: &Rewards{ + IsRewarded: map[validatorID]bool{ + validatorID("alice"): false, + validatorID("bob"): false, + validatorID("carol"): false, + }, + IsIncrementalReward: false, + IsNativeDenom: false, + }, + // Check that the denom is not registered on provider chain + RegisteredConsumerRewardDenoms: &[]string{}, + }, + }, + }, + { + action: registerConsumerRewardDenomAction{ + chain: chainID("provi"), + from: validatorID("bob"), + denom: "ibc/3C3D7B3BE4ECC85A0E5B52A3AEC3B7DFC2AA9CA47C37821E57020D6807043BE9", + }, + state: State{ + chainID("provi"): ChainState{ + // Check that the denom is registered on provider chain + RegisteredConsumerRewardDenoms: &[]string{"ibc/3C3D7B3BE4ECC85A0E5B52A3AEC3B7DFC2AA9CA47C37821E57020D6807043BE9"}, + ValBalances: &map[validatorID]uint{ + // make sure that bob's account was debited + validatorID("bob"): 9490000000, + }, + }, + }, + }, + { + action: relayRewardPacketsToProviderAction{ + consumerChain: chainID(consumerName), + providerChain: chainID("provi"), + port: "transfer", + channel: 1, + }, + state: State{ + chainID("provi"): ChainState{ + // Check that tokens are not minted and sent to provider chain and distributed to validators and their delegators on provider chain + Rewards: &Rewards{ + IsRewarded: map[validatorID]bool{ + validatorID("alice"): false, + validatorID("bob"): false, + validatorID("carol"): false, + }, + IsIncrementalReward: false, + IsNativeDenom: false, + }, + }, + }, + }, + { + action: downtimeSlashAction{ + chain: chainID(consumerName), + validator: validatorID("bob"), + }, + state: State{ + // validator should be slashed on consumer, powers not affected on either chain yet + chainID("provi"): ChainState{ + ValPowers: &map[validatorID]uint{ + validatorID("alice"): 511, + validatorID("bob"): 500, + validatorID("carol"): 500, + }, + }, + chainID(consumerName): ChainState{ + ValPowers: &map[validatorID]uint{ + validatorID("alice"): 511, + validatorID("bob"): 500, + validatorID("carol"): 500, + }, + }, + }, + }, + { + action: relayPacketsAction{ + chain: chainID("provi"), + port: "provider", + channel: 0, + }, + state: State{ + chainID("provi"): ChainState{ + ValPowers: &map[validatorID]uint{ + validatorID("alice"): 511, + // Downtime jailing and corresponding voting power change are processed by provider + validatorID("bob"): 0, + validatorID("carol"): 500, + }, + }, + chainID(consumerName): ChainState{ + ValPowers: &map[validatorID]uint{ + validatorID("alice"): 511, + validatorID("bob"): 500, + validatorID("carol"): 500, + }, + }, + }, + }, + // A block is incremented each action, hence why VSC is committed on provider, + // and can now be relayed as packet to consumer + { + action: relayPacketsAction{ + chain: chainID("provi"), + port: "provider", + channel: 0, + }, + state: State{ + chainID(consumerName): ChainState{ + ValPowers: &map[validatorID]uint{ + validatorID("alice"): 511, + // VSC now seen on consumer + validatorID("bob"): 0, + validatorID("carol"): 500, + }, + }, + }, + }, + { + action: unjailValidatorAction{ + provider: chainID("provi"), + validator: validatorID("bob"), + }, + state: State{ + chainID("provi"): ChainState{ + ValPowers: &map[validatorID]uint{ + validatorID("alice"): 511, + validatorID("bob"): 500, + validatorID("carol"): 500, + }, + }, + chainID(consumerName): ChainState{ + ValPowers: &map[validatorID]uint{ + validatorID("alice"): 511, + validatorID("bob"): 0, + validatorID("carol"): 500, + }, + }, + }, + }, + { + action: relayPacketsAction{ + chain: chainID("provi"), + port: "provider", + channel: 0, + }, + state: State{ + chainID(consumerName): ChainState{ + ValPowers: &map[validatorID]uint{ + validatorID("alice"): 511, + validatorID("bob"): 500, + validatorID("carol"): 500, + }, + // Check that slashing on the gov-consumer chain does not result in slashing for the representatives or their delegators + RepresentativePowers: &map[validatorID]uint{ + validatorID("alice"): 100500000, + validatorID("bob"): 40000000, + }, + }, + }, + }, + } +} diff --git a/tests/integration/distribution.go b/tests/integration/distribution.go index 66eff6d5de..7fdd8ec7f3 100644 --- a/tests/integration/distribution.go +++ b/tests/integration/distribution.go @@ -5,8 +5,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" transfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" + providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/x/ccv/types" ) @@ -20,6 +22,11 @@ func (s *CCVTestSuite) TestRewardsDistribution() { delegate(s, delAddr, bondAmt) s.providerChain.NextBlock() + // register a consumer reward denom + params := s.consumerApp.GetConsumerKeeper().GetParams(s.consumerCtx()) + params.RewardDenoms = []string{sdk.DefaultBondDenom} + s.consumerApp.GetConsumerKeeper().SetParams(s.consumerCtx(), params) + // relay VSC packets from provider to consumer relayAllCommittedPackets(s, s.providerChain, s.path, ccv.ProviderPortID, s.path.EndpointB.ChannelID, 1) @@ -29,7 +36,9 @@ func (s *CCVTestSuite) TestRewardsDistribution() { s.consumerChain.NextBlock() consumerAccountKeeper := s.consumerApp.GetTestAccountKeeper() + providerAccountKeeper := s.providerApp.GetTestAccountKeeper() consumerBankKeeper := s.consumerApp.GetTestBankKeeper() + providerBankKeeper := s.providerApp.GetTestBankKeeper() // send coins to the fee pool which is used for reward distribution consumerFeePoolAddr := consumerAccountKeeper.GetModuleAccount(s.consumerCtx(), authtypes.FeeCollectorName).GetAddress() @@ -65,14 +74,68 @@ func (s *CCVTestSuite) TestRewardsDistribution() { relayAllCommittedPackets(s, s.consumerChain, s.transferPath, transfertypes.PortID, s.transferPath.EndpointA.ChannelID, 1) s.providerChain.NextBlock() - communityCoins := s.providerApp.GetTestDistributionKeeper().GetFeePoolCommunityCoins(s.providerCtx()) + + // Since consumer reward denom is not yet registered, the coins never get into the fee pool, staying in the ConsumerRewardsPool + rewardPool := providerAccountKeeper.GetModuleAccount(s.providerCtx(), providertypes.ConsumerRewardsPool).GetAddress() + rewardCoins := providerBankKeeper.GetAllBalances(s.providerCtx(), rewardPool) + ibcCoinIndex := -1 - for i, coin := range communityCoins { + for i, coin := range rewardCoins { if strings.HasPrefix(coin.Denom, "ibc") { ibcCoinIndex = i } } + + // Check that we found an ibc denom in the reward pool s.Require().Greater(ibcCoinIndex, -1) + + // Check that the coins got into the ConsumerRewardsPool + s.Require().True(rewardCoins[ibcCoinIndex].Amount.Equal(providerExpectedRewards[0].Amount)) + + // Attempt to register the consumer reward denom, but fail because the account has no coins + + // Get the balance of delAddr to send it out + senderCoins := providerBankKeeper.GetAllBalances(s.providerCtx(), delAddr) + + // Send the coins to the governance module just to have a place to send them + err = providerBankKeeper.SendCoinsFromAccountToModule(s.providerCtx(), delAddr, govtypes.ModuleName, senderCoins) + s.Require().NoError(err) + + // Attempt to register the consumer reward denom, but fail because the account has no coins + err = s.providerApp.GetProviderKeeper().RegisterConsumerRewardDenom(s.providerCtx(), rewardCoins[ibcCoinIndex].Denom, delAddr) + s.Require().Error(err) + + // Advance a block and check that the coins are still in the ConsumerRewardsPool + s.providerChain.NextBlock() + rewardCoins = providerBankKeeper.GetAllBalances(s.providerCtx(), rewardPool) + s.Require().True(rewardCoins[ibcCoinIndex].Amount.Equal(providerExpectedRewards[0].Amount)) + + // Successfully register the consumer reward denom this time + + // Send the coins back to the delAddr + err = providerBankKeeper.SendCoinsFromModuleToAccount(s.providerCtx(), govtypes.ModuleName, delAddr, senderCoins) + s.Require().NoError(err) + + // log the sender's coins + senderCoins1 := providerBankKeeper.GetAllBalances(s.providerCtx(), delAddr) + + // Register the consumer reward denom + err = s.providerApp.GetProviderKeeper().RegisterConsumerRewardDenom(s.providerCtx(), rewardCoins[ibcCoinIndex].Denom, delAddr) + s.Require().NoError(err) + + // Check that the delAddr has the right amount less money in it after paying the fee + senderCoins2 := providerBankKeeper.GetAllBalances(s.providerCtx(), delAddr) + consumerRewardDenomRegistrationFee := s.providerApp.GetProviderKeeper().GetConsumerRewardDenomRegistrationFee(s.providerCtx()) + s.Require().Equal(senderCoins1.Sub(senderCoins2), sdk.NewCoins(consumerRewardDenomRegistrationFee)) + + s.providerChain.NextBlock() + + // Check that the reward pool has no more coins because they were transferred to the fee pool + rewardCoins = providerBankKeeper.GetAllBalances(s.providerCtx(), rewardPool) + s.Require().Equal(0, len(rewardCoins)) + + // check that the fee pool has the expected amount of coins + communityCoins := s.providerApp.GetTestDistributionKeeper().GetFeePoolCommunityCoins(s.providerCtx()) s.Require().True(communityCoins[ibcCoinIndex].Amount.Equal(sdk.NewDecCoinFromCoin(providerExpectedRewards[0]).Amount)) } @@ -88,6 +151,11 @@ func (s *CCVTestSuite) TestSendRewardsRetries() { delegate(s, delAddr, bondAmt) s.providerChain.NextBlock() + // Register denom on consumer chain + params := s.consumerApp.GetConsumerKeeper().GetParams(s.consumerCtx()) + params.RewardDenoms = []string{sdk.DefaultBondDenom} + s.consumerApp.GetConsumerKeeper().SetParams(s.consumerCtx(), params) + // relay VSC packets from provider to consumer relayAllCommittedPackets(s, s.providerChain, s.path, ccv.ProviderPortID, s.path.EndpointB.ChannelID, 1) @@ -156,12 +224,14 @@ func (s *CCVTestSuite) TestEndBlockRD() { corruptTransChannel bool expLBThUpdated bool expEscrowBalanceChanged bool + denomRegistered bool }{ { name: "should not update LBTH before blocks per dist trans block are passed", prepareRewardDist: false, corruptTransChannel: false, expLBThUpdated: false, + denomRegistered: true, expEscrowBalanceChanged: false, }, { @@ -169,6 +239,7 @@ func (s *CCVTestSuite) TestEndBlockRD() { prepareRewardDist: true, corruptTransChannel: false, expLBThUpdated: true, + denomRegistered: true, expEscrowBalanceChanged: true, }, { @@ -176,8 +247,25 @@ func (s *CCVTestSuite) TestEndBlockRD() { prepareRewardDist: true, corruptTransChannel: true, expLBThUpdated: true, + denomRegistered: true, + expEscrowBalanceChanged: false, + }, + { + name: "should not change escrow balance when denom is not registered", + prepareRewardDist: true, + corruptTransChannel: false, + expLBThUpdated: true, + denomRegistered: false, expEscrowBalanceChanged: false, }, + { + name: "should change escrow balance when denom is registered", + prepareRewardDist: true, + corruptTransChannel: false, + expLBThUpdated: true, + denomRegistered: true, + expEscrowBalanceChanged: true, + }, } for _, tc := range testCases { @@ -192,6 +280,12 @@ func (s *CCVTestSuite) TestEndBlockRD() { delegate(s, delAddr, bondAmt) s.providerChain.NextBlock() + if tc.denomRegistered { + params := s.consumerApp.GetConsumerKeeper().GetParams(s.consumerCtx()) + params.RewardDenoms = []string{sdk.DefaultBondDenom} + s.consumerApp.GetConsumerKeeper().SetParams(s.consumerCtx(), params) + } + // relay VSC packets from provider to consumer relayAllCommittedPackets(s, s.providerChain, s.path, ccv.ProviderPortID, s.path.EndpointB.ChannelID, 1) diff --git a/testutil/integration/interfaces.go b/testutil/integration/interfaces.go index 8546b7a6f8..a9e48e3ede 100644 --- a/testutil/integration/interfaces.go +++ b/testutil/integration/interfaces.go @@ -24,6 +24,7 @@ import ( // This is a wrapper around the ibc testing app interface with additional constraints. type ProviderApp interface { ibctesting.TestingApp + GetSubspace(moduleName string) paramstypes.Subspace // // Keeper getters @@ -32,12 +33,14 @@ type ProviderApp interface { GetProviderKeeper() providerkeeper.Keeper // Returns a staking keeper interface with more capabilities than the expected_keepers interface GetTestStakingKeeper() TestStakingKeeper - // Testurns a bank keeper interface with more capabilities than the expected_keepers interface + // Returns a bank keeper interface with more capabilities than the expected_keepers interface GetTestBankKeeper() TestBankKeeper - // Testurns a slashing keeper interface with more capabilities than the expected_keepers interface + // Returns a slashing keeper interface with more capabilities than the expected_keepers interface GetTestSlashingKeeper() TestSlashingKeeper - // Integrurns a distribution keeper interface with more capabilities than the expected_keepers interface + // Returns a distribution keeper interface with more capabilities than the expected_keepers interface GetTestDistributionKeeper() TestDistributionKeeper + // Returns an account keeper interface with more capabilities than the expected_keepers interface + GetTestAccountKeeper() TestAccountKeeper } // The interface that any consumer app must implement to be compatible with integration tests @@ -104,6 +107,8 @@ type TestBankKeeper interface { ccvtypes.BankKeeper SendCoinsFromAccountToModule(ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error + SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, + recipientAddr sdk.AccAddress, amt sdk.Coins) error } type TestAccountKeeper interface { diff --git a/testutil/keeper/mocks.go b/testutil/keeper/mocks.go index a3f1c48f6d..4f931d8152 100644 --- a/testutil/keeper/mocks.go +++ b/testutil/keeper/mocks.go @@ -46,6 +46,20 @@ func (m *MockStakingKeeper) EXPECT() *MockStakingKeeperMockRecorder { return m.recorder } +// BondDenom mocks base method. +func (m *MockStakingKeeper) BondDenom(ctx types.Context) string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BondDenom", ctx) + ret0, _ := ret[0].(string) + return ret0 +} + +// BondDenom indicates an expected call of BondDenom. +func (mr *MockStakingKeeperMockRecorder) BondDenom(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BondDenom", reflect.TypeOf((*MockStakingKeeper)(nil).BondDenom), ctx) +} + // Delegation mocks base method. func (m *MockStakingKeeper) Delegation(ctx types.Context, addr types.AccAddress, valAddr types.ValAddress) types4.DelegationI { m.ctrl.T.Helper() @@ -724,6 +738,43 @@ func (mr *MockClientKeeperMockRecorder) GetSelfConsensusState(ctx, height interf return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSelfConsensusState", reflect.TypeOf((*MockClientKeeper)(nil).GetSelfConsensusState), ctx, height) } +// MockDistributionKeeper is a mock of DistributionKeeper interface. +type MockDistributionKeeper struct { + ctrl *gomock.Controller + recorder *MockDistributionKeeperMockRecorder +} + +// MockDistributionKeeperMockRecorder is the mock recorder for MockDistributionKeeper. +type MockDistributionKeeperMockRecorder struct { + mock *MockDistributionKeeper +} + +// NewMockDistributionKeeper creates a new mock instance. +func NewMockDistributionKeeper(ctrl *gomock.Controller) *MockDistributionKeeper { + mock := &MockDistributionKeeper{ctrl: ctrl} + mock.recorder = &MockDistributionKeeperMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockDistributionKeeper) EXPECT() *MockDistributionKeeperMockRecorder { + return m.recorder +} + +// FundCommunityPool mocks base method. +func (m *MockDistributionKeeper) FundCommunityPool(ctx types.Context, amount types.Coins, sender types.AccAddress) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FundCommunityPool", ctx, amount, sender) + ret0, _ := ret[0].(error) + return ret0 +} + +// FundCommunityPool indicates an expected call of FundCommunityPool. +func (mr *MockDistributionKeeperMockRecorder) FundCommunityPool(ctx, amount, sender interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FundCommunityPool", reflect.TypeOf((*MockDistributionKeeper)(nil).FundCommunityPool), ctx, amount, sender) +} + // MockConsumerHooks is a mock of ConsumerHooks interface. type MockConsumerHooks struct { ctrl *gomock.Controller diff --git a/testutil/keeper/unit_test_helpers.go b/testutil/keeper/unit_test_helpers.go index 93789dbb60..23c39ec128 100644 --- a/testutil/keeper/unit_test_helpers.go +++ b/testutil/keeper/unit_test_helpers.go @@ -88,23 +88,25 @@ type MockedKeepers struct { *MockIBCTransferKeeper *MockIBCCoreKeeper *MockEvidenceKeeper + *MockDistributionKeeper } // NewMockedKeepers instantiates a struct with pointers to properly instantiated mocked keepers. func NewMockedKeepers(ctrl *gomock.Controller) MockedKeepers { return MockedKeepers{ - MockScopedKeeper: NewMockScopedKeeper(ctrl), - MockChannelKeeper: NewMockChannelKeeper(ctrl), - MockPortKeeper: NewMockPortKeeper(ctrl), - MockConnectionKeeper: NewMockConnectionKeeper(ctrl), - MockClientKeeper: NewMockClientKeeper(ctrl), - MockStakingKeeper: NewMockStakingKeeper(ctrl), - MockSlashingKeeper: NewMockSlashingKeeper(ctrl), - MockAccountKeeper: NewMockAccountKeeper(ctrl), - MockBankKeeper: NewMockBankKeeper(ctrl), - MockIBCTransferKeeper: NewMockIBCTransferKeeper(ctrl), - MockIBCCoreKeeper: NewMockIBCCoreKeeper(ctrl), - MockEvidenceKeeper: NewMockEvidenceKeeper(ctrl), + MockScopedKeeper: NewMockScopedKeeper(ctrl), + MockChannelKeeper: NewMockChannelKeeper(ctrl), + MockPortKeeper: NewMockPortKeeper(ctrl), + MockConnectionKeeper: NewMockConnectionKeeper(ctrl), + MockClientKeeper: NewMockClientKeeper(ctrl), + MockStakingKeeper: NewMockStakingKeeper(ctrl), + MockSlashingKeeper: NewMockSlashingKeeper(ctrl), + MockAccountKeeper: NewMockAccountKeeper(ctrl), + MockBankKeeper: NewMockBankKeeper(ctrl), + MockIBCTransferKeeper: NewMockIBCTransferKeeper(ctrl), + MockIBCCoreKeeper: NewMockIBCCoreKeeper(ctrl), + MockEvidenceKeeper: NewMockEvidenceKeeper(ctrl), + MockDistributionKeeper: NewMockDistributionKeeper(ctrl), } } @@ -123,6 +125,8 @@ func NewInMemProviderKeeper(params InMemKeeperParams, mocks MockedKeepers) provi mocks.MockSlashingKeeper, mocks.MockAccountKeeper, mocks.MockEvidenceKeeper, + mocks.MockDistributionKeeper, + mocks.MockBankKeeper, authtypes.FeeCollectorName, ) } diff --git a/x/ccv/consumer/keeper/distribution.go b/x/ccv/consumer/keeper/distribution.go index 8400ae9c63..0b856e2bef 100644 --- a/x/ccv/consumer/keeper/distribution.go +++ b/x/ccv/consumer/keeper/distribution.go @@ -107,23 +107,34 @@ func (k Keeper) SendRewardsToProvider(ctx sdk.Context) error { if found && transferChannel.State == channeltypes.OPEN { tstProviderAddr := k.authKeeper.GetModuleAccount(ctx, types.ConsumerToSendToProviderName).GetAddress() - tstProviderTokens := k.bankKeeper.GetAllBalances(ctx, tstProviderAddr) providerAddr := k.GetProviderFeePoolAddrStr(ctx) timeoutHeight := clienttypes.ZeroHeight() transferTimeoutPeriod := k.GetTransferTimeoutPeriod(ctx) timeoutTimestamp := uint64(ctx.BlockTime().Add(transferTimeoutPeriod).UnixNano()) - for _, token := range tstProviderTokens { - err := k.ibcTransferKeeper.SendTransfer(ctx, - transfertypes.PortID, - ch, - token, - tstProviderAddr, - providerAddr, - timeoutHeight, - timeoutTimestamp, - ) - if err != nil { - return err + + sentCoins := sdk.NewCoins() + + // iterate over all whitelisted reward denoms + for _, denom := range k.AllowedRewardDenoms(ctx) { + // get the balance of the denom in the toSendToProviderTokens address + balance := k.bankKeeper.GetBalance(ctx, tstProviderAddr, denom) + + // if the balance is not zero, + if !balance.IsZero() { + // send the balance to the provider + err := k.ibcTransferKeeper.SendTransfer(ctx, + transfertypes.PortID, + ch, + balance, + tstProviderAddr, + providerAddr, + timeoutHeight, + timeoutTimestamp, + ) + if err != nil { + return err + } + sentCoins = sentCoins.Add(balance) } } @@ -132,7 +143,7 @@ func (k Keeper) SendRewardsToProvider(ctx sdk.Context) error { k.Logger(ctx).Info("sent block rewards to provider", "total fee pool", fpTokens.String(), - "sent", tstProviderTokens.String(), + "sent", sentCoins.String(), ) currentHeight := ctx.BlockHeight() ctx.EventManager().EmitEvent( @@ -143,7 +154,7 @@ func (k Keeper) SendRewardsToProvider(ctx sdk.Context) error { sdk.NewAttribute(ccv.AttributeDistributionNextHeight, strconv.Itoa(int(currentHeight+k.GetBlocksPerDistributionTransmission(ctx)))), sdk.NewAttribute(ccv.AttributeDistributionFraction, (k.GetConsumerRedistributionFrac(ctx))), sdk.NewAttribute(ccv.AttributeDistributionTotal, fpTokens.String()), - sdk.NewAttribute(ccv.AttributeDistributionToProvider, tstProviderTokens.String()), + sdk.NewAttribute(ccv.AttributeDistributionToProvider, sentCoins.String()), ), ) } @@ -151,6 +162,34 @@ func (k Keeper) SendRewardsToProvider(ctx sdk.Context) error { return nil } +// AllowedRewardDenoms returns a list of all denoms that are allowed +// to be sent to the provider as rewards +func (k Keeper) AllowedRewardDenoms(ctx sdk.Context) []string { + var rewardDenoms []string + + // first, append the native reward denoms + rewardDenoms = append(rewardDenoms, k.GetRewardDenoms(ctx)...) + + // then, append the provider-originated reward denoms + for _, denom := range k.GetProviderRewardDenoms(ctx) { + // every provider denom was sent over IBC, + // so we must prefix the denom + sourcePrefix := transfertypes.GetDenomPrefix( + transfertypes.PortID, + k.GetDistributionTransmissionChannel(ctx), + ) + // NOTE: sourcePrefix contains the trailing "/" + prefixedDenom := sourcePrefix + denom + // construct the denomination trace from the full raw denomination + denomTrace := transfertypes.ParseDenomTrace(prefixedDenom) + + // append the IBC denom to the list of allowed reward denoms + rewardDenoms = append(rewardDenoms, denomTrace.IBCDenom()) + } + + return rewardDenoms +} + func (k Keeper) GetLastTransmissionBlockHeight(ctx sdk.Context) types.LastTransmissionBlockHeight { store := ctx.KVStore(k.storeKey) bz := store.Get(types.LastDistributionTransmissionKey()) diff --git a/x/ccv/consumer/keeper/distribution_test.go b/x/ccv/consumer/keeper/distribution_test.go index 39d7e22e5e..d1bd7c2164 100644 --- a/x/ccv/consumer/keeper/distribution_test.go +++ b/x/ccv/consumer/keeper/distribution_test.go @@ -1,6 +1,7 @@ package keeper_test import ( + "strings" "testing" sdk "github.com/cosmos/cosmos-sdk/types" @@ -65,3 +66,25 @@ func TestGetEstimatedNextFeeDistribution(t *testing.T) { require.NotEmpty(t, res) require.EqualValues(t, expect, res, "fee distribution data does not match") } + +func TestAllowedRewardDenoms(t *testing.T) { + keeperParams := testkeeper.NewInMemKeeperParams(t) + ctx := keeperParams.Ctx + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + mocks := testkeeper.NewMockedKeepers(ctrl) + consumerKeeper := testkeeper.NewInMemConsumerKeeper(keeperParams, mocks) + params := types.DefaultParams() + params.RewardDenoms = []string{"ustake"} + params.ProviderRewardDenoms = []string{"uatom"} + consumerKeeper.SetParams(ctx, params) + + transferChannelID := "channel-5" + consumerKeeper.SetDistributionTransmissionChannel(ctx, transferChannelID) + + allowedDenoms := consumerKeeper.AllowedRewardDenoms(ctx) + require.Len(t, allowedDenoms, 2) + require.Equal(t, allowedDenoms[0], "ustake") + require.True(t, strings.HasPrefix(allowedDenoms[1], "ibc/")) +} diff --git a/x/ccv/consumer/keeper/params.go b/x/ccv/consumer/keeper/params.go index 69e975f702..1a0a071ce2 100644 --- a/x/ccv/consumer/keeper/params.go +++ b/x/ccv/consumer/keeper/params.go @@ -22,6 +22,8 @@ func (k Keeper) GetParams(ctx sdk.Context) types.Params { k.GetHistoricalEntries(ctx), k.GetUnbondingPeriod(ctx), k.GetSoftOptOutThreshold(ctx), + k.GetRewardDenoms(ctx), + k.GetProviderRewardDenoms(ctx), ) } @@ -115,3 +117,15 @@ func (k Keeper) GetSoftOptOutThreshold(ctx sdk.Context) string { k.paramStore.Get(ctx, types.KeySoftOptOutThreshold, &str) return str } + +func (k Keeper) GetRewardDenoms(ctx sdk.Context) []string { + var denoms []string + k.paramStore.Get(ctx, types.KeyRewardDenoms, &denoms) + return denoms +} + +func (k Keeper) GetProviderRewardDenoms(ctx sdk.Context) []string { + var denoms []string + k.paramStore.Get(ctx, types.KeyProviderRewardDenoms, &denoms) + return denoms +} diff --git a/x/ccv/consumer/keeper/params_test.go b/x/ccv/consumer/keeper/params_test.go index 6b3dcd57e1..674b57226c 100644 --- a/x/ccv/consumer/keeper/params_test.go +++ b/x/ccv/consumer/keeper/params_test.go @@ -16,6 +16,8 @@ func TestParams(t *testing.T) { defer ctrl.Finish() consumerKeeper.SetParams(ctx, types.DefaultParams()) + var rewardDenoms []string + var provideRewardDenoms []string expParams := types.NewParams( false, 1000, @@ -27,6 +29,8 @@ func TestParams(t *testing.T) { types.DefaultHistoricalEntries, types.DefaultConsumerUnbondingPeriod, types.DefaultSoftOptOutThreshold, + rewardDenoms, + provideRewardDenoms, ) // these are the default params, IBC suite independently sets enabled=true params := consumerKeeper.GetParams(ctx) @@ -34,7 +38,7 @@ func TestParams(t *testing.T) { newParams := types.NewParams(false, 1000, "channel-2", "cosmos19pe9pg5dv9k5fzgzmsrgnw9rl9asf7ddwhu7lm", - 7*24*time.Hour, 25*time.Hour, "0.5", 500, 24*21*time.Hour, "0.05") + 7*24*time.Hour, 25*time.Hour, "0.5", 500, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}) consumerKeeper.SetParams(ctx, newParams) params = consumerKeeper.GetParams(ctx) require.Equal(t, newParams, params) diff --git a/x/ccv/consumer/types/consumer.pb.go b/x/ccv/consumer/types/consumer.pb.go index 3c3e3e8d04..34ef7d0718 100644 --- a/x/ccv/consumer/types/consumer.pb.go +++ b/x/ccv/consumer/types/consumer.pb.go @@ -67,6 +67,11 @@ type Params struct { // 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 SoftOptOutThreshold string `protobuf:"bytes,10,opt,name=soft_opt_out_threshold,json=softOptOutThreshold,proto3" json:"soft_opt_out_threshold,omitempty"` + // Reward denoms. These are the denominations which are allowed to be sent to the provider as rewards. + RewardDenoms []string `protobuf:"bytes,11,rep,name=reward_denoms,json=rewardDenoms,proto3" json:"reward_denoms,omitempty"` + // 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"` } func (m *Params) Reset() { *m = Params{} } @@ -172,6 +177,20 @@ func (m *Params) GetSoftOptOutThreshold() string { return "" } +func (m *Params) GetRewardDenoms() []string { + if m != nil { + return m.RewardDenoms + } + return nil +} + +func (m *Params) GetProviderRewardDenoms() []string { + if m != nil { + return m.ProviderRewardDenoms + } + return nil +} + // LastTransmissionBlockHeight is the last time validator holding // pools were transmitted to the provider chain type LastTransmissionBlockHeight struct { @@ -345,54 +364,56 @@ func init() { } var fileDescriptor_5b27a82b276e7f93 = []byte{ - // 742 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0xcd, 0x6e, 0xe3, 0x36, - 0x10, 0xb6, 0x9a, 0x8d, 0x37, 0xcb, 0x6c, 0xd1, 0x5d, 0xad, 0x9b, 0xd5, 0xba, 0x80, 0xec, 0x75, - 0xf7, 0xe0, 0x4b, 0x64, 0xac, 0x83, 0x5e, 0x72, 0x5b, 0x3b, 0x0d, 0x92, 0xfe, 0xc5, 0x55, 0x8c, - 0x1c, 0xda, 0x03, 0x41, 0x51, 0xb4, 0x44, 0x44, 0x22, 0x05, 0x92, 0x52, 0xab, 0xb7, 0xc8, 0xb1, - 0x8f, 0xd0, 0xde, 0xfb, 0x10, 0x41, 0x4f, 0x39, 0xf6, 0x94, 0x16, 0xc9, 0x1b, 0xf4, 0x09, 0x0a, - 0x52, 0x92, 0x13, 0x27, 0x1b, 0x20, 0xb7, 0x19, 0x7c, 0xdf, 0x7c, 0x9c, 0x19, 0x7e, 0x24, 0x18, - 0x53, 0xa6, 0x88, 0xc0, 0x31, 0xa2, 0x0c, 0x4a, 0x82, 0x73, 0x41, 0x55, 0x39, 0xc2, 0xb8, 0x18, - 0x61, 0xce, 0x64, 0x9e, 0x12, 0x31, 0x2a, 0xde, 0x2f, 0x63, 0x2f, 0x13, 0x5c, 0x71, 0xfb, 0xcb, - 0x8f, 0xd4, 0x78, 0x18, 0x17, 0xde, 0x92, 0x57, 0xbc, 0xef, 0xbe, 0x7b, 0x48, 0x58, 0xeb, 0xe1, - 0xa2, 0x92, 0xea, 0xbe, 0x89, 0x38, 0x8f, 0x12, 0x32, 0x32, 0x59, 0x90, 0x2f, 0x46, 0x88, 0x95, - 0x35, 0xd4, 0x89, 0x78, 0xc4, 0x4d, 0x38, 0xd2, 0x51, 0x53, 0x80, 0xb9, 0x4c, 0xb9, 0x84, 0x15, - 0x50, 0x25, 0x35, 0xe4, 0xde, 0xd5, 0x0a, 0x73, 0x81, 0x14, 0xe5, 0xac, 0xc6, 0x7b, 0x77, 0x71, - 0x45, 0x53, 0x22, 0x15, 0x4a, 0xb3, 0x8a, 0x30, 0xf8, 0x63, 0x1d, 0xb4, 0x67, 0x48, 0xa0, 0x54, - 0xda, 0x0e, 0x78, 0x4a, 0x18, 0x0a, 0x12, 0x12, 0x3a, 0x56, 0xdf, 0x1a, 0x6e, 0xf8, 0x4d, 0x6a, - 0x1f, 0x81, 0x77, 0x41, 0xc2, 0xf1, 0xa9, 0x84, 0x19, 0x11, 0x30, 0xa4, 0x52, 0x09, 0x1a, 0xe4, - 0xfa, 0x18, 0xa8, 0x04, 0x62, 0x32, 0xa5, 0x52, 0x52, 0xce, 0x9c, 0x4f, 0xfa, 0xd6, 0x70, 0xcd, - 0x7f, 0x5b, 0x71, 0x67, 0x44, 0xec, 0xdd, 0x62, 0xce, 0x6f, 0x11, 0xed, 0x6f, 0xc0, 0xdb, 0x07, - 0x55, 0x20, 0x8e, 0x11, 0x63, 0x24, 0x71, 0xd6, 0xfa, 0xd6, 0xf0, 0x99, 0xdf, 0x0b, 0x1f, 0x10, - 0x99, 0x56, 0x34, 0x7b, 0x17, 0x74, 0x33, 0xc1, 0x0b, 0x1a, 0x12, 0x01, 0x17, 0x84, 0xc0, 0x8c, - 0xf3, 0x04, 0xa2, 0x30, 0x14, 0x50, 0x2a, 0xe1, 0x3c, 0x31, 0x22, 0x5b, 0x0d, 0x63, 0x9f, 0x90, - 0x19, 0xe7, 0xc9, 0x87, 0x30, 0x14, 0xc7, 0x4a, 0xd8, 0x3f, 0x02, 0x1b, 0xe3, 0x02, 0xea, 0xa5, - 0xf0, 0x5c, 0xe9, 0xe9, 0x28, 0x0f, 0x9d, 0xf5, 0xbe, 0x35, 0xdc, 0x1c, 0xbf, 0xf1, 0xaa, 0xdd, - 0x79, 0xcd, 0xee, 0xbc, 0xbd, 0x7a, 0xb7, 0x93, 0x8d, 0xf3, 0xcb, 0x5e, 0xeb, 0xb7, 0x7f, 0x7a, - 0x96, 0xff, 0x02, 0xe3, 0x62, 0x5e, 0x55, 0xcf, 0x4c, 0xb1, 0xfd, 0x33, 0x78, 0x6d, 0xa6, 0x59, - 0x10, 0x71, 0x57, 0xb7, 0xfd, 0x78, 0xdd, 0xcf, 0x1b, 0x8d, 0x55, 0xf1, 0x03, 0xd0, 0x6f, 0xfc, - 0x06, 0x05, 0x59, 0x59, 0xe1, 0x42, 0x20, 0xac, 0x03, 0xe7, 0xa9, 0x99, 0xd8, 0x6d, 0x78, 0xfe, - 0x0a, 0x6d, 0xbf, 0x66, 0xd9, 0xdb, 0xc0, 0x8e, 0xa9, 0x54, 0x5c, 0x50, 0x8c, 0x12, 0x48, 0x98, - 0x12, 0x94, 0x48, 0x67, 0xc3, 0x5c, 0xe0, 0xcb, 0x1b, 0xe4, 0xeb, 0x0a, 0xb0, 0x7f, 0x00, 0x2f, - 0x72, 0x16, 0x70, 0x16, 0x52, 0x16, 0x35, 0xe3, 0x3c, 0x7b, 0xfc, 0x38, 0x9f, 0x2d, 0x8b, 0xeb, - 0x41, 0x76, 0xc0, 0x96, 0xe4, 0x0b, 0x05, 0x79, 0xa6, 0xa0, 0xde, 0x90, 0x8a, 0x05, 0x91, 0x31, - 0x4f, 0x42, 0x07, 0x98, 0xf6, 0x5f, 0x69, 0xf4, 0x28, 0x53, 0x47, 0xb9, 0x9a, 0x37, 0xd0, 0xe0, - 0x2b, 0xf0, 0xc5, 0x77, 0x48, 0xaa, 0xdb, 0x26, 0x98, 0x68, 0xab, 0x1d, 0x10, 0x1a, 0xc5, 0xca, - 0xde, 0x02, 0xed, 0xd8, 0x44, 0xc6, 0xbe, 0x6b, 0x7e, 0x9d, 0x0d, 0x7e, 0xb7, 0xc0, 0xab, 0xa9, - 0xe0, 0x52, 0x4e, 0xf5, 0xc3, 0x3c, 0x41, 0x09, 0x0d, 0x91, 0xe2, 0x42, 0xfb, 0x5d, 0xdb, 0x84, - 0x48, 0x69, 0x0a, 0x9e, 0xfb, 0x4d, 0x6a, 0x77, 0xc0, 0x7a, 0xc6, 0x7f, 0x21, 0xa2, 0x36, 0x74, - 0x95, 0xd8, 0x08, 0xb4, 0xb3, 0x3c, 0x38, 0x25, 0xa5, 0x71, 0xe6, 0xe6, 0xb8, 0x73, 0x6f, 0xf2, - 0x0f, 0xac, 0x9c, 0xec, 0xfc, 0x77, 0xd9, 0x7b, 0x5d, 0xa2, 0x34, 0xd9, 0x1d, 0xe8, 0x2b, 0x20, - 0x4c, 0xe6, 0x12, 0x56, 0x75, 0x83, 0xbf, 0xfe, 0xdc, 0xee, 0xd4, 0xcf, 0x17, 0x8b, 0x32, 0x53, - 0xdc, 0x9b, 0xe5, 0xc1, 0xb7, 0xa4, 0xf4, 0x6b, 0xe1, 0x81, 0x02, 0x2f, 0xbf, 0x47, 0x2a, 0x17, - 0x94, 0x45, 0x27, 0xc7, 0xd3, 0x19, 0xc2, 0xa7, 0x44, 0xe9, 0x6e, 0x0a, 0x89, 0x0f, 0xab, 0x57, - 0xf9, 0xc4, 0xaf, 0x12, 0xfb, 0x10, 0x7c, 0x9a, 0x1a, 0xaa, 0x2a, 0x8d, 0xcf, 0x4c, 0xaf, 0x9b, - 0xe3, 0xee, 0xbd, 0xa6, 0xe6, 0xcd, 0x8b, 0xaf, 0xee, 0xe3, 0x4c, 0xdf, 0xc7, 0xf3, 0xa6, 0x54, - 0x83, 0x93, 0xf9, 0xf9, 0x95, 0x6b, 0x5d, 0x5c, 0xb9, 0xd6, 0xbf, 0x57, 0xae, 0x75, 0x76, 0xed, - 0xb6, 0x2e, 0xae, 0xdd, 0xd6, 0xdf, 0xd7, 0x6e, 0xeb, 0xa7, 0xdd, 0x88, 0xaa, 0x38, 0x0f, 0x3c, - 0xcc, 0xd3, 0xfa, 0xdf, 0x19, 0xdd, 0x7c, 0x71, 0xdb, 0xcb, 0x2f, 0xee, 0xd7, 0xd5, 0xdf, 0x53, - 0x95, 0x19, 0x91, 0x41, 0xdb, 0x74, 0xb0, 0xf3, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x71, 0xcd, - 0x22, 0x5f, 0x6e, 0x05, 0x00, 0x00, + // 781 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0xcf, 0x6e, 0xdb, 0x36, + 0x18, 0x8f, 0x96, 0xd6, 0x4d, 0x98, 0x14, 0x6b, 0x59, 0x2f, 0x55, 0x3d, 0x40, 0x76, 0xdd, 0x1e, + 0x7c, 0x89, 0x8c, 0x3a, 0xdb, 0x25, 0xb7, 0xda, 0x59, 0xd1, 0xee, 0x5f, 0x3c, 0xd5, 0xe8, 0x61, + 0x3b, 0x10, 0x14, 0x45, 0x4b, 0x44, 0x24, 0x52, 0x20, 0x29, 0x75, 0xba, 0xef, 0x01, 0x7a, 0xdc, + 0x23, 0xec, 0x01, 0xf6, 0x10, 0xc5, 0x4e, 0x3d, 0xee, 0xd4, 0x0d, 0xc9, 0x1b, 0xec, 0x09, 0x06, + 0x52, 0x92, 0x6b, 0xa7, 0x0d, 0x90, 0x1b, 0x3f, 0xfd, 0x7e, 0xdf, 0x4f, 0xdf, 0x7f, 0x30, 0x61, + 0x5c, 0x53, 0x49, 0x12, 0xcc, 0x38, 0x52, 0x94, 0x14, 0x92, 0xe9, 0x6a, 0x4c, 0x48, 0x39, 0x26, + 0x82, 0xab, 0x22, 0xa3, 0x72, 0x5c, 0x3e, 0x59, 0xbd, 0xfd, 0x5c, 0x0a, 0x2d, 0xe0, 0xa3, 0x4f, + 0xf8, 0xf8, 0x84, 0x94, 0xfe, 0x8a, 0x57, 0x3e, 0xe9, 0x3d, 0xbe, 0x4a, 0xd8, 0xe8, 0x91, 0xb2, + 0x96, 0xea, 0x3d, 0x88, 0x85, 0x88, 0x53, 0x3a, 0xb6, 0x56, 0x58, 0x2c, 0xc7, 0x98, 0x57, 0x0d, + 0xd4, 0x8d, 0x45, 0x2c, 0xec, 0x73, 0x6c, 0x5e, 0xad, 0x03, 0x11, 0x2a, 0x13, 0x0a, 0xd5, 0x40, + 0x6d, 0x34, 0x90, 0x77, 0x59, 0x2b, 0x2a, 0x24, 0xd6, 0x4c, 0xf0, 0x06, 0xef, 0x5f, 0xc6, 0x35, + 0xcb, 0xa8, 0xd2, 0x38, 0xcb, 0x6b, 0xc2, 0xf0, 0xb7, 0x0e, 0xe8, 0xcc, 0xb1, 0xc4, 0x99, 0x82, + 0x2e, 0xb8, 0x45, 0x39, 0x0e, 0x53, 0x1a, 0xb9, 0xce, 0xc0, 0x19, 0xed, 0x04, 0xad, 0x09, 0x4f, + 0xc1, 0xe3, 0x30, 0x15, 0xe4, 0x4c, 0xa1, 0x9c, 0x4a, 0x14, 0x31, 0xa5, 0x25, 0x0b, 0x0b, 0xf3, + 0x1b, 0xa4, 0x25, 0xe6, 0x2a, 0x63, 0x4a, 0x31, 0xc1, 0xdd, 0xcf, 0x06, 0xce, 0x68, 0x3b, 0x78, + 0x58, 0x73, 0xe7, 0x54, 0x9e, 0xac, 0x31, 0x17, 0x6b, 0x44, 0xf8, 0x2d, 0x78, 0x78, 0xa5, 0x0a, + 0x22, 0x09, 0xe6, 0x9c, 0xa6, 0xee, 0xf6, 0xc0, 0x19, 0xed, 0x06, 0xfd, 0xe8, 0x0a, 0x91, 0x59, + 0x4d, 0x83, 0xc7, 0xa0, 0x97, 0x4b, 0x51, 0xb2, 0x88, 0x4a, 0xb4, 0xa4, 0x14, 0xe5, 0x42, 0xa4, + 0x08, 0x47, 0x91, 0x44, 0x4a, 0x4b, 0xf7, 0x86, 0x15, 0x39, 0x68, 0x19, 0xcf, 0x28, 0x9d, 0x0b, + 0x91, 0x3e, 0x8d, 0x22, 0xf9, 0x52, 0x4b, 0xf8, 0x13, 0x80, 0x84, 0x94, 0xc8, 0x14, 0x45, 0x14, + 0xda, 0x64, 0xc7, 0x44, 0xe4, 0xde, 0x1c, 0x38, 0xa3, 0xbd, 0xc9, 0x03, 0xbf, 0xae, 0x9d, 0xdf, + 0xd6, 0xce, 0x3f, 0x69, 0x6a, 0x3b, 0xdd, 0x79, 0xfb, 0xbe, 0xbf, 0xf5, 0xfb, 0x3f, 0x7d, 0x27, + 0xb8, 0x43, 0x48, 0xb9, 0xa8, 0xbd, 0xe7, 0xd6, 0x19, 0xfe, 0x02, 0xee, 0xdb, 0x6c, 0x96, 0x54, + 0x5e, 0xd6, 0xed, 0x5c, 0x5f, 0xf7, 0x8b, 0x56, 0x63, 0x53, 0xfc, 0x39, 0x18, 0xb4, 0xf3, 0x86, + 0x24, 0xdd, 0x28, 0xe1, 0x52, 0x62, 0x62, 0x1e, 0xee, 0x2d, 0x9b, 0xb1, 0xd7, 0xf2, 0x82, 0x0d, + 0xda, 0xb3, 0x86, 0x05, 0x0f, 0x01, 0x4c, 0x98, 0xd2, 0x42, 0x32, 0x82, 0x53, 0x44, 0xb9, 0x96, + 0x8c, 0x2a, 0x77, 0xc7, 0x36, 0xf0, 0xee, 0x07, 0xe4, 0x9b, 0x1a, 0x80, 0x3f, 0x82, 0x3b, 0x05, + 0x0f, 0x05, 0x8f, 0x18, 0x8f, 0xdb, 0x74, 0x76, 0xaf, 0x9f, 0xce, 0xe7, 0x2b, 0xe7, 0x26, 0x91, + 0x23, 0x70, 0xa0, 0xc4, 0x52, 0x23, 0x91, 0x6b, 0x64, 0x2a, 0xa4, 0x13, 0x49, 0x55, 0x22, 0xd2, + 0xc8, 0x05, 0x36, 0xfc, 0x7b, 0x06, 0x3d, 0xcd, 0xf5, 0x69, 0xa1, 0x17, 0x2d, 0x04, 0x1f, 0x81, + 0xdb, 0x92, 0xbe, 0xc6, 0x32, 0x42, 0x11, 0xe5, 0x22, 0x53, 0xee, 0xde, 0x60, 0x7b, 0xb4, 0x1b, + 0xec, 0xd7, 0x1f, 0x4f, 0xec, 0x37, 0xf8, 0x15, 0x58, 0x35, 0x1b, 0x6d, 0xb2, 0xf7, 0x2d, 0xbb, + 0xdb, 0xa2, 0xc1, 0x9a, 0xd7, 0xf0, 0x6b, 0xf0, 0xe5, 0xf7, 0x58, 0xe9, 0xf5, 0xf9, 0x9a, 0x9a, + 0x29, 0x7e, 0x4e, 0x59, 0x9c, 0x68, 0x78, 0x00, 0x3a, 0x89, 0x7d, 0xd9, 0xcd, 0xd8, 0x0e, 0x1a, + 0x6b, 0xf8, 0x87, 0x03, 0xee, 0xcd, 0xa4, 0x50, 0x6a, 0x66, 0x76, 0xfe, 0x15, 0x4e, 0x59, 0x84, + 0xb5, 0x90, 0x66, 0x95, 0xcc, 0x04, 0x52, 0xa5, 0xac, 0xc3, 0x7e, 0xd0, 0x9a, 0xb0, 0x0b, 0x6e, + 0xe6, 0xe2, 0x35, 0x95, 0xcd, 0xae, 0xd4, 0x06, 0xc4, 0xa0, 0x93, 0x17, 0xe1, 0x19, 0xad, 0xec, + 0xd0, 0xef, 0x4d, 0xba, 0x1f, 0x15, 0xf5, 0x29, 0xaf, 0xa6, 0x47, 0xff, 0xbd, 0xef, 0xdf, 0xaf, + 0x70, 0x96, 0x1e, 0x0f, 0x4d, 0x77, 0x29, 0x57, 0x85, 0x42, 0xb5, 0xdf, 0xf0, 0xaf, 0x3f, 0x0f, + 0xbb, 0xcd, 0x65, 0x20, 0xb2, 0xca, 0xb5, 0xf0, 0xe7, 0x45, 0xf8, 0x1d, 0xad, 0x82, 0x46, 0x78, + 0xa8, 0xc1, 0xdd, 0x1f, 0xb0, 0x2e, 0x24, 0xe3, 0xf1, 0xab, 0x97, 0xb3, 0x39, 0x26, 0x67, 0x54, + 0x9b, 0x68, 0x4a, 0x45, 0x5e, 0xd4, 0x0b, 0x7f, 0x23, 0xa8, 0x0d, 0xf8, 0x02, 0xdc, 0xce, 0x2c, + 0x55, 0x57, 0x76, 0x84, 0x6d, 0xac, 0x7b, 0x93, 0xde, 0x47, 0x41, 0x2d, 0xda, 0x63, 0x52, 0xb7, + 0xfa, 0x8d, 0x69, 0xf5, 0x7e, 0xeb, 0x6a, 0xc0, 0xe9, 0xe2, 0xed, 0xb9, 0xe7, 0xbc, 0x3b, 0xf7, + 0x9c, 0x7f, 0xcf, 0x3d, 0xe7, 0xcd, 0x85, 0xb7, 0xf5, 0xee, 0xc2, 0xdb, 0xfa, 0xfb, 0xc2, 0xdb, + 0xfa, 0xf9, 0x38, 0x66, 0x3a, 0x29, 0x42, 0x9f, 0x88, 0xac, 0x39, 0x69, 0xe3, 0x0f, 0xd7, 0xf3, + 0x70, 0x75, 0x3d, 0x7f, 0xdd, 0x3c, 0xcc, 0xba, 0xca, 0xa9, 0x0a, 0x3b, 0x36, 0x82, 0xa3, 0xff, + 0x03, 0x00, 0x00, 0xff, 0xff, 0x95, 0x65, 0x18, 0x5a, 0xc9, 0x05, 0x00, 0x00, } func (m *Params) Marshal() (dAtA []byte, err error) { @@ -415,6 +436,24 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.ProviderRewardDenoms) > 0 { + for iNdEx := len(m.ProviderRewardDenoms) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ProviderRewardDenoms[iNdEx]) + copy(dAtA[i:], m.ProviderRewardDenoms[iNdEx]) + i = encodeVarintConsumer(dAtA, i, uint64(len(m.ProviderRewardDenoms[iNdEx]))) + i-- + dAtA[i] = 0x62 + } + } + if len(m.RewardDenoms) > 0 { + for iNdEx := len(m.RewardDenoms) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.RewardDenoms[iNdEx]) + copy(dAtA[i:], m.RewardDenoms[iNdEx]) + i = encodeVarintConsumer(dAtA, i, uint64(len(m.RewardDenoms[iNdEx]))) + i-- + dAtA[i] = 0x5a + } + } if len(m.SoftOptOutThreshold) > 0 { i -= len(m.SoftOptOutThreshold) copy(dAtA[i:], m.SoftOptOutThreshold) @@ -649,6 +688,18 @@ func (m *Params) Size() (n int) { if l > 0 { n += 1 + l + sovConsumer(uint64(l)) } + if len(m.RewardDenoms) > 0 { + for _, s := range m.RewardDenoms { + l = len(s) + n += 1 + l + sovConsumer(uint64(l)) + } + } + if len(m.ProviderRewardDenoms) > 0 { + for _, s := range m.ProviderRewardDenoms { + l = len(s) + n += 1 + l + sovConsumer(uint64(l)) + } + } return n } @@ -1018,6 +1069,70 @@ func (m *Params) Unmarshal(dAtA []byte) error { } m.SoftOptOutThreshold = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RewardDenoms", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowConsumer + } + 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 ErrInvalidLengthConsumer + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthConsumer + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RewardDenoms = append(m.RewardDenoms, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProviderRewardDenoms", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowConsumer + } + 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 ErrInvalidLengthConsumer + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthConsumer + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ProviderRewardDenoms = append(m.ProviderRewardDenoms, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipConsumer(dAtA[iNdEx:]) diff --git a/x/ccv/consumer/types/errors.go b/x/ccv/consumer/types/errors.go index 9a2a729737..85e5088fa4 100644 --- a/x/ccv/consumer/types/errors.go +++ b/x/ccv/consumer/types/errors.go @@ -6,5 +6,6 @@ import ( // Consumer sentinel errors var ( - ErrNoProposerChannelId = errorsmod.Register(ModuleName, 1, "no established CCV channel") + ErrNoProposerChannelId = errorsmod.Register(ModuleName, 1, "no established CCV channel") + ErrConsumerRewardDenomAlreadyRegistered = errorsmod.Register(ModuleName, 2, "consumer reward denom already registered") ) diff --git a/x/ccv/consumer/types/genesis_test.go b/x/ccv/consumer/types/genesis_test.go index 010f42d035..3a727cdcce 100644 --- a/x/ccv/consumer/types/genesis_test.go +++ b/x/ccv/consumer/types/genesis_test.go @@ -223,6 +223,8 @@ func TestValidateInitialGenesisState(t *testing.T) { types.DefaultHistoricalEntries, types.DefaultConsumerUnbondingPeriod, types.DefaultSoftOptOutThreshold, + []string{}, + []string{}, )), true, }, @@ -422,6 +424,8 @@ func TestValidateRestartGenesisState(t *testing.T) { types.DefaultHistoricalEntries, types.DefaultConsumerUnbondingPeriod, types.DefaultSoftOptOutThreshold, + []string{}, + []string{}, )), true, }, diff --git a/x/ccv/consumer/types/params.go b/x/ccv/consumer/types/params.go index 928900b207..55340b205f 100644 --- a/x/ccv/consumer/types/params.go +++ b/x/ccv/consumer/types/params.go @@ -53,6 +53,8 @@ var ( KeyHistoricalEntries = []byte("HistoricalEntries") KeyConsumerUnbondingPeriod = []byte("UnbondingPeriod") KeySoftOptOutThreshold = []byte("SoftOptOutThreshold") + KeyRewardDenoms = []byte("RewardDenoms") + KeyProviderRewardDenoms = []byte("ProviderRewardDenoms") ) // ParamKeyTable type declaration for parameters @@ -65,7 +67,7 @@ func NewParams(enabled bool, blocksPerDistributionTransmission int64, distributionTransmissionChannel, providerFeePoolAddrStr string, ccvTimeoutPeriod, transferTimeoutPeriod time.Duration, consumerRedistributionFraction string, historicalEntries int64, - consumerUnbondingPeriod time.Duration, softOptOutThreshold string, + consumerUnbondingPeriod time.Duration, softOptOutThreshold string, rewardDenoms, providerRewardDenoms []string, ) Params { return Params{ Enabled: enabled, @@ -78,11 +80,15 @@ func NewParams(enabled bool, blocksPerDistributionTransmission int64, HistoricalEntries: historicalEntries, UnbondingPeriod: consumerUnbondingPeriod, SoftOptOutThreshold: softOptOutThreshold, + RewardDenoms: rewardDenoms, + ProviderRewardDenoms: providerRewardDenoms, } } // DefaultParams is the default params for the consumer module func DefaultParams() Params { + var rewardDenoms []string + var provideRewardDenoms []string return NewParams( false, DefaultBlocksPerDistributionTransmission, @@ -94,6 +100,8 @@ func DefaultParams() Params { DefaultHistoricalEntries, DefaultConsumerUnbondingPeriod, DefaultSoftOptOutThreshold, + rewardDenoms, + provideRewardDenoms, ) } @@ -129,6 +137,12 @@ func (p Params) Validate() error { if err := validateSoftOptOutThreshold(p.SoftOptOutThreshold); err != nil { return err } + if err := validateDenoms(p.RewardDenoms); err != nil { + return err + } + if err := validateDenoms(p.ProviderRewardDenoms); err != nil { + return err + } return nil } @@ -154,6 +168,10 @@ func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { p.UnbondingPeriod, ccvtypes.ValidateDuration), paramtypes.NewParamSetPair(KeySoftOptOutThreshold, p.SoftOptOutThreshold, validateSoftOptOutThreshold), + paramtypes.NewParamSetPair(KeyRewardDenoms, + p.RewardDenoms, validateDenoms), + paramtypes.NewParamSetPair(KeyProviderRewardDenoms, + p.ProviderRewardDenoms, validateDenoms), } } @@ -192,3 +210,24 @@ func validateSoftOptOutThreshold(i interface{}) error { } return nil } + +func validateDenoms(i interface{}) error { + v, ok := i.([]string) + if !ok { + return fmt.Errorf("invalid parameter type: %T", i) + } + + // iterate over the denoms, turning them into coins and validating them + for _, denom := range v { + coin := sdktypes.Coin{ + Denom: denom, + Amount: sdktypes.NewInt(0), + } + + if err := coin.Validate(); err != nil { + return err + } + } + + return nil +} diff --git a/x/ccv/consumer/types/params_test.go b/x/ccv/consumer/types/params_test.go index cad6a58ae1..4b1e8e0d03 100644 --- a/x/ccv/consumer/types/params_test.go +++ b/x/ccv/consumer/types/params_test.go @@ -19,59 +19,63 @@ func TestValidateParams(t *testing.T) { {"default params", consumertypes.DefaultParams(), true}, { "custom valid params", - consumertypes.NewParams(true, 5, "", "", 1004, 1005, "0.5", 1000, 24*21*time.Hour, "0.1"), true, + consumertypes.NewParams(true, 5, "", "", 1004, 1005, "0.5", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}), true, }, { "custom invalid params, block per dist transmission", - consumertypes.NewParams(true, -5, "", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "0.05"), false, + consumertypes.NewParams(true, -5, "", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}), false, }, { "custom invalid params, dist transmission channel", - consumertypes.NewParams(true, 5, "badchannel/", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "0.05"), false, + consumertypes.NewParams(true, 5, "badchannel/", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}), false, }, { "custom invalid params, provider fee pool addr string", - consumertypes.NewParams(true, 5, "", "imabadaddress", 5, 1005, "0.5", 1000, 24*21*time.Hour, "0.05"), false, + consumertypes.NewParams(true, 5, "", "imabadaddress", 5, 1005, "0.5", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}), false, }, { "custom invalid params, ccv timeout", - consumertypes.NewParams(true, 5, "", "", -5, 1005, "0.5", 1000, 24*21*time.Hour, "0.05"), false, + consumertypes.NewParams(true, 5, "", "", -5, 1005, "0.5", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}), false, }, { "custom invalid params, transfer timeout", - consumertypes.NewParams(true, 5, "", "", 1004, -7, "0.5", 1000, 24*21*time.Hour, "0.05"), false, + consumertypes.NewParams(true, 5, "", "", 1004, -7, "0.5", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}), false, }, { "custom invalid params, consumer redist fraction is negative", - consumertypes.NewParams(true, 5, "", "", 5, 1005, "-0.5", 1000, 24*21*time.Hour, "0.05"), false, + consumertypes.NewParams(true, 5, "", "", 5, 1005, "-0.5", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}), false, }, { "custom invalid params, consumer redist fraction is over 1", - consumertypes.NewParams(true, 5, "", "", 5, 1005, "1.2", 1000, 24*21*time.Hour, "0.05"), false, + consumertypes.NewParams(true, 5, "", "", 5, 1005, "1.2", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}), false, }, { "custom invalid params, bad consumer redist fraction ", - consumertypes.NewParams(true, 5, "", "", 5, 1005, "notFrac", 1000, 24*21*time.Hour, "0.05"), false, + consumertypes.NewParams(true, 5, "", "", 5, 1005, "notFrac", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}), false, }, { "custom invalid params, negative num historical entries", - consumertypes.NewParams(true, 5, "", "", 5, 1005, "0.5", -100, 24*21*time.Hour, "0.05"), false, + consumertypes.NewParams(true, 5, "", "", 5, 1005, "0.5", -100, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}), false, }, { "custom invalid params, negative unbonding period", - consumertypes.NewParams(true, 5, "", "", 5, 1005, "0.5", 1000, -24*21*time.Hour, "0.05"), false, + consumertypes.NewParams(true, 5, "", "", 5, 1005, "0.5", 1000, -24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}), false, }, { - "custom invalid params, soft opt out threshold is negative", - consumertypes.NewParams(true, 5, "", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "-0.05"), false, + "custom invalid params, invalid soft opt out threshold", + consumertypes.NewParams(true, 5, "", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "-0.05", []string{"u"}, []string{}), false, }, { - "custom invalid params, soft opt out threshold is over 0.2", - consumertypes.NewParams(true, 5, "", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "0.44"), false, + "custom invalid params, invalid soft opt out threshold", + consumertypes.NewParams(true, 5, "", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "0.5", []string{"u"}, []string{}), false, }, { - "custom invalid params, bad soft opt out threshold ", - consumertypes.NewParams(true, 5, "", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "nickelback"), false, + "custom invalid params, invalid reward denom", + consumertypes.NewParams(true, 5, "", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "0.05", []string{"u"}, []string{}), false, + }, + { + "custom invalid params, invalid provider reward denom", + consumertypes.NewParams(true, 5, "", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "0.05", []string{}, []string{"a"}), false, }, } diff --git a/x/ccv/provider/client/cli/query.go b/x/ccv/provider/client/cli/query.go index 922fccd49f..18109db18c 100644 --- a/x/ccv/provider/client/cli/query.go +++ b/x/ccv/provider/client/cli/query.go @@ -32,6 +32,7 @@ func NewQueryCmd() *cobra.Command { cmd.AddCommand(CmdProviderValidatorKey()) cmd.AddCommand(CmdThrottleState()) cmd.AddCommand(CmdThrottledConsumerPacketData()) + cmd.AddCommand(CmdRegisteredConsumerRewardDenoms()) return cmd } @@ -320,3 +321,38 @@ $ %s query provider throttled-consumer-packet-data foochain return cmd } + +func CmdRegisteredConsumerRewardDenoms() *cobra.Command { + cmd := &cobra.Command{ + Use: "registered-consumer-reward-denoms", + Short: "Query registered consumer reward denoms", + Long: strings.TrimSpace( + fmt.Sprintf(`Returns the registered consumer reward denoms. +Example: +$ %s query provider registered-consumer-reward-denoms +`, + version.AppName, + ), + ), + 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.QueryRegisteredConsumerRewardDenomsRequest{} + res, err := queryClient.QueryRegisteredConsumerRewardDenoms(cmd.Context(), req) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/ccv/provider/client/cli/tx.go b/x/ccv/provider/client/cli/tx.go index 667ae4425b..ef4df5f455 100644 --- a/x/ccv/provider/client/cli/tx.go +++ b/x/ccv/provider/client/cli/tx.go @@ -2,12 +2,14 @@ package cli import ( "fmt" + "strings" "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/cosmos/cosmos-sdk/version" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/interchain-security/x/ccv/provider/types" @@ -24,6 +26,7 @@ func GetTxCmd() *cobra.Command { } cmd.AddCommand(NewAssignConsumerKeyCmd()) + cmd.AddCommand(NewRegisterConsumerRewardDenomCmd()) return cmd } @@ -62,3 +65,37 @@ func NewAssignConsumerKeyCmd() *cobra.Command { return cmd } + +func NewRegisterConsumerRewardDenomCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "register-consumer-reward-denom [denom]", + Args: cobra.ExactArgs(1), + Short: "Registers a denom that can be sent from consumer chains to all validators and delegators as a reward", + Long: strings.TrimSpace( + fmt.Sprintf(`Registers a denom that can be sent from consumer chains to all validators and delegators as a reward. + +Costs a fee, which is specified in genesis.json under the "consumer_reward_denom_fee" key. Will fail if the sending account has an insufficient balance. + +Example: +$ %s tx provider register-consumer-reward-denom untrn --from mykey +`, + version.AppName, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + depositorAddr := clientCtx.GetFromAddress() + + msg := types.NewMsgRegisterConsumerRewardDenom(args[0], depositorAddr) + + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/ccv/provider/handler.go b/x/ccv/provider/handler.go index 10b92c0f71..0511bd6dab 100644 --- a/x/ccv/provider/handler.go +++ b/x/ccv/provider/handler.go @@ -18,6 +18,9 @@ func NewHandler(k *keeper.Keeper) sdk.Handler { case *types.MsgAssignConsumerKey: res, err := msgServer.AssignConsumerKey(sdk.WrapSDKContext(ctx), msg) return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgRegisterConsumerRewardDenom: + res, err := msgServer.RegisterConsumerRewardDenom(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) default: return nil, errorsmod.Wrapf(sdkerrors.ErrUnknownRequest, "unrecognized %s message type: %T", types.ModuleName, msg) } diff --git a/x/ccv/provider/ibc_module.go b/x/ccv/provider/ibc_module.go index 06bd9e39f6..49c07b9d1a 100644 --- a/x/ccv/provider/ibc_module.go +++ b/x/ccv/provider/ibc_module.go @@ -85,7 +85,7 @@ func (am AppModule) OnChanOpenTry( // the consumer chain must be excluded from the blocked addresses // blacklist or all all ibc-transfers from the consumer chain to the // provider chain will fail - ProviderFeePoolAddr: am.keeper.GetFeeCollectorAddressStr(ctx), + ProviderFeePoolAddr: am.keeper.GetConsumerRewardsPoolAddressStr(ctx), Version: ccv.Version, } mdBz, err := (&md).Marshal() diff --git a/x/ccv/provider/ibc_module_test.go b/x/ccv/provider/ibc_module_test.go index 831464ac1f..7aa0d5de04 100644 --- a/x/ccv/provider/ibc_module_test.go +++ b/x/ccv/provider/ibc_module_test.go @@ -133,7 +133,7 @@ func TestOnChanOpenTry(t *testing.T) { // Expected mock calls moduleAcct := authtypes.ModuleAccount{BaseAccount: &authtypes.BaseAccount{}} - moduleAcct.BaseAccount.Address = authtypes.NewModuleAddress(authtypes.FeeCollectorName).String() + moduleAcct.BaseAccount.Address = authtypes.NewModuleAddress(providertypes.ConsumerRewardsPool).String() // Number of calls is not asserted, since not all code paths are hit for failures gomock.InOrder( @@ -145,7 +145,7 @@ func TestOnChanOpenTry(t *testing.T) { mocks.MockClientKeeper.EXPECT().GetClientState(ctx, "clientIDToConsumer").Return( &ibctmtypes.ClientState{ChainId: "consumerChainID"}, true, ).AnyTimes(), - mocks.MockAccountKeeper.EXPECT().GetModuleAccount(ctx, authtypes.FeeCollectorName).Return(&moduleAcct).AnyTimes(), + mocks.MockAccountKeeper.EXPECT().GetModuleAccount(ctx, providertypes.ConsumerRewardsPool).Return(&moduleAcct).AnyTimes(), ) tc.mutateParams(¶ms, &providerKeeper) diff --git a/x/ccv/provider/keeper/distribution.go b/x/ccv/provider/keeper/distribution.go index b00ec81deb..75c0cf3d28 100644 --- a/x/ccv/provider/keeper/distribution.go +++ b/x/ccv/provider/keeper/distribution.go @@ -2,9 +2,95 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" + consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/x/ccv/provider/types" ) -func (k Keeper) GetFeeCollectorAddressStr(ctx sdk.Context) string { +// EndBlockRD executes EndBlock logic for the Reward Distribution sub-protocol. +// Reward Distribution follows a simple model: send tokens to the ConsumerRewardsPool, +// from where they sent to the fee collector address +func (k Keeper) EndBlockRD(ctx sdk.Context) { + // transfers all whitelisted consumer rewards to the fee collector address + k.TransferRewardsToFeeCollector(ctx) +} + +func (k Keeper) RegisterConsumerRewardDenom(ctx sdk.Context, denom string, sender sdk.AccAddress) error { + // Check if the denom is already registered + if k.ConsumerRewardDenomExists(ctx, denom) { + return consumertypes.ErrConsumerRewardDenomAlreadyRegistered + } + + // Send the consumer reward denom registration fee to the community pool + err := k.distributionKeeper.FundCommunityPool(ctx, sdk.NewCoins(k.GetConsumerRewardDenomRegistrationFee(ctx)), sender) + if err != nil { + return err + } + k.SetConsumerRewardDenom(ctx, denom) + k.Logger(ctx).Info("new consumer reward denom registered:", "denom", denom, "sender", sender.String()) + return nil +} + +func (k Keeper) GetConsumerRewardsPoolAddressStr(ctx sdk.Context) string { return k.accountKeeper.GetModuleAccount( - ctx, k.feeCollectorName).GetAddress().String() + ctx, types.ConsumerRewardsPool).GetAddress().String() +} + +func (k Keeper) SetConsumerRewardDenom( + ctx sdk.Context, + denom string, +) { + store := ctx.KVStore(k.storeKey) + store.Set(types.ConsumerRewardDenomsKey(denom), []byte{}) +} + +func (k Keeper) ConsumerRewardDenomExists( + ctx sdk.Context, + denom string, +) bool { + store := ctx.KVStore(k.storeKey) + bz := store.Get(types.ConsumerRewardDenomsKey(denom)) + return bz != nil +} + +func (k Keeper) GetAllConsumerRewardDenoms(ctx sdk.Context) (consumerRewardDenoms []string) { + store := ctx.KVStore(k.storeKey) + iterator := sdk.KVStorePrefixIterator(store, []byte{types.ConsumerRewardDenomsBytePrefix}) + + defer iterator.Close() + for ; iterator.Valid(); iterator.Next() { + key := iterator.Key()[1:] + consumerRewardDenoms = append(consumerRewardDenoms, string(key)) + } + + return consumerRewardDenoms +} + +// TransferRewardsToFeeCollector transfers all consumer rewards to the fee collector address +func (k Keeper) TransferRewardsToFeeCollector(ctx sdk.Context) { + // 1. Get the denom whitelist from the store + denoms := k.GetAllConsumerRewardDenoms(ctx) + + // 2. Iterate over the whitelist + for _, denom := range denoms { + // 3. For each denom, retrieve the balance from the consumer rewards pool + balance := k.bankKeeper.GetBalance( + ctx, + k.accountKeeper.GetModuleAccount(ctx, types.ConsumerRewardsPool).GetAddress(), + denom, + ) + + // if the balance is not zero, + if !balance.IsZero() { + // 4. Transfer the balance to the fee collector address + err := k.bankKeeper.SendCoinsFromModuleToModule( + ctx, + types.ConsumerRewardsPool, + k.feeCollectorName, + sdk.NewCoins(balance), + ) + if err != nil { + k.Logger(ctx).Error("cannot sent consumer rewards to fee collector:", "reward", balance.String()) + } + } + } } diff --git a/x/ccv/provider/keeper/distribution_test.go b/x/ccv/provider/keeper/distribution_test.go new file mode 100644 index 0000000000..35de597245 --- /dev/null +++ b/x/ccv/provider/keeper/distribution_test.go @@ -0,0 +1,48 @@ +package keeper_test + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + testutil "github.com/cosmos/interchain-security/testutil/keeper" + consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/x/ccv/provider/types" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/require" +) + +// TestRegisterConsumerRewardDenom tests the RegisterConsumerRewardDenom method. +func TestRegisterConsumerRewardDenom(t *testing.T) { + // Setup + providerKeeper, ctx, ctrl, mocks := testutil.GetProviderKeeperAndCtx(t, testutil.NewInMemKeeperParams(t)) + defer ctrl.Finish() + defaultParams := types.DefaultParams() + providerKeeper.SetParams(ctx, defaultParams) + accAddr := sdk.AccAddress([]byte("addr1")) + gomock.InOrder( + mocks.MockDistributionKeeper.EXPECT().FundCommunityPool(ctx, + sdk.NewCoins(defaultParams.ConsumerRewardDenomRegistrationFee), accAddr).Return(nil).Times(2), + ) + + // Register a consumer reward denom, confirm it's persisted as expected + err := providerKeeper.RegisterConsumerRewardDenom(ctx, "denom1", accAddr) + require.NoError(t, err) + require.True(t, providerKeeper.ConsumerRewardDenomExists(ctx, "denom1")) + allDenoms := providerKeeper.GetAllConsumerRewardDenoms(ctx) + require.Len(t, allDenoms, 1) + require.Equal(t, "denom1", allDenoms[0]) + + // Register another consumer reward denom, confirm both denoms are persisted as expected + err = providerKeeper.RegisterConsumerRewardDenom(ctx, "denom2", accAddr) + require.NoError(t, err) + require.True(t, providerKeeper.ConsumerRewardDenomExists(ctx, "denom2")) + allDenoms = providerKeeper.GetAllConsumerRewardDenoms(ctx) + require.Len(t, allDenoms, 2) + require.Equal(t, "denom1", allDenoms[0]) + require.Equal(t, "denom2", allDenoms[1]) + + // Try to register first consumer reward denom again, confirm it fails + err = providerKeeper.RegisterConsumerRewardDenom(ctx, "denom1", accAddr) + require.Error(t, err) + require.Equal(t, consumertypes.ErrConsumerRewardDenomAlreadyRegistered, err) +} diff --git a/x/ccv/provider/keeper/grpc_query.go b/x/ccv/provider/keeper/grpc_query.go index cddae5f8cf..2e8d49c539 100644 --- a/x/ccv/provider/keeper/grpc_query.go +++ b/x/ccv/provider/keeper/grpc_query.go @@ -236,3 +236,17 @@ func (k Keeper) getSlashPacketData(ctx sdk.Context, consumerChainID string, ibcS 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") + } + + ctx := sdk.UnwrapSDKContext(goCtx) + + denoms := k.GetAllConsumerRewardDenoms(ctx) + + return &types.QueryRegisteredConsumerRewardDenomsResponse{ + Denoms: denoms, + }, nil +} diff --git a/x/ccv/provider/keeper/keeper.go b/x/ccv/provider/keeper/keeper.go index 34dfa47aa5..2da6a17359 100644 --- a/x/ccv/provider/keeper/keeper.go +++ b/x/ccv/provider/keeper/keeper.go @@ -28,19 +28,21 @@ import ( // Keeper defines the Cross-Chain Validation Provider Keeper type Keeper struct { - storeKey sdk.StoreKey - cdc codec.BinaryCodec - paramSpace paramtypes.Subspace - scopedKeeper ccv.ScopedKeeper - channelKeeper ccv.ChannelKeeper - portKeeper ccv.PortKeeper - connectionKeeper ccv.ConnectionKeeper - accountKeeper ccv.AccountKeeper - clientKeeper ccv.ClientKeeper - stakingKeeper ccv.StakingKeeper - slashingKeeper ccv.SlashingKeeper - evidenceKeeper ccv.EvidenceKeeper - feeCollectorName string + storeKey sdk.StoreKey + cdc codec.BinaryCodec + paramSpace paramtypes.Subspace + scopedKeeper ccv.ScopedKeeper + channelKeeper ccv.ChannelKeeper + portKeeper ccv.PortKeeper + connectionKeeper ccv.ConnectionKeeper + clientKeeper ccv.ClientKeeper + stakingKeeper ccv.StakingKeeper + slashingKeeper ccv.SlashingKeeper + accountKeeper ccv.AccountKeeper + evidenceKeeper ccv.EvidenceKeeper + distributionKeeper ccv.DistributionKeeper + bankKeeper ccv.BankKeeper + feeCollectorName string } // NewKeeper creates a new provider Keeper instance @@ -50,6 +52,7 @@ func NewKeeper( connectionKeeper ccv.ConnectionKeeper, clientKeeper ccv.ClientKeeper, stakingKeeper ccv.StakingKeeper, slashingKeeper ccv.SlashingKeeper, accountKeeper ccv.AccountKeeper, evidenceKeeper ccv.EvidenceKeeper, + distributionKeeper ccv.DistributionKeeper, bankKeeper ccv.BankKeeper, feeCollectorName string, ) Keeper { // set KeyTable if it has not already been set @@ -58,19 +61,21 @@ func NewKeeper( } k := Keeper{ - cdc: cdc, - storeKey: key, - paramSpace: paramSpace, - scopedKeeper: scopedKeeper, - channelKeeper: channelKeeper, - portKeeper: portKeeper, - connectionKeeper: connectionKeeper, - accountKeeper: accountKeeper, - clientKeeper: clientKeeper, - stakingKeeper: stakingKeeper, - slashingKeeper: slashingKeeper, - evidenceKeeper: evidenceKeeper, - feeCollectorName: feeCollectorName, + cdc: cdc, + storeKey: key, + paramSpace: paramSpace, + scopedKeeper: scopedKeeper, + channelKeeper: channelKeeper, + portKeeper: portKeeper, + connectionKeeper: connectionKeeper, + clientKeeper: clientKeeper, + stakingKeeper: stakingKeeper, + slashingKeeper: slashingKeeper, + accountKeeper: accountKeeper, + evidenceKeeper: evidenceKeeper, + distributionKeeper: distributionKeeper, + bankKeeper: bankKeeper, + feeCollectorName: feeCollectorName, } k.mustValidateFields() @@ -81,23 +86,25 @@ func NewKeeper( // non-nil values for all its fields. Otherwise this method will panic. func (k Keeper) mustValidateFields() { // Ensures no fields are missed in this validation - if reflect.ValueOf(k).NumField() != 13 { - panic("number of fields in provider keeper is not 13") + if reflect.ValueOf(k).NumField() != 15 { + panic("number of fields in provider keeper is not 15") } - ccv.PanicIfZeroOrNil(k.cdc, "cdc") // 1 - ccv.PanicIfZeroOrNil(k.storeKey, "storeKey") // 2 - ccv.PanicIfZeroOrNil(k.paramSpace, "paramSpace") // 3 - ccv.PanicIfZeroOrNil(k.scopedKeeper, "scopedKeeper") // 4 - ccv.PanicIfZeroOrNil(k.channelKeeper, "channelKeeper") // 5 - ccv.PanicIfZeroOrNil(k.portKeeper, "portKeeper") // 6 - ccv.PanicIfZeroOrNil(k.connectionKeeper, "connectionKeeper") // 7 - ccv.PanicIfZeroOrNil(k.accountKeeper, "accountKeeper") // 8 - ccv.PanicIfZeroOrNil(k.clientKeeper, "clientKeeper") // 9 - ccv.PanicIfZeroOrNil(k.stakingKeeper, "stakingKeeper") // 10 - ccv.PanicIfZeroOrNil(k.slashingKeeper, "slashingKeeper") // 11 - ccv.PanicIfZeroOrNil(k.evidenceKeeper, "evidenceKeeper") // 12 - ccv.PanicIfZeroOrNil(k.feeCollectorName, "feeCollectorName") // 13 + ccv.PanicIfZeroOrNil(k.cdc, "cdc") // 1 + ccv.PanicIfZeroOrNil(k.storeKey, "storeKey") // 2 + ccv.PanicIfZeroOrNil(k.paramSpace, "paramSpace") // 3 + ccv.PanicIfZeroOrNil(k.scopedKeeper, "scopedKeeper") // 4 + ccv.PanicIfZeroOrNil(k.channelKeeper, "channelKeeper") // 5 + ccv.PanicIfZeroOrNil(k.portKeeper, "portKeeper") // 6 + ccv.PanicIfZeroOrNil(k.connectionKeeper, "connectionKeeper") // 7 + ccv.PanicIfZeroOrNil(k.accountKeeper, "accountKeeper") // 8 + ccv.PanicIfZeroOrNil(k.clientKeeper, "clientKeeper") // 9 + ccv.PanicIfZeroOrNil(k.stakingKeeper, "stakingKeeper") // 10 + ccv.PanicIfZeroOrNil(k.slashingKeeper, "slashingKeeper") // 11 + ccv.PanicIfZeroOrNil(k.evidenceKeeper, "evidenceKeeper") // 12 + ccv.PanicIfZeroOrNil(k.distributionKeeper, "distributionKeeper") // 13 + ccv.PanicIfZeroOrNil(k.bankKeeper, "bankKeeper") // 14 + ccv.PanicIfZeroOrNil(k.feeCollectorName, "feeCollectorName") // 15 } // Logger returns a module-specific logger. diff --git a/x/ccv/provider/keeper/msg_server.go b/x/ccv/provider/keeper/msg_server.go index 184984494f..f817643410 100644 --- a/x/ccv/provider/keeper/msg_server.go +++ b/x/ccv/provider/keeper/msg_server.go @@ -105,3 +105,24 @@ func (k msgServer) AssignConsumerKey(goCtx context.Context, msg *types.MsgAssign return &types.MsgAssignConsumerKeyResponse{}, nil } + +func (k msgServer) RegisterConsumerRewardDenom(goCtx context.Context, msg *types.MsgRegisterConsumerRewardDenom) (*types.MsgRegisterConsumerRewardDenomResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + depositer, err := sdk.AccAddressFromBech32(msg.Depositor) + if err != nil { + return nil, err + } + + if err := k.Keeper.RegisterConsumerRewardDenom(ctx, msg.Denom, depositer); err != nil { + return nil, err + } + + ctx.EventManager().EmitEvent(sdk.NewEvent( + ccvtypes.EventTypeRegisterConsumerRewardDenom, + sdk.NewAttribute(ccvtypes.AttributeConsumerRewardDenom, msg.Denom), + sdk.NewAttribute(ccvtypes.AttributeConsumerRewardDepositor, msg.Depositor), + )) + + return &types.MsgRegisterConsumerRewardDenomResponse{}, nil +} diff --git a/x/ccv/provider/keeper/params.go b/x/ccv/provider/keeper/params.go index 8484dd2426..d4cb5a85ab 100644 --- a/x/ccv/provider/keeper/params.go +++ b/x/ccv/provider/keeper/params.go @@ -77,6 +77,15 @@ func (k Keeper) GetMaxThrottledPackets(ctx sdk.Context) int64 { 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 + // need to run migrations to add the param. This will allow us to change the fee by governance. + var c sdk.Coin + k.paramSpace.Get(ctx, types.KeyConsumerRewardDenomRegistrationFee, &c) + return c +} + // GetParams returns the paramset for the provider module func (k Keeper) GetParams(ctx sdk.Context) types.Params { return types.NewParams( @@ -88,6 +97,7 @@ func (k Keeper) GetParams(ctx sdk.Context) types.Params { 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 f0c749bcf6..d4b83c1cd0 100644 --- a/x/ccv/provider/keeper/params_test.go +++ b/x/ccv/provider/keeper/params_test.go @@ -4,6 +4,7 @@ import ( "testing" "time" + sdk "github.com/cosmos/cosmos-sdk/types" clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" commitmenttypes "github.com/cosmos/ibc-go/v4/modules/core/23-commitment/types" ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" @@ -44,6 +45,10 @@ func TestParams(t *testing.T) { time.Hour, "0.4", 100, + sdk.Coin{ + Denom: "stake", + Amount: sdk.NewInt(10000000), + }, ) providerKeeper.SetParams(ctx, newParams) params = providerKeeper.GetParams(ctx) diff --git a/x/ccv/provider/keeper/proposal.go b/x/ccv/provider/keeper/proposal.go index aa3147b74b..0fcfac55f8 100644 --- a/x/ccv/provider/keeper/proposal.go +++ b/x/ccv/provider/keeper/proposal.go @@ -311,6 +311,8 @@ func (k Keeper) MakeConsumerGenesis( prop.HistoricalEntries, prop.UnbondingPeriod, "0.05", + []string{}, + []string{}, ) gen = *consumertypes.NewInitialGenesisState( diff --git a/x/ccv/provider/keeper/proposal_test.go b/x/ccv/provider/keeper/proposal_test.go index 9ef1d594aa..c1c98648dc 100644 --- a/x/ccv/provider/keeper/proposal_test.go +++ b/x/ccv/provider/keeper/proposal_test.go @@ -819,6 +819,10 @@ func TestMakeConsumerGenesis(t *testing.T) { SlashMeterReplenishPeriod: providertypes.DefaultSlashMeterReplenishPeriod, SlashMeterReplenishFraction: providertypes.DefaultSlashMeterReplenishFraction, MaxThrottledPackets: providertypes.DefaultMaxThrottledPackets, + ConsumerRewardDenomRegistrationFee: sdk.Coin{ + Denom: "stake", + Amount: sdk.NewInt(1000000), + }, } providerKeeper.SetParams(ctx, moduleParams) defer ctrl.Finish() @@ -845,7 +849,7 @@ func TestMakeConsumerGenesis(t *testing.T) { actualGenesis, _, err := providerKeeper.MakeConsumerGenesis(ctx, &prop) require.NoError(t, err) - jsonString := `{"params":{"enabled":true, "blocks_per_distribution_transmission":1000, "ccv_timeout_period":2419200000000000, "transfer_timeout_period": 3600000000000, "consumer_redistribution_fraction":"0.75", "historical_entries":10000, "unbonding_period": 1728000000000000, "soft_opt_out_threshold": "0.05"},"new_chain":true,"provider_client_state":{"chain_id":"testchain1","trust_level":{"numerator":1,"denominator":3},"trusting_period":1197504000000000,"unbonding_period":1814400000000000,"max_clock_drift":10000000000,"frozen_height":{},"latest_height":{"revision_height":5},"proof_specs":[{"leaf_spec":{"hash":1,"prehash_value":1,"length":1,"prefix":"AA=="},"inner_spec":{"child_order":[0,1],"child_size":33,"min_prefix_length":4,"max_prefix_length":12,"hash":1}},{"leaf_spec":{"hash":1,"prehash_value":1,"length":1,"prefix":"AA=="},"inner_spec":{"child_order":[0,1],"child_size":32,"min_prefix_length":1,"max_prefix_length":1,"hash":1}}],"upgrade_path":["upgrade","upgradedIBCState"],"allow_update_after_expiry":true,"allow_update_after_misbehaviour":true},"provider_consensus_state":{"timestamp":"2020-01-02T00:00:10Z","root":{"hash":"LpGpeyQVLUo9HpdsgJr12NP2eCICspcULiWa5u9udOA="},"next_validators_hash":"E30CE736441FB9101FADDAF7E578ABBE6DFDB67207112350A9A904D554E1F5BE"},"unbonding_sequences":null,"initial_val_set":[{"pub_key":{"type":"tendermint/PubKeyEd25519","value":"dcASx5/LIKZqagJWN0frOlFtcvz91frYmj/zmoZRWro="},"power":1}]}` + jsonString := `{"params":{"enabled":true, "blocks_per_distribution_transmission":1000, "ccv_timeout_period":2419200000000000, "transfer_timeout_period": 3600000000000, "consumer_redistribution_fraction":"0.75", "historical_entries":10000, "unbonding_period": 1728000000000000, "soft_opt_out_threshold": "0.05", "reward_denoms": [], "provider_reward_denoms": []},"new_chain":true,"provider_client_state":{"chain_id":"testchain1","trust_level":{"numerator":1,"denominator":3},"trusting_period":1197504000000000,"unbonding_period":1814400000000000,"max_clock_drift":10000000000,"frozen_height":{},"latest_height":{"revision_height":5},"proof_specs":[{"leaf_spec":{"hash":1,"prehash_value":1,"length":1,"prefix":"AA=="},"inner_spec":{"child_order":[0,1],"child_size":33,"min_prefix_length":4,"max_prefix_length":12,"hash":1}},{"leaf_spec":{"hash":1,"prehash_value":1,"length":1,"prefix":"AA=="},"inner_spec":{"child_order":[0,1],"child_size":32,"min_prefix_length":1,"max_prefix_length":1,"hash":1}}],"upgrade_path":["upgrade","upgradedIBCState"],"allow_update_after_expiry":true,"allow_update_after_misbehaviour":true},"provider_consensus_state":{"timestamp":"2020-01-02T00:00:10Z","root":{"hash":"LpGpeyQVLUo9HpdsgJr12NP2eCICspcULiWa5u9udOA="},"next_validators_hash":"E30CE736441FB9101FADDAF7E578ABBE6DFDB67207112350A9A904D554E1F5BE"},"unbonding_sequences":null,"initial_val_set":[{"pub_key":{"type":"tendermint/PubKeyEd25519","value":"dcASx5/LIKZqagJWN0frOlFtcvz91frYmj/zmoZRWro="},"power":1}]}` var expectedGenesis consumertypes.GenesisState err = json.Unmarshal([]byte(jsonString), &expectedGenesis) diff --git a/x/ccv/provider/module.go b/x/ccv/provider/module.go index cba9af2ae7..39347f9709 100644 --- a/x/ccv/provider/module.go +++ b/x/ccv/provider/module.go @@ -163,6 +163,8 @@ func (am AppModule) EndBlock(ctx sdk.Context, req abci.RequestEndBlock) []abci.V am.keeper.EndBlockCCR(ctx) // EndBlock logic needed for the Validator Set Update sub-protocol am.keeper.EndBlockVSU(ctx) + // EndBlock logic need for the Reward Distribution sub-protocol + am.keeper.EndBlockRD(ctx) return []abci.ValidatorUpdate{} } diff --git a/x/ccv/provider/types/codec.go b/x/ccv/provider/types/codec.go index 97772e7f00..3e4b34dd42 100644 --- a/x/ccv/provider/types/codec.go +++ b/x/ccv/provider/types/codec.go @@ -27,10 +27,15 @@ func RegisterInterfaces(registry codectypes.InterfaceRegistry) { (*sdk.Msg)(nil), &MsgAssignConsumerKey{}, ) + registry.RegisterImplementations( + (*sdk.Msg)(nil), + &MsgRegisterConsumerRewardDenom{}, + ) registry.RegisterImplementations( (*govtypes.Content)(nil), &EquivocationProposal{}, ) + msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) } diff --git a/x/ccv/provider/types/errors.go b/x/ccv/provider/types/errors.go index bc5af3cacf..12fbfbe9c2 100644 --- a/x/ccv/provider/types/errors.go +++ b/x/ccv/provider/types/errors.go @@ -19,4 +19,6 @@ var ( ErrCannotAssignDefaultKeyAssignment = errorsmod.Register(ModuleName, 11, "cannot re-assign default key assignment") ErrInvalidConsumerParams = errorsmod.Register(ModuleName, 12, "invalid consumer params") 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") ) diff --git a/x/ccv/provider/types/genesis_test.go b/x/ccv/provider/types/genesis_test.go index 3d39beab7d..2c908686a7 100644 --- a/x/ccv/provider/types/genesis_test.go +++ b/x/ccv/provider/types/genesis_test.go @@ -4,6 +4,7 @@ import ( "testing" "time" + sdk "github.com/cosmos/cosmos-sdk/types" clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" commitmenttypes "github.com/cosmos/ibc-go/v4/modules/core/23-commitment/types" ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" @@ -74,7 +75,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"}, true, false), - types.DefaultTrustingPeriodFraction, time.Hour, time.Hour, 30*time.Minute, time.Hour, "0.1", 400), + types.DefaultTrustingPeriodFraction, time.Hour, time.Hour, 30*time.Minute, time.Hour, "0.1", 400, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), nil, nil, nil, @@ -93,7 +94,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"}, true, false), - types.DefaultTrustingPeriodFraction, time.Hour, time.Hour, 30*time.Minute, time.Hour, "0.1", 400), + types.DefaultTrustingPeriodFraction, time.Hour, time.Hour, 30*time.Minute, time.Hour, "0.1", 400, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), nil, nil, nil, @@ -112,7 +113,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"}, true, false), - types.DefaultTrustingPeriodFraction, time.Hour, time.Hour, 30*time.Minute, time.Hour, "0.1", 400), + types.DefaultTrustingPeriodFraction, time.Hour, time.Hour, 30*time.Minute, time.Hour, "0.1", 400, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), nil, nil, nil, @@ -131,7 +132,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"}, true, false), - types.DefaultTrustingPeriodFraction, time.Hour, time.Hour, 30*time.Minute, time.Hour, "0.1", 400), + types.DefaultTrustingPeriodFraction, time.Hour, time.Hour, 30*time.Minute, time.Hour, "0.1", 400, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), nil, nil, nil, @@ -156,7 +157,7 @@ func TestValidateGenesisState(t *testing.T) { types.DefaultVscTimeoutPeriod, types.DefaultSlashMeterReplenishPeriod, types.DefaultSlashMeterReplenishFraction, - types.DefaultMaxThrottledPackets), + types.DefaultMaxThrottledPackets, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), nil, nil, nil, @@ -181,7 +182,7 @@ func TestValidateGenesisState(t *testing.T) { types.DefaultVscTimeoutPeriod, types.DefaultSlashMeterReplenishPeriod, types.DefaultSlashMeterReplenishFraction, - types.DefaultMaxThrottledPackets), + types.DefaultMaxThrottledPackets, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), nil, nil, nil, @@ -206,7 +207,7 @@ func TestValidateGenesisState(t *testing.T) { types.DefaultVscTimeoutPeriod, types.DefaultSlashMeterReplenishPeriod, types.DefaultSlashMeterReplenishFraction, - types.DefaultMaxThrottledPackets), + types.DefaultMaxThrottledPackets, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(1000000)}), nil, nil, nil, @@ -231,7 +232,7 @@ func TestValidateGenesisState(t *testing.T) { types.DefaultVscTimeoutPeriod, types.DefaultSlashMeterReplenishPeriod, types.DefaultSlashMeterReplenishFraction, - types.DefaultMaxThrottledPackets), + types.DefaultMaxThrottledPackets, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), nil, nil, nil, @@ -256,7 +257,7 @@ func TestValidateGenesisState(t *testing.T) { 0, // 0 vsc timeout here types.DefaultSlashMeterReplenishPeriod, types.DefaultSlashMeterReplenishFraction, - types.DefaultMaxThrottledPackets), + types.DefaultMaxThrottledPackets, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), nil, nil, nil, @@ -281,7 +282,7 @@ func TestValidateGenesisState(t *testing.T) { types.DefaultVscTimeoutPeriod, 0, // 0 slash meter replenish period here types.DefaultSlashMeterReplenishFraction, - types.DefaultMaxThrottledPackets), + types.DefaultMaxThrottledPackets, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), nil, nil, nil, @@ -306,7 +307,7 @@ func TestValidateGenesisState(t *testing.T) { types.DefaultVscTimeoutPeriod, types.DefaultSlashMeterReplenishPeriod, "1.15", - types.DefaultMaxThrottledPackets), + types.DefaultMaxThrottledPackets, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), nil, nil, nil, @@ -331,7 +332,7 @@ func TestValidateGenesisState(t *testing.T) { types.DefaultVscTimeoutPeriod, types.DefaultSlashMeterReplenishPeriod, "1.15", - -1), + -1, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), nil, nil, nil, @@ -643,6 +644,44 @@ func TestValidateGenesisState(t *testing.T) { ), false, }, + { + "invalid params- invalid consumer registration fee denom", + types.NewGenesisState( + types.DefaultValsetUpdateID, + nil, + []types.ConsumerState{{ChainId: "chainid-1", ChannelId: "channelid", ClientId: "client-id", ConsumerGenesis: getInitialConsumerGenesis(t, "chainid-1")}}, + nil, + nil, + nil, + nil, + types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, + time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}, true, false), + types.DefaultTrustingPeriodFraction, time.Hour, time.Hour, 30*time.Minute, time.Hour, "0.1", 400, sdk.Coin{Denom: "st", Amount: sdk.NewInt(10000000)}), + nil, + nil, + nil, + ), + false, + }, + { + "invalid params- invalid consumer registration fee amount", + types.NewGenesisState( + types.DefaultValsetUpdateID, + nil, + []types.ConsumerState{{ChainId: "chainid-1", ChannelId: "channelid", ClientId: "client-id", ConsumerGenesis: getInitialConsumerGenesis(t, "chainid-1")}}, + nil, + nil, + nil, + nil, + types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, + time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}, true, false), + types.DefaultTrustingPeriodFraction, time.Hour, time.Hour, 30*time.Minute, time.Hour, "0.1", 400, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(-1000000)}), + nil, + nil, + nil, + ), + false, + }, } for _, tc := range testCases { diff --git a/x/ccv/provider/types/keys.go b/x/ccv/provider/types/keys.go index 18218cf560..65d57da9e4 100644 --- a/x/ccv/provider/types/keys.go +++ b/x/ccv/provider/types/keys.go @@ -28,6 +28,9 @@ const ( // Default validator set update ID DefaultValsetUpdateID = 1 + + // This address receives rewards from consumer chains + ConsumerRewardsPool = "consumer_rewards_pool" ) // Iota generated keys/byte prefixes (as a byte), supports 256 possible values @@ -128,6 +131,9 @@ const ( // denoting whether the provider address has committed any double signign infractions SlashLogBytePrefix + // ConsumerRewardDenomsBytePrefix is the byte prefix that will store a list of consumer reward denoms + ConsumerRewardDenomsBytePrefix + // NOTE: DO NOT ADD NEW BYTE PREFIXES HERE WITHOUT ADDING THEM TO getAllKeyPrefixes() IN keys_test.go ) @@ -362,6 +368,11 @@ func SlashLogKey(providerAddr ProviderConsAddress) []byte { return append([]byte{SlashLogBytePrefix}, providerAddr.ToSdkConsAddr().Bytes()...) } +// ConsumerRewardDenomsKey returns the key under which consumer reward denoms are stored +func ConsumerRewardDenomsKey(denom string) []byte { + return append([]byte{ConsumerRewardDenomsBytePrefix}, []byte(denom)...) +} + // NOTE: DO NOT ADD FULLY DEFINED KEY FUNCTIONS WITHOUT ADDING THEM TO getAllFullyDefinedKeys() IN keys_test.go // diff --git a/x/ccv/provider/types/msg.go b/x/ccv/provider/types/msg.go index 901aa03600..67ad99d10c 100644 --- a/x/ccv/provider/types/msg.go +++ b/x/ccv/provider/types/msg.go @@ -9,7 +9,8 @@ import ( // provider message types const ( - TypeMsgAssignConsumerKey = "assign_consumer_key" + TypeMsgAssignConsumerKey = "assign_consumer_key" + TypeMsgRegisterConsumerRewardDenom = "register_consumer_reward_denom" ) var _ sdk.Msg = &MsgAssignConsumerKey{} @@ -93,3 +94,48 @@ func ParseConsumerKeyFromJson(jsonStr string) (pkType, key string, err error) { } return pubKey.Type, pubKey.Key, nil } + +// NewMsgRegisterConsumerRewardDenom returns a new MsgRegisterConsumerRewardDenom with a sender and +// a funding amount. +func NewMsgRegisterConsumerRewardDenom(denom string, depositor sdk.AccAddress) *MsgRegisterConsumerRewardDenom { + return &MsgRegisterConsumerRewardDenom{ + Denom: denom, + Depositor: depositor.String(), + } +} + +// Route returns the MsgRegisterConsumerRewardDenom message route. +func (msg MsgRegisterConsumerRewardDenom) Route() string { return ModuleName } + +// Type returns the MsgRegisterConsumerRewardDenom message type. +func (msg MsgRegisterConsumerRewardDenom) Type() string { return TypeMsgRegisterConsumerRewardDenom } + +// GetSigners returns the signer addresses that are expected to sign the result +// of GetSignBytes. +func (msg MsgRegisterConsumerRewardDenom) GetSigners() []sdk.AccAddress { + depoAddr, err := sdk.AccAddressFromBech32(msg.Depositor) + if err != nil { + panic(err) + } + return []sdk.AccAddress{depoAddr} +} + +// GetSignBytes returns the raw bytes for a MsgRegisterConsumerRewardDenom message that +// the expected signer needs to sign. +func (msg MsgRegisterConsumerRewardDenom) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(&msg) + return sdk.MustSortJSON(bz) +} + +// ValidateBasic performs basic MsgRegisterConsumerRewardDenom message validation. +func (msg MsgRegisterConsumerRewardDenom) ValidateBasic() error { + if !sdk.NewCoin(msg.Denom, sdk.NewInt(0)).IsValid() { + return ErrInvalidConsumerRewardDenom + } + _, err := sdk.AccAddressFromBech32(msg.Depositor) + if err != nil { + return ErrInvalidDepositorAddress + } + + return nil +} diff --git a/x/ccv/provider/types/params.go b/x/ccv/provider/types/params.go index f1d96d4247..4bfb906f4b 100644 --- a/x/ccv/provider/types/params.go +++ b/x/ccv/provider/types/params.go @@ -4,6 +4,7 @@ import ( "fmt" "time" + sdk "github.com/cosmos/cosmos-sdk/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" commitmenttypes "github.com/cosmos/ibc-go/v4/modules/core/23-commitment/types" @@ -42,13 +43,14 @@ const ( // Reflection based keys for params subspace var ( - KeyTemplateClient = []byte("TemplateClient") - KeyTrustingPeriodFraction = []byte("TrustingPeriodFraction") - KeyInitTimeoutPeriod = []byte("InitTimeoutPeriod") - KeyVscTimeoutPeriod = []byte("VscTimeoutPeriod") - KeySlashMeterReplenishPeriod = []byte("SlashMeterReplenishPeriod") - KeySlashMeterReplenishFraction = []byte("SlashMeterReplenishFraction") - KeyMaxThrottledPackets = []byte("MaxThrottledPackets") + KeyTemplateClient = []byte("TemplateClient") + KeyTrustingPeriodFraction = []byte("TrustingPeriodFraction") + KeyInitTimeoutPeriod = []byte("InitTimeoutPeriod") + KeyVscTimeoutPeriod = []byte("VscTimeoutPeriod") + KeySlashMeterReplenishPeriod = []byte("SlashMeterReplenishPeriod") + KeySlashMeterReplenishFraction = []byte("SlashMeterReplenishFraction") + KeyMaxThrottledPackets = []byte("MaxThrottledPackets") + KeyConsumerRewardDenomRegistrationFee = []byte("ConsumerRewardDenomRegistrationFee") ) // ParamKeyTable returns a key table with the necessary registered provider params @@ -66,16 +68,18 @@ func NewParams( slashMeterReplenishPeriod time.Duration, slashMeterReplenishFraction string, maxThrottledPackets int64, + consumerRewardDenomRegistrationFee sdk.Coin, ) Params { return Params{ - TemplateClient: cs, - TrustingPeriodFraction: trustingPeriodFraction, - CcvTimeoutPeriod: ccvTimeoutPeriod, - InitTimeoutPeriod: initTimeoutPeriod, - VscTimeoutPeriod: vscTimeoutPeriod, - SlashMeterReplenishPeriod: slashMeterReplenishPeriod, - SlashMeterReplenishFraction: slashMeterReplenishFraction, - MaxThrottledPackets: maxThrottledPackets, + TemplateClient: cs, + TrustingPeriodFraction: trustingPeriodFraction, + CcvTimeoutPeriod: ccvTimeoutPeriod, + InitTimeoutPeriod: initTimeoutPeriod, + VscTimeoutPeriod: vscTimeoutPeriod, + SlashMeterReplenishPeriod: slashMeterReplenishPeriod, + SlashMeterReplenishFraction: slashMeterReplenishFraction, + MaxThrottledPackets: maxThrottledPackets, + ConsumerRewardDenomRegistrationFee: consumerRewardDenomRegistrationFee, } } @@ -103,6 +107,12 @@ func DefaultParams() Params { 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{ + Denom: sdk.DefaultBondDenom, + Amount: sdk.NewInt(10000000), + }, ) } @@ -135,6 +145,9 @@ func (p Params) Validate() error { 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) + } return nil } @@ -149,6 +162,7 @@ func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { 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), } } @@ -178,3 +192,16 @@ func validateTemplateClient(i interface{}) error { } return nil } + +func validateCoin(i interface{}) error { + v, ok := i.(sdk.Coin) + if !ok { + return fmt.Errorf("invalid parameter type: %T", i) + } + + if !v.IsValid() { + return fmt.Errorf("invalid consumer reward denom registration fee: %s", v) + } + + return nil +} diff --git a/x/ccv/provider/types/params_test.go b/x/ccv/provider/types/params_test.go index acee7abe11..b0e4e8485d 100644 --- a/x/ccv/provider/types/params_test.go +++ b/x/ccv/provider/types/params_test.go @@ -4,6 +4,7 @@ import ( "testing" "time" + sdk "github.com/cosmos/cosmos-sdk/types" clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" commitmenttypes "github.com/cosmos/ibc-go/v4/modules/core/23-commitment/types" ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" @@ -21,35 +22,41 @@ func TestValidateParams(t *testing.T) { {"default params", types.DefaultParams(), true}, {"custom valid params", types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}, true, false), - "0.33", time.Hour, time.Hour, time.Hour, 30*time.Minute, "0.1", 100), true}, + "0.33", time.Hour, time.Hour, time.Hour, 30*time.Minute, "0.1", 100, 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"}, true, false), - "0.33", time.Hour, time.Hour, time.Hour, 30*time.Minute, "0.1", 100), false}, + "0.33", time.Hour, time.Hour, time.Hour, 30*time.Minute, "0.1", 100, 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), false}, - {"nil client", types.NewParams(nil, "0.33", time.Hour, time.Hour, time.Hour, 30*time.Minute, "0.1", 100), false}, + "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}, // 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"}, true, false), - "0.00", time.Hour, time.Hour, time.Hour, 30*time.Minute, "0.1", 100), true}, + "0.00", time.Hour, time.Hour, time.Hour, 30*time.Minute, "0.1", 100, 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"}, true, false), - "0.33", 0, time.Hour, time.Hour, 30*time.Minute, "0.1", 100), false}, + "0.33", 0, time.Hour, time.Hour, 30*time.Minute, "0.1", 100, 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"}, true, false), - "0.33", time.Hour, 0, time.Hour, 30*time.Minute, "0.1", 100), false}, + "0.33", time.Hour, 0, time.Hour, 30*time.Minute, "0.1", 100, 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"}, true, false), - "0.33", time.Hour, time.Hour, 0, 30*time.Minute, "0.1", 100), false}, + "0.33", time.Hour, time.Hour, 0, 30*time.Minute, "0.1", 100, 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"}, true, false), - "0.33", time.Hour, time.Hour, 24*time.Hour, 0, "0.1", 100), false}, + "0.33", time.Hour, time.Hour, 24*time.Hour, 0, "0.1", 100, 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"}, true, false), - "0.33", time.Hour, time.Hour, 24*time.Hour, time.Hour, "1.5", 100), false}, + "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"}, true, false), - "0.33", time.Hour, time.Hour, 24*time.Hour, time.Hour, "0.1", -100), false}, + "0.33", time.Hour, time.Hour, 24*time.Hour, time.Hour, "0.1", -100, 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"}, true, false), + "0.33", time.Hour, time.Hour, 24*time.Hour, time.Hour, "0.1", -100, 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"}, true, false), + "0.33", time.Hour, time.Hour, 24*time.Hour, time.Hour, "0.1", -100, 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 ec9ef7f40c..edcf40dcc6 100644 --- a/x/ccv/provider/types/provider.pb.go +++ b/x/ccv/provider/types/provider.pb.go @@ -5,6 +5,7 @@ package types import ( fmt "fmt" + types3 "github.com/cosmos/cosmos-sdk/types" types1 "github.com/cosmos/cosmos-sdk/x/evidence/types" types "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" types2 "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" @@ -346,6 +347,8 @@ type Params struct { // 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 types3.Coin `protobuf:"bytes,9,opt,name=consumer_reward_denom_registration_fee,json=consumerRewardDenomRegistrationFee,proto3" json:"consumer_reward_denom_registration_fee"` } func (m *Params) Reset() { *m = Params{} } @@ -437,6 +440,13 @@ func (m *Params) GetMaxThrottledPackets() int64 { return 0 } +func (m *Params) GetConsumerRewardDenomRegistrationFee() types3.Coin { + if m != nil { + return m.ConsumerRewardDenomRegistrationFee + } + return types3.Coin{} +} + type HandshakeMetadata struct { ProviderFeePoolAddr string `protobuf:"bytes,1,opt,name=provider_fee_pool_addr,json=providerFeePoolAddr,proto3" json:"provider_fee_pool_addr,omitempty"` Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` @@ -1302,106 +1312,109 @@ func init() { } var fileDescriptor_f22ec409a72b7b72 = []byte{ - // 1570 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0xcd, 0x6e, 0x1b, 0xc9, - 0x11, 0xd6, 0x90, 0xd4, 0x0f, 0x9b, 0xfa, 0x1d, 0xc9, 0x2b, 0xca, 0x51, 0x28, 0xee, 0xe4, 0x07, - 0x0c, 0x82, 0x1d, 0x42, 0x5a, 0x2c, 0xb0, 0x10, 0x12, 0x2c, 0x24, 0x7a, 0x77, 0xa5, 0x28, 0xbb, - 0xe6, 0x8e, 0x18, 0x05, 0x49, 0x10, 0x0c, 0x7a, 0x7a, 0x5a, 0x64, 0x43, 0x33, 0xd3, 0xe3, 0xee, - 0x9e, 0x59, 0xf3, 0x0d, 0x72, 0x5c, 0x20, 0x97, 0x05, 0x72, 0xf1, 0x25, 0x87, 0x9c, 0xf2, 0x1a, - 0x06, 0x72, 0xf1, 0x21, 0x87, 0x9c, 0x9c, 0x40, 0x7e, 0x03, 0x3f, 0x41, 0xd0, 0x3d, 0xbf, 0xa4, - 0x69, 0x9b, 0x82, 0xbd, 0xb7, 0xe9, 0xea, 0xaa, 0xaf, 0xba, 0xaa, 0xab, 0xbe, 0x6a, 0x12, 0x1c, - 0x91, 0x40, 0x60, 0x86, 0x46, 0x90, 0x04, 0x36, 0xc7, 0x28, 0x62, 0x44, 0x8c, 0xbb, 0x08, 0xc5, - 0xdd, 0x90, 0xd1, 0x98, 0xb8, 0x98, 0x75, 0xe3, 0xc3, 0xfc, 0xdb, 0x0c, 0x19, 0x15, 0x54, 0xff, - 0xc9, 0x0c, 0x1b, 0x13, 0xa1, 0xd8, 0xcc, 0xf5, 0xe2, 0xc3, 0xfb, 0x3b, 0x43, 0x3a, 0xa4, 0x4a, - 0xbf, 0x2b, 0xbf, 0x12, 0xd3, 0xfb, 0x07, 0x43, 0x4a, 0x87, 0x1e, 0xee, 0xaa, 0x95, 0x13, 0x5d, - 0x77, 0x05, 0xf1, 0x31, 0x17, 0xd0, 0x0f, 0x53, 0x85, 0xd6, 0xb4, 0x82, 0x1b, 0x31, 0x28, 0x08, - 0x0d, 0x32, 0x00, 0xe2, 0xa0, 0x2e, 0xa2, 0x0c, 0x77, 0x91, 0x47, 0x70, 0x20, 0xe4, 0xf1, 0x92, - 0xaf, 0x54, 0xa1, 0x2b, 0x15, 0x3c, 0x32, 0x1c, 0x89, 0x44, 0xcc, 0xbb, 0x02, 0x07, 0x2e, 0x66, - 0x3e, 0x49, 0x94, 0x8b, 0x55, 0x6a, 0xb0, 0x5f, 0xda, 0x47, 0x6c, 0x1c, 0x0a, 0xda, 0xbd, 0xc1, - 0x63, 0x9e, 0xee, 0xfe, 0x1c, 0x51, 0xee, 0x53, 0xde, 0xc5, 0x32, 0xb0, 0x00, 0xe1, 0x6e, 0x7c, - 0xe8, 0x60, 0x01, 0x0f, 0x73, 0x41, 0xa2, 0x67, 0xfc, 0x75, 0x09, 0x34, 0x7b, 0x34, 0xe0, 0x91, - 0x8f, 0xd9, 0x89, 0xeb, 0x12, 0x79, 0xe4, 0x3e, 0xa3, 0x21, 0xe5, 0xd0, 0xd3, 0x77, 0xc0, 0xa2, - 0x20, 0xc2, 0xc3, 0x4d, 0xad, 0xad, 0x75, 0xea, 0x56, 0xb2, 0xd0, 0xdb, 0xa0, 0xe1, 0x62, 0x8e, - 0x18, 0x09, 0xa5, 0x72, 0xb3, 0xa2, 0xf6, 0xca, 0x22, 0x7d, 0x0f, 0xac, 0x24, 0x59, 0x26, 0x6e, - 0xb3, 0xaa, 0xb6, 0x97, 0xd5, 0xfa, 0xdc, 0xd5, 0xbf, 0x04, 0xeb, 0x24, 0x20, 0x82, 0x40, 0xcf, - 0x1e, 0x61, 0x19, 0x6d, 0xb3, 0xd6, 0xd6, 0x3a, 0x8d, 0xa3, 0xfb, 0x26, 0x71, 0x90, 0x29, 0x13, - 0x64, 0xa6, 0x69, 0x89, 0x0f, 0xcd, 0x33, 0xa5, 0x71, 0x5a, 0x7b, 0xfa, 0xfc, 0x60, 0xc1, 0x5a, - 0x4b, 0xed, 0x12, 0xa1, 0xfe, 0x21, 0x58, 0x1d, 0xe2, 0x00, 0x73, 0xc2, 0xed, 0x11, 0xe4, 0xa3, - 0xe6, 0x62, 0x5b, 0xeb, 0xac, 0x5a, 0x8d, 0x54, 0x76, 0x06, 0xf9, 0x48, 0x3f, 0x00, 0x0d, 0x87, - 0x04, 0x90, 0x8d, 0x13, 0x8d, 0x25, 0xa5, 0x01, 0x12, 0x91, 0x52, 0xe8, 0x01, 0xc0, 0x43, 0xf8, - 0x6d, 0x60, 0xcb, 0xdb, 0x6c, 0x2e, 0xa7, 0x07, 0x49, 0x6e, 0xd2, 0xcc, 0x6e, 0xd2, 0x1c, 0x64, - 0x57, 0x7d, 0xba, 0x22, 0x0f, 0xf2, 0xdd, 0x7f, 0x0f, 0x34, 0xab, 0xae, 0xec, 0xe4, 0x8e, 0xfe, - 0x35, 0xd8, 0x8c, 0x02, 0x87, 0x06, 0x2e, 0x09, 0x86, 0x76, 0x88, 0x19, 0xa1, 0x6e, 0x73, 0x45, - 0x41, 0xed, 0xbd, 0x02, 0xf5, 0x20, 0x2d, 0x8a, 0x04, 0xe9, 0x7b, 0x89, 0xb4, 0x91, 0x1b, 0xf7, - 0x95, 0xad, 0xfe, 0x0d, 0xd0, 0x11, 0x8a, 0xd5, 0x91, 0x68, 0x24, 0x32, 0xc4, 0xfa, 0xfc, 0x88, - 0x9b, 0x08, 0xc5, 0x83, 0xc4, 0x3a, 0x85, 0xfc, 0x13, 0xd8, 0x15, 0x0c, 0x06, 0xfc, 0x1a, 0xb3, - 0x69, 0x5c, 0x30, 0x3f, 0xee, 0xbd, 0x0c, 0x63, 0x12, 0xfc, 0x0c, 0xb4, 0x51, 0x5a, 0x40, 0x36, - 0xc3, 0x2e, 0xe1, 0x82, 0x11, 0x27, 0x92, 0xb6, 0xf6, 0x35, 0x83, 0x48, 0xd5, 0x48, 0x43, 0x15, - 0x41, 0x2b, 0xd3, 0xb3, 0x26, 0xd4, 0xbe, 0x48, 0xb5, 0xf4, 0x87, 0xe0, 0xa7, 0x8e, 0x47, 0xd1, - 0x0d, 0x97, 0x87, 0xb3, 0x27, 0x90, 0x94, 0x6b, 0x9f, 0x70, 0x2e, 0xd1, 0x56, 0xdb, 0x5a, 0xa7, - 0x6a, 0x7d, 0x98, 0xe8, 0xf6, 0x31, 0x7b, 0x50, 0xd2, 0x1c, 0x94, 0x14, 0xf5, 0x8f, 0x80, 0x3e, - 0x22, 0x5c, 0x50, 0x46, 0x10, 0xf4, 0x6c, 0x1c, 0x08, 0x46, 0x30, 0x6f, 0xae, 0x29, 0xf3, 0xad, - 0x62, 0xe7, 0xf3, 0x64, 0xe3, 0x78, 0xe5, 0x2f, 0x4f, 0x0e, 0x16, 0xbe, 0x7f, 0x72, 0xb0, 0x60, - 0xfc, 0x53, 0x03, 0xbb, 0xbd, 0xfc, 0xb0, 0x3e, 0x8d, 0xa1, 0xf7, 0x43, 0x36, 0xc5, 0x09, 0xa8, - 0x73, 0x41, 0xc3, 0xa4, 0x0c, 0x6b, 0x77, 0x28, 0xc3, 0x15, 0x69, 0x26, 0x37, 0x8c, 0xbf, 0x69, - 0x60, 0xe7, 0xf3, 0x47, 0x11, 0x89, 0x29, 0x82, 0xef, 0xa5, 0x87, 0x2f, 0xc0, 0x1a, 0x2e, 0xe1, - 0xf1, 0x66, 0xb5, 0x5d, 0xed, 0x34, 0x8e, 0x7e, 0x66, 0x26, 0xc4, 0x62, 0xe6, 0x3c, 0x92, 0x12, - 0x8b, 0x59, 0xf6, 0x6e, 0x4d, 0xda, 0x1a, 0x7f, 0xaf, 0x80, 0xcd, 0x2f, 0x3d, 0xea, 0x40, 0xef, - 0xd2, 0x83, 0x7c, 0x24, 0x13, 0x3e, 0x96, 0x51, 0x33, 0x9c, 0x56, 0xba, 0x3a, 0xdd, 0xdc, 0x51, - 0x4b, 0x33, 0xd5, 0x7b, 0x9f, 0x81, 0xad, 0xbc, 0xf6, 0xf2, 0xe4, 0xaa, 0x60, 0x4e, 0xb7, 0x6f, - 0x9f, 0x1f, 0x6c, 0x64, 0x77, 0xd8, 0x53, 0x89, 0x7e, 0x60, 0x6d, 0xa0, 0x09, 0x81, 0xab, 0xb7, - 0x40, 0x83, 0x38, 0xc8, 0xe6, 0xf8, 0x91, 0x1d, 0x44, 0xbe, 0xba, 0x97, 0x9a, 0x55, 0x27, 0x0e, - 0xba, 0xc4, 0x8f, 0xbe, 0x8e, 0x7c, 0xdd, 0x07, 0x1f, 0x64, 0xc3, 0xc1, 0x8e, 0xa1, 0x67, 0x4b, - 0x7b, 0x1b, 0xba, 0x2e, 0x4b, 0xaf, 0xe9, 0x53, 0x73, 0x8e, 0x99, 0x62, 0xf6, 0xd3, 0x6f, 0x79, - 0x9c, 0x13, 0xd7, 0x65, 0x98, 0x73, 0x6b, 0x3b, 0x53, 0xb8, 0x82, 0x5e, 0x26, 0x37, 0x5e, 0xd6, - 0xc0, 0x52, 0x1f, 0x32, 0xe8, 0x73, 0x7d, 0x00, 0x36, 0x04, 0xf6, 0x43, 0x0f, 0x0a, 0x6c, 0x27, - 0x8c, 0x98, 0xe6, 0xe8, 0x97, 0x8a, 0x29, 0xcb, 0x93, 0xc2, 0x2c, 0xcd, 0x86, 0xf8, 0xd0, 0xec, - 0x29, 0xe9, 0xa5, 0x80, 0x02, 0x5b, 0xeb, 0x19, 0x46, 0x22, 0xd4, 0x3f, 0x05, 0x4d, 0xc1, 0x22, - 0x2e, 0x0a, 0xae, 0x2a, 0x9a, 0x34, 0x29, 0x82, 0x0f, 0xb2, 0xfd, 0xa4, 0xbd, 0xf3, 0xe6, 0x9c, - 0x4d, 0x4b, 0xd5, 0x77, 0xa1, 0xa5, 0x4b, 0xb0, 0x2d, 0x39, 0x7d, 0x1a, 0xb3, 0x36, 0x3f, 0xe6, - 0x96, 0xb4, 0x9f, 0x04, 0xfd, 0x06, 0xe8, 0x31, 0x47, 0xd3, 0x98, 0x8b, 0x77, 0x38, 0x67, 0xcc, - 0xd1, 0x24, 0xa4, 0x0b, 0xf6, 0xb9, 0x2c, 0x5b, 0xdb, 0xc7, 0x42, 0x91, 0x5c, 0xe8, 0xe1, 0x80, - 0xf0, 0x51, 0x06, 0xbe, 0x34, 0x3f, 0xf8, 0x9e, 0x02, 0xfa, 0x4a, 0xe2, 0x58, 0x19, 0x4c, 0xea, - 0xa5, 0x07, 0x5a, 0xb3, 0xbd, 0xe4, 0x17, 0xb4, 0xac, 0x2e, 0xe8, 0x47, 0x33, 0x20, 0xf2, 0x5b, - 0x3a, 0x02, 0xf7, 0x7c, 0xf8, 0xd8, 0x16, 0x23, 0x46, 0x85, 0xf0, 0xb0, 0x6b, 0x87, 0x10, 0xdd, - 0x60, 0xc1, 0xd5, 0x44, 0xaa, 0x5a, 0xdb, 0x3e, 0x7c, 0x3c, 0xc8, 0xf6, 0xfa, 0xc9, 0x96, 0xe1, - 0x80, 0xad, 0x33, 0x18, 0xb8, 0x7c, 0x04, 0x6f, 0xf0, 0x57, 0x58, 0x40, 0x17, 0x0a, 0xa8, 0x7f, - 0x5c, 0x2a, 0xfc, 0x6b, 0x8c, 0xed, 0x90, 0x52, 0x2f, 0x29, 0xfc, 0x84, 0x47, 0xf2, 0xf2, 0xfd, - 0x02, 0xe3, 0x3e, 0xa5, 0x9e, 0x2c, 0x5f, 0xbd, 0x09, 0x96, 0x63, 0xcc, 0x78, 0x51, 0x4c, 0xd9, - 0xd2, 0xf8, 0x05, 0xa8, 0xab, 0xce, 0x3f, 0x41, 0x37, 0x5c, 0xdf, 0x07, 0x75, 0x98, 0x74, 0x01, - 0xe6, 0x4d, 0xad, 0x5d, 0xed, 0xd4, 0xad, 0x42, 0x60, 0x08, 0xb0, 0xf7, 0xba, 0x07, 0x09, 0xd7, - 0x7f, 0x0f, 0x96, 0x43, 0xac, 0xa6, 0xa5, 0x32, 0x6c, 0x1c, 0xfd, 0x7a, 0xae, 0x06, 0x7c, 0x1d, - 0xa0, 0x95, 0xa1, 0x19, 0xac, 0x78, 0x06, 0x4d, 0x11, 0x3e, 0xd7, 0xaf, 0xa6, 0x9d, 0xfe, 0xea, - 0x4e, 0x4e, 0xa7, 0xf0, 0x0a, 0x9f, 0xbf, 0x01, 0xeb, 0xbd, 0x11, 0x0c, 0x02, 0xec, 0x0d, 0xa8, - 0x22, 0x24, 0xfd, 0xc7, 0x00, 0xa0, 0x44, 0x22, 0x89, 0x2c, 0xc9, 0x74, 0x3d, 0x95, 0x9c, 0xbb, - 0x13, 0x23, 0xa4, 0x32, 0x31, 0x42, 0x0c, 0x0b, 0x6c, 0x5c, 0x71, 0xf4, 0xbb, 0xec, 0x2d, 0xf1, - 0x30, 0xe4, 0xfa, 0x3d, 0xb0, 0x24, 0x3b, 0x21, 0x05, 0xaa, 0x59, 0x8b, 0x31, 0x47, 0xe7, 0xae, - 0xde, 0x29, 0xbf, 0x57, 0x68, 0x68, 0x13, 0x97, 0x37, 0x2b, 0xed, 0x6a, 0xa7, 0x66, 0xad, 0x47, - 0x85, 0xf9, 0xb9, 0xcb, 0x8d, 0x3f, 0x80, 0x46, 0x09, 0x50, 0x5f, 0x07, 0x95, 0x1c, 0xab, 0x42, - 0x5c, 0xfd, 0x18, 0xec, 0x15, 0x40, 0x93, 0x34, 0x9c, 0x20, 0xd6, 0xad, 0xdd, 0x5c, 0x61, 0x82, - 0x89, 0xb9, 0xf1, 0x10, 0xec, 0x9c, 0x17, 0xad, 0x9b, 0x93, 0xfc, 0x44, 0x84, 0xda, 0xe4, 0x90, - 0xdc, 0x07, 0xf5, 0xfc, 0xd1, 0xad, 0xa2, 0xaf, 0x59, 0x85, 0xc0, 0xf0, 0xc1, 0xe6, 0x15, 0x47, - 0x97, 0x38, 0x70, 0x0b, 0xb0, 0xd7, 0x24, 0xe0, 0x74, 0x1a, 0x68, 0xee, 0x47, 0x5f, 0xe1, 0xee, - 0x13, 0xb0, 0x9d, 0x47, 0x54, 0x90, 0xba, 0x6c, 0x80, 0xb4, 0x90, 0x95, 0xcb, 0x55, 0x2b, 0x5b, - 0x1e, 0xd7, 0xd4, 0xbb, 0xe2, 0x13, 0xb0, 0x3d, 0x63, 0x16, 0xbc, 0xd5, 0xcc, 0x2f, 0xbc, 0xa5, - 0x26, 0xbf, 0x25, 0x5c, 0xe8, 0x57, 0xd3, 0x7d, 0x34, 0xef, 0x3c, 0x9a, 0x71, 0xf4, 0x72, 0x07, - 0xfe, 0x4b, 0x03, 0xcd, 0x0b, 0x3c, 0x3e, 0xe1, 0x9c, 0x0c, 0x03, 0x1f, 0x07, 0x42, 0xf2, 0x0c, - 0x44, 0x58, 0x7e, 0xea, 0x7f, 0x06, 0x6b, 0x39, 0x31, 0xe4, 0x7c, 0xf0, 0x2e, 0x83, 0x70, 0x35, - 0x53, 0x50, 0x14, 0x72, 0x0c, 0x40, 0xc8, 0x70, 0x6c, 0x23, 0xfb, 0x06, 0x8f, 0xd3, 0xdb, 0xd9, - 0x2f, 0x0f, 0xb8, 0xe4, 0xa7, 0x8e, 0xd9, 0x8f, 0x1c, 0x8f, 0xa0, 0x0b, 0x3c, 0xb6, 0x56, 0xa4, - 0x7e, 0xef, 0x02, 0x8f, 0xe5, 0x53, 0x27, 0xa4, 0xdf, 0x62, 0xa6, 0xa6, 0x52, 0xd5, 0x4a, 0x16, - 0xc6, 0xbf, 0x35, 0xb0, 0x7b, 0x05, 0x3d, 0xe2, 0x42, 0x41, 0x59, 0x16, 0x79, 0x3f, 0x72, 0xa4, - 0xc5, 0x1b, 0xca, 0xed, 0x95, 0x38, 0x2b, 0xef, 0x35, 0xce, 0xcf, 0xc0, 0x6a, 0xde, 0x32, 0x32, - 0xd2, 0xea, 0x1c, 0x91, 0x36, 0x32, 0x8b, 0x0b, 0x3c, 0x36, 0x5e, 0x96, 0xc3, 0x3a, 0x1d, 0x97, - 0xeb, 0xe3, 0x2d, 0x61, 0xe5, 0x7e, 0xef, 0x1c, 0xd6, 0xac, 0xba, 0xc9, 0xc3, 0x50, 0x9e, 0x5f, - 0xc9, 0x5a, 0xf5, 0x7d, 0x66, 0xcd, 0xf8, 0x87, 0x06, 0x76, 0xca, 0x91, 0xf2, 0x01, 0xed, 0xb3, - 0x28, 0xc0, 0x6f, 0x8a, 0xb8, 0x60, 0x81, 0x4a, 0x99, 0x05, 0x6c, 0xb0, 0x3e, 0x91, 0x08, 0x7e, - 0xa7, 0xa3, 0xce, 0x68, 0x47, 0x6b, 0xad, 0x9c, 0x09, 0x7e, 0x3a, 0x78, 0x7a, 0xdb, 0xd2, 0x9e, - 0xdd, 0xb6, 0xb4, 0xff, 0xdd, 0xb6, 0xb4, 0xef, 0x5e, 0xb4, 0x16, 0x9e, 0xbd, 0x68, 0x2d, 0xfc, - 0xe7, 0x45, 0x6b, 0xe1, 0x8f, 0xc7, 0x43, 0x22, 0x46, 0x91, 0x63, 0x22, 0xea, 0x77, 0xd3, 0x9f, - 0xe9, 0x85, 0xcf, 0x8f, 0xf2, 0x7f, 0x33, 0x1e, 0x4f, 0xfe, 0x9f, 0x21, 0xc6, 0x21, 0xe6, 0xce, - 0x92, 0x62, 0xa8, 0x8f, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xc0, 0x0a, 0x32, 0xf6, 0x00, 0x11, - 0x00, 0x00, + // 1632 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0xcd, 0x6e, 0x23, 0xc7, + 0x11, 0xd6, 0x88, 0xd4, 0x0f, 0x9b, 0xfa, 0xd9, 0x1d, 0x69, 0xbd, 0xd4, 0x46, 0xa1, 0xe8, 0x49, + 0x62, 0x28, 0x08, 0x3c, 0x84, 0x64, 0x18, 0x30, 0x84, 0x04, 0x86, 0xc4, 0xf5, 0x7a, 0x15, 0xc5, + 0x5e, 0x7a, 0xa4, 0x28, 0x48, 0x82, 0x60, 0xd0, 0xd3, 0x53, 0x4b, 0x36, 0x34, 0x33, 0x3d, 0xdb, + 0xdd, 0x33, 0xbb, 0x7c, 0x83, 0x1c, 0x0d, 0xe4, 0x62, 0x20, 0x17, 0x5f, 0x72, 0xc8, 0x29, 0xaf, + 0x61, 0x20, 0x17, 0x1f, 0x72, 0xc8, 0xc9, 0x09, 0xb4, 0x87, 0xdc, 0xf3, 0x04, 0x41, 0xf7, 0xfc, + 0x92, 0xab, 0xb5, 0x29, 0x78, 0x73, 0x9b, 0xae, 0xae, 0xfa, 0xba, 0xaa, 0xba, 0xea, 0xab, 0x26, + 0xd1, 0x21, 0x8d, 0x24, 0x70, 0x32, 0xc6, 0x34, 0x72, 0x05, 0x90, 0x84, 0x53, 0x39, 0xe9, 0x13, + 0x92, 0xf6, 0x63, 0xce, 0x52, 0xea, 0x03, 0xef, 0xa7, 0x07, 0xe5, 0xb7, 0x1d, 0x73, 0x26, 0x99, + 0xf9, 0xa3, 0x1b, 0x6c, 0x6c, 0x42, 0x52, 0xbb, 0xd4, 0x4b, 0x0f, 0x1e, 0x6c, 0x8f, 0xd8, 0x88, + 0x69, 0xfd, 0xbe, 0xfa, 0xca, 0x4c, 0x1f, 0xec, 0x8d, 0x18, 0x1b, 0x05, 0xd0, 0xd7, 0x2b, 0x2f, + 0x79, 0xda, 0x97, 0x34, 0x04, 0x21, 0x71, 0x18, 0xe7, 0x0a, 0xdd, 0x59, 0x05, 0x3f, 0xe1, 0x58, + 0x52, 0x16, 0x15, 0x00, 0xd4, 0x23, 0x7d, 0xc2, 0x38, 0xf4, 0x49, 0x40, 0x21, 0x92, 0xca, 0xbd, + 0xec, 0x2b, 0x57, 0xe8, 0x2b, 0x85, 0x80, 0x8e, 0xc6, 0x32, 0x13, 0x8b, 0xbe, 0x84, 0xc8, 0x07, + 0x1e, 0xd2, 0x4c, 0xb9, 0x5a, 0xe5, 0x06, 0xbb, 0xb5, 0x7d, 0xc2, 0x27, 0xb1, 0x64, 0xfd, 0x2b, + 0x98, 0x88, 0x7c, 0xf7, 0x1d, 0xc2, 0x44, 0xc8, 0x44, 0x1f, 0x54, 0x60, 0x11, 0x81, 0x7e, 0x7a, + 0xe0, 0x81, 0xc4, 0x07, 0xa5, 0xa0, 0xf0, 0x3b, 0xd7, 0xf3, 0xb0, 0xa8, 0x74, 0x08, 0xa3, 0xb9, + 0xdf, 0xd6, 0x9f, 0x96, 0x51, 0x67, 0xc0, 0x22, 0x91, 0x84, 0xc0, 0x8f, 0x7d, 0x9f, 0xaa, 0x90, + 0x86, 0x9c, 0xc5, 0x4c, 0xe0, 0xc0, 0xdc, 0x46, 0x4b, 0x92, 0xca, 0x00, 0x3a, 0x46, 0xcf, 0xd8, + 0x6f, 0x39, 0xd9, 0xc2, 0xec, 0xa1, 0xb6, 0x0f, 0x82, 0x70, 0x1a, 0x2b, 0xe5, 0xce, 0xa2, 0xde, + 0xab, 0x8b, 0xcc, 0x1d, 0xb4, 0x9a, 0xdd, 0x02, 0xf5, 0x3b, 0x0d, 0xbd, 0xbd, 0xa2, 0xd7, 0xa7, + 0xbe, 0xf9, 0x31, 0xda, 0xa0, 0x11, 0x95, 0x14, 0x07, 0xee, 0x18, 0x54, 0x36, 0x3a, 0xcd, 0x9e, + 0xb1, 0xdf, 0x3e, 0x7c, 0x60, 0x53, 0x8f, 0xd8, 0x2a, 0x81, 0x76, 0x9e, 0xb6, 0xf4, 0xc0, 0x7e, + 0xac, 0x35, 0x4e, 0x9a, 0x5f, 0x7d, 0xb3, 0xb7, 0xe0, 0xac, 0xe7, 0x76, 0x99, 0xd0, 0x7c, 0x1b, + 0xad, 0x8d, 0x20, 0x02, 0x41, 0x85, 0x3b, 0xc6, 0x62, 0xdc, 0x59, 0xea, 0x19, 0xfb, 0x6b, 0x4e, + 0x3b, 0x97, 0x3d, 0xc6, 0x62, 0x6c, 0xee, 0xa1, 0xb6, 0x47, 0x23, 0xcc, 0x27, 0x99, 0xc6, 0xb2, + 0xd6, 0x40, 0x99, 0x48, 0x2b, 0x0c, 0x10, 0x12, 0x31, 0x7e, 0x1e, 0xb9, 0xea, 0xb6, 0x3b, 0x2b, + 0xb9, 0x23, 0xd9, 0x4d, 0xdb, 0xc5, 0x4d, 0xdb, 0x17, 0x45, 0x29, 0x9c, 0xac, 0x2a, 0x47, 0x3e, + 0xff, 0xd7, 0x9e, 0xe1, 0xb4, 0xb4, 0x9d, 0xda, 0x31, 0x3f, 0x45, 0x77, 0x92, 0xc8, 0x63, 0x91, + 0x4f, 0xa3, 0x91, 0x1b, 0x03, 0xa7, 0xcc, 0xef, 0xac, 0x6a, 0xa8, 0x9d, 0x57, 0xa0, 0x1e, 0xe6, + 0x45, 0x93, 0x21, 0x7d, 0xa1, 0x90, 0x36, 0x4b, 0xe3, 0xa1, 0xb6, 0x35, 0x3f, 0x43, 0x26, 0x21, + 0xa9, 0x76, 0x89, 0x25, 0xb2, 0x40, 0x6c, 0xcd, 0x8f, 0x78, 0x87, 0x90, 0xf4, 0x22, 0xb3, 0xce, + 0x21, 0x7f, 0x8f, 0xee, 0x4b, 0x8e, 0x23, 0xf1, 0x14, 0xf8, 0x2c, 0x2e, 0x9a, 0x1f, 0xf7, 0x5e, + 0x81, 0x31, 0x0d, 0xfe, 0x18, 0xf5, 0x48, 0x5e, 0x40, 0x2e, 0x07, 0x9f, 0x0a, 0xc9, 0xa9, 0x97, + 0x28, 0x5b, 0xf7, 0x29, 0xc7, 0x44, 0xd7, 0x48, 0x5b, 0x17, 0x41, 0xb7, 0xd0, 0x73, 0xa6, 0xd4, + 0x1e, 0xe5, 0x5a, 0xe6, 0x13, 0xf4, 0x63, 0x2f, 0x60, 0xe4, 0x4a, 0x28, 0xe7, 0xdc, 0x29, 0x24, + 0x7d, 0x74, 0x48, 0x85, 0x50, 0x68, 0x6b, 0x3d, 0x63, 0xbf, 0xe1, 0xbc, 0x9d, 0xe9, 0x0e, 0x81, + 0x3f, 0xac, 0x69, 0x5e, 0xd4, 0x14, 0xcd, 0x77, 0x91, 0x39, 0xa6, 0x42, 0x32, 0x4e, 0x09, 0x0e, + 0x5c, 0x88, 0x24, 0xa7, 0x20, 0x3a, 0xeb, 0xda, 0xfc, 0x6e, 0xb5, 0xf3, 0x51, 0xb6, 0x71, 0xb4, + 0xfa, 0xc7, 0x2f, 0xf7, 0x16, 0xbe, 0xf8, 0x72, 0x6f, 0xc1, 0xfa, 0x9b, 0x81, 0xee, 0x0f, 0x4a, + 0x67, 0x43, 0x96, 0xe2, 0xe0, 0xff, 0xd9, 0x14, 0xc7, 0xa8, 0x25, 0x24, 0x8b, 0xb3, 0x32, 0x6c, + 0xde, 0xa2, 0x0c, 0x57, 0x95, 0x99, 0xda, 0xb0, 0xfe, 0x6c, 0xa0, 0xed, 0x8f, 0x9e, 0x25, 0x34, + 0x65, 0x04, 0xbf, 0x91, 0x1e, 0x3e, 0x43, 0xeb, 0x50, 0xc3, 0x13, 0x9d, 0x46, 0xaf, 0xb1, 0xdf, + 0x3e, 0xfc, 0x89, 0x9d, 0x11, 0x8a, 0x5d, 0xf2, 0x4c, 0x4e, 0x2a, 0x76, 0xfd, 0x74, 0x67, 0xda, + 0xd6, 0xfa, 0xcb, 0x22, 0xba, 0xf3, 0x71, 0xc0, 0x3c, 0x1c, 0x9c, 0x07, 0x58, 0x8c, 0x55, 0xc2, + 0x27, 0x2a, 0x6a, 0x0e, 0x79, 0xa5, 0x6b, 0xef, 0xe6, 0x8e, 0x5a, 0x99, 0xe9, 0xde, 0xfb, 0x10, + 0xdd, 0x2d, 0x6b, 0xaf, 0x4c, 0xae, 0x0e, 0xe6, 0x64, 0xeb, 0xfa, 0x9b, 0xbd, 0xcd, 0xe2, 0x0e, + 0x07, 0x3a, 0xd1, 0x0f, 0x9d, 0x4d, 0x32, 0x25, 0xf0, 0xcd, 0x2e, 0x6a, 0x53, 0x8f, 0xb8, 0x02, + 0x9e, 0xb9, 0x51, 0x12, 0xea, 0x7b, 0x69, 0x3a, 0x2d, 0xea, 0x91, 0x73, 0x78, 0xf6, 0x69, 0x12, + 0x9a, 0x21, 0x7a, 0xab, 0x18, 0x1e, 0x6e, 0x8a, 0x03, 0x57, 0xd9, 0xbb, 0xd8, 0xf7, 0x79, 0x7e, + 0x4d, 0x1f, 0xd8, 0x73, 0xcc, 0x1c, 0x7b, 0x98, 0x7f, 0x2b, 0x77, 0x8e, 0x7d, 0x9f, 0x83, 0x10, + 0xce, 0x56, 0xa1, 0x70, 0x89, 0x83, 0x42, 0x6e, 0xfd, 0x67, 0x09, 0x2d, 0x0f, 0x31, 0xc7, 0xa1, + 0x30, 0x2f, 0xd0, 0xa6, 0x84, 0x30, 0x0e, 0xb0, 0x04, 0x37, 0x63, 0xc4, 0x3c, 0x47, 0x3f, 0xd3, + 0x4c, 0x59, 0x9f, 0x24, 0x76, 0x6d, 0x76, 0xa4, 0x07, 0xf6, 0x40, 0x4b, 0xcf, 0x25, 0x96, 0xe0, + 0x6c, 0x14, 0x18, 0x99, 0xd0, 0xfc, 0x00, 0x75, 0x24, 0x4f, 0x84, 0xac, 0xb8, 0xaa, 0x6a, 0xd2, + 0xac, 0x08, 0xde, 0x2a, 0xf6, 0xb3, 0xf6, 0x2e, 0x9b, 0xf3, 0x66, 0x5a, 0x6a, 0x7c, 0x1f, 0x5a, + 0x3a, 0x47, 0x5b, 0x8a, 0xd3, 0x67, 0x31, 0x9b, 0xf3, 0x63, 0xde, 0x55, 0xf6, 0xd3, 0xa0, 0x9f, + 0x21, 0x33, 0x15, 0x64, 0x16, 0x73, 0xe9, 0x16, 0x7e, 0xa6, 0x82, 0x4c, 0x43, 0xfa, 0x68, 0x57, + 0xa8, 0xb2, 0x75, 0x43, 0x90, 0x9a, 0xe4, 0xe2, 0x00, 0x22, 0x2a, 0xc6, 0x05, 0xf8, 0xf2, 0xfc, + 0xe0, 0x3b, 0x1a, 0xe8, 0x13, 0x85, 0xe3, 0x14, 0x30, 0xf9, 0x29, 0x03, 0xd4, 0xbd, 0xf9, 0x94, + 0xf2, 0x82, 0x56, 0xf4, 0x05, 0xfd, 0xe0, 0x06, 0x88, 0xf2, 0x96, 0x0e, 0xd1, 0xbd, 0x10, 0xbf, + 0x70, 0xe5, 0x98, 0x33, 0x29, 0x03, 0xf0, 0xdd, 0x18, 0x93, 0x2b, 0x90, 0x42, 0x4f, 0xa4, 0x86, + 0xb3, 0x15, 0xe2, 0x17, 0x17, 0xc5, 0xde, 0x30, 0xdb, 0x32, 0x05, 0x7a, 0xa7, 0x46, 0xe0, 0xcf, + 0x31, 0xf7, 0x5d, 0x1f, 0x22, 0x16, 0xba, 0x1c, 0x46, 0x8a, 0x59, 0x71, 0xc6, 0xe5, 0x00, 0xe5, + 0x10, 0xca, 0x29, 0x40, 0xbd, 0x29, 0xca, 0xf6, 0x1f, 0x30, 0x1a, 0xe5, 0x93, 0xda, 0xaa, 0x78, + 0x5e, 0xa1, 0x3d, 0x54, 0x60, 0x4e, 0x0d, 0xeb, 0x11, 0x80, 0xe5, 0xa1, 0xbb, 0x8f, 0x71, 0xe4, + 0x8b, 0x31, 0xbe, 0x82, 0x4f, 0x40, 0x62, 0x1f, 0x4b, 0x6c, 0xbe, 0x57, 0xeb, 0xb6, 0xa7, 0x00, + 0x6e, 0xcc, 0x58, 0x90, 0x75, 0x5b, 0x46, 0x5e, 0x65, 0xcf, 0x3c, 0x02, 0x18, 0x32, 0x16, 0xa8, + 0x9e, 0x31, 0x3b, 0x68, 0x25, 0x05, 0x2e, 0xaa, 0x0a, 0x2e, 0x96, 0xd6, 0x4f, 0x51, 0x4b, 0xd3, + 0xcd, 0x31, 0xb9, 0x12, 0xe6, 0x2e, 0x6a, 0xe1, 0xac, 0xf5, 0x40, 0x74, 0x8c, 0x5e, 0x63, 0xbf, + 0xe5, 0x54, 0x02, 0x4b, 0xa2, 0x9d, 0xd7, 0xbd, 0x82, 0x84, 0xf9, 0x1b, 0xb4, 0x12, 0x83, 0x1e, + 0xd1, 0xda, 0xb0, 0x7d, 0xf8, 0x8b, 0xb9, 0xba, 0xfe, 0x75, 0x80, 0x4e, 0x81, 0x66, 0xf1, 0xea, + 0xed, 0x35, 0x33, 0x65, 0x84, 0x79, 0x39, 0x7b, 0xe8, 0xcf, 0x6f, 0x75, 0xe8, 0x0c, 0x5e, 0x75, + 0xe6, 0x2f, 0xd1, 0xc6, 0x60, 0x8c, 0xa3, 0x08, 0x82, 0x0b, 0xa6, 0x59, 0xd0, 0xfc, 0x21, 0x42, + 0x24, 0x93, 0x28, 0xf6, 0xcc, 0x32, 0xdd, 0xca, 0x25, 0xa7, 0xfe, 0xd4, 0xdc, 0x5a, 0x9c, 0x9a, + 0x5b, 0x96, 0x83, 0x36, 0x2f, 0x05, 0xf9, 0x75, 0xf1, 0x80, 0x79, 0x12, 0x0b, 0xf3, 0x1e, 0x5a, + 0x56, 0xed, 0x97, 0x03, 0x35, 0x9d, 0xa5, 0x54, 0x90, 0x53, 0xdf, 0xdc, 0xaf, 0x3f, 0x92, 0x58, + 0xec, 0x52, 0x5f, 0x74, 0x16, 0x7b, 0x8d, 0xfd, 0xa6, 0xb3, 0x91, 0x54, 0xe6, 0xa7, 0xbe, 0xb0, + 0x7e, 0x8b, 0xda, 0x35, 0x40, 0x73, 0x03, 0x2d, 0x96, 0x58, 0x8b, 0xd4, 0x37, 0x8f, 0xd0, 0x4e, + 0x05, 0x34, 0xcd, 0xfd, 0x19, 0x62, 0xcb, 0xb9, 0x5f, 0x2a, 0x4c, 0xd1, 0xbf, 0xb0, 0x9e, 0xa0, + 0xed, 0xd3, 0x8a, 0x2f, 0xca, 0xc9, 0x32, 0x15, 0xa1, 0x31, 0x3d, 0x99, 0x77, 0x51, 0xab, 0xfc, + 0x25, 0xa0, 0xa3, 0x6f, 0x3a, 0x95, 0xc0, 0x0a, 0xd1, 0x9d, 0x4b, 0x41, 0xce, 0x21, 0xf2, 0x2b, + 0xb0, 0xd7, 0x24, 0xe0, 0x64, 0x16, 0x68, 0xee, 0x97, 0x66, 0x75, 0xdc, 0xfb, 0x68, 0xab, 0x8c, + 0xa8, 0x9a, 0x24, 0xaa, 0x01, 0xf2, 0x42, 0xd6, 0x47, 0xae, 0x39, 0xc5, 0xf2, 0xa8, 0xa9, 0x1f, + 0x33, 0xef, 0xa3, 0xad, 0x1b, 0x06, 0xd0, 0x77, 0x9a, 0x85, 0xd5, 0x69, 0xb9, 0xc9, 0xaf, 0xa8, + 0x90, 0xe6, 0xe5, 0x6c, 0x1f, 0xcd, 0x3b, 0x04, 0x6f, 0x70, 0xbd, 0xde, 0x81, 0x7f, 0x37, 0x50, + 0xe7, 0x0c, 0x26, 0xc7, 0x42, 0xd0, 0x51, 0x14, 0x42, 0x24, 0x15, 0xb9, 0x61, 0x02, 0xea, 0xd3, + 0xfc, 0x03, 0x5a, 0x2f, 0x89, 0xa1, 0xe4, 0x83, 0xef, 0x33, 0x7d, 0xd7, 0x0a, 0x05, 0x4d, 0x21, + 0x47, 0x08, 0xc5, 0x1c, 0x52, 0x97, 0xb8, 0x57, 0x30, 0xc9, 0x6f, 0x67, 0xb7, 0x3e, 0x55, 0xb3, + 0xdf, 0x5f, 0xf6, 0x30, 0xf1, 0x02, 0x4a, 0xce, 0x60, 0xe2, 0xac, 0x2a, 0xfd, 0xc1, 0x19, 0x4c, + 0xd4, 0xfb, 0x2a, 0x66, 0xcf, 0x81, 0xeb, 0x51, 0xd8, 0x70, 0xb2, 0x85, 0xf5, 0x0f, 0x03, 0xdd, + 0xbf, 0xc4, 0x01, 0xf5, 0xb1, 0x64, 0xbc, 0x88, 0x7c, 0x98, 0x78, 0xca, 0xe2, 0x5b, 0xca, 0xed, + 0x95, 0x38, 0x17, 0xdf, 0x68, 0x9c, 0x1f, 0xa2, 0xb5, 0xb2, 0x65, 0x54, 0xa4, 0x8d, 0x39, 0x22, + 0x6d, 0x17, 0x16, 0x67, 0x30, 0xb1, 0xfe, 0x5b, 0x0f, 0xeb, 0x64, 0x52, 0xaf, 0x8f, 0xef, 0x08, + 0xab, 0x3c, 0xf7, 0xd6, 0x61, 0xdd, 0x54, 0x37, 0x65, 0x18, 0xfa, 0xe4, 0x57, 0xb2, 0xd6, 0x78, + 0x93, 0x59, 0xb3, 0xfe, 0x6a, 0xa0, 0xed, 0x7a, 0xa4, 0xe2, 0x82, 0x0d, 0x79, 0x12, 0xc1, 0xb7, + 0x45, 0x5c, 0xb1, 0xc0, 0x62, 0x9d, 0x05, 0x5c, 0xb4, 0x31, 0x95, 0x08, 0x71, 0x2b, 0x57, 0x6f, + 0x68, 0x47, 0x67, 0xbd, 0x9e, 0x09, 0x71, 0x72, 0xf1, 0xd5, 0x75, 0xd7, 0xf8, 0xfa, 0xba, 0x6b, + 0xfc, 0xfb, 0xba, 0x6b, 0x7c, 0xfe, 0xb2, 0xbb, 0xf0, 0xf5, 0xcb, 0xee, 0xc2, 0x3f, 0x5f, 0x76, + 0x17, 0x7e, 0x77, 0x34, 0xa2, 0x72, 0x9c, 0x78, 0x36, 0x61, 0x61, 0x3f, 0xff, 0x4f, 0xa0, 0x3a, + 0xf3, 0xdd, 0xf2, 0x2f, 0x96, 0x17, 0xd3, 0x7f, 0xb2, 0xc8, 0x49, 0x0c, 0xc2, 0x5b, 0xd6, 0x0c, + 0xf5, 0xde, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x9c, 0x76, 0xa0, 0xbe, 0x95, 0x11, 0x00, 0x00, } func (m *ConsumerAdditionProposal) Marshal() (dAtA []byte, err error) { @@ -1699,6 +1712,16 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + { + size, err := m.ConsumerRewardDenomRegistrationFee.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProvider(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a if m.MaxThrottledPackets != 0 { i = encodeVarintProvider(dAtA, i, uint64(m.MaxThrottledPackets)) i-- @@ -1711,37 +1734,37 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x3a } - n9, err9 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.SlashMeterReplenishPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.SlashMeterReplenishPeriod):]) - if err9 != nil { - return 0, err9 - } - i -= n9 - i = encodeVarintProvider(dAtA, i, uint64(n9)) - i-- - dAtA[i] = 0x32 - n10, err10 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.VscTimeoutPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.VscTimeoutPeriod):]) + n10, err10 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.SlashMeterReplenishPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.SlashMeterReplenishPeriod):]) if err10 != nil { return 0, err10 } i -= n10 i = encodeVarintProvider(dAtA, i, uint64(n10)) i-- - dAtA[i] = 0x2a - n11, err11 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.InitTimeoutPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.InitTimeoutPeriod):]) + dAtA[i] = 0x32 + n11, err11 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.VscTimeoutPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.VscTimeoutPeriod):]) if err11 != nil { return 0, err11 } i -= n11 i = encodeVarintProvider(dAtA, i, uint64(n11)) i-- - dAtA[i] = 0x22 - n12, err12 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.CcvTimeoutPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.CcvTimeoutPeriod):]) + dAtA[i] = 0x2a + n12, err12 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.InitTimeoutPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.InitTimeoutPeriod):]) if err12 != nil { return 0, err12 } i -= n12 i = encodeVarintProvider(dAtA, i, uint64(n12)) i-- + dAtA[i] = 0x22 + n13, err13 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.CcvTimeoutPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.CcvTimeoutPeriod):]) + if err13 != nil { + return 0, err13 + } + i -= n13 + i = encodeVarintProvider(dAtA, i, uint64(n13)) + i-- dAtA[i] = 0x1a if len(m.TrustingPeriodFraction) > 0 { i -= len(m.TrustingPeriodFraction) @@ -1966,20 +1989,20 @@ func (m *VscUnbondingOps) MarshalToSizedBuffer(dAtA []byte) (int, error) { var l int _ = l if len(m.UnbondingOpIds) > 0 { - dAtA15 := make([]byte, len(m.UnbondingOpIds)*10) - var j14 int + dAtA16 := make([]byte, len(m.UnbondingOpIds)*10) + var j15 int for _, num := range m.UnbondingOpIds { for num >= 1<<7 { - dAtA15[j14] = uint8(uint64(num)&0x7f | 0x80) + dAtA16[j15] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j14++ + j15++ } - dAtA15[j14] = uint8(num) - j14++ + dAtA16[j15] = uint8(num) + j15++ } - i -= j14 - copy(dAtA[i:], dAtA15[:j14]) - i = encodeVarintProvider(dAtA, i, uint64(j14)) + i -= j15 + copy(dAtA[i:], dAtA16[:j15]) + i = encodeVarintProvider(dAtA, i, uint64(j15)) i-- dAtA[i] = 0x12 } @@ -2083,12 +2106,12 @@ func (m *VscSendTimestamp) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - n16, err16 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Timestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp):]) - if err16 != nil { - return 0, err16 + n17, err17 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Timestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp):]) + if err17 != nil { + return 0, err17 } - i -= n16 - i = encodeVarintProvider(dAtA, i, uint64(n16)) + i -= n17 + i = encodeVarintProvider(dAtA, i, uint64(n17)) i-- dAtA[i] = 0x12 if m.VscId != 0 { @@ -2560,6 +2583,8 @@ func (m *Params) Size() (n int) { if m.MaxThrottledPackets != 0 { n += 1 + sovProvider(uint64(m.MaxThrottledPackets)) } + l = m.ConsumerRewardDenomRegistrationFee.Size() + n += 1 + l + sovProvider(uint64(l)) return n } @@ -4064,6 +4089,39 @@ func (m *Params) Unmarshal(dAtA []byte) error { break } } + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConsumerRewardDenomRegistrationFee", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProvider + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProvider + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProvider + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ConsumerRewardDenomRegistrationFee.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipProvider(dAtA[iNdEx:]) diff --git a/x/ccv/provider/types/query.pb.go b/x/ccv/provider/types/query.pb.go index 26a533a8a8..51df34a76f 100644 --- a/x/ccv/provider/types/query.pb.go +++ b/x/ccv/provider/types/query.pb.go @@ -949,6 +949,94 @@ func (*ThrottledPacketDataWrapper) XXX_OneofWrappers() []interface{} { } } +type QueryRegisteredConsumerRewardDenomsRequest struct { +} + +func (m *QueryRegisteredConsumerRewardDenomsRequest) Reset() { + *m = QueryRegisteredConsumerRewardDenomsRequest{} +} +func (m *QueryRegisteredConsumerRewardDenomsRequest) String() string { + return proto.CompactTextString(m) +} +func (*QueryRegisteredConsumerRewardDenomsRequest) ProtoMessage() {} +func (*QueryRegisteredConsumerRewardDenomsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_422512d7b7586cd7, []int{19} +} +func (m *QueryRegisteredConsumerRewardDenomsRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryRegisteredConsumerRewardDenomsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryRegisteredConsumerRewardDenomsRequest.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 *QueryRegisteredConsumerRewardDenomsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryRegisteredConsumerRewardDenomsRequest.Merge(m, src) +} +func (m *QueryRegisteredConsumerRewardDenomsRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryRegisteredConsumerRewardDenomsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryRegisteredConsumerRewardDenomsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryRegisteredConsumerRewardDenomsRequest proto.InternalMessageInfo + +type QueryRegisteredConsumerRewardDenomsResponse struct { + Denoms []string `protobuf:"bytes,1,rep,name=denoms,proto3" json:"denoms,omitempty"` +} + +func (m *QueryRegisteredConsumerRewardDenomsResponse) Reset() { + *m = QueryRegisteredConsumerRewardDenomsResponse{} +} +func (m *QueryRegisteredConsumerRewardDenomsResponse) String() string { + return proto.CompactTextString(m) +} +func (*QueryRegisteredConsumerRewardDenomsResponse) ProtoMessage() {} +func (*QueryRegisteredConsumerRewardDenomsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_422512d7b7586cd7, []int{20} +} +func (m *QueryRegisteredConsumerRewardDenomsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryRegisteredConsumerRewardDenomsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryRegisteredConsumerRewardDenomsResponse.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 *QueryRegisteredConsumerRewardDenomsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryRegisteredConsumerRewardDenomsResponse.Merge(m, src) +} +func (m *QueryRegisteredConsumerRewardDenomsResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryRegisteredConsumerRewardDenomsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryRegisteredConsumerRewardDenomsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryRegisteredConsumerRewardDenomsResponse proto.InternalMessageInfo + +func (m *QueryRegisteredConsumerRewardDenomsResponse) GetDenoms() []string { + if m != nil { + return m.Denoms + } + return nil +} + func init() { proto.RegisterType((*QueryConsumerGenesisRequest)(nil), "interchain_security.ccv.provider.v1.QueryConsumerGenesisRequest") proto.RegisterType((*QueryConsumerGenesisResponse)(nil), "interchain_security.ccv.provider.v1.QueryConsumerGenesisResponse") @@ -969,6 +1057,8 @@ func init() { 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") } func init() { @@ -976,85 +1066,90 @@ func init() { } var fileDescriptor_422512d7b7586cd7 = []byte{ - // 1236 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xcd, 0x6f, 0x1b, 0x45, - 0x1c, 0xf5, 0x26, 0x69, 0x9b, 0x4e, 0x0a, 0x89, 0x26, 0x01, 0xdc, 0x4d, 0x64, 0x87, 0x05, 0x41, - 0x0a, 0x62, 0xb7, 0x76, 0x85, 0xd4, 0x04, 0x52, 0xc7, 0x4e, 0x43, 0x1a, 0xd1, 0x88, 0xb0, 0x89, - 0x8a, 0x04, 0xa8, 0x66, 0xb2, 0x3b, 0x38, 0x2b, 0xd6, 0x3b, 0xdb, 0x9d, 0xf1, 0xb6, 0xe1, 0xe3, - 0xc0, 0x87, 0xa0, 0xc7, 0x4a, 0xfc, 0x03, 0x3d, 0xf1, 0x5f, 0x70, 0xef, 0x8d, 0x8a, 0x5e, 0x7a, - 0x2a, 0x28, 0xe1, 0xc0, 0x11, 0x71, 0x47, 0x42, 0x3b, 0x3b, 0xe3, 0x8f, 0x78, 0x6d, 0xaf, 0xdd, - 0xde, 0x9c, 0x99, 0xf9, 0xbd, 0xdf, 0x7b, 0x2f, 0xbf, 0x19, 0x3f, 0x03, 0xc3, 0xf1, 0x18, 0x0e, - 0xac, 0x03, 0xe4, 0x78, 0x55, 0x8a, 0xad, 0x46, 0xe0, 0xb0, 0x43, 0xc3, 0xb2, 0x42, 0xc3, 0x0f, - 0x48, 0xe8, 0xd8, 0x38, 0x30, 0xc2, 0x82, 0x71, 0xab, 0x81, 0x83, 0x43, 0xdd, 0x0f, 0x08, 0x23, - 0xf0, 0x95, 0x84, 0x02, 0xdd, 0xb2, 0x42, 0x5d, 0x16, 0xe8, 0x61, 0x41, 0x5d, 0xa8, 0x11, 0x52, - 0x73, 0xb1, 0x81, 0x7c, 0xc7, 0x40, 0x9e, 0x47, 0x18, 0x62, 0x0e, 0xf1, 0x68, 0x0c, 0xa1, 0xce, - 0xd5, 0x48, 0x8d, 0xf0, 0x8f, 0x46, 0xf4, 0x49, 0xac, 0xe6, 0x45, 0x0d, 0xff, 0x6b, 0xbf, 0xf1, - 0xb9, 0xc1, 0x9c, 0x3a, 0xa6, 0x0c, 0xd5, 0x7d, 0x71, 0xe0, 0xd5, 0x5e, 0x54, 0xc3, 0x82, 0x21, - 0x08, 0x30, 0xa2, 0x16, 0x7a, 0x9d, 0xb2, 0x88, 0x47, 0x1b, 0xf5, 0x58, 0x50, 0x0d, 0x7b, 0x98, - 0x3a, 0x92, 0x4f, 0x31, 0x8d, 0x07, 0x4d, 0x79, 0xbc, 0x46, 0xbb, 0x0c, 0xe6, 0x3f, 0x8c, 0x5c, - 0x59, 0x17, 0xa8, 0x9b, 0x31, 0xa2, 0x89, 0x6f, 0x35, 0x30, 0x65, 0xf0, 0x3c, 0x98, 0x8c, 0xf1, - 0x1c, 0x3b, 0xab, 0x2c, 0x2a, 0x4b, 0x67, 0xcd, 0x33, 0xfc, 0xef, 0x2d, 0x5b, 0xfb, 0x1a, 0x2c, - 0x24, 0x57, 0x52, 0x9f, 0x78, 0x14, 0xc3, 0x4f, 0xc1, 0x73, 0x82, 0x5e, 0x95, 0x32, 0xc4, 0x30, - 0xaf, 0x9f, 0x2a, 0x16, 0xf4, 0x5e, 0xc6, 0x4b, 0x61, 0x7a, 0x58, 0xd0, 0x05, 0xd8, 0x6e, 0x54, - 0x58, 0x99, 0x78, 0xf0, 0x24, 0x9f, 0x31, 0xcf, 0xd5, 0xda, 0xd6, 0xb4, 0x05, 0xa0, 0x76, 0x74, - 0x5f, 0x8f, 0xf0, 0x24, 0x6d, 0x0d, 0x9d, 0x50, 0x25, 0x77, 0x05, 0xb5, 0x0a, 0x38, 0xcd, 0xfb, - 0xd3, 0xac, 0xb2, 0x38, 0xbe, 0x34, 0x55, 0x7c, 0x43, 0x4f, 0x31, 0x0c, 0x3a, 0x07, 0x31, 0x45, - 0xa5, 0x76, 0x01, 0xbc, 0xde, 0xdd, 0x62, 0x97, 0xa1, 0x80, 0xed, 0x04, 0xc4, 0x27, 0x14, 0xb9, - 0x4d, 0x36, 0x77, 0x15, 0xb0, 0x34, 0xf8, 0x6c, 0xd3, 0xb6, 0xb3, 0xbe, 0x5c, 0x14, 0x96, 0x5d, - 0x49, 0x47, 0x4f, 0x80, 0x97, 0x6d, 0xdb, 0x89, 0xa6, 0xb4, 0x05, 0xdd, 0x02, 0xd4, 0x96, 0xc0, - 0x6b, 0x49, 0x4c, 0x88, 0xdf, 0x45, 0xfa, 0x47, 0x25, 0x59, 0x60, 0xc7, 0x51, 0xc1, 0xf9, 0x93, - 0x6e, 0xce, 0xab, 0x43, 0x71, 0x36, 0x71, 0x9d, 0x84, 0xc8, 0x4d, 0xa4, 0x5c, 0x02, 0xa7, 0x78, - 0xeb, 0x3e, 0xb3, 0x08, 0xe7, 0xc1, 0x59, 0xcb, 0x75, 0xb0, 0xc7, 0xa2, 0xbd, 0x31, 0xbe, 0x37, - 0x19, 0x2f, 0x6c, 0xd9, 0xda, 0x4f, 0x0a, 0x78, 0x99, 0x2b, 0xb9, 0x81, 0x5c, 0xc7, 0x46, 0x8c, - 0x04, 0x6d, 0x56, 0x05, 0x83, 0x27, 0x1d, 0xae, 0x82, 0x19, 0x49, 0xba, 0x8a, 0x6c, 0x3b, 0xc0, - 0x94, 0xc6, 0x4d, 0x2a, 0xf0, 0xdf, 0x27, 0xf9, 0xe7, 0x0f, 0x51, 0xdd, 0x5d, 0xd1, 0xc4, 0x86, - 0x66, 0x4e, 0xcb, 0xb3, 0xe5, 0x78, 0x65, 0x65, 0xf2, 0xee, 0xfd, 0x7c, 0xe6, 0xef, 0xfb, 0xf9, - 0x8c, 0xf6, 0x01, 0xd0, 0xfa, 0x11, 0x11, 0x6e, 0x5e, 0x00, 0x33, 0xf2, 0x2a, 0x34, 0xdb, 0xc5, - 0x8c, 0xa6, 0xad, 0xb6, 0xf3, 0x51, 0xb3, 0x6e, 0x69, 0x3b, 0x6d, 0xcd, 0xd3, 0x49, 0xeb, 0xea, - 0xd5, 0x47, 0xda, 0x89, 0xfe, 0xfd, 0xa4, 0x75, 0x12, 0x69, 0x49, 0xeb, 0x72, 0x52, 0x48, 0x3b, - 0xe1, 0x9a, 0x36, 0x0f, 0xce, 0x73, 0xc0, 0xbd, 0x83, 0x80, 0x30, 0xe6, 0x62, 0x7e, 0xed, 0xe5, - 0x70, 0xfe, 0x32, 0x26, 0xae, 0xff, 0x89, 0x5d, 0xd1, 0x26, 0x0f, 0xa6, 0xa8, 0x8b, 0xe8, 0x41, - 0xb5, 0x8e, 0x19, 0x0e, 0x78, 0x87, 0x71, 0x13, 0xf0, 0xa5, 0xed, 0x68, 0x05, 0x16, 0xc1, 0x0b, - 0x6d, 0x07, 0xaa, 0xc8, 0x75, 0xc9, 0x6d, 0xe4, 0x59, 0x98, 0x6b, 0x1f, 0x37, 0x67, 0x5b, 0x47, - 0xcb, 0x72, 0x0b, 0xde, 0x04, 0x59, 0x0f, 0xdf, 0x61, 0xd5, 0x00, 0xfb, 0x2e, 0xf6, 0x1c, 0x7a, - 0x50, 0xb5, 0x90, 0x67, 0x47, 0x62, 0x71, 0x76, 0x9c, 0xcf, 0xbc, 0xaa, 0xc7, 0x4f, 0xbf, 0x2e, - 0x9f, 0x7e, 0x7d, 0x4f, 0x3e, 0xfd, 0x95, 0xc9, 0xe8, 0x0d, 0xbb, 0xf7, 0x47, 0x5e, 0x31, 0x5f, - 0x8c, 0x50, 0x4c, 0x09, 0xb2, 0x2e, 0x31, 0xe0, 0x2e, 0x38, 0xe3, 0x23, 0xeb, 0x0b, 0xcc, 0x68, - 0x76, 0x82, 0xbf, 0x4a, 0xcb, 0xa9, 0xae, 0x90, 0x74, 0xc0, 0xde, 0x8d, 0x38, 0xef, 0x70, 0x04, - 0x53, 0x22, 0x69, 0x57, 0xc5, 0x25, 0x6e, 0x9e, 0x92, 0x13, 0x17, 0x1f, 0xbc, 0x8a, 0x18, 0x4a, - 0xf1, 0xd4, 0xff, 0x2e, 0x1f, 0xb0, 0xbe, 0x30, 0xc2, 0xfc, 0x3e, 0xd3, 0x06, 0xc1, 0x04, 0x75, - 0xbe, 0x8c, 0x5d, 0x9e, 0x30, 0xf9, 0x67, 0x78, 0x1b, 0xcc, 0xfa, 0x4d, 0x90, 0x2d, 0x8f, 0xb2, - 0xc8, 0x6c, 0x9a, 0x1d, 0xe7, 0x16, 0x94, 0x86, 0xb3, 0xa0, 0xc5, 0xe6, 0xa3, 0x00, 0xf9, 0x3e, - 0x0e, 0xc4, 0x57, 0x47, 0x52, 0x07, 0xed, 0x57, 0x05, 0xcc, 0x25, 0x99, 0x07, 0x6f, 0x82, 0x73, - 0x35, 0x97, 0xec, 0x23, 0xb7, 0x8a, 0x3d, 0x16, 0x1c, 0x8a, 0x07, 0xed, 0xed, 0x54, 0x54, 0x36, - 0x79, 0x21, 0x47, 0xdb, 0x88, 0x8a, 0x05, 0x81, 0xa9, 0x18, 0x90, 0x2f, 0xc1, 0x0d, 0x30, 0x61, - 0x23, 0x86, 0xb8, 0x0b, 0x53, 0xc5, 0x37, 0x7b, 0xe2, 0x86, 0x05, 0xbd, 0x8d, 0x56, 0x44, 0x5e, - 0xa0, 0xf1, 0x72, 0xed, 0xb1, 0x02, 0xd4, 0xde, 0xca, 0xe1, 0x0e, 0x38, 0x17, 0x8f, 0x78, 0xac, - 0x5d, 0xa8, 0x18, 0xa6, 0xdb, 0xb5, 0x8c, 0x19, 0x5f, 0x23, 0xe1, 0xcb, 0x67, 0x00, 0x86, 0xd4, - 0xaa, 0xd6, 0x11, 0x6b, 0x04, 0xd8, 0x96, 0xb8, 0xb1, 0x8a, 0x8b, 0xfd, 0x70, 0x6f, 0xec, 0xae, - 0x6f, 0xc7, 0x45, 0x1d, 0xe0, 0x33, 0x21, 0xb5, 0x3a, 0xd6, 0x2b, 0xa7, 0x63, 0x67, 0x8a, 0x3f, - 0x4c, 0x83, 0x53, 0x7c, 0xde, 0xe0, 0x91, 0x02, 0xe6, 0x92, 0x52, 0x06, 0x5c, 0x4b, 0xf5, 0xef, - 0xe8, 0x13, 0x6d, 0xd4, 0xf2, 0x53, 0x20, 0xc4, 0xa3, 0xae, 0x6d, 0x7c, 0xf7, 0xe8, 0xaf, 0x9f, - 0xc7, 0x4a, 0x70, 0x75, 0x70, 0xfa, 0x6c, 0xbe, 0xb2, 0x22, 0xc5, 0x18, 0x5f, 0xc9, 0x4b, 0xf2, - 0x0d, 0x7c, 0xa4, 0x80, 0xd9, 0x84, 0xb8, 0x02, 0x4b, 0xc3, 0x33, 0xec, 0x88, 0x41, 0xea, 0xda, - 0xe8, 0x00, 0x42, 0xe1, 0x32, 0x57, 0x78, 0x09, 0x16, 0x86, 0x50, 0x18, 0x07, 0x24, 0xf8, 0xed, - 0x18, 0xc8, 0xf6, 0x48, 0x3d, 0x14, 0x5e, 0x1f, 0x91, 0x59, 0x62, 0xc0, 0x52, 0xb7, 0x9f, 0x11, - 0x9a, 0x10, 0x7d, 0x8d, 0x8b, 0xae, 0xc0, 0xb5, 0x61, 0x45, 0x47, 0x41, 0x37, 0x60, 0xd5, 0x66, - 0x76, 0x81, 0xff, 0x29, 0xe0, 0xa5, 0xe4, 0x10, 0x45, 0xe1, 0xfb, 0x23, 0x93, 0xee, 0x4e, 0x6b, - 0xea, 0xf5, 0x67, 0x03, 0x26, 0x0c, 0xd8, 0xe4, 0x06, 0x94, 0x61, 0x69, 0x04, 0x03, 0x88, 0xdf, - 0xa6, 0xff, 0x1f, 0x45, 0x7c, 0x4f, 0x27, 0x26, 0x1e, 0xf8, 0x5e, 0x7a, 0xd6, 0xfd, 0xb2, 0x9b, - 0xba, 0xf9, 0xd4, 0x38, 0x42, 0x78, 0x99, 0x0b, 0x7f, 0x07, 0x2e, 0xa7, 0xf8, 0x39, 0x29, 0x81, - 0xaa, 0x1d, 0x01, 0x2a, 0x41, 0x72, 0x7b, 0x12, 0x1a, 0x49, 0x72, 0x42, 0xa6, 0x1b, 0x49, 0x72, - 0x52, 0x24, 0x1b, 0x4d, 0x72, 0x47, 0x88, 0x83, 0xbf, 0x29, 0x00, 0x76, 0xa7, 0x31, 0x78, 0x25, - 0x3d, 0xc5, 0xa4, 0x90, 0xa7, 0x96, 0x46, 0xae, 0x17, 0xd2, 0x2e, 0x73, 0x69, 0x45, 0x78, 0x71, - 0xb0, 0x34, 0x26, 0x00, 0xe2, 0x9f, 0xaa, 0xf0, 0xfb, 0x31, 0xb0, 0x38, 0x28, 0xf0, 0x0c, 0xf3, - 0x86, 0x0d, 0x8e, 0x5f, 0xc3, 0xbc, 0x61, 0x29, 0x52, 0x98, 0x56, 0xe1, 0xda, 0xdf, 0x85, 0x2b, - 0x83, 0xb5, 0xfb, 0xd8, 0xb3, 0x1d, 0xaf, 0xd6, 0x9a, 0x63, 0x11, 0x1e, 0x2b, 0x7b, 0x0f, 0x8e, - 0x72, 0xca, 0xc3, 0xa3, 0x9c, 0xf2, 0xe7, 0x51, 0x4e, 0xb9, 0x77, 0x9c, 0xcb, 0x3c, 0x3c, 0xce, - 0x65, 0x1e, 0x1f, 0xe7, 0x32, 0x1f, 0xaf, 0xd4, 0x1c, 0x76, 0xd0, 0xd8, 0xd7, 0x2d, 0x52, 0x37, - 0x2c, 0x42, 0xeb, 0x84, 0xb6, 0xb5, 0x79, 0xab, 0xd9, 0xe6, 0xce, 0x09, 0x93, 0x0f, 0x7d, 0x4c, - 0xf7, 0x4f, 0xf3, 0x74, 0x7c, 0xe9, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8c, 0xf5, 0x7d, 0x58, - 0xb2, 0x11, 0x00, 0x00, + // 1321 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xcf, 0x6f, 0x1b, 0xc5, + 0x1f, 0xf5, 0x3a, 0x69, 0x9a, 0x4c, 0xfa, 0xfd, 0xb6, 0x4c, 0x43, 0x71, 0x37, 0x91, 0x1d, 0xb6, + 0x08, 0xd2, 0x16, 0x76, 0x6b, 0x57, 0x48, 0x4d, 0x20, 0x75, 0xec, 0x24, 0xa4, 0x51, 0x1b, 0x35, + 0x6c, 0xa2, 0x22, 0x01, 0xea, 0x32, 0xd9, 0x1d, 0x9c, 0x15, 0xeb, 0x9d, 0xed, 0xce, 0xd8, 0x69, + 0xf8, 0x71, 0x00, 0x24, 0xe8, 0xb1, 0x12, 0xe2, 0xc6, 0xa1, 0x27, 0xfe, 0x0b, 0xee, 0xbd, 0x51, + 0xd1, 0x4b, 0x4f, 0x05, 0x25, 0x1c, 0x38, 0x22, 0xee, 0x48, 0x68, 0x67, 0x67, 0xfd, 0x23, 0x5e, + 0xdb, 0x6b, 0x37, 0x37, 0x7b, 0x76, 0x3e, 0xef, 0xf3, 0xde, 0xd3, 0x67, 0x66, 0xdf, 0x02, 0xcd, + 0x76, 0x19, 0xf6, 0xcd, 0x5d, 0x64, 0xbb, 0x06, 0xc5, 0x66, 0xcd, 0xb7, 0xd9, 0xbe, 0x66, 0x9a, + 0x75, 0xcd, 0xf3, 0x49, 0xdd, 0xb6, 0xb0, 0xaf, 0xd5, 0xf3, 0xda, 0xbd, 0x1a, 0xf6, 0xf7, 0x55, + 0xcf, 0x27, 0x8c, 0xc0, 0x0b, 0x31, 0x05, 0xaa, 0x69, 0xd6, 0xd5, 0xa8, 0x40, 0xad, 0xe7, 0xe5, + 0x99, 0x0a, 0x21, 0x15, 0x07, 0x6b, 0xc8, 0xb3, 0x35, 0xe4, 0xba, 0x84, 0x21, 0x66, 0x13, 0x97, + 0x86, 0x10, 0xf2, 0x54, 0x85, 0x54, 0x08, 0xff, 0xa9, 0x05, 0xbf, 0xc4, 0x6a, 0x4e, 0xd4, 0xf0, + 0x7f, 0x3b, 0xb5, 0x4f, 0x35, 0x66, 0x57, 0x31, 0x65, 0xa8, 0xea, 0x89, 0x0d, 0xaf, 0x75, 0xa3, + 0x5a, 0xcf, 0x6b, 0x82, 0x00, 0x23, 0x72, 0xbe, 0xdb, 0x2e, 0x93, 0xb8, 0xb4, 0x56, 0x0d, 0x05, + 0x55, 0xb0, 0x8b, 0xa9, 0x1d, 0xf1, 0x29, 0x24, 0xf1, 0xa0, 0x21, 0x8f, 0xd7, 0x28, 0xd7, 0xc0, + 0xf4, 0xfb, 0x81, 0x2b, 0xcb, 0x02, 0x75, 0x2d, 0x44, 0xd4, 0xf1, 0xbd, 0x1a, 0xa6, 0x0c, 0x9e, + 0x07, 0xe3, 0x21, 0x9e, 0x6d, 0x65, 0xa4, 0x59, 0x69, 0x6e, 0x42, 0x3f, 0xc9, 0xff, 0xaf, 0x5b, + 0xca, 0x97, 0x60, 0x26, 0xbe, 0x92, 0x7a, 0xc4, 0xa5, 0x18, 0x7e, 0x0c, 0xfe, 0x27, 0xe8, 0x19, + 0x94, 0x21, 0x86, 0x79, 0xfd, 0x64, 0x21, 0xaf, 0x76, 0x33, 0x3e, 0x12, 0xa6, 0xd6, 0xf3, 0xaa, + 0x00, 0xdb, 0x0a, 0x0a, 0xcb, 0xa3, 0x8f, 0x9f, 0xe7, 0x52, 0xfa, 0xa9, 0x4a, 0xcb, 0x9a, 0x32, + 0x03, 0xe4, 0xb6, 0xee, 0xcb, 0x01, 0x5e, 0x44, 0x5b, 0x41, 0x47, 0x54, 0x45, 0x4f, 0x05, 0xb5, + 0x32, 0x18, 0xe3, 0xfd, 0x69, 0x46, 0x9a, 0x1d, 0x99, 0x9b, 0x2c, 0x5c, 0x52, 0x13, 0x0c, 0x83, + 0xca, 0x41, 0x74, 0x51, 0xa9, 0x5c, 0x04, 0x6f, 0x74, 0xb6, 0xd8, 0x62, 0xc8, 0x67, 0x9b, 0x3e, + 0xf1, 0x08, 0x45, 0x4e, 0x83, 0xcd, 0x03, 0x09, 0xcc, 0xf5, 0xdf, 0xdb, 0xb0, 0x6d, 0xc2, 0x8b, + 0x16, 0x85, 0x65, 0xd7, 0x93, 0xd1, 0x13, 0xe0, 0x25, 0xcb, 0xb2, 0x83, 0x29, 0x6d, 0x42, 0x37, + 0x01, 0x95, 0x39, 0xf0, 0x7a, 0x1c, 0x13, 0xe2, 0x75, 0x90, 0xfe, 0x4e, 0x8a, 0x17, 0xd8, 0xb6, + 0x55, 0x70, 0xfe, 0xa8, 0x93, 0xf3, 0xe2, 0x40, 0x9c, 0x75, 0x5c, 0x25, 0x75, 0xe4, 0xc4, 0x52, + 0x2e, 0x82, 0x13, 0xbc, 0x75, 0x8f, 0x59, 0x84, 0xd3, 0x60, 0xc2, 0x74, 0x6c, 0xec, 0xb2, 0xe0, + 0x59, 0x9a, 0x3f, 0x1b, 0x0f, 0x17, 0xd6, 0x2d, 0xe5, 0x7b, 0x09, 0xbc, 0xca, 0x95, 0xdc, 0x41, + 0x8e, 0x6d, 0x21, 0x46, 0xfc, 0x16, 0xab, 0xfc, 0xfe, 0x93, 0x0e, 0x17, 0xc1, 0x99, 0x88, 0xb4, + 0x81, 0x2c, 0xcb, 0xc7, 0x94, 0x86, 0x4d, 0xca, 0xf0, 0x9f, 0xe7, 0xb9, 0xff, 0xef, 0xa3, 0xaa, + 0xb3, 0xa0, 0x88, 0x07, 0x8a, 0x7e, 0x3a, 0xda, 0x5b, 0x0a, 0x57, 0x16, 0xc6, 0x1f, 0x3c, 0xca, + 0xa5, 0xfe, 0x7a, 0x94, 0x4b, 0x29, 0xb7, 0x81, 0xd2, 0x8b, 0x88, 0x70, 0xf3, 0x22, 0x38, 0x13, + 0x1d, 0x85, 0x46, 0xbb, 0x90, 0xd1, 0x69, 0xb3, 0x65, 0x7f, 0xd0, 0xac, 0x53, 0xda, 0x66, 0x4b, + 0xf3, 0x64, 0xd2, 0x3a, 0x7a, 0xf5, 0x90, 0x76, 0xa4, 0x7f, 0x2f, 0x69, 0xed, 0x44, 0x9a, 0xd2, + 0x3a, 0x9c, 0x14, 0xd2, 0x8e, 0xb8, 0xa6, 0x4c, 0x83, 0xf3, 0x1c, 0x70, 0x7b, 0xd7, 0x27, 0x8c, + 0x39, 0x98, 0x1f, 0xfb, 0x68, 0x38, 0x7f, 0x4e, 0x8b, 0xe3, 0x7f, 0xe4, 0xa9, 0x68, 0x93, 0x03, + 0x93, 0xd4, 0x41, 0x74, 0xd7, 0xa8, 0x62, 0x86, 0x7d, 0xde, 0x61, 0x44, 0x07, 0x7c, 0x69, 0x23, + 0x58, 0x81, 0x05, 0xf0, 0x72, 0xcb, 0x06, 0x03, 0x39, 0x0e, 0xd9, 0x43, 0xae, 0x89, 0xb9, 0xf6, + 0x11, 0xfd, 0x6c, 0x73, 0x6b, 0x29, 0x7a, 0x04, 0xef, 0x82, 0x8c, 0x8b, 0xef, 0x33, 0xc3, 0xc7, + 0x9e, 0x83, 0x5d, 0x9b, 0xee, 0x1a, 0x26, 0x72, 0xad, 0x40, 0x2c, 0xce, 0x8c, 0xf0, 0x99, 0x97, + 0xd5, 0xf0, 0xea, 0x57, 0xa3, 0xab, 0x5f, 0xdd, 0x8e, 0xae, 0xfe, 0xf2, 0x78, 0x70, 0x87, 0x3d, + 0xfc, 0x3d, 0x27, 0xe9, 0xe7, 0x02, 0x14, 0x3d, 0x02, 0x59, 0x8e, 0x30, 0xe0, 0x16, 0x38, 0xe9, + 0x21, 0xf3, 0x33, 0xcc, 0x68, 0x66, 0x94, 0xdf, 0x4a, 0xf3, 0x89, 0x8e, 0x50, 0xe4, 0x80, 0xb5, + 0x15, 0x70, 0xde, 0xe4, 0x08, 0x7a, 0x84, 0xa4, 0xac, 0x88, 0x43, 0xdc, 0xd8, 0x15, 0x4d, 0x5c, + 0xb8, 0x71, 0x05, 0x31, 0x94, 0xe0, 0xaa, 0xff, 0x2d, 0xba, 0xc0, 0x7a, 0xc2, 0x08, 0xf3, 0x7b, + 0x4c, 0x1b, 0x04, 0xa3, 0xd4, 0xfe, 0x3c, 0x74, 0x79, 0x54, 0xe7, 0xbf, 0xe1, 0x1e, 0x38, 0xeb, + 0x35, 0x40, 0xd6, 0x5d, 0xca, 0x02, 0xb3, 0x69, 0x66, 0x84, 0x5b, 0x50, 0x1c, 0xcc, 0x82, 0x26, + 0x9b, 0x0f, 0x7c, 0xe4, 0x79, 0xd8, 0x17, 0xaf, 0x8e, 0xb8, 0x0e, 0xca, 0x2f, 0x12, 0x98, 0x8a, + 0x33, 0x0f, 0xde, 0x05, 0xa7, 0x2a, 0x0e, 0xd9, 0x41, 0x8e, 0x81, 0x5d, 0xe6, 0xef, 0x8b, 0x0b, + 0xed, 0xed, 0x44, 0x54, 0xd6, 0x78, 0x21, 0x47, 0x5b, 0x0d, 0x8a, 0x05, 0x81, 0xc9, 0x10, 0x90, + 0x2f, 0xc1, 0x55, 0x30, 0x6a, 0x21, 0x86, 0xb8, 0x0b, 0x93, 0x85, 0xcb, 0x5d, 0x71, 0xeb, 0x79, + 0xb5, 0x85, 0x56, 0x40, 0x5e, 0xa0, 0xf1, 0x72, 0xe5, 0x99, 0x04, 0xe4, 0xee, 0xca, 0xe1, 0x26, + 0x38, 0x15, 0x8e, 0x78, 0xa8, 0x5d, 0xa8, 0x18, 0xa4, 0xdb, 0x8d, 0x94, 0x1e, 0x1e, 0x23, 0xe1, + 0xcb, 0x27, 0x00, 0xd6, 0xa9, 0x69, 0x54, 0x11, 0xab, 0xf9, 0xd8, 0x8a, 0x70, 0x43, 0x15, 0x57, + 0x7a, 0xe1, 0xde, 0xd9, 0x5a, 0xde, 0x08, 0x8b, 0xda, 0xc0, 0xcf, 0xd4, 0xa9, 0xd9, 0xb6, 0x5e, + 0x1e, 0x0b, 0x9d, 0x51, 0xde, 0x04, 0x97, 0xf8, 0xb8, 0xe9, 0xb8, 0x62, 0x53, 0x86, 0xfd, 0xe6, + 0xbc, 0xe9, 0x78, 0x0f, 0xf9, 0xd6, 0x0a, 0x76, 0x49, 0xb5, 0xf1, 0xa6, 0x5a, 0x05, 0x97, 0x13, + 0xed, 0x16, 0xf3, 0x79, 0x0e, 0x8c, 0x59, 0x7c, 0x85, 0xbf, 0xfc, 0x27, 0x74, 0xf1, 0xaf, 0xf0, + 0xd3, 0x4b, 0xe0, 0x04, 0xc7, 0x81, 0x07, 0x12, 0x98, 0x8a, 0x8b, 0x36, 0x70, 0x29, 0xd1, 0x0c, + 0xf4, 0xc8, 0x53, 0x72, 0xe9, 0x05, 0x10, 0x42, 0xfe, 0xca, 0xea, 0x37, 0x4f, 0xff, 0xfc, 0x21, + 0x5d, 0x84, 0x8b, 0xfd, 0x23, 0x6f, 0xe3, 0x6a, 0x17, 0xd1, 0x49, 0xfb, 0x22, 0x3a, 0x99, 0x5f, + 0xc1, 0xa7, 0x12, 0x38, 0x1b, 0x93, 0x91, 0x60, 0x71, 0x70, 0x86, 0x6d, 0xd9, 0x4b, 0x5e, 0x1a, + 0x1e, 0x40, 0x28, 0x9c, 0xe7, 0x0a, 0xaf, 0xc2, 0xfc, 0x00, 0x0a, 0xc3, 0x54, 0x06, 0xbf, 0x4e, + 0x83, 0x4c, 0x97, 0xa8, 0x45, 0xe1, 0xad, 0x21, 0x99, 0xc5, 0xa6, 0x3a, 0x79, 0xe3, 0x98, 0xd0, + 0x84, 0xe8, 0x1b, 0x5c, 0x74, 0x19, 0x2e, 0x0d, 0x2a, 0x3a, 0x48, 0xd7, 0x3e, 0x33, 0x1a, 0x81, + 0x09, 0xfe, 0x2b, 0x81, 0x57, 0xe2, 0x93, 0x1b, 0x85, 0x37, 0x87, 0x26, 0xdd, 0x19, 0x11, 0xe5, + 0x5b, 0xc7, 0x03, 0x26, 0x0c, 0x58, 0xe3, 0x06, 0x94, 0x60, 0x71, 0x08, 0x03, 0x88, 0xd7, 0xa2, + 0xff, 0x6f, 0x49, 0x84, 0x83, 0xd8, 0x98, 0x05, 0xdf, 0x4b, 0xce, 0xba, 0x57, 0x60, 0x94, 0xd7, + 0x5e, 0x18, 0x47, 0x08, 0x2f, 0x71, 0xe1, 0xef, 0xc0, 0xf9, 0x04, 0xdf, 0xb0, 0x11, 0x90, 0xd1, + 0x96, 0xda, 0x62, 0x24, 0xb7, 0xc6, 0xaf, 0xa1, 0x24, 0xc7, 0x04, 0xc9, 0xa1, 0x24, 0xc7, 0xe5, + 0xc0, 0xe1, 0x24, 0xb7, 0x25, 0x47, 0xf8, 0xab, 0x04, 0x60, 0x67, 0x04, 0x84, 0xd7, 0x93, 0x53, + 0x8c, 0x4b, 0x96, 0x72, 0x71, 0xe8, 0x7a, 0x21, 0xed, 0x1a, 0x97, 0x56, 0x80, 0x57, 0xfa, 0x4b, + 0x63, 0x02, 0x20, 0xfc, 0x3e, 0x86, 0xdf, 0xa6, 0xc1, 0x6c, 0xbf, 0x94, 0x35, 0xc8, 0x1d, 0xd6, + 0x3f, 0xf3, 0x0d, 0x72, 0x87, 0x25, 0x88, 0x7e, 0x4a, 0x99, 0x6b, 0x7f, 0x17, 0x2e, 0xf4, 0xd7, + 0xee, 0x61, 0xd7, 0xb2, 0xdd, 0x4a, 0x73, 0x8e, 0x45, 0x62, 0x85, 0x3f, 0xa6, 0xc1, 0x85, 0x04, + 0xaf, 0x73, 0x78, 0x3b, 0x39, 0xf5, 0x44, 0x31, 0x42, 0xde, 0x3c, 0x3e, 0x40, 0x61, 0xc7, 0x4d, + 0x6e, 0xc7, 0x2a, 0x5c, 0xee, 0x6f, 0x87, 0xdf, 0x40, 0x6c, 0x3a, 0xe2, 0x73, 0x4c, 0x23, 0x8c, + 0x27, 0xe5, 0xed, 0xc7, 0x07, 0x59, 0xe9, 0xc9, 0x41, 0x56, 0xfa, 0xe3, 0x20, 0x2b, 0x3d, 0x3c, + 0xcc, 0xa6, 0x9e, 0x1c, 0x66, 0x53, 0xcf, 0x0e, 0xb3, 0xa9, 0x0f, 0x17, 0x2a, 0x36, 0xdb, 0xad, + 0xed, 0xa8, 0x26, 0xa9, 0x6a, 0x26, 0xa1, 0x55, 0x42, 0x5b, 0xfa, 0xbd, 0xd5, 0xe8, 0x77, 0xff, + 0xc8, 0xf0, 0xed, 0x7b, 0x98, 0xee, 0x8c, 0xf1, 0x4f, 0x95, 0xab, 0xff, 0x05, 0x00, 0x00, 0xff, + 0xff, 0x99, 0xe0, 0xf2, 0x45, 0x3f, 0x13, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1090,6 +1185,8 @@ type QueryClient interface { // 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) } type queryClient struct { @@ -1172,6 +1269,15 @@ func (c *queryClient) QueryThrottledConsumerPacketData(ctx context.Context, in * 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...) + 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 @@ -1195,6 +1301,8 @@ type QueryServer interface { // 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) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. @@ -1225,6 +1333,9 @@ func (*UnimplementedQueryServer) QueryThrottleState(ctx context.Context, req *Qu 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") +} func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) @@ -1374,6 +1485,24 @@ func _Query_QueryThrottledConsumerPacketData_Handler(srv interface{}, ctx contex 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 { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).QueryRegisteredConsumerRewardDenoms(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/interchain_security.ccv.provider.v1.Query/QueryRegisteredConsumerRewardDenoms", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).QueryRegisteredConsumerRewardDenoms(ctx, req.(*QueryRegisteredConsumerRewardDenomsRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "interchain_security.ccv.provider.v1.Query", HandlerType: (*QueryServer)(nil), @@ -1410,6 +1539,10 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "QueryThrottledConsumerPacketData", Handler: _Query_QueryThrottledConsumerPacketData_Handler, }, + { + MethodName: "QueryRegisteredConsumerRewardDenoms", + Handler: _Query_QueryRegisteredConsumerRewardDenoms_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "interchain_security/ccv/provider/v1/query.proto", @@ -2099,6 +2232,61 @@ func (m *ThrottledPacketDataWrapper_VscMaturedPacket) MarshalToSizedBuffer(dAtA } 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 @@ -2395,6 +2583,29 @@ func (m *ThrottledPacketDataWrapper_VscMaturedPacket) Size() (n int) { } return n } +func (m *QueryRegisteredConsumerRewardDenomsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryRegisteredConsumerRewardDenomsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Denoms) > 0 { + for _, s := range m.Denoms { + l = len(s) + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} func sovQuery(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 @@ -4137,6 +4348,138 @@ func (m *ThrottledPacketDataWrapper) Unmarshal(dAtA []byte) error { } return nil } +func (m *QueryRegisteredConsumerRewardDenomsRequest) 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: QueryRegisteredConsumerRewardDenomsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryRegisteredConsumerRewardDenomsRequest: 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 *QueryRegisteredConsumerRewardDenomsResponse) 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: QueryRegisteredConsumerRewardDenomsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryRegisteredConsumerRewardDenomsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Denoms", 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.Denoms = append(m.Denoms, 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 skipQuery(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/ccv/provider/types/query.pb.gw.go b/x/ccv/provider/types/query.pb.gw.go index cb5e2f2411..6a249ca2a2 100644 --- a/x/ccv/provider/types/query.pb.gw.go +++ b/x/ccv/provider/types/query.pb.gw.go @@ -267,6 +267,24 @@ func local_request_Query_QueryThrottledConsumerPacketData_0(ctx context.Context, } +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 + + msg, err := client.QueryRegisteredConsumerRewardDenoms(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_QueryRegisteredConsumerRewardDenoms_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryRegisteredConsumerRewardDenomsRequest + var metadata runtime.ServerMetadata + + msg, err := server.QueryRegisteredConsumerRewardDenoms(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. @@ -457,6 +475,29 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + 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() + 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_QueryRegisteredConsumerRewardDenoms_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_QueryRegisteredConsumerRewardDenoms_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -658,6 +699,26 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + 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() + 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_QueryRegisteredConsumerRewardDenoms_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_QueryRegisteredConsumerRewardDenoms_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -677,6 +738,8 @@ 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))) ) var ( @@ -695,4 +758,6 @@ var ( forward_Query_QueryThrottleState_0 = runtime.ForwardResponseMessage forward_Query_QueryThrottledConsumerPacketData_0 = runtime.ForwardResponseMessage + + forward_Query_QueryRegisteredConsumerRewardDenoms_0 = runtime.ForwardResponseMessage ) diff --git a/x/ccv/provider/types/tx.pb.go b/x/ccv/provider/types/tx.pb.go index 89366fc381..3bc162ceb2 100644 --- a/x/ccv/provider/types/tx.pb.go +++ b/x/ccv/provider/types/tx.pb.go @@ -111,9 +111,91 @@ func (m *MsgAssignConsumerKeyResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgAssignConsumerKeyResponse proto.InternalMessageInfo +// MsgRegisterConsumerRewardDenom allows an account to register +// a consumer reward denom, i.e., add it to the list of denoms +// accepted by the provider as rewards. +type MsgRegisterConsumerRewardDenom struct { + Denom string `protobuf:"bytes,1,opt,name=denom,proto3" json:"denom,omitempty"` + Depositor string `protobuf:"bytes,2,opt,name=depositor,proto3" json:"depositor,omitempty"` +} + +func (m *MsgRegisterConsumerRewardDenom) Reset() { *m = MsgRegisterConsumerRewardDenom{} } +func (m *MsgRegisterConsumerRewardDenom) String() string { return proto.CompactTextString(m) } +func (*MsgRegisterConsumerRewardDenom) ProtoMessage() {} +func (*MsgRegisterConsumerRewardDenom) Descriptor() ([]byte, []int) { + return fileDescriptor_43221a4391e9fbf4, []int{2} +} +func (m *MsgRegisterConsumerRewardDenom) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRegisterConsumerRewardDenom) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRegisterConsumerRewardDenom.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 *MsgRegisterConsumerRewardDenom) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRegisterConsumerRewardDenom.Merge(m, src) +} +func (m *MsgRegisterConsumerRewardDenom) XXX_Size() int { + return m.Size() +} +func (m *MsgRegisterConsumerRewardDenom) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRegisterConsumerRewardDenom.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRegisterConsumerRewardDenom proto.InternalMessageInfo + +// MsgRegisterConsumerRewardDenomResponse defines the Msg/RegisterConsumerRewardDenom response type. +type MsgRegisterConsumerRewardDenomResponse struct { +} + +func (m *MsgRegisterConsumerRewardDenomResponse) Reset() { + *m = MsgRegisterConsumerRewardDenomResponse{} +} +func (m *MsgRegisterConsumerRewardDenomResponse) String() string { return proto.CompactTextString(m) } +func (*MsgRegisterConsumerRewardDenomResponse) ProtoMessage() {} +func (*MsgRegisterConsumerRewardDenomResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_43221a4391e9fbf4, []int{3} +} +func (m *MsgRegisterConsumerRewardDenomResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRegisterConsumerRewardDenomResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRegisterConsumerRewardDenomResponse.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 *MsgRegisterConsumerRewardDenomResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRegisterConsumerRewardDenomResponse.Merge(m, src) +} +func (m *MsgRegisterConsumerRewardDenomResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgRegisterConsumerRewardDenomResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRegisterConsumerRewardDenomResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRegisterConsumerRewardDenomResponse proto.InternalMessageInfo + func init() { proto.RegisterType((*MsgAssignConsumerKey)(nil), "interchain_security.ccv.provider.v1.MsgAssignConsumerKey") proto.RegisterType((*MsgAssignConsumerKeyResponse)(nil), "interchain_security.ccv.provider.v1.MsgAssignConsumerKeyResponse") + proto.RegisterType((*MsgRegisterConsumerRewardDenom)(nil), "interchain_security.ccv.provider.v1.MsgRegisterConsumerRewardDenom") + proto.RegisterType((*MsgRegisterConsumerRewardDenomResponse)(nil), "interchain_security.ccv.provider.v1.MsgRegisterConsumerRewardDenomResponse") } func init() { @@ -121,31 +203,35 @@ func init() { } var fileDescriptor_43221a4391e9fbf4 = []byte{ - // 369 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x52, 0x3d, 0x4f, 0xeb, 0x30, - 0x14, 0x8d, 0x5f, 0xa5, 0xf7, 0xfa, 0x4c, 0x41, 0x22, 0xea, 0xd0, 0x56, 0x55, 0x0a, 0x61, 0x61, - 0x80, 0x58, 0x85, 0x01, 0xd1, 0xad, 0x65, 0x42, 0xa8, 0x4b, 0xc5, 0xc4, 0x12, 0xa5, 0x8e, 0x71, - 0x2d, 0x1a, 0x3b, 0xb2, 0x9d, 0xa8, 0xf9, 0x07, 0x8c, 0x30, 0x21, 0xb6, 0xfe, 0x1c, 0xc6, 0x8e, - 0x4c, 0x08, 0xb5, 0x0b, 0x33, 0xbf, 0x00, 0x35, 0x1f, 0x54, 0x88, 0x0e, 0x88, 0xed, 0xde, 0x7b, - 0x8e, 0xcf, 0x39, 0xf2, 0xbd, 0xf0, 0x80, 0x71, 0x4d, 0x24, 0x1e, 0x79, 0x8c, 0xbb, 0x8a, 0xe0, - 0x48, 0x32, 0x9d, 0x20, 0x8c, 0x63, 0x14, 0x4a, 0x11, 0x33, 0x9f, 0x48, 0x14, 0xb7, 0x91, 0x9e, - 0x38, 0xa1, 0x14, 0x5a, 0x98, 0x7b, 0x6b, 0xd8, 0x0e, 0xc6, 0xb1, 0x53, 0xb0, 0x9d, 0xb8, 0xdd, - 0x68, 0x52, 0x21, 0xe8, 0x98, 0x20, 0x2f, 0x64, 0xc8, 0xe3, 0x5c, 0x68, 0x4f, 0x33, 0xc1, 0x55, - 0x26, 0xd1, 0xa8, 0x52, 0x41, 0x45, 0x5a, 0xa2, 0x65, 0x95, 0x4f, 0xeb, 0x58, 0xa8, 0x40, 0x28, - 0x37, 0x03, 0xb2, 0xa6, 0x80, 0x72, 0xb9, 0xb4, 0x1b, 0x46, 0xd7, 0xc8, 0xe3, 0x49, 0x06, 0xd9, - 0x0f, 0x00, 0x56, 0xfb, 0x8a, 0x76, 0x95, 0x62, 0x94, 0x9f, 0x09, 0xae, 0xa2, 0x80, 0xc8, 0x0b, - 0x92, 0x98, 0x75, 0x58, 0xce, 0x42, 0x32, 0xbf, 0x06, 0x76, 0xc0, 0xfe, 0xff, 0xc1, 0xbf, 0xb4, - 0x3f, 0xf7, 0xcd, 0x13, 0xb8, 0x59, 0x84, 0x75, 0x3d, 0xdf, 0x97, 0xb5, 0x3f, 0x4b, 0xbc, 0x67, - 0xbe, 0xbf, 0xb4, 0xb6, 0x12, 0x2f, 0x18, 0x77, 0xec, 0xe5, 0x94, 0x28, 0x65, 0x0f, 0x2a, 0x05, - 0xb1, 0xeb, 0xfb, 0xd2, 0xdc, 0x85, 0x15, 0x9c, 0x5b, 0xb8, 0x37, 0x24, 0xa9, 0x95, 0x52, 0xdd, - 0x0d, 0xbc, 0xb2, 0xed, 0x94, 0x6f, 0xa7, 0x2d, 0xe3, 0x6d, 0xda, 0x32, 0x6c, 0x0b, 0x36, 0xd7, - 0x05, 0x1b, 0x10, 0x15, 0x0a, 0xae, 0xc8, 0xd1, 0x23, 0x80, 0xa5, 0xbe, 0xa2, 0xe6, 0x3d, 0x80, - 0xdb, 0xdf, 0xe3, 0x9f, 0x3a, 0x3f, 0xf8, 0x67, 0x67, 0x9d, 0x41, 0xa3, 0xfb, 0xeb, 0xa7, 0x45, - 0xb6, 0xde, 0xe5, 0xd3, 0xdc, 0x02, 0xb3, 0xb9, 0x05, 0x5e, 0xe7, 0x16, 0xb8, 0x5b, 0x58, 0xc6, - 0x6c, 0x61, 0x19, 0xcf, 0x0b, 0xcb, 0xb8, 0xea, 0x50, 0xa6, 0x47, 0xd1, 0xd0, 0xc1, 0x22, 0xc8, - 0x77, 0x84, 0x56, 0x6e, 0x87, 0x9f, 0xe7, 0x33, 0xf9, 0x7a, 0x40, 0x3a, 0x09, 0x89, 0x1a, 0xfe, - 0x4d, 0x57, 0x76, 0xfc, 0x11, 0x00, 0x00, 0xff, 0xff, 0x4b, 0x60, 0x67, 0xb6, 0x71, 0x02, 0x00, - 0x00, + // 448 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x93, 0x3d, 0x6f, 0xd3, 0x40, + 0x18, 0xc7, 0xed, 0x56, 0x40, 0x7b, 0x14, 0x24, 0x4e, 0x19, 0xd2, 0x10, 0x39, 0x60, 0x24, 0xd4, + 0x01, 0x7c, 0x2a, 0x0c, 0x88, 0x6c, 0x69, 0x59, 0x50, 0x95, 0xc5, 0x62, 0x62, 0x20, 0x72, 0xee, + 0x8e, 0xeb, 0x89, 0xfa, 0x1e, 0xeb, 0x9e, 0x8b, 0xa9, 0xbf, 0x01, 0x23, 0x4c, 0xac, 0xfd, 0x06, + 0x7c, 0x0d, 0x24, 0x96, 0x8e, 0x4c, 0x08, 0x25, 0x0b, 0x33, 0x9f, 0x00, 0xf9, 0x8d, 0x80, 0x88, + 0xa2, 0x0a, 0x75, 0x7b, 0xde, 0xfc, 0xff, 0xff, 0x7c, 0x77, 0x0f, 0x79, 0xa0, 0x8d, 0x93, 0x96, + 0x1f, 0x27, 0xda, 0x4c, 0x50, 0xf2, 0x99, 0xd5, 0xae, 0x60, 0x9c, 0xe7, 0x2c, 0xb3, 0x90, 0x6b, + 0x21, 0x2d, 0xcb, 0xf7, 0x99, 0x3b, 0x8d, 0x32, 0x0b, 0x0e, 0xe8, 0xbd, 0x15, 0xd3, 0x11, 0xe7, + 0x79, 0xd4, 0x4e, 0x47, 0xf9, 0x7e, 0xaf, 0xaf, 0x00, 0xd4, 0x89, 0x64, 0x49, 0xa6, 0x59, 0x62, + 0x0c, 0xb8, 0xc4, 0x69, 0x30, 0x58, 0x4b, 0xf4, 0x3a, 0x0a, 0x14, 0x54, 0x21, 0x2b, 0xa3, 0xa6, + 0xba, 0xcb, 0x01, 0x53, 0xc0, 0x49, 0xdd, 0xa8, 0x93, 0xb6, 0xd5, 0xc8, 0x55, 0xd9, 0x74, 0xf6, + 0x9a, 0x25, 0xa6, 0xa8, 0x5b, 0xe1, 0x47, 0x9f, 0x74, 0xc6, 0xa8, 0x46, 0x88, 0x5a, 0x99, 0x43, + 0x30, 0x38, 0x4b, 0xa5, 0x3d, 0x92, 0x05, 0xdd, 0x25, 0x5b, 0x35, 0xa4, 0x16, 0x5d, 0xff, 0x8e, + 0xbf, 0xb7, 0x1d, 0x5f, 0xab, 0xf2, 0xe7, 0x82, 0x3e, 0x21, 0x37, 0x5a, 0xd8, 0x49, 0x22, 0x84, + 0xed, 0x6e, 0x94, 0xfd, 0x03, 0xfa, 0xf3, 0xdb, 0xe0, 0x66, 0x91, 0xa4, 0x27, 0xc3, 0xb0, 0xac, + 0x4a, 0xc4, 0x30, 0xde, 0x69, 0x07, 0x47, 0x42, 0x58, 0x7a, 0x97, 0xec, 0xf0, 0xc6, 0x62, 0xf2, + 0x46, 0x16, 0xdd, 0xcd, 0x4a, 0xf7, 0x3a, 0x5f, 0xda, 0x0e, 0xb7, 0xde, 0x9d, 0x0d, 0xbc, 0x1f, + 0x67, 0x03, 0x2f, 0x0c, 0x48, 0x7f, 0x15, 0x58, 0x2c, 0x31, 0x03, 0x83, 0x32, 0x7c, 0x45, 0x82, + 0x31, 0xaa, 0x58, 0x2a, 0x8d, 0x4e, 0xda, 0x76, 0x22, 0x96, 0x6f, 0x13, 0x2b, 0x9e, 0x49, 0x03, + 0x29, 0xed, 0x90, 0x2b, 0xa2, 0x0c, 0x1a, 0xfe, 0x3a, 0xa1, 0x7d, 0xb2, 0x2d, 0x64, 0x06, 0xa8, + 0x1d, 0x34, 0xe4, 0xf1, 0xb2, 0xf0, 0x87, 0xff, 0x1e, 0xb9, 0xbf, 0x5e, 0xbf, 0x25, 0x79, 0xf4, + 0x65, 0x83, 0x6c, 0x8e, 0x51, 0xd1, 0x0f, 0x3e, 0xb9, 0xf5, 0xef, 0x41, 0x3e, 0x8d, 0x2e, 0x70, + 0xe3, 0xd1, 0xaa, 0x5f, 0xed, 0x8d, 0xfe, 0xfb, 0xd3, 0x96, 0x8d, 0x7e, 0xf2, 0xc9, 0xed, 0x75, + 0x67, 0x74, 0x78, 0x51, 0x8b, 0x35, 0x22, 0xbd, 0xa3, 0x4b, 0x10, 0x69, 0x89, 0x0f, 0x5e, 0x7c, + 0x9e, 0x07, 0xfe, 0xf9, 0x3c, 0xf0, 0xbf, 0xcf, 0x03, 0xff, 0xfd, 0x22, 0xf0, 0xce, 0x17, 0x81, + 0xf7, 0x75, 0x11, 0x78, 0x2f, 0x87, 0x4a, 0xbb, 0xe3, 0xd9, 0x34, 0xe2, 0x90, 0x36, 0xef, 0x9b, + 0x2d, 0x7d, 0x1f, 0xfe, 0x5e, 0xbd, 0xd3, 0xbf, 0x97, 0xcf, 0x15, 0x99, 0xc4, 0xe9, 0xd5, 0xea, + 0xb9, 0x3f, 0xfe, 0x15, 0x00, 0x00, 0xff, 0xff, 0xb4, 0xbc, 0x30, 0xff, 0xad, 0x03, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -161,6 +247,7 @@ const _ = grpc.SupportPackageIsVersion4 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type MsgClient interface { AssignConsumerKey(ctx context.Context, in *MsgAssignConsumerKey, opts ...grpc.CallOption) (*MsgAssignConsumerKeyResponse, error) + RegisterConsumerRewardDenom(ctx context.Context, in *MsgRegisterConsumerRewardDenom, opts ...grpc.CallOption) (*MsgRegisterConsumerRewardDenomResponse, error) } type msgClient struct { @@ -180,9 +267,19 @@ func (c *msgClient) AssignConsumerKey(ctx context.Context, in *MsgAssignConsumer return out, nil } +func (c *msgClient) RegisterConsumerRewardDenom(ctx context.Context, in *MsgRegisterConsumerRewardDenom, opts ...grpc.CallOption) (*MsgRegisterConsumerRewardDenomResponse, error) { + out := new(MsgRegisterConsumerRewardDenomResponse) + err := c.cc.Invoke(ctx, "/interchain_security.ccv.provider.v1.Msg/RegisterConsumerRewardDenom", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServer is the server API for Msg service. type MsgServer interface { AssignConsumerKey(context.Context, *MsgAssignConsumerKey) (*MsgAssignConsumerKeyResponse, error) + RegisterConsumerRewardDenom(context.Context, *MsgRegisterConsumerRewardDenom) (*MsgRegisterConsumerRewardDenomResponse, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. @@ -192,6 +289,9 @@ type UnimplementedMsgServer struct { func (*UnimplementedMsgServer) AssignConsumerKey(ctx context.Context, req *MsgAssignConsumerKey) (*MsgAssignConsumerKeyResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method AssignConsumerKey not implemented") } +func (*UnimplementedMsgServer) RegisterConsumerRewardDenom(ctx context.Context, req *MsgRegisterConsumerRewardDenom) (*MsgRegisterConsumerRewardDenomResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RegisterConsumerRewardDenom not implemented") +} func RegisterMsgServer(s grpc1.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) @@ -215,6 +315,24 @@ func _Msg_AssignConsumerKey_Handler(srv interface{}, ctx context.Context, dec fu return interceptor(ctx, in, info, handler) } +func _Msg_RegisterConsumerRewardDenom_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgRegisterConsumerRewardDenom) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).RegisterConsumerRewardDenom(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/interchain_security.ccv.provider.v1.Msg/RegisterConsumerRewardDenom", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).RegisterConsumerRewardDenom(ctx, req.(*MsgRegisterConsumerRewardDenom)) + } + return interceptor(ctx, in, info, handler) +} + var _Msg_serviceDesc = grpc.ServiceDesc{ ServiceName: "interchain_security.ccv.provider.v1.Msg", HandlerType: (*MsgServer)(nil), @@ -223,6 +341,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "AssignConsumerKey", Handler: _Msg_AssignConsumerKey_Handler, }, + { + MethodName: "RegisterConsumerRewardDenom", + Handler: _Msg_RegisterConsumerRewardDenom_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "interchain_security/ccv/provider/v1/tx.proto", @@ -295,6 +417,66 @@ func (m *MsgAssignConsumerKeyResponse) MarshalToSizedBuffer(dAtA []byte) (int, e return len(dAtA) - i, nil } +func (m *MsgRegisterConsumerRewardDenom) 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 *MsgRegisterConsumerRewardDenom) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRegisterConsumerRewardDenom) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Depositor) > 0 { + i -= len(m.Depositor) + copy(dAtA[i:], m.Depositor) + i = encodeVarintTx(dAtA, i, uint64(len(m.Depositor))) + i-- + dAtA[i] = 0x12 + } + if len(m.Denom) > 0 { + i -= len(m.Denom) + copy(dAtA[i:], m.Denom) + i = encodeVarintTx(dAtA, i, uint64(len(m.Denom))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgRegisterConsumerRewardDenomResponse) 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 *MsgRegisterConsumerRewardDenomResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRegisterConsumerRewardDenomResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + func encodeVarintTx(dAtA []byte, offset int, v uint64) int { offset -= sovTx(v) base := offset @@ -336,6 +518,32 @@ func (m *MsgAssignConsumerKeyResponse) Size() (n int) { return n } +func (m *MsgRegisterConsumerRewardDenom) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Denom) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Depositor) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgRegisterConsumerRewardDenomResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + func sovTx(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -538,6 +746,170 @@ func (m *MsgAssignConsumerKeyResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *MsgRegisterConsumerRewardDenom) 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 ErrIntOverflowTx + } + 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: MsgRegisterConsumerRewardDenom: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRegisterConsumerRewardDenom: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Denom", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Denom = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Depositor", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Depositor = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgRegisterConsumerRewardDenomResponse) 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 ErrIntOverflowTx + } + 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: MsgRegisterConsumerRewardDenomResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRegisterConsumerRewardDenomResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipTx(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/ccv/types/events.go b/x/ccv/types/events.go index 1cab3e8a15..ba71e063f3 100644 --- a/x/ccv/types/events.go +++ b/x/ccv/types/events.go @@ -2,12 +2,13 @@ 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" + EventTypeTimeout = "timeout" + EventTypePacket = "ccv_packet" + EventTypeChannelEstablished = "channel_established" + EventTypeFeeTransferChannelOpened = "fee_transfer_channel_opened" + EventTypeConsumerClientCreated = "consumer_client_created" + EventTypeAssignConsumerKey = "assign_consumer_key" + EventTypeRegisterConsumerRewardDenom = "register_consumer_reward_denom" EventTypeExecuteConsumerChainSlash = "execute_consumer_chain_slash" EventTypeFeeDistribution = "fee_distribution" @@ -38,4 +39,7 @@ const ( AttributeDistributionFraction = "distribution_fraction" AttributeDistributionTotal = "total" AttributeDistributionToProvider = "provider_amount" + + AttributeConsumerRewardDenom = "consumer_reward_denom" + AttributeConsumerRewardDepositor = "consumer_reward_depositor" ) diff --git a/x/ccv/types/expected_keepers.go b/x/ccv/types/expected_keepers.go index 56025820e6..7f18324c8d 100644 --- a/x/ccv/types/expected_keepers.go +++ b/x/ccv/types/expected_keepers.go @@ -43,6 +43,7 @@ type StakingKeeper interface { MaxValidators(ctx sdk.Context) uint32 GetLastTotalPower(ctx sdk.Context) sdk.Int GetLastValidators(ctx sdk.Context) (validators []stakingtypes.Validator) + BondDenom(ctx sdk.Context) (res string) } type EvidenceKeeper interface { @@ -87,7 +88,10 @@ type ClientKeeper interface { GetSelfConsensusState(ctx sdk.Context, height ibcexported.Height) (ibcexported.ConsensusState, error) } -// TODO: Expected interfaces for distribution on provider and consumer chains +// DistributionKeeper defines the expected interface of the distribution keeper +type DistributionKeeper interface { + FundCommunityPool(ctx sdk.Context, amount sdk.Coins, sender sdk.AccAddress) error +} // ConsumerHooks event hooks for newly bonded cross-chain validators type ConsumerHooks interface { From 11f533487d39dababa8a834cc0503a6c463d2082 Mon Sep 17 00:00:00 2001 From: Jacob Gadikian Date: Wed, 17 May 2023 14:31:36 +0700 Subject: [PATCH 012/108] fix: all feature branches should have CI (#958) * Update automated-tests.yml * Update build.yml * all feature branches will now run all ci jobs relevant to them --------- Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> --- .github/workflows/automated-tests.yml | 2 ++ .github/workflows/build.yml | 1 + .github/workflows/codeql.yml | 15 ++++++++++----- .github/workflows/deploy-docs.yml | 1 - .github/workflows/golangci-lint.yml | 1 + .github/workflows/gosec.yml | 2 ++ 6 files changed, 16 insertions(+), 6 deletions(-) diff --git a/.github/workflows/automated-tests.yml b/.github/workflows/automated-tests.yml index da3d3df042..edff66d593 100644 --- a/.github/workflows/automated-tests.yml +++ b/.github/workflows/automated-tests.yml @@ -4,10 +4,12 @@ on: branches: - main - release/v* + - feat/* pull_request: branches: - main - release/v* + - feat/* jobs: Automated_Tests: runs-on: ubuntu-latest diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3ae061b147..ab15d52ae0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,6 +3,7 @@ on: push: branches: - main + - feat/* pull_request: types: [opened, synchronize, reopened] jobs: diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index f4f80b4863..09a848478a 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -2,13 +2,18 @@ name: "CodeQL" on: push: - branches: [main] + branches: + - main + - feat/* + paths-ignore: - - 'legacy_ibc_testing' + - "legacy_ibc_testing" pull_request: - branches: [main] + branches: + - main + - feat/* paths-ignore: - - 'legacy_ibc_testing' + - "legacy_ibc_testing" schedule: # ┌───────────── minute (0 - 59) # │ ┌───────────── hour (0 - 23) @@ -62,4 +67,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 \ No newline at end of file + uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 8675f914f7..6af3462201 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -1,4 +1,3 @@ - name: Deploy docs # This job builds and deploys documenation to github pages. # It runs on every push to main with a change in the docs folder. diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml index 2600563411..7dcf88c9c0 100644 --- a/.github/workflows/golangci-lint.yml +++ b/.github/workflows/golangci-lint.yml @@ -6,6 +6,7 @@ on: branches: - master - main + - feat/* pull_request: permissions: contents: read diff --git a/.github/workflows/gosec.yml b/.github/workflows/gosec.yml index e59b4a252b..ddcf2d3594 100644 --- a/.github/workflows/gosec.yml +++ b/.github/workflows/gosec.yml @@ -3,9 +3,11 @@ on: push: branches: - main + - feat/* pull_request: branches: - main + - feat/* jobs: tests: runs-on: ubuntu-latest From 82980f8324c902ec6313b131623e5bc93c96ade8 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Wed, 17 May 2023 01:46:28 -0700 Subject: [PATCH 013/108] fix!: consumer key prefix order to avoid complex migrations (#963) proper order matching v1.0.0 Co-authored-by: Marius Poke --- x/ccv/consumer/types/keys.go | 101 +++++++++++++++--------------- x/ccv/consumer/types/keys_test.go | 20 +++--- 2 files changed, 62 insertions(+), 59 deletions(-) diff --git a/x/ccv/consumer/types/keys.go b/x/ccv/consumer/types/keys.go index e11390d9ed..f5a1754a73 100644 --- a/x/ccv/consumer/types/keys.go +++ b/x/ccv/consumer/types/keys.go @@ -49,6 +49,24 @@ const ( // received over CCV channel but not yet flushed over ABCI PendingChangesByteKey + // HistoricalInfoKey is the byte prefix that will store the historical info for a given height + HistoricalInfoBytePrefix + + // PacketMaturityTimePrefix is the byte prefix that will store maturity time for each received VSC packet + PacketMaturityTimeBytePrefix + + // HeightValsetUpdateIDPrefix is the byte prefix that will store the mapping from block height to valset update ID + HeightValsetUpdateIDBytePrefix + + // OutstandingDowntimePrefix is the byte prefix that will store the validators outstanding downtime by consensus address + OutstandingDowntimeBytePrefix + + // NOTE: This prefix is depreciated, but left in place to avoid consumer state migrations + PendingDataPacketsBytePrefix + + // CrossChainValidatorPrefix is the byte prefix that will store cross-chain validators by consensus address + CrossChainValidatorBytePrefix + // PendingDataPacketsByteKey is the byte key for storing // a list of data packets that cannot be sent yet to the provider // chain either because the CCV channel is not established or @@ -74,21 +92,6 @@ const ( // PrevStandaloneChainByteKey is the byte storing the flag marking whether this chain was previously standalone PrevStandaloneChainByteKey - // HistoricalInfoKey is the byte prefix that will store the historical info for a given height - HistoricalInfoBytePrefix - - // PacketMaturityTimePrefix is the byte prefix that will store maturity time for each received VSC packet - PacketMaturityTimeBytePrefix - - // HeightValsetUpdateIDPrefix is the byte prefix that will store the mapping from block height to valset update ID - HeightValsetUpdateIDBytePrefix - - // OutstandingDowntimePrefix is the byte prefix that will store the validators outstanding downtime by consensus address - OutstandingDowntimeBytePrefix - - // CrossChainValidatorPrefix is the byte prefix that will store cross-chain validators by consensus address - CrossChainValidatorBytePrefix - // NOTE: DO NOT ADD NEW BYTE PREFIXES HERE WITHOUT ADDING THEM TO getAllKeyPrefixes() IN keys_test.go ) @@ -126,40 +129,6 @@ func PendingChangesKey() []byte { return []byte{PendingChangesByteKey} } -// PendingDataPacketsKey returns the key for storing a list of data packets -// that cannot be sent yet to the provider chain either because the CCV channel -// is not established or because the client is expired. -func PendingDataPacketsKey() []byte { - return []byte{PendingDataPacketsByteKey} -} - -func PreCCVKey() []byte { - return []byte{PreCCVByteKey} -} - -func InitialValSetKey() []byte { - return []byte{InitialValSetByteKey} -} - -func InitGenesisHeightKey() []byte { - return []byte{InitGenesisHeightByteKey} -} - -func SmallestNonOptOutPowerKey() []byte { - return []byte{SmallestNonOptOutPowerByteKey} -} - -// StandaloneTransferChannelIDKey returns the key to the transfer channelID that existed from a standalone chain -// changing over to a consumer -func StandaloneTransferChannelIDKey() []byte { - return []byte{StandaloneTransferChannelIDByteKey} -} - -// PrevStandaloneChainKey returns the key to the flag marking whether this chain was previously standalone -func PrevStandaloneChainKey() []byte { - return []byte{PrevStandaloneChainByteKey} -} - // HistoricalInfoKey returns the key to historical info to a given block height func HistoricalInfoKey(height int64) []byte { hBytes := make([]byte, 8) @@ -197,6 +166,40 @@ func CrossChainValidatorKey(addr []byte) []byte { return append([]byte{CrossChainValidatorBytePrefix}, addr...) } +// PendingDataPacketsKey returns the key for storing a list of data packets +// that cannot be sent yet to the provider chain either because the CCV channel +// is not established or because the client is expired. +func PendingDataPacketsKey() []byte { + return []byte{PendingDataPacketsByteKey} +} + +func PreCCVKey() []byte { + return []byte{PreCCVByteKey} +} + +func InitialValSetKey() []byte { + return []byte{InitialValSetByteKey} +} + +func InitGenesisHeightKey() []byte { + return []byte{InitGenesisHeightByteKey} +} + +func SmallestNonOptOutPowerKey() []byte { + return []byte{SmallestNonOptOutPowerByteKey} +} + +// StandaloneTransferChannelIDKey returns the key to the transfer channelID that existed from a standalone chain +// changing over to a consumer +func StandaloneTransferChannelIDKey() []byte { + return []byte{StandaloneTransferChannelIDByteKey} +} + +// PrevStandaloneChainKey returns the key to the flag marking whether this chain was previously standalone +func PrevStandaloneChainKey() []byte { + return []byte{PrevStandaloneChainByteKey} +} + // NOTE: DO NOT ADD FULLY DEFINED KEY FUNCTIONS WITHOUT ADDING THEM TO getAllFullyDefinedKeys() IN keys_test.go // diff --git a/x/ccv/consumer/types/keys_test.go b/x/ccv/consumer/types/keys_test.go index fc214380b9..c0ab13391a 100644 --- a/x/ccv/consumer/types/keys_test.go +++ b/x/ccv/consumer/types/keys_test.go @@ -27,6 +27,11 @@ func getAllKeyPrefixes() []byte { ProviderClientByteKey, ProviderChannelByteKey, PendingChangesByteKey, + HistoricalInfoBytePrefix, + PacketMaturityTimeBytePrefix, + HeightValsetUpdateIDBytePrefix, + OutstandingDowntimeBytePrefix, + CrossChainValidatorBytePrefix, PendingDataPacketsByteKey, PreCCVByteKey, InitialValSetByteKey, @@ -34,11 +39,6 @@ func getAllKeyPrefixes() []byte { SmallestNonOptOutPowerByteKey, StandaloneTransferChannelIDByteKey, PrevStandaloneChainByteKey, - HistoricalInfoBytePrefix, - PacketMaturityTimeBytePrefix, - HeightValsetUpdateIDBytePrefix, - OutstandingDowntimeBytePrefix, - CrossChainValidatorBytePrefix, } } @@ -61,6 +61,11 @@ func getAllFullyDefinedKeys() [][]byte { ProviderClientIDKey(), ProviderChannelKey(), PendingChangesKey(), + HistoricalInfoKey(0), + PacketMaturityTimeKey(0, time.Time{}), + HeightValsetUpdateIDKey(0), + OutstandingDowntimeKey([]byte{}), + CrossChainValidatorKey([]byte{}), PendingDataPacketsKey(), PreCCVKey(), InitialValSetKey(), @@ -68,10 +73,5 @@ func getAllFullyDefinedKeys() [][]byte { SmallestNonOptOutPowerKey(), StandaloneTransferChannelIDKey(), PrevStandaloneChainKey(), - HistoricalInfoKey(0), - PacketMaturityTimeKey(0, time.Time{}), - HeightValsetUpdateIDKey(0), - OutstandingDowntimeKey([]byte{}), - CrossChainValidatorKey([]byte{}), } } From 7785fa481bcec090f4f556366c6b108a06f4e253 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Wed, 17 May 2023 10:50:47 -0700 Subject: [PATCH 014/108] docs: update changelog to prep for v1.3.0 release (#953) * wip * Update CHANGELOG.md * small comment * comment * progress save * another progress save * progress save * done * Update CHANGELOG.md * add denom dos entry * remove extraneous changelog entries * restore a couple entries * Changes from PR review * add entry for 963 --- CHANGELOG.md | 115 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 107 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c72d0c9a2f..7cc75efe60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,116 @@ # CHANGELOG +## [Unreleased] + +Add an entry to the unreleased section whenever merging a PR to main that is not targeted at a specific release. These entries will eventually be included in a release. + +## v.1.3.0 + +Date: May 12th, 2023 + +Unlike prior releases, the ICS v1.3.0 release will be based on the main branch. v1.3.0 will contain all the accumulated PRs from the various releases below, along with other PRs that were merged, but not released to production. After v1.3.0, we plan to revamp release practices, and how we modularize the repo for consumer/provider. + +Some PRs from v1.3.0 may reappear from other releases below. This is due to the fact that ICS v1.1.0 deviates from the commit ordering of the main branch, and other releases thereafter are based on v1.1.0. + +### High level changes included in v1.3.0 + +* MVP for standalone to consumer changeover, see [EPIC](https://github.com/cosmos/interchain-security/issues/756) +* MVP for soft opt out, see [EPIC](https://github.com/cosmos/interchain-security/issues/851) +* Various fixes, critical and non-critical +* Docs updates which should not affect production code + +## PRs included in v1.3.0 + +* (fix) consumer key prefix order to avoid complex migrations [#963](https://github.com/cosmos/interchain-security/pull/963) +* (fix) Prevent denom DOS [#931](https://github.com/cosmos/interchain-security/pull/931) +* (fix) multisig for assigning consumer key, use json [#916](https://github.com/cosmos/interchain-security/pull/916) +* (deps) Bump github.com/cosmos/ibc-go/v4 from 4.3.0 to 4.4.0 [#902](https://github.com/cosmos/interchain-security/pull/902) +* (feat) Add warnings when provider unbonding is shorter than consumer unbonding [#858](https://github.com/cosmos/interchain-security/pull/858) +* (chore) use go 1.19 [#899](https://github.com/cosmos/interchain-security/pull/899), [#840](https://github.com/cosmos/interchain-security/pull/840) +* (feat) Standalone to consumer changeover - recycle existing transfer channel [#832](https://github.com/cosmos/interchain-security/pull/832) +* (deps) Bump IBC [862](https://github.com/cosmos/interchain-security/pull/862) +* (testing) Add tests for soft opt out [#857](https://github.com/cosmos/interchain-security/pull/857) +* (feat) Standalone to consumer changeover - staking functionalities [#794](https://github.com/cosmos/interchain-security/pull/794) +* (fix) prevent provider from sending VSCPackets with multiple updates for the same validator [#850](https://github.com/cosmos/interchain-security/pull/850) +* (feat) Soft opt out [#833](https://github.com/cosmos/interchain-security/issues/833) +* (fix) Correctly handle VSC packet with duplicate val updates on consumer [#846](https://github.com/cosmos/interchain-security/pull/846) +* (deps) bump sdk to v0.45.15.ics [#805](https://github.com/cosmos/interchain-security/pull/805) +* (refactor) Remove spm module [#812](https://github.com/cosmos/interchain-security/pull/812) +* (feat) Standalone to consumer changeover part 1 [#757](https://github.com/cosmos/interchain-security/pull/757) +* (chore) Swap names of e2e and integration tests [#681](https://github.com/cosmos/interchain-security/pull/681) +* (fix) fix StopConsumerChain not running in cachedContext [#802](https://github.com/cosmos/interchain-security/pull/802). Also in earlier releases with different commit order! +* (docs) Introduce docs website [#759](https://github.com/cosmos/interchain-security/pull/759) +* (fix) Serialize correct byte prefix for SlashLogKey [#786](https://github.com/cosmos/interchain-security/pull/786) +* (feature) Improve keeper field validation [#766](https://github.com/cosmos/interchain-security/pull/766) +* (docs) Contributing guidelines [#744](https://github.com/cosmos/interchain-security/pull/744) +* (refactor) Key assignment type safety [#725](https://github.com/cosmos/interchain-security/pull/725) +* (fix) Update protos and fix deps [#752](https://github.com/cosmos/interchain-security/pull/752) +* (api) Add consumer QueryParams [#746](https://github.com/cosmos/interchain-security/pull/746) +* (feature) New validation for keeper fields [#740](https://github.com/cosmos/interchain-security/pull/740) + +## v1.2.0-multiden + +The first release candidate for a fix built on top of v1.2.0, intended for consumers. This release adds a list of denoms on the consumer that are allowed to be sent to the provider as rewards. This prevents a potential DOS attack that was discovered during the audit of Replicated Security performed by Oak Security and funded by the Cosmos Hub community through Proposal 687. In an effort to move quickly, this release also includes a multisig fix that is effective only for provider. It shouldn't affect the consumer module. + +Note PRs were made in a private security repo. + +[full diff](https://github.com/cosmos/interchain-security/compare/v1.2.0...v1.2.0-multiden-rc0) + +## v1.1.0-multiden + +This release combines two fixes on top of v1.1.0, that we judged were urgent to get onto the Cosmos Hub before the launch of the first ICS consumer chain. This is an emergency release intended for providers. + +The first fix is to enable the use of multisigs and Ledger devices when assigning keys for consumer chains. The second is to prevent a possible DOS vector involving the reward distribution system. + +Note PRs were made in a private security repo. + +[full diff](https://github.com/cosmos/interchain-security/compare/v1.1.0...release/v1.1.0-multiden) + +### Multisig fix + +On April 25th (a week and a half ago), we began receiving reports that validators using multisigs and Ledger devices were getting errors reading Error: unable to resolve type URL /interchain_security.ccv.provider.v1.MsgAssignConsumerKey: tx parse error when attempting to assign consensus keys for consumer chains. + +We quickly narrowed the problem down to issues having to do with using the PubKey type directly in the MsgAssignConsumerKey transaction, and Amino (a deprecated serialization library still used in Ledger devices and multisigs) not being able to handle this. We attempted to fix this with the assistance of the Cosmos-SDK team, but after making no headway for a few days, we decided to simply use a JSON representation of the PubKey in the transaction. This is how it is usually represented anyway. We have verified that this fixes the problem. + +### Distribution fix + +The ICS distribution system works by allowing consumer chains to send rewards to a module address on the provider called the FeePoolAddress. From here they are automatically distributed to all validators and delegators through the distribution system that already exists to distribute staking rewards. The FeePoolAddress is usually blocked so that no tokens can be sent to it, but to enable ICS distribution we had to unblock it. + +We recently realized that unblocking the FeePoolAddress could enable an attacker to send a huge number of different denoms into the distribution system. The distribution system would then attempt to distribute them all, leading to out of memory errors. Fixing a similar attack vector that existed in the distribution system before ICS led us to this realization. + +To fix this problem, we have re-blocked the FeePoolAddress and created a new address called the ConsumerRewardsPool. Consumer chains now send rewards to this new address. There is also a new transaction type called RegisterConsumerRewardDenom. This transaction allows people to register denoms to be used as rewards from consumer chains. It costs 10 Atoms to run this transaction.The Atoms are transferred to the community pool. Only denoms registered with this command are then transferred to the FeePoolAddress and distributed out to delegators and validators. + +## v1.2.1 + +* (fix) Remove SPM [#812](https://github.com/cosmos/interchain-security/pull/812) +* (refactor) Key assignment type safety [#725](https://github.com/cosmos/interchain-security/pull/725) + +## v1.2.0 + +Date: April 13th, 2023 + +* (feat) Soft opt-out [#833](https://github.com/cosmos/interchain-security/pull/833) +* (fix) Correctly handle VSC packet with duplicate val updates on consumer [#846](https://github.com/cosmos/interchain-security/pull/846) +* (chore) bump: sdk v0.45.15-ics [#805](https://github.com/cosmos/interchain-security/pull/805) +* (api) add interchain security consumer QueryParams [#746](https://github.com/cosmos/interchain-security/pull/746) + +## v1.1.1 + +* (fix) Remove SPM [#812](https://github.com/cosmos/interchain-security/pull/812) +* (refactor) Key assignment type safety [#725](https://github.com/cosmos/interchain-security/pull/725) + +## v1.1.0 + +Date: March 24th, 2023 + +* (fix) StopConsumerChain not running in cachedContext [#802](https://github.com/cosmos/interchain-security/pull/802) + ## v1.0.0 Date: February 6th, 2023 -This is the first version of Interchain Security (ICS), also known as _Replicated Security_ (RS). -Replicated Security is a feature which will allow a chain -- referred to as the _provider_ -- to share security with other chains -- referred to as _consumers_. +This is the first version of Interchain Security (ICS), also known as _Replicated Security_ (RS). +Replicated Security is a feature which will allow a chain -- referred to as the _provider_ -- to share security with other chains -- referred to as _consumers_. This means that the provider's validator set will be granted the right to validate consumer chains. The communication between the provider and the consumer chains is done through the IBC protocol over a unique, ordered channel (one for each consumer chain). Thus, RS is an IBC application. @@ -26,9 +131,3 @@ In addition, RS has the following features: - **Key Assignment**: Enables validator operators to use different consensus keys for each consumer chain validator node that they operate. - **Jail Throttling**: Enables the provider to slow down a "worst case scenario" attack where a malicious consumer binary attempts to jail a significant amount (> 2/3) of the voting power, effectively taking control of the provider. - -### Dependencies - -- [ibc-go](https://github.com/cosmos/ibc-go): [v4.2.0](https://github.com/cosmos/ibc-go/blob/release/v4.2.x/CHANGELOG.md) -- [cosmos-sdk](https://github.com/cosmos/cosmos-sdk): [v0.45.12-ics](https://github.com/cosmos/cosmos-sdk/tree/v0.45.13-ics) -- [tendermint](https://github.com/informalsystems/tendermint): [0.34.24](https://github.com/informalsystems/tendermint/tree/v0.34.24) From 88158344d4e71190025696fe006b53ca51fd0e37 Mon Sep 17 00:00:00 2001 From: MSalopek Date: Thu, 18 May 2023 21:18:58 +0200 Subject: [PATCH 015/108] fix: mitigate e2e tests relaying and non-determinism (#968) * fix: mitigate e2e tests relaying non-determinism * fix: bump signed blocks windows in e2e test configs --- tests/e2e/actions.go | 3 +++ tests/e2e/config.go | 14 +++++++------- tests/e2e/testnet-scripts/cause-doublesign.sh | 2 +- tests/e2e/testnet-scripts/reconfigure-node.sh | 2 +- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/tests/e2e/actions.go b/tests/e2e/actions.go index 3455b41075..0093026a34 100644 --- a/tests/e2e/actions.go +++ b/tests/e2e/actions.go @@ -860,10 +860,13 @@ func (tr TestRun) relayPackets( if verbose { log.Println("relayPackets cmd:", cmd.String()) } + bz, err := cmd.CombinedOutput() if err != nil { log.Fatal(err, "\n", string(bz)) } + + tr.waitBlocks(action.chain, 1, 30*time.Second) } type relayRewardPacketsToProviderAction struct { diff --git a/tests/e2e/config.go b/tests/e2e/config.go index fe21208834..6d7e36d637 100644 --- a/tests/e2e/config.go +++ b/tests/e2e/config.go @@ -156,7 +156,7 @@ func SlashThrottleTestRun() TestRun { genesisChanges: ".app_state.gov.voting_params.voting_period = \"20s\" | " + // Custom slashing parameters for testing validator downtime functionality // See https://docs.cosmos.network/main/modules/slashing/04_begin_block.html#uptime-tracking - ".app_state.slashing.params.signed_blocks_window = \"2\" | " + + ".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 = \"2s\" | " + ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\" | " + @@ -199,7 +199,7 @@ func DefaultTestRun() TestRun { genesisChanges: ".app_state.gov.voting_params.voting_period = \"20s\" | " + // Custom slashing parameters for testing validator downtime functionality // See https://docs.cosmos.network/main/modules/slashing/04_begin_block.html#uptime-tracking - ".app_state.slashing.params.signed_blocks_window = \"2\" | " + + ".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 = \"2s\" | " + ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\" | " + @@ -226,7 +226,7 @@ func DefaultTestRun() TestRun { func DemocracyTestRun(allowReward bool) TestRun { consumerGenChanges := ".app_state.ccvconsumer.params.blocks_per_distribution_transmission = \"20\" | " + ".app_state.gov.voting_params.voting_period = \"10s\" | " + - ".app_state.slashing.params.signed_blocks_window = \"2\" | " + + ".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 = \"2s\" | " + ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\"" @@ -254,7 +254,7 @@ func DemocracyTestRun(allowReward bool) TestRun { genesisChanges: ".app_state.gov.voting_params.voting_period = \"20s\" | " + // Custom slashing parameters for testing validator downtime functionality // See https://docs.cosmos.network/main/modules/slashing/04_begin_block.html#uptime-tracking - ".app_state.slashing.params.signed_blocks_window = \"2\" | " + + ".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 = \"2s\" | " + ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\" | " + @@ -292,7 +292,7 @@ func MultiConsumerTestRun() TestRun { genesisChanges: ".app_state.gov.voting_params.voting_period = \"20s\" | " + // Custom slashing parameters for testing validator downtime functionality // See https://docs.cosmos.network/main/modules/slashing/04_begin_block.html#uptime-tracking - ".app_state.slashing.params.signed_blocks_window = \"2\" | " + + ".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 = \"2s\" | " + ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\" | " + @@ -304,7 +304,7 @@ func MultiConsumerTestRun() TestRun { ipPrefix: "7.7.8", votingWaitTime: 20, genesisChanges: ".app_state.gov.voting_params.voting_period = \"20s\" | " + - ".app_state.slashing.params.signed_blocks_window = \"2\" | " + + ".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 = \"2s\" | " + ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\"", @@ -315,7 +315,7 @@ func MultiConsumerTestRun() TestRun { ipPrefix: "7.7.9", votingWaitTime: 20, genesisChanges: ".app_state.gov.voting_params.voting_period = \"20s\" | " + - ".app_state.slashing.params.signed_blocks_window = \"2\" | " + + ".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 = \"2s\" | " + ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\"", diff --git a/tests/e2e/testnet-scripts/cause-doublesign.sh b/tests/e2e/testnet-scripts/cause-doublesign.sh index bb42116905..482ca6d778 100755 --- a/tests/e2e/testnet-scripts/cause-doublesign.sh +++ b/tests/e2e/testnet-scripts/cause-doublesign.sh @@ -29,7 +29,7 @@ echo '{"height": "0","round": 0,"step": 0,"signature":"","signbytes":""}' > /$CH echo '{"priv_key":{"type":"tendermint/PrivKeyEd25519","value":"tj55by/yYwruSz4NxsOG9y9k2WrPvKLXKQdz/9jL9Uptmi647OYpcisjwf92TyA+wCUYVDOgW7D53Q+638l9/w=="}}' > /$CHAIN_ID/validatorsybil/config/node_key.json # does not use persistent peers; will do a lookup in genesis.json to find peers -ARGS="--address tcp://$CHAIN_PREFIX.252:26655 --rpc.laddr tcp://$CHAIN_PREFIX.252:26658 --grpc.address $CHAIN_PREFIX.252:9091 --log_level trace --p2p.laddr tcp://$CHAIN_PREFIX.252:26656 --grpc-web.enable=false" +ARGS="--address tcp://$CHAIN_PREFIX.252:26655 --rpc.laddr tcp://$CHAIN_PREFIX.252:26658 --grpc.address $CHAIN_PREFIX.252:9091 --log_level info --p2p.laddr tcp://$CHAIN_PREFIX.252:26656 --grpc-web.enable=false" # start double signing node - it should not talk to the node with the same key ip netns exec $CHAIN_ID-sybil $BIN $ARGS --home /$CHAIN_ID/validatorsybil start &> /$CHAIN_ID/validatorsybil/logs & diff --git a/tests/e2e/testnet-scripts/reconfigure-node.sh b/tests/e2e/testnet-scripts/reconfigure-node.sh index 8be5cea329..6203202b8a 100755 --- a/tests/e2e/testnet-scripts/reconfigure-node.sh +++ b/tests/e2e/testnet-scripts/reconfigure-node.sh @@ -40,7 +40,7 @@ echo "$CONSUMER_MNEMONIC" | $BIN keys add validator$VAL_ID --keyring-backend tes # restart node with new key -ARGS="--home /$CHAIN_ID/validator$VAL_ID --address tcp://$CHAIN_IP_PREFIX.$VAL_IP_SUFFIX:26655 --rpc.laddr tcp://$CHAIN_IP_PREFIX.$VAL_IP_SUFFIX:26658 --grpc.address $CHAIN_IP_PREFIX.$VAL_IP_SUFFIX:9091 --log_level trace --p2p.laddr tcp://$CHAIN_IP_PREFIX.$VAL_IP_SUFFIX:26656 --grpc-web.enable=false" +ARGS="--home /$CHAIN_ID/validator$VAL_ID --address tcp://$CHAIN_IP_PREFIX.$VAL_IP_SUFFIX:26655 --rpc.laddr tcp://$CHAIN_IP_PREFIX.$VAL_IP_SUFFIX:26658 --grpc.address $CHAIN_IP_PREFIX.$VAL_IP_SUFFIX:9091 --log_level info --p2p.laddr tcp://$CHAIN_IP_PREFIX.$VAL_IP_SUFFIX:26656 --grpc-web.enable=false" ip netns exec $CHAIN_ID-$VAL_ID $BIN $ARGS start &> /$CHAIN_ID/validator$VAL_ID/logs & From 0a360c6f47e5d0b33e02f16d78ec38602479666a Mon Sep 17 00:00:00 2001 From: Jacob Gadikian Date: Mon, 22 May 2023 15:50:14 +0700 Subject: [PATCH 016/108] deps: bump cometbft to v0.34.28 (#906) this bumps only cometbft Co-authored-by: MSalopek --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 46b5ed0e98..2faa2d71b8 100644 --- a/go.mod +++ b/go.mod @@ -40,7 +40,7 @@ require ( filippo.io/edwards25519 v1.0.0-rc.1 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.1 // indirect - github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d // indirect + github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect github.com/DataDog/zstd v1.5.0 // indirect github.com/HdrHistogram/hdrhistogram-go v1.1.2 // indirect github.com/Workiva/go-datastructures v1.0.53 // indirect @@ -155,6 +155,6 @@ require ( replace ( github.com/cosmos/cosmos-sdk => github.com/cosmos/cosmos-sdk v0.45.15-ics github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 - github.com/tendermint/tendermint => github.com/cometbft/cometbft v0.34.27 + github.com/tendermint/tendermint => github.com/cometbft/cometbft v0.34.28 google.golang.org/grpc => google.golang.org/grpc v1.33.2 ) diff --git a/go.sum b/go.sum index 1f9035e685..c9438fe7d8 100644 --- a/go.sum +++ b/go.sum @@ -62,8 +62,8 @@ github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= -github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= +github.com/ChainSafe/go-schnorrkel v1.0.0 h1:3aDA67lAykLaG1y3AOjs88dMxC88PgUuHRrLeDnvGIM= +github.com/ChainSafe/go-schnorrkel v1.0.0/go.mod h1:dpzHYVxLZcp8pjlV+O+UR8K0Hp/z7vcchBSbMBEhCw4= github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= @@ -208,8 +208,8 @@ github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcju github.com/coinbase/kryptology v1.8.0/go.mod h1:RYXOAPdzOGUe3qlSFkMGn58i3xUA8hmxYHksuq+8ciI= github.com/coinbase/rosetta-sdk-go v0.7.9 h1:lqllBjMnazTjIqYrOGv8h8jxjg9+hJazIGZr9ZvoCcA= github.com/coinbase/rosetta-sdk-go v0.7.9/go.mod h1:0/knutI7XGVqXmmH4OQD8OckFrbQ8yMsUZTG7FXCR2M= -github.com/cometbft/cometbft v0.34.27 h1:ri6BvmwjWR0gurYjywcBqRe4bbwc3QVs9KRcCzgh/J0= -github.com/cometbft/cometbft v0.34.27/go.mod h1:BcCbhKv7ieM0KEddnYXvQZR+pZykTKReJJYf7YC7qhw= +github.com/cometbft/cometbft v0.34.28 h1:gwryf55P1SWMUP4nOXpRVI2D0yPoYEzN+IBqmRBOsDc= +github.com/cometbft/cometbft v0.34.28/go.mod h1:L9shMfbkZ8B+7JlwANEr+NZbBcn+hBpwdbeYvA5rLCw= github.com/cometbft/cometbft-db v0.7.0 h1:uBjbrBx4QzU0zOEnU8KxoDl18dMNgDh+zZRUE0ucsbo= github.com/cometbft/cometbft-db v0.7.0/go.mod h1:yiKJIm2WKrt6x8Cyxtq9YTEcIMPcEe4XPxhgX59Fzf0= github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= From 89d6a7d85cbb27de314310e7c45e57a63251c885 Mon Sep 17 00:00:00 2001 From: Marius Poke Date: Mon, 22 May 2023 16:52:46 +0200 Subject: [PATCH 017/108] fix!: Remove panics on failure to send IBC packets (#876) * provider: replace panic with StopConsumerChain * provider: replace panic with error message * Info logging on client expiration * add test for consumer * add test for provider * linter * Update CHANGELOG.md --------- Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> --- CHANGELOG.md | 1 + x/ccv/consumer/keeper/relay.go | 12 ++++++---- x/ccv/consumer/keeper/relay_test.go | 24 +++++++++++++++++++ x/ccv/provider/keeper/relay.go | 13 ++++++---- x/ccv/provider/keeper/relay_test.go | 37 +++++++++++++++++++++++++++++ 5 files changed, 79 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cc75efe60..2c4e0937dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ Some PRs from v1.3.0 may reappear from other releases below. This is due to the ## PRs included in v1.3.0 +* (fix) Remove panics on failure to send IBC packets [#876](https://github.com/cosmos/interchain-security/pull/876) * (fix) consumer key prefix order to avoid complex migrations [#963](https://github.com/cosmos/interchain-security/pull/963) * (fix) Prevent denom DOS [#931](https://github.com/cosmos/interchain-security/pull/931) * (fix) multisig for assigning consumer key, use json [#916](https://github.com/cosmos/interchain-security/pull/916) diff --git a/x/ccv/consumer/keeper/relay.go b/x/ccv/consumer/keeper/relay.go index c690ef3701..fe8455563e 100644 --- a/x/ccv/consumer/keeper/relay.go +++ b/x/ccv/consumer/keeper/relay.go @@ -196,13 +196,17 @@ func (k Keeper) SendPackets(ctx sdk.Context) { ) if err != nil { if clienttypes.ErrClientNotActive.Is(err) { - k.Logger(ctx).Debug("IBC client is inactive, packet remains in queue", "type", p.Type.String()) + // IBC client is expired! // leave the packet data stored to be sent once the client is upgraded + k.Logger(ctx).Info("IBC client is expired, cannot send IBC packet; leaving packet data stored:", "type", p.Type.String()) return } - // something went wrong when sending the packet - // TODO do not panic if the send fails - panic(fmt.Errorf("packet could not be sent over IBC: %w", err)) + // Not able to send packet over IBC! + // Leave the packet data stored for the sent to be retried in the next block. + // Note that if VSCMaturedPackets are not sent for long enough, the provider + // will remove the consumer anyway. + k.Logger(ctx).Error("cannot send IBC packet; leaving packet data stored:", "type", p.Type.String(), "err", err.Error()) + return } } diff --git a/x/ccv/consumer/keeper/relay_test.go b/x/ccv/consumer/keeper/relay_test.go index c23a553225..fc09a6b250 100644 --- a/x/ccv/consumer/keeper/relay_test.go +++ b/x/ccv/consumer/keeper/relay_test.go @@ -280,3 +280,27 @@ func TestOnAcknowledgementPacket(t *testing.T) { err = consumerKeeper.OnAcknowledgementPacket(ctx, packet, ack) require.Nil(t, err) } + +// TestSendPackets tests the SendPackets method failing +func TestSendPacketsFailure(t *testing.T) { + // Keeper setup + consumerKeeper, ctx, ctrl, mocks := testkeeper.GetConsumerKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) + defer ctrl.Finish() + consumerKeeper.SetProviderChannel(ctx, "consumerCCVChannelID") + consumerKeeper.SetParams(ctx, consumertypes.DefaultParams()) + + // Set some pending packets + consumerKeeper.SetPendingPackets(ctx, types.ConsumerPacketDataList{List: []types.ConsumerPacketData{ + {}, {}, {}, + }}) + + // Mock the channel keeper to return an error + gomock.InOrder( + mocks.MockChannelKeeper.EXPECT().GetChannel(ctx, types.ConsumerPortID, + "consumerCCVChannelID").Return(channeltypes.Channel{}, false).Times(1), + ) + + // No panic should occur, pending packets should not be cleared + consumerKeeper.SendPackets(ctx) + require.Equal(t, 3, len(consumerKeeper.GetPendingPackets(ctx).List)) +} diff --git a/x/ccv/provider/keeper/relay.go b/x/ccv/provider/keeper/relay.go index a669d47697..55fff4e039 100644 --- a/x/ccv/provider/keeper/relay.go +++ b/x/ccv/provider/keeper/relay.go @@ -194,12 +194,17 @@ func (k Keeper) SendVSCPacketsToChain(ctx sdk.Context, chainID, channelID string // IBC client is expired! // leave the packet data stored to be sent once the client is upgraded // the client cannot expire during iteration (in the middle of a block) - k.Logger(ctx).Debug("IBC client is expired, cannot send VSC, leaving packet data stored:", "chainID", chainID, "vscid", data.ValsetUpdateId) + k.Logger(ctx).Info("IBC client is expired, cannot send VSC, leaving packet data stored:", "chainID", chainID, "vscid", data.ValsetUpdateId) return } - // TODO do not panic if the send fails - // https://github.com/cosmos/interchain-security/issues/649 - panic(fmt.Errorf("packet could not be sent over IBC: %w", err)) + // Not able to send packet over IBC! + k.Logger(ctx).Error("cannot send VSC, removing consumer:", "chainID", chainID, "vscid", data.ValsetUpdateId, "err", err.Error()) + // If this happens, most likely the consumer is malicious; remove it + err := k.StopConsumerChain(ctx, chainID, true) + if err != nil { + panic(fmt.Errorf("consumer chain failed to stop: %w", err)) + } + return } // set the VSC send timestamp for this packet; // note that the VSC send timestamp are set when the packets diff --git a/x/ccv/provider/keeper/relay_test.go b/x/ccv/provider/keeper/relay_test.go index 0ad7d21548..250d241f5e 100644 --- a/x/ccv/provider/keeper/relay_test.go +++ b/x/ccv/provider/keeper/relay_test.go @@ -676,3 +676,40 @@ func TestHandleVSCMaturedPacket(t *testing.T) { _, found = pk.GetUnbondingOpIndex(ctx, "chain-1", 3) require.False(t, found) } + +// TestSendVSCPacketsToChainFailure tests the SendVSCPacketsToChain method failing +func TestSendVSCPacketsToChainFailure(t *testing.T) { + // Keeper setup + providerKeeper, ctx, ctrl, mocks := testkeeper.GetProviderKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) + defer ctrl.Finish() + providerKeeper.SetParams(ctx, providertypes.DefaultParams()) + + // Append mocks for full consumer setup + mockCalls := testkeeper.GetMocksForSetConsumerChain(ctx, &mocks, "consumerChainID") + + // Set 3 pending vsc packets + providerKeeper.AppendPendingVSCPackets(ctx, "consumerChainID", []ccv.ValidatorSetChangePacketData{{}, {}, {}}...) + + // append mocks for the channel keeper to return an error + mockCalls = append(mockCalls, + mocks.MockChannelKeeper.EXPECT().GetChannel(ctx, ccv.ProviderPortID, + "CCVChannelID").Return(channeltypes.Channel{}, false).Times(1), + ) + + // Append mocks for expected call to StopConsumerChain + mockCalls = append(mockCalls, testkeeper.GetMocksForStopConsumerChain(ctx, &mocks)...) + + // Assert mock calls hit + gomock.InOrder(mockCalls...) + + // Execute setup + err := providerKeeper.SetConsumerChain(ctx, "channelID") + require.NoError(t, err) + providerKeeper.SetConsumerClientId(ctx, "consumerChainID", "clientID") + + // No panic should occur, StopConsumerChain should be called + providerKeeper.SendVSCPacketsToChain(ctx, "consumerChainID", "CCVChannelID") + + // Pending VSC packets should be deleted in StopConsumerChain + require.Empty(t, providerKeeper.GetPendingVSCPackets(ctx, "consumerChainID")) +} From bdf299b23adcaf2232eb1890568285170c1c7e93 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 May 2023 08:19:29 -0700 Subject: [PATCH 018/108] build(deps): bump github.com/stretchr/testify from 1.8.2 to 1.8.3 (#969) Bumps [github.com/stretchr/testify](https://github.com/stretchr/testify) from 1.8.2 to 1.8.3. - [Release notes](https://github.com/stretchr/testify/releases) - [Commits](https://github.com/stretchr/testify/compare/v1.8.2...v1.8.3) --- updated-dependencies: - dependency-name: github.com/stretchr/testify dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> --- go.mod | 2 +- go.sum | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 2faa2d71b8..98999a06bb 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/regen-network/cosmos-proto v0.3.1 github.com/spf13/cast v1.5.1 github.com/spf13/cobra v1.7.0 - github.com/stretchr/testify v1.8.2 + github.com/stretchr/testify v1.8.3 github.com/tendermint/tendermint v0.34.27 github.com/tendermint/tm-db v0.6.7 github.com/tidwall/gjson v1.14.4 diff --git a/go.sum b/go.sum index c9438fe7d8..43b9f519c0 100644 --- a/go.sum +++ b/go.sum @@ -959,7 +959,6 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -969,8 +968,8 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= From 23deaea54318038d8dbf8eb87127e55c29b75983 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 May 2023 09:20:48 -0700 Subject: [PATCH 019/108] build(deps): bump slackapi/slack-github-action from 1.23.0 to 1.24.0 (#971) Bumps [slackapi/slack-github-action](https://github.com/slackapi/slack-github-action) from 1.23.0 to 1.24.0. - [Release notes](https://github.com/slackapi/slack-github-action/releases) - [Commits](https://github.com/slackapi/slack-github-action/compare/v1.23.0...v1.24.0) --- updated-dependencies: - dependency-name: slackapi/slack-github-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/nightly-e2e.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nightly-e2e.yml b/.github/workflows/nightly-e2e.yml index 9a6f8698de..0fe0e48d81 100644 --- a/.github/workflows/nightly-e2e.yml +++ b/.github/workflows/nightly-e2e.yml @@ -37,7 +37,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Notify Slack on failure - uses: slackapi/slack-github-action@v1.23.0 + uses: slackapi/slack-github-action@v1.24.0 env: SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK From c952d944bd2249ac20571fb53c8cfa6aa1f3112f Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Thu, 25 May 2023 02:28:55 -0700 Subject: [PATCH 020/108] refactor!: upgrade ICS imports to v2 (#974) * v2 imports * Update CHANGELOG.md --- CHANGELOG.md | 10 +++++----- .../ante/forbidden_proposals_ante_test.go | 4 ++-- app/consumer-democracy/ante_handler.go | 6 +++--- app/consumer-democracy/app.go | 20 +++++++++---------- .../proposals_whitelisting_test.go | 6 +++--- .../ante/disabled_modules_ante_test.go | 4 ++-- app/consumer/ante/msg_filter_ante_test.go | 4 ++-- app/consumer/ante_handler.go | 4 ++-- app/consumer/app.go | 14 ++++++------- app/provider/app.go | 16 +++++++-------- cmd/interchain-security-cd/cmd/root.go | 4 ++-- cmd/interchain-security-cd/main.go | 4 ++-- cmd/interchain-security-cdd/cmd/root.go | 4 ++-- cmd/interchain-security-cdd/main.go | 4 ++-- cmd/interchain-security-pd/cmd/root.go | 4 ++-- cmd/interchain-security-pd/main.go | 4 ++-- go.mod | 2 +- legacy_ibc_testing/simapp/test_helpers.go | 2 +- legacy_ibc_testing/testing/app.go | 4 ++-- legacy_ibc_testing/testing/chain.go | 4 ++-- tests/difference/core/driver/core_test.go | 12 +++++------ tests/difference/core/driver/setup.go | 20 +++++++++---------- tests/e2e/actions.go | 6 +++--- tests/integration/common.go | 10 +++++----- tests/integration/democracy.go | 8 ++++---- tests/integration/distribution.go | 6 +++--- tests/integration/expired_client.go | 4 ++-- tests/integration/instance_test.go | 10 +++++----- tests/integration/key_assignment.go | 4 ++-- tests/integration/normal_operations.go | 2 +- tests/integration/setup.go | 10 +++++----- tests/integration/slashing.go | 6 +++--- tests/integration/stop_consumer.go | 4 ++-- tests/integration/throttle.go | 6 +++--- tests/integration/unbonding.go | 4 ++-- tests/integration/valset_update.go | 2 +- testutil/crypto/crypto.go | 2 +- testutil/ibc_testing/generic_setup.go | 8 ++++---- testutil/ibc_testing/specific_setup.go | 8 ++++---- testutil/integration/debug_test.go | 10 +++++----- testutil/integration/interfaces.go | 8 ++++---- testutil/keeper/expectations.go | 4 ++-- testutil/keeper/unit_test_helpers.go | 10 +++++----- testutil/simibc/chain_util.go | 4 ++-- testutil/simibc/relay_util.go | 4 ++-- testutil/simibc/relayed_path.go | 2 +- x/ccv/consumer/client/cli/query.go | 2 +- x/ccv/consumer/ibc_module.go | 8 ++++---- x/ccv/consumer/ibc_module_test.go | 10 +++++----- x/ccv/consumer/keeper/changeover_test.go | 4 ++-- x/ccv/consumer/keeper/distribution.go | 4 ++-- x/ccv/consumer/keeper/distribution_test.go | 4 ++-- x/ccv/consumer/keeper/genesis.go | 4 ++-- x/ccv/consumer/keeper/genesis_test.go | 10 +++++----- x/ccv/consumer/keeper/grpc_query.go | 2 +- x/ccv/consumer/keeper/hooks.go | 2 +- x/ccv/consumer/keeper/keeper.go | 4 ++-- x/ccv/consumer/keeper/keeper_test.go | 8 ++++---- x/ccv/consumer/keeper/params.go | 4 ++-- x/ccv/consumer/keeper/params_test.go | 6 +++--- x/ccv/consumer/keeper/relay.go | 4 ++-- x/ccv/consumer/keeper/relay_test.go | 8 ++++---- x/ccv/consumer/keeper/soft_opt_out.go | 2 +- x/ccv/consumer/keeper/soft_opt_out_test.go | 6 +++--- x/ccv/consumer/keeper/validators.go | 2 +- x/ccv/consumer/keeper/validators_test.go | 8 ++++---- x/ccv/consumer/module.go | 6 +++--- x/ccv/consumer/types/consumer.pb.go | 2 +- x/ccv/consumer/types/genesis.go | 2 +- x/ccv/consumer/types/genesis.pb.go | 2 +- x/ccv/consumer/types/genesis_test.go | 6 +++--- x/ccv/consumer/types/keys.go | 2 +- x/ccv/consumer/types/params.go | 2 +- x/ccv/consumer/types/params_test.go | 2 +- x/ccv/democracy/distribution/module.go | 2 +- x/ccv/provider/client/cli/query.go | 2 +- x/ccv/provider/client/cli/tx.go | 2 +- x/ccv/provider/client/proposal_handler.go | 2 +- x/ccv/provider/handler.go | 4 ++-- x/ccv/provider/handler_test.go | 10 +++++----- x/ccv/provider/ibc_module.go | 6 +++--- x/ccv/provider/ibc_module_test.go | 10 +++++----- x/ccv/provider/keeper/distribution.go | 4 ++-- x/ccv/provider/keeper/distribution_test.go | 6 +++--- x/ccv/provider/keeper/genesis.go | 4 ++-- x/ccv/provider/keeper/genesis_test.go | 12 +++++------ x/ccv/provider/keeper/grpc_query.go | 4 ++-- x/ccv/provider/keeper/hooks.go | 4 ++-- x/ccv/provider/keeper/hooks_test.go | 6 +++--- x/ccv/provider/keeper/keeper.go | 6 +++--- x/ccv/provider/keeper/keeper_test.go | 10 +++++----- x/ccv/provider/keeper/key_assignment.go | 4 ++-- x/ccv/provider/keeper/key_assignment_test.go | 10 +++++----- x/ccv/provider/keeper/msg_server.go | 4 ++-- x/ccv/provider/keeper/params.go | 4 ++-- x/ccv/provider/keeper/params_test.go | 4 ++-- x/ccv/provider/keeper/proposal.go | 6 +++--- x/ccv/provider/keeper/proposal_test.go | 12 +++++------ x/ccv/provider/keeper/relay.go | 4 ++-- x/ccv/provider/keeper/relay_test.go | 12 +++++------ x/ccv/provider/keeper/throttle.go | 4 ++-- x/ccv/provider/keeper/throttle_test.go | 10 +++++----- x/ccv/provider/module.go | 6 +++--- x/ccv/provider/module_test.go | 8 ++++---- x/ccv/provider/proposal_handler.go | 4 ++-- x/ccv/provider/proposal_handler_test.go | 6 +++--- x/ccv/provider/types/consumer.go | 4 ++-- x/ccv/provider/types/genesis.go | 2 +- x/ccv/provider/types/genesis.pb.go | 4 ++-- x/ccv/provider/types/genesis_test.go | 8 ++++---- x/ccv/provider/types/key_assignment.go | 2 +- x/ccv/provider/types/keys.go | 2 +- x/ccv/provider/types/keys_test.go | 4 ++-- x/ccv/provider/types/params.go | 4 ++-- x/ccv/provider/types/params_test.go | 2 +- x/ccv/provider/types/proposal.go | 2 +- x/ccv/provider/types/proposal_test.go | 2 +- x/ccv/provider/types/query.pb.go | 4 ++-- x/ccv/types/ccv_test.go | 2 +- x/ccv/types/utils_test.go | 4 ++-- 120 files changed, 331 insertions(+), 331 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c4e0937dd..88be04c52b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,22 +4,22 @@ Add an entry to the unreleased section whenever merging a PR to main that is not targeted at a specific release. These entries will eventually be included in a release. -## v.1.3.0 +## v.2.0.0 Date: May 12th, 2023 -Unlike prior releases, the ICS v1.3.0 release will be based on the main branch. v1.3.0 will contain all the accumulated PRs from the various releases below, along with other PRs that were merged, but not released to production. After v1.3.0, we plan to revamp release practices, and how we modularize the repo for consumer/provider. +Unlike prior releases, the ICS v2.0.0 release will be based on the main branch. v2.0.0 will contain all the accumulated PRs from the various releases below, along with other PRs that were merged, but not released to production. After v2.0.0, we plan to revamp release practices, and how we modularize the repo for consumer/provider. -Some PRs from v1.3.0 may reappear from other releases below. This is due to the fact that ICS v1.1.0 deviates from the commit ordering of the main branch, and other releases thereafter are based on v1.1.0. +Some PRs from v2.0.0 may reappear from other releases below. This is due to the fact that ICS v1.1.0 deviates from the commit ordering of the main branch, and other releases thereafter are based on v1.1.0. -### High level changes included in v1.3.0 +### High level changes included in v2.0.0 * MVP for standalone to consumer changeover, see [EPIC](https://github.com/cosmos/interchain-security/issues/756) * MVP for soft opt out, see [EPIC](https://github.com/cosmos/interchain-security/issues/851) * Various fixes, critical and non-critical * Docs updates which should not affect production code -## PRs included in v1.3.0 +## PRs included in v2.0.0 * (fix) Remove panics on failure to send IBC packets [#876](https://github.com/cosmos/interchain-security/pull/876) * (fix) consumer key prefix order to avoid complex migrations [#963](https://github.com/cosmos/interchain-security/pull/963) diff --git a/app/consumer-democracy/ante/forbidden_proposals_ante_test.go b/app/consumer-democracy/ante/forbidden_proposals_ante_test.go index 7a1f26b3f3..00e5adc6e2 100644 --- a/app/consumer-democracy/ante/forbidden_proposals_ante_test.go +++ b/app/consumer-democracy/ante/forbidden_proposals_ante_test.go @@ -8,8 +8,8 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/cosmos/cosmos-sdk/x/params/types/proposal" - app "github.com/cosmos/interchain-security/app/consumer-democracy" - "github.com/cosmos/interchain-security/app/consumer-democracy/ante" + app "github.com/cosmos/interchain-security/v2/app/consumer-democracy" + "github.com/cosmos/interchain-security/v2/app/consumer-democracy/ante" "github.com/stretchr/testify/require" ) diff --git a/app/consumer-democracy/ante_handler.go b/app/consumer-democracy/ante_handler.go index 8182b51095..b50d209312 100644 --- a/app/consumer-democracy/ante_handler.go +++ b/app/consumer-democracy/ante_handler.go @@ -7,9 +7,9 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/ante" ibcante "github.com/cosmos/ibc-go/v4/modules/core/ante" ibckeeper "github.com/cosmos/ibc-go/v4/modules/core/keeper" - democracyante "github.com/cosmos/interchain-security/app/consumer-democracy/ante" - consumerante "github.com/cosmos/interchain-security/app/consumer/ante" - ibcconsumerkeeper "github.com/cosmos/interchain-security/x/ccv/consumer/keeper" + democracyante "github.com/cosmos/interchain-security/v2/app/consumer-democracy/ante" + consumerante "github.com/cosmos/interchain-security/v2/app/consumer/ante" + ibcconsumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" ) // HandlerOptions extend the SDK's AnteHandler options by requiring the IBC diff --git a/app/consumer-democracy/app.go b/app/consumer-democracy/app.go index b65795f2a2..13c5f50dae 100644 --- a/app/consumer-democracy/app.go +++ b/app/consumer-democracy/app.go @@ -9,7 +9,7 @@ import ( "path/filepath" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - appparams "github.com/cosmos/interchain-security/app/params" + appparams "github.com/cosmos/interchain-security/v2/app/params" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" @@ -73,8 +73,8 @@ import ( porttypes "github.com/cosmos/ibc-go/v4/modules/core/05-port/types" ibchost "github.com/cosmos/ibc-go/v4/modules/core/24-host" ibckeeper "github.com/cosmos/ibc-go/v4/modules/core/keeper" - ibctestingcore "github.com/cosmos/interchain-security/legacy_ibc_testing/core" - ibctesting "github.com/cosmos/interchain-security/legacy_ibc_testing/testing" + ibctestingcore "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/core" + ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" "github.com/gorilla/mux" "github.com/rakyll/statik/fs" "github.com/spf13/cast" @@ -89,17 +89,17 @@ import ( distrclient "github.com/cosmos/cosmos-sdk/x/distribution/client" distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - testutil "github.com/cosmos/interchain-security/testutil/integration" - ccvdistr "github.com/cosmos/interchain-security/x/ccv/democracy/distribution" + testutil "github.com/cosmos/interchain-security/v2/testutil/integration" + ccvdistr "github.com/cosmos/interchain-security/v2/x/ccv/democracy/distribution" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - ccvstaking "github.com/cosmos/interchain-security/x/ccv/democracy/staking" + ccvstaking "github.com/cosmos/interchain-security/v2/x/ccv/democracy/staking" gov "github.com/cosmos/cosmos-sdk/x/gov" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - ccvgov "github.com/cosmos/interchain-security/x/ccv/democracy/governance" + ccvgov "github.com/cosmos/interchain-security/v2/x/ccv/democracy/governance" // add mint mint "github.com/cosmos/cosmos-sdk/x/mint" @@ -107,9 +107,9 @@ import ( minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" paramproposal "github.com/cosmos/cosmos-sdk/x/params/types/proposal" - consumer "github.com/cosmos/interchain-security/x/ccv/consumer" - consumerkeeper "github.com/cosmos/interchain-security/x/ccv/consumer/keeper" - consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" + consumer "github.com/cosmos/interchain-security/v2/x/ccv/consumer" + consumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" // unnamed import of statik for swagger UI support _ "github.com/cosmos/cosmos-sdk/client/docs/statik" diff --git a/app/consumer-democracy/proposals_whitelisting_test.go b/app/consumer-democracy/proposals_whitelisting_test.go index a485881b81..ecc14be44d 100644 --- a/app/consumer-democracy/proposals_whitelisting_test.go +++ b/app/consumer-democracy/proposals_whitelisting_test.go @@ -3,9 +3,9 @@ package app_test import ( "testing" - appConsumer "github.com/cosmos/interchain-security/app/consumer-democracy" - ibctesting "github.com/cosmos/interchain-security/legacy_ibc_testing/testing" - icstestingutils "github.com/cosmos/interchain-security/testutil/ibc_testing" + appConsumer "github.com/cosmos/interchain-security/v2/app/consumer-democracy" + ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" + icstestingutils "github.com/cosmos/interchain-security/v2/testutil/ibc_testing" "github.com/stretchr/testify/require" ) diff --git a/app/consumer/ante/disabled_modules_ante_test.go b/app/consumer/ante/disabled_modules_ante_test.go index d18c71e563..a41605b5df 100644 --- a/app/consumer/ante/disabled_modules_ante_test.go +++ b/app/consumer/ante/disabled_modules_ante_test.go @@ -8,8 +8,8 @@ import ( evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" ibcclienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - "github.com/cosmos/interchain-security/app/consumer/ante" - "github.com/cosmos/interchain-security/app/params" + "github.com/cosmos/interchain-security/v2/app/consumer/ante" + "github.com/cosmos/interchain-security/v2/app/params" "github.com/stretchr/testify/require" ) diff --git a/app/consumer/ante/msg_filter_ante_test.go b/app/consumer/ante/msg_filter_ante_test.go index 6803c375be..a8771f399e 100644 --- a/app/consumer/ante/msg_filter_ante_test.go +++ b/app/consumer/ante/msg_filter_ante_test.go @@ -6,8 +6,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" ibcclienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - "github.com/cosmos/interchain-security/app/consumer/ante" - "github.com/cosmos/interchain-security/app/params" + "github.com/cosmos/interchain-security/v2/app/consumer/ante" + "github.com/cosmos/interchain-security/v2/app/params" "github.com/stretchr/testify/require" ) diff --git a/app/consumer/ante_handler.go b/app/consumer/ante_handler.go index a070967551..12e0b3c5db 100644 --- a/app/consumer/ante_handler.go +++ b/app/consumer/ante_handler.go @@ -7,8 +7,8 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/ante" ibcante "github.com/cosmos/ibc-go/v4/modules/core/ante" ibckeeper "github.com/cosmos/ibc-go/v4/modules/core/keeper" - consumerante "github.com/cosmos/interchain-security/app/consumer/ante" - ibcconsumerkeeper "github.com/cosmos/interchain-security/x/ccv/consumer/keeper" + consumerante "github.com/cosmos/interchain-security/v2/app/consumer/ante" + ibcconsumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" ) // HandlerOptions extend the SDK's AnteHandler options by requiring the IBC diff --git a/app/consumer/app.go b/app/consumer/app.go index 0019a34e46..c100a0385e 100644 --- a/app/consumer/app.go +++ b/app/consumer/app.go @@ -67,9 +67,9 @@ import ( porttypes "github.com/cosmos/ibc-go/v4/modules/core/05-port/types" ibchost "github.com/cosmos/ibc-go/v4/modules/core/24-host" ibckeeper "github.com/cosmos/ibc-go/v4/modules/core/keeper" - appparams "github.com/cosmos/interchain-security/app/params" - ibctestingcore "github.com/cosmos/interchain-security/legacy_ibc_testing/core" - ibctesting "github.com/cosmos/interchain-security/legacy_ibc_testing/testing" + appparams "github.com/cosmos/interchain-security/v2/app/params" + ibctestingcore "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/core" + ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" "github.com/gorilla/mux" "github.com/rakyll/statik/fs" "github.com/spf13/cast" @@ -79,13 +79,13 @@ import ( tmos "github.com/tendermint/tendermint/libs/os" dbm "github.com/tendermint/tm-db" - ibcconsumer "github.com/cosmos/interchain-security/x/ccv/consumer" - ibcconsumerkeeper "github.com/cosmos/interchain-security/x/ccv/consumer/keeper" - ibcconsumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" + ibcconsumer "github.com/cosmos/interchain-security/v2/x/ccv/consumer" + ibcconsumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" + ibcconsumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" // unnamed import of statik for swagger UI support _ "github.com/cosmos/cosmos-sdk/client/docs/statik" - testutil "github.com/cosmos/interchain-security/testutil/integration" + testutil "github.com/cosmos/interchain-security/v2/testutil/integration" ) const ( diff --git a/app/provider/app.go b/app/provider/app.go index 27100a3c83..20aa133dee 100644 --- a/app/provider/app.go +++ b/app/provider/app.go @@ -8,7 +8,7 @@ import ( "os" "path/filepath" - appparams "github.com/cosmos/interchain-security/app/params" + appparams "github.com/cosmos/interchain-security/v2/app/params" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" @@ -84,8 +84,8 @@ import ( porttypes "github.com/cosmos/ibc-go/v4/modules/core/05-port/types" ibchost "github.com/cosmos/ibc-go/v4/modules/core/24-host" ibckeeper "github.com/cosmos/ibc-go/v4/modules/core/keeper" - ibctestingcore "github.com/cosmos/interchain-security/legacy_ibc_testing/core" - ibctesting "github.com/cosmos/interchain-security/legacy_ibc_testing/testing" + ibctestingcore "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/core" + ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" "github.com/gorilla/mux" "github.com/rakyll/statik/fs" @@ -96,12 +96,12 @@ import ( tmos "github.com/tendermint/tendermint/libs/os" dbm "github.com/tendermint/tm-db" - ibcprovider "github.com/cosmos/interchain-security/x/ccv/provider" - ibcproviderclient "github.com/cosmos/interchain-security/x/ccv/provider/client" - ibcproviderkeeper "github.com/cosmos/interchain-security/x/ccv/provider/keeper" - providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" + ibcprovider "github.com/cosmos/interchain-security/v2/x/ccv/provider" + ibcproviderclient "github.com/cosmos/interchain-security/v2/x/ccv/provider/client" + ibcproviderkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - testutil "github.com/cosmos/interchain-security/testutil/integration" + testutil "github.com/cosmos/interchain-security/v2/testutil/integration" // unnamed import of statik for swagger UI support _ "github.com/cosmos/cosmos-sdk/client/docs/statik" diff --git a/cmd/interchain-security-cd/cmd/root.go b/cmd/interchain-security-cd/cmd/root.go index 3a58df1748..d6b2b95098 100644 --- a/cmd/interchain-security-cd/cmd/root.go +++ b/cmd/interchain-security-cd/cmd/root.go @@ -31,8 +31,8 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/crisis" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" - simapp "github.com/cosmos/interchain-security/app/consumer" - "github.com/cosmos/interchain-security/app/params" + simapp "github.com/cosmos/interchain-security/v2/app/consumer" + "github.com/cosmos/interchain-security/v2/app/params" ) // NewRootCmd creates a new root command for simd. It is called once in the diff --git a/cmd/interchain-security-cd/main.go b/cmd/interchain-security-cd/main.go index 737a618cb6..abccff8eae 100644 --- a/cmd/interchain-security-cd/main.go +++ b/cmd/interchain-security-cd/main.go @@ -5,8 +5,8 @@ import ( "github.com/cosmos/cosmos-sdk/server" svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" - app "github.com/cosmos/interchain-security/app/consumer" - "github.com/cosmos/interchain-security/cmd/interchain-security-cd/cmd" + app "github.com/cosmos/interchain-security/v2/app/consumer" + "github.com/cosmos/interchain-security/v2/cmd/interchain-security-cd/cmd" ) func main() { diff --git a/cmd/interchain-security-cdd/cmd/root.go b/cmd/interchain-security-cdd/cmd/root.go index cf41c6431f..3586edafd8 100644 --- a/cmd/interchain-security-cdd/cmd/root.go +++ b/cmd/interchain-security-cdd/cmd/root.go @@ -31,8 +31,8 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/crisis" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" - simapp "github.com/cosmos/interchain-security/app/consumer-democracy" - "github.com/cosmos/interchain-security/app/params" + simapp "github.com/cosmos/interchain-security/v2/app/consumer-democracy" + "github.com/cosmos/interchain-security/v2/app/params" ) // NewRootCmd creates a new root command for simd. It is called once in the diff --git a/cmd/interchain-security-cdd/main.go b/cmd/interchain-security-cdd/main.go index 3ca199c480..427fa3ae7d 100644 --- a/cmd/interchain-security-cdd/main.go +++ b/cmd/interchain-security-cdd/main.go @@ -5,8 +5,8 @@ import ( "github.com/cosmos/cosmos-sdk/server" svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" - app "github.com/cosmos/interchain-security/app/consumer-democracy" - "github.com/cosmos/interchain-security/cmd/interchain-security-cdd/cmd" + app "github.com/cosmos/interchain-security/v2/app/consumer-democracy" + "github.com/cosmos/interchain-security/v2/cmd/interchain-security-cdd/cmd" ) func main() { diff --git a/cmd/interchain-security-pd/cmd/root.go b/cmd/interchain-security-pd/cmd/root.go index 89ef01ec46..69341b917b 100644 --- a/cmd/interchain-security-pd/cmd/root.go +++ b/cmd/interchain-security-pd/cmd/root.go @@ -31,8 +31,8 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/crisis" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" - "github.com/cosmos/interchain-security/app/params" - simapp "github.com/cosmos/interchain-security/app/provider" + "github.com/cosmos/interchain-security/v2/app/params" + simapp "github.com/cosmos/interchain-security/v2/app/provider" ) // NewRootCmd creates a new root command for simd. It is called once in the diff --git a/cmd/interchain-security-pd/main.go b/cmd/interchain-security-pd/main.go index 879e65a06b..09e145206a 100644 --- a/cmd/interchain-security-pd/main.go +++ b/cmd/interchain-security-pd/main.go @@ -5,8 +5,8 @@ import ( "github.com/cosmos/cosmos-sdk/server" svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" - app "github.com/cosmos/interchain-security/app/provider" - "github.com/cosmos/interchain-security/cmd/interchain-security-pd/cmd" + app "github.com/cosmos/interchain-security/v2/app/provider" + "github.com/cosmos/interchain-security/v2/cmd/interchain-security-pd/cmd" ) func main() { diff --git a/go.mod b/go.mod index 98999a06bb..6fd0f70305 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/cosmos/interchain-security +module github.com/cosmos/interchain-security/v2 go 1.19 diff --git a/legacy_ibc_testing/simapp/test_helpers.go b/legacy_ibc_testing/simapp/test_helpers.go index c6884dc28c..fb680aa082 100644 --- a/legacy_ibc_testing/simapp/test_helpers.go +++ b/legacy_ibc_testing/simapp/test_helpers.go @@ -19,7 +19,7 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmtypes "github.com/tendermint/tendermint/types" - "github.com/cosmos/interchain-security/legacy_ibc_testing/simapp/helpers" + "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/simapp/helpers" ) /* diff --git a/legacy_ibc_testing/testing/app.go b/legacy_ibc_testing/testing/app.go index e23980c21d..45d5248773 100644 --- a/legacy_ibc_testing/testing/app.go +++ b/legacy_ibc_testing/testing/app.go @@ -5,7 +5,7 @@ import ( "testing" "time" - "github.com/cosmos/interchain-security/legacy_ibc_testing/core" + "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/core" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" @@ -24,7 +24,7 @@ import ( "github.com/cosmos/ibc-go/v4/modules/core/keeper" - "github.com/cosmos/interchain-security/legacy_ibc_testing/simapp" + "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/simapp" ) /* diff --git a/legacy_ibc_testing/testing/chain.go b/legacy_ibc_testing/testing/chain.go index abea4131d9..f86bdda905 100644 --- a/legacy_ibc_testing/testing/chain.go +++ b/legacy_ibc_testing/testing/chain.go @@ -34,8 +34,8 @@ import ( "github.com/cosmos/ibc-go/v4/modules/core/types" ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" "github.com/cosmos/ibc-go/v4/testing/mock" - ibctestingcore "github.com/cosmos/interchain-security/legacy_ibc_testing/core" - "github.com/cosmos/interchain-security/legacy_ibc_testing/simapp" + ibctestingcore "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/core" + "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/simapp" ) /* diff --git a/tests/difference/core/driver/core_test.go b/tests/difference/core/driver/core_test.go index 8d54f2560a..389935e2bc 100644 --- a/tests/difference/core/driver/core_test.go +++ b/tests/difference/core/driver/core_test.go @@ -9,18 +9,18 @@ import ( "github.com/stretchr/testify/suite" channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - ibctestingcore "github.com/cosmos/interchain-security/legacy_ibc_testing/core" - ibctesting "github.com/cosmos/interchain-security/legacy_ibc_testing/testing" + ibctestingcore "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/core" + ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - appConsumer "github.com/cosmos/interchain-security/app/consumer" - appProvider "github.com/cosmos/interchain-security/app/provider" + appConsumer "github.com/cosmos/interchain-security/v2/app/consumer" + appProvider "github.com/cosmos/interchain-security/v2/app/provider" - simibc "github.com/cosmos/interchain-security/testutil/simibc" + simibc "github.com/cosmos/interchain-security/v2/testutil/simibc" slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" - consumerkeeper "github.com/cosmos/interchain-security/x/ccv/consumer/keeper" + consumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" ) type CoreSuite struct { diff --git a/tests/difference/core/driver/setup.go b/tests/difference/core/driver/setup.go index 905869441e..4798c2e3ca 100644 --- a/tests/difference/core/driver/setup.go +++ b/tests/difference/core/driver/setup.go @@ -18,7 +18,7 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmtypes "github.com/tendermint/tendermint/types" - ibctesting "github.com/cosmos/interchain-security/legacy_ibc_testing/testing" + ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -32,15 +32,15 @@ import ( slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - appConsumer "github.com/cosmos/interchain-security/app/consumer" - appProvider "github.com/cosmos/interchain-security/app/provider" - icstestingutils "github.com/cosmos/interchain-security/testutil/ibc_testing" - simibc "github.com/cosmos/interchain-security/testutil/simibc" - consumerkeeper "github.com/cosmos/interchain-security/x/ccv/consumer/keeper" - consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" - providerkeeper "github.com/cosmos/interchain-security/x/ccv/provider/keeper" - - ccv "github.com/cosmos/interchain-security/x/ccv/types" + appConsumer "github.com/cosmos/interchain-security/v2/app/consumer" + appProvider "github.com/cosmos/interchain-security/v2/app/provider" + icstestingutils "github.com/cosmos/interchain-security/v2/testutil/ibc_testing" + simibc "github.com/cosmos/interchain-security/v2/testutil/simibc" + consumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" + + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" ) type Builder struct { diff --git a/tests/e2e/actions.go b/tests/e2e/actions.go index 0093026a34..4a4c471f79 100644 --- a/tests/e2e/actions.go +++ b/tests/e2e/actions.go @@ -13,10 +13,10 @@ import ( evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - "github.com/cosmos/interchain-security/x/ccv/provider/client" - "github.com/cosmos/interchain-security/x/ccv/provider/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/client" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" "github.com/tidwall/gjson" ) diff --git a/tests/integration/common.go b/tests/integration/common.go index 6daff30e02..00ad6536cf 100644 --- a/tests/integration/common.go +++ b/tests/integration/common.go @@ -13,11 +13,11 @@ import ( commitmenttypes "github.com/cosmos/ibc-go/v4/modules/core/23-commitment/types" "github.com/cosmos/ibc-go/v4/modules/core/exported" ibctm "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - ibctesting "github.com/cosmos/interchain-security/legacy_ibc_testing/testing" - icstestingutils "github.com/cosmos/interchain-security/testutil/ibc_testing" - testutil "github.com/cosmos/interchain-security/testutil/integration" - providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" + icstestingutils "github.com/cosmos/interchain-security/v2/testutil/ibc_testing" + testutil "github.com/cosmos/interchain-security/v2/testutil/integration" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" tmtypes "github.com/tendermint/tendermint/types" diff --git a/tests/integration/democracy.go b/tests/integration/democracy.go index 6531bb1a21..f13398aa91 100644 --- a/tests/integration/democracy.go +++ b/tests/integration/democracy.go @@ -7,15 +7,15 @@ import ( "time" sdk "github.com/cosmos/cosmos-sdk/types" - ibctesting "github.com/cosmos/interchain-security/legacy_ibc_testing/testing" - icstestingutils "github.com/cosmos/interchain-security/testutil/ibc_testing" + ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" + icstestingutils "github.com/cosmos/interchain-security/v2/testutil/ibc_testing" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" proposaltypes "github.com/cosmos/cosmos-sdk/x/params/types/proposal" - testutil "github.com/cosmos/interchain-security/testutil/integration" - consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" + testutil "github.com/cosmos/interchain-security/v2/testutil/integration" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" "github.com/stretchr/testify/suite" ) diff --git a/tests/integration/distribution.go b/tests/integration/distribution.go index 7fdd8ec7f3..b9e3b9975e 100644 --- a/tests/integration/distribution.go +++ b/tests/integration/distribution.go @@ -7,9 +7,9 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" transfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" - consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" - providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" ) // This test is valid for minimal viable consumer chain diff --git a/tests/integration/expired_client.go b/tests/integration/expired_client.go index 90ce003b30..16abe75c35 100644 --- a/tests/integration/expired_client.go +++ b/tests/integration/expired_client.go @@ -9,8 +9,8 @@ import ( clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" ibcexported "github.com/cosmos/ibc-go/v4/modules/core/exported" ibctm "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - ibctesting "github.com/cosmos/interchain-security/legacy_ibc_testing/testing" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" abci "github.com/tendermint/tendermint/abci/types" ) diff --git a/tests/integration/instance_test.go b/tests/integration/instance_test.go index cd6ddcfe35..7e1e8dd608 100644 --- a/tests/integration/instance_test.go +++ b/tests/integration/instance_test.go @@ -3,11 +3,11 @@ package integration_test import ( "testing" - appConsumer "github.com/cosmos/interchain-security/app/consumer" - appConsumerDemocracy "github.com/cosmos/interchain-security/app/consumer-democracy" - appProvider "github.com/cosmos/interchain-security/app/provider" - intg "github.com/cosmos/interchain-security/tests/integration" - icstestingutils "github.com/cosmos/interchain-security/testutil/ibc_testing" + appConsumer "github.com/cosmos/interchain-security/v2/app/consumer" + appConsumerDemocracy "github.com/cosmos/interchain-security/v2/app/consumer-democracy" + appProvider "github.com/cosmos/interchain-security/v2/app/provider" + intg "github.com/cosmos/interchain-security/v2/tests/integration" + icstestingutils "github.com/cosmos/interchain-security/v2/testutil/ibc_testing" "github.com/stretchr/testify/suite" ) diff --git a/tests/integration/key_assignment.go b/tests/integration/key_assignment.go index b026d23582..bf0cc394c3 100644 --- a/tests/integration/key_assignment.go +++ b/tests/integration/key_assignment.go @@ -4,8 +4,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/cosmos/ibc-go/v4/testing/mock" - providerkeeper "github.com/cosmos/interchain-security/x/ccv/provider/keeper" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" tmencoding "github.com/tendermint/tendermint/crypto/encoding" tmprotocrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" ) diff --git a/tests/integration/normal_operations.go b/tests/integration/normal_operations.go index 187aa3422f..e752d783a4 100644 --- a/tests/integration/normal_operations.go +++ b/tests/integration/normal_operations.go @@ -2,7 +2,7 @@ package integration import ( "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" - consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" ) diff --git a/tests/integration/setup.go b/tests/integration/setup.go index 3903175214..ef1b85f3f7 100644 --- a/tests/integration/setup.go +++ b/tests/integration/setup.go @@ -6,16 +6,16 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" "github.com/cosmos/ibc-go/v4/testing/mock" - testutil "github.com/cosmos/interchain-security/testutil/integration" + testutil "github.com/cosmos/interchain-security/v2/testutil/integration" tmencoding "github.com/tendermint/tendermint/crypto/encoding" - icstestingutils "github.com/cosmos/interchain-security/testutil/ibc_testing" - consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + icstestingutils "github.com/cosmos/interchain-security/v2/testutil/ibc_testing" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" transfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - ibctesting "github.com/cosmos/interchain-security/legacy_ibc_testing/testing" + ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" "github.com/stretchr/testify/suite" ) diff --git a/tests/integration/slashing.go b/tests/integration/slashing.go index f39c027c90..6e60bc5df3 100644 --- a/tests/integration/slashing.go +++ b/tests/integration/slashing.go @@ -9,12 +9,12 @@ import ( evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - keepertestutil "github.com/cosmos/interchain-security/testutil/keeper" - providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" + keepertestutil "github.com/cosmos/interchain-security/v2/testutil/keeper" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" tmtypes "github.com/tendermint/tendermint/types" abci "github.com/tendermint/tendermint/abci/types" diff --git a/tests/integration/stop_consumer.go b/tests/integration/stop_consumer.go index 32448d6b73..041b6db468 100644 --- a/tests/integration/stop_consumer.go +++ b/tests/integration/stop_consumer.go @@ -4,8 +4,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" abci "github.com/tendermint/tendermint/abci/types" ) diff --git a/tests/integration/throttle.go b/tests/integration/throttle.go index 132894c7f4..c2ef98a4ae 100644 --- a/tests/integration/throttle.go +++ b/tests/integration/throttle.go @@ -6,9 +6,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - icstestingutils "github.com/cosmos/interchain-security/testutil/ibc_testing" - providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/x/ccv/types" + icstestingutils "github.com/cosmos/interchain-security/v2/testutil/ibc_testing" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" tmtypes "github.com/tendermint/tendermint/types" ) diff --git a/tests/integration/unbonding.go b/tests/integration/unbonding.go index 9b581730a7..fdb3e3af13 100644 --- a/tests/integration/unbonding.go +++ b/tests/integration/unbonding.go @@ -5,8 +5,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" - providerkeeper "github.com/cosmos/interchain-security/x/ccv/provider/keeper" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" ) // TestUndelegationNormalOperation tests that undelegations complete after diff --git a/tests/integration/valset_update.go b/tests/integration/valset_update.go index d54bc5edce..d255c7f18d 100644 --- a/tests/integration/valset_update.go +++ b/tests/integration/valset_update.go @@ -7,7 +7,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" abci "github.com/tendermint/tendermint/abci/types" ) diff --git a/testutil/crypto/crypto.go b/testutil/crypto/crypto.go index dee73a6144..891f357c9a 100644 --- a/testutil/crypto/crypto.go +++ b/testutil/crypto/crypto.go @@ -11,7 +11,7 @@ import ( sdkcryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdktypes "github.com/cosmos/cosmos-sdk/types" sdkstakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" tmcrypto "github.com/tendermint/tendermint/crypto" tmprotocrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" diff --git a/testutil/ibc_testing/generic_setup.go b/testutil/ibc_testing/generic_setup.go index 5b3eef8fef..9a1bbdd48b 100644 --- a/testutil/ibc_testing/generic_setup.go +++ b/testutil/ibc_testing/generic_setup.go @@ -6,10 +6,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - ibctesting "github.com/cosmos/interchain-security/legacy_ibc_testing/testing" - testutil "github.com/cosmos/interchain-security/testutil/integration" - testkeeper "github.com/cosmos/interchain-security/testutil/keeper" - consumerkeeper "github.com/cosmos/interchain-security/x/ccv/consumer/keeper" + ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" + testutil "github.com/cosmos/interchain-security/v2/testutil/integration" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" + consumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" "github.com/stretchr/testify/suite" diff --git a/testutil/ibc_testing/specific_setup.go b/testutil/ibc_testing/specific_setup.go index dc596a6d45..3e3886c818 100644 --- a/testutil/ibc_testing/specific_setup.go +++ b/testutil/ibc_testing/specific_setup.go @@ -9,14 +9,14 @@ import ( "github.com/cosmos/cosmos-sdk/simapp" - ibctesting "github.com/cosmos/interchain-security/legacy_ibc_testing/testing" + ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" "github.com/tendermint/tendermint/libs/log" tmdb "github.com/tendermint/tm-db" - appConsumer "github.com/cosmos/interchain-security/app/consumer" - appConsumerDemocracy "github.com/cosmos/interchain-security/app/consumer-democracy" - appProvider "github.com/cosmos/interchain-security/app/provider" + appConsumer "github.com/cosmos/interchain-security/v2/app/consumer" + appConsumerDemocracy "github.com/cosmos/interchain-security/v2/app/consumer-democracy" + appProvider "github.com/cosmos/interchain-security/v2/app/provider" ) // ProviderAppIniter implements ibctesting.AppIniter for a provider app diff --git a/testutil/integration/debug_test.go b/testutil/integration/debug_test.go index 8549d12217..95190ba8a0 100644 --- a/testutil/integration/debug_test.go +++ b/testutil/integration/debug_test.go @@ -6,11 +6,11 @@ import ( "reflect" "testing" - appConsumer "github.com/cosmos/interchain-security/app/consumer" - appConsumerDemocracy "github.com/cosmos/interchain-security/app/consumer-democracy" - appProvider "github.com/cosmos/interchain-security/app/provider" - integr "github.com/cosmos/interchain-security/tests/integration" - icstestingutils "github.com/cosmos/interchain-security/testutil/ibc_testing" + appConsumer "github.com/cosmos/interchain-security/v2/app/consumer" + appConsumerDemocracy "github.com/cosmos/interchain-security/v2/app/consumer-democracy" + appProvider "github.com/cosmos/interchain-security/v2/app/provider" + integr "github.com/cosmos/interchain-security/v2/tests/integration" + icstestingutils "github.com/cosmos/interchain-security/v2/testutil/ibc_testing" ) // runCCVTestByName runs a single CCV integration test by name, using a CCVTestSuite diff --git a/testutil/integration/interfaces.go b/testutil/integration/interfaces.go index a9e48e3ede..51ffe51154 100644 --- a/testutil/integration/interfaces.go +++ b/testutil/integration/interfaces.go @@ -13,10 +13,10 @@ import ( paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" "github.com/cosmos/cosmos-sdk/x/staking/types" - ibctesting "github.com/cosmos/interchain-security/legacy_ibc_testing/testing" - consumerkeeper "github.com/cosmos/interchain-security/x/ccv/consumer/keeper" - providerkeeper "github.com/cosmos/interchain-security/x/ccv/provider/keeper" - ccvtypes "github.com/cosmos/interchain-security/x/ccv/types" + ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" + consumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" + providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" + ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" abci "github.com/tendermint/tendermint/abci/types" ) diff --git a/testutil/keeper/expectations.go b/testutil/keeper/expectations.go index d0392affcb..6377bf5613 100644 --- a/testutil/keeper/expectations.go +++ b/testutil/keeper/expectations.go @@ -10,11 +10,11 @@ import ( conntypes "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types" channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" "github.com/golang/mock/gomock" host "github.com/cosmos/ibc-go/v4/modules/core/24-host" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" extra "github.com/oxyno-zeta/gomock-extra-matcher" ) diff --git a/testutil/keeper/unit_test_helpers.go b/testutil/keeper/unit_test_helpers.go index 23c39ec128..426a94b4b6 100644 --- a/testutil/keeper/unit_test_helpers.go +++ b/testutil/keeper/unit_test_helpers.go @@ -16,11 +16,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - consumerkeeper "github.com/cosmos/interchain-security/x/ccv/consumer/keeper" - consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" - providerkeeper "github.com/cosmos/interchain-security/x/ccv/provider/keeper" - providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" - "github.com/cosmos/interchain-security/x/ccv/types" + consumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + "github.com/cosmos/interchain-security/v2/x/ccv/types" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/libs/log" diff --git a/testutil/simibc/chain_util.go b/testutil/simibc/chain_util.go index a7ecf7f9de..144fca7bf0 100644 --- a/testutil/simibc/chain_util.go +++ b/testutil/simibc/chain_util.go @@ -5,8 +5,8 @@ import ( channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - ibctestingcore "github.com/cosmos/interchain-security/legacy_ibc_testing/core" - ibctesting "github.com/cosmos/interchain-security/legacy_ibc_testing/testing" + ibctestingcore "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/core" + ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" abci "github.com/tendermint/tendermint/abci/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" ) diff --git a/testutil/simibc/relay_util.go b/testutil/simibc/relay_util.go index 267ec33a4b..761b1b5512 100644 --- a/testutil/simibc/relay_util.go +++ b/testutil/simibc/relay_util.go @@ -7,8 +7,8 @@ import ( channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" host "github.com/cosmos/ibc-go/v4/modules/core/24-host" ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - simapp "github.com/cosmos/interchain-security/legacy_ibc_testing/simapp" - ibctesting "github.com/cosmos/interchain-security/legacy_ibc_testing/testing" + simapp "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/simapp" + ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" "github.com/stretchr/testify/require" tmtypes "github.com/tendermint/tendermint/types" ) diff --git a/testutil/simibc/relayed_path.go b/testutil/simibc/relayed_path.go index 2f9e63ef79..d13303009a 100644 --- a/testutil/simibc/relayed_path.go +++ b/testutil/simibc/relayed_path.go @@ -5,7 +5,7 @@ import ( "time" ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - ibctesting "github.com/cosmos/interchain-security/legacy_ibc_testing/testing" + ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" ) // RelayedPath is a wrapper around ibctesting.Path gives fine-grained diff --git a/x/ccv/consumer/client/cli/query.go b/x/ccv/consumer/client/cli/query.go index 27910ef76b..3c42a8a33c 100644 --- a/x/ccv/consumer/client/cli/query.go +++ b/x/ccv/consumer/client/cli/query.go @@ -5,7 +5,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/interchain-security/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" ) // NewQueryCmd returns a root CLI command handler for all x/ccv/provider query commands. diff --git a/x/ccv/consumer/ibc_module.go b/x/ccv/consumer/ibc_module.go index ab2dad74dc..d7191d0be0 100644 --- a/x/ccv/consumer/ibc_module.go +++ b/x/ccv/consumer/ibc_module.go @@ -13,10 +13,10 @@ import ( porttypes "github.com/cosmos/ibc-go/v4/modules/core/05-port/types" host "github.com/cosmos/ibc-go/v4/modules/core/24-host" ibcexported "github.com/cosmos/ibc-go/v4/modules/core/exported" - "github.com/cosmos/interchain-security/x/ccv/consumer/keeper" - consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" - providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" - "github.com/cosmos/interchain-security/x/ccv/types" + "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + "github.com/cosmos/interchain-security/v2/x/ccv/types" ) // OnChanOpenInit implements the IBCModule interface diff --git a/x/ccv/consumer/ibc_module_test.go b/x/ccv/consumer/ibc_module_test.go index 3d4e56cbba..fcc82d6d2f 100644 --- a/x/ccv/consumer/ibc_module_test.go +++ b/x/ccv/consumer/ibc_module_test.go @@ -9,11 +9,11 @@ import ( conntypes "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types" channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" host "github.com/cosmos/ibc-go/v4/modules/core/24-host" - testkeeper "github.com/cosmos/interchain-security/testutil/keeper" - "github.com/cosmos/interchain-security/x/ccv/consumer" - consumerkeeper "github.com/cosmos/interchain-security/x/ccv/consumer/keeper" - providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" + "github.com/cosmos/interchain-security/v2/x/ccv/consumer" + consumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" ) diff --git a/x/ccv/consumer/keeper/changeover_test.go b/x/ccv/consumer/keeper/changeover_test.go index 136e72d85c..971811c204 100644 --- a/x/ccv/consumer/keeper/changeover_test.go +++ b/x/ccv/consumer/keeper/changeover_test.go @@ -5,8 +5,8 @@ import ( sdkcryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/cosmos/interchain-security/testutil/crypto" - uthelpers "github.com/cosmos/interchain-security/testutil/keeper" + "github.com/cosmos/interchain-security/v2/testutil/crypto" + uthelpers "github.com/cosmos/interchain-security/v2/testutil/keeper" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" diff --git a/x/ccv/consumer/keeper/distribution.go b/x/ccv/consumer/keeper/distribution.go index 0b856e2bef..6d56f6c901 100644 --- a/x/ccv/consumer/keeper/distribution.go +++ b/x/ccv/consumer/keeper/distribution.go @@ -11,8 +11,8 @@ import ( clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - "github.com/cosmos/interchain-security/x/ccv/consumer/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" ) // EndBlockRD executes EndBlock logic for the Reward Distribution sub-protocol. diff --git a/x/ccv/consumer/keeper/distribution_test.go b/x/ccv/consumer/keeper/distribution_test.go index d1bd7c2164..7e17157c3d 100644 --- a/x/ccv/consumer/keeper/distribution_test.go +++ b/x/ccv/consumer/keeper/distribution_test.go @@ -8,8 +8,8 @@ import ( "github.com/stretchr/testify/require" authTypes "github.com/cosmos/cosmos-sdk/x/auth/types" - testkeeper "github.com/cosmos/interchain-security/testutil/keeper" - "github.com/cosmos/interchain-security/x/ccv/consumer/types" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" + "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" "github.com/golang/mock/gomock" ) diff --git a/x/ccv/consumer/keeper/genesis.go b/x/ccv/consumer/keeper/genesis.go index 121ab07134..08f6327909 100644 --- a/x/ccv/consumer/keeper/genesis.go +++ b/x/ccv/consumer/keeper/genesis.go @@ -4,8 +4,8 @@ import ( "fmt" sdk "github.com/cosmos/cosmos-sdk/types" - consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" abci "github.com/tendermint/tendermint/abci/types" ) diff --git a/x/ccv/consumer/keeper/genesis_test.go b/x/ccv/consumer/keeper/genesis_test.go index 0436597c7c..55c5c41b19 100644 --- a/x/ccv/consumer/keeper/genesis_test.go +++ b/x/ccv/consumer/keeper/genesis_test.go @@ -9,10 +9,10 @@ import ( clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" commitmenttypes "github.com/cosmos/ibc-go/v4/modules/core/23-commitment/types" ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - "github.com/cosmos/interchain-security/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/testutil/keeper" - consumerkeeper "github.com/cosmos/interchain-security/x/ccv/consumer/keeper" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + "github.com/cosmos/interchain-security/v2/testutil/crypto" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" + consumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" @@ -20,7 +20,7 @@ import ( cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" - consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" ) // TestInitGenesis tests that a consumer chain is correctly initialised from genesis. diff --git a/x/ccv/consumer/keeper/grpc_query.go b/x/ccv/consumer/keeper/grpc_query.go index b82b3db7e4..7fc2e0faeb 100644 --- a/x/ccv/consumer/keeper/grpc_query.go +++ b/x/ccv/consumer/keeper/grpc_query.go @@ -4,7 +4,7 @@ import ( "context" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/interchain-security/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) diff --git a/x/ccv/consumer/keeper/hooks.go b/x/ccv/consumer/keeper/hooks.go index 5643d15cb2..6067f2adb3 100644 --- a/x/ccv/consumer/keeper/hooks.go +++ b/x/ccv/consumer/keeper/hooks.go @@ -2,7 +2,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" ) var _ ccv.ConsumerHooks = Keeper{} diff --git a/x/ccv/consumer/keeper/keeper.go b/x/ccv/consumer/keeper/keeper.go index d24f5fbd39..ec89052ac0 100644 --- a/x/ccv/consumer/keeper/keeper.go +++ b/x/ccv/consumer/keeper/keeper.go @@ -18,8 +18,8 @@ import ( host "github.com/cosmos/ibc-go/v4/modules/core/24-host" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/interchain-security/x/ccv/consumer/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" tmtypes "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/libs/log" ) diff --git a/x/ccv/consumer/keeper/keeper_test.go b/x/ccv/consumer/keeper/keeper_test.go index 58f111e8ef..4280f1de37 100644 --- a/x/ccv/consumer/keeper/keeper_test.go +++ b/x/ccv/consumer/keeper/keeper_test.go @@ -10,10 +10,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" conntypes "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types" - "github.com/cosmos/interchain-security/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/testutil/keeper" - "github.com/cosmos/interchain-security/x/ccv/consumer/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + "github.com/cosmos/interchain-security/v2/testutil/crypto" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" + "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" diff --git a/x/ccv/consumer/keeper/params.go b/x/ccv/consumer/keeper/params.go index 1a0a071ce2..9f9d37e025 100644 --- a/x/ccv/consumer/keeper/params.go +++ b/x/ccv/consumer/keeper/params.go @@ -5,8 +5,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/interchain-security/x/ccv/consumer/types" - ccvtypes "github.com/cosmos/interchain-security/x/ccv/types" + "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" ) // GetParams returns the params for the consumer ccv module diff --git a/x/ccv/consumer/keeper/params_test.go b/x/ccv/consumer/keeper/params_test.go index 674b57226c..d28c964e56 100644 --- a/x/ccv/consumer/keeper/params_test.go +++ b/x/ccv/consumer/keeper/params_test.go @@ -4,9 +4,9 @@ import ( "testing" "time" - testkeeper "github.com/cosmos/interchain-security/testutil/keeper" - "github.com/cosmos/interchain-security/x/ccv/consumer/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" + "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" "github.com/stretchr/testify/require" ) diff --git a/x/ccv/consumer/keeper/relay.go b/x/ccv/consumer/keeper/relay.go index fe8455563e..2bf1580830 100644 --- a/x/ccv/consumer/keeper/relay.go +++ b/x/ccv/consumer/keeper/relay.go @@ -10,8 +10,8 @@ import ( clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" "github.com/cosmos/ibc-go/v4/modules/core/exported" - "github.com/cosmos/interchain-security/x/ccv/consumer/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" abci "github.com/tendermint/tendermint/abci/types" ) diff --git a/x/ccv/consumer/keeper/relay_test.go b/x/ccv/consumer/keeper/relay_test.go index fc09a6b250..60fbbfe719 100644 --- a/x/ccv/consumer/keeper/relay_test.go +++ b/x/ccv/consumer/keeper/relay_test.go @@ -13,10 +13,10 @@ import ( clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" host "github.com/cosmos/ibc-go/v4/modules/core/24-host" - "github.com/cosmos/interchain-security/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/testutil/keeper" - consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" - "github.com/cosmos/interchain-security/x/ccv/types" + "github.com/cosmos/interchain-security/v2/testutil/crypto" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v2/x/ccv/types" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" diff --git a/x/ccv/consumer/keeper/soft_opt_out.go b/x/ccv/consumer/keeper/soft_opt_out.go index 4424766e20..26b490633d 100644 --- a/x/ccv/consumer/keeper/soft_opt_out.go +++ b/x/ccv/consumer/keeper/soft_opt_out.go @@ -5,7 +5,7 @@ import ( "sort" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/interchain-security/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" ) // SetSmallestNonOptOutPower sets the smallest validator power that cannot soft opt out. diff --git a/x/ccv/consumer/keeper/soft_opt_out_test.go b/x/ccv/consumer/keeper/soft_opt_out_test.go index fd865cdd4c..d1c9a813de 100644 --- a/x/ccv/consumer/keeper/soft_opt_out_test.go +++ b/x/ccv/consumer/keeper/soft_opt_out_test.go @@ -3,9 +3,9 @@ package keeper_test import ( "testing" - "github.com/cosmos/interchain-security/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/testutil/keeper" - "github.com/cosmos/interchain-security/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v2/testutil/crypto" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" + "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" "github.com/stretchr/testify/require" tmtypes "github.com/tendermint/tendermint/types" ) diff --git a/x/ccv/consumer/keeper/validators.go b/x/ccv/consumer/keeper/validators.go index 11d65cbd9a..0c7880602e 100644 --- a/x/ccv/consumer/keeper/validators.go +++ b/x/ccv/consumer/keeper/validators.go @@ -7,7 +7,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/cosmos/interchain-security/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" abci "github.com/tendermint/tendermint/abci/types" ) diff --git a/x/ccv/consumer/keeper/validators_test.go b/x/ccv/consumer/keeper/validators_test.go index 8ad3ad35c2..a5ad0898e2 100644 --- a/x/ccv/consumer/keeper/validators_test.go +++ b/x/ccv/consumer/keeper/validators_test.go @@ -6,10 +6,10 @@ import ( cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/cosmos/interchain-security/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/testutil/keeper" - "github.com/cosmos/interchain-security/x/ccv/consumer/keeper" - "github.com/cosmos/interchain-security/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v2/testutil/crypto" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" + "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" + "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" tmrand "github.com/tendermint/tendermint/libs/rand" diff --git a/x/ccv/consumer/module.go b/x/ccv/consumer/module.go index 58c2b0af01..444b255156 100644 --- a/x/ccv/consumer/module.go +++ b/x/ccv/consumer/module.go @@ -19,10 +19,10 @@ import ( simtypes "github.com/cosmos/cosmos-sdk/types/simulation" porttypes "github.com/cosmos/ibc-go/v4/modules/core/05-port/types" - "github.com/cosmos/interchain-security/x/ccv/consumer/client/cli" - "github.com/cosmos/interchain-security/x/ccv/consumer/keeper" + "github.com/cosmos/interchain-security/v2/x/ccv/consumer/client/cli" + "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" - consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" ) var ( diff --git a/x/ccv/consumer/types/consumer.pb.go b/x/ccv/consumer/types/consumer.pb.go index 34ef7d0718..ae6a25761b 100644 --- a/x/ccv/consumer/types/consumer.pb.go +++ b/x/ccv/consumer/types/consumer.pb.go @@ -6,7 +6,7 @@ package types import ( fmt "fmt" types "github.com/cosmos/cosmos-sdk/codec/types" - _ "github.com/cosmos/interchain-security/x/ccv/types" + _ "github.com/cosmos/interchain-security/v2/x/ccv/types" _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" diff --git a/x/ccv/consumer/types/genesis.go b/x/ccv/consumer/types/genesis.go index c3856ab1de..a21e434de3 100644 --- a/x/ccv/consumer/types/genesis.go +++ b/x/ccv/consumer/types/genesis.go @@ -3,7 +3,7 @@ package types import ( errorsmod "cosmossdk.io/errors" ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" abci "github.com/tendermint/tendermint/abci/types" ) diff --git a/x/ccv/consumer/types/genesis.pb.go b/x/ccv/consumer/types/genesis.pb.go index 47253f25a1..f4bb68d5ef 100644 --- a/x/ccv/consumer/types/genesis.pb.go +++ b/x/ccv/consumer/types/genesis.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" _ "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" types "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - types2 "github.com/cosmos/interchain-security/x/ccv/types" + types2 "github.com/cosmos/interchain-security/v2/x/ccv/types" _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" types1 "github.com/tendermint/tendermint/abci/types" diff --git a/x/ccv/consumer/types/genesis_test.go b/x/ccv/consumer/types/genesis_test.go index 3a727cdcce..f5e6ce075c 100644 --- a/x/ccv/consumer/types/genesis_test.go +++ b/x/ccv/consumer/types/genesis_test.go @@ -12,13 +12,13 @@ import ( ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" abci "github.com/tendermint/tendermint/abci/types" - "github.com/cosmos/interchain-security/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" tmtypes "github.com/tendermint/tendermint/types" - "github.com/cosmos/interchain-security/testutil/crypto" + "github.com/cosmos/interchain-security/v2/testutil/crypto" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" "github.com/stretchr/testify/require" ) diff --git a/x/ccv/consumer/types/keys.go b/x/ccv/consumer/types/keys.go index f5a1754a73..d52c9c551e 100644 --- a/x/ccv/consumer/types/keys.go +++ b/x/ccv/consumer/types/keys.go @@ -5,7 +5,7 @@ import ( time "time" sdk "github.com/cosmos/cosmos-sdk/types" - ccvtypes "github.com/cosmos/interchain-security/x/ccv/types" + ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" ) const ( diff --git a/x/ccv/consumer/types/params.go b/x/ccv/consumer/types/params.go index 55340b205f..5f7b73eb57 100644 --- a/x/ccv/consumer/types/params.go +++ b/x/ccv/consumer/types/params.go @@ -7,7 +7,7 @@ import ( sdktypes "github.com/cosmos/cosmos-sdk/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - ccvtypes "github.com/cosmos/interchain-security/x/ccv/types" + ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" ) const ( diff --git a/x/ccv/consumer/types/params_test.go b/x/ccv/consumer/types/params_test.go index 4b1e8e0d03..98233505d7 100644 --- a/x/ccv/consumer/types/params_test.go +++ b/x/ccv/consumer/types/params_test.go @@ -6,7 +6,7 @@ import ( "github.com/stretchr/testify/require" - consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" ) // Tests the validation of consumer params that happens at genesis diff --git a/x/ccv/democracy/distribution/module.go b/x/ccv/democracy/distribution/module.go index 39ff930b98..b0008e7082 100644 --- a/x/ccv/democracy/distribution/module.go +++ b/x/ccv/democracy/distribution/module.go @@ -12,7 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/distribution/keeper" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" abci "github.com/tendermint/tendermint/abci/types" diff --git a/x/ccv/provider/client/cli/query.go b/x/ccv/provider/client/cli/query.go index 18109db18c..aa1a996f12 100644 --- a/x/ccv/provider/client/cli/query.go +++ b/x/ccv/provider/client/cli/query.go @@ -11,7 +11,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/version" - "github.com/cosmos/interchain-security/x/ccv/provider/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ) // NewQueryCmd returns a root CLI command handler for all x/ccv/provider query commands. diff --git a/x/ccv/provider/client/cli/tx.go b/x/ccv/provider/client/cli/tx.go index ef4df5f455..73b1df34c3 100644 --- a/x/ccv/provider/client/cli/tx.go +++ b/x/ccv/provider/client/cli/tx.go @@ -12,7 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/version" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/interchain-security/x/ccv/provider/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ) // GetTxCmd returns the transaction commands for this module diff --git a/x/ccv/provider/client/proposal_handler.go b/x/ccv/provider/client/proposal_handler.go index 1bfb21ea40..19848d9282 100644 --- a/x/ccv/provider/client/proposal_handler.go +++ b/x/ccv/provider/client/proposal_handler.go @@ -18,7 +18,7 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - "github.com/cosmos/interchain-security/x/ccv/provider/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" "github.com/spf13/cobra" ) diff --git a/x/ccv/provider/handler.go b/x/ccv/provider/handler.go index 0511bd6dab..dc0c8cbc4f 100644 --- a/x/ccv/provider/handler.go +++ b/x/ccv/provider/handler.go @@ -4,8 +4,8 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/cosmos/interchain-security/x/ccv/provider/keeper" - "github.com/cosmos/interchain-security/x/ccv/provider/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ) func NewHandler(k *keeper.Keeper) sdk.Handler { diff --git a/x/ccv/provider/handler_test.go b/x/ccv/provider/handler_test.go index 9e723d9858..3b034eab2b 100644 --- a/x/ccv/provider/handler_test.go +++ b/x/ccv/provider/handler_test.go @@ -12,11 +12,11 @@ import ( "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - testcrypto "github.com/cosmos/interchain-security/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/testutil/keeper" - "github.com/cosmos/interchain-security/x/ccv/provider" - keeper "github.com/cosmos/interchain-security/x/ccv/provider/keeper" - providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" + testcrypto "github.com/cosmos/interchain-security/v2/testutil/crypto" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" + "github.com/cosmos/interchain-security/v2/x/ccv/provider" + keeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ) func TestInvalidMsg(t *testing.T) { diff --git a/x/ccv/provider/ibc_module.go b/x/ccv/provider/ibc_module.go index 49c07b9d1a..a37f291340 100644 --- a/x/ccv/provider/ibc_module.go +++ b/x/ccv/provider/ibc_module.go @@ -11,9 +11,9 @@ import ( porttypes "github.com/cosmos/ibc-go/v4/modules/core/05-port/types" host "github.com/cosmos/ibc-go/v4/modules/core/24-host" ibcexported "github.com/cosmos/ibc-go/v4/modules/core/exported" - "github.com/cosmos/interchain-security/x/ccv/provider/keeper" - providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" ) // OnChanOpenInit implements the IBCModule interface diff --git a/x/ccv/provider/ibc_module_test.go b/x/ccv/provider/ibc_module_test.go index 7aa0d5de04..dfe8790c32 100644 --- a/x/ccv/provider/ibc_module_test.go +++ b/x/ccv/provider/ibc_module_test.go @@ -10,11 +10,11 @@ import ( channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" host "github.com/cosmos/ibc-go/v4/modules/core/24-host" ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - testkeeper "github.com/cosmos/interchain-security/testutil/keeper" - "github.com/cosmos/interchain-security/x/ccv/provider" - providerkeeper "github.com/cosmos/interchain-security/x/ccv/provider/keeper" - providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" + "github.com/cosmos/interchain-security/v2/x/ccv/provider" + providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" ) diff --git a/x/ccv/provider/keeper/distribution.go b/x/ccv/provider/keeper/distribution.go index 75c0cf3d28..759de65147 100644 --- a/x/ccv/provider/keeper/distribution.go +++ b/x/ccv/provider/keeper/distribution.go @@ -2,8 +2,8 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" - "github.com/cosmos/interchain-security/x/ccv/provider/types" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ) // EndBlockRD executes EndBlock logic for the Reward Distribution sub-protocol. diff --git a/x/ccv/provider/keeper/distribution_test.go b/x/ccv/provider/keeper/distribution_test.go index 35de597245..a9aa6d88fb 100644 --- a/x/ccv/provider/keeper/distribution_test.go +++ b/x/ccv/provider/keeper/distribution_test.go @@ -4,9 +4,9 @@ import ( "testing" sdk "github.com/cosmos/cosmos-sdk/types" - testutil "github.com/cosmos/interchain-security/testutil/keeper" - consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" - "github.com/cosmos/interchain-security/x/ccv/provider/types" + testutil "github.com/cosmos/interchain-security/v2/testutil/keeper" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" ) diff --git a/x/ccv/provider/keeper/genesis.go b/x/ccv/provider/keeper/genesis.go index 79e6f2052d..8bae356343 100644 --- a/x/ccv/provider/keeper/genesis.go +++ b/x/ccv/provider/keeper/genesis.go @@ -4,8 +4,8 @@ import ( "fmt" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" ) // InitGenesis initializes the CCV provider state and binds to PortID. diff --git a/x/ccv/provider/keeper/genesis_test.go b/x/ccv/provider/keeper/genesis_test.go index 20f69aac2c..66613fb2a8 100644 --- a/x/ccv/provider/keeper/genesis_test.go +++ b/x/ccv/provider/keeper/genesis_test.go @@ -6,13 +6,13 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" host "github.com/cosmos/ibc-go/v4/modules/core/24-host" - "github.com/cosmos/interchain-security/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/testutil/keeper" + "github.com/cosmos/interchain-security/v2/testutil/crypto" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" - consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" - "github.com/cosmos/interchain-security/x/ccv/provider/keeper" - providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" ) diff --git a/x/ccv/provider/keeper/grpc_query.go b/x/ccv/provider/keeper/grpc_query.go index 2e8d49c539..df7c28f758 100644 --- a/x/ccv/provider/keeper/grpc_query.go +++ b/x/ccv/provider/keeper/grpc_query.go @@ -6,8 +6,8 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/x/ccv/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) diff --git a/x/ccv/provider/keeper/hooks.go b/x/ccv/provider/keeper/hooks.go index fd443c972e..31fd3d0d6a 100644 --- a/x/ccv/provider/keeper/hooks.go +++ b/x/ccv/provider/keeper/hooks.go @@ -6,8 +6,8 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" sdk "github.com/cosmos/cosmos-sdk/types" - providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/x/ccv/types" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" ) // Wrapper struct diff --git a/x/ccv/provider/keeper/hooks_test.go b/x/ccv/provider/keeper/hooks_test.go index ff01e295f9..e364f61d13 100644 --- a/x/ccv/provider/keeper/hooks_test.go +++ b/x/ccv/provider/keeper/hooks_test.go @@ -4,9 +4,9 @@ import ( "testing" sdk "github.com/cosmos/cosmos-sdk/types" - cryptotestutil "github.com/cosmos/interchain-security/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/testutil/keeper" - providerkeeper "github.com/cosmos/interchain-security/x/ccv/provider/keeper" + cryptotestutil "github.com/cosmos/interchain-security/v2/testutil/crypto" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" + providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" "github.com/golang/mock/gomock" ) diff --git a/x/ccv/provider/keeper/keeper.go b/x/ccv/provider/keeper/keeper.go index 2da6a17359..025272351a 100644 --- a/x/ccv/provider/keeper/keeper.go +++ b/x/ccv/provider/keeper/keeper.go @@ -19,9 +19,9 @@ import ( ibcexported "github.com/cosmos/ibc-go/v4/modules/core/exported" ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" - "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" "github.com/tendermint/tendermint/libs/log" ) diff --git a/x/ccv/provider/keeper/keeper_test.go b/x/ccv/provider/keeper/keeper_test.go index 85a7dc03b3..64cc268807 100644 --- a/x/ccv/provider/keeper/keeper_test.go +++ b/x/ccv/provider/keeper/keeper_test.go @@ -8,12 +8,12 @@ import ( cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - ibcsimapp "github.com/cosmos/interchain-security/legacy_ibc_testing/simapp" + ibcsimapp "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/simapp" - cryptotestutil "github.com/cosmos/interchain-security/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/testutil/keeper" - "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + cryptotestutil "github.com/cosmos/interchain-security/v2/testutil/crypto" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" abci "github.com/tendermint/tendermint/abci/types" tmprotocrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" diff --git a/x/ccv/provider/keeper/key_assignment.go b/x/ccv/provider/keeper/key_assignment.go index 31dcade941..de4cbace7c 100644 --- a/x/ccv/provider/keeper/key_assignment.go +++ b/x/ccv/provider/keeper/key_assignment.go @@ -7,8 +7,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/x/ccv/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" abci "github.com/tendermint/tendermint/abci/types" tmprotocrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" diff --git a/x/ccv/provider/keeper/key_assignment_test.go b/x/ccv/provider/keeper/key_assignment_test.go index 7d63910759..17b0c3e85e 100644 --- a/x/ccv/provider/keeper/key_assignment_test.go +++ b/x/ccv/provider/keeper/key_assignment_test.go @@ -9,15 +9,15 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - cryptotestutil "github.com/cosmos/interchain-security/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/testutil/keeper" + cryptotestutil "github.com/cosmos/interchain-security/v2/testutil/crypto" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" tmprotocrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" - providerkeeper "github.com/cosmos/interchain-security/x/ccv/provider/keeper" - "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/x/ccv/types" + providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" "github.com/golang/mock/gomock" ) diff --git a/x/ccv/provider/keeper/msg_server.go b/x/ccv/provider/keeper/msg_server.go index f817643410..ea5ff66220 100644 --- a/x/ccv/provider/keeper/msg_server.go +++ b/x/ccv/provider/keeper/msg_server.go @@ -7,8 +7,8 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/x/ccv/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" tmprotocrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" ) diff --git a/x/ccv/provider/keeper/params.go b/x/ccv/provider/keeper/params.go index d4cb5a85ab..98408bcede 100644 --- a/x/ccv/provider/keeper/params.go +++ b/x/ccv/provider/keeper/params.go @@ -7,8 +7,8 @@ import ( ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/x/ccv/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" ) // GetTemplateClient returns the template client for provider proposals diff --git a/x/ccv/provider/keeper/params_test.go b/x/ccv/provider/keeper/params_test.go index d4b83c1cd0..eeafe2696c 100644 --- a/x/ccv/provider/keeper/params_test.go +++ b/x/ccv/provider/keeper/params_test.go @@ -8,8 +8,8 @@ import ( clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" commitmenttypes "github.com/cosmos/ibc-go/v4/modules/core/23-commitment/types" ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - testkeeper "github.com/cosmos/interchain-security/testutil/keeper" - providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" "github.com/stretchr/testify/require" ) diff --git a/x/ccv/provider/keeper/proposal.go b/x/ccv/provider/keeper/proposal.go index 0fcfac55f8..dcff74385b 100644 --- a/x/ccv/provider/keeper/proposal.go +++ b/x/ccv/provider/keeper/proposal.go @@ -14,12 +14,12 @@ import ( clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" commitmenttypes "github.com/cosmos/ibc-go/v4/modules/core/23-commitment/types" ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" abci "github.com/tendermint/tendermint/abci/types" tmtypes "github.com/tendermint/tendermint/types" - consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" ) // HandleConsumerAdditionProposal will receive the consumer chain's client state from the proposal. diff --git a/x/ccv/provider/keeper/proposal_test.go b/x/ccv/provider/keeper/proposal_test.go index c1c98648dc..cb18a119b4 100644 --- a/x/ccv/provider/keeper/proposal_test.go +++ b/x/ccv/provider/keeper/proposal_test.go @@ -17,12 +17,12 @@ import ( "github.com/stretchr/testify/require" - cryptoutil "github.com/cosmos/interchain-security/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/testutil/keeper" - consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" - providerkeeper "github.com/cosmos/interchain-security/x/ccv/provider/keeper" - providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/x/ccv/types" + cryptoutil "github.com/cosmos/interchain-security/v2/testutil/crypto" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" ) // diff --git a/x/ccv/provider/keeper/relay.go b/x/ccv/provider/keeper/relay.go index 55fff4e039..1d93b2fdd9 100644 --- a/x/ccv/provider/keeper/relay.go +++ b/x/ccv/provider/keeper/relay.go @@ -10,8 +10,8 @@ import ( clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" "github.com/cosmos/ibc-go/v4/modules/core/exported" - providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" ) // OnRecvVSCMaturedPacket handles a VSCMatured packet diff --git a/x/ccv/provider/keeper/relay_test.go b/x/ccv/provider/keeper/relay_test.go index 250d241f5e..7e377db1b1 100644 --- a/x/ccv/provider/keeper/relay_test.go +++ b/x/ccv/provider/keeper/relay_test.go @@ -10,12 +10,12 @@ import ( clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" exported "github.com/cosmos/ibc-go/v4/modules/core/exported" - ibcsimapp "github.com/cosmos/interchain-security/legacy_ibc_testing/simapp" - cryptotestutil "github.com/cosmos/interchain-security/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/testutil/keeper" - "github.com/cosmos/interchain-security/x/ccv/provider/keeper" - providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + ibcsimapp "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/simapp" + cryptotestutil "github.com/cosmos/interchain-security/v2/testutil/crypto" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" "github.com/golang/mock/gomock" abci "github.com/tendermint/tendermint/abci/types" diff --git a/x/ccv/provider/keeper/throttle.go b/x/ccv/provider/keeper/throttle.go index a364907040..4a3a9f8303 100644 --- a/x/ccv/provider/keeper/throttle.go +++ b/x/ccv/provider/keeper/throttle.go @@ -5,8 +5,8 @@ import ( "time" sdktypes "github.com/cosmos/cosmos-sdk/types" - providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/x/ccv/types" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" tmtypes "github.com/tendermint/tendermint/types" ) diff --git a/x/ccv/provider/keeper/throttle_test.go b/x/ccv/provider/keeper/throttle_test.go index 0766b172fa..3be597e28a 100644 --- a/x/ccv/provider/keeper/throttle_test.go +++ b/x/ccv/provider/keeper/throttle_test.go @@ -5,14 +5,14 @@ import ( "testing" "time" - "github.com/cosmos/interchain-security/x/ccv/provider/keeper" - providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/x/ccv/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" "github.com/golang/mock/gomock" sdktypes "github.com/cosmos/cosmos-sdk/types" - cryptoutil "github.com/cosmos/interchain-security/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/testutil/keeper" + cryptoutil "github.com/cosmos/interchain-security/v2/testutil/crypto" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" "github.com/stretchr/testify/require" tmtypes "github.com/tendermint/tendermint/types" "golang.org/x/exp/slices" diff --git a/x/ccv/provider/module.go b/x/ccv/provider/module.go index 39347f9709..742dc9b743 100644 --- a/x/ccv/provider/module.go +++ b/x/ccv/provider/module.go @@ -13,9 +13,9 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" porttypes "github.com/cosmos/ibc-go/v4/modules/core/05-port/types" - "github.com/cosmos/interchain-security/x/ccv/provider/client/cli" - "github.com/cosmos/interchain-security/x/ccv/provider/keeper" - providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/client/cli" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" "github.com/gorilla/mux" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" diff --git a/x/ccv/provider/module_test.go b/x/ccv/provider/module_test.go index 28a4b26b5d..ee81daa4bf 100644 --- a/x/ccv/provider/module_test.go +++ b/x/ccv/provider/module_test.go @@ -6,10 +6,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" host "github.com/cosmos/ibc-go/v4/modules/core/24-host" - testkeeper "github.com/cosmos/interchain-security/testutil/keeper" - "github.com/cosmos/interchain-security/x/ccv/provider" - "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" + "github.com/cosmos/interchain-security/v2/x/ccv/provider" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/x/ccv/provider/proposal_handler.go b/x/ccv/provider/proposal_handler.go index f3d51c3947..8854b8e57c 100644 --- a/x/ccv/provider/proposal_handler.go +++ b/x/ccv/provider/proposal_handler.go @@ -5,8 +5,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - "github.com/cosmos/interchain-security/x/ccv/provider/keeper" - "github.com/cosmos/interchain-security/x/ccv/provider/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ) // NewProviderProposalHandler defines the handler for consumer addition, diff --git a/x/ccv/provider/proposal_handler_test.go b/x/ccv/provider/proposal_handler_test.go index 570598034c..ddf3698b6f 100644 --- a/x/ccv/provider/proposal_handler_test.go +++ b/x/ccv/provider/proposal_handler_test.go @@ -13,9 +13,9 @@ import ( clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - testkeeper "github.com/cosmos/interchain-security/testutil/keeper" - "github.com/cosmos/interchain-security/x/ccv/provider" - providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" + "github.com/cosmos/interchain-security/v2/x/ccv/provider" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ) // TestProviderProposalHandler tests the highest level handler for proposals diff --git a/x/ccv/provider/types/consumer.go b/x/ccv/provider/types/consumer.go index de2d4cb4bf..29098b4521 100644 --- a/x/ccv/provider/types/consumer.go +++ b/x/ccv/provider/types/consumer.go @@ -1,8 +1,8 @@ package types import ( - consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" ) func NewConsumerStates( diff --git a/x/ccv/provider/types/genesis.go b/x/ccv/provider/types/genesis.go index f9f804b24c..9f7fdc3b11 100644 --- a/x/ccv/provider/types/genesis.go +++ b/x/ccv/provider/types/genesis.go @@ -6,7 +6,7 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" host "github.com/cosmos/ibc-go/v4/modules/core/24-host" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" ) func NewGenesisState( diff --git a/x/ccv/provider/types/genesis.pb.go b/x/ccv/provider/types/genesis.pb.go index b80f461c72..e513ce25c7 100644 --- a/x/ccv/provider/types/genesis.pb.go +++ b/x/ccv/provider/types/genesis.pb.go @@ -5,8 +5,8 @@ package types import ( fmt "fmt" - types1 "github.com/cosmos/interchain-security/x/ccv/consumer/types" - types "github.com/cosmos/interchain-security/x/ccv/types" + types1 "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + types "github.com/cosmos/interchain-security/v2/x/ccv/types" _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" _ "github.com/tendermint/tendermint/proto/tendermint/crypto" diff --git a/x/ccv/provider/types/genesis_test.go b/x/ccv/provider/types/genesis_test.go index 2c908686a7..0b85d9f6b3 100644 --- a/x/ccv/provider/types/genesis_test.go +++ b/x/ccv/provider/types/genesis_test.go @@ -8,10 +8,10 @@ import ( clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" commitmenttypes "github.com/cosmos/ibc-go/v4/modules/core/23-commitment/types" ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - "github.com/cosmos/interchain-security/testutil/crypto" - consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" - "github.com/cosmos/interchain-security/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/x/ccv/types" + "github.com/cosmos/interchain-security/v2/testutil/crypto" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" tmtypes "github.com/tendermint/tendermint/types" diff --git a/x/ccv/provider/types/key_assignment.go b/x/ccv/provider/types/key_assignment.go index 450f32c918..4c4fb869fc 100644 --- a/x/ccv/provider/types/key_assignment.go +++ b/x/ccv/provider/types/key_assignment.go @@ -6,7 +6,7 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" - ccvtypes "github.com/cosmos/interchain-security/x/ccv/types" + ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" ) // NewProviderConsAddress creates a new ProviderConsAddress, diff --git a/x/ccv/provider/types/keys.go b/x/ccv/provider/types/keys.go index 65d57da9e4..bb2ffcc881 100644 --- a/x/ccv/provider/types/keys.go +++ b/x/ccv/provider/types/keys.go @@ -8,7 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" - ccvtypes "github.com/cosmos/interchain-security/x/ccv/types" + ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" ) type Status int diff --git a/x/ccv/provider/types/keys_test.go b/x/ccv/provider/types/keys_test.go index bc9626553c..d28232c6a2 100644 --- a/x/ccv/provider/types/keys_test.go +++ b/x/ccv/provider/types/keys_test.go @@ -5,8 +5,8 @@ import ( "time" sdk "github.com/cosmos/cosmos-sdk/types" - cryptoutil "github.com/cosmos/interchain-security/testutil/crypto" - providertypes "github.com/cosmos/interchain-security/x/ccv/provider/types" + cryptoutil "github.com/cosmos/interchain-security/v2/testutil/crypto" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" "github.com/stretchr/testify/require" ) diff --git a/x/ccv/provider/types/params.go b/x/ccv/provider/types/params.go index 4bfb906f4b..2e3657eaf3 100644 --- a/x/ccv/provider/types/params.go +++ b/x/ccv/provider/types/params.go @@ -9,8 +9,8 @@ import ( clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" commitmenttypes "github.com/cosmos/ibc-go/v4/modules/core/23-commitment/types" ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - consumertypes "github.com/cosmos/interchain-security/x/ccv/consumer/types" - ccvtypes "github.com/cosmos/interchain-security/x/ccv/types" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" ) const ( diff --git a/x/ccv/provider/types/params_test.go b/x/ccv/provider/types/params_test.go index b0e4e8485d..42e61f5ebd 100644 --- a/x/ccv/provider/types/params_test.go +++ b/x/ccv/provider/types/params_test.go @@ -10,7 +10,7 @@ import ( ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" "github.com/stretchr/testify/require" - "github.com/cosmos/interchain-security/x/ccv/provider/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ) func TestValidateParams(t *testing.T) { diff --git a/x/ccv/provider/types/proposal.go b/x/ccv/provider/types/proposal.go index bf7ed68ce2..49fe00531f 100644 --- a/x/ccv/provider/types/proposal.go +++ b/x/ccv/provider/types/proposal.go @@ -10,7 +10,7 @@ import ( evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - ccvtypes "github.com/cosmos/interchain-security/x/ccv/types" + ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" ) const ( diff --git a/x/ccv/provider/types/proposal_test.go b/x/ccv/provider/types/proposal_test.go index 08bcb9313b..db765a86ca 100644 --- a/x/ccv/provider/types/proposal_test.go +++ b/x/ccv/provider/types/proposal_test.go @@ -16,7 +16,7 @@ import ( clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - "github.com/cosmos/interchain-security/x/ccv/provider/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ) func TestConsumerAdditionProposalValidateBasic(t *testing.T) { diff --git a/x/ccv/provider/types/query.pb.go b/x/ccv/provider/types/query.pb.go index 51df34a76f..1ed87707de 100644 --- a/x/ccv/provider/types/query.pb.go +++ b/x/ccv/provider/types/query.pb.go @@ -6,8 +6,8 @@ package types import ( context "context" fmt "fmt" - types "github.com/cosmos/interchain-security/x/ccv/consumer/types" - types1 "github.com/cosmos/interchain-security/x/ccv/types" + types "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + types1 "github.com/cosmos/interchain-security/v2/x/ccv/types" _ "github.com/gogo/protobuf/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" diff --git a/x/ccv/types/ccv_test.go b/x/ccv/types/ccv_test.go index eed96ca4c1..5f8b6add34 100644 --- a/x/ccv/types/ccv_test.go +++ b/x/ccv/types/ccv_test.go @@ -5,7 +5,7 @@ import ( cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" - "github.com/cosmos/interchain-security/x/ccv/types" + "github.com/cosmos/interchain-security/v2/x/ccv/types" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" ) diff --git a/x/ccv/types/utils_test.go b/x/ccv/types/utils_test.go index 62158b7a88..7faad14757 100644 --- a/x/ccv/types/utils_test.go +++ b/x/ccv/types/utils_test.go @@ -4,8 +4,8 @@ import ( "testing" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - ibcsimapp "github.com/cosmos/interchain-security/legacy_ibc_testing/simapp" - "github.com/cosmos/interchain-security/x/ccv/types" + ibcsimapp "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/simapp" + "github.com/cosmos/interchain-security/v2/x/ccv/types" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" ) From 9466b8621b7c80f2ab92ef4e5ccfab74fa983b7f Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Thu, 25 May 2023 08:48:41 -0700 Subject: [PATCH 021/108] docs: update PR template to consider migrations (#976) Update PULL_REQUEST_TEMPLATE.md --- .github/PULL_REQUEST_TEMPLATE.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 936fe1c59f..979c1d1c42 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -23,6 +23,7 @@ I have... * [ ] Included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title * [ ] Added `!` to the type prefix if API or client breaking change +* [ ] Confirmed this PR does not introduce changes requiring state migrations, OR migration code has been added to consumer and/or provider modules * [ ] Targeted the correct branch (see [PR Targeting](https://github.com/cosmos/interchain-security/blob/main/CONTRIBUTING.md#pr-targeting)) * [ ] Provided a link to the relevant issue or specification * [ ] Followed the guidelines for [building SDK modules](https://github.com/cosmos/cosmos-sdk/blob/main/docs/docs/building-modules) @@ -42,7 +43,8 @@ I have... * [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title * [ ] confirmed `!` in the type prefix if API or client breaking change -* [ ] confirmed all author checklist items have been addressed +* [ ] confirmed this PR does not introduce changes requiring state migrations, OR confirmed migration code has been added to consumer and/or provider modules +* [ ] confirmed all author checklist items have been addressed * [ ] reviewed state machine logic * [ ] reviewed API design and naming * [ ] reviewed documentation is accurate From 502d2d3cb120ea9ce8c5ebfb1fbff5dfe158554e Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Fri, 26 May 2023 09:28:41 -0700 Subject: [PATCH 022/108] fix: v2 imports proto go_package option (#978) * add v2 to proto files, adjust protocgen scripts * regen proto --- .../ccv/consumer/v1/consumer.proto | 2 +- .../ccv/consumer/v1/genesis.proto | 2 +- .../ccv/consumer/v1/query.proto | 2 +- .../ccv/provider/v1/genesis.proto | 2 +- .../ccv/provider/v1/provider.proto | 2 +- .../ccv/provider/v1/query.proto | 2 +- .../ccv/provider/v1/tx.proto | 2 +- proto/interchain_security/ccv/v1/ccv.proto | 2 +- scripts/protocgen.sh | 2 +- x/ccv/consumer/types/consumer.pb.go | 99 ++++----- x/ccv/consumer/types/genesis.pb.go | 101 ++++----- x/ccv/consumer/types/query.pb.go | 64 +++--- x/ccv/provider/types/genesis.pb.go | 108 ++++----- x/ccv/provider/types/provider.pb.go | 207 +++++++++--------- x/ccv/provider/types/query.pb.go | 168 +++++++------- x/ccv/provider/types/tx.pb.go | 59 ++--- x/ccv/types/ccv.pb.go | 86 ++++---- 17 files changed, 457 insertions(+), 453 deletions(-) diff --git a/proto/interchain_security/ccv/consumer/v1/consumer.proto b/proto/interchain_security/ccv/consumer/v1/consumer.proto index d2959983a4..92602eee4c 100644 --- a/proto/interchain_security/ccv/consumer/v1/consumer.proto +++ b/proto/interchain_security/ccv/consumer/v1/consumer.proto @@ -3,7 +3,7 @@ package interchain_security.ccv.consumer.v1; import "interchain_security/ccv/v1/ccv.proto"; -option go_package = "github.com/cosmos/interchain-security/x/ccv/consumer/types"; +option go_package = "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types"; import "google/protobuf/any.proto"; import "gogoproto/gogo.proto"; diff --git a/proto/interchain_security/ccv/consumer/v1/genesis.proto b/proto/interchain_security/ccv/consumer/v1/genesis.proto index 043556fee3..bf019879ac 100644 --- a/proto/interchain_security/ccv/consumer/v1/genesis.proto +++ b/proto/interchain_security/ccv/consumer/v1/genesis.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package interchain_security.ccv.consumer.v1; -option go_package = "github.com/cosmos/interchain-security/x/ccv/consumer/types"; +option go_package = "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types"; import "interchain_security/ccv/v1/ccv.proto"; import "interchain_security/ccv/consumer/v1/consumer.proto"; diff --git a/proto/interchain_security/ccv/consumer/v1/query.proto b/proto/interchain_security/ccv/consumer/v1/query.proto index 2bcf6b4d50..8efbfa2f8b 100644 --- a/proto/interchain_security/ccv/consumer/v1/query.proto +++ b/proto/interchain_security/ccv/consumer/v1/query.proto @@ -1,7 +1,7 @@ syntax = "proto3"; package interchain_security.ccv.consumer.v1; -option go_package = "github.com/cosmos/interchain-security/x/ccv/consumer/types"; +option go_package = "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types"; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; diff --git a/proto/interchain_security/ccv/provider/v1/genesis.proto b/proto/interchain_security/ccv/provider/v1/genesis.proto index 3859f6b7d0..bf7fe58d15 100644 --- a/proto/interchain_security/ccv/provider/v1/genesis.proto +++ b/proto/interchain_security/ccv/provider/v1/genesis.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package interchain_security.ccv.provider.v1; -option go_package = "github.com/cosmos/interchain-security/x/ccv/provider/types"; +option go_package = "github.com/cosmos/interchain-security/v2/x/ccv/provider/types"; import "gogoproto/gogo.proto"; import "interchain_security/ccv/v1/ccv.proto"; diff --git a/proto/interchain_security/ccv/provider/v1/provider.proto b/proto/interchain_security/ccv/provider/v1/provider.proto index 8a3861f55a..9c0741bd71 100644 --- a/proto/interchain_security/ccv/provider/v1/provider.proto +++ b/proto/interchain_security/ccv/provider/v1/provider.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package interchain_security.ccv.provider.v1; -option go_package = "github.com/cosmos/interchain-security/x/ccv/provider/types"; +option go_package = "github.com/cosmos/interchain-security/v2/x/ccv/provider/types"; import "gogoproto/gogo.proto"; import "google/protobuf/timestamp.proto"; diff --git a/proto/interchain_security/ccv/provider/v1/query.proto b/proto/interchain_security/ccv/provider/v1/query.proto index 3100502699..c98a8cba1e 100644 --- a/proto/interchain_security/ccv/provider/v1/query.proto +++ b/proto/interchain_security/ccv/provider/v1/query.proto @@ -1,7 +1,7 @@ syntax = "proto3"; package interchain_security.ccv.provider.v1; -option go_package = "github.com/cosmos/interchain-security/x/ccv/provider/types"; +option go_package = "github.com/cosmos/interchain-security/v2/x/ccv/provider/types"; import "google/api/annotations.proto"; import "gogoproto/gogo.proto"; diff --git a/proto/interchain_security/ccv/provider/v1/tx.proto b/proto/interchain_security/ccv/provider/v1/tx.proto index f69bb93e08..705e155317 100644 --- a/proto/interchain_security/ccv/provider/v1/tx.proto +++ b/proto/interchain_security/ccv/provider/v1/tx.proto @@ -1,7 +1,7 @@ syntax = "proto3"; package interchain_security.ccv.provider.v1; -option go_package = "github.com/cosmos/interchain-security/x/ccv/provider/types"; +option go_package = "github.com/cosmos/interchain-security/v2/x/ccv/provider/types"; import "google/api/annotations.proto"; import "gogoproto/gogo.proto"; diff --git a/proto/interchain_security/ccv/v1/ccv.proto b/proto/interchain_security/ccv/v1/ccv.proto index 4af5785749..f13951f4d6 100644 --- a/proto/interchain_security/ccv/v1/ccv.proto +++ b/proto/interchain_security/ccv/v1/ccv.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package interchain_security.ccv.v1; -option go_package = "github.com/cosmos/interchain-security/x/ccv/types"; +option go_package = "github.com/cosmos/interchain-security/v2/x/ccv/types"; import "cosmos/staking/v1beta1/staking.proto"; diff --git a/scripts/protocgen.sh b/scripts/protocgen.sh index 7e9cdfe016..530b0fc24d 100644 --- a/scripts/protocgen.sh +++ b/scripts/protocgen.sh @@ -16,7 +16,7 @@ done cd .. # move proto files to the right places -cp -r github.com/cosmos/interchain-security/* ./ +cp -r github.com/cosmos/interchain-security/v2/* ./ rm -rf github.com go mod tidy -compat=1.19 diff --git a/x/ccv/consumer/types/consumer.pb.go b/x/ccv/consumer/types/consumer.pb.go index ae6a25761b..1c457d2277 100644 --- a/x/ccv/consumer/types/consumer.pb.go +++ b/x/ccv/consumer/types/consumer.pb.go @@ -364,56 +364,57 @@ func init() { } var fileDescriptor_5b27a82b276e7f93 = []byte{ - // 781 bytes of a gzipped FileDescriptorProto + // 786 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0xcf, 0x6e, 0xdb, 0x36, - 0x18, 0x8f, 0x96, 0xd6, 0x4d, 0x98, 0x14, 0x6b, 0x59, 0x2f, 0x55, 0x3d, 0x40, 0x76, 0xdd, 0x1e, - 0x7c, 0x89, 0x8c, 0x3a, 0xdb, 0x25, 0xb7, 0xda, 0x59, 0xd1, 0xee, 0x5f, 0x3c, 0xd5, 0xe8, 0x61, - 0x3b, 0x10, 0x14, 0x45, 0x4b, 0x44, 0x24, 0x52, 0x20, 0x29, 0x75, 0xba, 0xef, 0x01, 0x7a, 0xdc, - 0x23, 0xec, 0x01, 0xf6, 0x10, 0xc5, 0x4e, 0x3d, 0xee, 0xd4, 0x0d, 0xc9, 0x1b, 0xec, 0x09, 0x06, - 0x52, 0x92, 0x6b, 0xa7, 0x0d, 0x90, 0x1b, 0x3f, 0xfd, 0x7e, 0xdf, 0x4f, 0xdf, 0x7f, 0x30, 0x61, - 0x5c, 0x53, 0x49, 0x12, 0xcc, 0x38, 0x52, 0x94, 0x14, 0x92, 0xe9, 0x6a, 0x4c, 0x48, 0x39, 0x26, - 0x82, 0xab, 0x22, 0xa3, 0x72, 0x5c, 0x3e, 0x59, 0xbd, 0xfd, 0x5c, 0x0a, 0x2d, 0xe0, 0xa3, 0x4f, - 0xf8, 0xf8, 0x84, 0x94, 0xfe, 0x8a, 0x57, 0x3e, 0xe9, 0x3d, 0xbe, 0x4a, 0xd8, 0xe8, 0x91, 0xb2, - 0x96, 0xea, 0x3d, 0x88, 0x85, 0x88, 0x53, 0x3a, 0xb6, 0x56, 0x58, 0x2c, 0xc7, 0x98, 0x57, 0x0d, - 0xd4, 0x8d, 0x45, 0x2c, 0xec, 0x73, 0x6c, 0x5e, 0xad, 0x03, 0x11, 0x2a, 0x13, 0x0a, 0xd5, 0x40, - 0x6d, 0x34, 0x90, 0x77, 0x59, 0x2b, 0x2a, 0x24, 0xd6, 0x4c, 0xf0, 0x06, 0xef, 0x5f, 0xc6, 0x35, - 0xcb, 0xa8, 0xd2, 0x38, 0xcb, 0x6b, 0xc2, 0xf0, 0xb7, 0x0e, 0xe8, 0xcc, 0xb1, 0xc4, 0x99, 0x82, - 0x2e, 0xb8, 0x45, 0x39, 0x0e, 0x53, 0x1a, 0xb9, 0xce, 0xc0, 0x19, 0xed, 0x04, 0xad, 0x09, 0x4f, - 0xc1, 0xe3, 0x30, 0x15, 0xe4, 0x4c, 0xa1, 0x9c, 0x4a, 0x14, 0x31, 0xa5, 0x25, 0x0b, 0x0b, 0xf3, - 0x1b, 0xa4, 0x25, 0xe6, 0x2a, 0x63, 0x4a, 0x31, 0xc1, 0xdd, 0xcf, 0x06, 0xce, 0x68, 0x3b, 0x78, - 0x58, 0x73, 0xe7, 0x54, 0x9e, 0xac, 0x31, 0x17, 0x6b, 0x44, 0xf8, 0x2d, 0x78, 0x78, 0xa5, 0x0a, - 0x22, 0x09, 0xe6, 0x9c, 0xa6, 0xee, 0xf6, 0xc0, 0x19, 0xed, 0x06, 0xfd, 0xe8, 0x0a, 0x91, 0x59, - 0x4d, 0x83, 0xc7, 0xa0, 0x97, 0x4b, 0x51, 0xb2, 0x88, 0x4a, 0xb4, 0xa4, 0x14, 0xe5, 0x42, 0xa4, - 0x08, 0x47, 0x91, 0x44, 0x4a, 0x4b, 0xf7, 0x86, 0x15, 0x39, 0x68, 0x19, 0xcf, 0x28, 0x9d, 0x0b, - 0x91, 0x3e, 0x8d, 0x22, 0xf9, 0x52, 0x4b, 0xf8, 0x13, 0x80, 0x84, 0x94, 0xc8, 0x14, 0x45, 0x14, - 0xda, 0x64, 0xc7, 0x44, 0xe4, 0xde, 0x1c, 0x38, 0xa3, 0xbd, 0xc9, 0x03, 0xbf, 0xae, 0x9d, 0xdf, - 0xd6, 0xce, 0x3f, 0x69, 0x6a, 0x3b, 0xdd, 0x79, 0xfb, 0xbe, 0xbf, 0xf5, 0xfb, 0x3f, 0x7d, 0x27, - 0xb8, 0x43, 0x48, 0xb9, 0xa8, 0xbd, 0xe7, 0xd6, 0x19, 0xfe, 0x02, 0xee, 0xdb, 0x6c, 0x96, 0x54, - 0x5e, 0xd6, 0xed, 0x5c, 0x5f, 0xf7, 0x8b, 0x56, 0x63, 0x53, 0xfc, 0x39, 0x18, 0xb4, 0xf3, 0x86, - 0x24, 0xdd, 0x28, 0xe1, 0x52, 0x62, 0x62, 0x1e, 0xee, 0x2d, 0x9b, 0xb1, 0xd7, 0xf2, 0x82, 0x0d, - 0xda, 0xb3, 0x86, 0x05, 0x0f, 0x01, 0x4c, 0x98, 0xd2, 0x42, 0x32, 0x82, 0x53, 0x44, 0xb9, 0x96, - 0x8c, 0x2a, 0x77, 0xc7, 0x36, 0xf0, 0xee, 0x07, 0xe4, 0x9b, 0x1a, 0x80, 0x3f, 0x82, 0x3b, 0x05, - 0x0f, 0x05, 0x8f, 0x18, 0x8f, 0xdb, 0x74, 0x76, 0xaf, 0x9f, 0xce, 0xe7, 0x2b, 0xe7, 0x26, 0x91, - 0x23, 0x70, 0xa0, 0xc4, 0x52, 0x23, 0x91, 0x6b, 0x64, 0x2a, 0xa4, 0x13, 0x49, 0x55, 0x22, 0xd2, - 0xc8, 0x05, 0x36, 0xfc, 0x7b, 0x06, 0x3d, 0xcd, 0xf5, 0x69, 0xa1, 0x17, 0x2d, 0x04, 0x1f, 0x81, - 0xdb, 0x92, 0xbe, 0xc6, 0x32, 0x42, 0x11, 0xe5, 0x22, 0x53, 0xee, 0xde, 0x60, 0x7b, 0xb4, 0x1b, - 0xec, 0xd7, 0x1f, 0x4f, 0xec, 0x37, 0xf8, 0x15, 0x58, 0x35, 0x1b, 0x6d, 0xb2, 0xf7, 0x2d, 0xbb, - 0xdb, 0xa2, 0xc1, 0x9a, 0xd7, 0xf0, 0x6b, 0xf0, 0xe5, 0xf7, 0x58, 0xe9, 0xf5, 0xf9, 0x9a, 0x9a, - 0x29, 0x7e, 0x4e, 0x59, 0x9c, 0x68, 0x78, 0x00, 0x3a, 0x89, 0x7d, 0xd9, 0xcd, 0xd8, 0x0e, 0x1a, - 0x6b, 0xf8, 0x87, 0x03, 0xee, 0xcd, 0xa4, 0x50, 0x6a, 0x66, 0x76, 0xfe, 0x15, 0x4e, 0x59, 0x84, - 0xb5, 0x90, 0x66, 0x95, 0xcc, 0x04, 0x52, 0xa5, 0xac, 0xc3, 0x7e, 0xd0, 0x9a, 0xb0, 0x0b, 0x6e, - 0xe6, 0xe2, 0x35, 0x95, 0xcd, 0xae, 0xd4, 0x06, 0xc4, 0xa0, 0x93, 0x17, 0xe1, 0x19, 0xad, 0xec, - 0xd0, 0xef, 0x4d, 0xba, 0x1f, 0x15, 0xf5, 0x29, 0xaf, 0xa6, 0x47, 0xff, 0xbd, 0xef, 0xdf, 0xaf, - 0x70, 0x96, 0x1e, 0x0f, 0x4d, 0x77, 0x29, 0x57, 0x85, 0x42, 0xb5, 0xdf, 0xf0, 0xaf, 0x3f, 0x0f, - 0xbb, 0xcd, 0x65, 0x20, 0xb2, 0xca, 0xb5, 0xf0, 0xe7, 0x45, 0xf8, 0x1d, 0xad, 0x82, 0x46, 0x78, - 0xa8, 0xc1, 0xdd, 0x1f, 0xb0, 0x2e, 0x24, 0xe3, 0xf1, 0xab, 0x97, 0xb3, 0x39, 0x26, 0x67, 0x54, - 0x9b, 0x68, 0x4a, 0x45, 0x5e, 0xd4, 0x0b, 0x7f, 0x23, 0xa8, 0x0d, 0xf8, 0x02, 0xdc, 0xce, 0x2c, - 0x55, 0x57, 0x76, 0x84, 0x6d, 0xac, 0x7b, 0x93, 0xde, 0x47, 0x41, 0x2d, 0xda, 0x63, 0x52, 0xb7, - 0xfa, 0x8d, 0x69, 0xf5, 0x7e, 0xeb, 0x6a, 0xc0, 0xe9, 0xe2, 0xed, 0xb9, 0xe7, 0xbc, 0x3b, 0xf7, - 0x9c, 0x7f, 0xcf, 0x3d, 0xe7, 0xcd, 0x85, 0xb7, 0xf5, 0xee, 0xc2, 0xdb, 0xfa, 0xfb, 0xc2, 0xdb, - 0xfa, 0xf9, 0x38, 0x66, 0x3a, 0x29, 0x42, 0x9f, 0x88, 0xac, 0x39, 0x69, 0xe3, 0x0f, 0xd7, 0xf3, - 0x70, 0x75, 0x3d, 0x7f, 0xdd, 0x3c, 0xcc, 0xba, 0xca, 0xa9, 0x0a, 0x3b, 0x36, 0x82, 0xa3, 0xff, - 0x03, 0x00, 0x00, 0xff, 0xff, 0x95, 0x65, 0x18, 0x5a, 0xc9, 0x05, 0x00, 0x00, + 0x18, 0x8f, 0x96, 0xd6, 0x4d, 0x98, 0x14, 0x6b, 0x59, 0x2f, 0x55, 0x33, 0x40, 0x76, 0xdd, 0x1e, + 0x7c, 0x89, 0x84, 0x3a, 0xdb, 0xa5, 0xc0, 0x0e, 0x8d, 0xb3, 0xa2, 0xdd, 0xbf, 0x78, 0xaa, 0xd1, + 0x01, 0xdb, 0x81, 0xa0, 0x28, 0x5a, 0x22, 0x22, 0x91, 0x02, 0x49, 0xa9, 0xd3, 0x7d, 0x0f, 0xd0, + 0xe3, 0x1e, 0x61, 0x0f, 0xb0, 0x87, 0x28, 0x76, 0xea, 0x71, 0xa7, 0x6e, 0x48, 0xde, 0x60, 0x4f, + 0x30, 0x90, 0x92, 0x5c, 0x3b, 0x6d, 0x80, 0xdc, 0xf8, 0xe9, 0xf7, 0xfb, 0x7e, 0xfa, 0xfe, 0x83, + 0x09, 0xe3, 0x9a, 0x4a, 0x92, 0x62, 0xc6, 0x91, 0xa2, 0xa4, 0x94, 0x4c, 0xd7, 0x01, 0x21, 0x55, + 0x40, 0x04, 0x57, 0x65, 0x4e, 0x65, 0x50, 0x3d, 0x5a, 0xbe, 0xfd, 0x42, 0x0a, 0x2d, 0xe0, 0x83, + 0x8f, 0xf8, 0xf8, 0x84, 0x54, 0xfe, 0x92, 0x57, 0x3d, 0xda, 0x7f, 0x78, 0x99, 0xb0, 0xd1, 0x23, + 0x55, 0x23, 0xb5, 0x7f, 0x2f, 0x11, 0x22, 0xc9, 0x68, 0x60, 0xad, 0xa8, 0x5c, 0x04, 0x98, 0xd7, + 0x2d, 0xd4, 0x4f, 0x44, 0x22, 0xec, 0x33, 0x30, 0xaf, 0xce, 0x81, 0x08, 0x95, 0x0b, 0x85, 0x1a, + 0xa0, 0x31, 0x5a, 0xc8, 0xbb, 0xa8, 0x15, 0x97, 0x12, 0x6b, 0x26, 0x78, 0x8b, 0x0f, 0x2e, 0xe2, + 0x9a, 0xe5, 0x54, 0x69, 0x9c, 0x17, 0x0d, 0x61, 0xf4, 0x5b, 0x0f, 0xf4, 0x66, 0x58, 0xe2, 0x5c, + 0x41, 0x17, 0xdc, 0xa0, 0x1c, 0x47, 0x19, 0x8d, 0x5d, 0x67, 0xe8, 0x8c, 0xb7, 0xc2, 0xce, 0x84, + 0x27, 0xe0, 0x61, 0x94, 0x09, 0x72, 0xaa, 0x50, 0x41, 0x25, 0x8a, 0x99, 0xd2, 0x92, 0x45, 0xa5, + 0xf9, 0x0d, 0xd2, 0x12, 0x73, 0x95, 0x33, 0xa5, 0x98, 0xe0, 0xee, 0x27, 0x43, 0x67, 0xbc, 0x19, + 0xde, 0x6f, 0xb8, 0x33, 0x2a, 0x8f, 0x57, 0x98, 0xf3, 0x15, 0x22, 0xfc, 0x06, 0xdc, 0xbf, 0x54, + 0x05, 0x91, 0x14, 0x73, 0x4e, 0x33, 0x77, 0x73, 0xe8, 0x8c, 0xb7, 0xc3, 0x41, 0x7c, 0x89, 0xc8, + 0xb4, 0xa1, 0xc1, 0xc7, 0x60, 0xbf, 0x90, 0xa2, 0x62, 0x31, 0x95, 0x68, 0x41, 0x29, 0x2a, 0x84, + 0xc8, 0x10, 0x8e, 0x63, 0x89, 0x94, 0x96, 0xee, 0x35, 0x2b, 0xb2, 0xd7, 0x31, 0x9e, 0x52, 0x3a, + 0x13, 0x22, 0x7b, 0x12, 0xc7, 0xf2, 0x85, 0x96, 0xf0, 0x47, 0x00, 0x09, 0xa9, 0x90, 0x29, 0x8a, + 0x28, 0xb5, 0xc9, 0x8e, 0x89, 0xd8, 0xbd, 0x3e, 0x74, 0xc6, 0x3b, 0x93, 0x7b, 0x7e, 0x53, 0x3b, + 0xbf, 0xab, 0x9d, 0x7f, 0xdc, 0xd6, 0xf6, 0x68, 0xeb, 0xcd, 0xbb, 0xc1, 0xc6, 0xef, 0xff, 0x0c, + 0x9c, 0xf0, 0x16, 0x21, 0xd5, 0xbc, 0xf1, 0x9e, 0x59, 0x67, 0xf8, 0x0b, 0xb8, 0x6b, 0xb3, 0x59, + 0x50, 0x79, 0x51, 0xb7, 0x77, 0x75, 0xdd, 0xcf, 0x3a, 0x8d, 0x75, 0xf1, 0x67, 0x60, 0xd8, 0xcd, + 0x1b, 0x92, 0x74, 0xad, 0x84, 0x0b, 0x89, 0x89, 0x79, 0xb8, 0x37, 0x6c, 0xc6, 0x5e, 0xc7, 0x0b, + 0xd7, 0x68, 0x4f, 0x5b, 0x16, 0x3c, 0x00, 0x30, 0x65, 0x4a, 0x0b, 0xc9, 0x08, 0xce, 0x10, 0xe5, + 0x5a, 0x32, 0xaa, 0xdc, 0x2d, 0xdb, 0xc0, 0xdb, 0xef, 0x91, 0xaf, 0x1b, 0x00, 0xfe, 0x00, 0x6e, + 0x95, 0x3c, 0x12, 0x3c, 0x66, 0x3c, 0xe9, 0xd2, 0xd9, 0xbe, 0x7a, 0x3a, 0x9f, 0x2e, 0x9d, 0xdb, + 0x44, 0x0e, 0xc1, 0x9e, 0x12, 0x0b, 0x8d, 0x44, 0xa1, 0x91, 0xa9, 0x90, 0x4e, 0x25, 0x55, 0xa9, + 0xc8, 0x62, 0x17, 0xd8, 0xf0, 0xef, 0x18, 0xf4, 0xa4, 0xd0, 0x27, 0xa5, 0x9e, 0x77, 0x10, 0x7c, + 0x00, 0x6e, 0x4a, 0xfa, 0x0a, 0xcb, 0x18, 0xc5, 0x94, 0x8b, 0x5c, 0xb9, 0x3b, 0xc3, 0xcd, 0xf1, + 0x76, 0xb8, 0xdb, 0x7c, 0x3c, 0xb6, 0xdf, 0xe0, 0x17, 0x60, 0xd9, 0x6c, 0xb4, 0xce, 0xde, 0xb5, + 0xec, 0x7e, 0x87, 0x86, 0x2b, 0x5e, 0xa3, 0x2f, 0xc1, 0xe7, 0xdf, 0x61, 0xa5, 0x57, 0xe7, 0xeb, + 0xc8, 0x4c, 0xf1, 0x33, 0xca, 0x92, 0x54, 0xc3, 0x3d, 0xd0, 0x4b, 0xed, 0xcb, 0x6e, 0xc6, 0x66, + 0xd8, 0x5a, 0xa3, 0x3f, 0x1c, 0x70, 0x67, 0x2a, 0x85, 0x52, 0x53, 0xb3, 0xf3, 0x2f, 0x71, 0xc6, + 0x62, 0xac, 0x85, 0x34, 0xab, 0x64, 0x26, 0x90, 0x2a, 0x65, 0x1d, 0x76, 0xc3, 0xce, 0x84, 0x7d, + 0x70, 0xbd, 0x10, 0xaf, 0xa8, 0x6c, 0x77, 0xa5, 0x31, 0x20, 0x06, 0xbd, 0xa2, 0x8c, 0x4e, 0x69, + 0x6d, 0x87, 0x7e, 0x67, 0xd2, 0xff, 0xa0, 0xa8, 0x4f, 0x78, 0x7d, 0x74, 0xf8, 0xdf, 0xbb, 0xc1, + 0xdd, 0x1a, 0xe7, 0xd9, 0xe3, 0x91, 0xe9, 0x2e, 0xe5, 0xaa, 0x54, 0xa8, 0xf1, 0x1b, 0xfd, 0xf5, + 0xe7, 0x41, 0xbf, 0xbd, 0x0c, 0x44, 0xd6, 0x85, 0x16, 0xfe, 0xac, 0x8c, 0xbe, 0xa5, 0x75, 0xd8, + 0x0a, 0x8f, 0x34, 0xb8, 0xfd, 0x3d, 0xd6, 0xa5, 0x64, 0x3c, 0x79, 0xf9, 0x62, 0x3a, 0xc3, 0xe4, + 0x94, 0x6a, 0x13, 0x4d, 0xa5, 0xc8, 0xf3, 0x66, 0xe1, 0xaf, 0x85, 0x8d, 0x01, 0x9f, 0x83, 0x9b, + 0xb9, 0xa5, 0xea, 0xda, 0x8e, 0xb0, 0x8d, 0x75, 0x67, 0xb2, 0xff, 0x41, 0x50, 0xf3, 0xee, 0x98, + 0x34, 0xad, 0x7e, 0x6d, 0x5a, 0xbd, 0xdb, 0xb9, 0x1a, 0xf0, 0xe8, 0xa7, 0x37, 0x67, 0x9e, 0xf3, + 0xf6, 0xcc, 0x73, 0xfe, 0x3d, 0xf3, 0x9c, 0xd7, 0xe7, 0xde, 0xc6, 0xdb, 0x73, 0x6f, 0xe3, 0xef, + 0x73, 0x6f, 0xe3, 0xe7, 0xaf, 0x12, 0xa6, 0xd3, 0x32, 0xf2, 0x89, 0xc8, 0xdb, 0x93, 0x16, 0xbc, + 0xbf, 0x9e, 0x07, 0xcb, 0xeb, 0x59, 0x4d, 0x82, 0x5f, 0xd7, 0x6f, 0xb3, 0xae, 0x0b, 0xaa, 0xa2, + 0x9e, 0x0d, 0xe2, 0xf0, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x2e, 0x03, 0xd8, 0xe3, 0xcc, 0x05, + 0x00, 0x00, } func (m *Params) Marshal() (dAtA []byte, err error) { diff --git a/x/ccv/consumer/types/genesis.pb.go b/x/ccv/consumer/types/genesis.pb.go index f4bb68d5ef..7e5da62359 100644 --- a/x/ccv/consumer/types/genesis.pb.go +++ b/x/ccv/consumer/types/genesis.pb.go @@ -288,56 +288,57 @@ func init() { } var fileDescriptor_2db73a6057a27482 = []byte{ - // 782 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x55, 0xcf, 0x6f, 0xeb, 0x34, - 0x1c, 0x6f, 0xde, 0x1b, 0xa5, 0xf5, 0xde, 0xe3, 0x0d, 0x0f, 0xaa, 0xd0, 0x8a, 0x50, 0x06, 0x87, - 0x4a, 0x40, 0xa2, 0x16, 0x09, 0x21, 0x90, 0x10, 0xac, 0x93, 0xa0, 0xd2, 0x80, 0xa9, 0xdd, 0x7a, - 0xd8, 0x25, 0x72, 0x1d, 0x93, 0x58, 0x4b, 0xec, 0xc8, 0x76, 0x32, 0x76, 0xe0, 0xc2, 0x95, 0x0b, - 0x7f, 0xd6, 0x8e, 0x3b, 0x72, 0x42, 0x68, 0xfb, 0x1f, 0x38, 0xa3, 0xd8, 0x4e, 0x7f, 0xb0, 0x4e, - 0xaf, 0xa7, 0xc4, 0xf9, 0x7e, 0x7e, 0x7c, 0x7f, 0x38, 0x36, 0x18, 0x52, 0xa6, 0x88, 0xc0, 0x09, - 0xa2, 0x2c, 0x94, 0x04, 0x17, 0x82, 0xaa, 0x9b, 0x00, 0xe3, 0x32, 0xc0, 0x9c, 0xc9, 0x22, 0x23, - 0x22, 0x28, 0x87, 0x41, 0x4c, 0x18, 0x91, 0x54, 0xfa, 0xb9, 0xe0, 0x8a, 0xc3, 0x8f, 0xb6, 0x50, - 0x7c, 0x8c, 0x4b, 0xbf, 0xa6, 0xf8, 0xe5, 0xb0, 0xfb, 0xf1, 0x53, 0xba, 0xe5, 0xb0, 0x7a, 0x18, - 0xa9, 0xee, 0x68, 0x17, 0xf7, 0xa5, 0xac, 0xe1, 0xf4, 0x14, 0x61, 0x11, 0x11, 0x19, 0x65, 0x2a, - 0x40, 0x0b, 0x4c, 0x03, 0x75, 0x93, 0x13, 0x9b, 0x5b, 0x37, 0xa0, 0x0b, 0x1c, 0xa4, 0x34, 0x4e, - 0x14, 0x4e, 0x29, 0x61, 0x4a, 0x06, 0x6b, 0xe8, 0x72, 0xb8, 0xb6, 0xb2, 0x84, 0x0f, 0x2b, 0x02, - 0xe6, 0x82, 0x04, 0x38, 0x41, 0x8c, 0x91, 0x54, 0x3b, 0x9a, 0x57, 0x0b, 0xf1, 0x62, 0xce, 0xe3, - 0x94, 0x04, 0x7a, 0xb5, 0x28, 0x7e, 0x09, 0xa2, 0x42, 0x20, 0x45, 0x39, 0xb3, 0xf1, 0x77, 0x62, - 0x1e, 0x73, 0xfd, 0x1a, 0x54, 0x6f, 0xe6, 0xeb, 0xd1, 0xbf, 0x2d, 0xf0, 0xe2, 0x7b, 0xd3, 0xb7, - 0x99, 0x42, 0x8a, 0xc0, 0x09, 0x68, 0xe6, 0x48, 0xa0, 0x4c, 0xba, 0x4e, 0xdf, 0x19, 0xec, 0x8f, - 0x3e, 0xf1, 0x77, 0xe8, 0xa3, 0x7f, 0xa6, 0x29, 0xc7, 0x7b, 0xb7, 0x7f, 0x7f, 0xd0, 0x98, 0x5a, - 0x01, 0xf8, 0x29, 0x80, 0xb9, 0xe0, 0x25, 0x8d, 0x88, 0x08, 0x4d, 0x9d, 0x21, 0x8d, 0xdc, 0x67, - 0x7d, 0x67, 0xd0, 0x9e, 0x1e, 0xd4, 0x91, 0xb1, 0x0e, 0x4c, 0x22, 0xe8, 0x83, 0xc3, 0x15, 0xda, - 0x54, 0x56, 0xc1, 0x9f, 0x6b, 0xf8, 0xdb, 0x4b, 0xb8, 0x89, 0x4c, 0x22, 0xd8, 0x03, 0x6d, 0x46, - 0xae, 0x43, 0x9d, 0x98, 0xbb, 0xd7, 0x77, 0x06, 0xad, 0x69, 0x8b, 0x91, 0xeb, 0x71, 0xb5, 0x86, - 0x21, 0x78, 0xf7, 0xff, 0xd6, 0xb2, 0x2a, 0xcf, 0x7d, 0xa3, 0x2e, 0x6a, 0x81, 0xfd, 0xf5, 0x01, - 0xf8, 0x6b, 0x2d, 0x2f, 0x87, 0xbe, 0xc9, 0x4a, 0x77, 0x64, 0x7a, 0xb8, 0x99, 0xaa, 0x69, 0x53, - 0x02, 0xdc, 0x95, 0x01, 0x67, 0x92, 0x30, 0x59, 0x48, 0xeb, 0xd1, 0xd4, 0x1e, 0xfe, 0x6b, 0x3d, - 0x6a, 0x9a, 0xb1, 0xe9, 0x2c, 0x6d, 0x36, 0xbe, 0xc3, 0x18, 0x1c, 0x64, 0x48, 0x15, 0x82, 0xb2, - 0x38, 0xcc, 0x11, 0xbe, 0x22, 0x4a, 0xba, 0x6f, 0xf6, 0x9f, 0x0f, 0xf6, 0x47, 0x5f, 0xec, 0x34, - 0x9a, 0x1f, 0x2d, 0x79, 0x3e, 0x1b, 0x9f, 0x69, 0xba, 0x9d, 0xd2, 0xab, 0x5a, 0xd5, 0x7c, 0x95, - 0xf0, 0x27, 0xf0, 0x8a, 0x32, 0xaa, 0x28, 0x4a, 0xc3, 0x12, 0xa5, 0xa1, 0x24, 0xca, 0x6d, 0x69, - 0x9f, 0xfe, 0x7a, 0xe2, 0xd5, 0x5e, 0xf6, 0xe7, 0x28, 0xa5, 0x11, 0x52, 0x5c, 0x5c, 0xe4, 0x11, - 0x52, 0xc4, 0x2a, 0xbe, 0xb4, 0xf4, 0x39, 0x4a, 0x67, 0x44, 0xc1, 0xdf, 0x40, 0x37, 0x21, 0x55, - 0xf9, 0xa1, 0xe2, 0x95, 0xa2, 0x24, 0x2a, 0x2c, 0x34, 0xbe, 0x9a, 0x6b, 0x5b, 0x4b, 0x7f, 0xbd, - 0x53, 0x09, 0x3f, 0x68, 0x99, 0x73, 0x3e, 0xd7, 0x22, 0xc6, 0x73, 0x72, 0x62, 0x5d, 0x3b, 0xc9, - 0xb6, 0x68, 0x04, 0x7f, 0x77, 0xc0, 0xfb, 0xbc, 0x50, 0x52, 0x21, 0x16, 0x55, 0xbd, 0x8b, 0xf8, - 0x35, 0x53, 0x34, 0x23, 0xa1, 0x4c, 0x91, 0x4c, 0x28, 0x8b, 0x5d, 0xa0, 0x53, 0xf8, 0x72, 0xa7, - 0x14, 0x7e, 0x5e, 0x29, 0x9d, 0x58, 0x21, 0xeb, 0xdf, 0xe3, 0x8f, 0x43, 0x33, 0x6b, 0x01, 0x05, - 0x70, 0x73, 0x62, 0xfc, 0x6b, 0xb5, 0xe5, 0x10, 0xf7, 0xf5, 0x36, 0x19, 0x3d, 0x69, 0x6f, 0xb7, - 0x48, 0xc5, 0x31, 0x23, 0x3a, 0x41, 0x0a, 0x9d, 0x52, 0x59, 0x0f, 0xb0, 0x63, 0x95, 0x37, 0x41, - 0x12, 0xfe, 0xe1, 0x00, 0x2f, 0x45, 0x52, 0x85, 0x4a, 0x20, 0x26, 0x33, 0x2a, 0x25, 0xe5, 0x2c, - 0x5c, 0xa4, 0x1c, 0x5f, 0x85, 0xa6, 0x57, 0xee, 0x0b, 0x6d, 0xfd, 0xed, 0x4e, 0x95, 0x9f, 0x22, - 0xa9, 0xce, 0xd7, 0x94, 0x8e, 0x2b, 0x21, 0x33, 0x91, 0xba, 0x03, 0xe9, 0xd3, 0x10, 0xd8, 0x01, - 0xcd, 0x5c, 0x90, 0xf1, 0x78, 0xee, 0xbe, 0xd4, 0xff, 0xa8, 0x5d, 0x1d, 0x5d, 0x82, 0xce, 0xf6, - 0xb1, 0x56, 0x0c, 0x9b, 0x66, 0x75, 0x02, 0xed, 0x4d, 0xed, 0x0a, 0x0e, 0xc0, 0xc1, 0xa3, 0x5d, - 0xf4, 0x4c, 0x23, 0xde, 0x2a, 0x37, 0x46, 0x7f, 0x74, 0x01, 0x0e, 0xb7, 0xcc, 0x0b, 0x7e, 0x03, - 0x7a, 0x65, 0xbd, 0x71, 0xd7, 0x7e, 0x5a, 0x14, 0x45, 0x82, 0x48, 0x73, 0xde, 0xb5, 0xa7, 0xef, - 0x2d, 0x21, 0xcb, 0xff, 0xf0, 0x3b, 0x03, 0x38, 0x3e, 0xbf, 0xbd, 0xf7, 0x9c, 0xbb, 0x7b, 0xcf, - 0xf9, 0xe7, 0xde, 0x73, 0xfe, 0x7c, 0xf0, 0x1a, 0x77, 0x0f, 0x5e, 0xe3, 0xaf, 0x07, 0xaf, 0x71, - 0xf9, 0x55, 0x4c, 0x55, 0x52, 0x2c, 0x7c, 0xcc, 0xb3, 0x00, 0x73, 0x99, 0x71, 0x19, 0xac, 0x5a, - 0xfb, 0xd9, 0xf2, 0xca, 0xf8, 0x75, 0xf3, 0xd2, 0xd0, 0x37, 0xc2, 0xa2, 0xa9, 0x0f, 0xe2, 0xcf, - 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xab, 0x08, 0x12, 0x9c, 0xe3, 0x06, 0x00, 0x00, + // 786 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x55, 0x4b, 0x8f, 0xe3, 0x34, + 0x1c, 0x6f, 0x76, 0x87, 0xd2, 0x7a, 0x76, 0xd9, 0xc1, 0x03, 0x55, 0x68, 0x45, 0x28, 0x03, 0x87, + 0x4a, 0x40, 0xac, 0x16, 0x09, 0x21, 0x21, 0x10, 0x4c, 0x47, 0x82, 0x4a, 0x0b, 0xac, 0xda, 0xdd, + 0x22, 0xed, 0x25, 0x72, 0x1d, 0x93, 0x58, 0x9b, 0xd8, 0x91, 0xed, 0x64, 0xd8, 0x03, 0x17, 0xae, + 0x5c, 0xf8, 0x58, 0x7b, 0x9c, 0x23, 0x27, 0x84, 0x66, 0xbe, 0x03, 0x67, 0x14, 0xdb, 0xe9, 0x83, + 0xe9, 0x88, 0x9e, 0x12, 0xe7, 0xff, 0x7b, 0xfc, 0x1f, 0x8e, 0x0d, 0xc6, 0x8c, 0x6b, 0x2a, 0x49, + 0x8a, 0x19, 0x8f, 0x14, 0x25, 0xa5, 0x64, 0xfa, 0x25, 0x22, 0xa4, 0x42, 0x44, 0x70, 0x55, 0xe6, + 0x54, 0xa2, 0x6a, 0x8c, 0x12, 0xca, 0xa9, 0x62, 0x2a, 0x2c, 0xa4, 0xd0, 0x02, 0x7e, 0xb0, 0x87, + 0x12, 0x12, 0x52, 0x85, 0x0d, 0x25, 0xac, 0xc6, 0xfd, 0x0f, 0xef, 0xd2, 0xad, 0xc6, 0xf5, 0xc3, + 0x4a, 0xf5, 0x27, 0x87, 0xb8, 0xaf, 0x65, 0x2d, 0x67, 0xa0, 0x29, 0x8f, 0xa9, 0xcc, 0x19, 0xd7, + 0x08, 0xaf, 0x08, 0x43, 0xfa, 0x65, 0x41, 0x5d, 0x6e, 0x7d, 0xc4, 0x56, 0x04, 0x65, 0x2c, 0x49, + 0x35, 0xc9, 0x18, 0xe5, 0x5a, 0xa1, 0x2d, 0x74, 0x35, 0xde, 0x5a, 0x39, 0xc2, 0xfb, 0x35, 0x81, + 0x08, 0x49, 0x11, 0x49, 0x31, 0xe7, 0x34, 0x33, 0x8e, 0xf6, 0xd5, 0x41, 0x82, 0x44, 0x88, 0x24, + 0xa3, 0xc8, 0xac, 0x56, 0xe5, 0xcf, 0x28, 0x2e, 0x25, 0xd6, 0x4c, 0x70, 0x17, 0x7f, 0x2b, 0x11, + 0x89, 0x30, 0xaf, 0xa8, 0x7e, 0xb3, 0x5f, 0xcf, 0xfe, 0xe9, 0x80, 0x07, 0xdf, 0xda, 0xbe, 0x2d, + 0x34, 0xd6, 0x14, 0xce, 0x40, 0xbb, 0xc0, 0x12, 0xe7, 0xca, 0xf7, 0x86, 0xde, 0xe8, 0x78, 0xf2, + 0x51, 0x78, 0x40, 0x1f, 0xc3, 0x27, 0x86, 0x72, 0x7e, 0xf4, 0xea, 0xaf, 0xf7, 0x5a, 0x73, 0x27, + 0x00, 0x3f, 0x06, 0xb0, 0x90, 0xa2, 0x62, 0x31, 0x95, 0x91, 0xad, 0x33, 0x62, 0xb1, 0x7f, 0x6f, + 0xe8, 0x8d, 0xba, 0xf3, 0x93, 0x26, 0x32, 0x35, 0x81, 0x59, 0x0c, 0x43, 0x70, 0xba, 0x41, 0xdb, + 0xca, 0x6a, 0xf8, 0x7d, 0x03, 0x7f, 0x73, 0x0d, 0xb7, 0x91, 0x59, 0x0c, 0x07, 0xa0, 0xcb, 0xe9, + 0x65, 0x64, 0x12, 0xf3, 0x8f, 0x86, 0xde, 0xa8, 0x33, 0xef, 0x70, 0x7a, 0x39, 0xad, 0xd7, 0x30, + 0x02, 0x6f, 0xff, 0xd7, 0x5a, 0xd5, 0xe5, 0xf9, 0xaf, 0x35, 0x45, 0xad, 0x48, 0xb8, 0x3d, 0x80, + 0x70, 0xab, 0xe5, 0xd5, 0x38, 0xb4, 0x59, 0x99, 0x8e, 0xcc, 0x4f, 0x77, 0x53, 0xb5, 0x6d, 0x4a, + 0x81, 0xbf, 0x31, 0x10, 0x5c, 0x51, 0xae, 0x4a, 0xe5, 0x3c, 0xda, 0xc6, 0x23, 0xfc, 0x5f, 0x8f, + 0x86, 0x66, 0x6d, 0x7a, 0x6b, 0x9b, 0x9d, 0xef, 0x30, 0x01, 0x27, 0x39, 0xd6, 0xa5, 0x64, 0x3c, + 0x89, 0x0a, 0x4c, 0x5e, 0x50, 0xad, 0xfc, 0xd7, 0x87, 0xf7, 0x47, 0xc7, 0x93, 0xcf, 0x0e, 0x1a, + 0xcd, 0xf7, 0x8e, 0xbc, 0x5c, 0x4c, 0x9f, 0x18, 0xba, 0x9b, 0xd2, 0xa3, 0x46, 0xd5, 0x7e, 0x55, + 0xf0, 0x07, 0xf0, 0x88, 0x71, 0xa6, 0x19, 0xce, 0xa2, 0x0a, 0x67, 0x91, 0xa2, 0xda, 0xef, 0x18, + 0x9f, 0xe1, 0x76, 0xe2, 0xf5, 0x5e, 0x0e, 0x97, 0x38, 0x63, 0x31, 0xd6, 0x42, 0x3e, 0x2b, 0x62, + 0xac, 0xa9, 0x53, 0x7c, 0xe8, 0xe8, 0x4b, 0x9c, 0x2d, 0xa8, 0x86, 0xbf, 0x82, 0x7e, 0x4a, 0xeb, + 0xf2, 0x23, 0x2d, 0x6a, 0x45, 0x45, 0x75, 0x54, 0x1a, 0x7c, 0x3d, 0xd7, 0xae, 0x91, 0xfe, 0xe2, + 0xa0, 0x12, 0xbe, 0x33, 0x32, 0x4f, 0xc5, 0xd2, 0x88, 0x58, 0xcf, 0xd9, 0x85, 0x73, 0xed, 0xa5, + 0xfb, 0xa2, 0x31, 0xfc, 0xcd, 0x03, 0xef, 0x8a, 0x52, 0x2b, 0x8d, 0x79, 0x5c, 0xf7, 0x2e, 0x16, + 0x97, 0x5c, 0xb3, 0x9c, 0x46, 0x2a, 0xc3, 0x2a, 0x65, 0x3c, 0xf1, 0x81, 0x49, 0xe1, 0xf3, 0x83, + 0x52, 0xf8, 0x71, 0xa3, 0x74, 0xe1, 0x84, 0x9c, 0xff, 0x40, 0xdc, 0x0e, 0x2d, 0x9c, 0x05, 0x94, + 0xc0, 0x2f, 0xa8, 0xf5, 0x6f, 0xd4, 0xd6, 0x43, 0x3c, 0x36, 0xdb, 0x64, 0x72, 0xa7, 0xbd, 0xdb, + 0x22, 0x35, 0xc7, 0x8e, 0xe8, 0x02, 0x6b, 0xfc, 0x98, 0xa9, 0x66, 0x80, 0x3d, 0xa7, 0xbc, 0x0b, + 0x52, 0xf0, 0x77, 0x0f, 0x04, 0x19, 0x56, 0x3a, 0xd2, 0x12, 0x73, 0x95, 0x33, 0xa5, 0x98, 0xe0, + 0xd1, 0x2a, 0x13, 0xe4, 0x45, 0x64, 0x7b, 0xe5, 0x3f, 0x30, 0xd6, 0x5f, 0x1f, 0x54, 0xf9, 0x63, + 0xac, 0xf4, 0xd3, 0x2d, 0xa5, 0xf3, 0x5a, 0xc8, 0x4e, 0xa4, 0xe9, 0x40, 0x76, 0x37, 0x04, 0xf6, + 0x40, 0xbb, 0x90, 0x74, 0x3a, 0x5d, 0xfa, 0x0f, 0xcd, 0x3f, 0xea, 0x56, 0x67, 0xcf, 0x41, 0x6f, + 0xff, 0x58, 0x6b, 0x86, 0x4b, 0xb3, 0x3e, 0x81, 0x8e, 0xe6, 0x6e, 0x05, 0x47, 0xe0, 0xe4, 0xd6, + 0x2e, 0xba, 0x67, 0x10, 0x6f, 0x54, 0x3b, 0xa3, 0x3f, 0x7b, 0x06, 0x4e, 0xf7, 0xcc, 0x0b, 0x7e, + 0x05, 0x06, 0x55, 0xb3, 0x71, 0xb7, 0x7e, 0x5a, 0x1c, 0xc7, 0x92, 0x2a, 0x7b, 0xde, 0x75, 0xe7, + 0xef, 0xac, 0x21, 0xeb, 0xff, 0xf0, 0x1b, 0x0b, 0x38, 0xff, 0xe9, 0xd5, 0x75, 0xe0, 0x5d, 0x5d, + 0x07, 0xde, 0xdf, 0xd7, 0x81, 0xf7, 0xc7, 0x4d, 0xd0, 0xba, 0xba, 0x09, 0x5a, 0x7f, 0xde, 0x04, + 0xad, 0xe7, 0x5f, 0x26, 0x4c, 0xa7, 0xe5, 0x2a, 0x24, 0x22, 0x47, 0x44, 0xa8, 0x5c, 0x28, 0xb4, + 0x69, 0xed, 0x27, 0xeb, 0x2b, 0xa3, 0x9a, 0xa0, 0x5f, 0x76, 0xef, 0x0d, 0x73, 0x29, 0xac, 0xda, + 0xe6, 0x2c, 0xfe, 0xf4, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x86, 0x37, 0xab, 0xfd, 0xe6, 0x06, + 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/ccv/consumer/types/query.pb.go b/x/ccv/consumer/types/query.pb.go index c3961ee416..53c84a1f47 100644 --- a/x/ccv/consumer/types/query.pb.go +++ b/x/ccv/consumer/types/query.pb.go @@ -308,40 +308,40 @@ func init() { } var fileDescriptor_f627751d3cc10225 = []byte{ - // 519 bytes of a gzipped FileDescriptorProto + // 522 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0xcf, 0x8b, 0xd3, 0x40, 0x14, 0x6e, 0xb6, 0x3f, 0xc4, 0x59, 0xbc, 0x8c, 0x15, 0x42, 0x95, 0xb8, 0x44, 0xc1, 0xaa, 0x34, - 0x71, 0xbb, 0x87, 0x55, 0x2f, 0xca, 0xaa, 0x8b, 0x82, 0xca, 0x5a, 0xf6, 0xe4, 0x65, 0x9d, 0x4e, - 0xdf, 0xa6, 0x03, 0xcd, 0x4c, 0x76, 0x66, 0x12, 0xda, 0x9b, 0xf8, 0x07, 0x88, 0xe0, 0x7f, 0xe2, - 0xc5, 0x7f, 0x61, 0x8f, 0x0b, 0x5e, 0x3c, 0x89, 0xb4, 0xfe, 0x11, 0x1e, 0x25, 0x93, 0x64, 0x4d, - 0x41, 0xb7, 0x11, 0xbc, 0x4d, 0xbf, 0xef, 0xbd, 0xef, 0x7d, 0xf3, 0xcd, 0x6b, 0x90, 0xcf, 0xb8, - 0x06, 0x49, 0xc7, 0x84, 0xf1, 0x03, 0x05, 0x34, 0x96, 0x4c, 0xcf, 0x7c, 0x4a, 0x13, 0x9f, 0x0a, - 0xae, 0xe2, 0x10, 0xa4, 0x9f, 0x6c, 0xfa, 0x47, 0x31, 0xc8, 0x99, 0x17, 0x49, 0xa1, 0x05, 0xbe, - 0xf6, 0x87, 0x06, 0x8f, 0xd2, 0xc4, 0x2b, 0x1a, 0xbc, 0x64, 0xb3, 0xd3, 0x0e, 0x44, 0x20, 0x4c, - 0xbd, 0x9f, 0x9e, 0xb2, 0xd6, 0xce, 0x95, 0x40, 0x88, 0x60, 0x02, 0x3e, 0x89, 0x98, 0x4f, 0x38, - 0x17, 0x9a, 0x68, 0x26, 0xb8, 0xca, 0xd9, 0x7e, 0x15, 0x27, 0xa7, 0x43, 0x4c, 0x8f, 0xfb, 0x7e, - 0x0d, 0x5d, 0x7e, 0x09, 0x53, 0xbd, 0x0b, 0xf0, 0x98, 0x29, 0x2d, 0xd9, 0x30, 0x4e, 0x25, 0x9f, - 0x28, 0xcd, 0x42, 0xa2, 0x01, 0x5f, 0x47, 0x17, 0x68, 0x2c, 0x25, 0x70, 0xfd, 0x14, 0x58, 0x30, - 0xd6, 0xb6, 0xb5, 0x61, 0x75, 0xeb, 0x83, 0x65, 0x10, 0x3b, 0x08, 0x4d, 0x88, 0x2a, 0x4a, 0xd6, - 0x4c, 0x49, 0x09, 0x49, 0x79, 0x0e, 0xd3, 0x82, 0xaf, 0x67, 0xfc, 0x6f, 0x04, 0x6f, 0xa1, 0x4b, - 0xa3, 0xd2, 0xf4, 0x83, 0x43, 0x49, 0x68, 0x7a, 0xb0, 0x1b, 0x1b, 0x56, 0xf7, 0xfc, 0xa0, 0x5d, - 0x26, 0x77, 0x73, 0x0e, 0xb7, 0x51, 0x53, 0x0b, 0x4d, 0x26, 0x76, 0xd3, 0x14, 0x65, 0x3f, 0xd2, - 0x51, 0x5a, 0xec, 0x49, 0x91, 0xb0, 0x11, 0x48, 0xbb, 0x65, 0xa8, 0x12, 0x92, 0xf1, 0x8f, 0xf2, - 0x10, 0xec, 0x73, 0x05, 0x5f, 0x20, 0xee, 0x4d, 0x74, 0xe3, 0x55, 0xfa, 0x58, 0x67, 0x84, 0x32, - 0x80, 0xa3, 0x18, 0x94, 0x76, 0xdf, 0x5a, 0xa8, 0xbb, 0xba, 0x56, 0x45, 0x82, 0x2b, 0xc0, 0xfb, - 0xa8, 0x31, 0x22, 0x9a, 0x98, 0xfc, 0xd6, 0xfb, 0x0f, 0xbd, 0x0a, 0x4b, 0xe0, 0x9d, 0xa5, 0x6b, - 0xd4, 0xdc, 0x36, 0xc2, 0xc6, 0xc1, 0x1e, 0x91, 0x24, 0x54, 0x85, 0xb1, 0x37, 0xe8, 0xe2, 0x12, - 0x9a, 0x5b, 0x78, 0x86, 0x5a, 0x91, 0x41, 0x72, 0x13, 0xb7, 0x2b, 0x99, 0xc8, 0x44, 0x76, 0x1a, - 0xc7, 0xdf, 0xae, 0xd6, 0x06, 0xb9, 0x40, 0xff, 0x73, 0x1d, 0x35, 0xcd, 0x08, 0xfc, 0xd3, 0x42, - 0xf6, 0xdf, 0x42, 0xc0, 0xcf, 0x2b, 0x4d, 0xa8, 0x98, 0x77, 0xe7, 0xc5, 0x7f, 0x52, 0xcb, 0xe2, - 0x70, 0x1f, 0xbc, 0xfb, 0xf2, 0xe3, 0xe3, 0xda, 0x3d, 0xbc, 0xbd, 0xfa, 0x1f, 0x9c, 0xae, 0x6a, - 0xef, 0x10, 0xa0, 0x57, 0x5e, 0x44, 0xfc, 0xc9, 0x42, 0xeb, 0xa5, 0x9c, 0xf1, 0x76, 0x75, 0x7f, - 0x4b, 0xef, 0xd5, 0xb9, 0xfb, 0xef, 0x8d, 0xf9, 0x1d, 0xee, 0x98, 0x3b, 0xdc, 0xc2, 0xdd, 0xd5, - 0x77, 0xc8, 0x5e, 0x6e, 0x67, 0xff, 0x78, 0xee, 0x58, 0x27, 0x73, 0xc7, 0xfa, 0x3e, 0x77, 0xac, - 0x0f, 0x0b, 0xa7, 0x76, 0xb2, 0x70, 0x6a, 0x5f, 0x17, 0x4e, 0xed, 0xf5, 0xfd, 0x80, 0xe9, 0x71, - 0x3c, 0xf4, 0xa8, 0x08, 0x7d, 0x2a, 0x54, 0x28, 0x54, 0x49, 0xb4, 0x77, 0x2a, 0x3a, 0x5d, 0x96, - 0xd5, 0xb3, 0x08, 0xd4, 0xb0, 0x65, 0xbe, 0x26, 0x5b, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0x1c, - 0x94, 0x9c, 0x7a, 0x0d, 0x05, 0x00, 0x00, + 0xe3, 0x76, 0x0f, 0xab, 0x07, 0x51, 0x56, 0x5d, 0x14, 0x54, 0xd6, 0x22, 0x08, 0x5e, 0xd6, 0xe9, + 0xf4, 0x6d, 0x3a, 0xd0, 0x64, 0xb2, 0x33, 0x93, 0xd0, 0xde, 0xc4, 0x3f, 0x40, 0x04, 0xff, 0x13, + 0x2f, 0xfe, 0x0b, 0x7b, 0x5c, 0xf0, 0xe2, 0x49, 0xa4, 0xf5, 0x8f, 0xf0, 0x28, 0x99, 0x24, 0x6b, + 0x0a, 0xba, 0x8d, 0xe0, 0x6d, 0xfa, 0x7d, 0xef, 0x7d, 0xef, 0x9b, 0x6f, 0x5e, 0x83, 0x08, 0x0f, + 0x35, 0x48, 0x36, 0xa6, 0x3c, 0xdc, 0x57, 0xc0, 0x62, 0xc9, 0xf5, 0x8c, 0x30, 0x96, 0x10, 0x26, + 0x42, 0x15, 0x07, 0x20, 0x49, 0xb2, 0x49, 0x0e, 0x63, 0x90, 0x33, 0x2f, 0x92, 0x42, 0x0b, 0x7c, + 0xe5, 0x0f, 0x0d, 0x1e, 0x63, 0x89, 0x57, 0x34, 0x78, 0xc9, 0x66, 0xa7, 0xed, 0x0b, 0x5f, 0x98, + 0x7a, 0x92, 0x9e, 0xb2, 0xd6, 0xce, 0x25, 0x5f, 0x08, 0x7f, 0x02, 0x84, 0x46, 0x9c, 0xd0, 0x30, + 0x14, 0x9a, 0x6a, 0x2e, 0x42, 0x95, 0xb3, 0xfd, 0x2a, 0x4e, 0x4e, 0x86, 0x98, 0x1e, 0xf7, 0xfd, + 0x1a, 0xba, 0xf8, 0x1c, 0xa6, 0x7a, 0x17, 0xe0, 0x21, 0x57, 0x5a, 0xf2, 0x61, 0x9c, 0x4a, 0x3e, + 0x52, 0x9a, 0x07, 0x54, 0x03, 0xbe, 0x8a, 0xce, 0xb1, 0x58, 0x4a, 0x08, 0xf5, 0x63, 0xe0, 0xfe, + 0x58, 0xdb, 0xd6, 0x86, 0xd5, 0xad, 0x0f, 0x96, 0x41, 0xec, 0x20, 0x34, 0xa1, 0xaa, 0x28, 0x59, + 0x33, 0x25, 0x25, 0x24, 0xe5, 0x43, 0x98, 0x16, 0x7c, 0x3d, 0xe3, 0x7f, 0x23, 0x78, 0x0b, 0x5d, + 0x18, 0x95, 0xa6, 0xef, 0x1f, 0x48, 0xca, 0xd2, 0x83, 0xdd, 0xd8, 0xb0, 0xba, 0x67, 0x07, 0xed, + 0x32, 0xb9, 0x9b, 0x73, 0xb8, 0x8d, 0x9a, 0x5a, 0x68, 0x3a, 0xb1, 0x9b, 0xa6, 0x28, 0xfb, 0x91, + 0x8e, 0xd2, 0x62, 0x4f, 0x8a, 0x84, 0x8f, 0x40, 0xda, 0x2d, 0x43, 0x95, 0x90, 0x8c, 0x7f, 0x90, + 0x87, 0x60, 0x9f, 0x29, 0xf8, 0x02, 0x71, 0xaf, 0xa3, 0x6b, 0x2f, 0xd2, 0xc7, 0x3a, 0x25, 0x94, + 0x01, 0x1c, 0xc6, 0xa0, 0xb4, 0xfb, 0xd6, 0x42, 0xdd, 0xd5, 0xb5, 0x2a, 0x12, 0xa1, 0x02, 0xfc, + 0x12, 0x35, 0x46, 0x54, 0x53, 0x93, 0xdf, 0x7a, 0xff, 0xbe, 0x57, 0x61, 0x09, 0xbc, 0xd3, 0x74, + 0x8d, 0x9a, 0xdb, 0x46, 0xd8, 0x38, 0xd8, 0xa3, 0x92, 0x06, 0xaa, 0x30, 0xf6, 0x06, 0x9d, 0x5f, + 0x42, 0x73, 0x0b, 0x4f, 0x50, 0x2b, 0x32, 0x48, 0x6e, 0xe2, 0x66, 0x25, 0x13, 0x99, 0xc8, 0x4e, + 0xe3, 0xe8, 0xdb, 0xe5, 0xda, 0x20, 0x17, 0xe8, 0x7f, 0xae, 0xa3, 0xa6, 0x19, 0x81, 0x7f, 0x5a, + 0xc8, 0xfe, 0x5b, 0x08, 0xf8, 0x69, 0xa5, 0x09, 0x15, 0xf3, 0xee, 0x3c, 0xfb, 0x4f, 0x6a, 0x59, + 0x1c, 0xee, 0xbd, 0x77, 0x5f, 0x7e, 0x7c, 0x5c, 0xbb, 0x83, 0xb7, 0x57, 0xff, 0x83, 0xd3, 0x55, + 0xed, 0x1d, 0x00, 0xf4, 0xca, 0x8b, 0x88, 0x3f, 0x59, 0x68, 0xbd, 0x94, 0x33, 0xde, 0xae, 0xee, + 0x6f, 0xe9, 0xbd, 0x3a, 0xb7, 0xff, 0xbd, 0x31, 0xbf, 0xc3, 0x2d, 0x73, 0x87, 0x1b, 0xb8, 0xbb, + 0xfa, 0x0e, 0xd9, 0xcb, 0xed, 0xbc, 0x3a, 0x9a, 0x3b, 0xd6, 0xf1, 0xdc, 0xb1, 0xbe, 0xcf, 0x1d, + 0xeb, 0xc3, 0xc2, 0xa9, 0x1d, 0x2f, 0x9c, 0xda, 0xd7, 0x85, 0x53, 0x7b, 0x7d, 0xd7, 0xe7, 0x7a, + 0x1c, 0x0f, 0x3d, 0x26, 0x02, 0xc2, 0x84, 0x0a, 0x84, 0x2a, 0x89, 0xf6, 0x4e, 0x44, 0x93, 0x3e, + 0x99, 0x2e, 0x2b, 0xeb, 0x59, 0x04, 0x6a, 0xd8, 0x32, 0x1f, 0x94, 0xad, 0x5f, 0x01, 0x00, 0x00, + 0xff, 0xff, 0xc4, 0xb4, 0x4e, 0xea, 0x10, 0x05, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/ccv/provider/types/genesis.pb.go b/x/ccv/provider/types/genesis.pb.go index e513ce25c7..6d4da633fd 100644 --- a/x/ccv/provider/types/genesis.pb.go +++ b/x/ccv/provider/types/genesis.pb.go @@ -334,61 +334,61 @@ func init() { } var fileDescriptor_48411d9c7900d48e = []byte{ - // 853 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0x41, 0x8f, 0xdb, 0x44, + // 856 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xdd, 0x8e, 0xdb, 0x44, 0x14, 0x5e, 0xef, 0xa6, 0xdb, 0xcd, 0x6c, 0x77, 0x59, 0x86, 0x55, 0x70, 0xb3, 0x90, 0xae, 0x02, - 0x48, 0x91, 0x00, 0x1b, 0x07, 0x0e, 0x50, 0xe0, 0xd0, 0xb4, 0x12, 0x44, 0x08, 0x11, 0xa5, 0xdb, - 0x1e, 0xca, 0xc1, 0x9a, 0x8c, 0x47, 0xc9, 0x10, 0x7b, 0xc6, 0x9a, 0x19, 0x9b, 0x5a, 0x08, 0x89, - 0x8a, 0x3f, 0xc0, 0xbf, 0xa2, 0xc7, 0x1e, 0x39, 0x55, 0x68, 0xf7, 0x1f, 0xf0, 0x0b, 0x90, 0xc7, - 0x63, 0xd7, 0x5e, 0x12, 0x48, 0xb8, 0xc5, 0xef, 0x9b, 0xf7, 0x7d, 0xef, 0xcd, 0x9b, 0xf9, 0x26, - 0xc0, 0xa3, 0x4c, 0x11, 0x81, 0x17, 0x88, 0x32, 0x5f, 0x12, 0x9c, 0x08, 0xaa, 0x32, 0x17, 0xe3, - 0xd4, 0x8d, 0x05, 0x4f, 0x69, 0x40, 0x84, 0x9b, 0x7a, 0xee, 0x9c, 0x30, 0x22, 0xa9, 0x74, 0x62, - 0xc1, 0x15, 0x87, 0xef, 0xac, 0x48, 0x71, 0x30, 0x4e, 0x9d, 0x32, 0xc5, 0x49, 0xbd, 0xee, 0xe9, - 0x9c, 0xcf, 0xb9, 0x5e, 0xef, 0xe6, 0xbf, 0x8a, 0xd4, 0xee, 0xbb, 0xeb, 0xd4, 0x52, 0xcf, 0x35, - 0x0c, 0x8a, 0x77, 0x87, 0x9b, 0xd4, 0x54, 0x89, 0xfd, 0x47, 0x0e, 0xe6, 0x4c, 0x26, 0x51, 0x91, - 0x53, 0xfe, 0x36, 0x39, 0xde, 0x26, 0x39, 0x8d, 0xde, 0xbb, 0x6f, 0x29, 0xc2, 0x02, 0x22, 0x22, - 0xca, 0x94, 0x8b, 0x45, 0x16, 0x2b, 0xee, 0x2e, 0x49, 0x66, 0xd0, 0xfe, 0xef, 0x6d, 0x70, 0xeb, - 0xab, 0x62, 0xfd, 0x43, 0x85, 0x14, 0x81, 0x03, 0x70, 0x92, 0xa2, 0x50, 0x12, 0xe5, 0x27, 0x71, - 0x80, 0x14, 0xf1, 0x69, 0x60, 0x5b, 0xe7, 0xd6, 0xa0, 0x35, 0x3d, 0x2e, 0xe2, 0x8f, 0x74, 0x78, - 0x1c, 0xc0, 0x9f, 0xc0, 0x6b, 0xa5, 0xaa, 0x2f, 0xf3, 0x5c, 0x69, 0xef, 0x9e, 0xef, 0x0d, 0x0e, - 0x87, 0x43, 0x67, 0x83, 0xed, 0x76, 0xee, 0x9b, 0x5c, 0x2d, 0x3b, 0xea, 0x3d, 0x7f, 0x79, 0x67, - 0xe7, 0xaf, 0x97, 0x77, 0x3a, 0x19, 0x8a, 0xc2, 0xbb, 0xfd, 0x6b, 0xc4, 0xfd, 0xe9, 0x31, 0xae, - 0x2f, 0x97, 0xf0, 0x7b, 0x70, 0x94, 0xb0, 0x19, 0x67, 0x01, 0x65, 0x73, 0x9f, 0xc7, 0xd2, 0xde, - 0xd3, 0xd2, 0x1f, 0x6d, 0x24, 0xfd, 0xa8, 0xcc, 0xfc, 0x2e, 0x1e, 0xb5, 0x72, 0xe1, 0xe9, 0xad, - 0xe4, 0x55, 0x48, 0x42, 0x04, 0x4e, 0x23, 0xa4, 0x12, 0x41, 0xfc, 0xa6, 0x46, 0xeb, 0xdc, 0x1a, - 0x1c, 0x0e, 0xdd, 0xb5, 0x1a, 0xa9, 0xe7, 0x7c, 0xab, 0xf3, 0x82, 0x9a, 0x82, 0x9c, 0xc2, 0x82, - 0xac, 0x1e, 0x83, 0x3f, 0x83, 0xee, 0xf5, 0x6d, 0xf6, 0x15, 0xf7, 0x17, 0x84, 0xce, 0x17, 0xca, - 0xbe, 0xa1, 0x9b, 0xf9, 0x7c, 0xa3, 0x66, 0x1e, 0x37, 0xa6, 0x72, 0xc1, 0xbf, 0xd6, 0x14, 0xa6, - 0xaf, 0x4e, 0xba, 0x12, 0x85, 0xbf, 0x5a, 0xe0, 0xac, 0xda, 0x63, 0x14, 0x04, 0x54, 0x51, 0xce, - 0xfc, 0x58, 0xf0, 0x98, 0x4b, 0x14, 0x4a, 0x7b, 0x5f, 0x17, 0xf0, 0xe5, 0x56, 0x83, 0xbc, 0x67, - 0x68, 0x26, 0x86, 0xc5, 0x94, 0x70, 0x1b, 0xaf, 0xc1, 0x25, 0xfc, 0xc5, 0x02, 0xdd, 0xaa, 0x0a, - 0x41, 0x22, 0x9e, 0xa2, 0xb0, 0x56, 0xc4, 0x4d, 0x5d, 0xc4, 0x17, 0x5b, 0x15, 0x31, 0x2d, 0x58, - 0xae, 0xd5, 0x60, 0xe3, 0xd5, 0xb0, 0x84, 0x63, 0xb0, 0x1f, 0x23, 0x81, 0x22, 0x69, 0x1f, 0xe8, - 0xe1, 0xbe, 0xbf, 0x91, 0xda, 0x44, 0xa7, 0x18, 0x72, 0x43, 0xa0, 0xbb, 0x49, 0x51, 0x48, 0x03, - 0xa4, 0xb8, 0xf0, 0xab, 0xbe, 0xe2, 0x64, 0x96, 0xdf, 0x37, 0xbb, 0xbd, 0x45, 0x37, 0x8f, 0x4b, - 0x9a, 0xb2, 0xad, 0x49, 0x32, 0xfb, 0x86, 0x64, 0x65, 0x37, 0xe9, 0x0a, 0x38, 0xd7, 0x80, 0xcf, - 0x2c, 0x70, 0x56, 0x81, 0xd2, 0x9f, 0x65, 0x7e, 0x7d, 0xc8, 0xc2, 0x06, 0xff, 0xa7, 0x86, 0x51, - 0x56, 0x9b, 0xb0, 0xf8, 0x47, 0x0d, 0xb2, 0x89, 0xc3, 0x14, 0xbc, 0xd9, 0x10, 0x95, 0xf9, 0xb9, - 0x8e, 0x45, 0xc2, 0x88, 0x7d, 0xa8, 0xe5, 0x3f, 0xdb, 0xf6, 0x54, 0x09, 0x79, 0xc1, 0x27, 0x39, - 0x81, 0xd1, 0x3e, 0xc5, 0x2b, 0xb0, 0xfe, 0xb3, 0x16, 0x38, 0x6a, 0x78, 0x0a, 0xbc, 0x0d, 0x0e, - 0x0a, 0x11, 0x63, 0x61, 0xed, 0xe9, 0x4d, 0xfd, 0x3d, 0x0e, 0xe0, 0xdb, 0x00, 0xe0, 0x05, 0x62, - 0x8c, 0x84, 0x39, 0xb8, 0xab, 0xc1, 0xb6, 0x89, 0x8c, 0x03, 0x78, 0x06, 0xda, 0x38, 0xa4, 0x84, - 0xa9, 0x1c, 0xdd, 0xd3, 0xe8, 0x41, 0x11, 0x18, 0x07, 0xf0, 0x3d, 0x70, 0x4c, 0x19, 0x55, 0x14, - 0x85, 0xe5, 0x75, 0x6d, 0x69, 0x7f, 0x3c, 0x32, 0x51, 0x73, 0xc5, 0x66, 0xe0, 0xa4, 0xda, 0x07, - 0xe3, 0xc8, 0xf6, 0x0d, 0x7d, 0xc6, 0xbc, 0xb5, 0x1b, 0x50, 0xb9, 0x7d, 0xea, 0x39, 0x75, 0x57, - 0x36, 0x8d, 0x57, 0x7e, 0x6b, 0x30, 0xa8, 0x40, 0x27, 0x26, 0x85, 0x3f, 0x19, 0x37, 0xc9, 0x7b, - 0x98, 0x93, 0xf2, 0x02, 0x7f, 0xfa, 0x6f, 0x56, 0x55, 0x0d, 0xf8, 0x21, 0x51, 0xf7, 0x75, 0xda, - 0x04, 0xe1, 0x25, 0x51, 0x0f, 0x90, 0x42, 0xe5, 0x4e, 0x1b, 0xf6, 0xc2, 0x63, 0x8a, 0x45, 0x12, - 0x7e, 0x00, 0xa0, 0x0c, 0x91, 0x5c, 0xf8, 0x01, 0xff, 0x91, 0x29, 0x1a, 0x11, 0x1f, 0xe1, 0xa5, - 0xbe, 0xad, 0xed, 0xe9, 0x89, 0x46, 0x1e, 0x18, 0xe0, 0x1e, 0x5e, 0xc2, 0x1f, 0xc0, 0x1b, 0x0d, - 0x17, 0xf5, 0x29, 0x0b, 0xc8, 0x53, 0xfb, 0x40, 0x17, 0xf8, 0xc9, 0x66, 0x47, 0x51, 0xe2, 0xba, - 0x79, 0x9a, 0xe2, 0x5e, 0xaf, 0x7b, 0xf6, 0x38, 0x27, 0xed, 0x3f, 0x01, 0x9d, 0xd5, 0x76, 0xb8, - 0xc5, 0xb3, 0xd6, 0x01, 0xfb, 0x66, 0xac, 0xbb, 0x1a, 0x37, 0x5f, 0xa3, 0x8b, 0xe7, 0x97, 0x3d, - 0xeb, 0xc5, 0x65, 0xcf, 0xfa, 0xf3, 0xb2, 0x67, 0xfd, 0x76, 0xd5, 0xdb, 0x79, 0x71, 0xd5, 0xdb, - 0xf9, 0xe3, 0xaa, 0xb7, 0xf3, 0xe4, 0xee, 0x9c, 0xaa, 0x45, 0x32, 0x73, 0x30, 0x8f, 0x5c, 0xcc, - 0x65, 0xc4, 0xa5, 0xfb, 0xaa, 0xab, 0x0f, 0xab, 0x67, 0xfa, 0x69, 0xf3, 0x0f, 0x81, 0xca, 0x62, - 0x22, 0x67, 0xfb, 0xfa, 0x19, 0xfe, 0xf8, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9c, 0x19, 0x84, - 0x4a, 0xd5, 0x08, 0x00, 0x00, + 0x48, 0x91, 0x00, 0x1b, 0x07, 0x2e, 0xf8, 0xeb, 0x45, 0xd3, 0x4a, 0x10, 0x21, 0x44, 0x94, 0xfe, + 0x20, 0x95, 0x0b, 0x6b, 0x32, 0x1e, 0x25, 0x43, 0xec, 0x19, 0x6b, 0x66, 0x6c, 0x6a, 0x21, 0x24, + 0x2a, 0x5e, 0x80, 0xb7, 0xa2, 0x97, 0xbd, 0xe4, 0xaa, 0x42, 0xbb, 0x6f, 0xc0, 0x13, 0x20, 0x8f, + 0xc7, 0xae, 0xbd, 0x24, 0x90, 0xf4, 0x2e, 0x3e, 0xdf, 0x9c, 0xef, 0x3b, 0x67, 0xce, 0xcc, 0x37, + 0x01, 0x1e, 0x65, 0x8a, 0x08, 0xbc, 0x40, 0x94, 0xf9, 0x92, 0xe0, 0x44, 0x50, 0x95, 0xb9, 0x18, + 0xa7, 0x6e, 0x2c, 0x78, 0x4a, 0x03, 0x22, 0xdc, 0xd4, 0x73, 0xe7, 0x84, 0x11, 0x49, 0xa5, 0x13, + 0x0b, 0xae, 0x38, 0x7c, 0x67, 0x45, 0x8a, 0x83, 0x71, 0xea, 0x94, 0x29, 0x4e, 0xea, 0x75, 0x4f, + 0xe7, 0x7c, 0xce, 0xf5, 0x7a, 0x37, 0xff, 0x55, 0xa4, 0x76, 0xdf, 0x5d, 0xa7, 0x96, 0x7a, 0xae, + 0x61, 0x50, 0xbc, 0x3b, 0xdc, 0xa4, 0xa6, 0x4a, 0xec, 0x7f, 0x72, 0x30, 0x67, 0x32, 0x89, 0x8a, + 0x9c, 0xf2, 0xb7, 0xc9, 0xf1, 0x36, 0xc9, 0x69, 0xf4, 0xde, 0x7d, 0x4b, 0x11, 0x16, 0x10, 0x11, + 0x51, 0xa6, 0x5c, 0x2c, 0xb2, 0x58, 0x71, 0x77, 0x49, 0x32, 0x83, 0xf6, 0xff, 0x68, 0x83, 0x1b, + 0x5f, 0x15, 0xeb, 0xef, 0x2b, 0xa4, 0x08, 0x1c, 0x80, 0x93, 0x14, 0x85, 0x92, 0x28, 0x3f, 0x89, + 0x03, 0xa4, 0x88, 0x4f, 0x03, 0xdb, 0x3a, 0xb7, 0x06, 0xad, 0xe9, 0x71, 0x11, 0x7f, 0xa8, 0xc3, + 0xe3, 0x00, 0xfe, 0x0c, 0x5e, 0x2b, 0x55, 0x7d, 0x99, 0xe7, 0x4a, 0x7b, 0xf7, 0x7c, 0x6f, 0x70, + 0x38, 0x1c, 0x3a, 0x1b, 0x6c, 0xb7, 0x73, 0xd7, 0xe4, 0x6a, 0xd9, 0x51, 0xef, 0xd9, 0x8b, 0x5b, + 0x3b, 0x7f, 0xbf, 0xb8, 0xd5, 0xc9, 0x50, 0x14, 0x7e, 0xde, 0xbf, 0x42, 0xdc, 0x9f, 0x1e, 0xe3, + 0xfa, 0x72, 0x09, 0x7f, 0x00, 0x47, 0x09, 0x9b, 0x71, 0x16, 0x50, 0x36, 0xf7, 0x79, 0x2c, 0xed, + 0x3d, 0x2d, 0xfd, 0xd1, 0x46, 0xd2, 0x0f, 0xcb, 0xcc, 0xef, 0xe2, 0x51, 0x2b, 0x17, 0x9e, 0xde, + 0x48, 0x5e, 0x86, 0x24, 0x44, 0xe0, 0x34, 0x42, 0x2a, 0x11, 0xc4, 0x6f, 0x6a, 0xb4, 0xce, 0xad, + 0xc1, 0xe1, 0xd0, 0x5d, 0xab, 0x91, 0x7a, 0xce, 0xb7, 0x3a, 0x2f, 0xa8, 0x29, 0xc8, 0x29, 0x2c, + 0xc8, 0xea, 0x31, 0xf8, 0x0b, 0xe8, 0x5e, 0xdd, 0x66, 0x5f, 0x71, 0x7f, 0x41, 0xe8, 0x7c, 0xa1, + 0xec, 0x6b, 0xba, 0x99, 0x2f, 0x36, 0x6a, 0xe6, 0x51, 0x63, 0x2a, 0x0f, 0xf8, 0xd7, 0x9a, 0xc2, + 0xf4, 0xd5, 0x49, 0x57, 0xa2, 0xf0, 0x37, 0x0b, 0x9c, 0x55, 0x7b, 0x8c, 0x82, 0x80, 0x2a, 0xca, + 0x99, 0x1f, 0x0b, 0x1e, 0x73, 0x89, 0x42, 0x69, 0xef, 0xeb, 0x02, 0x6e, 0x6f, 0x35, 0xc8, 0x3b, + 0x86, 0x66, 0x62, 0x58, 0x4c, 0x09, 0x37, 0xf1, 0x1a, 0x5c, 0xc2, 0x5f, 0x2d, 0xd0, 0xad, 0xaa, + 0x10, 0x24, 0xe2, 0x29, 0x0a, 0x6b, 0x45, 0x5c, 0xd7, 0x45, 0x7c, 0xb9, 0x55, 0x11, 0xd3, 0x82, + 0xe5, 0x4a, 0x0d, 0x36, 0x5e, 0x0d, 0x4b, 0x38, 0x06, 0xfb, 0x31, 0x12, 0x28, 0x92, 0xf6, 0x81, + 0x1e, 0xee, 0xfb, 0x1b, 0xa9, 0x4d, 0x74, 0x8a, 0x21, 0x37, 0x04, 0xba, 0x9b, 0x14, 0x85, 0x34, + 0x40, 0x8a, 0x0b, 0xbf, 0xea, 0x2b, 0x4e, 0x66, 0xf9, 0x7d, 0xb3, 0xdb, 0x5b, 0x74, 0xf3, 0xa8, + 0xa4, 0x29, 0xdb, 0x9a, 0x24, 0xb3, 0x6f, 0x48, 0x56, 0x76, 0x93, 0xae, 0x80, 0x73, 0x0d, 0xf8, + 0xd4, 0x02, 0x67, 0x15, 0x28, 0xfd, 0x59, 0xe6, 0xd7, 0x87, 0x2c, 0x6c, 0xf0, 0x2a, 0x35, 0x8c, + 0xb2, 0xda, 0x84, 0xc5, 0xbf, 0x6a, 0x90, 0x4d, 0x1c, 0xa6, 0xe0, 0xcd, 0x86, 0xa8, 0xcc, 0xcf, + 0x75, 0x2c, 0x12, 0x46, 0xec, 0x43, 0x2d, 0xff, 0xd9, 0xb6, 0xa7, 0x4a, 0xc8, 0x07, 0x7c, 0x92, + 0x13, 0x18, 0xed, 0x53, 0xbc, 0x02, 0xeb, 0x3f, 0x6d, 0x81, 0xa3, 0x86, 0xa7, 0xc0, 0x9b, 0xe0, + 0xa0, 0x10, 0x31, 0x16, 0xd6, 0x9e, 0x5e, 0xd7, 0xdf, 0xe3, 0x00, 0xbe, 0x0d, 0x00, 0x5e, 0x20, + 0xc6, 0x48, 0x98, 0x83, 0xbb, 0x1a, 0x6c, 0x9b, 0xc8, 0x38, 0x80, 0x67, 0xa0, 0x8d, 0x43, 0x4a, + 0x98, 0xca, 0xd1, 0x3d, 0x8d, 0x1e, 0x14, 0x81, 0x71, 0x00, 0xdf, 0x03, 0xc7, 0x94, 0x51, 0x45, + 0x51, 0x58, 0x5e, 0xd7, 0x96, 0xf6, 0xc7, 0x23, 0x13, 0x35, 0x57, 0x6c, 0x06, 0x4e, 0xaa, 0x7d, + 0x30, 0x8e, 0x6c, 0x5f, 0xd3, 0x67, 0xcc, 0x5b, 0xbb, 0x01, 0x95, 0xdb, 0xa7, 0x9e, 0x53, 0x77, + 0x65, 0xd3, 0x78, 0xe5, 0xb7, 0x06, 0x83, 0x0a, 0x74, 0x62, 0x52, 0xf8, 0x93, 0x71, 0x93, 0xbc, + 0x87, 0x39, 0x29, 0x2f, 0xf0, 0xa7, 0xff, 0x65, 0x55, 0xd5, 0x80, 0xef, 0x13, 0x75, 0x57, 0xa7, + 0x4d, 0x10, 0x5e, 0x12, 0x75, 0x0f, 0x29, 0x54, 0xee, 0xb4, 0x61, 0x2f, 0x3c, 0xa6, 0x58, 0x24, + 0xe1, 0x07, 0x00, 0xca, 0x10, 0xc9, 0x85, 0x1f, 0xf0, 0x9f, 0x98, 0xa2, 0x11, 0xf1, 0x11, 0x5e, + 0xea, 0xdb, 0xda, 0x9e, 0x9e, 0x68, 0xe4, 0x9e, 0x01, 0xee, 0xe0, 0x25, 0xfc, 0x11, 0xbc, 0xd1, + 0x70, 0x51, 0x9f, 0xb2, 0x80, 0x3c, 0xb1, 0x0f, 0x74, 0x81, 0x9f, 0x6c, 0x76, 0x14, 0x25, 0xae, + 0x9b, 0xa7, 0x29, 0xee, 0xf5, 0xba, 0x67, 0x8f, 0x73, 0xd2, 0xfe, 0x63, 0xd0, 0x59, 0x6d, 0x87, + 0x5b, 0x3c, 0x6b, 0x1d, 0xb0, 0x6f, 0xc6, 0xba, 0xab, 0x71, 0xf3, 0x35, 0xfa, 0xfe, 0xd9, 0x45, + 0xcf, 0x7a, 0x7e, 0xd1, 0xb3, 0xfe, 0xba, 0xe8, 0x59, 0xbf, 0x5f, 0xf6, 0x76, 0x9e, 0x5f, 0xf6, + 0x76, 0xfe, 0xbc, 0xec, 0xed, 0x3c, 0xbe, 0x3d, 0xa7, 0x6a, 0x91, 0xcc, 0x1c, 0xcc, 0x23, 0x17, + 0x73, 0x19, 0x71, 0xe9, 0xbe, 0xec, 0xea, 0xc3, 0xea, 0x99, 0x4e, 0x87, 0xee, 0x93, 0xe6, 0x7f, + 0x02, 0x95, 0xc5, 0x44, 0xce, 0xf6, 0xf5, 0x4b, 0xfc, 0xf1, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, + 0xae, 0x7b, 0x97, 0x91, 0xd8, 0x08, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/ccv/provider/types/provider.pb.go b/x/ccv/provider/types/provider.pb.go index edcf40dcc6..5373ee3614 100644 --- a/x/ccv/provider/types/provider.pb.go +++ b/x/ccv/provider/types/provider.pb.go @@ -1312,109 +1312,110 @@ func init() { } var fileDescriptor_f22ec409a72b7b72 = []byte{ - // 1632 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0xcd, 0x6e, 0x23, 0xc7, - 0x11, 0xd6, 0x88, 0xd4, 0x0f, 0x9b, 0xfa, 0xd9, 0x1d, 0x69, 0xbd, 0xd4, 0x46, 0xa1, 0xe8, 0x49, - 0x62, 0x28, 0x08, 0x3c, 0x84, 0x64, 0x18, 0x30, 0x84, 0x04, 0x86, 0xc4, 0xf5, 0x7a, 0x15, 0xc5, - 0x5e, 0x7a, 0xa4, 0x28, 0x48, 0x82, 0x60, 0xd0, 0xd3, 0x53, 0x4b, 0x36, 0x34, 0x33, 0x3d, 0xdb, - 0xdd, 0x33, 0xbb, 0x7c, 0x83, 0x1c, 0x0d, 0xe4, 0x62, 0x20, 0x17, 0x5f, 0x72, 0xc8, 0x29, 0xaf, - 0x61, 0x20, 0x17, 0x1f, 0x72, 0xc8, 0xc9, 0x09, 0xb4, 0x87, 0xdc, 0xf3, 0x04, 0x41, 0xf7, 0xfc, - 0x92, 0xab, 0xb5, 0x29, 0x78, 0x73, 0x9b, 0xae, 0xae, 0xfa, 0xba, 0xaa, 0xba, 0xea, 0xab, 0x26, - 0xd1, 0x21, 0x8d, 0x24, 0x70, 0x32, 0xc6, 0x34, 0x72, 0x05, 0x90, 0x84, 0x53, 0x39, 0xe9, 0x13, - 0x92, 0xf6, 0x63, 0xce, 0x52, 0xea, 0x03, 0xef, 0xa7, 0x07, 0xe5, 0xb7, 0x1d, 0x73, 0x26, 0x99, - 0xf9, 0xa3, 0x1b, 0x6c, 0x6c, 0x42, 0x52, 0xbb, 0xd4, 0x4b, 0x0f, 0x1e, 0x6c, 0x8f, 0xd8, 0x88, - 0x69, 0xfd, 0xbe, 0xfa, 0xca, 0x4c, 0x1f, 0xec, 0x8d, 0x18, 0x1b, 0x05, 0xd0, 0xd7, 0x2b, 0x2f, - 0x79, 0xda, 0x97, 0x34, 0x04, 0x21, 0x71, 0x18, 0xe7, 0x0a, 0xdd, 0x59, 0x05, 0x3f, 0xe1, 0x58, - 0x52, 0x16, 0x15, 0x00, 0xd4, 0x23, 0x7d, 0xc2, 0x38, 0xf4, 0x49, 0x40, 0x21, 0x92, 0xca, 0xbd, - 0xec, 0x2b, 0x57, 0xe8, 0x2b, 0x85, 0x80, 0x8e, 0xc6, 0x32, 0x13, 0x8b, 0xbe, 0x84, 0xc8, 0x07, - 0x1e, 0xd2, 0x4c, 0xb9, 0x5a, 0xe5, 0x06, 0xbb, 0xb5, 0x7d, 0xc2, 0x27, 0xb1, 0x64, 0xfd, 0x2b, - 0x98, 0x88, 0x7c, 0xf7, 0x1d, 0xc2, 0x44, 0xc8, 0x44, 0x1f, 0x54, 0x60, 0x11, 0x81, 0x7e, 0x7a, - 0xe0, 0x81, 0xc4, 0x07, 0xa5, 0xa0, 0xf0, 0x3b, 0xd7, 0xf3, 0xb0, 0xa8, 0x74, 0x08, 0xa3, 0xb9, - 0xdf, 0xd6, 0x9f, 0x96, 0x51, 0x67, 0xc0, 0x22, 0x91, 0x84, 0xc0, 0x8f, 0x7d, 0x9f, 0xaa, 0x90, - 0x86, 0x9c, 0xc5, 0x4c, 0xe0, 0xc0, 0xdc, 0x46, 0x4b, 0x92, 0xca, 0x00, 0x3a, 0x46, 0xcf, 0xd8, - 0x6f, 0x39, 0xd9, 0xc2, 0xec, 0xa1, 0xb6, 0x0f, 0x82, 0x70, 0x1a, 0x2b, 0xe5, 0xce, 0xa2, 0xde, - 0xab, 0x8b, 0xcc, 0x1d, 0xb4, 0x9a, 0xdd, 0x02, 0xf5, 0x3b, 0x0d, 0xbd, 0xbd, 0xa2, 0xd7, 0xa7, - 0xbe, 0xf9, 0x31, 0xda, 0xa0, 0x11, 0x95, 0x14, 0x07, 0xee, 0x18, 0x54, 0x36, 0x3a, 0xcd, 0x9e, - 0xb1, 0xdf, 0x3e, 0x7c, 0x60, 0x53, 0x8f, 0xd8, 0x2a, 0x81, 0x76, 0x9e, 0xb6, 0xf4, 0xc0, 0x7e, - 0xac, 0x35, 0x4e, 0x9a, 0x5f, 0x7d, 0xb3, 0xb7, 0xe0, 0xac, 0xe7, 0x76, 0x99, 0xd0, 0x7c, 0x1b, - 0xad, 0x8d, 0x20, 0x02, 0x41, 0x85, 0x3b, 0xc6, 0x62, 0xdc, 0x59, 0xea, 0x19, 0xfb, 0x6b, 0x4e, - 0x3b, 0x97, 0x3d, 0xc6, 0x62, 0x6c, 0xee, 0xa1, 0xb6, 0x47, 0x23, 0xcc, 0x27, 0x99, 0xc6, 0xb2, - 0xd6, 0x40, 0x99, 0x48, 0x2b, 0x0c, 0x10, 0x12, 0x31, 0x7e, 0x1e, 0xb9, 0xea, 0xb6, 0x3b, 0x2b, - 0xb9, 0x23, 0xd9, 0x4d, 0xdb, 0xc5, 0x4d, 0xdb, 0x17, 0x45, 0x29, 0x9c, 0xac, 0x2a, 0x47, 0x3e, - 0xff, 0xd7, 0x9e, 0xe1, 0xb4, 0xb4, 0x9d, 0xda, 0x31, 0x3f, 0x45, 0x77, 0x92, 0xc8, 0x63, 0x91, - 0x4f, 0xa3, 0x91, 0x1b, 0x03, 0xa7, 0xcc, 0xef, 0xac, 0x6a, 0xa8, 0x9d, 0x57, 0xa0, 0x1e, 0xe6, - 0x45, 0x93, 0x21, 0x7d, 0xa1, 0x90, 0x36, 0x4b, 0xe3, 0xa1, 0xb6, 0x35, 0x3f, 0x43, 0x26, 0x21, - 0xa9, 0x76, 0x89, 0x25, 0xb2, 0x40, 0x6c, 0xcd, 0x8f, 0x78, 0x87, 0x90, 0xf4, 0x22, 0xb3, 0xce, - 0x21, 0x7f, 0x8f, 0xee, 0x4b, 0x8e, 0x23, 0xf1, 0x14, 0xf8, 0x2c, 0x2e, 0x9a, 0x1f, 0xf7, 0x5e, - 0x81, 0x31, 0x0d, 0xfe, 0x18, 0xf5, 0x48, 0x5e, 0x40, 0x2e, 0x07, 0x9f, 0x0a, 0xc9, 0xa9, 0x97, - 0x28, 0x5b, 0xf7, 0x29, 0xc7, 0x44, 0xd7, 0x48, 0x5b, 0x17, 0x41, 0xb7, 0xd0, 0x73, 0xa6, 0xd4, - 0x1e, 0xe5, 0x5a, 0xe6, 0x13, 0xf4, 0x63, 0x2f, 0x60, 0xe4, 0x4a, 0x28, 0xe7, 0xdc, 0x29, 0x24, - 0x7d, 0x74, 0x48, 0x85, 0x50, 0x68, 0x6b, 0x3d, 0x63, 0xbf, 0xe1, 0xbc, 0x9d, 0xe9, 0x0e, 0x81, - 0x3f, 0xac, 0x69, 0x5e, 0xd4, 0x14, 0xcd, 0x77, 0x91, 0x39, 0xa6, 0x42, 0x32, 0x4e, 0x09, 0x0e, - 0x5c, 0x88, 0x24, 0xa7, 0x20, 0x3a, 0xeb, 0xda, 0xfc, 0x6e, 0xb5, 0xf3, 0x51, 0xb6, 0x71, 0xb4, - 0xfa, 0xc7, 0x2f, 0xf7, 0x16, 0xbe, 0xf8, 0x72, 0x6f, 0xc1, 0xfa, 0x9b, 0x81, 0xee, 0x0f, 0x4a, - 0x67, 0x43, 0x96, 0xe2, 0xe0, 0xff, 0xd9, 0x14, 0xc7, 0xa8, 0x25, 0x24, 0x8b, 0xb3, 0x32, 0x6c, - 0xde, 0xa2, 0x0c, 0x57, 0x95, 0x99, 0xda, 0xb0, 0xfe, 0x6c, 0xa0, 0xed, 0x8f, 0x9e, 0x25, 0x34, - 0x65, 0x04, 0xbf, 0x91, 0x1e, 0x3e, 0x43, 0xeb, 0x50, 0xc3, 0x13, 0x9d, 0x46, 0xaf, 0xb1, 0xdf, - 0x3e, 0xfc, 0x89, 0x9d, 0x11, 0x8a, 0x5d, 0xf2, 0x4c, 0x4e, 0x2a, 0x76, 0xfd, 0x74, 0x67, 0xda, - 0xd6, 0xfa, 0xcb, 0x22, 0xba, 0xf3, 0x71, 0xc0, 0x3c, 0x1c, 0x9c, 0x07, 0x58, 0x8c, 0x55, 0xc2, - 0x27, 0x2a, 0x6a, 0x0e, 0x79, 0xa5, 0x6b, 0xef, 0xe6, 0x8e, 0x5a, 0x99, 0xe9, 0xde, 0xfb, 0x10, - 0xdd, 0x2d, 0x6b, 0xaf, 0x4c, 0xae, 0x0e, 0xe6, 0x64, 0xeb, 0xfa, 0x9b, 0xbd, 0xcd, 0xe2, 0x0e, - 0x07, 0x3a, 0xd1, 0x0f, 0x9d, 0x4d, 0x32, 0x25, 0xf0, 0xcd, 0x2e, 0x6a, 0x53, 0x8f, 0xb8, 0x02, - 0x9e, 0xb9, 0x51, 0x12, 0xea, 0x7b, 0x69, 0x3a, 0x2d, 0xea, 0x91, 0x73, 0x78, 0xf6, 0x69, 0x12, - 0x9a, 0x21, 0x7a, 0xab, 0x18, 0x1e, 0x6e, 0x8a, 0x03, 0x57, 0xd9, 0xbb, 0xd8, 0xf7, 0x79, 0x7e, - 0x4d, 0x1f, 0xd8, 0x73, 0xcc, 0x1c, 0x7b, 0x98, 0x7f, 0x2b, 0x77, 0x8e, 0x7d, 0x9f, 0x83, 0x10, - 0xce, 0x56, 0xa1, 0x70, 0x89, 0x83, 0x42, 0x6e, 0xfd, 0x67, 0x09, 0x2d, 0x0f, 0x31, 0xc7, 0xa1, - 0x30, 0x2f, 0xd0, 0xa6, 0x84, 0x30, 0x0e, 0xb0, 0x04, 0x37, 0x63, 0xc4, 0x3c, 0x47, 0x3f, 0xd3, - 0x4c, 0x59, 0x9f, 0x24, 0x76, 0x6d, 0x76, 0xa4, 0x07, 0xf6, 0x40, 0x4b, 0xcf, 0x25, 0x96, 0xe0, - 0x6c, 0x14, 0x18, 0x99, 0xd0, 0xfc, 0x00, 0x75, 0x24, 0x4f, 0x84, 0xac, 0xb8, 0xaa, 0x6a, 0xd2, - 0xac, 0x08, 0xde, 0x2a, 0xf6, 0xb3, 0xf6, 0x2e, 0x9b, 0xf3, 0x66, 0x5a, 0x6a, 0x7c, 0x1f, 0x5a, - 0x3a, 0x47, 0x5b, 0x8a, 0xd3, 0x67, 0x31, 0x9b, 0xf3, 0x63, 0xde, 0x55, 0xf6, 0xd3, 0xa0, 0x9f, - 0x21, 0x33, 0x15, 0x64, 0x16, 0x73, 0xe9, 0x16, 0x7e, 0xa6, 0x82, 0x4c, 0x43, 0xfa, 0x68, 0x57, - 0xa8, 0xb2, 0x75, 0x43, 0x90, 0x9a, 0xe4, 0xe2, 0x00, 0x22, 0x2a, 0xc6, 0x05, 0xf8, 0xf2, 0xfc, - 0xe0, 0x3b, 0x1a, 0xe8, 0x13, 0x85, 0xe3, 0x14, 0x30, 0xf9, 0x29, 0x03, 0xd4, 0xbd, 0xf9, 0x94, - 0xf2, 0x82, 0x56, 0xf4, 0x05, 0xfd, 0xe0, 0x06, 0x88, 0xf2, 0x96, 0x0e, 0xd1, 0xbd, 0x10, 0xbf, - 0x70, 0xe5, 0x98, 0x33, 0x29, 0x03, 0xf0, 0xdd, 0x18, 0x93, 0x2b, 0x90, 0x42, 0x4f, 0xa4, 0x86, - 0xb3, 0x15, 0xe2, 0x17, 0x17, 0xc5, 0xde, 0x30, 0xdb, 0x32, 0x05, 0x7a, 0xa7, 0x46, 0xe0, 0xcf, - 0x31, 0xf7, 0x5d, 0x1f, 0x22, 0x16, 0xba, 0x1c, 0x46, 0x8a, 0x59, 0x71, 0xc6, 0xe5, 0x00, 0xe5, - 0x10, 0xca, 0x29, 0x40, 0xbd, 0x29, 0xca, 0xf6, 0x1f, 0x30, 0x1a, 0xe5, 0x93, 0xda, 0xaa, 0x78, - 0x5e, 0xa1, 0x3d, 0x54, 0x60, 0x4e, 0x0d, 0xeb, 0x11, 0x80, 0xe5, 0xa1, 0xbb, 0x8f, 0x71, 0xe4, - 0x8b, 0x31, 0xbe, 0x82, 0x4f, 0x40, 0x62, 0x1f, 0x4b, 0x6c, 0xbe, 0x57, 0xeb, 0xb6, 0xa7, 0x00, - 0x6e, 0xcc, 0x58, 0x90, 0x75, 0x5b, 0x46, 0x5e, 0x65, 0xcf, 0x3c, 0x02, 0x18, 0x32, 0x16, 0xa8, - 0x9e, 0x31, 0x3b, 0x68, 0x25, 0x05, 0x2e, 0xaa, 0x0a, 0x2e, 0x96, 0xd6, 0x4f, 0x51, 0x4b, 0xd3, - 0xcd, 0x31, 0xb9, 0x12, 0xe6, 0x2e, 0x6a, 0xe1, 0xac, 0xf5, 0x40, 0x74, 0x8c, 0x5e, 0x63, 0xbf, - 0xe5, 0x54, 0x02, 0x4b, 0xa2, 0x9d, 0xd7, 0xbd, 0x82, 0x84, 0xf9, 0x1b, 0xb4, 0x12, 0x83, 0x1e, - 0xd1, 0xda, 0xb0, 0x7d, 0xf8, 0x8b, 0xb9, 0xba, 0xfe, 0x75, 0x80, 0x4e, 0x81, 0x66, 0xf1, 0xea, - 0xed, 0x35, 0x33, 0x65, 0x84, 0x79, 0x39, 0x7b, 0xe8, 0xcf, 0x6f, 0x75, 0xe8, 0x0c, 0x5e, 0x75, - 0xe6, 0x2f, 0xd1, 0xc6, 0x60, 0x8c, 0xa3, 0x08, 0x82, 0x0b, 0xa6, 0x59, 0xd0, 0xfc, 0x21, 0x42, - 0x24, 0x93, 0x28, 0xf6, 0xcc, 0x32, 0xdd, 0xca, 0x25, 0xa7, 0xfe, 0xd4, 0xdc, 0x5a, 0x9c, 0x9a, - 0x5b, 0x96, 0x83, 0x36, 0x2f, 0x05, 0xf9, 0x75, 0xf1, 0x80, 0x79, 0x12, 0x0b, 0xf3, 0x1e, 0x5a, - 0x56, 0xed, 0x97, 0x03, 0x35, 0x9d, 0xa5, 0x54, 0x90, 0x53, 0xdf, 0xdc, 0xaf, 0x3f, 0x92, 0x58, - 0xec, 0x52, 0x5f, 0x74, 0x16, 0x7b, 0x8d, 0xfd, 0xa6, 0xb3, 0x91, 0x54, 0xe6, 0xa7, 0xbe, 0xb0, - 0x7e, 0x8b, 0xda, 0x35, 0x40, 0x73, 0x03, 0x2d, 0x96, 0x58, 0x8b, 0xd4, 0x37, 0x8f, 0xd0, 0x4e, - 0x05, 0x34, 0xcd, 0xfd, 0x19, 0x62, 0xcb, 0xb9, 0x5f, 0x2a, 0x4c, 0xd1, 0xbf, 0xb0, 0x9e, 0xa0, - 0xed, 0xd3, 0x8a, 0x2f, 0xca, 0xc9, 0x32, 0x15, 0xa1, 0x31, 0x3d, 0x99, 0x77, 0x51, 0xab, 0xfc, - 0x25, 0xa0, 0xa3, 0x6f, 0x3a, 0x95, 0xc0, 0x0a, 0xd1, 0x9d, 0x4b, 0x41, 0xce, 0x21, 0xf2, 0x2b, - 0xb0, 0xd7, 0x24, 0xe0, 0x64, 0x16, 0x68, 0xee, 0x97, 0x66, 0x75, 0xdc, 0xfb, 0x68, 0xab, 0x8c, - 0xa8, 0x9a, 0x24, 0xaa, 0x01, 0xf2, 0x42, 0xd6, 0x47, 0xae, 0x39, 0xc5, 0xf2, 0xa8, 0xa9, 0x1f, - 0x33, 0xef, 0xa3, 0xad, 0x1b, 0x06, 0xd0, 0x77, 0x9a, 0x85, 0xd5, 0x69, 0xb9, 0xc9, 0xaf, 0xa8, - 0x90, 0xe6, 0xe5, 0x6c, 0x1f, 0xcd, 0x3b, 0x04, 0x6f, 0x70, 0xbd, 0xde, 0x81, 0x7f, 0x37, 0x50, - 0xe7, 0x0c, 0x26, 0xc7, 0x42, 0xd0, 0x51, 0x14, 0x42, 0x24, 0x15, 0xb9, 0x61, 0x02, 0xea, 0xd3, - 0xfc, 0x03, 0x5a, 0x2f, 0x89, 0xa1, 0xe4, 0x83, 0xef, 0x33, 0x7d, 0xd7, 0x0a, 0x05, 0x4d, 0x21, - 0x47, 0x08, 0xc5, 0x1c, 0x52, 0x97, 0xb8, 0x57, 0x30, 0xc9, 0x6f, 0x67, 0xb7, 0x3e, 0x55, 0xb3, - 0xdf, 0x5f, 0xf6, 0x30, 0xf1, 0x02, 0x4a, 0xce, 0x60, 0xe2, 0xac, 0x2a, 0xfd, 0xc1, 0x19, 0x4c, - 0xd4, 0xfb, 0x2a, 0x66, 0xcf, 0x81, 0xeb, 0x51, 0xd8, 0x70, 0xb2, 0x85, 0xf5, 0x0f, 0x03, 0xdd, - 0xbf, 0xc4, 0x01, 0xf5, 0xb1, 0x64, 0xbc, 0x88, 0x7c, 0x98, 0x78, 0xca, 0xe2, 0x5b, 0xca, 0xed, - 0x95, 0x38, 0x17, 0xdf, 0x68, 0x9c, 0x1f, 0xa2, 0xb5, 0xb2, 0x65, 0x54, 0xa4, 0x8d, 0x39, 0x22, - 0x6d, 0x17, 0x16, 0x67, 0x30, 0xb1, 0xfe, 0x5b, 0x0f, 0xeb, 0x64, 0x52, 0xaf, 0x8f, 0xef, 0x08, - 0xab, 0x3c, 0xf7, 0xd6, 0x61, 0xdd, 0x54, 0x37, 0x65, 0x18, 0xfa, 0xe4, 0x57, 0xb2, 0xd6, 0x78, - 0x93, 0x59, 0xb3, 0xfe, 0x6a, 0xa0, 0xed, 0x7a, 0xa4, 0xe2, 0x82, 0x0d, 0x79, 0x12, 0xc1, 0xb7, - 0x45, 0x5c, 0xb1, 0xc0, 0x62, 0x9d, 0x05, 0x5c, 0xb4, 0x31, 0x95, 0x08, 0x71, 0x2b, 0x57, 0x6f, - 0x68, 0x47, 0x67, 0xbd, 0x9e, 0x09, 0x71, 0x72, 0xf1, 0xd5, 0x75, 0xd7, 0xf8, 0xfa, 0xba, 0x6b, - 0xfc, 0xfb, 0xba, 0x6b, 0x7c, 0xfe, 0xb2, 0xbb, 0xf0, 0xf5, 0xcb, 0xee, 0xc2, 0x3f, 0x5f, 0x76, - 0x17, 0x7e, 0x77, 0x34, 0xa2, 0x72, 0x9c, 0x78, 0x36, 0x61, 0x61, 0x3f, 0xff, 0x4f, 0xa0, 0x3a, - 0xf3, 0xdd, 0xf2, 0x2f, 0x96, 0x17, 0xd3, 0x7f, 0xb2, 0xc8, 0x49, 0x0c, 0xc2, 0x5b, 0xd6, 0x0c, - 0xf5, 0xde, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x9c, 0x76, 0xa0, 0xbe, 0x95, 0x11, 0x00, 0x00, + // 1635 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0x4f, 0x6f, 0x1b, 0xc7, + 0x15, 0xd7, 0x8a, 0xd4, 0x1f, 0x0e, 0xf5, 0xc7, 0x5e, 0xc9, 0x31, 0xe5, 0xaa, 0x14, 0xb3, 0x6d, + 0x03, 0x15, 0x45, 0x96, 0x90, 0x82, 0x00, 0x81, 0xd1, 0x20, 0x90, 0xe8, 0x38, 0x56, 0xd5, 0xc4, + 0xcc, 0x4a, 0x55, 0xd0, 0x16, 0xc5, 0x62, 0x76, 0xf6, 0x99, 0x1c, 0x68, 0x77, 0x67, 0x3d, 0x33, + 0xbb, 0x36, 0xbf, 0x41, 0x8f, 0x01, 0x7a, 0x09, 0xd0, 0x4b, 0x2e, 0x3d, 0xf4, 0xd4, 0xaf, 0x11, + 0xa0, 0x97, 0x1c, 0x7a, 0xe8, 0x29, 0x2d, 0xe4, 0x43, 0xef, 0xfd, 0x04, 0xc5, 0xcc, 0xfe, 0x25, + 0x2d, 0x27, 0x14, 0xec, 0xde, 0x76, 0xde, 0xbc, 0xf7, 0x9b, 0xf7, 0xde, 0xbc, 0xf7, 0x7b, 0x43, + 0xa2, 0x43, 0x1a, 0x49, 0xe0, 0x64, 0x8c, 0x69, 0xe4, 0x0a, 0x20, 0x09, 0xa7, 0x72, 0xd2, 0x27, + 0x24, 0xed, 0xc7, 0x9c, 0xa5, 0xd4, 0x07, 0xde, 0x4f, 0x0f, 0xca, 0x6f, 0x3b, 0xe6, 0x4c, 0x32, + 0xf3, 0x27, 0xd7, 0xd8, 0xd8, 0x84, 0xa4, 0x76, 0xa9, 0x97, 0x1e, 0xdc, 0xdb, 0x1e, 0xb1, 0x11, + 0xd3, 0xfa, 0x7d, 0xf5, 0x95, 0x99, 0xde, 0xdb, 0x1b, 0x31, 0x36, 0x0a, 0xa0, 0xaf, 0x57, 0x5e, + 0xf2, 0xa4, 0x2f, 0x69, 0x08, 0x42, 0xe2, 0x30, 0xce, 0x15, 0xba, 0xb3, 0x0a, 0x7e, 0xc2, 0xb1, + 0xa4, 0x2c, 0x2a, 0x00, 0xa8, 0x47, 0xfa, 0x84, 0x71, 0xe8, 0x93, 0x80, 0x42, 0x24, 0x95, 0x7b, + 0xd9, 0x57, 0xae, 0xd0, 0x57, 0x0a, 0x01, 0x1d, 0x8d, 0x65, 0x26, 0x16, 0x7d, 0x09, 0x91, 0x0f, + 0x3c, 0xa4, 0x99, 0x72, 0xb5, 0xca, 0x0d, 0x76, 0x6b, 0xfb, 0x84, 0x4f, 0x62, 0xc9, 0xfa, 0x97, + 0x30, 0x11, 0xf9, 0xee, 0x3b, 0x84, 0x89, 0x90, 0x89, 0x3e, 0xa8, 0xc0, 0x22, 0x02, 0xfd, 0xf4, + 0xc0, 0x03, 0x89, 0x0f, 0x4a, 0x41, 0xe1, 0x77, 0xae, 0xe7, 0x61, 0x51, 0xe9, 0x10, 0x46, 0x73, + 0xbf, 0xad, 0x3f, 0x2d, 0xa3, 0xce, 0x80, 0x45, 0x22, 0x09, 0x81, 0x1f, 0xf9, 0x3e, 0x55, 0x21, + 0x0d, 0x39, 0x8b, 0x99, 0xc0, 0x81, 0xb9, 0x8d, 0x96, 0x24, 0x95, 0x01, 0x74, 0x8c, 0x9e, 0xb1, + 0xdf, 0x72, 0xb2, 0x85, 0xd9, 0x43, 0x6d, 0x1f, 0x04, 0xe1, 0x34, 0x56, 0xca, 0x9d, 0x45, 0xbd, + 0x57, 0x17, 0x99, 0x3b, 0x68, 0x35, 0xbb, 0x05, 0xea, 0x77, 0x1a, 0x7a, 0x7b, 0x45, 0xaf, 0x4f, + 0x7c, 0xf3, 0x13, 0xb4, 0x41, 0x23, 0x2a, 0x29, 0x0e, 0xdc, 0x31, 0xa8, 0x6c, 0x74, 0x9a, 0x3d, + 0x63, 0xbf, 0x7d, 0x78, 0xcf, 0xa6, 0x1e, 0xb1, 0x55, 0x02, 0xed, 0x3c, 0x6d, 0xe9, 0x81, 0xfd, + 0x48, 0x6b, 0x1c, 0x37, 0xbf, 0xf9, 0x6e, 0x6f, 0xc1, 0x59, 0xcf, 0xed, 0x32, 0xa1, 0xf9, 0x36, + 0x5a, 0x1b, 0x41, 0x04, 0x82, 0x0a, 0x77, 0x8c, 0xc5, 0xb8, 0xb3, 0xd4, 0x33, 0xf6, 0xd7, 0x9c, + 0x76, 0x2e, 0x7b, 0x84, 0xc5, 0xd8, 0xdc, 0x43, 0x6d, 0x8f, 0x46, 0x98, 0x4f, 0x32, 0x8d, 0x65, + 0xad, 0x81, 0x32, 0x91, 0x56, 0x18, 0x20, 0x24, 0x62, 0xfc, 0x2c, 0x72, 0xd5, 0x6d, 0x77, 0x56, + 0x72, 0x47, 0xb2, 0x9b, 0xb6, 0x8b, 0x9b, 0xb6, 0xcf, 0x8b, 0x52, 0x38, 0x5e, 0x55, 0x8e, 0x7c, + 0xf9, 0xaf, 0x3d, 0xc3, 0x69, 0x69, 0x3b, 0xb5, 0x63, 0x7e, 0x86, 0x6e, 0x25, 0x91, 0xc7, 0x22, + 0x9f, 0x46, 0x23, 0x37, 0x06, 0x4e, 0x99, 0xdf, 0x59, 0xd5, 0x50, 0x3b, 0x2f, 0x41, 0x3d, 0xc8, + 0x8b, 0x26, 0x43, 0xfa, 0x4a, 0x21, 0x6d, 0x96, 0xc6, 0x43, 0x6d, 0x6b, 0x7e, 0x8e, 0x4c, 0x42, + 0x52, 0xed, 0x12, 0x4b, 0x64, 0x81, 0xd8, 0x9a, 0x1f, 0xf1, 0x16, 0x21, 0xe9, 0x79, 0x66, 0x9d, + 0x43, 0xfe, 0x1e, 0xdd, 0x95, 0x1c, 0x47, 0xe2, 0x09, 0xf0, 0x59, 0x5c, 0x34, 0x3f, 0xee, 0x9d, + 0x02, 0x63, 0x1a, 0xfc, 0x11, 0xea, 0x91, 0xbc, 0x80, 0x5c, 0x0e, 0x3e, 0x15, 0x92, 0x53, 0x2f, + 0x51, 0xb6, 0xee, 0x13, 0x8e, 0x89, 0xae, 0x91, 0xb6, 0x2e, 0x82, 0x6e, 0xa1, 0xe7, 0x4c, 0xa9, + 0x3d, 0xcc, 0xb5, 0xcc, 0xc7, 0xe8, 0xa7, 0x5e, 0xc0, 0xc8, 0xa5, 0x50, 0xce, 0xb9, 0x53, 0x48, + 0xfa, 0xe8, 0x90, 0x0a, 0xa1, 0xd0, 0xd6, 0x7a, 0xc6, 0x7e, 0xc3, 0x79, 0x3b, 0xd3, 0x1d, 0x02, + 0x7f, 0x50, 0xd3, 0x3c, 0xaf, 0x29, 0x9a, 0xef, 0x22, 0x73, 0x4c, 0x85, 0x64, 0x9c, 0x12, 0x1c, + 0xb8, 0x10, 0x49, 0x4e, 0x41, 0x74, 0xd6, 0xb5, 0xf9, 0xed, 0x6a, 0xe7, 0xe3, 0x6c, 0xe3, 0xfe, + 0xea, 0x1f, 0xbf, 0xde, 0x5b, 0xf8, 0xea, 0xeb, 0xbd, 0x05, 0xeb, 0x6f, 0x06, 0xba, 0x3b, 0x28, + 0x9d, 0x0d, 0x59, 0x8a, 0x83, 0xff, 0x67, 0x53, 0x1c, 0xa1, 0x96, 0x90, 0x2c, 0xce, 0xca, 0xb0, + 0x79, 0x83, 0x32, 0x5c, 0x55, 0x66, 0x6a, 0xc3, 0xfa, 0xb3, 0x81, 0xb6, 0x3f, 0x7e, 0x9a, 0xd0, + 0x94, 0x11, 0xfc, 0x46, 0x7a, 0xf8, 0x14, 0xad, 0x43, 0x0d, 0x4f, 0x74, 0x1a, 0xbd, 0xc6, 0x7e, + 0xfb, 0xf0, 0x67, 0x76, 0x46, 0x28, 0x76, 0xc9, 0x33, 0x39, 0xa9, 0xd8, 0xf5, 0xd3, 0x9d, 0x69, + 0x5b, 0xeb, 0x2f, 0x8b, 0xe8, 0xd6, 0x27, 0x01, 0xf3, 0x70, 0x70, 0x16, 0x60, 0x31, 0x56, 0x09, + 0x9f, 0xa8, 0xa8, 0x39, 0xe4, 0x95, 0xae, 0xbd, 0x9b, 0x3b, 0x6a, 0x65, 0xa6, 0x7b, 0xef, 0x23, + 0x74, 0xbb, 0xac, 0xbd, 0x32, 0xb9, 0x3a, 0x98, 0xe3, 0xad, 0xab, 0xef, 0xf6, 0x36, 0x8b, 0x3b, + 0x1c, 0xe8, 0x44, 0x3f, 0x70, 0x36, 0xc9, 0x94, 0xc0, 0x37, 0xbb, 0xa8, 0x4d, 0x3d, 0xe2, 0x0a, + 0x78, 0xea, 0x46, 0x49, 0xa8, 0xef, 0xa5, 0xe9, 0xb4, 0xa8, 0x47, 0xce, 0xe0, 0xe9, 0x67, 0x49, + 0x68, 0x86, 0xe8, 0xad, 0x62, 0x78, 0xb8, 0x29, 0x0e, 0x5c, 0x65, 0xef, 0x62, 0xdf, 0xe7, 0xf9, + 0x35, 0x7d, 0x60, 0xcf, 0x31, 0x73, 0xec, 0x61, 0xfe, 0xad, 0xdc, 0x39, 0xf2, 0x7d, 0x0e, 0x42, + 0x38, 0x5b, 0x85, 0xc2, 0x05, 0x0e, 0x0a, 0xb9, 0xf5, 0x9f, 0x25, 0xb4, 0x3c, 0xc4, 0x1c, 0x87, + 0xc2, 0x3c, 0x47, 0x9b, 0x12, 0xc2, 0x38, 0xc0, 0x12, 0xdc, 0x8c, 0x11, 0xf3, 0x1c, 0xfd, 0x42, + 0x33, 0x65, 0x7d, 0x92, 0xd8, 0xb5, 0xd9, 0x91, 0x1e, 0xd8, 0x03, 0x2d, 0x3d, 0x93, 0x58, 0x82, + 0xb3, 0x51, 0x60, 0x64, 0x42, 0xf3, 0x03, 0xd4, 0x91, 0x3c, 0x11, 0xb2, 0xe2, 0xaa, 0xaa, 0x49, + 0xb3, 0x22, 0x78, 0xab, 0xd8, 0xcf, 0xda, 0xbb, 0x6c, 0xce, 0xeb, 0x69, 0xa9, 0xf1, 0x3a, 0xb4, + 0x74, 0x86, 0xb6, 0x14, 0xa7, 0xcf, 0x62, 0x36, 0xe7, 0xc7, 0xbc, 0xad, 0xec, 0xa7, 0x41, 0x3f, + 0x47, 0x66, 0x2a, 0xc8, 0x2c, 0xe6, 0xd2, 0x0d, 0xfc, 0x4c, 0x05, 0x99, 0x86, 0xf4, 0xd1, 0xae, + 0x50, 0x65, 0xeb, 0x86, 0x20, 0x35, 0xc9, 0xc5, 0x01, 0x44, 0x54, 0x8c, 0x0b, 0xf0, 0xe5, 0xf9, + 0xc1, 0x77, 0x34, 0xd0, 0xa7, 0x0a, 0xc7, 0x29, 0x60, 0xf2, 0x53, 0x06, 0xa8, 0x7b, 0xfd, 0x29, + 0xe5, 0x05, 0xad, 0xe8, 0x0b, 0xfa, 0xd1, 0x35, 0x10, 0xe5, 0x2d, 0x1d, 0xa2, 0x3b, 0x21, 0x7e, + 0xee, 0xca, 0x31, 0x67, 0x52, 0x06, 0xe0, 0xbb, 0x31, 0x26, 0x97, 0x20, 0x85, 0x9e, 0x48, 0x0d, + 0x67, 0x2b, 0xc4, 0xcf, 0xcf, 0x8b, 0xbd, 0x61, 0xb6, 0x65, 0x0a, 0xf4, 0x4e, 0x8d, 0xc0, 0x9f, + 0x61, 0xee, 0xbb, 0x3e, 0x44, 0x2c, 0x74, 0x39, 0x8c, 0x14, 0xb3, 0xe2, 0x8c, 0xcb, 0x01, 0xca, + 0x21, 0x94, 0x53, 0x80, 0x7a, 0x53, 0x94, 0xed, 0x3f, 0x60, 0x34, 0xca, 0x27, 0xb5, 0x55, 0xf1, + 0xbc, 0x42, 0x7b, 0xa0, 0xc0, 0x9c, 0x1a, 0xd6, 0x43, 0x00, 0xcb, 0x43, 0xb7, 0x1f, 0xe1, 0xc8, + 0x17, 0x63, 0x7c, 0x09, 0x9f, 0x82, 0xc4, 0x3e, 0x96, 0xd8, 0x7c, 0xaf, 0xd6, 0x6d, 0x4f, 0x00, + 0xdc, 0x98, 0xb1, 0x20, 0xeb, 0xb6, 0x8c, 0xbc, 0xca, 0x9e, 0x79, 0x08, 0x30, 0x64, 0x2c, 0x50, + 0x3d, 0x63, 0x76, 0xd0, 0x4a, 0x0a, 0x5c, 0x54, 0x15, 0x5c, 0x2c, 0xad, 0x9f, 0xa3, 0x96, 0xa6, + 0x9b, 0x23, 0x72, 0x29, 0xcc, 0x5d, 0xd4, 0xc2, 0x59, 0xeb, 0x81, 0xe8, 0x18, 0xbd, 0xc6, 0x7e, + 0xcb, 0xa9, 0x04, 0x96, 0x44, 0x3b, 0xaf, 0x7a, 0x05, 0x09, 0xf3, 0x0b, 0xb4, 0x12, 0x83, 0x1e, + 0xd1, 0xda, 0xb0, 0x7d, 0xf8, 0xe1, 0x5c, 0x5d, 0xff, 0x2a, 0x40, 0xa7, 0x40, 0xb3, 0x78, 0xf5, + 0xf6, 0x9a, 0x99, 0x32, 0xc2, 0xbc, 0x98, 0x3d, 0xf4, 0x97, 0x37, 0x3a, 0x74, 0x06, 0xaf, 0x3a, + 0xf3, 0x57, 0x68, 0x63, 0x30, 0xc6, 0x51, 0x04, 0xc1, 0x39, 0xd3, 0x2c, 0x68, 0xfe, 0x18, 0x21, + 0x92, 0x49, 0x14, 0x7b, 0x66, 0x99, 0x6e, 0xe5, 0x92, 0x13, 0x7f, 0x6a, 0x6e, 0x2d, 0x4e, 0xcd, + 0x2d, 0xcb, 0x41, 0x9b, 0x17, 0x82, 0xfc, 0xa6, 0x78, 0xc0, 0x3c, 0x8e, 0x85, 0x79, 0x07, 0x2d, + 0xab, 0xf6, 0xcb, 0x81, 0x9a, 0xce, 0x52, 0x2a, 0xc8, 0x89, 0x6f, 0xee, 0xd7, 0x1f, 0x49, 0x2c, + 0x76, 0xa9, 0x2f, 0x3a, 0x8b, 0xbd, 0xc6, 0x7e, 0xd3, 0xd9, 0x48, 0x2a, 0xf3, 0x13, 0x5f, 0x58, + 0xbf, 0x45, 0xed, 0x1a, 0xa0, 0xb9, 0x81, 0x16, 0x4b, 0xac, 0x45, 0xea, 0x9b, 0xf7, 0xd1, 0x4e, + 0x05, 0x34, 0xcd, 0xfd, 0x19, 0x62, 0xcb, 0xb9, 0x5b, 0x2a, 0x4c, 0xd1, 0xbf, 0xb0, 0x1e, 0xa3, + 0xed, 0x93, 0x8a, 0x2f, 0xca, 0xc9, 0x32, 0x15, 0xa1, 0x31, 0x3d, 0x99, 0x77, 0x51, 0xab, 0xfc, + 0x25, 0xa0, 0xa3, 0x6f, 0x3a, 0x95, 0xc0, 0x0a, 0xd1, 0xad, 0x0b, 0x41, 0xce, 0x20, 0xf2, 0x2b, + 0xb0, 0x57, 0x24, 0xe0, 0x78, 0x16, 0x68, 0xee, 0x97, 0x66, 0x75, 0xdc, 0xfb, 0x68, 0xab, 0x8c, + 0xa8, 0x9a, 0x24, 0xaa, 0x01, 0xf2, 0x42, 0xd6, 0x47, 0xae, 0x39, 0xc5, 0xf2, 0x7e, 0x53, 0x3f, + 0x66, 0xde, 0x47, 0x5b, 0xd7, 0x0c, 0xa0, 0x1f, 0x34, 0x0b, 0xab, 0xd3, 0x72, 0x93, 0x5f, 0x53, + 0x21, 0xcd, 0x8b, 0xd9, 0x3e, 0x9a, 0x77, 0x08, 0x5e, 0xe3, 0x7a, 0xbd, 0x03, 0xff, 0x6e, 0xa0, + 0xce, 0x29, 0x4c, 0x8e, 0x84, 0xa0, 0xa3, 0x28, 0x84, 0x48, 0x2a, 0x72, 0xc3, 0x04, 0xd4, 0xa7, + 0xf9, 0x07, 0xb4, 0x5e, 0x12, 0x43, 0xc9, 0x07, 0xaf, 0x33, 0x7d, 0xd7, 0x0a, 0x05, 0x4d, 0x21, + 0xf7, 0x11, 0x8a, 0x39, 0xa4, 0x2e, 0x71, 0x2f, 0x61, 0x92, 0xdf, 0xce, 0x6e, 0x7d, 0xaa, 0x66, + 0xbf, 0xbf, 0xec, 0x61, 0xe2, 0x05, 0x94, 0x9c, 0xc2, 0xc4, 0x59, 0x55, 0xfa, 0x83, 0x53, 0x98, + 0xa8, 0xf7, 0x55, 0xcc, 0x9e, 0x01, 0xd7, 0xa3, 0xb0, 0xe1, 0x64, 0x0b, 0xeb, 0x1f, 0x06, 0xba, + 0x7b, 0x81, 0x03, 0xea, 0x63, 0xc9, 0x78, 0x11, 0xf9, 0x30, 0xf1, 0x94, 0xc5, 0xf7, 0x94, 0xdb, + 0x4b, 0x71, 0x2e, 0xbe, 0xd1, 0x38, 0x3f, 0x42, 0x6b, 0x65, 0xcb, 0xa8, 0x48, 0x1b, 0x73, 0x44, + 0xda, 0x2e, 0x2c, 0x4e, 0x61, 0x62, 0xfd, 0xb7, 0x1e, 0xd6, 0xf1, 0xa4, 0x5e, 0x1f, 0x3f, 0x10, + 0x56, 0x79, 0xee, 0x8d, 0xc3, 0xba, 0xae, 0x6e, 0xca, 0x30, 0xf4, 0xc9, 0x2f, 0x65, 0xad, 0xf1, + 0x26, 0xb3, 0x66, 0xfd, 0xd5, 0x40, 0xdb, 0xf5, 0x48, 0xc5, 0x39, 0x1b, 0xf2, 0x24, 0x82, 0xef, + 0x8b, 0xb8, 0x62, 0x81, 0xc5, 0x3a, 0x0b, 0xb8, 0x68, 0x63, 0x2a, 0x11, 0xe2, 0x46, 0xae, 0x5e, + 0xd3, 0x8e, 0xce, 0x7a, 0x3d, 0x13, 0xe2, 0xf8, 0x8b, 0x6f, 0xae, 0xba, 0xc6, 0xb7, 0x57, 0x5d, + 0xe3, 0xdf, 0x57, 0x5d, 0xe3, 0xcb, 0x17, 0xdd, 0x85, 0x6f, 0x5f, 0x74, 0x17, 0xfe, 0xf9, 0xa2, + 0xbb, 0xf0, 0xbb, 0x0f, 0x47, 0x54, 0x8e, 0x13, 0xcf, 0x26, 0x2c, 0xec, 0xe7, 0xff, 0x09, 0x54, + 0x67, 0xbe, 0x5b, 0xfe, 0xc5, 0x92, 0x1e, 0xf6, 0x9f, 0x4f, 0xff, 0xcf, 0x22, 0x27, 0x31, 0x08, + 0x6f, 0x59, 0x93, 0xd4, 0x7b, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xe3, 0xe8, 0xf1, 0x4f, 0x98, + 0x11, 0x00, 0x00, } func (m *ConsumerAdditionProposal) Marshal() (dAtA []byte, err error) { diff --git a/x/ccv/provider/types/query.pb.go b/x/ccv/provider/types/query.pb.go index 1ed87707de..b205b0a7ea 100644 --- a/x/ccv/provider/types/query.pb.go +++ b/x/ccv/provider/types/query.pb.go @@ -1066,90 +1066,90 @@ 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, 0x6f, 0x1b, 0xc5, - 0x1f, 0xf5, 0x3a, 0x69, 0x9a, 0x4c, 0xfa, 0xfd, 0xb6, 0x4c, 0x43, 0x71, 0x37, 0x91, 0x1d, 0xb6, - 0x08, 0xd2, 0x16, 0x76, 0x6b, 0x57, 0x48, 0x4d, 0x20, 0x75, 0xec, 0x24, 0xa4, 0x51, 0x1b, 0x35, - 0x6c, 0xa2, 0x22, 0x01, 0xea, 0x32, 0xd9, 0x1d, 0x9c, 0x15, 0xeb, 0x9d, 0xed, 0xce, 0xd8, 0x69, - 0xf8, 0x71, 0x00, 0x24, 0xe8, 0xb1, 0x12, 0xe2, 0xc6, 0xa1, 0x27, 0xfe, 0x0b, 0xee, 0xbd, 0x51, - 0xd1, 0x4b, 0x4f, 0x05, 0x25, 0x1c, 0x38, 0x22, 0xee, 0x48, 0x68, 0x67, 0x67, 0xfd, 0x23, 0x5e, - 0xdb, 0x6b, 0x37, 0x37, 0x7b, 0x76, 0x3e, 0xef, 0xf3, 0xde, 0xd3, 0x67, 0x66, 0xdf, 0x02, 0xcd, - 0x76, 0x19, 0xf6, 0xcd, 0x5d, 0x64, 0xbb, 0x06, 0xc5, 0x66, 0xcd, 0xb7, 0xd9, 0xbe, 0x66, 0x9a, - 0x75, 0xcd, 0xf3, 0x49, 0xdd, 0xb6, 0xb0, 0xaf, 0xd5, 0xf3, 0xda, 0xbd, 0x1a, 0xf6, 0xf7, 0x55, - 0xcf, 0x27, 0x8c, 0xc0, 0x0b, 0x31, 0x05, 0xaa, 0x69, 0xd6, 0xd5, 0xa8, 0x40, 0xad, 0xe7, 0xe5, - 0x99, 0x0a, 0x21, 0x15, 0x07, 0x6b, 0xc8, 0xb3, 0x35, 0xe4, 0xba, 0x84, 0x21, 0x66, 0x13, 0x97, - 0x86, 0x10, 0xf2, 0x54, 0x85, 0x54, 0x08, 0xff, 0xa9, 0x05, 0xbf, 0xc4, 0x6a, 0x4e, 0xd4, 0xf0, - 0x7f, 0x3b, 0xb5, 0x4f, 0x35, 0x66, 0x57, 0x31, 0x65, 0xa8, 0xea, 0x89, 0x0d, 0xaf, 0x75, 0xa3, - 0x5a, 0xcf, 0x6b, 0x82, 0x00, 0x23, 0x72, 0xbe, 0xdb, 0x2e, 0x93, 0xb8, 0xb4, 0x56, 0x0d, 0x05, - 0x55, 0xb0, 0x8b, 0xa9, 0x1d, 0xf1, 0x29, 0x24, 0xf1, 0xa0, 0x21, 0x8f, 0xd7, 0x28, 0xd7, 0xc0, - 0xf4, 0xfb, 0x81, 0x2b, 0xcb, 0x02, 0x75, 0x2d, 0x44, 0xd4, 0xf1, 0xbd, 0x1a, 0xa6, 0x0c, 0x9e, - 0x07, 0xe3, 0x21, 0x9e, 0x6d, 0x65, 0xa4, 0x59, 0x69, 0x6e, 0x42, 0x3f, 0xc9, 0xff, 0xaf, 0x5b, - 0xca, 0x97, 0x60, 0x26, 0xbe, 0x92, 0x7a, 0xc4, 0xa5, 0x18, 0x7e, 0x0c, 0xfe, 0x27, 0xe8, 0x19, - 0x94, 0x21, 0x86, 0x79, 0xfd, 0x64, 0x21, 0xaf, 0x76, 0x33, 0x3e, 0x12, 0xa6, 0xd6, 0xf3, 0xaa, - 0x00, 0xdb, 0x0a, 0x0a, 0xcb, 0xa3, 0x8f, 0x9f, 0xe7, 0x52, 0xfa, 0xa9, 0x4a, 0xcb, 0x9a, 0x32, - 0x03, 0xe4, 0xb6, 0xee, 0xcb, 0x01, 0x5e, 0x44, 0x5b, 0x41, 0x47, 0x54, 0x45, 0x4f, 0x05, 0xb5, - 0x32, 0x18, 0xe3, 0xfd, 0x69, 0x46, 0x9a, 0x1d, 0x99, 0x9b, 0x2c, 0x5c, 0x52, 0x13, 0x0c, 0x83, - 0xca, 0x41, 0x74, 0x51, 0xa9, 0x5c, 0x04, 0x6f, 0x74, 0xb6, 0xd8, 0x62, 0xc8, 0x67, 0x9b, 0x3e, - 0xf1, 0x08, 0x45, 0x4e, 0x83, 0xcd, 0x03, 0x09, 0xcc, 0xf5, 0xdf, 0xdb, 0xb0, 0x6d, 0xc2, 0x8b, - 0x16, 0x85, 0x65, 0xd7, 0x93, 0xd1, 0x13, 0xe0, 0x25, 0xcb, 0xb2, 0x83, 0x29, 0x6d, 0x42, 0x37, - 0x01, 0x95, 0x39, 0xf0, 0x7a, 0x1c, 0x13, 0xe2, 0x75, 0x90, 0xfe, 0x4e, 0x8a, 0x17, 0xd8, 0xb6, - 0x55, 0x70, 0xfe, 0xa8, 0x93, 0xf3, 0xe2, 0x40, 0x9c, 0x75, 0x5c, 0x25, 0x75, 0xe4, 0xc4, 0x52, - 0x2e, 0x82, 0x13, 0xbc, 0x75, 0x8f, 0x59, 0x84, 0xd3, 0x60, 0xc2, 0x74, 0x6c, 0xec, 0xb2, 0xe0, - 0x59, 0x9a, 0x3f, 0x1b, 0x0f, 0x17, 0xd6, 0x2d, 0xe5, 0x7b, 0x09, 0xbc, 0xca, 0x95, 0xdc, 0x41, - 0x8e, 0x6d, 0x21, 0x46, 0xfc, 0x16, 0xab, 0xfc, 0xfe, 0x93, 0x0e, 0x17, 0xc1, 0x99, 0x88, 0xb4, - 0x81, 0x2c, 0xcb, 0xc7, 0x94, 0x86, 0x4d, 0xca, 0xf0, 0x9f, 0xe7, 0xb9, 0xff, 0xef, 0xa3, 0xaa, - 0xb3, 0xa0, 0x88, 0x07, 0x8a, 0x7e, 0x3a, 0xda, 0x5b, 0x0a, 0x57, 0x16, 0xc6, 0x1f, 0x3c, 0xca, - 0xa5, 0xfe, 0x7a, 0x94, 0x4b, 0x29, 0xb7, 0x81, 0xd2, 0x8b, 0x88, 0x70, 0xf3, 0x22, 0x38, 0x13, - 0x1d, 0x85, 0x46, 0xbb, 0x90, 0xd1, 0x69, 0xb3, 0x65, 0x7f, 0xd0, 0xac, 0x53, 0xda, 0x66, 0x4b, - 0xf3, 0x64, 0xd2, 0x3a, 0x7a, 0xf5, 0x90, 0x76, 0xa4, 0x7f, 0x2f, 0x69, 0xed, 0x44, 0x9a, 0xd2, - 0x3a, 0x9c, 0x14, 0xd2, 0x8e, 0xb8, 0xa6, 0x4c, 0x83, 0xf3, 0x1c, 0x70, 0x7b, 0xd7, 0x27, 0x8c, - 0x39, 0x98, 0x1f, 0xfb, 0x68, 0x38, 0x7f, 0x4e, 0x8b, 0xe3, 0x7f, 0xe4, 0xa9, 0x68, 0x93, 0x03, - 0x93, 0xd4, 0x41, 0x74, 0xd7, 0xa8, 0x62, 0x86, 0x7d, 0xde, 0x61, 0x44, 0x07, 0x7c, 0x69, 0x23, - 0x58, 0x81, 0x05, 0xf0, 0x72, 0xcb, 0x06, 0x03, 0x39, 0x0e, 0xd9, 0x43, 0xae, 0x89, 0xb9, 0xf6, - 0x11, 0xfd, 0x6c, 0x73, 0x6b, 0x29, 0x7a, 0x04, 0xef, 0x82, 0x8c, 0x8b, 0xef, 0x33, 0xc3, 0xc7, - 0x9e, 0x83, 0x5d, 0x9b, 0xee, 0x1a, 0x26, 0x72, 0xad, 0x40, 0x2c, 0xce, 0x8c, 0xf0, 0x99, 0x97, - 0xd5, 0xf0, 0xea, 0x57, 0xa3, 0xab, 0x5f, 0xdd, 0x8e, 0xae, 0xfe, 0xf2, 0x78, 0x70, 0x87, 0x3d, - 0xfc, 0x3d, 0x27, 0xe9, 0xe7, 0x02, 0x14, 0x3d, 0x02, 0x59, 0x8e, 0x30, 0xe0, 0x16, 0x38, 0xe9, - 0x21, 0xf3, 0x33, 0xcc, 0x68, 0x66, 0x94, 0xdf, 0x4a, 0xf3, 0x89, 0x8e, 0x50, 0xe4, 0x80, 0xb5, - 0x15, 0x70, 0xde, 0xe4, 0x08, 0x7a, 0x84, 0xa4, 0xac, 0x88, 0x43, 0xdc, 0xd8, 0x15, 0x4d, 0x5c, - 0xb8, 0x71, 0x05, 0x31, 0x94, 0xe0, 0xaa, 0xff, 0x2d, 0xba, 0xc0, 0x7a, 0xc2, 0x08, 0xf3, 0x7b, - 0x4c, 0x1b, 0x04, 0xa3, 0xd4, 0xfe, 0x3c, 0x74, 0x79, 0x54, 0xe7, 0xbf, 0xe1, 0x1e, 0x38, 0xeb, - 0x35, 0x40, 0xd6, 0x5d, 0xca, 0x02, 0xb3, 0x69, 0x66, 0x84, 0x5b, 0x50, 0x1c, 0xcc, 0x82, 0x26, - 0x9b, 0x0f, 0x7c, 0xe4, 0x79, 0xd8, 0x17, 0xaf, 0x8e, 0xb8, 0x0e, 0xca, 0x2f, 0x12, 0x98, 0x8a, - 0x33, 0x0f, 0xde, 0x05, 0xa7, 0x2a, 0x0e, 0xd9, 0x41, 0x8e, 0x81, 0x5d, 0xe6, 0xef, 0x8b, 0x0b, - 0xed, 0xed, 0x44, 0x54, 0xd6, 0x78, 0x21, 0x47, 0x5b, 0x0d, 0x8a, 0x05, 0x81, 0xc9, 0x10, 0x90, - 0x2f, 0xc1, 0x55, 0x30, 0x6a, 0x21, 0x86, 0xb8, 0x0b, 0x93, 0x85, 0xcb, 0x5d, 0x71, 0xeb, 0x79, - 0xb5, 0x85, 0x56, 0x40, 0x5e, 0xa0, 0xf1, 0x72, 0xe5, 0x99, 0x04, 0xe4, 0xee, 0xca, 0xe1, 0x26, - 0x38, 0x15, 0x8e, 0x78, 0xa8, 0x5d, 0xa8, 0x18, 0xa4, 0xdb, 0x8d, 0x94, 0x1e, 0x1e, 0x23, 0xe1, - 0xcb, 0x27, 0x00, 0xd6, 0xa9, 0x69, 0x54, 0x11, 0xab, 0xf9, 0xd8, 0x8a, 0x70, 0x43, 0x15, 0x57, - 0x7a, 0xe1, 0xde, 0xd9, 0x5a, 0xde, 0x08, 0x8b, 0xda, 0xc0, 0xcf, 0xd4, 0xa9, 0xd9, 0xb6, 0x5e, - 0x1e, 0x0b, 0x9d, 0x51, 0xde, 0x04, 0x97, 0xf8, 0xb8, 0xe9, 0xb8, 0x62, 0x53, 0x86, 0xfd, 0xe6, - 0xbc, 0xe9, 0x78, 0x0f, 0xf9, 0xd6, 0x0a, 0x76, 0x49, 0xb5, 0xf1, 0xa6, 0x5a, 0x05, 0x97, 0x13, - 0xed, 0x16, 0xf3, 0x79, 0x0e, 0x8c, 0x59, 0x7c, 0x85, 0xbf, 0xfc, 0x27, 0x74, 0xf1, 0xaf, 0xf0, - 0xd3, 0x4b, 0xe0, 0x04, 0xc7, 0x81, 0x07, 0x12, 0x98, 0x8a, 0x8b, 0x36, 0x70, 0x29, 0xd1, 0x0c, - 0xf4, 0xc8, 0x53, 0x72, 0xe9, 0x05, 0x10, 0x42, 0xfe, 0xca, 0xea, 0x37, 0x4f, 0xff, 0xfc, 0x21, - 0x5d, 0x84, 0x8b, 0xfd, 0x23, 0x6f, 0xe3, 0x6a, 0x17, 0xd1, 0x49, 0xfb, 0x22, 0x3a, 0x99, 0x5f, - 0xc1, 0xa7, 0x12, 0x38, 0x1b, 0x93, 0x91, 0x60, 0x71, 0x70, 0x86, 0x6d, 0xd9, 0x4b, 0x5e, 0x1a, - 0x1e, 0x40, 0x28, 0x9c, 0xe7, 0x0a, 0xaf, 0xc2, 0xfc, 0x00, 0x0a, 0xc3, 0x54, 0x06, 0xbf, 0x4e, - 0x83, 0x4c, 0x97, 0xa8, 0x45, 0xe1, 0xad, 0x21, 0x99, 0xc5, 0xa6, 0x3a, 0x79, 0xe3, 0x98, 0xd0, - 0x84, 0xe8, 0x1b, 0x5c, 0x74, 0x19, 0x2e, 0x0d, 0x2a, 0x3a, 0x48, 0xd7, 0x3e, 0x33, 0x1a, 0x81, - 0x09, 0xfe, 0x2b, 0x81, 0x57, 0xe2, 0x93, 0x1b, 0x85, 0x37, 0x87, 0x26, 0xdd, 0x19, 0x11, 0xe5, - 0x5b, 0xc7, 0x03, 0x26, 0x0c, 0x58, 0xe3, 0x06, 0x94, 0x60, 0x71, 0x08, 0x03, 0x88, 0xd7, 0xa2, - 0xff, 0x6f, 0x49, 0x84, 0x83, 0xd8, 0x98, 0x05, 0xdf, 0x4b, 0xce, 0xba, 0x57, 0x60, 0x94, 0xd7, - 0x5e, 0x18, 0x47, 0x08, 0x2f, 0x71, 0xe1, 0xef, 0xc0, 0xf9, 0x04, 0xdf, 0xb0, 0x11, 0x90, 0xd1, - 0x96, 0xda, 0x62, 0x24, 0xb7, 0xc6, 0xaf, 0xa1, 0x24, 0xc7, 0x04, 0xc9, 0xa1, 0x24, 0xc7, 0xe5, - 0xc0, 0xe1, 0x24, 0xb7, 0x25, 0x47, 0xf8, 0xab, 0x04, 0x60, 0x67, 0x04, 0x84, 0xd7, 0x93, 0x53, - 0x8c, 0x4b, 0x96, 0x72, 0x71, 0xe8, 0x7a, 0x21, 0xed, 0x1a, 0x97, 0x56, 0x80, 0x57, 0xfa, 0x4b, - 0x63, 0x02, 0x20, 0xfc, 0x3e, 0x86, 0xdf, 0xa6, 0xc1, 0x6c, 0xbf, 0x94, 0x35, 0xc8, 0x1d, 0xd6, - 0x3f, 0xf3, 0x0d, 0x72, 0x87, 0x25, 0x88, 0x7e, 0x4a, 0x99, 0x6b, 0x7f, 0x17, 0x2e, 0xf4, 0xd7, - 0xee, 0x61, 0xd7, 0xb2, 0xdd, 0x4a, 0x73, 0x8e, 0x45, 0x62, 0x85, 0x3f, 0xa6, 0xc1, 0x85, 0x04, - 0xaf, 0x73, 0x78, 0x3b, 0x39, 0xf5, 0x44, 0x31, 0x42, 0xde, 0x3c, 0x3e, 0x40, 0x61, 0xc7, 0x4d, - 0x6e, 0xc7, 0x2a, 0x5c, 0xee, 0x6f, 0x87, 0xdf, 0x40, 0x6c, 0x3a, 0xe2, 0x73, 0x4c, 0x23, 0x8c, - 0x27, 0xe5, 0xed, 0xc7, 0x07, 0x59, 0xe9, 0xc9, 0x41, 0x56, 0xfa, 0xe3, 0x20, 0x2b, 0x3d, 0x3c, - 0xcc, 0xa6, 0x9e, 0x1c, 0x66, 0x53, 0xcf, 0x0e, 0xb3, 0xa9, 0x0f, 0x17, 0x2a, 0x36, 0xdb, 0xad, - 0xed, 0xa8, 0x26, 0xa9, 0x6a, 0x26, 0xa1, 0x55, 0x42, 0x5b, 0xfa, 0xbd, 0xd5, 0xe8, 0x77, 0xff, - 0xc8, 0xf0, 0xed, 0x7b, 0x98, 0xee, 0x8c, 0xf1, 0x4f, 0x95, 0xab, 0xff, 0x05, 0x00, 0x00, 0xff, - 0xff, 0x99, 0xe0, 0xf2, 0x45, 0x3f, 0x13, 0x00, 0x00, + // 1322 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xcf, 0x6f, 0xdc, 0x44, + 0x18, 0x5d, 0x6f, 0xd2, 0x34, 0x99, 0x14, 0x5a, 0xa6, 0xa5, 0x6c, 0xdd, 0x6a, 0xb7, 0xb8, 0x08, + 0xd2, 0x16, 0xec, 0xee, 0x56, 0x48, 0x4d, 0x20, 0xdd, 0xec, 0x26, 0x21, 0x8d, 0xda, 0xa8, 0xc1, + 0xa9, 0x5a, 0x09, 0x50, 0xcd, 0xc4, 0x1e, 0x36, 0x16, 0x5e, 0x8f, 0xeb, 0x99, 0x75, 0x1a, 0x7e, + 0x1c, 0x00, 0x09, 0x7a, 0xac, 0x84, 0xb8, 0x71, 0xe8, 0x89, 0xff, 0x82, 0x7b, 0x6f, 0x54, 0xf4, + 0xd2, 0x53, 0x41, 0x09, 0x07, 0x8e, 0x88, 0x3b, 0x12, 0xf2, 0x78, 0xbc, 0x3f, 0xb2, 0xde, 0x5d, + 0xef, 0x36, 0xb7, 0xdd, 0xf1, 0x7c, 0xef, 0x7b, 0xef, 0xe9, 0x9b, 0xf1, 0x33, 0xd0, 0x6c, 0x97, + 0x61, 0xdf, 0xdc, 0x42, 0xb6, 0x6b, 0x50, 0x6c, 0x36, 0x7c, 0x9b, 0xed, 0x68, 0xa6, 0x19, 0x68, + 0x9e, 0x4f, 0x02, 0xdb, 0xc2, 0xbe, 0x16, 0x14, 0xb5, 0x7b, 0x0d, 0xec, 0xef, 0xa8, 0x9e, 0x4f, + 0x18, 0x81, 0xe7, 0x12, 0x0a, 0x54, 0xd3, 0x0c, 0xd4, 0xb8, 0x40, 0x0d, 0x8a, 0xf2, 0x99, 0x1a, + 0x21, 0x35, 0x07, 0x6b, 0xc8, 0xb3, 0x35, 0xe4, 0xba, 0x84, 0x21, 0x66, 0x13, 0x97, 0x46, 0x10, + 0xf2, 0x89, 0x1a, 0xa9, 0x11, 0xfe, 0x53, 0x0b, 0x7f, 0x89, 0xd5, 0x82, 0xa8, 0xe1, 0xff, 0x36, + 0x1b, 0x9f, 0x69, 0xcc, 0xae, 0x63, 0xca, 0x50, 0xdd, 0x13, 0x1b, 0xde, 0xe8, 0x45, 0x35, 0x28, + 0x6a, 0x82, 0x00, 0x23, 0x72, 0xb1, 0xd7, 0x2e, 0x93, 0xb8, 0xb4, 0x51, 0x8f, 0x04, 0xd5, 0xb0, + 0x8b, 0xa9, 0x1d, 0xf3, 0x29, 0xa5, 0xf1, 0xa0, 0x29, 0x8f, 0xd7, 0x28, 0x57, 0xc0, 0xe9, 0x0f, + 0x43, 0x57, 0x16, 0x05, 0xea, 0x4a, 0x84, 0xa8, 0xe3, 0x7b, 0x0d, 0x4c, 0x19, 0x3c, 0x05, 0x26, + 0x23, 0x3c, 0xdb, 0xca, 0x49, 0x67, 0xa5, 0x99, 0x29, 0xfd, 0x30, 0xff, 0xbf, 0x6a, 0x29, 0x5f, + 0x81, 0x33, 0xc9, 0x95, 0xd4, 0x23, 0x2e, 0xc5, 0xf0, 0x13, 0xf0, 0x92, 0xa0, 0x67, 0x50, 0x86, + 0x18, 0xe6, 0xf5, 0xd3, 0xa5, 0xa2, 0xda, 0xcb, 0xf8, 0x58, 0x98, 0x1a, 0x14, 0x55, 0x01, 0xb6, + 0x11, 0x16, 0x56, 0xc7, 0x1f, 0x3f, 0x2f, 0x64, 0xf4, 0x23, 0xb5, 0xb6, 0x35, 0xe5, 0x0c, 0x90, + 0x3b, 0xba, 0x2f, 0x86, 0x78, 0x31, 0x6d, 0x05, 0xed, 0x53, 0x15, 0x3f, 0x15, 0xd4, 0xaa, 0x60, + 0x82, 0xf7, 0xa7, 0x39, 0xe9, 0xec, 0xd8, 0xcc, 0x74, 0xe9, 0x82, 0x9a, 0x62, 0x18, 0x54, 0x0e, + 0xa2, 0x8b, 0x4a, 0xe5, 0x3c, 0x78, 0xab, 0xbb, 0xc5, 0x06, 0x43, 0x3e, 0x5b, 0xf7, 0x89, 0x47, + 0x28, 0x72, 0x9a, 0x6c, 0x1e, 0x48, 0x60, 0x66, 0xf0, 0xde, 0xa6, 0x6d, 0x53, 0x5e, 0xbc, 0x28, + 0x2c, 0xbb, 0x9a, 0x8e, 0x9e, 0x00, 0xaf, 0x58, 0x96, 0x1d, 0x4e, 0x69, 0x0b, 0xba, 0x05, 0xa8, + 0xcc, 0x80, 0x37, 0x93, 0x98, 0x10, 0xaf, 0x8b, 0xf4, 0xf7, 0x52, 0xb2, 0xc0, 0x8e, 0xad, 0x82, + 0xf3, 0xc7, 0xdd, 0x9c, 0xe7, 0x87, 0xe2, 0xac, 0xe3, 0x3a, 0x09, 0x90, 0x93, 0x48, 0xb9, 0x0c, + 0x0e, 0xf1, 0xd6, 0x7d, 0x66, 0x11, 0x9e, 0x06, 0x53, 0xa6, 0x63, 0x63, 0x97, 0x85, 0xcf, 0xb2, + 0xfc, 0xd9, 0x64, 0xb4, 0xb0, 0x6a, 0x29, 0x3f, 0x48, 0xe0, 0x75, 0xae, 0xe4, 0x36, 0x72, 0x6c, + 0x0b, 0x31, 0xe2, 0xb7, 0x59, 0xe5, 0x0f, 0x9e, 0x74, 0x38, 0x0f, 0x8e, 0xc5, 0xa4, 0x0d, 0x64, + 0x59, 0x3e, 0xa6, 0x34, 0x6a, 0x52, 0x85, 0xff, 0x3e, 0x2f, 0xbc, 0xbc, 0x83, 0xea, 0xce, 0x9c, + 0x22, 0x1e, 0x28, 0xfa, 0xd1, 0x78, 0x6f, 0x25, 0x5a, 0x99, 0x9b, 0x7c, 0xf0, 0xa8, 0x90, 0xf9, + 0xfb, 0x51, 0x21, 0xa3, 0xdc, 0x04, 0x4a, 0x3f, 0x22, 0xc2, 0xcd, 0xf3, 0xe0, 0x58, 0x7c, 0x14, + 0x9a, 0xed, 0x22, 0x46, 0x47, 0xcd, 0xb6, 0xfd, 0x61, 0xb3, 0x6e, 0x69, 0xeb, 0x6d, 0xcd, 0xd3, + 0x49, 0xeb, 0xea, 0xd5, 0x47, 0xda, 0xbe, 0xfe, 0xfd, 0xa4, 0x75, 0x12, 0x69, 0x49, 0xeb, 0x72, + 0x52, 0x48, 0xdb, 0xe7, 0x9a, 0x72, 0x1a, 0x9c, 0xe2, 0x80, 0xb7, 0xb6, 0x7c, 0xc2, 0x98, 0x83, + 0xf9, 0xb1, 0x8f, 0x87, 0xf3, 0x97, 0xac, 0x38, 0xfe, 0xfb, 0x9e, 0x8a, 0x36, 0x05, 0x30, 0x4d, + 0x1d, 0x44, 0xb7, 0x8c, 0x3a, 0x66, 0xd8, 0xe7, 0x1d, 0xc6, 0x74, 0xc0, 0x97, 0xd6, 0xc2, 0x15, + 0x58, 0x02, 0xaf, 0xb6, 0x6d, 0x30, 0x90, 0xe3, 0x90, 0x6d, 0xe4, 0x9a, 0x98, 0x6b, 0x1f, 0xd3, + 0x8f, 0xb7, 0xb6, 0x56, 0xe2, 0x47, 0xf0, 0x2e, 0xc8, 0xb9, 0xf8, 0x3e, 0x33, 0x7c, 0xec, 0x39, + 0xd8, 0xb5, 0xe9, 0x96, 0x61, 0x22, 0xd7, 0x0a, 0xc5, 0xe2, 0xdc, 0x18, 0x9f, 0x79, 0x59, 0x8d, + 0xae, 0x7e, 0x35, 0xbe, 0xfa, 0xd5, 0x5b, 0xf1, 0xd5, 0x5f, 0x9d, 0x0c, 0xef, 0xb0, 0x87, 0x7f, + 0x14, 0x24, 0xfd, 0x64, 0x88, 0xa2, 0xc7, 0x20, 0x8b, 0x31, 0x06, 0xdc, 0x00, 0x87, 0x3d, 0x64, + 0x7e, 0x8e, 0x19, 0xcd, 0x8d, 0xf3, 0x5b, 0x69, 0x36, 0xd5, 0x11, 0x8a, 0x1d, 0xb0, 0x36, 0x42, + 0xce, 0xeb, 0x1c, 0x41, 0x8f, 0x91, 0x94, 0x25, 0x71, 0x88, 0x9b, 0xbb, 0xe2, 0x89, 0x8b, 0x36, + 0x2e, 0x21, 0x86, 0x52, 0x5c, 0xf5, 0xbf, 0xc7, 0x17, 0x58, 0x5f, 0x18, 0x61, 0x7e, 0x9f, 0x69, + 0x83, 0x60, 0x9c, 0xda, 0x5f, 0x44, 0x2e, 0x8f, 0xeb, 0xfc, 0x37, 0xdc, 0x06, 0xc7, 0xbd, 0x26, + 0xc8, 0xaa, 0x4b, 0x59, 0x68, 0x36, 0xcd, 0x8d, 0x71, 0x0b, 0xca, 0xc3, 0x59, 0xd0, 0x62, 0x73, + 0xc7, 0x47, 0x9e, 0x87, 0x7d, 0xf1, 0xea, 0x48, 0xea, 0xa0, 0xfc, 0x2a, 0x81, 0x13, 0x49, 0xe6, + 0xc1, 0xbb, 0xe0, 0x48, 0xcd, 0x21, 0x9b, 0xc8, 0x31, 0xb0, 0xcb, 0xfc, 0x1d, 0x71, 0xa1, 0xbd, + 0x9b, 0x8a, 0xca, 0x0a, 0x2f, 0xe4, 0x68, 0xcb, 0x61, 0xb1, 0x20, 0x30, 0x1d, 0x01, 0xf2, 0x25, + 0xb8, 0x0c, 0xc6, 0x2d, 0xc4, 0x10, 0x77, 0x61, 0xba, 0x74, 0xb1, 0x27, 0x6e, 0x50, 0x54, 0xdb, + 0x68, 0x85, 0xe4, 0x05, 0x1a, 0x2f, 0x57, 0x9e, 0x49, 0x40, 0xee, 0xad, 0x1c, 0xae, 0x83, 0x23, + 0xd1, 0x88, 0x47, 0xda, 0x85, 0x8a, 0x61, 0xba, 0x5d, 0xcb, 0xe8, 0xd1, 0x31, 0x12, 0xbe, 0x7c, + 0x0a, 0x60, 0x40, 0x4d, 0xa3, 0x8e, 0x58, 0xc3, 0xc7, 0x56, 0x8c, 0x1b, 0xa9, 0xb8, 0xd4, 0x0f, + 0xf7, 0xf6, 0xc6, 0xe2, 0x5a, 0x54, 0xd4, 0x01, 0x7e, 0x2c, 0xa0, 0x66, 0xc7, 0x7a, 0x75, 0x22, + 0x72, 0x46, 0x79, 0x1b, 0x5c, 0xe0, 0xe3, 0xa6, 0xe3, 0x9a, 0x4d, 0x19, 0xf6, 0x5b, 0xf3, 0xa6, + 0xe3, 0x6d, 0xe4, 0x5b, 0x4b, 0xd8, 0x25, 0xf5, 0xe6, 0x9b, 0x6a, 0x19, 0x5c, 0x4c, 0xb5, 0x5b, + 0xcc, 0xe7, 0x49, 0x30, 0x61, 0xf1, 0x15, 0xfe, 0xf2, 0x9f, 0xd2, 0xc5, 0xbf, 0xd2, 0xcf, 0xaf, + 0x80, 0x43, 0x1c, 0x07, 0xee, 0x4a, 0xe0, 0x44, 0x52, 0xb4, 0x81, 0x0b, 0xa9, 0x66, 0xa0, 0x4f, + 0x9e, 0x92, 0x2b, 0x2f, 0x80, 0x10, 0xf1, 0x57, 0x96, 0xbf, 0x7d, 0xfa, 0xd7, 0x8f, 0xd9, 0x32, + 0x9c, 0x1f, 0x1c, 0x79, 0x9b, 0x57, 0xbb, 0x88, 0x4e, 0xda, 0x97, 0xf1, 0xc9, 0xfc, 0x1a, 0x3e, + 0x95, 0xc0, 0xf1, 0x84, 0x8c, 0x04, 0xcb, 0xc3, 0x33, 0xec, 0xc8, 0x5e, 0xf2, 0xc2, 0xe8, 0x00, + 0x42, 0xe1, 0x2c, 0x57, 0x78, 0x19, 0x16, 0x87, 0x50, 0x18, 0xa5, 0x32, 0xf8, 0x4d, 0x16, 0xe4, + 0x7a, 0x44, 0x2d, 0x0a, 0x6f, 0x8c, 0xc8, 0x2c, 0x31, 0xd5, 0xc9, 0x6b, 0x07, 0x84, 0x26, 0x44, + 0x5f, 0xe3, 0xa2, 0xab, 0x70, 0x61, 0x58, 0xd1, 0x61, 0xba, 0xf6, 0x99, 0xd1, 0x0c, 0x4c, 0xf0, + 0x3f, 0x09, 0xbc, 0x96, 0x9c, 0xdc, 0x28, 0xbc, 0x3e, 0x32, 0xe9, 0xee, 0x88, 0x28, 0xdf, 0x38, + 0x18, 0x30, 0x61, 0xc0, 0x0a, 0x37, 0xa0, 0x02, 0xcb, 0x23, 0x18, 0x40, 0xbc, 0x36, 0xfd, 0xff, + 0x48, 0x22, 0x1c, 0x24, 0xc6, 0x2c, 0xf8, 0x41, 0x7a, 0xd6, 0xfd, 0x02, 0xa3, 0xbc, 0xf2, 0xc2, + 0x38, 0x42, 0x78, 0x85, 0x0b, 0x7f, 0x0f, 0xce, 0xa6, 0xf8, 0x86, 0x8d, 0x81, 0x8c, 0x8e, 0xd4, + 0x96, 0x20, 0xb9, 0x3d, 0x7e, 0x8d, 0x24, 0x39, 0x21, 0x48, 0x8e, 0x24, 0x39, 0x29, 0x07, 0x8e, + 0x26, 0xb9, 0x23, 0x39, 0xc2, 0xdf, 0x24, 0x00, 0xbb, 0x23, 0x20, 0xbc, 0x9a, 0x9e, 0x62, 0x52, + 0xb2, 0x94, 0xcb, 0x23, 0xd7, 0x0b, 0x69, 0x57, 0xb8, 0xb4, 0x12, 0xbc, 0x34, 0x58, 0x1a, 0x13, + 0x00, 0xd1, 0xf7, 0x31, 0xfc, 0x2e, 0x0b, 0xce, 0x0e, 0x4a, 0x59, 0xc3, 0xdc, 0x61, 0x83, 0x33, + 0xdf, 0x30, 0x77, 0x58, 0x8a, 0xe8, 0xa7, 0x54, 0xb9, 0xf6, 0xf7, 0xe1, 0xdc, 0x60, 0xed, 0x1e, + 0x76, 0x2d, 0xdb, 0xad, 0xb5, 0xe6, 0x58, 0x24, 0x56, 0xf8, 0x53, 0x16, 0x9c, 0x4b, 0xf1, 0x3a, + 0x87, 0x37, 0xd3, 0x53, 0x4f, 0x15, 0x23, 0xe4, 0xf5, 0x83, 0x03, 0x14, 0x76, 0x5c, 0xe7, 0x76, + 0x2c, 0xc3, 0xc5, 0xc1, 0x76, 0xf8, 0x4d, 0xc4, 0x96, 0x23, 0x3e, 0xc7, 0x34, 0xa2, 0x78, 0x52, + 0xbd, 0xf3, 0x78, 0x37, 0x2f, 0x3d, 0xd9, 0xcd, 0x4b, 0x7f, 0xee, 0xe6, 0xa5, 0x87, 0x7b, 0xf9, + 0xcc, 0x93, 0xbd, 0x7c, 0xe6, 0xd9, 0x5e, 0x3e, 0xf3, 0xd1, 0x7c, 0xcd, 0x66, 0x5b, 0x8d, 0x4d, + 0xd5, 0x24, 0x75, 0xcd, 0x24, 0xb4, 0x4e, 0x68, 0x5b, 0xbf, 0x77, 0x9a, 0xfd, 0x82, 0x92, 0x76, + 0x7f, 0xdf, 0xfc, 0xed, 0x78, 0x98, 0x6e, 0x4e, 0xf0, 0xaf, 0x95, 0xcb, 0xff, 0x07, 0x00, 0x00, + 0xff, 0xff, 0xb7, 0x37, 0x44, 0xeb, 0x42, 0x13, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/ccv/provider/types/tx.pb.go b/x/ccv/provider/types/tx.pb.go index 3bc162ceb2..3603695359 100644 --- a/x/ccv/provider/types/tx.pb.go +++ b/x/ccv/provider/types/tx.pb.go @@ -203,35 +203,36 @@ func init() { } var fileDescriptor_43221a4391e9fbf4 = []byte{ - // 448 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x93, 0x3d, 0x6f, 0xd3, 0x40, - 0x18, 0xc7, 0xed, 0x56, 0x40, 0x7b, 0x14, 0x24, 0x4e, 0x19, 0xd2, 0x10, 0x39, 0x60, 0x24, 0xd4, - 0x01, 0x7c, 0x2a, 0x0c, 0x88, 0x6c, 0x69, 0x59, 0x50, 0x95, 0xc5, 0x62, 0x62, 0x20, 0x72, 0xee, - 0x8e, 0xeb, 0x89, 0xfa, 0x1e, 0xeb, 0x9e, 0x8b, 0xa9, 0xbf, 0x01, 0x23, 0x4c, 0xac, 0xfd, 0x06, - 0x7c, 0x0d, 0x24, 0x96, 0x8e, 0x4c, 0x08, 0x25, 0x0b, 0x33, 0x9f, 0x00, 0xf9, 0x8d, 0x80, 0x88, - 0xa2, 0x0a, 0x75, 0x7b, 0xde, 0xfc, 0xff, 0xff, 0x7c, 0x77, 0x0f, 0x79, 0xa0, 0x8d, 0x93, 0x96, - 0x1f, 0x27, 0xda, 0x4c, 0x50, 0xf2, 0x99, 0xd5, 0xae, 0x60, 0x9c, 0xe7, 0x2c, 0xb3, 0x90, 0x6b, - 0x21, 0x2d, 0xcb, 0xf7, 0x99, 0x3b, 0x8d, 0x32, 0x0b, 0x0e, 0xe8, 0xbd, 0x15, 0xd3, 0x11, 0xe7, - 0x79, 0xd4, 0x4e, 0x47, 0xf9, 0x7e, 0xaf, 0xaf, 0x00, 0xd4, 0x89, 0x64, 0x49, 0xa6, 0x59, 0x62, - 0x0c, 0xb8, 0xc4, 0x69, 0x30, 0x58, 0x4b, 0xf4, 0x3a, 0x0a, 0x14, 0x54, 0x21, 0x2b, 0xa3, 0xa6, - 0xba, 0xcb, 0x01, 0x53, 0xc0, 0x49, 0xdd, 0xa8, 0x93, 0xb6, 0xd5, 0xc8, 0x55, 0xd9, 0x74, 0xf6, - 0x9a, 0x25, 0xa6, 0xa8, 0x5b, 0xe1, 0x47, 0x9f, 0x74, 0xc6, 0xa8, 0x46, 0x88, 0x5a, 0x99, 0x43, - 0x30, 0x38, 0x4b, 0xa5, 0x3d, 0x92, 0x05, 0xdd, 0x25, 0x5b, 0x35, 0xa4, 0x16, 0x5d, 0xff, 0x8e, - 0xbf, 0xb7, 0x1d, 0x5f, 0xab, 0xf2, 0xe7, 0x82, 0x3e, 0x21, 0x37, 0x5a, 0xd8, 0x49, 0x22, 0x84, - 0xed, 0x6e, 0x94, 0xfd, 0x03, 0xfa, 0xf3, 0xdb, 0xe0, 0x66, 0x91, 0xa4, 0x27, 0xc3, 0xb0, 0xac, - 0x4a, 0xc4, 0x30, 0xde, 0x69, 0x07, 0x47, 0x42, 0x58, 0x7a, 0x97, 0xec, 0xf0, 0xc6, 0x62, 0xf2, - 0x46, 0x16, 0xdd, 0xcd, 0x4a, 0xf7, 0x3a, 0x5f, 0xda, 0x0e, 0xb7, 0xde, 0x9d, 0x0d, 0xbc, 0x1f, - 0x67, 0x03, 0x2f, 0x0c, 0x48, 0x7f, 0x15, 0x58, 0x2c, 0x31, 0x03, 0x83, 0x32, 0x7c, 0x45, 0x82, - 0x31, 0xaa, 0x58, 0x2a, 0x8d, 0x4e, 0xda, 0x76, 0x22, 0x96, 0x6f, 0x13, 0x2b, 0x9e, 0x49, 0x03, - 0x29, 0xed, 0x90, 0x2b, 0xa2, 0x0c, 0x1a, 0xfe, 0x3a, 0xa1, 0x7d, 0xb2, 0x2d, 0x64, 0x06, 0xa8, - 0x1d, 0x34, 0xe4, 0xf1, 0xb2, 0xf0, 0x87, 0xff, 0x1e, 0xb9, 0xbf, 0x5e, 0xbf, 0x25, 0x79, 0xf4, - 0x65, 0x83, 0x6c, 0x8e, 0x51, 0xd1, 0x0f, 0x3e, 0xb9, 0xf5, 0xef, 0x41, 0x3e, 0x8d, 0x2e, 0x70, - 0xe3, 0xd1, 0xaa, 0x5f, 0xed, 0x8d, 0xfe, 0xfb, 0xd3, 0x96, 0x8d, 0x7e, 0xf2, 0xc9, 0xed, 0x75, - 0x67, 0x74, 0x78, 0x51, 0x8b, 0x35, 0x22, 0xbd, 0xa3, 0x4b, 0x10, 0x69, 0x89, 0x0f, 0x5e, 0x7c, - 0x9e, 0x07, 0xfe, 0xf9, 0x3c, 0xf0, 0xbf, 0xcf, 0x03, 0xff, 0xfd, 0x22, 0xf0, 0xce, 0x17, 0x81, - 0xf7, 0x75, 0x11, 0x78, 0x2f, 0x87, 0x4a, 0xbb, 0xe3, 0xd9, 0x34, 0xe2, 0x90, 0x36, 0xef, 0x9b, - 0x2d, 0x7d, 0x1f, 0xfe, 0x5e, 0xbd, 0xd3, 0xbf, 0x97, 0xcf, 0x15, 0x99, 0xc4, 0xe9, 0xd5, 0xea, - 0xb9, 0x3f, 0xfe, 0x15, 0x00, 0x00, 0xff, 0xff, 0xb4, 0xbc, 0x30, 0xff, 0xad, 0x03, 0x00, 0x00, + // 453 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x93, 0x3d, 0x6b, 0x14, 0x41, + 0x18, 0xc7, 0x77, 0x13, 0xd4, 0x64, 0x8c, 0x82, 0xc3, 0x15, 0x97, 0xf3, 0xd8, 0xd3, 0x15, 0x24, + 0x85, 0xee, 0x90, 0x58, 0x88, 0x01, 0x8b, 0x4b, 0x6c, 0x24, 0x5c, 0xb3, 0x8d, 0x60, 0xe1, 0xb1, + 0x37, 0x33, 0x4e, 0x06, 0xb3, 0xf3, 0x2c, 0xf3, 0xcc, 0xad, 0xd9, 0x6f, 0x60, 0xa9, 0x95, 0x6d, + 0xbe, 0x81, 0x5f, 0x43, 0xb0, 0x49, 0x69, 0x25, 0x72, 0xd7, 0x58, 0xfb, 0x09, 0x64, 0xdf, 0x3c, + 0xc5, 0xe3, 0x08, 0x92, 0xee, 0x79, 0xdb, 0xff, 0xff, 0xb7, 0x33, 0xf3, 0x90, 0x07, 0xda, 0x38, + 0x69, 0xf9, 0x71, 0xa2, 0xcd, 0x18, 0x25, 0x9f, 0x5a, 0xed, 0x0a, 0xc6, 0x79, 0xce, 0x32, 0x0b, + 0xb9, 0x16, 0xd2, 0xb2, 0x7c, 0x97, 0xb9, 0xd3, 0x28, 0xb3, 0xe0, 0x80, 0xde, 0x5b, 0x32, 0x1d, + 0x71, 0x9e, 0x47, 0xed, 0x74, 0x94, 0xef, 0xf6, 0xfa, 0x0a, 0x40, 0x9d, 0x48, 0x96, 0x64, 0x9a, + 0x25, 0xc6, 0x80, 0x4b, 0x9c, 0x06, 0x83, 0xb5, 0x44, 0xaf, 0xa3, 0x40, 0x41, 0x15, 0xb2, 0x32, + 0x6a, 0xaa, 0xdb, 0x1c, 0x30, 0x05, 0x1c, 0xd7, 0x8d, 0x3a, 0x69, 0x5b, 0x8d, 0x5c, 0x95, 0x4d, + 0xa6, 0xaf, 0x59, 0x62, 0x8a, 0xba, 0x15, 0x7e, 0xf4, 0x49, 0x67, 0x84, 0x6a, 0x88, 0xa8, 0x95, + 0x39, 0x04, 0x83, 0xd3, 0x54, 0xda, 0x23, 0x59, 0xd0, 0x6d, 0xb2, 0x51, 0x43, 0x6a, 0xd1, 0xf5, + 0xef, 0xf8, 0x3b, 0x9b, 0xf1, 0xb5, 0x2a, 0x7f, 0x2e, 0xe8, 0x63, 0x72, 0xa3, 0x85, 0x1d, 0x27, + 0x42, 0xd8, 0xee, 0x5a, 0xd9, 0x3f, 0xa0, 0x3f, 0xbf, 0x0d, 0x6e, 0x16, 0x49, 0x7a, 0xb2, 0x1f, + 0x96, 0x55, 0x89, 0x18, 0xc6, 0x5b, 0xed, 0xe0, 0x50, 0x08, 0x4b, 0xef, 0x92, 0x2d, 0xde, 0x58, + 0x8c, 0xdf, 0xc8, 0xa2, 0xbb, 0x5e, 0xe9, 0x5e, 0xe7, 0x0b, 0xdb, 0xfd, 0x8d, 0x77, 0x67, 0x03, + 0xef, 0xc7, 0xd9, 0xc0, 0x0b, 0x03, 0xd2, 0x5f, 0x06, 0x16, 0x4b, 0xcc, 0xc0, 0xa0, 0x0c, 0x5f, + 0x91, 0x60, 0x84, 0x2a, 0x96, 0x4a, 0xa3, 0x93, 0xb6, 0x9d, 0x88, 0xe5, 0xdb, 0xc4, 0x8a, 0x67, + 0xd2, 0x40, 0x4a, 0x3b, 0xe4, 0x8a, 0x28, 0x83, 0x86, 0xbf, 0x4e, 0x68, 0x9f, 0x6c, 0x0a, 0x99, + 0x01, 0x6a, 0x07, 0x0d, 0x79, 0xbc, 0x28, 0xfc, 0xe1, 0xbf, 0x43, 0xee, 0xaf, 0xd6, 0x6f, 0x49, + 0xf6, 0xbe, 0xac, 0x91, 0xf5, 0x11, 0x2a, 0xfa, 0xc1, 0x27, 0xb7, 0xfe, 0x3d, 0xc8, 0x27, 0xd1, + 0x05, 0x6e, 0x3c, 0x5a, 0xf6, 0xab, 0xbd, 0xe1, 0x7f, 0x7f, 0xda, 0xb2, 0xd1, 0x4f, 0x3e, 0xb9, + 0xbd, 0xea, 0x8c, 0x0e, 0x2f, 0x6a, 0xb1, 0x42, 0xa4, 0x77, 0x74, 0x09, 0x22, 0x2d, 0xf1, 0xc1, + 0x8b, 0xcf, 0xb3, 0xc0, 0x3f, 0x9f, 0x05, 0xfe, 0xf7, 0x59, 0xe0, 0xbf, 0x9f, 0x07, 0xde, 0xf9, + 0x3c, 0xf0, 0xbe, 0xce, 0x03, 0xef, 0xe5, 0x53, 0xa5, 0xdd, 0xf1, 0x74, 0x12, 0x71, 0x48, 0x9b, + 0xf7, 0xcd, 0x16, 0xbe, 0x0f, 0x7f, 0xaf, 0x5e, 0xbe, 0xc7, 0x4e, 0xff, 0xde, 0x3f, 0x57, 0x64, + 0x12, 0x27, 0x57, 0xab, 0x17, 0xff, 0xe8, 0x57, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7a, 0x53, 0xb5, + 0xb8, 0xb0, 0x03, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/ccv/types/ccv.pb.go b/x/ccv/types/ccv.pb.go index 0c22465b8c..510ee2022c 100644 --- a/x/ccv/types/ccv.pb.go +++ b/x/ccv/types/ccv.pb.go @@ -481,51 +481,51 @@ func init() { } var fileDescriptor_68bd5f3242e6f29c = []byte{ - // 696 bytes of a gzipped FileDescriptorProto + // 699 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x94, 0xcf, 0x6e, 0xda, 0x4a, 0x14, 0xc6, 0xed, 0x60, 0x45, 0xca, 0x20, 0x25, 0x8e, 0x2f, 0xf7, 0x8a, 0xf8, 0xde, 0xeb, 0x58, - 0x56, 0xd4, 0xa2, 0x56, 0xb5, 0x8b, 0xb3, 0xa9, 0xda, 0x4d, 0x03, 0x21, 0x02, 0xe5, 0x1f, 0xb2, - 0x43, 0xaa, 0x76, 0x63, 0x0d, 0xf6, 0x04, 0x46, 0x80, 0x8d, 0x3c, 0x83, 0x55, 0xde, 0xa0, 0xca, - 0xaa, 0x2f, 0x90, 0x55, 0xd5, 0x07, 0xe9, 0x2e, 0xcb, 0xec, 0x9a, 0x55, 0x54, 0x25, 0x6f, 0xd0, - 0x27, 0xa8, 0x3c, 0x18, 0x42, 0xc0, 0x41, 0xca, 0x8a, 0xe1, 0xcc, 0x39, 0x1f, 0x7c, 0xbf, 0xf9, - 0x74, 0xc0, 0x16, 0xf6, 0x29, 0x0a, 0xdd, 0x36, 0xc4, 0xbe, 0x43, 0x90, 0x3b, 0x08, 0x31, 0x1d, - 0x1a, 0xae, 0x1b, 0x19, 0x51, 0x31, 0xfe, 0xd0, 0xfb, 0x61, 0x40, 0x03, 0x49, 0x4e, 0xe9, 0xd2, - 0xe3, 0xeb, 0xa8, 0x28, 0x6f, 0xb9, 0x01, 0xe9, 0x05, 0xc4, 0x20, 0x14, 0x76, 0xb0, 0xdf, 0x32, - 0xa2, 0x62, 0x13, 0x51, 0x58, 0x1c, 0x7f, 0x1f, 0x29, 0xc8, 0xb9, 0x56, 0xd0, 0x0a, 0xd8, 0xd1, - 0x88, 0x4f, 0x49, 0xf5, 0x5f, 0x8a, 0x7c, 0x0f, 0x85, 0x3d, 0xec, 0x53, 0x03, 0x36, 0x5d, 0x6c, - 0xd0, 0x61, 0x1f, 0x91, 0xd1, 0xa5, 0x76, 0xcd, 0x83, 0xff, 0x4e, 0x61, 0x17, 0x7b, 0x90, 0x06, - 0xa1, 0x8d, 0x68, 0xb9, 0x0d, 0xfd, 0x16, 0xaa, 0x43, 0xb7, 0x83, 0xe8, 0x2e, 0xa4, 0x50, 0x0a, - 0xc0, 0x7a, 0x34, 0xbe, 0x77, 0x06, 0x7d, 0x0f, 0x52, 0x44, 0xf2, 0xbc, 0x9a, 0x29, 0x64, 0x4d, - 0x55, 0xbf, 0x57, 0xd6, 0x63, 0x65, 0x7d, 0xa2, 0xd4, 0x60, 0x8d, 0x25, 0xf5, 0xf2, 0x66, 0x93, - 0xfb, 0x7d, 0xb3, 0x99, 0x1f, 0xc2, 0x5e, 0xf7, 0xad, 0x36, 0x27, 0xa4, 0x59, 0x62, 0xf4, 0x70, - 0x84, 0x48, 0x05, 0x10, 0xd7, 0x08, 0xa2, 0x49, 0x93, 0x83, 0xbd, 0xfc, 0x92, 0xca, 0x17, 0x04, - 0x6b, 0x75, 0x54, 0x1f, 0x35, 0xd6, 0x3c, 0xe9, 0x7f, 0x00, 0x48, 0x17, 0x92, 0xb6, 0x03, 0xdd, - 0x0e, 0xc9, 0x67, 0xd4, 0x4c, 0x61, 0xc5, 0x5a, 0x61, 0x95, 0x1d, 0xb7, 0x43, 0xb4, 0x00, 0x6c, - 0x3c, 0xe6, 0x8c, 0x48, 0x16, 0x10, 0xba, 0x98, 0xd0, 0xc4, 0xc9, 0x1b, 0xfd, 0x71, 0xf6, 0xfa, - 0x22, 0x3c, 0x25, 0x21, 0x76, 0x68, 0x31, 0x2d, 0xed, 0x3d, 0xc8, 0x9d, 0xda, 0xe5, 0x43, 0x48, - 0x07, 0x21, 0xf2, 0xa6, 0x10, 0xa6, 0x39, 0xe2, 0xd3, 0x1c, 0x69, 0x3f, 0x79, 0xb0, 0x66, 0xc7, - 0x06, 0xa6, 0xa6, 0x2d, 0xb0, 0x32, 0x61, 0xc4, 0xc6, 0xb2, 0xa6, 0xfc, 0x38, 0xf8, 0x52, 0x3e, - 0x41, 0x2e, 0xce, 0x20, 0xd7, 0xac, 0x7b, 0x99, 0x27, 0x30, 0xde, 0x03, 0x00, 0xfb, 0x67, 0x21, - 0x74, 0x29, 0x0e, 0xfc, 0x7c, 0x46, 0xe5, 0x0b, 0xab, 0xe6, 0x33, 0x7d, 0x94, 0x46, 0x7d, 0x9c, - 0xbe, 0x24, 0x8d, 0x7a, 0x6d, 0xd2, 0x79, 0x32, 0xec, 0x23, 0x6b, 0x6a, 0x52, 0x7b, 0x0e, 0xfe, - 0x4a, 0xc0, 0x34, 0xfc, 0x66, 0xe0, 0x7b, 0xd8, 0x6f, 0x1d, 0xf7, 0x89, 0x24, 0x82, 0x0c, 0xf6, - 0x46, 0x79, 0x12, 0xac, 0xf8, 0xa8, 0x7d, 0x5f, 0x02, 0x52, 0x39, 0xf0, 0xc9, 0xa0, 0x87, 0xc2, - 0x29, 0x0a, 0x7b, 0x40, 0x88, 0x63, 0xcb, 0x00, 0xac, 0x9a, 0xe6, 0xa2, 0xf7, 0x9a, 0x9f, 0x66, - 0xff, 0x86, 0xcd, 0x4b, 0x1f, 0xc0, 0x1a, 0x79, 0x08, 0x98, 0x19, 0xcf, 0x9a, 0x2f, 0x17, 0x49, - 0xce, 0xbc, 0x49, 0x95, 0xb3, 0x66, 0x55, 0xa4, 0x33, 0x90, 0x8b, 0x88, 0x3b, 0xf7, 0xf8, 0x0c, - 0x59, 0xd6, 0x7c, 0xbd, 0x30, 0x60, 0x29, 0xa1, 0xa9, 0x72, 0x56, 0xaa, 0x5e, 0x69, 0x19, 0x08, - 0x1e, 0xa4, 0x50, 0x6b, 0x82, 0x7f, 0xe6, 0x8d, 0x1e, 0x60, 0x42, 0xa5, 0xea, 0x83, 0x68, 0xeb, - 0x4f, 0x43, 0x35, 0x1d, 0xe8, 0x17, 0x3f, 0xf8, 0xb4, 0x1f, 0x89, 0x69, 0x4a, 0xef, 0x80, 0x5a, - 0x3e, 0x3e, 0xb2, 0x1b, 0x87, 0x15, 0xcb, 0xa9, 0xef, 0x94, 0xf7, 0x2b, 0x27, 0xce, 0xc9, 0xc7, - 0x7a, 0xc5, 0x69, 0x1c, 0xd9, 0xf5, 0x4a, 0xb9, 0xb6, 0x57, 0xab, 0xec, 0x8a, 0x9c, 0xfc, 0xf7, - 0xf9, 0x85, 0xba, 0xde, 0xf0, 0x49, 0x1f, 0xb9, 0xf8, 0x0c, 0x8f, 0x7d, 0x48, 0x06, 0x90, 0x53, - 0x87, 0xed, 0x83, 0x1d, 0xbb, 0x2a, 0xf2, 0xf2, 0xda, 0xf9, 0x85, 0x9a, 0x9d, 0x62, 0x2e, 0x6d, - 0x83, 0x8d, 0xd4, 0x81, 0x98, 0x9c, 0xb8, 0x24, 0xe7, 0xce, 0x2f, 0x54, 0xf1, 0x74, 0x86, 0x96, - 0x2c, 0x7c, 0xf9, 0xa6, 0x70, 0xa5, 0xfd, 0xcb, 0x5b, 0x85, 0xbf, 0xba, 0x55, 0xf8, 0x5f, 0xb7, - 0x0a, 0xff, 0xf5, 0x4e, 0xe1, 0xae, 0xee, 0x14, 0xee, 0xfa, 0x4e, 0xe1, 0x3e, 0x15, 0x5b, 0x98, - 0xb6, 0x07, 0x4d, 0xdd, 0x0d, 0x7a, 0x46, 0xb2, 0x5e, 0xef, 0x51, 0xbd, 0x9a, 0xec, 0xe9, 0xcf, - 0x6c, 0x53, 0xb3, 0x9d, 0xd9, 0x5c, 0x66, 0x4b, 0x73, 0xfb, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, - 0x25, 0xaf, 0xdb, 0xaa, 0xd1, 0x05, 0x00, 0x00, + 0x56, 0xd4, 0xa2, 0x56, 0xb5, 0x8b, 0xd3, 0x45, 0xd5, 0x6e, 0x1a, 0x08, 0x11, 0xa8, 0xf9, 0x83, + 0xec, 0x90, 0xaa, 0xdd, 0x58, 0x83, 0x3d, 0x81, 0x11, 0x60, 0x23, 0xcf, 0x60, 0x95, 0x37, 0xa8, + 0xb2, 0xea, 0x0b, 0x64, 0x55, 0xf5, 0x41, 0xba, 0xcb, 0x32, 0xbb, 0x66, 0x15, 0x55, 0xc9, 0x1b, + 0xf4, 0x09, 0x2a, 0x0f, 0x86, 0x10, 0x70, 0x90, 0xb2, 0x62, 0x38, 0x73, 0xce, 0x07, 0xdf, 0x6f, + 0x3e, 0x1d, 0xb0, 0x85, 0x7d, 0x8a, 0x42, 0xb7, 0x0d, 0xb1, 0xef, 0x10, 0xe4, 0x0e, 0x42, 0x4c, + 0x87, 0x86, 0xeb, 0x46, 0x46, 0x54, 0x8c, 0x3f, 0xf4, 0x7e, 0x18, 0xd0, 0x40, 0x92, 0x53, 0xba, + 0xf4, 0xf8, 0x3a, 0x2a, 0xca, 0x5b, 0x6e, 0x40, 0x7a, 0x01, 0x31, 0x08, 0x85, 0x1d, 0xec, 0xb7, + 0x8c, 0xa8, 0xd8, 0x44, 0x14, 0x16, 0xc7, 0xdf, 0x47, 0x0a, 0x72, 0xae, 0x15, 0xb4, 0x02, 0x76, + 0x34, 0xe2, 0x53, 0x52, 0xfd, 0x97, 0x22, 0xdf, 0x43, 0x61, 0x0f, 0xfb, 0xd4, 0x80, 0x4d, 0x17, + 0x1b, 0x74, 0xd8, 0x47, 0x64, 0x74, 0xa9, 0x5d, 0xf1, 0xe0, 0xbf, 0x13, 0xd8, 0xc5, 0x1e, 0xa4, + 0x41, 0x68, 0x23, 0x5a, 0x6e, 0x43, 0xbf, 0x85, 0xea, 0xd0, 0xed, 0x20, 0xba, 0x0b, 0x29, 0x94, + 0x02, 0xb0, 0x1e, 0x8d, 0xef, 0x9d, 0x41, 0xdf, 0x83, 0x14, 0x91, 0x3c, 0xaf, 0x66, 0x0a, 0x59, + 0x53, 0xd5, 0xef, 0x94, 0xf5, 0x58, 0x59, 0x9f, 0x28, 0x35, 0x58, 0x63, 0x49, 0xbd, 0xb8, 0xde, + 0xe4, 0x7e, 0x5f, 0x6f, 0xe6, 0x87, 0xb0, 0xd7, 0x7d, 0xa3, 0xcd, 0x09, 0x69, 0x96, 0x18, 0xdd, + 0x1f, 0x21, 0x52, 0x01, 0xc4, 0x35, 0x82, 0x68, 0xd2, 0xe4, 0x60, 0x2f, 0xbf, 0xa4, 0xf2, 0x05, + 0xc1, 0x5a, 0x1d, 0xd5, 0x47, 0x8d, 0x35, 0x4f, 0xfa, 0x1f, 0x00, 0xd2, 0x85, 0xa4, 0xed, 0x40, + 0xb7, 0x43, 0xf2, 0x19, 0x35, 0x53, 0x58, 0xb1, 0x56, 0x58, 0x65, 0xc7, 0xed, 0x10, 0x2d, 0x00, + 0x1b, 0x0f, 0x39, 0x23, 0x92, 0x05, 0x84, 0x2e, 0x26, 0x34, 0x71, 0xf2, 0x5a, 0x7f, 0x98, 0xbd, + 0xbe, 0x08, 0x4f, 0x49, 0x88, 0x1d, 0x5a, 0x4c, 0x4b, 0x7b, 0x07, 0x72, 0x27, 0x76, 0xf9, 0x00, + 0xd2, 0x41, 0x88, 0xbc, 0x29, 0x84, 0x69, 0x8e, 0xf8, 0x34, 0x47, 0xda, 0x4f, 0x1e, 0xac, 0xd9, + 0xb1, 0x81, 0xa9, 0x69, 0x0b, 0xac, 0x4c, 0x18, 0xb1, 0xb1, 0xac, 0x29, 0x3f, 0x0c, 0xbe, 0x94, + 0x4f, 0x90, 0x8b, 0x33, 0xc8, 0x35, 0xeb, 0x4e, 0xe6, 0x11, 0x8c, 0xf7, 0x00, 0xc0, 0xfe, 0x69, + 0x08, 0x5d, 0x8a, 0x03, 0x3f, 0x9f, 0x51, 0xf9, 0xc2, 0xaa, 0xf9, 0x44, 0x1f, 0xa5, 0x51, 0x1f, + 0xa7, 0x2f, 0x49, 0xa3, 0x5e, 0x9b, 0x74, 0x1e, 0x0f, 0xfb, 0xc8, 0x9a, 0x9a, 0xd4, 0x9e, 0x82, + 0xbf, 0x12, 0x30, 0x0d, 0xbf, 0x19, 0xf8, 0x1e, 0xf6, 0x5b, 0x47, 0x7d, 0x22, 0x89, 0x20, 0x83, + 0xbd, 0x51, 0x9e, 0x04, 0x2b, 0x3e, 0x6a, 0xdf, 0x97, 0x80, 0x54, 0x0e, 0x7c, 0x32, 0xe8, 0xa1, + 0x70, 0x8a, 0xc2, 0x1e, 0x10, 0xe2, 0xd8, 0x32, 0x00, 0xab, 0xa6, 0xb9, 0xe8, 0xbd, 0xe6, 0xa7, + 0xd9, 0xbf, 0x61, 0xf3, 0xd2, 0x07, 0xb0, 0x46, 0xee, 0x03, 0x66, 0xc6, 0xb3, 0xe6, 0xf3, 0x45, + 0x92, 0x33, 0x6f, 0x52, 0xe5, 0xac, 0x59, 0x15, 0xe9, 0x14, 0xe4, 0x22, 0xe2, 0xce, 0x3d, 0x3e, + 0x43, 0x96, 0x35, 0x5f, 0x2e, 0x0c, 0x58, 0x4a, 0x68, 0xaa, 0x9c, 0x95, 0xaa, 0x57, 0x5a, 0x06, + 0x82, 0x07, 0x29, 0xd4, 0x9a, 0xe0, 0x9f, 0x79, 0xa3, 0xfb, 0x98, 0x50, 0xa9, 0x7a, 0x2f, 0xda, + 0xfa, 0xe3, 0x50, 0x4d, 0x07, 0xfa, 0xd9, 0x0f, 0x3e, 0xed, 0x47, 0x62, 0x9a, 0xd2, 0x5b, 0xa0, + 0x96, 0x8f, 0x0e, 0xed, 0xc6, 0x41, 0xc5, 0x72, 0xea, 0x3b, 0xe5, 0xf7, 0x95, 0x63, 0xe7, 0xf8, + 0x63, 0xbd, 0xe2, 0x34, 0x0e, 0xed, 0x7a, 0xa5, 0x5c, 0xdb, 0xab, 0x55, 0x76, 0x45, 0x4e, 0xfe, + 0xfb, 0xec, 0x5c, 0x5d, 0x6f, 0xf8, 0xa4, 0x8f, 0x5c, 0x7c, 0x8a, 0xc7, 0x3e, 0x24, 0x03, 0xc8, + 0xa9, 0xc3, 0xf6, 0xfe, 0x8e, 0x5d, 0x15, 0x79, 0x79, 0xed, 0xec, 0x5c, 0xcd, 0x4e, 0x31, 0x97, + 0xb6, 0xc1, 0x46, 0xea, 0x40, 0x4c, 0x4e, 0x5c, 0x92, 0x73, 0x67, 0xe7, 0xaa, 0x78, 0x32, 0x43, + 0x4b, 0x16, 0xbe, 0x7c, 0x53, 0xb8, 0xd2, 0xe1, 0xc5, 0x8d, 0xc2, 0x5f, 0xde, 0x28, 0xfc, 0xaf, + 0x1b, 0x85, 0xff, 0x7a, 0xab, 0x70, 0x97, 0xb7, 0x0a, 0x77, 0x75, 0xab, 0x70, 0x9f, 0x5e, 0xb5, + 0x30, 0x6d, 0x0f, 0x9a, 0xba, 0x1b, 0xf4, 0x8c, 0x64, 0xbd, 0xde, 0xa1, 0x7a, 0x31, 0xd9, 0xd3, + 0x91, 0x69, 0x7c, 0x66, 0xcb, 0x9a, 0xad, 0xcd, 0xe6, 0x32, 0xdb, 0x9b, 0xdb, 0x7f, 0x02, 0x00, + 0x00, 0xff, 0xff, 0xb7, 0xf6, 0x8f, 0xaa, 0xd4, 0x05, 0x00, 0x00, } func (m *ValidatorSetChangePacketData) Marshal() (dAtA []byte, err error) { From e8868556cadfa95a6b0786bd75d7a42debabc57a Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Fri, 26 May 2023 15:09:36 -0700 Subject: [PATCH 023/108] fix: partially revert key assignment type safety PR (#980) * use bytes in place where possible * fix tests * add v2 to proto files, adjust protocgen scripts * regen proto * change protos, define custom types, fix references * Update key_assignment_test.go * Update key_assignment.go * format * Update CHANGELOG.md * nit for better diff --- CHANGELOG.md | 1 + .../ccv/provider/v1/provider.proto | 38 +- tests/integration/stop_consumer.go | 4 +- x/ccv/provider/keeper/genesis.go | 10 +- x/ccv/provider/keeper/genesis_test.go | 10 +- x/ccv/provider/keeper/hooks.go | 7 +- x/ccv/provider/keeper/key_assignment.go | 58 +- x/ccv/provider/keeper/key_assignment_test.go | 44 +- x/ccv/provider/keeper/throttle.go | 16 +- x/ccv/provider/types/key_assignment.go | 24 +- x/ccv/provider/types/provider.pb.go | 1358 ++++++----------- x/ccv/provider/types/throttle.go | 2 +- 12 files changed, 585 insertions(+), 987 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 88be04c52b..738f4a82cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ Some PRs from v2.0.0 may reappear from other releases below. This is due to the ## PRs included in v2.0.0 +* (fix) partially revert key assignment type safety PR [#980](https://github.com/cosmos/interchain-security/pull/980) * (fix) Remove panics on failure to send IBC packets [#876](https://github.com/cosmos/interchain-security/pull/876) * (fix) consumer key prefix order to avoid complex migrations [#963](https://github.com/cosmos/interchain-security/pull/963) * (fix) Prevent denom DOS [#931](https://github.com/cosmos/interchain-security/pull/931) diff --git a/proto/interchain_security/ccv/provider/v1/provider.proto b/proto/interchain_security/ccv/provider/v1/provider.proto index 9c0741bd71..743d2c9c33 100644 --- a/proto/interchain_security/ccv/provider/v1/provider.proto +++ b/proto/interchain_security/ccv/provider/v1/provider.proto @@ -105,7 +105,7 @@ message GlobalSlashEntry { // This field is used to obtain validator power in HandleThrottleQueues. // // This field is not used in the store key, but is persisted in value bytes, see QueueGlobalSlashEntry. - ProviderConsAddress provider_val_cons_addr = 4; + bytes provider_val_cons_addr = 4; } // Params defines the parameters for CCV Provider module @@ -166,6 +166,11 @@ message ConsumerRemovalProposals { repeated ConsumerRemovalProposal pending = 1; } +// AddressList contains a list of consensus addresses +message AddressList { + repeated bytes addresses = 1; +} + message ChannelToChain { string channel_id = 1; string chain_id = 2; @@ -200,29 +205,8 @@ message VscSendTimestamp { // Key assignment section // -// A validator's assigned consensus address for a consumer chain. -// Note this type is for type safety within provider code, consumer code uses normal sdk.ConsAddress, -// since there's no notion of provider vs consumer address. -message ConsumerConsAddress { - // Do not generate stringer for this type, we'll use sdk.ConsAddress.String() instead - option (gogoproto.goproto_stringer) = false; - bytes address = 1; -} - -// A validator's consensus address on the provider chain -message ProviderConsAddress { - // Do not generate stringer for this type, we'll use sdk.ConsAddress.String() instead - option (gogoproto.goproto_stringer) = false; - bytes address = 1; -} - -// ConsumerAddressList contains a list of consumer consensus addresses -message ConsumerAddressList { - repeated ConsumerConsAddress addresses = 1; -} - message KeyAssignmentReplacement { - ProviderConsAddress provider_addr = 1; + bytes provider_addr = 1; tendermint.crypto.PublicKey prev_c_key = 2; int64 power = 3; } @@ -231,7 +215,7 @@ message KeyAssignmentReplacement { // ValidatorConsumerPubKey: (chainID, providerAddr consAddr) -> consumerKey tmprotocrypto.PublicKey message ValidatorConsumerPubKey { string chain_id = 1; - ProviderConsAddress provider_addr = 2; + bytes provider_addr = 2; tendermint.crypto.PublicKey consumer_key = 3; } @@ -239,8 +223,8 @@ message ValidatorConsumerPubKey { // ValidatorByConsumerAddr: (chainID, consumerAddr consAddr) -> providerAddr consAddr message ValidatorByConsumerAddr { string chain_id = 1; - ConsumerConsAddress consumer_addr = 2; - ProviderConsAddress provider_addr = 3; + bytes consumer_addr = 2; + bytes provider_addr = 3; } // Used to serialize the ConsumerAddrsToPrune index from key assignment @@ -248,5 +232,5 @@ message ValidatorByConsumerAddr { message ConsumerAddrsToPrune { string chain_id = 1; uint64 vsc_id = 2; - ConsumerAddressList consumer_addrs = 3; + AddressList consumer_addrs = 3; } diff --git a/tests/integration/stop_consumer.go b/tests/integration/stop_consumer.go index 041b6db468..39da4eabe4 100644 --- a/tests/integration/stop_consumer.go +++ b/tests/integration/stop_consumer.go @@ -83,7 +83,7 @@ func (s *CCVTestSuite) TestStopConsumerChain() { 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{}) + 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}) @@ -94,7 +94,7 @@ func (s *CCVTestSuite) TestStopConsumerChain() { // 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{}) + 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}) diff --git a/x/ccv/provider/keeper/genesis.go b/x/ccv/provider/keeper/genesis.go index 8bae356343..89845304d8 100644 --- a/x/ccv/provider/keeper/genesis.go +++ b/x/ccv/provider/keeper/genesis.go @@ -73,16 +73,20 @@ func (k Keeper) InitGenesis(ctx sdk.Context, genState *types.GenesisState) { // Import key assignment state for _, item := range genState.ValidatorConsumerPubkeys { - k.SetValidatorConsumerPubKey(ctx, item.ChainId, *item.ProviderAddr, *item.ConsumerKey) + providerAddr := types.NewProviderConsAddress(item.ProviderAddr) + k.SetValidatorConsumerPubKey(ctx, item.ChainId, providerAddr, *item.ConsumerKey) } for _, item := range genState.ValidatorsByConsumerAddr { - k.SetValidatorByConsumerAddr(ctx, item.ChainId, *item.ConsumerAddr, *item.ProviderAddr) + consumerAddr := types.NewConsumerConsAddress(item.ConsumerAddr) + providerAddr := types.NewProviderConsAddress(item.ProviderAddr) + k.SetValidatorByConsumerAddr(ctx, item.ChainId, consumerAddr, providerAddr) } for _, item := range genState.ConsumerAddrsToPrune { for _, addr := range item.ConsumerAddrs.Addresses { - k.AppendConsumerAddrsToPrune(ctx, item.ChainId, item.VscId, *addr) + consumerAddr := types.NewConsumerConsAddress(addr) + k.AppendConsumerAddrsToPrune(ctx, item.ChainId, item.VscId, consumerAddr) } } diff --git a/x/ccv/provider/keeper/genesis_test.go b/x/ccv/provider/keeper/genesis_test.go index 66613fb2a8..40df37e999 100644 --- a/x/ccv/provider/keeper/genesis_test.go +++ b/x/ccv/provider/keeper/genesis_test.go @@ -79,22 +79,22 @@ func TestInitAndExportGenesis(t *testing.T) { []providertypes.ValidatorConsumerPubKey{ { ChainId: cChainIDs[0], - ProviderAddr: &provAddr, + ProviderAddr: provAddr.ToSdkConsAddr(), ConsumerKey: &consumerTmPubKey, }, }, []providertypes.ValidatorByConsumerAddr{ { ChainId: cChainIDs[0], - ProviderAddr: &provAddr, - ConsumerAddr: &consumerConsAddr, + ProviderAddr: provAddr.ToSdkConsAddr(), + ConsumerAddr: consumerConsAddr.ToSdkConsAddr(), }, }, []providertypes.ConsumerAddrsToPrune{ { ChainId: cChainIDs[0], VscId: vscID, - ConsumerAddrs: &providertypes.ConsumerAddressList{Addresses: []*providertypes.ConsumerConsAddress{&consumerConsAddr}}, + ConsumerAddrs: &providertypes.AddressList{Addresses: [][]byte{consumerConsAddr.ToSdkConsAddr()}}, }, }, ) @@ -155,7 +155,7 @@ func TestInitAndExportGenesis(t *testing.T) { addrs := pk.GetConsumerAddrsToPrune(ctx, cChainIDs[0], vscID) // Expect same list as what was provided in provGenesis - expectedAddrList := providertypes.ConsumerAddressList{Addresses: []*providertypes.ConsumerConsAddress{&consumerConsAddr}} + expectedAddrList := providertypes.AddressList{Addresses: [][]byte{consumerConsAddr.ToSdkConsAddr()}} require.Equal(t, expectedAddrList, addrs) // check provider chain's consumer chain states diff --git a/x/ccv/provider/keeper/hooks.go b/x/ccv/provider/keeper/hooks.go index 31fd3d0d6a..3cf1e6cc30 100644 --- a/x/ccv/provider/keeper/hooks.go +++ b/x/ccv/provider/keeper/hooks.go @@ -85,7 +85,7 @@ func ValidatorConsensusKeyInUse(k *Keeper, ctx sdk.Context, valAddr sdk.ValAddre inUse := false for _, validatorConsumerAddrs := range k.GetAllValidatorsByConsumerAddr(ctx, nil) { - if validatorConsumerAddrs.ConsumerAddr.ToSdkConsAddr().Equals(consensusAddr) { + if sdk.ConsAddress(validatorConsumerAddrs.ConsumerAddr).Equals(consensusAddr) { inUse = true break } @@ -103,7 +103,7 @@ func (h Hooks) AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) { func (h Hooks) AfterValidatorRemoved(ctx sdk.Context, valConsAddr sdk.ConsAddress, valAddr sdk.ValAddress) { for _, validatorConsumerPubKey := range h.k.GetAllValidatorConsumerPubKeys(ctx, nil) { - if validatorConsumerPubKey.ProviderAddr.ToSdkConsAddr().Equals(valConsAddr) { + if sdk.ConsAddress(validatorConsumerPubKey.ProviderAddr).Equals(valConsAddr) { consumerAddrTmp, err := ccvtypes.TMCryptoPublicKeyToConsAddr(*validatorConsumerPubKey.ConsumerKey) if err != nil { // An error here would indicate something is very wrong @@ -111,7 +111,8 @@ func (h Hooks) AfterValidatorRemoved(ctx sdk.Context, valConsAddr sdk.ConsAddres } consumerAddr := providertypes.NewConsumerConsAddress(consumerAddrTmp) h.k.DeleteValidatorByConsumerAddr(ctx, validatorConsumerPubKey.ChainId, consumerAddr) - h.k.DeleteValidatorConsumerPubKey(ctx, validatorConsumerPubKey.ChainId, *validatorConsumerPubKey.ProviderAddr) + providerAddr := providertypes.NewProviderConsAddress(validatorConsumerPubKey.ProviderAddr) + h.k.DeleteValidatorConsumerPubKey(ctx, validatorConsumerPubKey.ChainId, providerAddr) } } } diff --git a/x/ccv/provider/keeper/key_assignment.go b/x/ccv/provider/keeper/key_assignment.go index de4cbace7c..81ded10282 100644 --- a/x/ccv/provider/keeper/key_assignment.go +++ b/x/ccv/provider/keeper/key_assignment.go @@ -90,7 +90,7 @@ func (k Keeper) GetAllValidatorConsumerPubKeys(ctx sdk.Context, chainID *string) validatorConsumerPubKeys = append(validatorConsumerPubKeys, types.ValidatorConsumerPubKey{ ChainId: chainID, - ProviderAddr: &providerAddr, + ProviderAddr: providerAddr.ToSdkConsAddr(), ConsumerKey: &consumerKey, }) } @@ -116,12 +116,7 @@ func (k Keeper) GetValidatorByConsumerAddr( if bz == nil { return providerAddr, false } - err := providerAddr.Unmarshal(bz) - if err != nil { - // An error here would indicate something is very wrong, - // the provider address is assumed to be correctly serialized in SetValidatorByConsumerAddr. - panic(fmt.Sprintf("failed to unmarshal provider address: %v", err)) - } + providerAddr = types.NewProviderConsAddress(bz) return providerAddr, true } @@ -135,11 +130,7 @@ func (k Keeper) SetValidatorByConsumerAddr( ) { store := ctx.KVStore(k.storeKey) // Cons address is a type alias for a byte string, no marshaling needed - bz, err := providerAddr.Marshal() - if err != nil { - // An error here would indicate something is very wrong, - panic(fmt.Sprintf("failed to marshal provider address: %v", err)) - } + bz := providerAddr.ToSdkConsAddr() store.Set(types.ValidatorsByConsumerAddrKey(chainID, consumerAddr), bz) } @@ -173,17 +164,11 @@ func (k Keeper) GetAllValidatorsByConsumerAddr(ctx sdk.Context, chainID *string) panic(fmt.Sprintf("failed to parse chainID and consumer address: %v", err)) } consumerAddr := types.NewConsumerConsAddress(consumerAddrTmp) - var providerAddr types.ProviderConsAddress - err = providerAddr.Unmarshal(iterator.Value()) - if err != nil { - // An error here would indicate something is very wrong, - // the provider address is assumed to be correctly serialized in SetValidatorByConsumerAddr. - panic(fmt.Sprintf("failed to unmarshal provider address: %v", err)) - } + providerAddr := types.NewProviderConsAddress(iterator.Value()) validatorConsumerAddrs = append(validatorConsumerAddrs, types.ValidatorByConsumerAddr{ - ConsumerAddr: &consumerAddr, - ProviderAddr: &providerAddr, + ConsumerAddr: consumerAddr.ToSdkConsAddr(), + ProviderAddr: providerAddr.ToSdkConsAddr(), ChainId: chainID, }) } @@ -274,7 +259,7 @@ func (k Keeper) GetAllKeyAssignmentReplacements(ctx sdk.Context, chainID string) } replacements = append(replacements, types.KeyAssignmentReplacement{ - ProviderAddr: &providerAddr, + ProviderAddr: providerAddr.ToSdkConsAddr(), PrevCKey: &pubKeyAndPower.PubKey, Power: pubKeyAndPower.Power, }) @@ -302,7 +287,7 @@ func (k Keeper) DeleteKeyAssignmentReplacement(ctx sdk.Context, chainID string, func (k Keeper) AppendConsumerAddrsToPrune(ctx sdk.Context, chainID string, vscID uint64, consumerAddr types.ConsumerConsAddress) { store := ctx.KVStore(k.storeKey) bz := store.Get(types.ConsumerAddrsToPruneKey(chainID, vscID)) - var consumerAddrsToPrune types.ConsumerAddressList + var consumerAddrsToPrune types.AddressList if bz != nil { err := consumerAddrsToPrune.Unmarshal(bz) if err != nil { @@ -311,7 +296,7 @@ func (k Keeper) AppendConsumerAddrsToPrune(ctx sdk.Context, chainID string, vscI panic(err) } } - consumerAddrsToPrune.Addresses = append(consumerAddrsToPrune.Addresses, &consumerAddr) + consumerAddrsToPrune.Addresses = append(consumerAddrsToPrune.Addresses, consumerAddr.ToSdkConsAddr()) bz, err := consumerAddrsToPrune.Marshal() if err != nil { // An error here would indicate something is very wrong, @@ -327,7 +312,7 @@ func (k Keeper) GetConsumerAddrsToPrune( ctx sdk.Context, chainID string, vscID uint64, -) (consumerAddrsToPrune types.ConsumerAddressList) { +) (consumerAddrsToPrune types.AddressList) { store := ctx.KVStore(k.storeKey) bz := store.Get(types.ConsumerAddrsToPruneKey(chainID, vscID)) if bz == nil { @@ -359,7 +344,7 @@ func (k Keeper) GetAllConsumerAddrsToPrune(ctx sdk.Context, chainID string) (con // store keys are assumed to be correctly serialized in AppendConsumerAddrsToPrune. panic(err) } - var addrs types.ConsumerAddressList + var addrs types.AddressList err = addrs.Unmarshal(iterator.Value()) if err != nil { // An error here would indicate something is very wrong, @@ -564,13 +549,14 @@ func (k Keeper) MustApplyKeyAssignmentToValUpdates( // set the old consumer key's power to 0 and the new consumer key's power to the // power in the pending key assignment. for _, replacement := range k.GetAllKeyAssignmentReplacements(ctx, chainID) { - k.DeleteKeyAssignmentReplacement(ctx, chainID, *replacement.ProviderAddr) + providerAddr := types.NewProviderConsAddress(replacement.ProviderAddr) + k.DeleteKeyAssignmentReplacement(ctx, chainID, providerAddr) newUpdates = append(newUpdates, abci.ValidatorUpdate{ PubKey: *replacement.PrevCKey, Power: 0, }) - newConsumerKey, found := k.GetValidatorConsumerPubKey(ctx, chainID, *replacement.ProviderAddr) + newConsumerKey, found := k.GetValidatorConsumerPubKey(ctx, chainID, providerAddr) if !found { // This should never happen as for every KeyAssignmentReplacement there should // be a ValidatorConsumerPubKey that was stored when AssignConsumerKey() was called. @@ -605,11 +591,12 @@ func (k Keeper) GetProviderAddrFromConsumerAddr( // as they cannot be referenced in slash requests (by a correct consumer) func (k Keeper) PruneKeyAssignments(ctx sdk.Context, chainID string, vscID uint64) { consumerAddrs := k.GetConsumerAddrsToPrune(ctx, chainID, vscID) - for _, addr := range consumerAddrs.Addresses { - k.DeleteValidatorByConsumerAddr(ctx, chainID, *addr) + for _, addrBz := range consumerAddrs.Addresses { + consumerAddr := types.NewConsumerConsAddress(addrBz) + k.DeleteValidatorByConsumerAddr(ctx, chainID, consumerAddr) k.Logger(ctx).Info("consumer address was pruned", "consumer chainID", chainID, - "consumer consensus addr", addr.String(), + "consumer consensus addr", consumerAddr.String(), ) } @@ -620,17 +607,20 @@ func (k Keeper) PruneKeyAssignments(ctx sdk.Context, chainID string, vscID uint6 func (k Keeper) DeleteKeyAssignments(ctx sdk.Context, chainID string) { // delete ValidatorConsumerPubKey for _, validatorConsumerAddr := range k.GetAllValidatorConsumerPubKeys(ctx, &chainID) { - k.DeleteValidatorConsumerPubKey(ctx, chainID, *validatorConsumerAddr.ProviderAddr) + providerAddr := types.NewProviderConsAddress(validatorConsumerAddr.ProviderAddr) + k.DeleteValidatorConsumerPubKey(ctx, chainID, providerAddr) } // delete ValidatorsByConsumerAddr for _, validatorConsumerAddr := range k.GetAllValidatorsByConsumerAddr(ctx, &chainID) { - k.DeleteValidatorByConsumerAddr(ctx, chainID, *validatorConsumerAddr.ConsumerAddr) + consumerAddr := types.NewConsumerConsAddress(validatorConsumerAddr.ConsumerAddr) + k.DeleteValidatorByConsumerAddr(ctx, chainID, consumerAddr) } // delete KeyAssignmentReplacements for _, keyAssignmentReplacement := range k.GetAllKeyAssignmentReplacements(ctx, chainID) { - k.DeleteKeyAssignmentReplacement(ctx, chainID, *keyAssignmentReplacement.ProviderAddr) + providerAddr := types.NewProviderConsAddress(keyAssignmentReplacement.ProviderAddr) + k.DeleteKeyAssignmentReplacement(ctx, chainID, providerAddr) } // delete ValidatorConsumerPubKey diff --git a/x/ccv/provider/keeper/key_assignment_test.go b/x/ccv/provider/keeper/key_assignment_test.go index 17b0c3e85e..da0edb2575 100644 --- a/x/ccv/provider/keeper/key_assignment_test.go +++ b/x/ccv/provider/keeper/key_assignment_test.go @@ -57,7 +57,7 @@ func TestGetAllValidatorConsumerPubKey(t *testing.T) { testAssignments = append(testAssignments, types.ValidatorConsumerPubKey{ ChainId: chainIDs[rand.Intn(len(chainIDs))], - ProviderAddr: &providerAddr, + ProviderAddr: providerAddr.ToSdkConsAddr(), ConsumerKey: &consumerKey, }, ) @@ -84,11 +84,12 @@ func TestGetAllValidatorConsumerPubKey(t *testing.T) { } // sorting by ValidatorConsumerPubKey.ProviderAddr sort.Slice(expectedGetAllOneConsumerOrder, func(i, j int) bool { - return bytes.Compare(expectedGetAllOneConsumerOrder[i].ProviderAddr.ToSdkConsAddr(), expectedGetAllOneConsumerOrder[j].ProviderAddr.ToSdkConsAddr()) == -1 + return bytes.Compare(expectedGetAllOneConsumerOrder[i].ProviderAddr, expectedGetAllOneConsumerOrder[j].ProviderAddr) == -1 }) for _, assignment := range testAssignments { - pk.SetValidatorConsumerPubKey(ctx, assignment.ChainId, *assignment.ProviderAddr, *assignment.ConsumerKey) + providerAddr := types.NewProviderConsAddress(assignment.ProviderAddr) + pk.SetValidatorConsumerPubKey(ctx, assignment.ChainId, providerAddr, *assignment.ConsumerKey) } result := pk.GetAllValidatorConsumerPubKeys(ctx, &chainID) @@ -134,8 +135,8 @@ func TestGetAllValidatorsByConsumerAddr(t *testing.T) { testAssignments = append(testAssignments, types.ValidatorByConsumerAddr{ ChainId: chainIDs[rand.Intn(len(chainIDs))], - ConsumerAddr: &consumerAddr, - ProviderAddr: &providerAddr, + ConsumerAddr: consumerAddr.ToSdkConsAddr(), + ProviderAddr: providerAddr.ToSdkConsAddr(), }, ) } @@ -161,11 +162,13 @@ func TestGetAllValidatorsByConsumerAddr(t *testing.T) { } // sorting by ValidatorByConsumerAddr.ConsumerAddr sort.Slice(expectedGetAllOneConsumerOrder, func(i, j int) bool { - return bytes.Compare(expectedGetAllOneConsumerOrder[i].ConsumerAddr.ToSdkConsAddr(), expectedGetAllOneConsumerOrder[j].ConsumerAddr.ToSdkConsAddr()) == -1 + return bytes.Compare(expectedGetAllOneConsumerOrder[i].ConsumerAddr, expectedGetAllOneConsumerOrder[j].ConsumerAddr) == -1 }) for _, assignment := range testAssignments { - pk.SetValidatorByConsumerAddr(ctx, assignment.ChainId, *assignment.ConsumerAddr, *assignment.ProviderAddr) + consumerAddr := types.NewConsumerConsAddress(assignment.ConsumerAddr) + providerAddr := types.NewProviderConsAddress(assignment.ProviderAddr) + pk.SetValidatorByConsumerAddr(ctx, assignment.ChainId, consumerAddr, providerAddr) } result := pk.GetAllValidatorsByConsumerAddr(ctx, &chainID) @@ -210,7 +213,7 @@ func TestGetAllKeyAssignmentReplacements(t *testing.T) { providerAddr := cryptotestutil.NewCryptoIdentityFromIntSeed(numAssignments + i).ProviderConsAddress() testAssignments = append(testAssignments, types.KeyAssignmentReplacement{ - ProviderAddr: &providerAddr, + ProviderAddr: providerAddr.ToSdkConsAddr(), PrevCKey: &consumerKey, Power: rand.Int63(), }, @@ -219,12 +222,14 @@ func TestGetAllKeyAssignmentReplacements(t *testing.T) { expectedGetAllOrder := testAssignments // sorting by KeyAssignmentReplacement.ProviderAddr sort.Slice(expectedGetAllOrder, func(i, j int) bool { - return bytes.Compare(expectedGetAllOrder[i].ProviderAddr.ToSdkConsAddr(), expectedGetAllOrder[j].ProviderAddr.ToSdkConsAddr()) == -1 + return bytes.Compare(expectedGetAllOrder[i].ProviderAddr, expectedGetAllOrder[j].ProviderAddr) == -1 }) - pk.SetKeyAssignmentReplacement(ctx, "consumer-2", *testAssignments[0].ProviderAddr, *testAssignments[0].PrevCKey, testAssignments[0].Power) + firstTestAssignmentProviderAddr := types.NewProviderConsAddress(testAssignments[0].ProviderAddr) + pk.SetKeyAssignmentReplacement(ctx, "consumer-2", firstTestAssignmentProviderAddr, *testAssignments[0].PrevCKey, testAssignments[0].Power) for _, assignment := range testAssignments { - pk.SetKeyAssignmentReplacement(ctx, chainID, *assignment.ProviderAddr, *assignment.PrevCKey, assignment.Power) + providerAddr := types.NewProviderConsAddress(assignment.ProviderAddr) + pk.SetKeyAssignmentReplacement(ctx, chainID, providerAddr, *assignment.PrevCKey, assignment.Power) } result := pk.GetAllKeyAssignmentReplacements(ctx, chainID) @@ -248,7 +253,7 @@ func TestConsumerAddrsToPruneCRUD(t *testing.T) { addrsToPrune = keeper.GetConsumerAddrsToPrune(ctx, chainID, vscID).Addresses require.NotEmpty(t, addrsToPrune, "addresses to prune is empty") require.Len(t, addrsToPrune, 1, "addresses to prune is not len 1") - require.Equal(t, *addrsToPrune[0], consumerAddr) + require.Equal(t, addrsToPrune[0], consumerAddr.ToSdkConsAddr().Bytes()) keeper.DeleteConsumerAddrsToPrune(ctx, chainID, vscID) addrsToPrune = keeper.GetConsumerAddrsToPrune(ctx, chainID, vscID).Addresses @@ -264,10 +269,10 @@ func TestGetAllConsumerAddrsToPrune(t *testing.T) { numAssignments := 10 testAssignments := []types.ConsumerAddrsToPrune{} for i := 0; i < numAssignments; i++ { - consumerAddresses := types.ConsumerAddressList{} + consumerAddresses := types.AddressList{} for j := 0; j < 2*(i+1); j++ { - addr := cryptotestutil.NewCryptoIdentityFromIntSeed(i * j).ConsumerConsAddress() - consumerAddresses.Addresses = append(consumerAddresses.Addresses, &addr) + addr := cryptotestutil.NewCryptoIdentityFromIntSeed(i * j).SDKValConsAddress() + consumerAddresses.Addresses = append(consumerAddresses.Addresses, addr) } testAssignments = append(testAssignments, types.ConsumerAddrsToPrune{ @@ -304,7 +309,8 @@ func TestGetAllConsumerAddrsToPrune(t *testing.T) { for _, assignment := range testAssignments { for _, addr := range assignment.ConsumerAddrs.Addresses { - pk.AppendConsumerAddrsToPrune(ctx, assignment.ChainId, assignment.VscId, *addr) + consumerAddr := types.NewConsumerConsAddress(addr) + pk.AppendConsumerAddrsToPrune(ctx, assignment.ChainId, assignment.VscId, consumerAddr) } } @@ -324,13 +330,13 @@ func checkCorrectPruningProperty(ctx sdk.Context, k providerkeeper.Keeper, chain willBePruned := map[string]bool{} for _, consAddrToPrune := range k.GetAllConsumerAddrsToPrune(ctx, chainID) { for _, cAddr := range consAddrToPrune.ConsumerAddrs.Addresses { - willBePruned[cAddr.String()] = true + willBePruned[string(cAddr)] = true } } good := true for _, valByConsAddr := range k.GetAllValidatorsByConsumerAddr(ctx, nil) { - if _, ok := willBePruned[valByConsAddr.ConsumerAddr.String()]; ok { + if _, ok := willBePruned[string(valByConsAddr.ConsumerAddr)]; ok { // Address will be pruned, everything is fine. continue } @@ -338,7 +344,7 @@ func checkCorrectPruningProperty(ctx sdk.Context, k providerkeeper.Keeper, chain isCurrentlyAssigned := false for _, valconsPubKey := range k.GetAllValidatorConsumerPubKeys(ctx, &valByConsAddr.ChainId) { consumerAddr, _ := ccvtypes.TMCryptoPublicKeyToConsAddr(*valconsPubKey.ConsumerKey) - if consumerAddr.Equals(valByConsAddr.ConsumerAddr.ToSdkConsAddr()) { + if consumerAddr.Equals(sdk.ConsAddress(valByConsAddr.ConsumerAddr)) { isCurrentlyAssigned = true break } diff --git a/x/ccv/provider/keeper/throttle.go b/x/ccv/provider/keeper/throttle.go index 4a3a9f8303..704a2f6d19 100644 --- a/x/ccv/provider/keeper/throttle.go +++ b/x/ccv/provider/keeper/throttle.go @@ -29,7 +29,8 @@ func (k Keeper) HandleThrottleQueues(ctx sdktypes.Context) { for _, globalEntry := range allEntries { // Subtract voting power that will be jailed/tombstoned from the slash meter - meter = meter.Sub(k.GetEffectiveValPower(ctx, *globalEntry.ProviderValConsAddr)) + 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. @@ -190,11 +191,7 @@ func (k Keeper) GetSlashMeterAllowance(ctx sdktypes.Context) sdktypes.Int { func (k Keeper) QueueGlobalSlashEntry(ctx sdktypes.Context, entry providertypes.GlobalSlashEntry) { store := ctx.KVStore(k.storeKey) key := providertypes.GlobalSlashEntryKey(entry) - bz, err := entry.ProviderValConsAddr.Marshal() - if err != nil { - // This should never happen, since the provider val cons addr should be a valid sdk address - panic(fmt.Sprintf("failed to marshal validator consensus address: %s", err.Error())) - } + bz := entry.ProviderValConsAddr store.Set(key, bz) } @@ -228,12 +225,7 @@ func (k Keeper) GetAllGlobalSlashEntries(ctx sdktypes.Context) []providertypes.G // 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.ProviderConsAddress{} - err := valAddr.Unmarshal(iterator.Value()) - if err != nil { - // This should never happen, provider cons address is assumed to be correctly serialized in QueueGlobalSlashEntry - panic(fmt.Sprintf("failed to unmarshal validator consensus address: %s", err.Error())) - } + valAddr := providertypes.NewProviderConsAddress(iterator.Value()) entry := providertypes.NewGlobalSlashEntry(recvTime, chainID, ibcSeqNum, valAddr) entries = append(entries, entry) } diff --git a/x/ccv/provider/types/key_assignment.go b/x/ccv/provider/types/key_assignment.go index 4c4fb869fc..3ecee9379a 100644 --- a/x/ccv/provider/types/key_assignment.go +++ b/x/ccv/provider/types/key_assignment.go @@ -9,6 +9,18 @@ import ( ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" ) +// A validator's consensus address on the provider chain. +type ProviderConsAddress struct { + Address sdk.ConsAddress +} + +// A validator's assigned consensus address for a consumer chain. +// Note this type is for type safety within provider code, consumer code uses normal sdk.ConsAddress, +// since there's no notion of provider vs consumer address. +type ConsumerConsAddress struct { + Address sdk.ConsAddress +} + // NewProviderConsAddress creates a new ProviderConsAddress, // a validator's consensus address on the provider chain. func NewProviderConsAddress(addr sdk.ConsAddress) ProviderConsAddress { @@ -18,7 +30,7 @@ func NewProviderConsAddress(addr sdk.ConsAddress) ProviderConsAddress { } func (p *ProviderConsAddress) ToSdkConsAddr() sdk.ConsAddress { - return sdk.ConsAddress(p.Address) + return p.Address } // String implements the Stringer interface for ProviderConsAddress, @@ -38,7 +50,7 @@ func NewConsumerConsAddress(addr sdk.ConsAddress) ConsumerConsAddress { } func (c *ConsumerConsAddress) ToSdkConsAddr() sdk.ConsAddress { - return sdk.ConsAddress(c.Address) + return c.Address } // String implements the Stringer interface for ConsumerConsAddress, @@ -59,7 +71,7 @@ func KeyAssignmentValidateBasic( if strings.TrimSpace(e.ChainId) == "" { return errorsmod.Wrap(ccvtypes.ErrInvalidGenesis, "consumer chain id must not be blank") } - if err := sdk.VerifyAddressFormat(e.ProviderAddr.ToSdkConsAddr()); err != nil { + if err := sdk.VerifyAddressFormat(e.ProviderAddr); err != nil { return errorsmod.Wrap(ccvtypes.ErrInvalidGenesis, fmt.Sprintf("invalid provider address: %s", e.ProviderAddr)) } if e.ConsumerKey == nil { @@ -70,10 +82,10 @@ func KeyAssignmentValidateBasic( if strings.TrimSpace(e.ChainId) == "" { return errorsmod.Wrap(ccvtypes.ErrInvalidGenesis, "consumer chain id must not be blank") } - if err := sdk.VerifyAddressFormat(e.ProviderAddr.ToSdkConsAddr()); err != nil { + if err := sdk.VerifyAddressFormat(e.ProviderAddr); err != nil { return errorsmod.Wrap(ccvtypes.ErrInvalidGenesis, fmt.Sprintf("invalid provider address: %s", e.ProviderAddr)) } - if err := sdk.VerifyAddressFormat(e.ConsumerAddr.ToSdkConsAddr()); err != nil { + if err := sdk.VerifyAddressFormat(e.ConsumerAddr); err != nil { return errorsmod.Wrap(ccvtypes.ErrInvalidGenesis, fmt.Sprintf("invalid consumer address: %s", e.ConsumerAddr)) } } @@ -83,7 +95,7 @@ func KeyAssignmentValidateBasic( } // Don't check e.vscid, it's an unsigned integer for _, a := range e.ConsumerAddrs.Addresses { - if err := sdk.VerifyAddressFormat(a.ToSdkConsAddr()); err != nil { + if err := sdk.VerifyAddressFormat(a); err != nil { return errorsmod.Wrap(ccvtypes.ErrInvalidGenesis, fmt.Sprintf("invalid consumer address: %s", a)) } } diff --git a/x/ccv/provider/types/provider.pb.go b/x/ccv/provider/types/provider.pb.go index 5373ee3614..d7d5b5fc08 100644 --- a/x/ccv/provider/types/provider.pb.go +++ b/x/ccv/provider/types/provider.pb.go @@ -261,7 +261,7 @@ type GlobalSlashEntry struct { // This field is used to obtain validator power in HandleThrottleQueues. // // This field is not used in the store key, but is persisted in value bytes, see QueueGlobalSlashEntry. - ProviderValConsAddr *ProviderConsAddress `protobuf:"bytes,4,opt,name=provider_val_cons_addr,json=providerValConsAddr,proto3" json:"provider_val_cons_addr,omitempty"` + ProviderValConsAddr []byte `protobuf:"bytes,4,opt,name=provider_val_cons_addr,json=providerValConsAddr,proto3" json:"provider_val_cons_addr,omitempty"` } func (m *GlobalSlashEntry) Reset() { *m = GlobalSlashEntry{} } @@ -318,7 +318,7 @@ func (m *GlobalSlashEntry) GetIbcSeqNum() uint64 { return 0 } -func (m *GlobalSlashEntry) GetProviderValConsAddr() *ProviderConsAddress { +func (m *GlobalSlashEntry) GetProviderValConsAddr() []byte { if m != nil { return m.ProviderValConsAddr } @@ -591,6 +591,51 @@ func (m *ConsumerAdditionProposals) GetPending() []*ConsumerAdditionProposal { return nil } +// AddressList contains a list of consensus addresses +type AddressList struct { + Addresses [][]byte `protobuf:"bytes,1,rep,name=addresses,proto3" json:"addresses,omitempty"` +} + +func (m *AddressList) Reset() { *m = AddressList{} } +func (m *AddressList) String() string { return proto.CompactTextString(m) } +func (*AddressList) ProtoMessage() {} +func (*AddressList) Descriptor() ([]byte, []int) { + return fileDescriptor_f22ec409a72b7b72, []int{8} +} +func (m *AddressList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AddressList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AddressList.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 *AddressList) XXX_Merge(src proto.Message) { + xxx_messageInfo_AddressList.Merge(m, src) +} +func (m *AddressList) XXX_Size() int { + return m.Size() +} +func (m *AddressList) XXX_DiscardUnknown() { + xxx_messageInfo_AddressList.DiscardUnknown(m) +} + +var xxx_messageInfo_AddressList proto.InternalMessageInfo + +func (m *AddressList) GetAddresses() [][]byte { + if m != nil { + return m.Addresses + } + return nil +} + // ConsumerRemovalProposals holds pending governance proposals on the provider chain to remove (and stop) a consumer chain. type ConsumerRemovalProposals struct { // proposals waiting for stop_time to pass @@ -601,7 +646,7 @@ func (m *ConsumerRemovalProposals) Reset() { *m = ConsumerRemovalProposa func (m *ConsumerRemovalProposals) String() string { return proto.CompactTextString(m) } func (*ConsumerRemovalProposals) ProtoMessage() {} func (*ConsumerRemovalProposals) Descriptor() ([]byte, []int) { - return fileDescriptor_f22ec409a72b7b72, []int{8} + return fileDescriptor_f22ec409a72b7b72, []int{9} } func (m *ConsumerRemovalProposals) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -646,7 +691,7 @@ func (m *ChannelToChain) Reset() { *m = ChannelToChain{} } func (m *ChannelToChain) String() string { return proto.CompactTextString(m) } func (*ChannelToChain) ProtoMessage() {} func (*ChannelToChain) Descriptor() ([]byte, []int) { - return fileDescriptor_f22ec409a72b7b72, []int{9} + return fileDescriptor_f22ec409a72b7b72, []int{10} } func (m *ChannelToChain) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -700,7 +745,7 @@ func (m *VscUnbondingOps) Reset() { *m = VscUnbondingOps{} } func (m *VscUnbondingOps) String() string { return proto.CompactTextString(m) } func (*VscUnbondingOps) ProtoMessage() {} func (*VscUnbondingOps) Descriptor() ([]byte, []int) { - return fileDescriptor_f22ec409a72b7b72, []int{10} + return fileDescriptor_f22ec409a72b7b72, []int{11} } func (m *VscUnbondingOps) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -755,7 +800,7 @@ func (m *UnbondingOp) Reset() { *m = UnbondingOp{} } func (m *UnbondingOp) String() string { return proto.CompactTextString(m) } func (*UnbondingOp) ProtoMessage() {} func (*UnbondingOp) Descriptor() ([]byte, []int) { - return fileDescriptor_f22ec409a72b7b72, []int{11} + return fileDescriptor_f22ec409a72b7b72, []int{12} } func (m *UnbondingOp) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -807,7 +852,7 @@ func (m *InitTimeoutTimestamp) Reset() { *m = InitTimeoutTimestamp{} } func (m *InitTimeoutTimestamp) String() string { return proto.CompactTextString(m) } func (*InitTimeoutTimestamp) ProtoMessage() {} func (*InitTimeoutTimestamp) Descriptor() ([]byte, []int) { - return fileDescriptor_f22ec409a72b7b72, []int{12} + return fileDescriptor_f22ec409a72b7b72, []int{13} } func (m *InitTimeoutTimestamp) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -859,7 +904,7 @@ func (m *VscSendTimestamp) Reset() { *m = VscSendTimestamp{} } func (m *VscSendTimestamp) String() string { return proto.CompactTextString(m) } func (*VscSendTimestamp) ProtoMessage() {} func (*VscSendTimestamp) Descriptor() ([]byte, []int) { - return fileDescriptor_f22ec409a72b7b72, []int{13} + return fileDescriptor_f22ec409a72b7b72, []int{14} } func (m *VscSendTimestamp) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -902,152 +947,17 @@ func (m *VscSendTimestamp) GetTimestamp() time.Time { return time.Time{} } -// A validator's assigned consensus address for a consumer chain. -// Note this type is for type safety within provider code, consumer code uses normal sdk.ConsAddress, -// since there's no notion of provider vs consumer address. -type ConsumerConsAddress struct { - Address []byte `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` -} - -func (m *ConsumerConsAddress) Reset() { *m = ConsumerConsAddress{} } -func (*ConsumerConsAddress) ProtoMessage() {} -func (*ConsumerConsAddress) Descriptor() ([]byte, []int) { - return fileDescriptor_f22ec409a72b7b72, []int{14} -} -func (m *ConsumerConsAddress) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ConsumerConsAddress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ConsumerConsAddress.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 *ConsumerConsAddress) XXX_Merge(src proto.Message) { - xxx_messageInfo_ConsumerConsAddress.Merge(m, src) -} -func (m *ConsumerConsAddress) XXX_Size() int { - return m.Size() -} -func (m *ConsumerConsAddress) XXX_DiscardUnknown() { - xxx_messageInfo_ConsumerConsAddress.DiscardUnknown(m) -} - -var xxx_messageInfo_ConsumerConsAddress proto.InternalMessageInfo - -func (m *ConsumerConsAddress) GetAddress() []byte { - if m != nil { - return m.Address - } - return nil -} - -// A validator's consensus address on the provider chain -type ProviderConsAddress struct { - Address []byte `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` -} - -func (m *ProviderConsAddress) Reset() { *m = ProviderConsAddress{} } -func (*ProviderConsAddress) ProtoMessage() {} -func (*ProviderConsAddress) Descriptor() ([]byte, []int) { - return fileDescriptor_f22ec409a72b7b72, []int{15} -} -func (m *ProviderConsAddress) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ProviderConsAddress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ProviderConsAddress.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 *ProviderConsAddress) XXX_Merge(src proto.Message) { - xxx_messageInfo_ProviderConsAddress.Merge(m, src) -} -func (m *ProviderConsAddress) XXX_Size() int { - return m.Size() -} -func (m *ProviderConsAddress) XXX_DiscardUnknown() { - xxx_messageInfo_ProviderConsAddress.DiscardUnknown(m) -} - -var xxx_messageInfo_ProviderConsAddress proto.InternalMessageInfo - -func (m *ProviderConsAddress) GetAddress() []byte { - if m != nil { - return m.Address - } - return nil -} - -// ConsumerAddressList contains a list of consumer consensus addresses -type ConsumerAddressList struct { - Addresses []*ConsumerConsAddress `protobuf:"bytes,1,rep,name=addresses,proto3" json:"addresses,omitempty"` -} - -func (m *ConsumerAddressList) Reset() { *m = ConsumerAddressList{} } -func (m *ConsumerAddressList) String() string { return proto.CompactTextString(m) } -func (*ConsumerAddressList) ProtoMessage() {} -func (*ConsumerAddressList) Descriptor() ([]byte, []int) { - return fileDescriptor_f22ec409a72b7b72, []int{16} -} -func (m *ConsumerAddressList) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ConsumerAddressList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ConsumerAddressList.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 *ConsumerAddressList) XXX_Merge(src proto.Message) { - xxx_messageInfo_ConsumerAddressList.Merge(m, src) -} -func (m *ConsumerAddressList) XXX_Size() int { - return m.Size() -} -func (m *ConsumerAddressList) XXX_DiscardUnknown() { - xxx_messageInfo_ConsumerAddressList.DiscardUnknown(m) -} - -var xxx_messageInfo_ConsumerAddressList proto.InternalMessageInfo - -func (m *ConsumerAddressList) GetAddresses() []*ConsumerConsAddress { - if m != nil { - return m.Addresses - } - return nil -} - type KeyAssignmentReplacement struct { - ProviderAddr *ProviderConsAddress `protobuf:"bytes,1,opt,name=provider_addr,json=providerAddr,proto3" json:"provider_addr,omitempty"` - PrevCKey *crypto.PublicKey `protobuf:"bytes,2,opt,name=prev_c_key,json=prevCKey,proto3" json:"prev_c_key,omitempty"` - Power int64 `protobuf:"varint,3,opt,name=power,proto3" json:"power,omitempty"` + ProviderAddr []byte `protobuf:"bytes,1,opt,name=provider_addr,json=providerAddr,proto3" json:"provider_addr,omitempty"` + PrevCKey *crypto.PublicKey `protobuf:"bytes,2,opt,name=prev_c_key,json=prevCKey,proto3" json:"prev_c_key,omitempty"` + Power int64 `protobuf:"varint,3,opt,name=power,proto3" json:"power,omitempty"` } func (m *KeyAssignmentReplacement) Reset() { *m = KeyAssignmentReplacement{} } func (m *KeyAssignmentReplacement) String() string { return proto.CompactTextString(m) } func (*KeyAssignmentReplacement) ProtoMessage() {} func (*KeyAssignmentReplacement) Descriptor() ([]byte, []int) { - return fileDescriptor_f22ec409a72b7b72, []int{17} + return fileDescriptor_f22ec409a72b7b72, []int{15} } func (m *KeyAssignmentReplacement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1076,7 +986,7 @@ func (m *KeyAssignmentReplacement) XXX_DiscardUnknown() { var xxx_messageInfo_KeyAssignmentReplacement proto.InternalMessageInfo -func (m *KeyAssignmentReplacement) GetProviderAddr() *ProviderConsAddress { +func (m *KeyAssignmentReplacement) GetProviderAddr() []byte { if m != nil { return m.ProviderAddr } @@ -1100,16 +1010,16 @@ func (m *KeyAssignmentReplacement) GetPower() int64 { // Used to serialize the ValidatorConsumerPubKey index from key assignment // ValidatorConsumerPubKey: (chainID, providerAddr consAddr) -> consumerKey tmprotocrypto.PublicKey type ValidatorConsumerPubKey struct { - ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - ProviderAddr *ProviderConsAddress `protobuf:"bytes,2,opt,name=provider_addr,json=providerAddr,proto3" json:"provider_addr,omitempty"` - ConsumerKey *crypto.PublicKey `protobuf:"bytes,3,opt,name=consumer_key,json=consumerKey,proto3" json:"consumer_key,omitempty"` + ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + ProviderAddr []byte `protobuf:"bytes,2,opt,name=provider_addr,json=providerAddr,proto3" json:"provider_addr,omitempty"` + ConsumerKey *crypto.PublicKey `protobuf:"bytes,3,opt,name=consumer_key,json=consumerKey,proto3" json:"consumer_key,omitempty"` } func (m *ValidatorConsumerPubKey) Reset() { *m = ValidatorConsumerPubKey{} } func (m *ValidatorConsumerPubKey) String() string { return proto.CompactTextString(m) } func (*ValidatorConsumerPubKey) ProtoMessage() {} func (*ValidatorConsumerPubKey) Descriptor() ([]byte, []int) { - return fileDescriptor_f22ec409a72b7b72, []int{18} + return fileDescriptor_f22ec409a72b7b72, []int{16} } func (m *ValidatorConsumerPubKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1145,7 +1055,7 @@ func (m *ValidatorConsumerPubKey) GetChainId() string { return "" } -func (m *ValidatorConsumerPubKey) GetProviderAddr() *ProviderConsAddress { +func (m *ValidatorConsumerPubKey) GetProviderAddr() []byte { if m != nil { return m.ProviderAddr } @@ -1162,16 +1072,16 @@ func (m *ValidatorConsumerPubKey) GetConsumerKey() *crypto.PublicKey { // Used to serialize the ValidatorConsumerAddr index from key assignment // ValidatorByConsumerAddr: (chainID, consumerAddr consAddr) -> providerAddr consAddr type ValidatorByConsumerAddr struct { - ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - ConsumerAddr *ConsumerConsAddress `protobuf:"bytes,2,opt,name=consumer_addr,json=consumerAddr,proto3" json:"consumer_addr,omitempty"` - ProviderAddr *ProviderConsAddress `protobuf:"bytes,3,opt,name=provider_addr,json=providerAddr,proto3" json:"provider_addr,omitempty"` + ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + ConsumerAddr []byte `protobuf:"bytes,2,opt,name=consumer_addr,json=consumerAddr,proto3" json:"consumer_addr,omitempty"` + ProviderAddr []byte `protobuf:"bytes,3,opt,name=provider_addr,json=providerAddr,proto3" json:"provider_addr,omitempty"` } func (m *ValidatorByConsumerAddr) Reset() { *m = ValidatorByConsumerAddr{} } func (m *ValidatorByConsumerAddr) String() string { return proto.CompactTextString(m) } func (*ValidatorByConsumerAddr) ProtoMessage() {} func (*ValidatorByConsumerAddr) Descriptor() ([]byte, []int) { - return fileDescriptor_f22ec409a72b7b72, []int{19} + return fileDescriptor_f22ec409a72b7b72, []int{17} } func (m *ValidatorByConsumerAddr) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1207,14 +1117,14 @@ func (m *ValidatorByConsumerAddr) GetChainId() string { return "" } -func (m *ValidatorByConsumerAddr) GetConsumerAddr() *ConsumerConsAddress { +func (m *ValidatorByConsumerAddr) GetConsumerAddr() []byte { if m != nil { return m.ConsumerAddr } return nil } -func (m *ValidatorByConsumerAddr) GetProviderAddr() *ProviderConsAddress { +func (m *ValidatorByConsumerAddr) GetProviderAddr() []byte { if m != nil { return m.ProviderAddr } @@ -1224,16 +1134,16 @@ func (m *ValidatorByConsumerAddr) GetProviderAddr() *ProviderConsAddress { // Used to serialize the ConsumerAddrsToPrune index from key assignment // ConsumerAddrsToPrune: (chainID, vscID uint64) -> consumerAddrs AddressList type ConsumerAddrsToPrune struct { - ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - VscId uint64 `protobuf:"varint,2,opt,name=vsc_id,json=vscId,proto3" json:"vsc_id,omitempty"` - ConsumerAddrs *ConsumerAddressList `protobuf:"bytes,3,opt,name=consumer_addrs,json=consumerAddrs,proto3" json:"consumer_addrs,omitempty"` + ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + VscId uint64 `protobuf:"varint,2,opt,name=vsc_id,json=vscId,proto3" json:"vsc_id,omitempty"` + ConsumerAddrs *AddressList `protobuf:"bytes,3,opt,name=consumer_addrs,json=consumerAddrs,proto3" json:"consumer_addrs,omitempty"` } func (m *ConsumerAddrsToPrune) Reset() { *m = ConsumerAddrsToPrune{} } func (m *ConsumerAddrsToPrune) String() string { return proto.CompactTextString(m) } func (*ConsumerAddrsToPrune) ProtoMessage() {} func (*ConsumerAddrsToPrune) Descriptor() ([]byte, []int) { - return fileDescriptor_f22ec409a72b7b72, []int{20} + return fileDescriptor_f22ec409a72b7b72, []int{18} } func (m *ConsumerAddrsToPrune) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1276,7 +1186,7 @@ func (m *ConsumerAddrsToPrune) GetVscId() uint64 { return 0 } -func (m *ConsumerAddrsToPrune) GetConsumerAddrs() *ConsumerAddressList { +func (m *ConsumerAddrsToPrune) GetConsumerAddrs() *AddressList { if m != nil { return m.ConsumerAddrs } @@ -1292,15 +1202,13 @@ func init() { proto.RegisterType((*HandshakeMetadata)(nil), "interchain_security.ccv.provider.v1.HandshakeMetadata") proto.RegisterType((*SlashAcks)(nil), "interchain_security.ccv.provider.v1.SlashAcks") proto.RegisterType((*ConsumerAdditionProposals)(nil), "interchain_security.ccv.provider.v1.ConsumerAdditionProposals") + proto.RegisterType((*AddressList)(nil), "interchain_security.ccv.provider.v1.AddressList") proto.RegisterType((*ConsumerRemovalProposals)(nil), "interchain_security.ccv.provider.v1.ConsumerRemovalProposals") proto.RegisterType((*ChannelToChain)(nil), "interchain_security.ccv.provider.v1.ChannelToChain") proto.RegisterType((*VscUnbondingOps)(nil), "interchain_security.ccv.provider.v1.VscUnbondingOps") proto.RegisterType((*UnbondingOp)(nil), "interchain_security.ccv.provider.v1.UnbondingOp") proto.RegisterType((*InitTimeoutTimestamp)(nil), "interchain_security.ccv.provider.v1.InitTimeoutTimestamp") proto.RegisterType((*VscSendTimestamp)(nil), "interchain_security.ccv.provider.v1.VscSendTimestamp") - proto.RegisterType((*ConsumerConsAddress)(nil), "interchain_security.ccv.provider.v1.ConsumerConsAddress") - proto.RegisterType((*ProviderConsAddress)(nil), "interchain_security.ccv.provider.v1.ProviderConsAddress") - proto.RegisterType((*ConsumerAddressList)(nil), "interchain_security.ccv.provider.v1.ConsumerAddressList") proto.RegisterType((*KeyAssignmentReplacement)(nil), "interchain_security.ccv.provider.v1.KeyAssignmentReplacement") proto.RegisterType((*ValidatorConsumerPubKey)(nil), "interchain_security.ccv.provider.v1.ValidatorConsumerPubKey") proto.RegisterType((*ValidatorByConsumerAddr)(nil), "interchain_security.ccv.provider.v1.ValidatorByConsumerAddr") @@ -1312,110 +1220,106 @@ func init() { } var fileDescriptor_f22ec409a72b7b72 = []byte{ - // 1635 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0x4f, 0x6f, 0x1b, 0xc7, - 0x15, 0xd7, 0x8a, 0xd4, 0x1f, 0x0e, 0xf5, 0xc7, 0x5e, 0xc9, 0x31, 0xe5, 0xaa, 0x14, 0xb3, 0x6d, - 0x03, 0x15, 0x45, 0x96, 0x90, 0x82, 0x00, 0x81, 0xd1, 0x20, 0x90, 0xe8, 0x38, 0x56, 0xd5, 0xc4, - 0xcc, 0x4a, 0x55, 0xd0, 0x16, 0xc5, 0x62, 0x76, 0xf6, 0x99, 0x1c, 0x68, 0x77, 0x67, 0x3d, 0x33, - 0xbb, 0x36, 0xbf, 0x41, 0x8f, 0x01, 0x7a, 0x09, 0xd0, 0x4b, 0x2e, 0x3d, 0xf4, 0xd4, 0xaf, 0x11, - 0xa0, 0x97, 0x1c, 0x7a, 0xe8, 0x29, 0x2d, 0xe4, 0x43, 0xef, 0xfd, 0x04, 0xc5, 0xcc, 0xfe, 0x25, - 0x2d, 0x27, 0x14, 0xec, 0xde, 0x76, 0xde, 0xbc, 0xf7, 0x9b, 0xf7, 0xde, 0xbc, 0xf7, 0x7b, 0x43, - 0xa2, 0x43, 0x1a, 0x49, 0xe0, 0x64, 0x8c, 0x69, 0xe4, 0x0a, 0x20, 0x09, 0xa7, 0x72, 0xd2, 0x27, - 0x24, 0xed, 0xc7, 0x9c, 0xa5, 0xd4, 0x07, 0xde, 0x4f, 0x0f, 0xca, 0x6f, 0x3b, 0xe6, 0x4c, 0x32, - 0xf3, 0x27, 0xd7, 0xd8, 0xd8, 0x84, 0xa4, 0x76, 0xa9, 0x97, 0x1e, 0xdc, 0xdb, 0x1e, 0xb1, 0x11, - 0xd3, 0xfa, 0x7d, 0xf5, 0x95, 0x99, 0xde, 0xdb, 0x1b, 0x31, 0x36, 0x0a, 0xa0, 0xaf, 0x57, 0x5e, - 0xf2, 0xa4, 0x2f, 0x69, 0x08, 0x42, 0xe2, 0x30, 0xce, 0x15, 0xba, 0xb3, 0x0a, 0x7e, 0xc2, 0xb1, - 0xa4, 0x2c, 0x2a, 0x00, 0xa8, 0x47, 0xfa, 0x84, 0x71, 0xe8, 0x93, 0x80, 0x42, 0x24, 0x95, 0x7b, - 0xd9, 0x57, 0xae, 0xd0, 0x57, 0x0a, 0x01, 0x1d, 0x8d, 0x65, 0x26, 0x16, 0x7d, 0x09, 0x91, 0x0f, - 0x3c, 0xa4, 0x99, 0x72, 0xb5, 0xca, 0x0d, 0x76, 0x6b, 0xfb, 0x84, 0x4f, 0x62, 0xc9, 0xfa, 0x97, - 0x30, 0x11, 0xf9, 0xee, 0x3b, 0x84, 0x89, 0x90, 0x89, 0x3e, 0xa8, 0xc0, 0x22, 0x02, 0xfd, 0xf4, - 0xc0, 0x03, 0x89, 0x0f, 0x4a, 0x41, 0xe1, 0x77, 0xae, 0xe7, 0x61, 0x51, 0xe9, 0x10, 0x46, 0x73, - 0xbf, 0xad, 0x3f, 0x2d, 0xa3, 0xce, 0x80, 0x45, 0x22, 0x09, 0x81, 0x1f, 0xf9, 0x3e, 0x55, 0x21, - 0x0d, 0x39, 0x8b, 0x99, 0xc0, 0x81, 0xb9, 0x8d, 0x96, 0x24, 0x95, 0x01, 0x74, 0x8c, 0x9e, 0xb1, - 0xdf, 0x72, 0xb2, 0x85, 0xd9, 0x43, 0x6d, 0x1f, 0x04, 0xe1, 0x34, 0x56, 0xca, 0x9d, 0x45, 0xbd, - 0x57, 0x17, 0x99, 0x3b, 0x68, 0x35, 0xbb, 0x05, 0xea, 0x77, 0x1a, 0x7a, 0x7b, 0x45, 0xaf, 0x4f, - 0x7c, 0xf3, 0x13, 0xb4, 0x41, 0x23, 0x2a, 0x29, 0x0e, 0xdc, 0x31, 0xa8, 0x6c, 0x74, 0x9a, 0x3d, - 0x63, 0xbf, 0x7d, 0x78, 0xcf, 0xa6, 0x1e, 0xb1, 0x55, 0x02, 0xed, 0x3c, 0x6d, 0xe9, 0x81, 0xfd, - 0x48, 0x6b, 0x1c, 0x37, 0xbf, 0xf9, 0x6e, 0x6f, 0xc1, 0x59, 0xcf, 0xed, 0x32, 0xa1, 0xf9, 0x36, - 0x5a, 0x1b, 0x41, 0x04, 0x82, 0x0a, 0x77, 0x8c, 0xc5, 0xb8, 0xb3, 0xd4, 0x33, 0xf6, 0xd7, 0x9c, - 0x76, 0x2e, 0x7b, 0x84, 0xc5, 0xd8, 0xdc, 0x43, 0x6d, 0x8f, 0x46, 0x98, 0x4f, 0x32, 0x8d, 0x65, - 0xad, 0x81, 0x32, 0x91, 0x56, 0x18, 0x20, 0x24, 0x62, 0xfc, 0x2c, 0x72, 0xd5, 0x6d, 0x77, 0x56, - 0x72, 0x47, 0xb2, 0x9b, 0xb6, 0x8b, 0x9b, 0xb6, 0xcf, 0x8b, 0x52, 0x38, 0x5e, 0x55, 0x8e, 0x7c, - 0xf9, 0xaf, 0x3d, 0xc3, 0x69, 0x69, 0x3b, 0xb5, 0x63, 0x7e, 0x86, 0x6e, 0x25, 0x91, 0xc7, 0x22, - 0x9f, 0x46, 0x23, 0x37, 0x06, 0x4e, 0x99, 0xdf, 0x59, 0xd5, 0x50, 0x3b, 0x2f, 0x41, 0x3d, 0xc8, - 0x8b, 0x26, 0x43, 0xfa, 0x4a, 0x21, 0x6d, 0x96, 0xc6, 0x43, 0x6d, 0x6b, 0x7e, 0x8e, 0x4c, 0x42, - 0x52, 0xed, 0x12, 0x4b, 0x64, 0x81, 0xd8, 0x9a, 0x1f, 0xf1, 0x16, 0x21, 0xe9, 0x79, 0x66, 0x9d, - 0x43, 0xfe, 0x1e, 0xdd, 0x95, 0x1c, 0x47, 0xe2, 0x09, 0xf0, 0x59, 0x5c, 0x34, 0x3f, 0xee, 0x9d, - 0x02, 0x63, 0x1a, 0xfc, 0x11, 0xea, 0x91, 0xbc, 0x80, 0x5c, 0x0e, 0x3e, 0x15, 0x92, 0x53, 0x2f, - 0x51, 0xb6, 0xee, 0x13, 0x8e, 0x89, 0xae, 0x91, 0xb6, 0x2e, 0x82, 0x6e, 0xa1, 0xe7, 0x4c, 0xa9, - 0x3d, 0xcc, 0xb5, 0xcc, 0xc7, 0xe8, 0xa7, 0x5e, 0xc0, 0xc8, 0xa5, 0x50, 0xce, 0xb9, 0x53, 0x48, - 0xfa, 0xe8, 0x90, 0x0a, 0xa1, 0xd0, 0xd6, 0x7a, 0xc6, 0x7e, 0xc3, 0x79, 0x3b, 0xd3, 0x1d, 0x02, - 0x7f, 0x50, 0xd3, 0x3c, 0xaf, 0x29, 0x9a, 0xef, 0x22, 0x73, 0x4c, 0x85, 0x64, 0x9c, 0x12, 0x1c, - 0xb8, 0x10, 0x49, 0x4e, 0x41, 0x74, 0xd6, 0xb5, 0xf9, 0xed, 0x6a, 0xe7, 0xe3, 0x6c, 0xe3, 0xfe, - 0xea, 0x1f, 0xbf, 0xde, 0x5b, 0xf8, 0xea, 0xeb, 0xbd, 0x05, 0xeb, 0x6f, 0x06, 0xba, 0x3b, 0x28, - 0x9d, 0x0d, 0x59, 0x8a, 0x83, 0xff, 0x67, 0x53, 0x1c, 0xa1, 0x96, 0x90, 0x2c, 0xce, 0xca, 0xb0, - 0x79, 0x83, 0x32, 0x5c, 0x55, 0x66, 0x6a, 0xc3, 0xfa, 0xb3, 0x81, 0xb6, 0x3f, 0x7e, 0x9a, 0xd0, - 0x94, 0x11, 0xfc, 0x46, 0x7a, 0xf8, 0x14, 0xad, 0x43, 0x0d, 0x4f, 0x74, 0x1a, 0xbd, 0xc6, 0x7e, - 0xfb, 0xf0, 0x67, 0x76, 0x46, 0x28, 0x76, 0xc9, 0x33, 0x39, 0xa9, 0xd8, 0xf5, 0xd3, 0x9d, 0x69, - 0x5b, 0xeb, 0x2f, 0x8b, 0xe8, 0xd6, 0x27, 0x01, 0xf3, 0x70, 0x70, 0x16, 0x60, 0x31, 0x56, 0x09, - 0x9f, 0xa8, 0xa8, 0x39, 0xe4, 0x95, 0xae, 0xbd, 0x9b, 0x3b, 0x6a, 0x65, 0xa6, 0x7b, 0xef, 0x23, - 0x74, 0xbb, 0xac, 0xbd, 0x32, 0xb9, 0x3a, 0x98, 0xe3, 0xad, 0xab, 0xef, 0xf6, 0x36, 0x8b, 0x3b, - 0x1c, 0xe8, 0x44, 0x3f, 0x70, 0x36, 0xc9, 0x94, 0xc0, 0x37, 0xbb, 0xa8, 0x4d, 0x3d, 0xe2, 0x0a, - 0x78, 0xea, 0x46, 0x49, 0xa8, 0xef, 0xa5, 0xe9, 0xb4, 0xa8, 0x47, 0xce, 0xe0, 0xe9, 0x67, 0x49, - 0x68, 0x86, 0xe8, 0xad, 0x62, 0x78, 0xb8, 0x29, 0x0e, 0x5c, 0x65, 0xef, 0x62, 0xdf, 0xe7, 0xf9, - 0x35, 0x7d, 0x60, 0xcf, 0x31, 0x73, 0xec, 0x61, 0xfe, 0xad, 0xdc, 0x39, 0xf2, 0x7d, 0x0e, 0x42, - 0x38, 0x5b, 0x85, 0xc2, 0x05, 0x0e, 0x0a, 0xb9, 0xf5, 0x9f, 0x25, 0xb4, 0x3c, 0xc4, 0x1c, 0x87, - 0xc2, 0x3c, 0x47, 0x9b, 0x12, 0xc2, 0x38, 0xc0, 0x12, 0xdc, 0x8c, 0x11, 0xf3, 0x1c, 0xfd, 0x42, - 0x33, 0x65, 0x7d, 0x92, 0xd8, 0xb5, 0xd9, 0x91, 0x1e, 0xd8, 0x03, 0x2d, 0x3d, 0x93, 0x58, 0x82, - 0xb3, 0x51, 0x60, 0x64, 0x42, 0xf3, 0x03, 0xd4, 0x91, 0x3c, 0x11, 0xb2, 0xe2, 0xaa, 0xaa, 0x49, - 0xb3, 0x22, 0x78, 0xab, 0xd8, 0xcf, 0xda, 0xbb, 0x6c, 0xce, 0xeb, 0x69, 0xa9, 0xf1, 0x3a, 0xb4, - 0x74, 0x86, 0xb6, 0x14, 0xa7, 0xcf, 0x62, 0x36, 0xe7, 0xc7, 0xbc, 0xad, 0xec, 0xa7, 0x41, 0x3f, - 0x47, 0x66, 0x2a, 0xc8, 0x2c, 0xe6, 0xd2, 0x0d, 0xfc, 0x4c, 0x05, 0x99, 0x86, 0xf4, 0xd1, 0xae, - 0x50, 0x65, 0xeb, 0x86, 0x20, 0x35, 0xc9, 0xc5, 0x01, 0x44, 0x54, 0x8c, 0x0b, 0xf0, 0xe5, 0xf9, - 0xc1, 0x77, 0x34, 0xd0, 0xa7, 0x0a, 0xc7, 0x29, 0x60, 0xf2, 0x53, 0x06, 0xa8, 0x7b, 0xfd, 0x29, - 0xe5, 0x05, 0xad, 0xe8, 0x0b, 0xfa, 0xd1, 0x35, 0x10, 0xe5, 0x2d, 0x1d, 0xa2, 0x3b, 0x21, 0x7e, - 0xee, 0xca, 0x31, 0x67, 0x52, 0x06, 0xe0, 0xbb, 0x31, 0x26, 0x97, 0x20, 0x85, 0x9e, 0x48, 0x0d, - 0x67, 0x2b, 0xc4, 0xcf, 0xcf, 0x8b, 0xbd, 0x61, 0xb6, 0x65, 0x0a, 0xf4, 0x4e, 0x8d, 0xc0, 0x9f, - 0x61, 0xee, 0xbb, 0x3e, 0x44, 0x2c, 0x74, 0x39, 0x8c, 0x14, 0xb3, 0xe2, 0x8c, 0xcb, 0x01, 0xca, - 0x21, 0x94, 0x53, 0x80, 0x7a, 0x53, 0x94, 0xed, 0x3f, 0x60, 0x34, 0xca, 0x27, 0xb5, 0x55, 0xf1, - 0xbc, 0x42, 0x7b, 0xa0, 0xc0, 0x9c, 0x1a, 0xd6, 0x43, 0x00, 0xcb, 0x43, 0xb7, 0x1f, 0xe1, 0xc8, - 0x17, 0x63, 0x7c, 0x09, 0x9f, 0x82, 0xc4, 0x3e, 0x96, 0xd8, 0x7c, 0xaf, 0xd6, 0x6d, 0x4f, 0x00, - 0xdc, 0x98, 0xb1, 0x20, 0xeb, 0xb6, 0x8c, 0xbc, 0xca, 0x9e, 0x79, 0x08, 0x30, 0x64, 0x2c, 0x50, - 0x3d, 0x63, 0x76, 0xd0, 0x4a, 0x0a, 0x5c, 0x54, 0x15, 0x5c, 0x2c, 0xad, 0x9f, 0xa3, 0x96, 0xa6, - 0x9b, 0x23, 0x72, 0x29, 0xcc, 0x5d, 0xd4, 0xc2, 0x59, 0xeb, 0x81, 0xe8, 0x18, 0xbd, 0xc6, 0x7e, - 0xcb, 0xa9, 0x04, 0x96, 0x44, 0x3b, 0xaf, 0x7a, 0x05, 0x09, 0xf3, 0x0b, 0xb4, 0x12, 0x83, 0x1e, - 0xd1, 0xda, 0xb0, 0x7d, 0xf8, 0xe1, 0x5c, 0x5d, 0xff, 0x2a, 0x40, 0xa7, 0x40, 0xb3, 0x78, 0xf5, - 0xf6, 0x9a, 0x99, 0x32, 0xc2, 0xbc, 0x98, 0x3d, 0xf4, 0x97, 0x37, 0x3a, 0x74, 0x06, 0xaf, 0x3a, - 0xf3, 0x57, 0x68, 0x63, 0x30, 0xc6, 0x51, 0x04, 0xc1, 0x39, 0xd3, 0x2c, 0x68, 0xfe, 0x18, 0x21, - 0x92, 0x49, 0x14, 0x7b, 0x66, 0x99, 0x6e, 0xe5, 0x92, 0x13, 0x7f, 0x6a, 0x6e, 0x2d, 0x4e, 0xcd, - 0x2d, 0xcb, 0x41, 0x9b, 0x17, 0x82, 0xfc, 0xa6, 0x78, 0xc0, 0x3c, 0x8e, 0x85, 0x79, 0x07, 0x2d, - 0xab, 0xf6, 0xcb, 0x81, 0x9a, 0xce, 0x52, 0x2a, 0xc8, 0x89, 0x6f, 0xee, 0xd7, 0x1f, 0x49, 0x2c, - 0x76, 0xa9, 0x2f, 0x3a, 0x8b, 0xbd, 0xc6, 0x7e, 0xd3, 0xd9, 0x48, 0x2a, 0xf3, 0x13, 0x5f, 0x58, - 0xbf, 0x45, 0xed, 0x1a, 0xa0, 0xb9, 0x81, 0x16, 0x4b, 0xac, 0x45, 0xea, 0x9b, 0xf7, 0xd1, 0x4e, - 0x05, 0x34, 0xcd, 0xfd, 0x19, 0x62, 0xcb, 0xb9, 0x5b, 0x2a, 0x4c, 0xd1, 0xbf, 0xb0, 0x1e, 0xa3, - 0xed, 0x93, 0x8a, 0x2f, 0xca, 0xc9, 0x32, 0x15, 0xa1, 0x31, 0x3d, 0x99, 0x77, 0x51, 0xab, 0xfc, - 0x25, 0xa0, 0xa3, 0x6f, 0x3a, 0x95, 0xc0, 0x0a, 0xd1, 0xad, 0x0b, 0x41, 0xce, 0x20, 0xf2, 0x2b, - 0xb0, 0x57, 0x24, 0xe0, 0x78, 0x16, 0x68, 0xee, 0x97, 0x66, 0x75, 0xdc, 0xfb, 0x68, 0xab, 0x8c, - 0xa8, 0x9a, 0x24, 0xaa, 0x01, 0xf2, 0x42, 0xd6, 0x47, 0xae, 0x39, 0xc5, 0xf2, 0x7e, 0x53, 0x3f, - 0x66, 0xde, 0x47, 0x5b, 0xd7, 0x0c, 0xa0, 0x1f, 0x34, 0x0b, 0xab, 0xd3, 0x72, 0x93, 0x5f, 0x53, - 0x21, 0xcd, 0x8b, 0xd9, 0x3e, 0x9a, 0x77, 0x08, 0x5e, 0xe3, 0x7a, 0xbd, 0x03, 0xff, 0x6e, 0xa0, - 0xce, 0x29, 0x4c, 0x8e, 0x84, 0xa0, 0xa3, 0x28, 0x84, 0x48, 0x2a, 0x72, 0xc3, 0x04, 0xd4, 0xa7, - 0xf9, 0x07, 0xb4, 0x5e, 0x12, 0x43, 0xc9, 0x07, 0xaf, 0x33, 0x7d, 0xd7, 0x0a, 0x05, 0x4d, 0x21, - 0xf7, 0x11, 0x8a, 0x39, 0xa4, 0x2e, 0x71, 0x2f, 0x61, 0x92, 0xdf, 0xce, 0x6e, 0x7d, 0xaa, 0x66, - 0xbf, 0xbf, 0xec, 0x61, 0xe2, 0x05, 0x94, 0x9c, 0xc2, 0xc4, 0x59, 0x55, 0xfa, 0x83, 0x53, 0x98, - 0xa8, 0xf7, 0x55, 0xcc, 0x9e, 0x01, 0xd7, 0xa3, 0xb0, 0xe1, 0x64, 0x0b, 0xeb, 0x1f, 0x06, 0xba, - 0x7b, 0x81, 0x03, 0xea, 0x63, 0xc9, 0x78, 0x11, 0xf9, 0x30, 0xf1, 0x94, 0xc5, 0xf7, 0x94, 0xdb, - 0x4b, 0x71, 0x2e, 0xbe, 0xd1, 0x38, 0x3f, 0x42, 0x6b, 0x65, 0xcb, 0xa8, 0x48, 0x1b, 0x73, 0x44, - 0xda, 0x2e, 0x2c, 0x4e, 0x61, 0x62, 0xfd, 0xb7, 0x1e, 0xd6, 0xf1, 0xa4, 0x5e, 0x1f, 0x3f, 0x10, - 0x56, 0x79, 0xee, 0x8d, 0xc3, 0xba, 0xae, 0x6e, 0xca, 0x30, 0xf4, 0xc9, 0x2f, 0x65, 0xad, 0xf1, - 0x26, 0xb3, 0x66, 0xfd, 0xd5, 0x40, 0xdb, 0xf5, 0x48, 0xc5, 0x39, 0x1b, 0xf2, 0x24, 0x82, 0xef, - 0x8b, 0xb8, 0x62, 0x81, 0xc5, 0x3a, 0x0b, 0xb8, 0x68, 0x63, 0x2a, 0x11, 0xe2, 0x46, 0xae, 0x5e, - 0xd3, 0x8e, 0xce, 0x7a, 0x3d, 0x13, 0xe2, 0xf8, 0x8b, 0x6f, 0xae, 0xba, 0xc6, 0xb7, 0x57, 0x5d, - 0xe3, 0xdf, 0x57, 0x5d, 0xe3, 0xcb, 0x17, 0xdd, 0x85, 0x6f, 0x5f, 0x74, 0x17, 0xfe, 0xf9, 0xa2, - 0xbb, 0xf0, 0xbb, 0x0f, 0x47, 0x54, 0x8e, 0x13, 0xcf, 0x26, 0x2c, 0xec, 0xe7, 0xff, 0x09, 0x54, - 0x67, 0xbe, 0x5b, 0xfe, 0xc5, 0x92, 0x1e, 0xf6, 0x9f, 0x4f, 0xff, 0xcf, 0x22, 0x27, 0x31, 0x08, - 0x6f, 0x59, 0x93, 0xd4, 0x7b, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xe3, 0xe8, 0xf1, 0x4f, 0x98, - 0x11, 0x00, 0x00, + // 1576 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x57, 0x4b, 0x73, 0x1c, 0x47, + 0x1d, 0xd7, 0x68, 0xf5, 0xda, 0x5e, 0x3d, 0xec, 0xb1, 0x1c, 0xaf, 0x8c, 0x58, 0x6d, 0x26, 0x90, + 0x12, 0x95, 0xca, 0x2c, 0x52, 0x2e, 0x94, 0x8b, 0x54, 0x4a, 0x5a, 0xc7, 0xb1, 0x10, 0x89, 0x37, + 0x23, 0x21, 0x17, 0x70, 0x98, 0xea, 0xe9, 0xf9, 0x7b, 0xb7, 0x4b, 0x33, 0xd3, 0xe3, 0xee, 0x9e, + 0xb1, 0xf7, 0xc2, 0x99, 0x63, 0x28, 0x2e, 0x29, 0xb8, 0x84, 0x4f, 0xc0, 0xd7, 0xc8, 0x31, 0x47, + 0x4e, 0x81, 0x92, 0x0f, 0x1c, 0xf8, 0x12, 0x54, 0xf7, 0xbc, 0x57, 0xb2, 0x59, 0x17, 0x70, 0x9b, + 0xfe, 0x3f, 0x7e, 0xfd, 0xeb, 0xfe, 0xbf, 0x7a, 0xd0, 0x21, 0x8d, 0x24, 0x70, 0x32, 0xc1, 0x34, + 0x72, 0x05, 0x90, 0x84, 0x53, 0x39, 0x1d, 0x10, 0x92, 0x0e, 0x62, 0xce, 0x52, 0xea, 0x03, 0x1f, + 0xa4, 0x07, 0xe5, 0xb7, 0x1d, 0x73, 0x26, 0x99, 0xf9, 0xde, 0x0d, 0x3e, 0x36, 0x21, 0xa9, 0x5d, + 0xda, 0xa5, 0x07, 0xf7, 0xb7, 0xc7, 0x6c, 0xcc, 0xb4, 0xfd, 0x40, 0x7d, 0x65, 0xae, 0xf7, 0xf7, + 0xc6, 0x8c, 0x8d, 0x03, 0x18, 0xe8, 0x95, 0x97, 0x3c, 0x1b, 0x48, 0x1a, 0x82, 0x90, 0x38, 0x8c, + 0x73, 0x83, 0xde, 0xac, 0x81, 0x9f, 0x70, 0x2c, 0x29, 0x8b, 0x0a, 0x00, 0xea, 0x91, 0x01, 0x61, + 0x1c, 0x06, 0x24, 0xa0, 0x10, 0x49, 0x45, 0x2f, 0xfb, 0xca, 0x0d, 0x06, 0xca, 0x20, 0xa0, 0xe3, + 0x89, 0xcc, 0xc4, 0x62, 0x20, 0x21, 0xf2, 0x81, 0x87, 0x34, 0x33, 0xae, 0x56, 0xb9, 0xc3, 0x6e, + 0x4d, 0x4f, 0xf8, 0x34, 0x96, 0x6c, 0x70, 0x09, 0x53, 0x91, 0x6b, 0xdf, 0x27, 0x4c, 0x84, 0x4c, + 0x0c, 0x40, 0x1d, 0x2c, 0x22, 0x30, 0x48, 0x0f, 0x3c, 0x90, 0xf8, 0xa0, 0x14, 0x14, 0xbc, 0x73, + 0x3b, 0x0f, 0x8b, 0xca, 0x86, 0x30, 0x9a, 0xf3, 0xb6, 0xfe, 0xb8, 0x82, 0xba, 0x43, 0x16, 0x89, + 0x24, 0x04, 0x7e, 0xe4, 0xfb, 0x54, 0x1d, 0x69, 0xc4, 0x59, 0xcc, 0x04, 0x0e, 0xcc, 0x6d, 0xb4, + 0x2c, 0xa9, 0x0c, 0xa0, 0x6b, 0xf4, 0x8d, 0xfd, 0xb6, 0x93, 0x2d, 0xcc, 0x3e, 0xea, 0xf8, 0x20, + 0x08, 0xa7, 0xb1, 0x32, 0xee, 0x2e, 0x6a, 0x5d, 0x5d, 0x64, 0xee, 0xa0, 0xb5, 0x2c, 0x0a, 0xd4, + 0xef, 0xb6, 0xb4, 0x7a, 0x55, 0xaf, 0x4f, 0x7c, 0xf3, 0x33, 0xb4, 0x49, 0x23, 0x2a, 0x29, 0x0e, + 0xdc, 0x09, 0xa8, 0xdb, 0xe8, 0x2e, 0xf5, 0x8d, 0xfd, 0xce, 0xe1, 0x7d, 0x9b, 0x7a, 0xc4, 0x56, + 0x17, 0x68, 0xe7, 0xd7, 0x96, 0x1e, 0xd8, 0x8f, 0xb5, 0xc5, 0xf1, 0xd2, 0xb7, 0xdf, 0xef, 0x2d, + 0x38, 0x1b, 0xb9, 0x5f, 0x26, 0x34, 0xdf, 0x45, 0xeb, 0x63, 0x88, 0x40, 0x50, 0xe1, 0x4e, 0xb0, + 0x98, 0x74, 0x97, 0xfb, 0xc6, 0xfe, 0xba, 0xd3, 0xc9, 0x65, 0x8f, 0xb1, 0x98, 0x98, 0x7b, 0xa8, + 0xe3, 0xd1, 0x08, 0xf3, 0x69, 0x66, 0xb1, 0xa2, 0x2d, 0x50, 0x26, 0xd2, 0x06, 0x43, 0x84, 0x44, + 0x8c, 0x5f, 0x44, 0xae, 0x8a, 0x76, 0x77, 0x35, 0x27, 0x92, 0x45, 0xda, 0x2e, 0x22, 0x6d, 0x9f, + 0x17, 0xa9, 0x70, 0xbc, 0xa6, 0x88, 0x7c, 0xf5, 0xf7, 0x3d, 0xc3, 0x69, 0x6b, 0x3f, 0xa5, 0x31, + 0xbf, 0x40, 0xb7, 0x92, 0xc8, 0x63, 0x91, 0x4f, 0xa3, 0xb1, 0x1b, 0x03, 0xa7, 0xcc, 0xef, 0xae, + 0x69, 0xa8, 0x9d, 0x6b, 0x50, 0x0f, 0xf3, 0xa4, 0xc9, 0x90, 0xbe, 0x56, 0x48, 0x5b, 0xa5, 0xf3, + 0x48, 0xfb, 0x9a, 0x5f, 0x22, 0x93, 0x90, 0x54, 0x53, 0x62, 0x89, 0x2c, 0x10, 0xdb, 0xf3, 0x23, + 0xde, 0x22, 0x24, 0x3d, 0xcf, 0xbc, 0x73, 0xc8, 0xdf, 0xa2, 0x7b, 0x92, 0xe3, 0x48, 0x3c, 0x03, + 0x3e, 0x8b, 0x8b, 0xe6, 0xc7, 0xbd, 0x5b, 0x60, 0x34, 0xc1, 0x1f, 0xa3, 0x3e, 0xc9, 0x13, 0xc8, + 0xe5, 0xe0, 0x53, 0x21, 0x39, 0xf5, 0x12, 0xe5, 0xeb, 0x3e, 0xe3, 0x98, 0xe8, 0x1c, 0xe9, 0xe8, + 0x24, 0xe8, 0x15, 0x76, 0x4e, 0xc3, 0xec, 0x51, 0x6e, 0x65, 0x3e, 0x41, 0x3f, 0xf2, 0x02, 0x46, + 0x2e, 0x85, 0x22, 0xe7, 0x36, 0x90, 0xf4, 0xd6, 0x21, 0x15, 0x42, 0xa1, 0xad, 0xf7, 0x8d, 0xfd, + 0x96, 0xf3, 0x6e, 0x66, 0x3b, 0x02, 0xfe, 0xb0, 0x66, 0x79, 0x5e, 0x33, 0x34, 0x3f, 0x44, 0xe6, + 0x84, 0x0a, 0xc9, 0x38, 0x25, 0x38, 0x70, 0x21, 0x92, 0x9c, 0x82, 0xe8, 0x6e, 0x68, 0xf7, 0xdb, + 0x95, 0xe6, 0xd3, 0x4c, 0xf1, 0x60, 0xed, 0xf7, 0xdf, 0xec, 0x2d, 0x7c, 0xfd, 0xcd, 0xde, 0x82, + 0xf5, 0x57, 0x03, 0xdd, 0x1b, 0x96, 0x64, 0x43, 0x96, 0xe2, 0xe0, 0xff, 0x59, 0x14, 0x47, 0xa8, + 0x2d, 0x24, 0x8b, 0xb3, 0x34, 0x5c, 0x7a, 0x8b, 0x34, 0x5c, 0x53, 0x6e, 0x4a, 0x61, 0xfd, 0xd9, + 0x40, 0xdb, 0x9f, 0x3e, 0x4f, 0x68, 0xca, 0x08, 0xfe, 0x9f, 0xd4, 0xf0, 0x29, 0xda, 0x80, 0x1a, + 0x9e, 0xe8, 0xb6, 0xfa, 0xad, 0xfd, 0xce, 0xe1, 0x8f, 0xed, 0xac, 0xa1, 0xd8, 0x65, 0x9f, 0xc9, + 0x9b, 0x8a, 0x5d, 0xdf, 0xdd, 0x69, 0xfa, 0x5a, 0xff, 0x32, 0xd0, 0xad, 0xcf, 0x02, 0xe6, 0xe1, + 0xe0, 0x2c, 0xc0, 0x62, 0xa2, 0x2e, 0x7c, 0xaa, 0x4e, 0xcd, 0x21, 0xcf, 0x74, 0xcd, 0x6e, 0xee, + 0x53, 0x2b, 0x37, 0x5d, 0x7b, 0x9f, 0xa0, 0xdb, 0x65, 0xee, 0x95, 0x97, 0xab, 0x0f, 0x73, 0x7c, + 0xe7, 0xea, 0xfb, 0xbd, 0xad, 0x22, 0x86, 0x43, 0x7d, 0xd1, 0x0f, 0x9d, 0x2d, 0xd2, 0x10, 0xf8, + 0x66, 0x0f, 0x75, 0xa8, 0x47, 0x5c, 0x01, 0xcf, 0xdd, 0x28, 0x09, 0x75, 0x5c, 0x96, 0x9c, 0x36, + 0xf5, 0xc8, 0x19, 0x3c, 0xff, 0x22, 0x09, 0xcd, 0x8f, 0xd0, 0x3b, 0xc5, 0xf0, 0x70, 0x53, 0x1c, + 0xb8, 0xca, 0xdf, 0xc5, 0xbe, 0xcf, 0x75, 0x98, 0xd6, 0x9d, 0x3b, 0x85, 0xf6, 0x02, 0x07, 0x6a, + 0xb3, 0x23, 0xdf, 0xe7, 0xd6, 0x3f, 0x97, 0xd1, 0xca, 0x08, 0x73, 0x1c, 0x0a, 0xf3, 0x1c, 0x6d, + 0x49, 0x08, 0xe3, 0x00, 0x4b, 0x70, 0xb3, 0xbe, 0x96, 0x9f, 0xf4, 0x03, 0xdd, 0xef, 0xea, 0xf3, + 0xc0, 0xae, 0x4d, 0x80, 0xf4, 0xc0, 0x1e, 0x6a, 0xe9, 0x99, 0xc4, 0x12, 0x9c, 0xcd, 0x02, 0x23, + 0x13, 0x9a, 0x3f, 0x43, 0x5d, 0xc9, 0x13, 0x21, 0xab, 0x8e, 0x53, 0x95, 0x5a, 0x16, 0xca, 0x77, + 0x0a, 0x7d, 0x56, 0xa4, 0x65, 0x89, 0xdd, 0xdc, 0x5c, 0x5a, 0xff, 0x4d, 0x73, 0x39, 0x43, 0x77, + 0x54, 0x67, 0x9e, 0xc5, 0x5c, 0x9a, 0x1f, 0xf3, 0xb6, 0xf2, 0x6f, 0x82, 0x7e, 0x89, 0xcc, 0x54, + 0x90, 0x59, 0xcc, 0xe5, 0xb7, 0xe0, 0x99, 0x0a, 0xd2, 0x84, 0xf4, 0xd1, 0xae, 0x50, 0xc9, 0xe7, + 0x86, 0x20, 0x75, 0xab, 0x8a, 0x03, 0x88, 0xa8, 0x98, 0x14, 0xe0, 0x2b, 0xf3, 0x83, 0xef, 0x68, + 0xa0, 0xcf, 0x15, 0x8e, 0x53, 0xc0, 0xe4, 0xbb, 0x0c, 0x51, 0xef, 0xe6, 0x5d, 0xca, 0x00, 0xad, + 0xea, 0x00, 0xfd, 0xe0, 0x06, 0x88, 0x32, 0x4a, 0x87, 0xe8, 0x6e, 0x88, 0x5f, 0xba, 0x72, 0xc2, + 0x99, 0x94, 0x01, 0xf8, 0x6e, 0x8c, 0xc9, 0x25, 0x48, 0xa1, 0xe7, 0x4a, 0xcb, 0xb9, 0x13, 0xe2, + 0x97, 0xe7, 0x85, 0x6e, 0x94, 0xa9, 0x4c, 0x81, 0xde, 0xaf, 0xb5, 0xe1, 0x17, 0x98, 0xfb, 0xae, + 0x0f, 0x11, 0x0b, 0x5d, 0x0e, 0x63, 0xd5, 0x1f, 0x71, 0xd6, 0x91, 0x01, 0xca, 0x51, 0x92, 0x17, + 0xb2, 0x7a, 0x19, 0x94, 0x45, 0x3c, 0x64, 0x34, 0xca, 0xe7, 0xad, 0x55, 0x75, 0x6b, 0x85, 0xf6, + 0x50, 0x81, 0x39, 0x35, 0xac, 0x47, 0x00, 0x96, 0x87, 0x6e, 0x3f, 0xc6, 0x91, 0x2f, 0x26, 0xf8, + 0x12, 0x3e, 0x07, 0x89, 0x7d, 0x2c, 0x71, 0xa3, 0x66, 0x9e, 0x01, 0xb8, 0x31, 0x63, 0x41, 0x56, + 0x33, 0x59, 0x0b, 0x2a, 0x6b, 0xe6, 0x11, 0xc0, 0x88, 0xb1, 0x40, 0xd5, 0x8c, 0xd9, 0x45, 0xab, + 0x29, 0x70, 0x51, 0x65, 0x70, 0xb1, 0xb4, 0x7e, 0x82, 0xda, 0xba, 0x69, 0x1c, 0x91, 0x4b, 0x61, + 0xee, 0xa2, 0xb6, 0x42, 0x02, 0x21, 0x40, 0x74, 0x8d, 0x7e, 0x6b, 0xbf, 0xed, 0x54, 0x02, 0x4b, + 0xa2, 0x9d, 0xd7, 0xbd, 0x65, 0x84, 0xf9, 0x14, 0xad, 0xc6, 0xa0, 0x07, 0xad, 0x76, 0xec, 0x1c, + 0x7e, 0x6c, 0xcf, 0xf1, 0x5e, 0xb4, 0x5f, 0x07, 0xe8, 0x14, 0x68, 0xd6, 0x07, 0xa8, 0x73, 0x94, + 0x51, 0xf8, 0x25, 0x15, 0xf2, 0x3a, 0xc5, 0xf5, 0x3a, 0x45, 0x5e, 0x3d, 0xb7, 0x66, 0x06, 0x8b, + 0x30, 0x2f, 0x66, 0x19, 0xfe, 0xfc, 0xad, 0x18, 0xce, 0xe0, 0x55, 0x04, 0x7f, 0x81, 0x36, 0x87, + 0x13, 0x1c, 0x45, 0x10, 0x9c, 0x33, 0xdd, 0xf8, 0xcc, 0x1f, 0x22, 0x44, 0x32, 0x89, 0x6a, 0x98, + 0x59, 0x58, 0xda, 0xb9, 0xe4, 0xc4, 0x6f, 0x8c, 0xaa, 0xc5, 0xc6, 0xa8, 0xb2, 0x1c, 0xb4, 0x75, + 0x21, 0xc8, 0xaf, 0x8a, 0x37, 0xcb, 0x93, 0x58, 0x98, 0x77, 0xd1, 0x8a, 0xaa, 0xd5, 0x1c, 0x68, + 0xc9, 0x59, 0x4e, 0x05, 0x39, 0xf1, 0xcd, 0xfd, 0xfa, 0xbb, 0x88, 0xc5, 0x2e, 0xf5, 0x45, 0x77, + 0xb1, 0xdf, 0xda, 0x5f, 0x72, 0x36, 0x93, 0xca, 0xfd, 0xc4, 0x17, 0xd6, 0xaf, 0x51, 0xa7, 0x06, + 0x68, 0x6e, 0xa2, 0xc5, 0x12, 0x6b, 0x91, 0xfa, 0xe6, 0x03, 0xb4, 0x53, 0x01, 0x35, 0xdb, 0x7d, + 0x86, 0xd8, 0x76, 0xee, 0x95, 0x06, 0x8d, 0x8e, 0x2f, 0xac, 0x27, 0x68, 0xfb, 0xa4, 0x6a, 0x2e, + 0xe5, 0x30, 0x69, 0x9c, 0xd0, 0x68, 0x0e, 0xe3, 0x5d, 0xd4, 0x2e, 0x1f, 0xff, 0xfa, 0xf4, 0x4b, + 0x4e, 0x25, 0xb0, 0x42, 0x74, 0xeb, 0x42, 0x90, 0x33, 0x88, 0xfc, 0x0a, 0xec, 0x35, 0x17, 0x70, + 0x3c, 0x0b, 0x34, 0xf7, 0xe3, 0xb2, 0xda, 0xee, 0x0f, 0x06, 0xea, 0x9e, 0xc2, 0xf4, 0x48, 0x08, + 0x3a, 0x8e, 0x42, 0x88, 0xa4, 0x6a, 0x16, 0x98, 0x80, 0xfa, 0x34, 0xdf, 0x43, 0x1b, 0x65, 0xa1, + 0x95, 0xf5, 0xb5, 0xee, 0xac, 0x17, 0x42, 0x5d, 0x58, 0x0f, 0x10, 0x8a, 0x39, 0xa4, 0x2e, 0x71, + 0x2f, 0x61, 0x9a, 0xd3, 0xd8, 0xad, 0xcf, 0x9a, 0xec, 0xdf, 0xc2, 0x1e, 0x25, 0x5e, 0x40, 0xc9, + 0x29, 0x4c, 0x9d, 0x35, 0x65, 0x3f, 0x3c, 0x85, 0xa9, 0x7a, 0x3b, 0xc4, 0xec, 0x05, 0x70, 0x3d, + 0x20, 0x5a, 0x4e, 0xb6, 0xb0, 0xfe, 0x64, 0xa0, 0x7b, 0x17, 0x38, 0xa0, 0x3e, 0x96, 0x8c, 0x17, + 0xf7, 0x3d, 0x4a, 0x3c, 0xe5, 0xf1, 0x86, 0x7b, 0xbd, 0xc6, 0x76, 0xf1, 0x06, 0xb6, 0x9f, 0xa0, + 0xf5, 0x32, 0xc2, 0x8a, 0x6f, 0x6b, 0x0e, 0xbe, 0x9d, 0xc2, 0xe3, 0x14, 0xa6, 0xd6, 0xef, 0x6a, + 0xdc, 0x8e, 0xa7, 0xb5, 0xe2, 0xe5, 0xff, 0x81, 0x5b, 0xb9, 0x6d, 0x9d, 0x1b, 0xa9, 0xfb, 0x5f, + 0x3b, 0x40, 0xeb, 0xfa, 0x01, 0xac, 0xbf, 0x18, 0x68, 0xbb, 0xbe, 0xab, 0x38, 0x67, 0x23, 0x9e, + 0x44, 0xf0, 0xa6, 0xdd, 0xab, 0xfc, 0x59, 0xac, 0xe7, 0xcf, 0x53, 0xb4, 0xd9, 0x20, 0x25, 0xf2, + 0xdb, 0xf8, 0xe9, 0x5c, 0x5d, 0xa1, 0xd6, 0x92, 0x9c, 0x8d, 0xfa, 0x39, 0xc4, 0xf1, 0xd3, 0x6f, + 0xaf, 0x7a, 0xc6, 0x77, 0x57, 0x3d, 0xe3, 0x1f, 0x57, 0x3d, 0xe3, 0xab, 0x57, 0xbd, 0x85, 0xef, + 0x5e, 0xf5, 0x16, 0xfe, 0xf6, 0xaa, 0xb7, 0xf0, 0x9b, 0x8f, 0xc7, 0x54, 0x4e, 0x12, 0xcf, 0x26, + 0x2c, 0x1c, 0xe4, 0x3f, 0x8e, 0xd5, 0x5e, 0x1f, 0x96, 0xff, 0xe1, 0xe9, 0xe1, 0xe0, 0x65, 0xf3, + 0x67, 0x5c, 0x4e, 0x63, 0x10, 0xde, 0x8a, 0x4e, 0xeb, 0x8f, 0xfe, 0x1d, 0x00, 0x00, 0xff, 0xff, + 0x40, 0xf6, 0xbb, 0xdd, 0xbd, 0x0f, 0x00, 0x00, } func (m *ConsumerAdditionProposal) Marshal() (dAtA []byte, err error) { @@ -1658,15 +1562,10 @@ func (m *GlobalSlashEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.ProviderValConsAddr != nil { - { - size, err := m.ProviderValConsAddr.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintProvider(dAtA, i, uint64(size)) - } + if len(m.ProviderValConsAddr) > 0 { + i -= len(m.ProviderValConsAddr) + copy(dAtA[i:], m.ProviderValConsAddr) + i = encodeVarintProvider(dAtA, i, uint64(len(m.ProviderValConsAddr))) i-- dAtA[i] = 0x22 } @@ -1682,12 +1581,12 @@ func (m *GlobalSlashEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x12 } - n8, err8 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.RecvTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.RecvTime):]) - if err8 != nil { - return 0, err8 + n7, err7 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.RecvTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.RecvTime):]) + if err7 != nil { + return 0, err7 } - i -= n8 - i = encodeVarintProvider(dAtA, i, uint64(n8)) + i -= n7 + i = encodeVarintProvider(dAtA, i, uint64(n7)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil @@ -1735,37 +1634,37 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x3a } - n10, err10 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.SlashMeterReplenishPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.SlashMeterReplenishPeriod):]) + n9, err9 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.SlashMeterReplenishPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.SlashMeterReplenishPeriod):]) + if err9 != nil { + return 0, err9 + } + i -= n9 + i = encodeVarintProvider(dAtA, i, uint64(n9)) + i-- + dAtA[i] = 0x32 + n10, err10 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.VscTimeoutPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.VscTimeoutPeriod):]) if err10 != nil { return 0, err10 } i -= n10 i = encodeVarintProvider(dAtA, i, uint64(n10)) i-- - dAtA[i] = 0x32 - n11, err11 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.VscTimeoutPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.VscTimeoutPeriod):]) + dAtA[i] = 0x2a + n11, err11 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.InitTimeoutPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.InitTimeoutPeriod):]) if err11 != nil { return 0, err11 } i -= n11 i = encodeVarintProvider(dAtA, i, uint64(n11)) i-- - dAtA[i] = 0x2a - n12, err12 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.InitTimeoutPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.InitTimeoutPeriod):]) + dAtA[i] = 0x22 + n12, err12 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.CcvTimeoutPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.CcvTimeoutPeriod):]) if err12 != nil { return 0, err12 } i -= n12 i = encodeVarintProvider(dAtA, i, uint64(n12)) i-- - dAtA[i] = 0x22 - n13, err13 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.CcvTimeoutPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.CcvTimeoutPeriod):]) - if err13 != nil { - return 0, err13 - } - i -= n13 - i = encodeVarintProvider(dAtA, i, uint64(n13)) - i-- dAtA[i] = 0x1a if len(m.TrustingPeriodFraction) > 0 { i -= len(m.TrustingPeriodFraction) @@ -1895,6 +1794,38 @@ func (m *ConsumerAdditionProposals) MarshalToSizedBuffer(dAtA []byte) (int, erro return len(dAtA) - i, nil } +func (m *AddressList) 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 *AddressList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AddressList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Addresses) > 0 { + for iNdEx := len(m.Addresses) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Addresses[iNdEx]) + copy(dAtA[i:], m.Addresses[iNdEx]) + i = encodeVarintProvider(dAtA, i, uint64(len(m.Addresses[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *ConsumerRemovalProposals) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1990,20 +1921,20 @@ func (m *VscUnbondingOps) MarshalToSizedBuffer(dAtA []byte) (int, error) { var l int _ = l if len(m.UnbondingOpIds) > 0 { - dAtA16 := make([]byte, len(m.UnbondingOpIds)*10) - var j15 int + dAtA15 := make([]byte, len(m.UnbondingOpIds)*10) + var j14 int for _, num := range m.UnbondingOpIds { for num >= 1<<7 { - dAtA16[j15] = uint8(uint64(num)&0x7f | 0x80) + dAtA15[j14] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j15++ + j14++ } - dAtA16[j15] = uint8(num) - j15++ + dAtA15[j14] = uint8(num) + j14++ } - i -= j15 - copy(dAtA[i:], dAtA16[:j15]) - i = encodeVarintProvider(dAtA, i, uint64(j15)) + i -= j14 + copy(dAtA[i:], dAtA15[:j14]) + i = encodeVarintProvider(dAtA, i, uint64(j14)) i-- dAtA[i] = 0x12 } @@ -2107,12 +2038,12 @@ func (m *VscSendTimestamp) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - n17, err17 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Timestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp):]) - if err17 != nil { - return 0, err17 + n16, err16 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Timestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp):]) + if err16 != nil { + return 0, err16 } - i -= n17 - i = encodeVarintProvider(dAtA, i, uint64(n17)) + i -= n16 + i = encodeVarintProvider(dAtA, i, uint64(n16)) i-- dAtA[i] = 0x12 if m.VscId != 0 { @@ -2123,7 +2054,7 @@ func (m *VscSendTimestamp) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ConsumerConsAddress) Marshal() (dAtA []byte, err error) { +func (m *KeyAssignmentReplacement) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2133,27 +2064,44 @@ func (m *ConsumerConsAddress) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ConsumerConsAddress) MarshalTo(dAtA []byte) (int, error) { +func (m *KeyAssignmentReplacement) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ConsumerConsAddress) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *KeyAssignmentReplacement) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Address) > 0 { - i -= len(m.Address) - copy(dAtA[i:], m.Address) - i = encodeVarintProvider(dAtA, i, uint64(len(m.Address))) + if m.Power != 0 { + i = encodeVarintProvider(dAtA, i, uint64(m.Power)) + i-- + dAtA[i] = 0x18 + } + if m.PrevCKey != nil { + { + size, err := m.PrevCKey.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProvider(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.ProviderAddr) > 0 { + i -= len(m.ProviderAddr) + copy(dAtA[i:], m.ProviderAddr) + i = encodeVarintProvider(dAtA, i, uint64(len(m.ProviderAddr))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *ProviderConsAddress) Marshal() (dAtA []byte, err error) { +func (m *ValidatorConsumerPubKey) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2163,27 +2111,46 @@ func (m *ProviderConsAddress) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ProviderConsAddress) MarshalTo(dAtA []byte) (int, error) { +func (m *ValidatorConsumerPubKey) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ProviderConsAddress) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ValidatorConsumerPubKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Address) > 0 { - i -= len(m.Address) - copy(dAtA[i:], m.Address) - i = encodeVarintProvider(dAtA, i, uint64(len(m.Address))) + if m.ConsumerKey != nil { + { + size, err := m.ConsumerKey.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProvider(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if len(m.ProviderAddr) > 0 { + i -= len(m.ProviderAddr) + copy(dAtA[i:], m.ProviderAddr) + i = encodeVarintProvider(dAtA, i, uint64(len(m.ProviderAddr))) + i-- + dAtA[i] = 0x12 + } + if len(m.ChainId) > 0 { + i -= len(m.ChainId) + copy(dAtA[i:], m.ChainId) + i = encodeVarintProvider(dAtA, i, uint64(len(m.ChainId))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *ConsumerAddressList) Marshal() (dAtA []byte, err error) { +func (m *ValidatorByConsumerAddr) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2193,34 +2160,41 @@ func (m *ConsumerAddressList) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ConsumerAddressList) MarshalTo(dAtA []byte) (int, error) { +func (m *ValidatorByConsumerAddr) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ConsumerAddressList) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ValidatorByConsumerAddr) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Addresses) > 0 { - for iNdEx := len(m.Addresses) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Addresses[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintProvider(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } + if len(m.ProviderAddr) > 0 { + i -= len(m.ProviderAddr) + copy(dAtA[i:], m.ProviderAddr) + i = encodeVarintProvider(dAtA, i, uint64(len(m.ProviderAddr))) + i-- + dAtA[i] = 0x1a + } + if len(m.ConsumerAddr) > 0 { + i -= len(m.ConsumerAddr) + copy(dAtA[i:], m.ConsumerAddr) + i = encodeVarintProvider(dAtA, i, uint64(len(m.ConsumerAddr))) + i-- + dAtA[i] = 0x12 + } + if len(m.ChainId) > 0 { + i -= len(m.ChainId) + copy(dAtA[i:], m.ChainId) + i = encodeVarintProvider(dAtA, i, uint64(len(m.ChainId))) + i-- + dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *KeyAssignmentReplacement) Marshal() (dAtA []byte, err error) { +func (m *ConsumerAddrsToPrune) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2230,177 +2204,17 @@ func (m *KeyAssignmentReplacement) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *KeyAssignmentReplacement) MarshalTo(dAtA []byte) (int, error) { +func (m *ConsumerAddrsToPrune) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *KeyAssignmentReplacement) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ConsumerAddrsToPrune) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.Power != 0 { - i = encodeVarintProvider(dAtA, i, uint64(m.Power)) - i-- - dAtA[i] = 0x18 - } - if m.PrevCKey != nil { - { - size, err := m.PrevCKey.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintProvider(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if m.ProviderAddr != nil { - { - size, err := m.ProviderAddr.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintProvider(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ValidatorConsumerPubKey) 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 *ValidatorConsumerPubKey) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ValidatorConsumerPubKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.ConsumerKey != nil { - { - size, err := m.ConsumerKey.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintProvider(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - if m.ProviderAddr != nil { - { - size, err := m.ProviderAddr.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintProvider(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.ChainId) > 0 { - i -= len(m.ChainId) - copy(dAtA[i:], m.ChainId) - i = encodeVarintProvider(dAtA, i, uint64(len(m.ChainId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ValidatorByConsumerAddr) 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 *ValidatorByConsumerAddr) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ValidatorByConsumerAddr) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.ProviderAddr != nil { - { - size, err := m.ProviderAddr.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintProvider(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - if m.ConsumerAddr != nil { - { - size, err := m.ConsumerAddr.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintProvider(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.ChainId) > 0 { - i -= len(m.ChainId) - copy(dAtA[i:], m.ChainId) - i = encodeVarintProvider(dAtA, i, uint64(len(m.ChainId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ConsumerAddrsToPrune) 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 *ConsumerAddrsToPrune) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ConsumerAddrsToPrune) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.ConsumerAddrs != nil { + if m.ConsumerAddrs != nil { { size, err := m.ConsumerAddrs.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -2548,8 +2362,8 @@ func (m *GlobalSlashEntry) Size() (n int) { if m.IbcSeqNum != 0 { n += 1 + sovProvider(uint64(m.IbcSeqNum)) } - if m.ProviderValConsAddr != nil { - l = m.ProviderValConsAddr.Size() + l = len(m.ProviderValConsAddr) + if l > 0 { n += 1 + l + sovProvider(uint64(l)) } return n @@ -2636,6 +2450,21 @@ func (m *ConsumerAdditionProposals) Size() (n int) { return n } +func (m *AddressList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Addresses) > 0 { + for _, b := range m.Addresses { + l = len(b) + n += 1 + l + sovProvider(uint64(l)) + } + } + return n +} + func (m *ConsumerRemovalProposals) Size() (n int) { if m == nil { return 0 @@ -2735,55 +2564,14 @@ func (m *VscSendTimestamp) Size() (n int) { return n } -func (m *ConsumerConsAddress) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Address) - if l > 0 { - n += 1 + l + sovProvider(uint64(l)) - } - return n -} - -func (m *ProviderConsAddress) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Address) - if l > 0 { - n += 1 + l + sovProvider(uint64(l)) - } - return n -} - -func (m *ConsumerAddressList) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Addresses) > 0 { - for _, e := range m.Addresses { - l = e.Size() - n += 1 + l + sovProvider(uint64(l)) - } - } - return n -} - func (m *KeyAssignmentReplacement) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.ProviderAddr != nil { - l = m.ProviderAddr.Size() + l = len(m.ProviderAddr) + if l > 0 { n += 1 + l + sovProvider(uint64(l)) } if m.PrevCKey != nil { @@ -2806,8 +2594,8 @@ func (m *ValidatorConsumerPubKey) Size() (n int) { if l > 0 { n += 1 + l + sovProvider(uint64(l)) } - if m.ProviderAddr != nil { - l = m.ProviderAddr.Size() + l = len(m.ProviderAddr) + if l > 0 { n += 1 + l + sovProvider(uint64(l)) } if m.ConsumerKey != nil { @@ -2827,12 +2615,12 @@ func (m *ValidatorByConsumerAddr) Size() (n int) { if l > 0 { n += 1 + l + sovProvider(uint64(l)) } - if m.ConsumerAddr != nil { - l = m.ConsumerAddr.Size() + l = len(m.ConsumerAddr) + if l > 0 { n += 1 + l + sovProvider(uint64(l)) } - if m.ProviderAddr != nil { - l = m.ProviderAddr.Size() + l = len(m.ProviderAddr) + if l > 0 { n += 1 + l + sovProvider(uint64(l)) } return n @@ -3757,7 +3545,7 @@ func (m *GlobalSlashEntry) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ProviderValConsAddr", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowProvider @@ -3767,26 +3555,24 @@ func (m *GlobalSlashEntry) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthProvider } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthProvider } if postIndex > l { return io.ErrUnexpectedEOF } + m.ProviderValConsAddr = append(m.ProviderValConsAddr[:0], dAtA[iNdEx:postIndex]...) if m.ProviderValConsAddr == nil { - m.ProviderValConsAddr = &ProviderConsAddress{} - } - if err := m.ProviderValConsAddr.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.ProviderValConsAddr = []byte{} } iNdEx = postIndex default: @@ -4424,7 +4210,7 @@ func (m *ConsumerAdditionProposals) Unmarshal(dAtA []byte) error { } return nil } -func (m *ConsumerRemovalProposals) Unmarshal(dAtA []byte) error { +func (m *AddressList) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4447,17 +4233,17 @@ func (m *ConsumerRemovalProposals) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ConsumerRemovalProposals: wiretype end group for non-group") + return fmt.Errorf("proto: AddressList: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ConsumerRemovalProposals: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AddressList: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pending", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowProvider @@ -4467,25 +4253,23 @@ func (m *ConsumerRemovalProposals) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthProvider } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthProvider } if postIndex > l { return io.ErrUnexpectedEOF } - m.Pending = append(m.Pending, &ConsumerRemovalProposal{}) - if err := m.Pending[len(m.Pending)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Addresses = append(m.Addresses, make([]byte, postIndex-iNdEx)) + copy(m.Addresses[len(m.Addresses)-1], dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -4508,7 +4292,7 @@ func (m *ConsumerRemovalProposals) Unmarshal(dAtA []byte) error { } return nil } -func (m *ChannelToChain) Unmarshal(dAtA []byte) error { +func (m *ConsumerRemovalProposals) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4531,17 +4315,17 @@ func (m *ChannelToChain) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ChannelToChain: wiretype end group for non-group") + return fmt.Errorf("proto: ConsumerRemovalProposals: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ChannelToChain: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ConsumerRemovalProposals: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChannelId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Pending", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowProvider @@ -4551,27 +4335,111 @@ func (m *ChannelToChain) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthProvider } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthProvider } if postIndex > l { return io.ErrUnexpectedEOF } - m.ChannelId = string(dAtA[iNdEx:postIndex]) + m.Pending = append(m.Pending, &ConsumerRemovalProposal{}) + if err := m.Pending[len(m.Pending)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + default: + iNdEx = preIndex + skippy, err := skipProvider(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProvider + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ChannelToChain) 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 ErrIntOverflowProvider + } + 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: ChannelToChain: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ChannelToChain: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChannelId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProvider + } + 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 ErrInvalidLengthProvider + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthProvider + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChannelId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -5071,258 +4939,6 @@ func (m *VscSendTimestamp) Unmarshal(dAtA []byte) error { } return nil } -func (m *ConsumerConsAddress) 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 ErrIntOverflowProvider - } - 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: ConsumerConsAddress: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ConsumerConsAddress: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProvider - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthProvider - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthProvider - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Address = append(m.Address[:0], dAtA[iNdEx:postIndex]...) - if m.Address == nil { - m.Address = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipProvider(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthProvider - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ProviderConsAddress) 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 ErrIntOverflowProvider - } - 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: ProviderConsAddress: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ProviderConsAddress: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProvider - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthProvider - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthProvider - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Address = append(m.Address[:0], dAtA[iNdEx:postIndex]...) - if m.Address == nil { - m.Address = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipProvider(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthProvider - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ConsumerAddressList) 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 ErrIntOverflowProvider - } - 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: ConsumerAddressList: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ConsumerAddressList: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProvider - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthProvider - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthProvider - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Addresses = append(m.Addresses, &ConsumerConsAddress{}) - if err := m.Addresses[len(m.Addresses)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipProvider(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthProvider - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *KeyAssignmentReplacement) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -5356,7 +4972,7 @@ func (m *KeyAssignmentReplacement) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ProviderAddr", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowProvider @@ -5366,26 +4982,24 @@ func (m *KeyAssignmentReplacement) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthProvider } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthProvider } if postIndex > l { return io.ErrUnexpectedEOF } + m.ProviderAddr = append(m.ProviderAddr[:0], dAtA[iNdEx:postIndex]...) if m.ProviderAddr == nil { - m.ProviderAddr = &ProviderConsAddress{} - } - if err := m.ProviderAddr.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.ProviderAddr = []byte{} } iNdEx = postIndex case 2: @@ -5529,7 +5143,7 @@ func (m *ValidatorConsumerPubKey) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ProviderAddr", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowProvider @@ -5539,26 +5153,24 @@ func (m *ValidatorConsumerPubKey) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthProvider } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthProvider } if postIndex > l { return io.ErrUnexpectedEOF } + m.ProviderAddr = append(m.ProviderAddr[:0], dAtA[iNdEx:postIndex]...) if m.ProviderAddr == nil { - m.ProviderAddr = &ProviderConsAddress{} - } - if err := m.ProviderAddr.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.ProviderAddr = []byte{} } iNdEx = postIndex case 3: @@ -5683,7 +5295,7 @@ func (m *ValidatorByConsumerAddr) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ConsumerAddr", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowProvider @@ -5693,33 +5305,31 @@ func (m *ValidatorByConsumerAddr) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthProvider } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthProvider } if postIndex > l { return io.ErrUnexpectedEOF } + m.ConsumerAddr = append(m.ConsumerAddr[:0], dAtA[iNdEx:postIndex]...) if m.ConsumerAddr == nil { - m.ConsumerAddr = &ConsumerConsAddress{} - } - if err := m.ConsumerAddr.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.ConsumerAddr = []byte{} } iNdEx = postIndex case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ProviderAddr", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowProvider @@ -5729,26 +5339,24 @@ func (m *ValidatorByConsumerAddr) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthProvider } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthProvider } if postIndex > l { return io.ErrUnexpectedEOF } + m.ProviderAddr = append(m.ProviderAddr[:0], dAtA[iNdEx:postIndex]...) if m.ProviderAddr == nil { - m.ProviderAddr = &ProviderConsAddress{} - } - if err := m.ProviderAddr.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.ProviderAddr = []byte{} } iNdEx = postIndex default: @@ -5882,7 +5490,7 @@ func (m *ConsumerAddrsToPrune) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.ConsumerAddrs == nil { - m.ConsumerAddrs = &ConsumerAddressList{} + m.ConsumerAddrs = &AddressList{} } if err := m.ConsumerAddrs.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err diff --git a/x/ccv/provider/types/throttle.go b/x/ccv/provider/types/throttle.go index 70a3bb49e2..e41396eb3a 100644 --- a/x/ccv/provider/types/throttle.go +++ b/x/ccv/provider/types/throttle.go @@ -12,6 +12,6 @@ func NewGlobalSlashEntry(recvTime time.Time, consumerChainID string, RecvTime: recvTime.UTC(), // UTC prevents serialization inconsistencies ConsumerChainID: consumerChainID, IbcSeqNum: ibcSeqNum, - ProviderValConsAddr: &providerValConsAddr, + ProviderValConsAddr: providerValConsAddr.ToSdkConsAddr(), } } From 73b4a07dab4aed7710b74535346e344a2ff9c778 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue, 30 May 2023 08:14:55 -0700 Subject: [PATCH 024/108] docs: update top level readme for repo (#981) * Update base.css * Update README.md * smol --------- Co-authored-by: Marius Poke --- README.md | 6 ++---- docs/src/css/base.css | 1 - 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index d7e63d11f5..df86648ea4 100644 --- a/README.md +++ b/README.md @@ -7,11 +7,9 @@ [![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=cosmos_interchain-security&metric=ncloc)](https://sonarcloud.io/summary/new_code?id=cosmos_interchain-security) [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=cosmos_interchain-security&metric=coverage)](https://sonarcloud.io/summary/new_code?id=cosmos_interchain-security) -**interchain-security** houses the code for implementing Interchain Security. The repo is currently a WIP and targetting v1 of Interchain Security. For more details on the Interchain Security protocol, take a look at the [specification](https://github.com/cosmos/ibc/blob/main/spec/app/ics-028-cross-chain-validation/README.md). +**interchain-security** contains a working and in-production implementation of the Replicated Security protocol (aka Interchain Security V1). Replicated security is an open sourced IBC application which allows cosmos blockchains to lease their proof-of-stake security to one another. -CCV stands for cross chain validation and refers to the subset of Interchain Security related to the staking and slashing communication between the provider and consumer blockchains. The provider blockchain communicates staking changes to consumer blockchain(s), while the consumer blockchain may communicate slashing evidence to the provider blockchain. - -The code for CCV is housed under [x/ccv](./x/ccv). The `types` folder contains types and related functions that are used by both provider and consumer chains, while the `consumer` module contains the code run by consumer chains and the `provider` module contains the code run by provider chain. +For more details on the Replicated Security protocol, take a look at the [docs](https://cosmos.github.io/interchain-security/) or [technical specification](https://github.com/cosmos/ibc/blob/main/spec/app/ics-028-cross-chain-validation/README.md). ## Instructions diff --git a/docs/src/css/base.css b/docs/src/css/base.css index e6d485266f..bdc9f13c4a 100644 --- a/docs/src/css/base.css +++ b/docs/src/css/base.css @@ -9,7 +9,6 @@ -webkit-font-feature-settings: 'kern', 'liga', 'calt', 'zero' 0; text-size-adjust: 100%; -moz-osx-font-smoothing: grayscale; - font-smoothing: antialiased; font-variant-ligatures: contextual common-ligatures; font-kerning: normal; text-rendering: optimizeLegibility; From daa0e14a916ecf60547a2d2d41e23f80dd2966c9 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue, 30 May 2023 08:44:38 -0700 Subject: [PATCH 025/108] ci: makefile target for checking if protos are updated (#979) * proto-check makefile target * comment * add to GH actions workflow * put proto check before other tests * gotta regenerate protos --------- Co-authored-by: Marius Poke --- .github/workflows/automated-tests.yml | 4 +- Makefile | 16 ++ x/ccv/provider/types/provider.pb.go | 378 +++++++++++++------------- 3 files changed, 207 insertions(+), 191 deletions(-) diff --git a/.github/workflows/automated-tests.yml b/.github/workflows/automated-tests.yml index edff66d593..0a4a8fc6a0 100644 --- a/.github/workflows/automated-tests.yml +++ b/.github/workflows/automated-tests.yml @@ -24,9 +24,9 @@ jobs: uses: actions/setup-go@v4 with: go-version: "1.19" # The Go version to download (if necessary) and use. - + - name: Proto Check + run: make proto-check - name: Unit, integration and difference tests run: go test ./... - - name: E2E tests run: make test-e2e-short diff --git a/Makefile b/Makefile index 63c606981d..600c617d70 100644 --- a/Makefile +++ b/Makefile @@ -114,6 +114,22 @@ proto-gen: @if docker ps -a --format '{{.Names}}' | grep -Eq "^${containerProtoGen}$$"; then docker start -a $(containerProtoGen); else docker run --name $(containerProtoGen) -v $(CURDIR):/workspace --workdir /workspace $(containerProtoImage) \ sh ./scripts/protocgen.sh; fi +proto-check: + @if git diff --quiet; then \ + echo "No files were modified before running 'make proto-gen'."; \ + else \ + echo "Error: Uncommitted changes exist before running 'make proto-gen'. Please commit or stash your changes."; \ + exit 1; \ + fi + @$(MAKE) proto-gen + @if git diff --quiet; then \ + echo "No files were modified after running 'make proto-gen'. Pass!"; \ + else \ + echo "Error: Files were modified after running 'make proto-gen'. Please commit changes to .pb files"; \ + exit 1; \ + fi + + proto-format: @echo "Formatting Protobuf files" @if docker ps -a --format '{{.Names}}' | grep -Eq "^${containerProtoFmt}$$"; then docker start -a $(containerProtoFmt); else docker run --name $(containerProtoFmt) -v $(CURDIR):/workspace --workdir /workspace tendermintdev/docker-build-proto \ diff --git a/x/ccv/provider/types/provider.pb.go b/x/ccv/provider/types/provider.pb.go index d7d5b5fc08..37e175acea 100644 --- a/x/ccv/provider/types/provider.pb.go +++ b/x/ccv/provider/types/provider.pb.go @@ -591,23 +591,24 @@ func (m *ConsumerAdditionProposals) GetPending() []*ConsumerAdditionProposal { return nil } -// AddressList contains a list of consensus addresses -type AddressList struct { - Addresses [][]byte `protobuf:"bytes,1,rep,name=addresses,proto3" json:"addresses,omitempty"` +// ConsumerRemovalProposals holds pending governance proposals on the provider chain to remove (and stop) a consumer chain. +type ConsumerRemovalProposals struct { + // proposals waiting for stop_time to pass + Pending []*ConsumerRemovalProposal `protobuf:"bytes,1,rep,name=pending,proto3" json:"pending,omitempty"` } -func (m *AddressList) Reset() { *m = AddressList{} } -func (m *AddressList) String() string { return proto.CompactTextString(m) } -func (*AddressList) ProtoMessage() {} -func (*AddressList) Descriptor() ([]byte, []int) { +func (m *ConsumerRemovalProposals) Reset() { *m = ConsumerRemovalProposals{} } +func (m *ConsumerRemovalProposals) String() string { return proto.CompactTextString(m) } +func (*ConsumerRemovalProposals) ProtoMessage() {} +func (*ConsumerRemovalProposals) Descriptor() ([]byte, []int) { return fileDescriptor_f22ec409a72b7b72, []int{8} } -func (m *AddressList) XXX_Unmarshal(b []byte) error { +func (m *ConsumerRemovalProposals) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *AddressList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ConsumerRemovalProposals) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_AddressList.Marshal(b, m, deterministic) + return xxx_messageInfo_ConsumerRemovalProposals.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -617,43 +618,42 @@ func (m *AddressList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return b[:n], nil } } -func (m *AddressList) XXX_Merge(src proto.Message) { - xxx_messageInfo_AddressList.Merge(m, src) +func (m *ConsumerRemovalProposals) XXX_Merge(src proto.Message) { + xxx_messageInfo_ConsumerRemovalProposals.Merge(m, src) } -func (m *AddressList) XXX_Size() int { +func (m *ConsumerRemovalProposals) XXX_Size() int { return m.Size() } -func (m *AddressList) XXX_DiscardUnknown() { - xxx_messageInfo_AddressList.DiscardUnknown(m) +func (m *ConsumerRemovalProposals) XXX_DiscardUnknown() { + xxx_messageInfo_ConsumerRemovalProposals.DiscardUnknown(m) } -var xxx_messageInfo_AddressList proto.InternalMessageInfo +var xxx_messageInfo_ConsumerRemovalProposals proto.InternalMessageInfo -func (m *AddressList) GetAddresses() [][]byte { +func (m *ConsumerRemovalProposals) GetPending() []*ConsumerRemovalProposal { if m != nil { - return m.Addresses + return m.Pending } return nil } -// ConsumerRemovalProposals holds pending governance proposals on the provider chain to remove (and stop) a consumer chain. -type ConsumerRemovalProposals struct { - // proposals waiting for stop_time to pass - Pending []*ConsumerRemovalProposal `protobuf:"bytes,1,rep,name=pending,proto3" json:"pending,omitempty"` +// AddressList contains a list of consensus addresses +type AddressList struct { + Addresses [][]byte `protobuf:"bytes,1,rep,name=addresses,proto3" json:"addresses,omitempty"` } -func (m *ConsumerRemovalProposals) Reset() { *m = ConsumerRemovalProposals{} } -func (m *ConsumerRemovalProposals) String() string { return proto.CompactTextString(m) } -func (*ConsumerRemovalProposals) ProtoMessage() {} -func (*ConsumerRemovalProposals) Descriptor() ([]byte, []int) { +func (m *AddressList) Reset() { *m = AddressList{} } +func (m *AddressList) String() string { return proto.CompactTextString(m) } +func (*AddressList) ProtoMessage() {} +func (*AddressList) Descriptor() ([]byte, []int) { return fileDescriptor_f22ec409a72b7b72, []int{9} } -func (m *ConsumerRemovalProposals) XXX_Unmarshal(b []byte) error { +func (m *AddressList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ConsumerRemovalProposals) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *AddressList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ConsumerRemovalProposals.Marshal(b, m, deterministic) + return xxx_messageInfo_AddressList.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -663,21 +663,21 @@ func (m *ConsumerRemovalProposals) XXX_Marshal(b []byte, deterministic bool) ([] return b[:n], nil } } -func (m *ConsumerRemovalProposals) XXX_Merge(src proto.Message) { - xxx_messageInfo_ConsumerRemovalProposals.Merge(m, src) +func (m *AddressList) XXX_Merge(src proto.Message) { + xxx_messageInfo_AddressList.Merge(m, src) } -func (m *ConsumerRemovalProposals) XXX_Size() int { +func (m *AddressList) XXX_Size() int { return m.Size() } -func (m *ConsumerRemovalProposals) XXX_DiscardUnknown() { - xxx_messageInfo_ConsumerRemovalProposals.DiscardUnknown(m) +func (m *AddressList) XXX_DiscardUnknown() { + xxx_messageInfo_AddressList.DiscardUnknown(m) } -var xxx_messageInfo_ConsumerRemovalProposals proto.InternalMessageInfo +var xxx_messageInfo_AddressList proto.InternalMessageInfo -func (m *ConsumerRemovalProposals) GetPending() []*ConsumerRemovalProposal { +func (m *AddressList) GetAddresses() [][]byte { if m != nil { - return m.Pending + return m.Addresses } return nil } @@ -1202,8 +1202,8 @@ func init() { proto.RegisterType((*HandshakeMetadata)(nil), "interchain_security.ccv.provider.v1.HandshakeMetadata") proto.RegisterType((*SlashAcks)(nil), "interchain_security.ccv.provider.v1.SlashAcks") proto.RegisterType((*ConsumerAdditionProposals)(nil), "interchain_security.ccv.provider.v1.ConsumerAdditionProposals") - proto.RegisterType((*AddressList)(nil), "interchain_security.ccv.provider.v1.AddressList") proto.RegisterType((*ConsumerRemovalProposals)(nil), "interchain_security.ccv.provider.v1.ConsumerRemovalProposals") + proto.RegisterType((*AddressList)(nil), "interchain_security.ccv.provider.v1.AddressList") proto.RegisterType((*ChannelToChain)(nil), "interchain_security.ccv.provider.v1.ChannelToChain") proto.RegisterType((*VscUnbondingOps)(nil), "interchain_security.ccv.provider.v1.VscUnbondingOps") proto.RegisterType((*UnbondingOp)(nil), "interchain_security.ccv.provider.v1.UnbondingOp") @@ -1220,106 +1220,106 @@ func init() { } var fileDescriptor_f22ec409a72b7b72 = []byte{ - // 1576 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x57, 0x4b, 0x73, 0x1c, 0x47, - 0x1d, 0xd7, 0x68, 0xf5, 0xda, 0x5e, 0x3d, 0xec, 0xb1, 0x1c, 0xaf, 0x8c, 0x58, 0x6d, 0x26, 0x90, - 0x12, 0x95, 0xca, 0x2c, 0x52, 0x2e, 0x94, 0x8b, 0x54, 0x4a, 0x5a, 0xc7, 0xb1, 0x10, 0x89, 0x37, - 0x23, 0x21, 0x17, 0x70, 0x98, 0xea, 0xe9, 0xf9, 0x7b, 0xb7, 0x4b, 0x33, 0xd3, 0xe3, 0xee, 0x9e, - 0xb1, 0xf7, 0xc2, 0x99, 0x63, 0x28, 0x2e, 0x29, 0xb8, 0x84, 0x4f, 0xc0, 0xd7, 0xc8, 0x31, 0x47, - 0x4e, 0x81, 0x92, 0x0f, 0x1c, 0xf8, 0x12, 0x54, 0xf7, 0xbc, 0x57, 0xb2, 0x59, 0x17, 0x70, 0x9b, - 0xfe, 0x3f, 0x7e, 0xfd, 0xeb, 0xfe, 0xbf, 0x7a, 0xd0, 0x21, 0x8d, 0x24, 0x70, 0x32, 0xc1, 0x34, - 0x72, 0x05, 0x90, 0x84, 0x53, 0x39, 0x1d, 0x10, 0x92, 0x0e, 0x62, 0xce, 0x52, 0xea, 0x03, 0x1f, - 0xa4, 0x07, 0xe5, 0xb7, 0x1d, 0x73, 0x26, 0x99, 0xf9, 0xde, 0x0d, 0x3e, 0x36, 0x21, 0xa9, 0x5d, - 0xda, 0xa5, 0x07, 0xf7, 0xb7, 0xc7, 0x6c, 0xcc, 0xb4, 0xfd, 0x40, 0x7d, 0x65, 0xae, 0xf7, 0xf7, - 0xc6, 0x8c, 0x8d, 0x03, 0x18, 0xe8, 0x95, 0x97, 0x3c, 0x1b, 0x48, 0x1a, 0x82, 0x90, 0x38, 0x8c, - 0x73, 0x83, 0xde, 0xac, 0x81, 0x9f, 0x70, 0x2c, 0x29, 0x8b, 0x0a, 0x00, 0xea, 0x91, 0x01, 0x61, - 0x1c, 0x06, 0x24, 0xa0, 0x10, 0x49, 0x45, 0x2f, 0xfb, 0xca, 0x0d, 0x06, 0xca, 0x20, 0xa0, 0xe3, - 0x89, 0xcc, 0xc4, 0x62, 0x20, 0x21, 0xf2, 0x81, 0x87, 0x34, 0x33, 0xae, 0x56, 0xb9, 0xc3, 0x6e, - 0x4d, 0x4f, 0xf8, 0x34, 0x96, 0x6c, 0x70, 0x09, 0x53, 0x91, 0x6b, 0xdf, 0x27, 0x4c, 0x84, 0x4c, - 0x0c, 0x40, 0x1d, 0x2c, 0x22, 0x30, 0x48, 0x0f, 0x3c, 0x90, 0xf8, 0xa0, 0x14, 0x14, 0xbc, 0x73, - 0x3b, 0x0f, 0x8b, 0xca, 0x86, 0x30, 0x9a, 0xf3, 0xb6, 0xfe, 0xb8, 0x82, 0xba, 0x43, 0x16, 0x89, - 0x24, 0x04, 0x7e, 0xe4, 0xfb, 0x54, 0x1d, 0x69, 0xc4, 0x59, 0xcc, 0x04, 0x0e, 0xcc, 0x6d, 0xb4, - 0x2c, 0xa9, 0x0c, 0xa0, 0x6b, 0xf4, 0x8d, 0xfd, 0xb6, 0x93, 0x2d, 0xcc, 0x3e, 0xea, 0xf8, 0x20, - 0x08, 0xa7, 0xb1, 0x32, 0xee, 0x2e, 0x6a, 0x5d, 0x5d, 0x64, 0xee, 0xa0, 0xb5, 0x2c, 0x0a, 0xd4, - 0xef, 0xb6, 0xb4, 0x7a, 0x55, 0xaf, 0x4f, 0x7c, 0xf3, 0x33, 0xb4, 0x49, 0x23, 0x2a, 0x29, 0x0e, - 0xdc, 0x09, 0xa8, 0xdb, 0xe8, 0x2e, 0xf5, 0x8d, 0xfd, 0xce, 0xe1, 0x7d, 0x9b, 0x7a, 0xc4, 0x56, - 0x17, 0x68, 0xe7, 0xd7, 0x96, 0x1e, 0xd8, 0x8f, 0xb5, 0xc5, 0xf1, 0xd2, 0xb7, 0xdf, 0xef, 0x2d, - 0x38, 0x1b, 0xb9, 0x5f, 0x26, 0x34, 0xdf, 0x45, 0xeb, 0x63, 0x88, 0x40, 0x50, 0xe1, 0x4e, 0xb0, - 0x98, 0x74, 0x97, 0xfb, 0xc6, 0xfe, 0xba, 0xd3, 0xc9, 0x65, 0x8f, 0xb1, 0x98, 0x98, 0x7b, 0xa8, - 0xe3, 0xd1, 0x08, 0xf3, 0x69, 0x66, 0xb1, 0xa2, 0x2d, 0x50, 0x26, 0xd2, 0x06, 0x43, 0x84, 0x44, - 0x8c, 0x5f, 0x44, 0xae, 0x8a, 0x76, 0x77, 0x35, 0x27, 0x92, 0x45, 0xda, 0x2e, 0x22, 0x6d, 0x9f, - 0x17, 0xa9, 0x70, 0xbc, 0xa6, 0x88, 0x7c, 0xf5, 0xf7, 0x3d, 0xc3, 0x69, 0x6b, 0x3f, 0xa5, 0x31, - 0xbf, 0x40, 0xb7, 0x92, 0xc8, 0x63, 0x91, 0x4f, 0xa3, 0xb1, 0x1b, 0x03, 0xa7, 0xcc, 0xef, 0xae, - 0x69, 0xa8, 0x9d, 0x6b, 0x50, 0x0f, 0xf3, 0xa4, 0xc9, 0x90, 0xbe, 0x56, 0x48, 0x5b, 0xa5, 0xf3, - 0x48, 0xfb, 0x9a, 0x5f, 0x22, 0x93, 0x90, 0x54, 0x53, 0x62, 0x89, 0x2c, 0x10, 0xdb, 0xf3, 0x23, - 0xde, 0x22, 0x24, 0x3d, 0xcf, 0xbc, 0x73, 0xc8, 0xdf, 0xa2, 0x7b, 0x92, 0xe3, 0x48, 0x3c, 0x03, - 0x3e, 0x8b, 0x8b, 0xe6, 0xc7, 0xbd, 0x5b, 0x60, 0x34, 0xc1, 0x1f, 0xa3, 0x3e, 0xc9, 0x13, 0xc8, - 0xe5, 0xe0, 0x53, 0x21, 0x39, 0xf5, 0x12, 0xe5, 0xeb, 0x3e, 0xe3, 0x98, 0xe8, 0x1c, 0xe9, 0xe8, - 0x24, 0xe8, 0x15, 0x76, 0x4e, 0xc3, 0xec, 0x51, 0x6e, 0x65, 0x3e, 0x41, 0x3f, 0xf2, 0x02, 0x46, - 0x2e, 0x85, 0x22, 0xe7, 0x36, 0x90, 0xf4, 0xd6, 0x21, 0x15, 0x42, 0xa1, 0xad, 0xf7, 0x8d, 0xfd, - 0x96, 0xf3, 0x6e, 0x66, 0x3b, 0x02, 0xfe, 0xb0, 0x66, 0x79, 0x5e, 0x33, 0x34, 0x3f, 0x44, 0xe6, - 0x84, 0x0a, 0xc9, 0x38, 0x25, 0x38, 0x70, 0x21, 0x92, 0x9c, 0x82, 0xe8, 0x6e, 0x68, 0xf7, 0xdb, - 0x95, 0xe6, 0xd3, 0x4c, 0xf1, 0x60, 0xed, 0xf7, 0xdf, 0xec, 0x2d, 0x7c, 0xfd, 0xcd, 0xde, 0x82, - 0xf5, 0x57, 0x03, 0xdd, 0x1b, 0x96, 0x64, 0x43, 0x96, 0xe2, 0xe0, 0xff, 0x59, 0x14, 0x47, 0xa8, - 0x2d, 0x24, 0x8b, 0xb3, 0x34, 0x5c, 0x7a, 0x8b, 0x34, 0x5c, 0x53, 0x6e, 0x4a, 0x61, 0xfd, 0xd9, - 0x40, 0xdb, 0x9f, 0x3e, 0x4f, 0x68, 0xca, 0x08, 0xfe, 0x9f, 0xd4, 0xf0, 0x29, 0xda, 0x80, 0x1a, - 0x9e, 0xe8, 0xb6, 0xfa, 0xad, 0xfd, 0xce, 0xe1, 0x8f, 0xed, 0xac, 0xa1, 0xd8, 0x65, 0x9f, 0xc9, - 0x9b, 0x8a, 0x5d, 0xdf, 0xdd, 0x69, 0xfa, 0x5a, 0xff, 0x32, 0xd0, 0xad, 0xcf, 0x02, 0xe6, 0xe1, - 0xe0, 0x2c, 0xc0, 0x62, 0xa2, 0x2e, 0x7c, 0xaa, 0x4e, 0xcd, 0x21, 0xcf, 0x74, 0xcd, 0x6e, 0xee, - 0x53, 0x2b, 0x37, 0x5d, 0x7b, 0x9f, 0xa0, 0xdb, 0x65, 0xee, 0x95, 0x97, 0xab, 0x0f, 0x73, 0x7c, - 0xe7, 0xea, 0xfb, 0xbd, 0xad, 0x22, 0x86, 0x43, 0x7d, 0xd1, 0x0f, 0x9d, 0x2d, 0xd2, 0x10, 0xf8, - 0x66, 0x0f, 0x75, 0xa8, 0x47, 0x5c, 0x01, 0xcf, 0xdd, 0x28, 0x09, 0x75, 0x5c, 0x96, 0x9c, 0x36, - 0xf5, 0xc8, 0x19, 0x3c, 0xff, 0x22, 0x09, 0xcd, 0x8f, 0xd0, 0x3b, 0xc5, 0xf0, 0x70, 0x53, 0x1c, - 0xb8, 0xca, 0xdf, 0xc5, 0xbe, 0xcf, 0x75, 0x98, 0xd6, 0x9d, 0x3b, 0x85, 0xf6, 0x02, 0x07, 0x6a, - 0xb3, 0x23, 0xdf, 0xe7, 0xd6, 0x3f, 0x97, 0xd1, 0xca, 0x08, 0x73, 0x1c, 0x0a, 0xf3, 0x1c, 0x6d, - 0x49, 0x08, 0xe3, 0x00, 0x4b, 0x70, 0xb3, 0xbe, 0x96, 0x9f, 0xf4, 0x03, 0xdd, 0xef, 0xea, 0xf3, - 0xc0, 0xae, 0x4d, 0x80, 0xf4, 0xc0, 0x1e, 0x6a, 0xe9, 0x99, 0xc4, 0x12, 0x9c, 0xcd, 0x02, 0x23, - 0x13, 0x9a, 0x3f, 0x43, 0x5d, 0xc9, 0x13, 0x21, 0xab, 0x8e, 0x53, 0x95, 0x5a, 0x16, 0xca, 0x77, - 0x0a, 0x7d, 0x56, 0xa4, 0x65, 0x89, 0xdd, 0xdc, 0x5c, 0x5a, 0xff, 0x4d, 0x73, 0x39, 0x43, 0x77, - 0x54, 0x67, 0x9e, 0xc5, 0x5c, 0x9a, 0x1f, 0xf3, 0xb6, 0xf2, 0x6f, 0x82, 0x7e, 0x89, 0xcc, 0x54, - 0x90, 0x59, 0xcc, 0xe5, 0xb7, 0xe0, 0x99, 0x0a, 0xd2, 0x84, 0xf4, 0xd1, 0xae, 0x50, 0xc9, 0xe7, - 0x86, 0x20, 0x75, 0xab, 0x8a, 0x03, 0x88, 0xa8, 0x98, 0x14, 0xe0, 0x2b, 0xf3, 0x83, 0xef, 0x68, - 0xa0, 0xcf, 0x15, 0x8e, 0x53, 0xc0, 0xe4, 0xbb, 0x0c, 0x51, 0xef, 0xe6, 0x5d, 0xca, 0x00, 0xad, - 0xea, 0x00, 0xfd, 0xe0, 0x06, 0x88, 0x32, 0x4a, 0x87, 0xe8, 0x6e, 0x88, 0x5f, 0xba, 0x72, 0xc2, - 0x99, 0x94, 0x01, 0xf8, 0x6e, 0x8c, 0xc9, 0x25, 0x48, 0xa1, 0xe7, 0x4a, 0xcb, 0xb9, 0x13, 0xe2, - 0x97, 0xe7, 0x85, 0x6e, 0x94, 0xa9, 0x4c, 0x81, 0xde, 0xaf, 0xb5, 0xe1, 0x17, 0x98, 0xfb, 0xae, - 0x0f, 0x11, 0x0b, 0x5d, 0x0e, 0x63, 0xd5, 0x1f, 0x71, 0xd6, 0x91, 0x01, 0xca, 0x51, 0x92, 0x17, - 0xb2, 0x7a, 0x19, 0x94, 0x45, 0x3c, 0x64, 0x34, 0xca, 0xe7, 0xad, 0x55, 0x75, 0x6b, 0x85, 0xf6, - 0x50, 0x81, 0x39, 0x35, 0xac, 0x47, 0x00, 0x96, 0x87, 0x6e, 0x3f, 0xc6, 0x91, 0x2f, 0x26, 0xf8, - 0x12, 0x3e, 0x07, 0x89, 0x7d, 0x2c, 0x71, 0xa3, 0x66, 0x9e, 0x01, 0xb8, 0x31, 0x63, 0x41, 0x56, - 0x33, 0x59, 0x0b, 0x2a, 0x6b, 0xe6, 0x11, 0xc0, 0x88, 0xb1, 0x40, 0xd5, 0x8c, 0xd9, 0x45, 0xab, - 0x29, 0x70, 0x51, 0x65, 0x70, 0xb1, 0xb4, 0x7e, 0x82, 0xda, 0xba, 0x69, 0x1c, 0x91, 0x4b, 0x61, - 0xee, 0xa2, 0xb6, 0x42, 0x02, 0x21, 0x40, 0x74, 0x8d, 0x7e, 0x6b, 0xbf, 0xed, 0x54, 0x02, 0x4b, - 0xa2, 0x9d, 0xd7, 0xbd, 0x65, 0x84, 0xf9, 0x14, 0xad, 0xc6, 0xa0, 0x07, 0xad, 0x76, 0xec, 0x1c, - 0x7e, 0x6c, 0xcf, 0xf1, 0x5e, 0xb4, 0x5f, 0x07, 0xe8, 0x14, 0x68, 0xd6, 0x07, 0xa8, 0x73, 0x94, - 0x51, 0xf8, 0x25, 0x15, 0xf2, 0x3a, 0xc5, 0xf5, 0x3a, 0x45, 0x5e, 0x3d, 0xb7, 0x66, 0x06, 0x8b, - 0x30, 0x2f, 0x66, 0x19, 0xfe, 0xfc, 0xad, 0x18, 0xce, 0xe0, 0x55, 0x04, 0x7f, 0x81, 0x36, 0x87, - 0x13, 0x1c, 0x45, 0x10, 0x9c, 0x33, 0xdd, 0xf8, 0xcc, 0x1f, 0x22, 0x44, 0x32, 0x89, 0x6a, 0x98, - 0x59, 0x58, 0xda, 0xb9, 0xe4, 0xc4, 0x6f, 0x8c, 0xaa, 0xc5, 0xc6, 0xa8, 0xb2, 0x1c, 0xb4, 0x75, - 0x21, 0xc8, 0xaf, 0x8a, 0x37, 0xcb, 0x93, 0x58, 0x98, 0x77, 0xd1, 0x8a, 0xaa, 0xd5, 0x1c, 0x68, - 0xc9, 0x59, 0x4e, 0x05, 0x39, 0xf1, 0xcd, 0xfd, 0xfa, 0xbb, 0x88, 0xc5, 0x2e, 0xf5, 0x45, 0x77, - 0xb1, 0xdf, 0xda, 0x5f, 0x72, 0x36, 0x93, 0xca, 0xfd, 0xc4, 0x17, 0xd6, 0xaf, 0x51, 0xa7, 0x06, - 0x68, 0x6e, 0xa2, 0xc5, 0x12, 0x6b, 0x91, 0xfa, 0xe6, 0x03, 0xb4, 0x53, 0x01, 0x35, 0xdb, 0x7d, - 0x86, 0xd8, 0x76, 0xee, 0x95, 0x06, 0x8d, 0x8e, 0x2f, 0xac, 0x27, 0x68, 0xfb, 0xa4, 0x6a, 0x2e, - 0xe5, 0x30, 0x69, 0x9c, 0xd0, 0x68, 0x0e, 0xe3, 0x5d, 0xd4, 0x2e, 0x1f, 0xff, 0xfa, 0xf4, 0x4b, - 0x4e, 0x25, 0xb0, 0x42, 0x74, 0xeb, 0x42, 0x90, 0x33, 0x88, 0xfc, 0x0a, 0xec, 0x35, 0x17, 0x70, - 0x3c, 0x0b, 0x34, 0xf7, 0xe3, 0xb2, 0xda, 0xee, 0x0f, 0x06, 0xea, 0x9e, 0xc2, 0xf4, 0x48, 0x08, - 0x3a, 0x8e, 0x42, 0x88, 0xa4, 0x6a, 0x16, 0x98, 0x80, 0xfa, 0x34, 0xdf, 0x43, 0x1b, 0x65, 0xa1, - 0x95, 0xf5, 0xb5, 0xee, 0xac, 0x17, 0x42, 0x5d, 0x58, 0x0f, 0x10, 0x8a, 0x39, 0xa4, 0x2e, 0x71, - 0x2f, 0x61, 0x9a, 0xd3, 0xd8, 0xad, 0xcf, 0x9a, 0xec, 0xdf, 0xc2, 0x1e, 0x25, 0x5e, 0x40, 0xc9, - 0x29, 0x4c, 0x9d, 0x35, 0x65, 0x3f, 0x3c, 0x85, 0xa9, 0x7a, 0x3b, 0xc4, 0xec, 0x05, 0x70, 0x3d, - 0x20, 0x5a, 0x4e, 0xb6, 0xb0, 0xfe, 0x64, 0xa0, 0x7b, 0x17, 0x38, 0xa0, 0x3e, 0x96, 0x8c, 0x17, - 0xf7, 0x3d, 0x4a, 0x3c, 0xe5, 0xf1, 0x86, 0x7b, 0xbd, 0xc6, 0x76, 0xf1, 0x06, 0xb6, 0x9f, 0xa0, - 0xf5, 0x32, 0xc2, 0x8a, 0x6f, 0x6b, 0x0e, 0xbe, 0x9d, 0xc2, 0xe3, 0x14, 0xa6, 0xd6, 0xef, 0x6a, - 0xdc, 0x8e, 0xa7, 0xb5, 0xe2, 0xe5, 0xff, 0x81, 0x5b, 0xb9, 0x6d, 0x9d, 0x1b, 0xa9, 0xfb, 0x5f, - 0x3b, 0x40, 0xeb, 0xfa, 0x01, 0xac, 0xbf, 0x18, 0x68, 0xbb, 0xbe, 0xab, 0x38, 0x67, 0x23, 0x9e, - 0x44, 0xf0, 0xa6, 0xdd, 0xab, 0xfc, 0x59, 0xac, 0xe7, 0xcf, 0x53, 0xb4, 0xd9, 0x20, 0x25, 0xf2, - 0xdb, 0xf8, 0xe9, 0x5c, 0x5d, 0xa1, 0xd6, 0x92, 0x9c, 0x8d, 0xfa, 0x39, 0xc4, 0xf1, 0xd3, 0x6f, - 0xaf, 0x7a, 0xc6, 0x77, 0x57, 0x3d, 0xe3, 0x1f, 0x57, 0x3d, 0xe3, 0xab, 0x57, 0xbd, 0x85, 0xef, - 0x5e, 0xf5, 0x16, 0xfe, 0xf6, 0xaa, 0xb7, 0xf0, 0x9b, 0x8f, 0xc7, 0x54, 0x4e, 0x12, 0xcf, 0x26, - 0x2c, 0x1c, 0xe4, 0x3f, 0x8e, 0xd5, 0x5e, 0x1f, 0x96, 0xff, 0xe1, 0xe9, 0xe1, 0xe0, 0x65, 0xf3, - 0x67, 0x5c, 0x4e, 0x63, 0x10, 0xde, 0x8a, 0x4e, 0xeb, 0x8f, 0xfe, 0x1d, 0x00, 0x00, 0xff, 0xff, - 0x40, 0xf6, 0xbb, 0xdd, 0xbd, 0x0f, 0x00, 0x00, + // 1579 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x57, 0xcd, 0x72, 0xdc, 0xc6, + 0x11, 0x26, 0xb8, 0xfc, 0xdb, 0x59, 0xfe, 0x48, 0x10, 0x65, 0x2d, 0x15, 0x66, 0xb9, 0x86, 0x13, + 0x17, 0x53, 0x2e, 0x63, 0x43, 0xfa, 0x92, 0x52, 0xc5, 0xe5, 0x22, 0x57, 0x96, 0xc5, 0x30, 0xb6, + 0xd6, 0x20, 0x43, 0x55, 0x92, 0x03, 0x6a, 0x30, 0x68, 0xed, 0x4e, 0x11, 0xc0, 0x40, 0x33, 0x03, + 0x48, 0x7b, 0xc9, 0x39, 0x47, 0xa7, 0x72, 0x71, 0x25, 0x17, 0xe7, 0x09, 0xf2, 0x1a, 0x3e, 0xfa, + 0x98, 0x93, 0x93, 0xa2, 0x0e, 0x39, 0xe4, 0x25, 0x52, 0x33, 0xf8, 0x5f, 0x52, 0xca, 0xaa, 0x92, + 0xdc, 0x30, 0x3d, 0xdd, 0x5f, 0xf7, 0x4c, 0x77, 0x7f, 0x3d, 0x40, 0x87, 0x34, 0x92, 0xc0, 0xc9, + 0x04, 0xd3, 0xc8, 0x15, 0x40, 0x12, 0x4e, 0xe5, 0x74, 0x40, 0x48, 0x3a, 0x88, 0x39, 0x4b, 0xa9, + 0x0f, 0x7c, 0x90, 0x1e, 0x94, 0xdf, 0x76, 0xcc, 0x99, 0x64, 0xe6, 0x7b, 0x37, 0xd8, 0xd8, 0x84, + 0xa4, 0x76, 0xa9, 0x97, 0x1e, 0xdc, 0xdf, 0x1e, 0xb3, 0x31, 0xd3, 0xfa, 0x03, 0xf5, 0x95, 0x99, + 0xde, 0xdf, 0x1b, 0x33, 0x36, 0x0e, 0x60, 0xa0, 0x57, 0x5e, 0xf2, 0x6c, 0x20, 0x69, 0x08, 0x42, + 0xe2, 0x30, 0xce, 0x15, 0x7a, 0xb3, 0x0a, 0x7e, 0xc2, 0xb1, 0xa4, 0x2c, 0x2a, 0x00, 0xa8, 0x47, + 0x06, 0x84, 0x71, 0x18, 0x90, 0x80, 0x42, 0x24, 0x55, 0x78, 0xd9, 0x57, 0xae, 0x30, 0x50, 0x0a, + 0x01, 0x1d, 0x4f, 0x64, 0x26, 0x16, 0x03, 0x09, 0x91, 0x0f, 0x3c, 0xa4, 0x99, 0x72, 0xb5, 0xca, + 0x0d, 0x76, 0x6b, 0xfb, 0x84, 0x4f, 0x63, 0xc9, 0x06, 0x97, 0x30, 0x15, 0xf9, 0xee, 0xfb, 0x84, + 0x89, 0x90, 0x89, 0x01, 0xa8, 0x83, 0x45, 0x04, 0x06, 0xe9, 0x81, 0x07, 0x12, 0x1f, 0x94, 0x82, + 0x22, 0xee, 0x5c, 0xcf, 0xc3, 0xa2, 0xd2, 0x21, 0x8c, 0xe6, 0x71, 0x5b, 0x7f, 0x5c, 0x41, 0xdd, + 0x21, 0x8b, 0x44, 0x12, 0x02, 0x3f, 0xf2, 0x7d, 0xaa, 0x8e, 0x34, 0xe2, 0x2c, 0x66, 0x02, 0x07, + 0xe6, 0x36, 0x5a, 0x96, 0x54, 0x06, 0xd0, 0x35, 0xfa, 0xc6, 0x7e, 0xdb, 0xc9, 0x16, 0x66, 0x1f, + 0x75, 0x7c, 0x10, 0x84, 0xd3, 0x58, 0x29, 0x77, 0x17, 0xf5, 0x5e, 0x5d, 0x64, 0xee, 0xa0, 0xb5, + 0x2c, 0x0b, 0xd4, 0xef, 0xb6, 0xf4, 0xf6, 0xaa, 0x5e, 0x9f, 0xf8, 0xe6, 0x67, 0x68, 0x93, 0x46, + 0x54, 0x52, 0x1c, 0xb8, 0x13, 0x50, 0xb7, 0xd1, 0x5d, 0xea, 0x1b, 0xfb, 0x9d, 0xc3, 0xfb, 0x36, + 0xf5, 0x88, 0xad, 0x2e, 0xd0, 0xce, 0xaf, 0x2d, 0x3d, 0xb0, 0x1f, 0x6b, 0x8d, 0xe3, 0xa5, 0x6f, + 0xbf, 0xdf, 0x5b, 0x70, 0x36, 0x72, 0xbb, 0x4c, 0x68, 0xbe, 0x8b, 0xd6, 0xc7, 0x10, 0x81, 0xa0, + 0xc2, 0x9d, 0x60, 0x31, 0xe9, 0x2e, 0xf7, 0x8d, 0xfd, 0x75, 0xa7, 0x93, 0xcb, 0x1e, 0x63, 0x31, + 0x31, 0xf7, 0x50, 0xc7, 0xa3, 0x11, 0xe6, 0xd3, 0x4c, 0x63, 0x45, 0x6b, 0xa0, 0x4c, 0xa4, 0x15, + 0x86, 0x08, 0x89, 0x18, 0xbf, 0x88, 0x5c, 0x95, 0xed, 0xee, 0x6a, 0x1e, 0x48, 0x96, 0x69, 0xbb, + 0xc8, 0xb4, 0x7d, 0x5e, 0x94, 0xc2, 0xf1, 0x9a, 0x0a, 0xe4, 0xab, 0xbf, 0xef, 0x19, 0x4e, 0x5b, + 0xdb, 0xa9, 0x1d, 0xf3, 0x0b, 0x74, 0x2b, 0x89, 0x3c, 0x16, 0xf9, 0x34, 0x1a, 0xbb, 0x31, 0x70, + 0xca, 0xfc, 0xee, 0x9a, 0x86, 0xda, 0xb9, 0x06, 0xf5, 0x30, 0x2f, 0x9a, 0x0c, 0xe9, 0x6b, 0x85, + 0xb4, 0x55, 0x1a, 0x8f, 0xb4, 0xad, 0xf9, 0x25, 0x32, 0x09, 0x49, 0x75, 0x48, 0x2c, 0x91, 0x05, + 0x62, 0x7b, 0x7e, 0xc4, 0x5b, 0x84, 0xa4, 0xe7, 0x99, 0x75, 0x0e, 0xf9, 0x5b, 0x74, 0x4f, 0x72, + 0x1c, 0x89, 0x67, 0xc0, 0x67, 0x71, 0xd1, 0xfc, 0xb8, 0x77, 0x0b, 0x8c, 0x26, 0xf8, 0x63, 0xd4, + 0x27, 0x79, 0x01, 0xb9, 0x1c, 0x7c, 0x2a, 0x24, 0xa7, 0x5e, 0xa2, 0x6c, 0xdd, 0x67, 0x1c, 0x13, + 0x5d, 0x23, 0x1d, 0x5d, 0x04, 0xbd, 0x42, 0xcf, 0x69, 0xa8, 0x3d, 0xca, 0xb5, 0xcc, 0x27, 0xe8, + 0x47, 0x5e, 0xc0, 0xc8, 0xa5, 0x50, 0xc1, 0xb9, 0x0d, 0x24, 0xed, 0x3a, 0xa4, 0x42, 0x28, 0xb4, + 0xf5, 0xbe, 0xb1, 0xdf, 0x72, 0xde, 0xcd, 0x74, 0x47, 0xc0, 0x1f, 0xd6, 0x34, 0xcf, 0x6b, 0x8a, + 0xe6, 0x87, 0xc8, 0x9c, 0x50, 0x21, 0x19, 0xa7, 0x04, 0x07, 0x2e, 0x44, 0x92, 0x53, 0x10, 0xdd, + 0x0d, 0x6d, 0x7e, 0xbb, 0xda, 0xf9, 0x34, 0xdb, 0x78, 0xb0, 0xf6, 0xfb, 0x6f, 0xf6, 0x16, 0xbe, + 0xfe, 0x66, 0x6f, 0xc1, 0xfa, 0xab, 0x81, 0xee, 0x0d, 0xcb, 0x60, 0x43, 0x96, 0xe2, 0xe0, 0xff, + 0xd9, 0x14, 0x47, 0xa8, 0x2d, 0x24, 0x8b, 0xb3, 0x32, 0x5c, 0x7a, 0x8b, 0x32, 0x5c, 0x53, 0x66, + 0x6a, 0xc3, 0xfa, 0xb3, 0x81, 0xb6, 0x3f, 0x7d, 0x9e, 0xd0, 0x94, 0x11, 0xfc, 0x3f, 0xe9, 0xe1, + 0x53, 0xb4, 0x01, 0x35, 0x3c, 0xd1, 0x6d, 0xf5, 0x5b, 0xfb, 0x9d, 0xc3, 0x1f, 0xdb, 0x19, 0xa1, + 0xd8, 0x25, 0xcf, 0xe4, 0xa4, 0x62, 0xd7, 0xbd, 0x3b, 0x4d, 0x5b, 0xeb, 0x5f, 0x06, 0xba, 0xf5, + 0x59, 0xc0, 0x3c, 0x1c, 0x9c, 0x05, 0x58, 0x4c, 0xd4, 0x85, 0x4f, 0xd5, 0xa9, 0x39, 0xe4, 0x95, + 0xae, 0xa3, 0x9b, 0xfb, 0xd4, 0xca, 0x4c, 0xf7, 0xde, 0x27, 0xe8, 0x76, 0x59, 0x7b, 0xe5, 0xe5, + 0xea, 0xc3, 0x1c, 0xdf, 0xb9, 0xfa, 0x7e, 0x6f, 0xab, 0xc8, 0xe1, 0x50, 0x5f, 0xf4, 0x43, 0x67, + 0x8b, 0x34, 0x04, 0xbe, 0xd9, 0x43, 0x1d, 0xea, 0x11, 0x57, 0xc0, 0x73, 0x37, 0x4a, 0x42, 0x9d, + 0x97, 0x25, 0xa7, 0x4d, 0x3d, 0x72, 0x06, 0xcf, 0xbf, 0x48, 0x42, 0xf3, 0x23, 0xf4, 0x4e, 0x31, + 0x3c, 0xdc, 0x14, 0x07, 0xae, 0xb2, 0x77, 0xb1, 0xef, 0x73, 0x9d, 0xa6, 0x75, 0xe7, 0x4e, 0xb1, + 0x7b, 0x81, 0x03, 0xe5, 0xec, 0xc8, 0xf7, 0xb9, 0xf5, 0xcf, 0x65, 0xb4, 0x32, 0xc2, 0x1c, 0x87, + 0xc2, 0x3c, 0x47, 0x5b, 0x12, 0xc2, 0x38, 0xc0, 0x12, 0xdc, 0x8c, 0xd7, 0xf2, 0x93, 0x7e, 0xa0, + 0xf9, 0xae, 0x3e, 0x0f, 0xec, 0xda, 0x04, 0x48, 0x0f, 0xec, 0xa1, 0x96, 0x9e, 0x49, 0x2c, 0xc1, + 0xd9, 0x2c, 0x30, 0x32, 0xa1, 0xf9, 0x33, 0xd4, 0x95, 0x3c, 0x11, 0xb2, 0x62, 0x9c, 0xaa, 0xd5, + 0xb2, 0x54, 0xbe, 0x53, 0xec, 0x67, 0x4d, 0x5a, 0xb6, 0xd8, 0xcd, 0xe4, 0xd2, 0xfa, 0x6f, 0xc8, + 0xe5, 0x0c, 0xdd, 0x51, 0xcc, 0x3c, 0x8b, 0xb9, 0x34, 0x3f, 0xe6, 0x6d, 0x65, 0xdf, 0x04, 0xfd, + 0x12, 0x99, 0xa9, 0x20, 0xb3, 0x98, 0xcb, 0x6f, 0x11, 0x67, 0x2a, 0x48, 0x13, 0xd2, 0x47, 0xbb, + 0x42, 0x15, 0x9f, 0x1b, 0x82, 0xd4, 0x54, 0x15, 0x07, 0x10, 0x51, 0x31, 0x29, 0xc0, 0x57, 0xe6, + 0x07, 0xdf, 0xd1, 0x40, 0x9f, 0x2b, 0x1c, 0xa7, 0x80, 0xc9, 0xbd, 0x0c, 0x51, 0xef, 0x66, 0x2f, + 0x65, 0x82, 0x56, 0x75, 0x82, 0x7e, 0x70, 0x03, 0x44, 0x99, 0xa5, 0x43, 0x74, 0x37, 0xc4, 0x2f, + 0x5d, 0x39, 0xe1, 0x4c, 0xca, 0x00, 0x7c, 0x37, 0xc6, 0xe4, 0x12, 0xa4, 0xd0, 0x73, 0xa5, 0xe5, + 0xdc, 0x09, 0xf1, 0xcb, 0xf3, 0x62, 0x6f, 0x94, 0x6d, 0x99, 0x02, 0xbd, 0x5f, 0xa3, 0xe1, 0x17, + 0x98, 0xfb, 0xae, 0x0f, 0x11, 0x0b, 0x5d, 0x0e, 0x63, 0xc5, 0x8f, 0x38, 0x63, 0x64, 0x80, 0x72, + 0x94, 0xe4, 0x8d, 0xac, 0x5e, 0x06, 0x65, 0x13, 0x0f, 0x19, 0x8d, 0xf2, 0x79, 0x6b, 0x55, 0x6c, + 0xad, 0xd0, 0x1e, 0x2a, 0x30, 0xa7, 0x86, 0xf5, 0x08, 0xc0, 0xf2, 0xd0, 0xed, 0xc7, 0x38, 0xf2, + 0xc5, 0x04, 0x5f, 0xc2, 0xe7, 0x20, 0xb1, 0x8f, 0x25, 0x6e, 0xf4, 0xcc, 0x33, 0x00, 0x37, 0x66, + 0x2c, 0xc8, 0x7a, 0x26, 0xa3, 0xa0, 0xb2, 0x67, 0x1e, 0x01, 0x8c, 0x18, 0x0b, 0x54, 0xcf, 0x98, + 0x5d, 0xb4, 0x9a, 0x02, 0x17, 0x55, 0x05, 0x17, 0x4b, 0xeb, 0x27, 0xa8, 0xad, 0x49, 0xe3, 0x88, + 0x5c, 0x0a, 0x73, 0x17, 0xb5, 0x15, 0x12, 0x08, 0x01, 0xa2, 0x6b, 0xf4, 0x5b, 0xfb, 0x6d, 0xa7, + 0x12, 0x58, 0x12, 0xed, 0xbc, 0xee, 0x2d, 0x23, 0xcc, 0xa7, 0x68, 0x35, 0x06, 0x3d, 0x68, 0xb5, + 0x61, 0xe7, 0xf0, 0x63, 0x7b, 0x8e, 0xf7, 0xa2, 0xfd, 0x3a, 0x40, 0xa7, 0x40, 0xb3, 0x78, 0xf5, + 0x82, 0x9a, 0x99, 0x15, 0xc2, 0xbc, 0x98, 0x75, 0xfa, 0xf3, 0xb7, 0x72, 0x3a, 0x83, 0x57, 0xf9, + 0xfc, 0x00, 0x75, 0x8e, 0xb2, 0x63, 0xff, 0x92, 0x0a, 0x79, 0xfd, 0x5a, 0xd6, 0xeb, 0xd7, 0xf2, + 0x0b, 0xb4, 0x39, 0x9c, 0xe0, 0x28, 0x82, 0xe0, 0x9c, 0x69, 0xe2, 0x33, 0x7f, 0x88, 0x10, 0xc9, + 0x24, 0x8a, 0x30, 0xb3, 0xb4, 0xb4, 0x73, 0xc9, 0x89, 0xdf, 0x18, 0x55, 0x8b, 0x8d, 0x51, 0x65, + 0x39, 0x68, 0xeb, 0x42, 0x90, 0x5f, 0x15, 0x6f, 0x96, 0x27, 0xb1, 0x30, 0xef, 0xa2, 0x15, 0xd5, + 0xab, 0x39, 0xd0, 0x92, 0xb3, 0x9c, 0x0a, 0x72, 0xe2, 0x9b, 0xfb, 0xf5, 0x77, 0x11, 0x8b, 0x5d, + 0xea, 0x8b, 0xee, 0x62, 0xbf, 0xb5, 0xbf, 0xe4, 0x6c, 0x26, 0x95, 0xf9, 0x89, 0x2f, 0xac, 0x5f, + 0xa3, 0x4e, 0x0d, 0xd0, 0xdc, 0x44, 0x8b, 0x25, 0xd6, 0x22, 0xf5, 0xcd, 0x07, 0x68, 0xa7, 0x02, + 0x6a, 0xd2, 0x7d, 0x86, 0xd8, 0x76, 0xee, 0x95, 0x0a, 0x0d, 0xc6, 0x17, 0xd6, 0x13, 0xb4, 0x7d, + 0x52, 0x91, 0x4b, 0x39, 0x4c, 0x1a, 0x27, 0x34, 0x9a, 0xc3, 0x78, 0x17, 0xb5, 0xcb, 0xc7, 0xbf, + 0x3e, 0xfd, 0x92, 0x53, 0x09, 0xac, 0x10, 0xdd, 0xba, 0x10, 0xe4, 0x0c, 0x22, 0xbf, 0x02, 0x7b, + 0xcd, 0x05, 0x1c, 0xcf, 0x02, 0xcd, 0xfd, 0xb8, 0xac, 0xdc, 0xfd, 0xc1, 0x40, 0xdd, 0x53, 0x98, + 0x1e, 0x09, 0x41, 0xc7, 0x51, 0x08, 0x91, 0x54, 0x64, 0x81, 0x09, 0xa8, 0x4f, 0xf3, 0x3d, 0xb4, + 0x51, 0x36, 0x5a, 0xd9, 0x5f, 0xeb, 0xce, 0x7a, 0x21, 0xd4, 0x8d, 0xf5, 0x00, 0xa1, 0x98, 0x43, + 0xea, 0x12, 0xf7, 0x12, 0xa6, 0x79, 0x18, 0xbb, 0xf5, 0x59, 0x93, 0xfd, 0x5b, 0xd8, 0xa3, 0xc4, + 0x0b, 0x28, 0x39, 0x85, 0xa9, 0xb3, 0xa6, 0xf4, 0x87, 0xa7, 0x30, 0x55, 0x6f, 0x87, 0x98, 0xbd, + 0x00, 0xae, 0x07, 0x44, 0xcb, 0xc9, 0x16, 0xd6, 0x9f, 0x0c, 0x74, 0xef, 0x02, 0x07, 0xd4, 0xc7, + 0x92, 0xf1, 0xe2, 0xbe, 0x47, 0x89, 0xa7, 0x2c, 0xde, 0x70, 0xaf, 0xd7, 0xa2, 0x5d, 0xbc, 0x21, + 0xda, 0x4f, 0xd0, 0x7a, 0x99, 0x61, 0x15, 0x6f, 0x6b, 0x8e, 0x78, 0x3b, 0x85, 0xc5, 0x29, 0x4c, + 0xad, 0xdf, 0xd5, 0x62, 0x3b, 0x9e, 0xd6, 0x9a, 0x97, 0xff, 0x87, 0xd8, 0x4a, 0xb7, 0xf5, 0xd8, + 0x48, 0xdd, 0xfe, 0xda, 0x01, 0x5a, 0xd7, 0x0f, 0x60, 0xfd, 0xc5, 0x40, 0xdb, 0x75, 0xaf, 0xe2, + 0x9c, 0x8d, 0x78, 0x12, 0xc1, 0x9b, 0xbc, 0x57, 0xf5, 0xb3, 0x58, 0xaf, 0x9f, 0xa7, 0x68, 0xb3, + 0x11, 0x94, 0xc8, 0x6f, 0xe3, 0xa7, 0x73, 0x51, 0x48, 0x8d, 0x1e, 0x9c, 0x8d, 0xfa, 0x39, 0xc4, + 0xf1, 0xd3, 0x6f, 0xaf, 0x7a, 0xc6, 0x77, 0x57, 0x3d, 0xe3, 0x1f, 0x57, 0x3d, 0xe3, 0xab, 0x57, + 0xbd, 0x85, 0xef, 0x5e, 0xf5, 0x16, 0xfe, 0xf6, 0xaa, 0xb7, 0xf0, 0x9b, 0x8f, 0xc7, 0x54, 0x4e, + 0x12, 0xcf, 0x26, 0x2c, 0x1c, 0xe4, 0x3f, 0x8e, 0x95, 0xaf, 0x0f, 0xcb, 0xff, 0xf0, 0xf4, 0x70, + 0xf0, 0xb2, 0xf9, 0x33, 0x2e, 0xa7, 0x31, 0x08, 0x6f, 0x45, 0x97, 0xf5, 0x47, 0xff, 0x0e, 0x00, + 0x00, 0xff, 0xff, 0x50, 0x7d, 0x10, 0xbd, 0xbd, 0x0f, 0x00, 0x00, } func (m *ConsumerAdditionProposal) Marshal() (dAtA []byte, err error) { @@ -1794,7 +1794,7 @@ func (m *ConsumerAdditionProposals) MarshalToSizedBuffer(dAtA []byte) (int, erro return len(dAtA) - i, nil } -func (m *AddressList) Marshal() (dAtA []byte, err error) { +func (m *ConsumerRemovalProposals) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1804,21 +1804,26 @@ func (m *AddressList) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *AddressList) MarshalTo(dAtA []byte) (int, error) { +func (m *ConsumerRemovalProposals) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *AddressList) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ConsumerRemovalProposals) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Addresses) > 0 { - for iNdEx := len(m.Addresses) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Addresses[iNdEx]) - copy(dAtA[i:], m.Addresses[iNdEx]) - i = encodeVarintProvider(dAtA, i, uint64(len(m.Addresses[iNdEx]))) + if len(m.Pending) > 0 { + for iNdEx := len(m.Pending) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Pending[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProvider(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0xa } @@ -1826,7 +1831,7 @@ func (m *AddressList) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ConsumerRemovalProposals) Marshal() (dAtA []byte, err error) { +func (m *AddressList) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1836,26 +1841,21 @@ func (m *ConsumerRemovalProposals) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ConsumerRemovalProposals) MarshalTo(dAtA []byte) (int, error) { +func (m *AddressList) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ConsumerRemovalProposals) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *AddressList) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Pending) > 0 { - for iNdEx := len(m.Pending) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Pending[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintProvider(dAtA, i, uint64(size)) - } + if len(m.Addresses) > 0 { + for iNdEx := len(m.Addresses) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Addresses[iNdEx]) + copy(dAtA[i:], m.Addresses[iNdEx]) + i = encodeVarintProvider(dAtA, i, uint64(len(m.Addresses[iNdEx]))) i-- dAtA[i] = 0xa } @@ -2450,30 +2450,30 @@ func (m *ConsumerAdditionProposals) Size() (n int) { return n } -func (m *AddressList) Size() (n int) { +func (m *ConsumerRemovalProposals) Size() (n int) { if m == nil { return 0 } var l int _ = l - if len(m.Addresses) > 0 { - for _, b := range m.Addresses { - l = len(b) + if len(m.Pending) > 0 { + for _, e := range m.Pending { + l = e.Size() n += 1 + l + sovProvider(uint64(l)) } } return n } -func (m *ConsumerRemovalProposals) Size() (n int) { +func (m *AddressList) Size() (n int) { if m == nil { return 0 } var l int _ = l - if len(m.Pending) > 0 { - for _, e := range m.Pending { - l = e.Size() + if len(m.Addresses) > 0 { + for _, b := range m.Addresses { + l = len(b) n += 1 + l + sovProvider(uint64(l)) } } @@ -4210,7 +4210,7 @@ func (m *ConsumerAdditionProposals) Unmarshal(dAtA []byte) error { } return nil } -func (m *AddressList) Unmarshal(dAtA []byte) error { +func (m *ConsumerRemovalProposals) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4233,17 +4233,17 @@ func (m *AddressList) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AddressList: wiretype end group for non-group") + return fmt.Errorf("proto: ConsumerRemovalProposals: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AddressList: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ConsumerRemovalProposals: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Pending", wireType) } - var byteLen int + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowProvider @@ -4253,23 +4253,25 @@ func (m *AddressList) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + if msglen < 0 { return ErrInvalidLengthProvider } - postIndex := iNdEx + byteLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthProvider } if postIndex > l { return io.ErrUnexpectedEOF } - m.Addresses = append(m.Addresses, make([]byte, postIndex-iNdEx)) - copy(m.Addresses[len(m.Addresses)-1], dAtA[iNdEx:postIndex]) + m.Pending = append(m.Pending, &ConsumerRemovalProposal{}) + if err := m.Pending[len(m.Pending)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -4292,7 +4294,7 @@ func (m *AddressList) Unmarshal(dAtA []byte) error { } return nil } -func (m *ConsumerRemovalProposals) Unmarshal(dAtA []byte) error { +func (m *AddressList) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4315,17 +4317,17 @@ func (m *ConsumerRemovalProposals) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ConsumerRemovalProposals: wiretype end group for non-group") + return fmt.Errorf("proto: AddressList: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ConsumerRemovalProposals: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AddressList: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pending", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowProvider @@ -4335,25 +4337,23 @@ func (m *ConsumerRemovalProposals) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthProvider } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthProvider } if postIndex > l { return io.ErrUnexpectedEOF } - m.Pending = append(m.Pending, &ConsumerRemovalProposal{}) - if err := m.Pending[len(m.Pending)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Addresses = append(m.Addresses, make([]byte, postIndex-iNdEx)) + copy(m.Addresses[len(m.Addresses)-1], dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex From e78e641a90d7b3dcd4caebfab0eee313b61431e4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 May 2023 09:33:24 -0700 Subject: [PATCH 026/108] build(deps): bump github.com/cosmos/ibc-go/v4 from 4.4.0 to 4.4.2 (#982) * build(deps): bump github.com/cosmos/ibc-go/v4 from 4.4.0 to 4.4.2 Bumps [github.com/cosmos/ibc-go/v4](https://github.com/cosmos/ibc-go) from 4.4.0 to 4.4.2. - [Release notes](https://github.com/cosmos/ibc-go/releases) - [Changelog](https://github.com/cosmos/ibc-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/cosmos/ibc-go/compare/v4.4.0...v4.4.2) --- updated-dependencies: - dependency-name: github.com/cosmos/ibc-go/v4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * update changelog --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: mpoke Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> --- CHANGELOG.md | 1 + go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 738f4a82cf..9799793678 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ Some PRs from v2.0.0 may reappear from other releases below. This is due to the ## PRs included in v2.0.0 +* (deps) Bump github.com/cosmos/ibc-go/v4 from 4.4.0 to 4.4.2 [#982](https://github.com/cosmos/interchain-security/pull/982) * (fix) partially revert key assignment type safety PR [#980](https://github.com/cosmos/interchain-security/pull/980) * (fix) Remove panics on failure to send IBC packets [#876](https://github.com/cosmos/interchain-security/pull/876) * (fix) consumer key prefix order to avoid complex migrations [#963](https://github.com/cosmos/interchain-security/pull/963) diff --git a/go.mod b/go.mod index 6fd0f70305..db3f2b531d 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.19 require ( github.com/confio/ics23/go v0.9.0 github.com/cosmos/cosmos-sdk v0.45.15 - github.com/cosmos/ibc-go/v4 v4.4.0 + github.com/cosmos/ibc-go/v4 v4.4.2 github.com/gogo/protobuf v1.3.3 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.3 diff --git a/go.sum b/go.sum index 43b9f519c0..7b6281a653 100644 --- a/go.sum +++ b/go.sum @@ -240,8 +240,8 @@ github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4 github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= github.com/cosmos/iavl v0.19.5 h1:rGA3hOrgNxgRM5wYcSCxgQBap7fW82WZgY78V9po/iY= github.com/cosmos/iavl v0.19.5/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= -github.com/cosmos/ibc-go/v4 v4.4.0 h1:OEsSLBP1yoLzONQ/1Tf44ateEgS2YHyhTkecvuenk7k= -github.com/cosmos/ibc-go/v4 v4.4.0/go.mod h1:FYZ7ublN6jMojaRND1ST0bTfLKfQnlaxqJbUn7WhzvU= +github.com/cosmos/ibc-go/v4 v4.4.2 h1:PG4Yy0/bw6Hvmha3RZbc53KYzaCwuB07Ot4GLyzcBvo= +github.com/cosmos/ibc-go/v4 v4.4.2/go.mod h1:j/kD2JCIaV5ozvJvaEkWhLxM2zva7/KTM++EtKFYcB8= github.com/cosmos/ledger-cosmos-go v0.12.2 h1:/XYaBlE2BJxtvpkHiBm97gFGSGmYGKunKyF3nNqAXZA= github.com/cosmos/ledger-cosmos-go v0.12.2/go.mod h1:ZcqYgnfNJ6lAXe4HPtWgarNEY+B74i+2/8MhZw4ziiI= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= From deed467e64efc96745d9b8e6a0f4bcd4d5e75eae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 May 2023 10:17:55 -0700 Subject: [PATCH 027/108] build(deps): bump JamesIves/github-pages-deploy-action from 4.4.1 to 4.4.2 (#983) build(deps): bump JamesIves/github-pages-deploy-action Bumps [JamesIves/github-pages-deploy-action](https://github.com/JamesIves/github-pages-deploy-action) from 4.4.1 to 4.4.2. - [Release notes](https://github.com/JamesIves/github-pages-deploy-action/releases) - [Commits](https://github.com/JamesIves/github-pages-deploy-action/compare/v4.4.1...v4.4.2) --- updated-dependencies: - dependency-name: JamesIves/github-pages-deploy-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> --- .github/workflows/deploy-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 6af3462201..87b4ced180 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -40,7 +40,7 @@ jobs: make build-docs - name: Deploy 🚀 - uses: JamesIves/github-pages-deploy-action@v4.4.1 + uses: JamesIves/github-pages-deploy-action@v4.4.2 with: branch: gh-pages folder: ~/output From eaa34dc7f922d7d4b34b660f1a14faa0993e3508 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 31 May 2023 07:16:53 -0700 Subject: [PATCH 028/108] build(deps): bump github.com/stretchr/testify from 1.8.3 to 1.8.4 (#985) Bumps [github.com/stretchr/testify](https://github.com/stretchr/testify) from 1.8.3 to 1.8.4. - [Release notes](https://github.com/stretchr/testify/releases) - [Commits](https://github.com/stretchr/testify/compare/v1.8.3...v1.8.4) --- updated-dependencies: - dependency-name: github.com/stretchr/testify dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Marius Poke --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index db3f2b531d..58b8eaa667 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/regen-network/cosmos-proto v0.3.1 github.com/spf13/cast v1.5.1 github.com/spf13/cobra v1.7.0 - github.com/stretchr/testify v1.8.3 + github.com/stretchr/testify v1.8.4 github.com/tendermint/tendermint v0.34.27 github.com/tendermint/tm-db v0.6.7 github.com/tidwall/gjson v1.14.4 diff --git a/go.sum b/go.sum index 7b6281a653..ed38bf1bab 100644 --- a/go.sum +++ b/go.sum @@ -968,8 +968,8 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= From 9f2be6c3fc75e8b7ffdfddf5d6d2b5cd61e74097 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Thu, 1 Jun 2023 10:27:43 -0700 Subject: [PATCH 029/108] feat: v2 migrations (#975) * v2 imports * Squashed commit of the following: commit a4c9224f854ecef9b8a0216a4c348c13368cdd06 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Wed May 24 10:13:10 2023 -0700 Revert "Merge branch 'shawn/v2-imports' into shawn/ccv-migrations" This reverts commit 53e3362749c05de1a44da1bbe632d8b7265eee5a, reversing changes made to 9c3f3380cbffe43f3a6d2c2b5e71c1412869786d. commit 6885ad1dffed403e21fe5a97421d21afe321ae98 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Wed May 24 10:12:49 2023 -0700 Revert "Merge branch 'shawn/v2-imports' into shawn/ccv-migrations" This reverts commit 45d74c70ff6e41d585255f039c5f814340e4bed1, reversing changes made to 53e3362749c05de1a44da1bbe632d8b7265eee5a. commit 958914412a72ebd2b79dccdfd92ec43104a431bb Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 14:48:06 2023 -0700 provider migration boilerplate commit 9521ecb3a8b9e7d87df183f879b3680bf65613e3 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 12:25:14 2023 -0700 lint commit fc3f27364c283aef53c305730f75f0e9e299d60b Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 12:20:33 2023 -0700 old default params commit 80a490cb57dc684dd740a27d753508f0a118c174 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 12:15:30 2023 -0700 naming commit 45d74c70ff6e41d585255f039c5f814340e4bed1 Merge: 53e33627 8e6bdfb2 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 12:12:03 2023 -0700 Merge branch 'shawn/v2-imports' into shawn/ccv-migrations commit 8e6bdfb21f53374874c3ea102ce04fe07f162b1d Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 12:10:22 2023 -0700 proto name for gov prop registration commit 53e3362749c05de1a44da1bbe632d8b7265eee5a Merge: 9c3f3380 5ca68d14 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 12:05:39 2023 -0700 Merge branch 'shawn/v2-imports' into shawn/ccv-migrations commit 5ca68d142070a8995b34c5111bc8e85363eac257 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 11:53:12 2023 -0700 fix e2e tests commit aa6bd0c87c93f6b1963ce7d71b51e22afe35b821 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 11:42:47 2023 -0700 rm bad files commit 6e3dc88d5a08cdaf039b0eef9c078e4461278f82 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 11:42:14 2023 -0700 correct generation commit 056ef7a71ef2b78ee22442be4978e02da9f2ca27 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 11:29:45 2023 -0700 proto upgrade too commit 9c3f3380cbffe43f3a6d2c2b5e71c1412869786d Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 10:57:25 2023 -0700 remove hardcoded old code commit 1e731730f34dd9bc5a0dda6a63095d9703c4379b Merge: dbf9dede 8769fd56 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 10:07:31 2023 -0700 Merge branch 'shawn/v2-imports' into shawn/ccv-migrations commit 8769fd5649713445c1770b8eb98d88ba5ded2d84 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 09:58:28 2023 -0700 v2 imports commit dbf9dede2a8935098cddae7db111b86659f92a4a Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Mon May 22 16:10:05 2023 -0700 provider migration commit 2d95e2e41bcf9812b5a22e06de8e5444ce0ed60a Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Mon May 22 15:01:47 2023 -0700 improve consumer test commit 85f4cfdd418d464bdd935f0ae2ceab6fe04e73c2 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Mon May 22 14:03:20 2023 -0700 consumer params * rm old code * go.mod restore * better naming of hardcodes * consumer boilerplate * comments * migrate consumer genesis states * test and cleans * lint * migration and partial test * cleans * finish test * comments and doc * Update migration_test.go * Update CHANGELOG.md * expand in changelog * increment consensus ver * set key table on construction * rm semver migration funcs * comment explaining consensus version --- CHANGELOG.md | 1 + app/consumer-democracy/app.go | 6 +- app/consumer/app.go | 6 +- app/provider/app.go | 6 +- x/ccv/consumer/ibc_module_test.go | 30 ++-- x/ccv/consumer/keeper/keeper.go | 6 + x/ccv/consumer/keeper/migration.go | 79 ++++++++++ x/ccv/consumer/keeper/migration_test.go | 146 ++++++++++++++++++ x/ccv/consumer/module.go | 24 ++- x/ccv/consumer/types/params.go | 28 ++-- x/ccv/provider/ibc_module_test.go | 20 ++- x/ccv/provider/keeper/keeper.go | 10 ++ x/ccv/provider/keeper/migration.go | 178 ++++++++++++++++++++++ x/ccv/provider/keeper/migration_test.go | 190 ++++++++++++++++++++++++ x/ccv/provider/module.go | 16 +- x/ccv/provider/module_test.go | 2 +- x/ccv/provider/types/params.go | 12 +- 17 files changed, 704 insertions(+), 56 deletions(-) create mode 100644 x/ccv/consumer/keeper/migration.go create mode 100644 x/ccv/consumer/keeper/migration_test.go create mode 100644 x/ccv/provider/keeper/migration.go create mode 100644 x/ccv/provider/keeper/migration_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 9799793678..526d82baae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ Some PRs from v2.0.0 may reappear from other releases below. This is due to the ## PRs included in v2.0.0 +* (feat) v1->v2 migrations to accommodate a bugfix having to do with store keys, introduce new params, and deal with consumer genesis state schema changes [#975](https://github.com/cosmos/interchain-security/pull/975) * (deps) Bump github.com/cosmos/ibc-go/v4 from 4.4.0 to 4.4.2 [#982](https://github.com/cosmos/interchain-security/pull/982) * (fix) partially revert key assignment type safety PR [#980](https://github.com/cosmos/interchain-security/pull/980) * (fix) Remove panics on failure to send IBC packets [#876](https://github.com/cosmos/interchain-security/pull/876) diff --git a/app/consumer-democracy/app.go b/app/consumer-democracy/app.go index 13c5f50dae..ee299d6221 100644 --- a/app/consumer-democracy/app.go +++ b/app/consumer-democracy/app.go @@ -117,7 +117,7 @@ import ( const ( AppName = "interchain-security-cd" - upgradeName = "v07-Theta" // arbitrary name, define your own appropriately named upgrade + upgradeName = "ics-v1-to-v2" // arbitrary name, define your own appropriately named upgrade AccountAddressPrefix = "cosmos" ) @@ -441,7 +441,7 @@ func New( // register slashing module StakingHooks to the consumer keeper app.ConsumerKeeper = *app.ConsumerKeeper.SetHooks(app.SlashingKeeper.Hooks()) - consumerModule := consumer.NewAppModule(app.ConsumerKeeper) + consumerModule := consumer.NewAppModule(app.ConsumerKeeper, app.GetSubspace(consumertypes.ModuleName)) app.TransferKeeper = ibctransferkeeper.NewKeeper( appCodec, @@ -628,6 +628,8 @@ func New( app.SetBeginBlocker(app.BeginBlocker) app.SetEndBlocker(app.EndBlocker) + // Note this upgrade handler is just an example and may not be exactly what you need to implement. + // See https://docs.cosmos.network/v0.45/building-modules/upgrade.html app.UpgradeKeeper.SetUpgradeHandler( upgradeName, func(ctx sdk.Context, _ upgradetypes.Plan, _ module.VersionMap) (module.VersionMap, error) { diff --git a/app/consumer/app.go b/app/consumer/app.go index c100a0385e..343349b040 100644 --- a/app/consumer/app.go +++ b/app/consumer/app.go @@ -90,7 +90,7 @@ import ( const ( AppName = "interchain-security-c" - upgradeName = "v07-Theta" + upgradeName = "ics-v1-to-v2" AccountAddressPrefix = "cosmos" ) @@ -343,7 +343,7 @@ func New( // register slashing module Slashing hooks to the consumer keeper app.ConsumerKeeper = *app.ConsumerKeeper.SetHooks(app.SlashingKeeper.Hooks()) - consumerModule := ibcconsumer.NewAppModule(app.ConsumerKeeper) + consumerModule := ibcconsumer.NewAppModule(app.ConsumerKeeper, app.GetSubspace(ibcconsumertypes.ModuleName)) app.TransferKeeper = ibctransferkeeper.NewKeeper( appCodec, @@ -510,6 +510,8 @@ func New( app.SetBeginBlocker(app.BeginBlocker) app.SetEndBlocker(app.EndBlocker) + // Note this upgrade handler is just an example and may not be exactly what you need to implement. + // See https://docs.cosmos.network/v0.45/building-modules/upgrade.html app.UpgradeKeeper.SetUpgradeHandler( upgradeName, func(ctx sdk.Context, _ upgradetypes.Plan, _ module.VersionMap) (module.VersionMap, error) { diff --git a/app/provider/app.go b/app/provider/app.go index 20aa133dee..94719cf2c6 100644 --- a/app/provider/app.go +++ b/app/provider/app.go @@ -109,7 +109,7 @@ import ( const ( AppName = "interchain-security-p" - upgradeName = "v07-Theta" + upgradeName = "ics-v1-to-v2" AccountAddressPrefix = "cosmos" ) @@ -415,7 +415,7 @@ func New( authtypes.FeeCollectorName, ) - providerModule := ibcprovider.NewAppModule(&app.ProviderKeeper) + providerModule := ibcprovider.NewAppModule(&app.ProviderKeeper, app.GetSubspace(providertypes.ModuleName)) // register the proposal types govRouter := govtypes.NewRouter() @@ -616,6 +616,8 @@ func New( app.SetBeginBlocker(app.BeginBlocker) app.SetEndBlocker(app.EndBlocker) + // Note this upgrade handler is just an example and may not be exactly what you need to implement. + // See https://docs.cosmos.network/v0.45/building-modules/upgrade.html app.UpgradeKeeper.SetUpgradeHandler( upgradeName, func(ctx sdk.Context, _ upgradetypes.Plan, _ module.VersionMap) (module.VersionMap, error) { diff --git a/x/ccv/consumer/ibc_module_test.go b/x/ccv/consumer/ibc_module_test.go index fcc82d6d2f..fc6c3d2200 100644 --- a/x/ccv/consumer/ibc_module_test.go +++ b/x/ccv/consumer/ibc_module_test.go @@ -121,9 +121,10 @@ func TestOnChanOpenInit(t *testing.T) { for _, tc := range testCases { // Common setup + keeperParams := testkeeper.NewInMemKeeperParams(t) consumerKeeper, ctx, ctrl, mocks := testkeeper.GetConsumerKeeperAndCtx( - t, testkeeper.NewInMemKeeperParams(t)) - consumerModule := consumer.NewAppModule(consumerKeeper) + t, keeperParams) + consumerModule := consumer.NewAppModule(consumerKeeper, *keeperParams.ParamsSubspace) consumerKeeper.SetPort(ctx, ccv.ConsumerPortID) consumerKeeper.SetProviderClientID(ctx, "clientIDToProvider") @@ -172,10 +173,11 @@ func TestOnChanOpenInit(t *testing.T) { // See: https://github.com/cosmos/ibc/blob/main/spec/app/ics-028-cross-chain-validation/methods.md#ccv-ccf-cotry1 // Spec tag: [CCV-CCF-COTRY.1] func TestOnChanOpenTry(t *testing.T) { - consumerKeeper, ctx, ctrl, _ := testkeeper.GetConsumerKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) + keeperParams := testkeeper.NewInMemKeeperParams(t) + consumerKeeper, ctx, ctrl, _ := testkeeper.GetConsumerKeeperAndCtx(t, keeperParams) // No external keeper methods should be called defer ctrl.Finish() - consumerModule := consumer.NewAppModule(consumerKeeper) + consumerModule := consumer.NewAppModule(consumerKeeper, *keeperParams.ParamsSubspace) // OnOpenTry must error even with correct arguments _, err := consumerModule.OnChanOpenTry( @@ -266,9 +268,10 @@ func TestOnChanOpenAck(t *testing.T) { for _, tc := range testCases { // Common setup + keeperParams := testkeeper.NewInMemKeeperParams(t) consumerKeeper, ctx, ctrl, mocks := testkeeper.GetConsumerKeeperAndCtx( - t, testkeeper.NewInMemKeeperParams(t)) - consumerModule := consumer.NewAppModule(consumerKeeper) + t, keeperParams) + consumerModule := consumer.NewAppModule(consumerKeeper, *keeperParams.ParamsSubspace) // Instantiate valid params as default. Individual test cases mutate these as needed. params := params{ @@ -316,9 +319,10 @@ func TestOnChanOpenAck(t *testing.T) { // See: https://github.com/cosmos/ibc/blob/main/spec/app/ics-028-cross-chain-validation/methods.md#ccv-ccf-coconfirm1 // Spec tag: [CCV-CCF-COCONFIRM.1] func TestOnChanOpenConfirm(t *testing.T) { - consumerKeeper, ctx, ctrl, _ := testkeeper.GetConsumerKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) + keeperParams := testkeeper.NewInMemKeeperParams(t) + consumerKeeper, ctx, ctrl, _ := testkeeper.GetConsumerKeeperAndCtx(t, keeperParams) defer ctrl.Finish() - consumerModule := consumer.NewAppModule(consumerKeeper) + consumerModule := consumer.NewAppModule(consumerKeeper, *keeperParams.ParamsSubspace) err := consumerModule.OnChanOpenConfirm(ctx, ccv.ConsumerPortID, "channel-1") require.Error(t, err, "OnChanOpenConfirm callback must error on consumer chain") @@ -356,8 +360,9 @@ func TestOnChanCloseInit(t *testing.T) { } for _, tc := range testCases { - consumerKeeper, ctx, ctrl, _ := testkeeper.GetConsumerKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) - consumerModule := consumer.NewAppModule(consumerKeeper) + keeperParams := testkeeper.NewInMemKeeperParams(t) + consumerKeeper, ctx, ctrl, _ := testkeeper.GetConsumerKeeperAndCtx(t, keeperParams) + consumerModule := consumer.NewAppModule(consumerKeeper, *keeperParams.ParamsSubspace) if tc.establishedProviderExists { consumerKeeper.SetProviderChannel(ctx, "provider") @@ -379,12 +384,13 @@ func TestOnChanCloseInit(t *testing.T) { // See: https://github.com/cosmos/ibc/blob/main/spec/app/ics-028-cross-chain-validation/methods.md#ccv-pcf-ccconfirm1// Spec tag: [CCV-CCF-CCINIT.1] // Spec tag: [CCV-PCF-CCCONFIRM.1] func TestOnChanCloseConfirm(t *testing.T) { - consumerKeeper, ctx, ctrl, _ := testkeeper.GetConsumerKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) + keeperParams := testkeeper.NewInMemKeeperParams(t) + consumerKeeper, ctx, ctrl, _ := testkeeper.GetConsumerKeeperAndCtx(t, keeperParams) // No external keeper methods should be called defer ctrl.Finish() - consumerModule := consumer.NewAppModule(consumerKeeper) + consumerModule := consumer.NewAppModule(consumerKeeper, *keeperParams.ParamsSubspace) // Nothing happens, no error returned err := consumerModule.OnChanCloseConfirm(ctx, "portID", "channelID") diff --git a/x/ccv/consumer/keeper/keeper.go b/x/ccv/consumer/keeper/keeper.go index ec89052ac0..54c1cd5577 100644 --- a/x/ccv/consumer/keeper/keeper.go +++ b/x/ccv/consumer/keeper/keeper.go @@ -92,6 +92,12 @@ func (k *Keeper) SetStandaloneStakingKeeper(sk ccv.StakingKeeper) { k.standaloneStakingKeeper = sk } +// SetParamSpace sets the param space for the consumer keeper. +// Note: this is only used for testing! +func (k *Keeper) SetParamSpace(ctx sdk.Context, ps paramtypes.Subspace) { + k.paramStore = ps +} + // Validates that the consumer keeper is initialized with non-zero and // non-nil values for all its fields. Otherwise this method will panic. func (k Keeper) mustValidateFields() { diff --git a/x/ccv/consumer/keeper/migration.go b/x/ccv/consumer/keeper/migration.go new file mode 100644 index 0000000000..a44b89404b --- /dev/null +++ b/x/ccv/consumer/keeper/migration.go @@ -0,0 +1,79 @@ +package keeper + +import ( + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" +) + +// Migrator is a struct for handling in-place store migrations. +type Migrator struct { + ccvConsumerKeeper Keeper + ccvConsumerParamSpace paramtypes.Subspace +} + +// NewMigrator returns a new Migrator. +func NewMigrator(ccvConsumerKeeper Keeper, ccvConsumerParamSpace paramtypes.Subspace) Migrator { + return Migrator{ccvConsumerKeeper: ccvConsumerKeeper, ccvConsumerParamSpace: ccvConsumerParamSpace} +} + +// Note: If migrating from v1.2.0-multiden to v2.0.0, there are no migrations required. +// This is due to the fact that the former version includes both of: +// - https://github.com/cosmos/interchain-security/commit/54e9852d3c89a2513cd0170a56c6eec894fc878d +// - https://github.com/cosmos/interchain-security/pull/833 +// both of which handle the introduction of new params. + +// Migratev1Tov2 migrates a consumer from v1.0.0 to v2.0.0. +func (m Migrator) Migratev1Tov2(ctx sdk.Context) error { + // Migrate params + MigrateParamsv1Tov2(ctx, m.ccvConsumerParamSpace) + + return nil +} + +// MigrateParamsv1Tov2 migrates the consumer CCV module params from v1.0.0 to v2.0.0, +// setting default values for new params. +func MigrateParamsv1Tov2(ctx sdk.Context, paramsSubspace paramtypes.Subspace) { + // Get old params + var enabled bool + paramsSubspace.Get(ctx, consumertypes.KeyEnabled, &enabled) + var blocksPerDistributionTransmission int64 + paramsSubspace.Get(ctx, consumertypes.KeyBlocksPerDistributionTransmission, &blocksPerDistributionTransmission) + var distributionTransmissionChannel string + paramsSubspace.Get(ctx, consumertypes.KeyDistributionTransmissionChannel, &distributionTransmissionChannel) + var providerFeePoolAddrStr string + paramsSubspace.Get(ctx, consumertypes.KeyProviderFeePoolAddrStr, &providerFeePoolAddrStr) + var ccvTimeoutPeriod time.Duration + paramsSubspace.Get(ctx, ccvtypes.KeyCCVTimeoutPeriod, &ccvTimeoutPeriod) + var transferTimeoutPeriod time.Duration + paramsSubspace.Get(ctx, consumertypes.KeyTransferTimeoutPeriod, &transferTimeoutPeriod) + var consumerRedistributionFrac string + paramsSubspace.Get(ctx, consumertypes.KeyConsumerRedistributionFrac, &consumerRedistributionFrac) + var historicalEntries int64 + paramsSubspace.Get(ctx, consumertypes.KeyHistoricalEntries, &historicalEntries) + var unbondingPeriod time.Duration + paramsSubspace.Get(ctx, consumertypes.KeyConsumerUnbondingPeriod, &unbondingPeriod) + + // Recycle old params, set new params to default values + defaultParams := consumertypes.DefaultParams() + newParams := consumertypes.NewParams( + enabled, + blocksPerDistributionTransmission, + distributionTransmissionChannel, + providerFeePoolAddrStr, + ccvTimeoutPeriod, + transferTimeoutPeriod, + consumerRedistributionFrac, + historicalEntries, + unbondingPeriod, + defaultParams.SoftOptOutThreshold, + defaultParams.RewardDenoms, + defaultParams.ProviderRewardDenoms, + ) + + // Persist new params + paramsSubspace.SetParamSet(ctx, &newParams) +} diff --git a/x/ccv/consumer/keeper/migration_test.go b/x/ccv/consumer/keeper/migration_test.go new file mode 100644 index 0000000000..ee14d2bcc8 --- /dev/null +++ b/x/ccv/consumer/keeper/migration_test.go @@ -0,0 +1,146 @@ +package keeper_test + +import ( + "testing" + "time" + + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/store" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" + consumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" + "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/libs/log" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + tmdb "github.com/tendermint/tm-db" +) + +func TestMigrateParamsv1Tov2(t *testing.T) { + // Setup raw store + db := tmdb.NewMemDB() + stateStore := store.NewCommitMultiStore(db) + storeKey := sdk.NewKVStoreKey(paramtypes.StoreKey) + memStoreKey := storetypes.NewMemoryStoreKey("mem_key") + stateStore.MountStoreWithDB(storeKey, sdk.StoreTypeIAVL, db) + stateStore.MountStoreWithDB(memStoreKey, sdk.StoreTypeMemory, nil) + require.NoError(t, stateStore.LoadLatestVersion()) + registry := codectypes.NewInterfaceRegistry() + cdc := codec.NewProtoCodec(registry) + ctx := sdk.NewContext(stateStore, tmproto.Header{}, false, log.NewNopLogger()) + require.NoError(t, stateStore.LoadLatestVersion()) + + // Create new empty subspace + subspace := paramtypes.NewSubspace(cdc, + codec.NewLegacyAmino(), + storeKey, + memStoreKey, + paramtypes.ModuleName, + ).WithKeyTable(v1KeyTable()) // Note that new param key table is set in keeper constructor + + // Set 9 params from v1.0.0 + subspace.Set(ctx, consumertypes.KeyEnabled, true) + subspace.Set(ctx, consumertypes.KeyBlocksPerDistributionTransmission, int64(10)) + subspace.Set(ctx, consumertypes.KeyDistributionTransmissionChannel, "channel-0") + subspace.Set(ctx, consumertypes.KeyProviderFeePoolAddrStr, "cosmos17p3erf5gv2436fd4vyjwmudakts563a497syuz") + subspace.Set(ctx, ccvtypes.KeyCCVTimeoutPeriod, time.Hour) + subspace.Set(ctx, consumertypes.KeyTransferTimeoutPeriod, time.Hour) + subspace.Set(ctx, consumertypes.KeyConsumerRedistributionFrac, "0.5") + subspace.Set(ctx, consumertypes.KeyHistoricalEntries, int64(10)) + subspace.Set(ctx, consumertypes.KeyConsumerUnbondingPeriod, time.Hour) + + // Confirm 3 new params cannot be set with old key table + require.Panics(t, func() { + subspace.Set(ctx, consumertypes.KeySoftOptOutThreshold, "0.05") + }) + require.Panics(t, func() { + subspace.Set(ctx, consumertypes.KeyRewardDenoms, []string{"untrn"}) + }) + require.Panics(t, func() { + subspace.Set(ctx, consumertypes.KeyProviderRewardDenoms, []string{"uatom"}) + }) + + // Now create new subspace, mocking an upgrade where app initialization happens again + subspace = paramtypes.NewSubspace(cdc, + codec.NewLegacyAmino(), + storeKey, + memStoreKey, + paramtypes.ModuleName, + ).WithKeyTable(consumertypes.ParamKeyTable()) // Use v2 key table, this would be set in keeper constructor upon app init + + // Run migration + consumerkeeper.MigrateParamsv1Tov2(ctx, subspace) + + // Use keeper to confirm params are set correctly + keeper := consumerkeeper.Keeper{} + keeper.SetParamSpace(ctx, subspace) + + params := keeper.GetParams(ctx) + require.Equal(t, true, params.Enabled) + require.Equal(t, int64(10), params.BlocksPerDistributionTransmission) + require.Equal(t, "channel-0", params.DistributionTransmissionChannel) + require.Equal(t, "cosmos17p3erf5gv2436fd4vyjwmudakts563a497syuz", params.ProviderFeePoolAddrStr) + require.Equal(t, time.Hour, params.CcvTimeoutPeriod) + require.Equal(t, time.Hour, params.TransferTimeoutPeriod) + require.Equal(t, "0.5", params.ConsumerRedistributionFraction) + require.Equal(t, int64(10), params.HistoricalEntries) + require.Equal(t, time.Hour, params.UnbondingPeriod) + // 3 new params are set to default values + require.Equal(t, "0.05", params.SoftOptOutThreshold) + require.Equal(t, []string(nil), params.RewardDenoms) + require.Equal(t, []string(nil), params.ProviderRewardDenoms) + + // Set new params to other values + params.SoftOptOutThreshold = "0.1" + params.RewardDenoms = []string{"untrn"} + params.ProviderRewardDenoms = []string{"uatom"} + keeper.SetParams(ctx, params) + + require.Equal(t, "0.1", keeper.GetSoftOptOutThreshold(ctx)) + require.Equal(t, []string{"untrn"}, keeper.GetRewardDenoms(ctx)) + require.Equal(t, []string{"uatom"}, keeper.GetProviderRewardDenoms(ctx)) +} + +// v1KeyTable is a copy of the ParamKeyTable method from v1.0.0 +func v1KeyTable() paramtypes.KeyTable { + return paramtypes.NewKeyTable().RegisterParamSet(&v1Params{}) +} + +// ParamSetPairs implements params.ParamSet for v1Params +func (p *v1Params) ParamSetPairs() paramtypes.ParamSetPairs { + return paramtypes.ParamSetPairs{ + paramtypes.NewParamSetPair(consumertypes.KeyEnabled, p.Enabled, ccvtypes.ValidateBool), + paramtypes.NewParamSetPair(consumertypes.KeyBlocksPerDistributionTransmission, + p.BlocksPerDistributionTransmission, ccvtypes.ValidatePositiveInt64), + paramtypes.NewParamSetPair(consumertypes.KeyDistributionTransmissionChannel, + p.DistributionTransmissionChannel, consumertypes.ValidateDistributionTransmissionChannel), + paramtypes.NewParamSetPair(consumertypes.KeyProviderFeePoolAddrStr, + p.ProviderFeePoolAddrStr, consumertypes.ValidateProviderFeePoolAddrStr), + paramtypes.NewParamSetPair(ccvtypes.KeyCCVTimeoutPeriod, + p.CcvTimeoutPeriod, ccvtypes.ValidateDuration), + paramtypes.NewParamSetPair(consumertypes.KeyTransferTimeoutPeriod, + p.TransferTimeoutPeriod, ccvtypes.ValidateDuration), + paramtypes.NewParamSetPair(consumertypes.KeyConsumerRedistributionFrac, + p.ConsumerRedistributionFraction, ccvtypes.ValidateStringFraction), + paramtypes.NewParamSetPair(consumertypes.KeyHistoricalEntries, + p.HistoricalEntries, ccvtypes.ValidatePositiveInt64), + paramtypes.NewParamSetPair(consumertypes.KeyConsumerUnbondingPeriod, + p.UnbondingPeriod, ccvtypes.ValidateDuration), + } +} + +// v1Params is a copy of the pb generated Params struct from v1.0.0 +type v1Params struct { + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` + BlocksPerDistributionTransmission int64 `protobuf:"varint,2,opt,name=blocks_per_distribution_transmission,json=blocksPerDistributionTransmission,proto3" json:"blocks_per_distribution_transmission,omitempty"` + DistributionTransmissionChannel string `protobuf:"bytes,3,opt,name=distribution_transmission_channel,json=distributionTransmissionChannel,proto3" json:"distribution_transmission_channel,omitempty"` + ProviderFeePoolAddrStr string `protobuf:"bytes,4,opt,name=provider_fee_pool_addr_str,json=providerFeePoolAddrStr,proto3" json:"provider_fee_pool_addr_str,omitempty"` + CcvTimeoutPeriod time.Duration `protobuf:"bytes,5,opt,name=ccv_timeout_period,json=ccvTimeoutPeriod,proto3,stdduration" json:"ccv_timeout_period"` + TransferTimeoutPeriod time.Duration `protobuf:"bytes,6,opt,name=transfer_timeout_period,json=transferTimeoutPeriod,proto3,stdduration" json:"transfer_timeout_period"` + ConsumerRedistributionFraction string `protobuf:"bytes,7,opt,name=consumer_redistribution_fraction,json=consumerRedistributionFraction,proto3" json:"consumer_redistribution_fraction,omitempty"` + HistoricalEntries int64 `protobuf:"varint,8,opt,name=historical_entries,json=historicalEntries,proto3" json:"historical_entries,omitempty"` + UnbondingPeriod time.Duration `protobuf:"bytes,9,opt,name=unbonding_period,json=unbondingPeriod,proto3,stdduration" json:"unbonding_period"` +} diff --git a/x/ccv/consumer/module.go b/x/ccv/consumer/module.go index 444b255156..61d62293f2 100644 --- a/x/ccv/consumer/module.go +++ b/x/ccv/consumer/module.go @@ -6,6 +6,7 @@ import ( "fmt" "math/rand" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/gorilla/mux" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" @@ -91,13 +92,15 @@ func (AppModuleBasic) GetQueryCmd() *cobra.Command { // AppModule represents the AppModule for this module type AppModule struct { AppModuleBasic - keeper keeper.Keeper + keeper keeper.Keeper + paramSpace paramtypes.Subspace } // NewAppModule creates a new consumer module -func NewAppModule(k keeper.Keeper) AppModule { +func NewAppModule(k keeper.Keeper, paramSpace paramtypes.Subspace) AppModule { return AppModule{ - keeper: k, + keeper: k, + paramSpace: paramSpace, } } @@ -122,9 +125,13 @@ func (am AppModule) LegacyQuerierHandler(*codec.LegacyAmino) sdk.Querier { } // RegisterServices registers module services. -// TODO func (am AppModule) RegisterServices(cfg module.Configurator) { consumertypes.RegisterQueryServer(cfg.QueryServer(), am.keeper) + + m := keeper.NewMigrator(am.keeper, am.paramSpace) + if err := cfg.RegisterMigration(consumertypes.ModuleName, 1, m.Migratev1Tov2); err != nil { + panic(fmt.Sprintf("failed to register migrator: %s", err)) + } } // InitGenesis performs genesis initialization for the consumer module. It returns @@ -143,7 +150,14 @@ func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.Raw } // ConsensusVersion implements AppModule/ConsensusVersion. -func (AppModule) ConsensusVersion() uint64 { return 1 } +func (AppModule) ConsensusVersion() uint64 { + // Note that v1.0.0 consumers should technically be on a different consensus version + // than v1.2.0-multiden and v2.0.0. However, Neutron was the first consumer to launch + // in prod, and they've started on v1.2.0-multiden (which has a ConsensusVersion of 1). + // + // v1.2.0-multiden and v2.0.0 are consensus compatible, so they need return the same ConsensusVersion of 1. + return 1 +} // BeginBlock implements the AppModule interface // Set the VSC ID for the subsequent block to the same value as the current block diff --git a/x/ccv/consumer/types/params.go b/x/ccv/consumer/types/params.go index 5f7b73eb57..509e3725b4 100644 --- a/x/ccv/consumer/types/params.go +++ b/x/ccv/consumer/types/params.go @@ -113,10 +113,10 @@ func (p Params) Validate() error { if err := ccvtypes.ValidatePositiveInt64(p.BlocksPerDistributionTransmission); err != nil { return err } - if err := validateDistributionTransmissionChannel(p.DistributionTransmissionChannel); err != nil { + if err := ValidateDistributionTransmissionChannel(p.DistributionTransmissionChannel); err != nil { return err } - if err := validateProviderFeePoolAddrStr(p.ProviderFeePoolAddrStr); err != nil { + if err := ValidateProviderFeePoolAddrStr(p.ProviderFeePoolAddrStr); err != nil { return err } if err := ccvtypes.ValidateDuration(p.CcvTimeoutPeriod); err != nil { @@ -134,13 +134,13 @@ func (p Params) Validate() error { if err := ccvtypes.ValidateDuration(p.UnbondingPeriod); err != nil { return err } - if err := validateSoftOptOutThreshold(p.SoftOptOutThreshold); err != nil { + if err := ValidateSoftOptOutThreshold(p.SoftOptOutThreshold); err != nil { return err } - if err := validateDenoms(p.RewardDenoms); err != nil { + if err := ValidateDenoms(p.RewardDenoms); err != nil { return err } - if err := validateDenoms(p.ProviderRewardDenoms); err != nil { + if err := ValidateDenoms(p.ProviderRewardDenoms); err != nil { return err } return nil @@ -153,9 +153,9 @@ func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { paramtypes.NewParamSetPair(KeyBlocksPerDistributionTransmission, p.BlocksPerDistributionTransmission, ccvtypes.ValidatePositiveInt64), paramtypes.NewParamSetPair(KeyDistributionTransmissionChannel, - p.DistributionTransmissionChannel, validateDistributionTransmissionChannel), + p.DistributionTransmissionChannel, ValidateDistributionTransmissionChannel), paramtypes.NewParamSetPair(KeyProviderFeePoolAddrStr, - p.ProviderFeePoolAddrStr, validateProviderFeePoolAddrStr), + p.ProviderFeePoolAddrStr, ValidateProviderFeePoolAddrStr), paramtypes.NewParamSetPair(ccvtypes.KeyCCVTimeoutPeriod, p.CcvTimeoutPeriod, ccvtypes.ValidateDuration), paramtypes.NewParamSetPair(KeyTransferTimeoutPeriod, @@ -167,15 +167,15 @@ func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { paramtypes.NewParamSetPair(KeyConsumerUnbondingPeriod, p.UnbondingPeriod, ccvtypes.ValidateDuration), paramtypes.NewParamSetPair(KeySoftOptOutThreshold, - p.SoftOptOutThreshold, validateSoftOptOutThreshold), + p.SoftOptOutThreshold, ValidateSoftOptOutThreshold), paramtypes.NewParamSetPair(KeyRewardDenoms, - p.RewardDenoms, validateDenoms), + p.RewardDenoms, ValidateDenoms), paramtypes.NewParamSetPair(KeyProviderRewardDenoms, - p.ProviderRewardDenoms, validateDenoms), + p.ProviderRewardDenoms, ValidateDenoms), } } -func validateDistributionTransmissionChannel(i interface{}) error { +func ValidateDistributionTransmissionChannel(i interface{}) error { // Accept empty string as valid, since this will be the default value on genesis if i == "" { return nil @@ -184,7 +184,7 @@ func validateDistributionTransmissionChannel(i interface{}) error { return ccvtypes.ValidateChannelIdentifier(i) } -func validateProviderFeePoolAddrStr(i interface{}) error { +func ValidateProviderFeePoolAddrStr(i interface{}) error { // Accept empty string as valid, since this will be the default value on genesis if i == "" { return nil @@ -193,7 +193,7 @@ func validateProviderFeePoolAddrStr(i interface{}) error { return ccvtypes.ValidateBech32(i) } -func validateSoftOptOutThreshold(i interface{}) error { +func ValidateSoftOptOutThreshold(i interface{}) error { str, ok := i.(string) if !ok { return fmt.Errorf("invalid parameter type: %T", i) @@ -211,7 +211,7 @@ func validateSoftOptOutThreshold(i interface{}) error { return nil } -func validateDenoms(i interface{}) error { +func ValidateDenoms(i interface{}) error { v, ok := i.([]string) if !ok { return fmt.Errorf("invalid parameter type: %T", i) diff --git a/x/ccv/provider/ibc_module_test.go b/x/ccv/provider/ibc_module_test.go index dfe8790c32..c7027bf8e1 100644 --- a/x/ccv/provider/ibc_module_test.go +++ b/x/ccv/provider/ibc_module_test.go @@ -24,10 +24,11 @@ import ( // See: https://github.com/cosmos/ibc/blob/main/spec/app/ics-028-cross-chain-validation/methods.md#ccv-pcf-coinit1 // Spec Tag: [CCV-PCF-COINIT.1] func TestOnChanOpenInit(t *testing.T) { + keeperParams := testkeeper.NewInMemKeeperParams(t) providerKeeper, ctx, ctrl, _ := testkeeper.GetProviderKeeperAndCtx( - t, testkeeper.NewInMemKeeperParams(t)) + t, keeperParams) defer ctrl.Finish() - providerModule := provider.NewAppModule(&providerKeeper) + providerModule := provider.NewAppModule(&providerKeeper, *keeperParams.ParamsSubspace) // OnChanOpenInit must error for provider even with correct arguments _, err := providerModule.OnChanOpenInit( @@ -112,9 +113,10 @@ func TestOnChanOpenTry(t *testing.T) { for _, tc := range testCases { // Setup + keeperParams := testkeeper.NewInMemKeeperParams(t) providerKeeper, ctx, ctrl, mocks := testkeeper.GetProviderKeeperAndCtx( - t, testkeeper.NewInMemKeeperParams(t)) - providerModule := provider.NewAppModule(&providerKeeper) + t, keeperParams) + providerModule := provider.NewAppModule(&providerKeeper, *keeperParams.ParamsSubspace) providerKeeper.SetPort(ctx, ccv.ProviderPortID) providerKeeper.SetConsumerClientId(ctx, "consumerChainID", "clientIDToConsumer") @@ -181,10 +183,11 @@ func TestOnChanOpenTry(t *testing.T) { // See: https://github.com/cosmos/ibc/blob/main/spec/app/ics-028-cross-chain-validation/methods.md#ccv-pcf-coack1 // Spec tag: [CCV-PCF-COACK.1] func TestOnChanOpenAck(t *testing.T) { + keeperParams := testkeeper.NewInMemKeeperParams(t) providerKeeper, ctx, ctrl, _ := testkeeper.GetProviderKeeperAndCtx( - t, testkeeper.NewInMemKeeperParams(t)) + t, keeperParams) defer ctrl.Finish() - providerModule := provider.NewAppModule(&providerKeeper) + providerModule := provider.NewAppModule(&providerKeeper, *keeperParams.ParamsSubspace) // OnChanOpenAck must error for provider even with correct arguments err := providerModule.OnChanOpenAck( @@ -296,8 +299,9 @@ func TestOnChanOpenConfirm(t *testing.T) { for _, tc := range testCases { + keeperParams := testkeeper.NewInMemKeeperParams(t) providerKeeper, ctx, ctrl, mocks := testkeeper.GetProviderKeeperAndCtx( - t, testkeeper.NewInMemKeeperParams(t)) + t, keeperParams) gomock.InOrder(tc.mockExpectations(ctx, mocks)...) @@ -305,7 +309,7 @@ func TestOnChanOpenConfirm(t *testing.T) { providerKeeper.SetChainToChannel(ctx, "consumerChainID", "existingChannelID") } - providerModule := provider.NewAppModule(&providerKeeper) + providerModule := provider.NewAppModule(&providerKeeper, *keeperParams.ParamsSubspace) err := providerModule.OnChanOpenConfirm(ctx, "providerPortID", "channelID") diff --git a/x/ccv/provider/keeper/keeper.go b/x/ccv/provider/keeper/keeper.go index 025272351a..7494057643 100644 --- a/x/ccv/provider/keeper/keeper.go +++ b/x/ccv/provider/keeper/keeper.go @@ -82,6 +82,12 @@ func NewKeeper( return k } +// SetParamSpace sets the param space for the provider keeper. +// Note: this is only used for testing! +func (k *Keeper) SetParamSpace(ctx sdk.Context, ps paramtypes.Subspace) { + k.paramSpace = ps +} + // Validates that the provider keeper is initialized with non-zero and // non-nil values for all its fields. Otherwise this method will panic. func (k Keeper) mustValidateFields() { @@ -1054,3 +1060,7 @@ func (k Keeper) GetSlashLog( bz := store.Get(types.SlashLogKey(providerAddr)) return bz != nil } + +func (k Keeper) BondDenom(ctx sdk.Context) string { + return k.stakingKeeper.BondDenom(ctx) +} diff --git a/x/ccv/provider/keeper/migration.go b/x/ccv/provider/keeper/migration.go new file mode 100644 index 0000000000..1254faf463 --- /dev/null +++ b/x/ccv/provider/keeper/migration.go @@ -0,0 +1,178 @@ +package keeper + +import ( + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" + ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" +) + +// Migrator is a struct for handling in-place store migrations. +type Migrator struct { + ccvProviderKeeper Keeper + ccvProviderParamSpace paramtypes.Subspace +} + +// NewMigrator returns a new Migrator. +func NewMigrator(ccvProviderKeeper Keeper, ccvProviderParamSpace paramtypes.Subspace, +) Migrator { + return Migrator{ccvProviderKeeper: ccvProviderKeeper, ccvProviderParamSpace: ccvProviderParamSpace} +} + +// Migratev1Tov2 migrates a provider from v1.0.0 to v2.0.0. +func (m Migrator) Migratev1Tov2(ctx sdk.Context) error { + // Migrate params + MigrateParamsv1Tov2(ctx, + m.ccvProviderParamSpace, + // See https://github.com/cosmos/interchain-security/blob/7861804cb311507ec6aebebbfad60ea42eb8ed4b/x/ccv/provider/keeper/params.go#L84 + // The v1.1.0-multiden version of ICS hardcodes this param as 10 of bond type: k.stakingKeeper.BondDenom(ctx). + // Here we use the same starting value, but the param can now be changed through governance. + sdk.NewCoin(m.ccvProviderKeeper.BondDenom(ctx), sdk.NewInt(10000000)), + ) + + // Delete select consumer genesis states for consumers that're launched + MigrateConsumerGenesisStatesv1Tov2(ctx, m.ccvProviderKeeper) + + // Migrate keys to accommodate fix from https://github.com/cosmos/interchain-security/pull/786 + MigrateKeysv1Tov2(ctx, m.ccvProviderKeeper) + + return nil +} + +// MigrateParamsv1Tov2 migrates the provider CCV module params from v1.0.0 to v2.0.0, +// setting default values for new params. +func MigrateParamsv1Tov2(ctx sdk.Context, paramsSubspace paramtypes.Subspace, consumerRewardDenomRegistrationFee sdk.Coin) { + // Get old params + var templateClient ibctmtypes.ClientState + paramsSubspace.Get(ctx, providertypes.KeyTemplateClient, &templateClient) + var trustingPeriodFraction string + paramsSubspace.Get(ctx, providertypes.KeyTrustingPeriodFraction, &trustingPeriodFraction) + var ccvTimeoutPeriod time.Duration + paramsSubspace.Get(ctx, ccvtypes.KeyCCVTimeoutPeriod, &ccvTimeoutPeriod) + var initTimeoutPeriod time.Duration + paramsSubspace.Get(ctx, providertypes.KeyInitTimeoutPeriod, &initTimeoutPeriod) + var vscTimeoutPeriod time.Duration + paramsSubspace.Get(ctx, providertypes.KeyVscTimeoutPeriod, &vscTimeoutPeriod) + var slashMeterReplenishPeriod time.Duration + paramsSubspace.Get(ctx, providertypes.KeySlashMeterReplenishPeriod, &slashMeterReplenishPeriod) + var slashMeterReplenishFraction string + paramsSubspace.Get(ctx, providertypes.KeySlashMeterReplenishFraction, &slashMeterReplenishFraction) + var maxThrottledPackets int64 + paramsSubspace.Get(ctx, providertypes.KeyMaxThrottledPackets, &maxThrottledPackets) + + // Recycle old params, set new param to input value + newParams := providertypes.NewParams( + &templateClient, + trustingPeriodFraction, + ccvTimeoutPeriod, + initTimeoutPeriod, + vscTimeoutPeriod, + slashMeterReplenishPeriod, + slashMeterReplenishFraction, + maxThrottledPackets, + consumerRewardDenomRegistrationFee, + ) + + // Persist new params + paramsSubspace.SetParamSet(ctx, &newParams) +} + +func MigrateConsumerGenesisStatesv1Tov2(ctx sdk.Context, providerKeeper Keeper) { + // We could try to migrate existing ConsumerGenesisStates, but they're not needed after consumer launch. + // Hence we delete them strategically. + providerKeeper.DeleteConsumerGenesis(ctx, "neutron-1") // See https://github.com/neutron-org/mainnet-assets#parameters + + // TODO: determine if any other ConsumerGenesisStates need to be deleted, or actually migrated! +} + +// Due to https://github.com/cosmos/interchain-security/pull/786, +// validators' slash logs are stored under the key prefix for slash acks. +// This method will extract "slash logs" from the slash acks part of the store, and put the slash logs +// in their appropriate store location. +func MigrateKeysv1Tov2(ctx sdk.Context, providerKeeper Keeper) { + keys := providerKeeper.getAllKeysUnderSlashAcksPrefix(ctx) + + // Get valid consumer chainIDs + consumers := providerKeeper.GetAllConsumerChains(ctx) + consumerChainIds := make(map[string]struct{}) + for _, consumer := range consumers { + consumerChainIds[consumer.ChainId] = struct{}{} + } + + keysToMigrate := [][]byte{} + + // iterate through all keys under slash acks prefix + for _, key := range keys { + bzAfterPrefix := key[1:] + // If bz after prefix is in consumerChainIds, + // then this key is a valid slash acks key, no migration needed + if _, ok := consumerChainIds[string(bzAfterPrefix)]; ok { + continue + } + // Otherwise this key is potentially/hopefully a slash log key to migrate + + // Validate that after the prefix, it's just a cons address stored in the key + if err := sdk.VerifyAddressFormat(bzAfterPrefix); err != nil { + // We could panic here, but prob best to log corrupted key and move on. + // This case should not happen! + ctx.Logger().Error("unexpected key under slash acks prefix", "key", key) + continue + } + keysToMigrate = append(keysToMigrate, key) + } + + // Migrate slash logs to their correct store location + store := ctx.KVStore(providerKeeper.storeKey) + for _, key := range keysToMigrate { + keyNoPrefix := key[1:] + keyCorrectPrefix := append([]byte{providertypes.SlashLogBytePrefix}, keyNoPrefix...) + valueBz := store.Get(key) + store.Set(keyCorrectPrefix, valueBz) + store.Delete(key) + } +} + +func (k Keeper) getAllKeysUnderSlashAcksPrefix(ctx sdk.Context) [][]byte { + store := ctx.KVStore(k.storeKey) + prefix := []byte{providertypes.SlashAcksBytePrefix} + iterator := sdk.KVStorePrefixIterator(store, prefix) + defer iterator.Close() + keys := [][]byte{} + for ; iterator.Valid(); iterator.Next() { + keys = append(keys, iterator.Key()) // Values are not used for migration, just keys + } + return keys +} + +// TODO: the following hackyness could be removed if we're able to reference older versions of ICS. +// This would likely require go.mod split, and a testing module that could depend on multiple ICS versions. + +// LEGACY METHOD USED FOR TESTING MIGRATION ONLY. DO NOT USE! +// This method is copy/pasted from ICS v1.0.0. +func SlashLogKeyOnlyForTesting(providerAddr sdk.ConsAddress) []byte { + return append([]byte{providertypes.SlashAcksBytePrefix}, providerAddr.Bytes()...) +} + +// LEGACY METHOD USED FOR TESTING MIGRATION ONLY. DO NOT USE! +// This method mimics SetSlashLog from ICS v1.0.0. +func (k Keeper) SetSlashLogOnlyForTesting( + ctx sdk.Context, + providerAddr sdk.ConsAddress, +) { + store := ctx.KVStore(k.storeKey) + store.Set(SlashLogKeyOnlyForTesting(providerAddr), []byte{}) +} + +// LEGACY METHOD USED FOR TESTING MIGRATION ONLY. DO NOT USE! +// This method mimics GetSlashLog from ICS v1.0.0. +func (k Keeper) GetSlashLogOnlyForTesting( + ctx sdk.Context, + providerAddr sdk.ConsAddress, +) (found bool) { + store := ctx.KVStore(k.storeKey) + bz := store.Get(SlashLogKeyOnlyForTesting(providerAddr)) + return bz != 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..858aa193e6 --- /dev/null +++ b/x/ccv/provider/keeper/migration_test.go @@ -0,0 +1,190 @@ +package keeper_test + +import ( + "testing" + "time" + + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/store" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" + types2 "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" + "github.com/cosmos/interchain-security/v2/testutil/crypto" + testutil "github.com/cosmos/interchain-security/v2/testutil/keeper" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" + "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/libs/log" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + tmdb "github.com/tendermint/tm-db" +) + +func TestMigrateParamsv1Tov2(t *testing.T) { + // Setup raw store + db := tmdb.NewMemDB() + stateStore := store.NewCommitMultiStore(db) + storeKey := sdk.NewKVStoreKey(paramtypes.StoreKey) + memStoreKey := storetypes.NewMemoryStoreKey("mem_key") + stateStore.MountStoreWithDB(storeKey, sdk.StoreTypeIAVL, db) + stateStore.MountStoreWithDB(memStoreKey, sdk.StoreTypeMemory, nil) + require.NoError(t, stateStore.LoadLatestVersion()) + registry := codectypes.NewInterfaceRegistry() + cdc := codec.NewProtoCodec(registry) + ctx := sdk.NewContext(stateStore, tmproto.Header{}, false, log.NewNopLogger()) + require.NoError(t, stateStore.LoadLatestVersion()) + + // Create new empty subspace + subspace := paramtypes.NewSubspace(cdc, + codec.NewLegacyAmino(), + storeKey, + memStoreKey, + paramtypes.ModuleName, + ).WithKeyTable(v1KeyTable()) // Note that new param key table is set in keeper constructor + + // Set 8 params from v1.0.0 + subspace.Set(ctx, providertypes.KeyTemplateClient, providertypes.DefaultParams().TemplateClient) + subspace.Set(ctx, providertypes.KeyTrustingPeriodFraction, "0.75") + subspace.Set(ctx, ccvtypes.KeyCCVTimeoutPeriod, time.Hour) + subspace.Set(ctx, providertypes.KeyInitTimeoutPeriod, time.Hour) + subspace.Set(ctx, providertypes.KeyVscTimeoutPeriod, time.Hour) + subspace.Set(ctx, providertypes.KeySlashMeterReplenishPeriod, time.Hour) + subspace.Set(ctx, providertypes.KeySlashMeterReplenishFraction, "0.5") + subspace.Set(ctx, providertypes.KeyMaxThrottledPackets, int64(10)) + + // Confirm new param cannot be set with old key table + require.Panics(t, func() { + subspace.Set(ctx, providertypes.KeyConsumerRewardDenomRegistrationFee, sdk.NewInt64Coin("uatom", 100)) + }) + + // Now create new subspace, mocking an upgrade where app initialization happens again + subspace = paramtypes.NewSubspace(cdc, + codec.NewLegacyAmino(), + storeKey, + memStoreKey, + paramtypes.ModuleName, + ).WithKeyTable(providertypes.ParamKeyTable()) // Use v2 key table, this would be set in keeper constructor upon app init + + // Run migration + providerkeeper.MigrateParamsv1Tov2(ctx, subspace, sdk.NewCoin("uatom", sdk.NewInt(100000))) + + // Use keeper to confirm params are set correctly + keeper := providerkeeper.Keeper{} + keeper.SetParamSpace(ctx, subspace) + + params := keeper.GetParams(ctx) + require.Equal(t, providertypes.DefaultParams().TemplateClient, params.TemplateClient) + require.Equal(t, "0.75", params.TrustingPeriodFraction) + require.Equal(t, time.Hour, params.CcvTimeoutPeriod) + require.Equal(t, time.Hour, params.InitTimeoutPeriod) + require.Equal(t, time.Hour, params.VscTimeoutPeriod) + require.Equal(t, time.Hour, params.SlashMeterReplenishPeriod) + require.Equal(t, "0.5", params.SlashMeterReplenishFraction) + require.Equal(t, int64(10), params.MaxThrottledPackets) + // New param should be set + require.Equal(t, sdk.NewCoin("uatom", sdk.NewInt(100000)), params.ConsumerRewardDenomRegistrationFee) + + // Set new param to other values + params.ConsumerRewardDenomRegistrationFee = sdk.NewCoin("uatom", sdk.NewInt(1000000000)) + keeper.SetParams(ctx, params) + require.Equal(t, sdk.NewCoin("uatom", sdk.NewInt(1000000000)), keeper.GetParams(ctx).ConsumerRewardDenomRegistrationFee) +} + +// v1KeyTable is a copy of the ParamKeyTable method from v1.0.0 +func v1KeyTable() paramtypes.KeyTable { + return paramtypes.NewKeyTable().RegisterParamSet(&v1Params{}) +} + +// ParamSetPairs implements params.ParamSet for v1Params +func (p *v1Params) ParamSetPairs() paramtypes.ParamSetPairs { + return paramtypes.ParamSetPairs{ + paramtypes.NewParamSetPair(providertypes.KeyTemplateClient, p.TemplateClient, providertypes.ValidateTemplateClient), + paramtypes.NewParamSetPair(providertypes.KeyTrustingPeriodFraction, p.TrustingPeriodFraction, ccvtypes.ValidateStringFraction), + paramtypes.NewParamSetPair(ccvtypes.KeyCCVTimeoutPeriod, p.CcvTimeoutPeriod, ccvtypes.ValidateDuration), + paramtypes.NewParamSetPair(providertypes.KeyInitTimeoutPeriod, p.InitTimeoutPeriod, ccvtypes.ValidateDuration), + paramtypes.NewParamSetPair(providertypes.KeyVscTimeoutPeriod, p.VscTimeoutPeriod, ccvtypes.ValidateDuration), + paramtypes.NewParamSetPair(providertypes.KeySlashMeterReplenishPeriod, p.SlashMeterReplenishPeriod, ccvtypes.ValidateDuration), + paramtypes.NewParamSetPair(providertypes.KeySlashMeterReplenishFraction, p.SlashMeterReplenishFraction, ccvtypes.ValidateStringFraction), + paramtypes.NewParamSetPair(providertypes.KeyMaxThrottledPackets, p.MaxThrottledPackets, ccvtypes.ValidatePositiveInt64), + } +} + +// v1Params is a copy of the Params struct from v1.0.0 +type v1Params struct { + TemplateClient *types2.ClientState `protobuf:"bytes,1,opt,name=template_client,json=templateClient,proto3" json:"template_client,omitempty"` + TrustingPeriodFraction string `protobuf:"bytes,2,opt,name=trusting_period_fraction,json=trustingPeriodFraction,proto3" json:"trusting_period_fraction,omitempty"` + CcvTimeoutPeriod time.Duration `protobuf:"bytes,3,opt,name=ccv_timeout_period,json=ccvTimeoutPeriod,proto3,stdduration" json:"ccv_timeout_period"` + InitTimeoutPeriod time.Duration `protobuf:"bytes,4,opt,name=init_timeout_period,json=initTimeoutPeriod,proto3,stdduration" json:"init_timeout_period"` + VscTimeoutPeriod time.Duration `protobuf:"bytes,5,opt,name=vsc_timeout_period,json=vscTimeoutPeriod,proto3,stdduration" json:"vsc_timeout_period"` + SlashMeterReplenishPeriod time.Duration `protobuf:"bytes,6,opt,name=slash_meter_replenish_period,json=slashMeterReplenishPeriod,proto3,stdduration" json:"slash_meter_replenish_period"` + SlashMeterReplenishFraction string `protobuf:"bytes,7,opt,name=slash_meter_replenish_fraction,json=slashMeterReplenishFraction,proto3" json:"slash_meter_replenish_fraction,omitempty"` + MaxThrottledPackets int64 `protobuf:"varint,8,opt,name=max_throttled_packets,json=maxThrottledPackets,proto3" json:"max_throttled_packets,omitempty"` +} + +func TestMigrateConsumerGenesisv1Tov2(t *testing.T) { + providerKeeper, ctx, ctrl, _ := testutil.GetProviderKeeperAndCtx(t, testutil.NewInMemKeeperParams(t)) + defer ctrl.Finish() + + _, found := providerKeeper.GetConsumerGenesis(ctx, "neutron-1") + require.False(t, found) + + providerKeeper.SetConsumerGenesis(ctx, "neutron-1", consumertypes.GenesisState{}) + + _, found = providerKeeper.GetConsumerGenesis(ctx, "neutron-1") + require.True(t, found) + + providerkeeper.MigrateConsumerGenesisStatesv1Tov2(ctx, providerKeeper) + + _, found = providerKeeper.GetConsumerGenesis(ctx, "neutron-1") + require.False(t, found) +} + +func TestMigrateKeysv1Tov2(t *testing.T) { + providerKeeper, ctx, ctrl, _ := testutil.GetProviderKeeperAndCtx(t, testutil.NewInMemKeeperParams(t)) + defer ctrl.Finish() + + // First we setup a scenario that may show up in prod for v1, + // where both slash logs and slash acks are persisted under the same key prefix + cIds := crypto.GenMultipleCryptoIds(3, 349823489230) + providerKeeper.SetSlashLogOnlyForTesting(ctx, cIds[0].SDKValConsAddress()) // This is the old (incorrect) method of storing slash logs + providerKeeper.SetSlashLogOnlyForTesting(ctx, cIds[1].SDKValConsAddress()) + providerKeeper.SetSlashLogOnlyForTesting(ctx, cIds[2].SDKValConsAddress()) + + // Setup slash acks + p := []string{"alice", "bob", "frank"} + providerKeeper.SetSlashAcks(ctx, "chain-1", p) + p = []string{"charlie", "mac", "dennis"} + providerKeeper.SetSlashAcks(ctx, "chain-2", p) + + // Mock two clients being established with chain-1 and chain-2, + // This is needed for migration logic. + providerKeeper.SetConsumerClientId(ctx, "chain-1", "client-1") + providerKeeper.SetConsumerClientId(ctx, "chain-2", "client-2") + + // Confirm slash logs and slash acks exist together + require.True(t, providerKeeper.GetSlashLogOnlyForTesting(ctx, cIds[0].SDKValConsAddress())) + require.True(t, providerKeeper.GetSlashLogOnlyForTesting(ctx, cIds[1].SDKValConsAddress())) + require.True(t, providerKeeper.GetSlashLogOnlyForTesting(ctx, cIds[2].SDKValConsAddress())) + require.Len(t, providerKeeper.GetSlashAcks(ctx, "chain-1"), 3) + require.Len(t, providerKeeper.GetSlashAcks(ctx, "chain-2"), 3) + + // Run migration + providerkeeper.MigrateKeysv1Tov2(ctx, providerKeeper) + + // Confirm slash logs cannot be found from legacy methods + require.False(t, providerKeeper.GetSlashLogOnlyForTesting(ctx, cIds[0].SDKValConsAddress())) + require.False(t, providerKeeper.GetSlashLogOnlyForTesting(ctx, cIds[1].SDKValConsAddress())) + require.False(t, providerKeeper.GetSlashLogOnlyForTesting(ctx, cIds[2].SDKValConsAddress())) + + // Slash acks remain unchanged + require.Len(t, providerKeeper.GetSlashAcks(ctx, "chain-1"), 3) + require.Len(t, providerKeeper.GetSlashAcks(ctx, "chain-2"), 3) + + // Confirm slash logs can be found from new/correct methods + require.True(t, providerKeeper.GetSlashLog(ctx, cIds[0].ProviderConsAddress())) + require.True(t, providerKeeper.GetSlashLog(ctx, cIds[1].ProviderConsAddress())) + require.True(t, providerKeeper.GetSlashLog(ctx, cIds[2].ProviderConsAddress())) +} diff --git a/x/ccv/provider/module.go b/x/ccv/provider/module.go index 742dc9b743..bb15b75ab1 100644 --- a/x/ccv/provider/module.go +++ b/x/ccv/provider/module.go @@ -12,6 +12,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" porttypes "github.com/cosmos/ibc-go/v4/modules/core/05-port/types" "github.com/cosmos/interchain-security/v2/x/ccv/provider/client/cli" "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" @@ -88,13 +89,15 @@ func (AppModuleBasic) GetQueryCmd() *cobra.Command { // AppModule represents the AppModule for this module type AppModule struct { AppModuleBasic - keeper *keeper.Keeper + keeper *keeper.Keeper + paramSpace paramtypes.Subspace } // NewAppModule creates a new provider module -func NewAppModule(k *keeper.Keeper) AppModule { +func NewAppModule(k *keeper.Keeper, paramSpace paramtypes.Subspace) AppModule { return AppModule{ - keeper: k, + keeper: k, + paramSpace: paramSpace, } } @@ -122,6 +125,11 @@ func (am AppModule) LegacyQuerierHandler(*codec.LegacyAmino) sdk.Querier { 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, 1, m.Migratev1Tov2); err != nil { + panic(fmt.Sprintf("failed to register migrator: %s", err)) + } } // InitGenesis performs genesis initialization for the provider module. It returns no validator updates. @@ -144,7 +152,7 @@ func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.Raw } // ConsensusVersion implements AppModule/ConsensusVersion. -func (AppModule) ConsensusVersion() uint64 { return 1 } +func (AppModule) ConsensusVersion() uint64 { return 2 } // BeginBlock implements the AppModule interface func (am AppModule) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) { diff --git a/x/ccv/provider/module_test.go b/x/ccv/provider/module_test.go index ee81daa4bf..3e2776c4e7 100644 --- a/x/ccv/provider/module_test.go +++ b/x/ccv/provider/module_test.go @@ -94,7 +94,7 @@ func TestInitGenesis(t *testing.T) { keeperParams := testkeeper.NewInMemKeeperParams(t) providerKeeper, ctx, ctrl, mocks := testkeeper.GetProviderKeeperAndCtx(t, keeperParams) - appModule := provider.NewAppModule(&providerKeeper) + appModule := provider.NewAppModule(&providerKeeper, *keeperParams.ParamsSubspace) genState := types.NewGenesisState( providerKeeper.GetValidatorSetUpdateId(ctx), nil, diff --git a/x/ccv/provider/types/params.go b/x/ccv/provider/types/params.go index 2e3657eaf3..3966232501 100644 --- a/x/ccv/provider/types/params.go +++ b/x/ccv/provider/types/params.go @@ -121,7 +121,7 @@ func (p Params) Validate() error { if p.TemplateClient == nil { return fmt.Errorf("template client is nil") } - if err := validateTemplateClient(*p.TemplateClient); err != nil { + if err := ValidateTemplateClient(*p.TemplateClient); err != nil { return err } if err := ccvtypes.ValidateStringFraction(p.TrustingPeriodFraction); err != nil { @@ -145,7 +145,7 @@ func (p Params) Validate() error { 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 { + if err := ValidateCoin(p.ConsumerRewardDenomRegistrationFee); err != nil { return fmt.Errorf("consumer reward denom registration fee is invalid: %s", err) } return nil @@ -154,7 +154,7 @@ func (p Params) Validate() error { // ParamSetPairs implements params.ParamSet func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { return paramtypes.ParamSetPairs{ - paramtypes.NewParamSetPair(KeyTemplateClient, p.TemplateClient, validateTemplateClient), + paramtypes.NewParamSetPair(KeyTemplateClient, p.TemplateClient, ValidateTemplateClient), paramtypes.NewParamSetPair(KeyTrustingPeriodFraction, p.TrustingPeriodFraction, ccvtypes.ValidateStringFraction), paramtypes.NewParamSetPair(ccvtypes.KeyCCVTimeoutPeriod, p.CcvTimeoutPeriod, ccvtypes.ValidateDuration), paramtypes.NewParamSetPair(KeyInitTimeoutPeriod, p.InitTimeoutPeriod, ccvtypes.ValidateDuration), @@ -162,11 +162,11 @@ func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { 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), + paramtypes.NewParamSetPair(KeyConsumerRewardDenomRegistrationFee, p.ConsumerRewardDenomRegistrationFee, ValidateCoin), } } -func validateTemplateClient(i interface{}) error { +func ValidateTemplateClient(i interface{}) error { cs, ok := i.(ibctmtypes.ClientState) if !ok { return fmt.Errorf("invalid parameter type: %T, expected: %T", i, ibctmtypes.ClientState{}) @@ -193,7 +193,7 @@ func validateTemplateClient(i interface{}) error { return nil } -func validateCoin(i interface{}) error { +func ValidateCoin(i interface{}) error { v, ok := i.(sdk.Coin) if !ok { return fmt.Errorf("invalid parameter type: %T", i) From 1ec81485bad165674334a51bcdc24eed06e28d1f Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Thu, 1 Jun 2023 15:30:00 -0700 Subject: [PATCH 030/108] docs: cleanup changelog for v2.0.0 on main (#988) cleans --- CHANGELOG.md | 10 +++++++--- x/ccv/provider/keeper/migration.go | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 526d82baae..5f946901f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,9 +6,13 @@ Add an entry to the unreleased section whenever merging a PR to main that is not ## v.2.0.0 -Date: May 12th, 2023 +Date: June 1st, 2023 -Unlike prior releases, the ICS v2.0.0 release will be based on the main branch. v2.0.0 will contain all the accumulated PRs from the various releases below, along with other PRs that were merged, but not released to production. After v2.0.0, we plan to revamp release practices, and how we modularize the repo for consumer/provider. +Unlike prior releases, the ICS `v2.0.0` release will be based on the main branch. `v2.0.0` will contain all the accumulated PRs from the various releases below, along with other PRs that were merged, but not released to production. After `v2.0.0`, we plan to revamp release practices, and how we modularize the repo for consumer/provider. + +Upgrading a provider from `v1.1.0-multiden` to `v2.0.0` will require state migrations. See [migration.go](./x/ccv/provider/keeper/migration.go). See the provider module's `ConsensusVersion` in [module](./x/ccv/provider/module.go) + +Upgrading a consumer from `v1.2.0-multiden` to `v2.0.0` will NOT require state migrations. See the consumer module's `ConsensusVersion` in [module](./x/ccv/consumer/module.go) Some PRs from v2.0.0 may reappear from other releases below. This is due to the fact that ICS v1.1.0 deviates from the commit ordering of the main branch, and other releases thereafter are based on v1.1.0. @@ -19,7 +23,7 @@ Some PRs from v2.0.0 may reappear from other releases below. This is due to the * Various fixes, critical and non-critical * Docs updates which should not affect production code -## PRs included in v2.0.0 +## Notable PRs included in v2.0.0 * (feat) v1->v2 migrations to accommodate a bugfix having to do with store keys, introduce new params, and deal with consumer genesis state schema changes [#975](https://github.com/cosmos/interchain-security/pull/975) * (deps) Bump github.com/cosmos/ibc-go/v4 from 4.4.0 to 4.4.2 [#982](https://github.com/cosmos/interchain-security/pull/982) diff --git a/x/ccv/provider/keeper/migration.go b/x/ccv/provider/keeper/migration.go index 1254faf463..4e899bcce2 100644 --- a/x/ccv/provider/keeper/migration.go +++ b/x/ccv/provider/keeper/migration.go @@ -22,7 +22,7 @@ func NewMigrator(ccvProviderKeeper Keeper, ccvProviderParamSpace paramtypes.Subs return Migrator{ccvProviderKeeper: ccvProviderKeeper, ccvProviderParamSpace: ccvProviderParamSpace} } -// Migratev1Tov2 migrates a provider from v1.0.0 to v2.0.0. +// Migratev1Tov2 migrates a provider from v1.0.0 to v2.0.0, and/or consensus version 1 -> 2. func (m Migrator) Migratev1Tov2(ctx sdk.Context) error { // Migrate params MigrateParamsv1Tov2(ctx, From 9920121274605ee5bf79984a687d7b4586fdec71 Mon Sep 17 00:00:00 2001 From: Philip Offtermatt <57488781+p-offtermatt@users.noreply.github.com> Date: Fri, 2 Jun 2023 17:55:13 +0200 Subject: [PATCH 031/108] chore: Hardcode golangci-lint version (#990) * Hardcode golangci-lint version * Hardcode version in CI config --- .github/workflows/golangci-lint.yml | 2 +- Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml index 7dcf88c9c0..28eba10b41 100644 --- a/.github/workflows/golangci-lint.yml +++ b/.github/workflows/golangci-lint.yml @@ -25,7 +25,7 @@ jobs: uses: golangci/golangci-lint-action@v3 with: # Optional: version of golangci-lint to use in form of v1.2 or v1.2.3 or `latest` to use the latest version - version: latest + version: v1.52.2 # Optional: working directory, useful for monorepos # working-directory: somedir diff --git a/Makefile b/Makefile index 600c617d70..b84eca6524 100644 --- a/Makefile +++ b/Makefile @@ -71,7 +71,7 @@ test-no-cache: ### Linting ### ############################################################################### -golangci_version=latest +golangci_version=v1.52.2 lint: @echo "--> Running linter" From 957ddf4bdbaba784f0800312c689df00ae11f66d Mon Sep 17 00:00:00 2001 From: Milan Mulji <98309852+mmulji-ic@users.noreply.github.com> Date: Thu, 8 Jun 2023 19:10:57 +0200 Subject: [PATCH 032/108] docs: Increase the validator set of cosmos hub to 180 from 175 (#999) Updated number of validators to 180 --- docs/docs/validators/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/validators/overview.md b/docs/docs/validators/overview.md index 5a670f0780..35ce56cdb3 100644 --- a/docs/docs/validators/overview.md +++ b/docs/docs/validators/overview.md @@ -14,7 +14,7 @@ Once a `ConsumerAdditionProposal` passes, validators need to prepare to run the Provider chain and consumer chains represent standalone chains that only share the validator set ie. the same validator operators are tasked with running all chains. :::info -To validate a consumer chain and be eligible for rewards validators are required to be in the active set of the provider chain (first 175 validators for Cosmos Hub). +To validate a consumer chain and be eligible for rewards validators are required to be in the active set of the provider chain (first 180 validators for Cosmos Hub). ::: ## Startup sequence overview From a1e18d0cfe4cfc105e6bbb0730471075ee1edc28 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Thu, 8 Jun 2023 10:56:41 -0700 Subject: [PATCH 033/108] fix: proper consumer key prefix ordering (#991) * Update keys.go * tests * fix another bug * fix comments --- x/ccv/consumer/types/keys.go | 39 +++++++++++++++++-------------- x/ccv/consumer/types/keys_test.go | 20 +++++++++------- 2 files changed, 34 insertions(+), 25 deletions(-) diff --git a/x/ccv/consumer/types/keys.go b/x/ccv/consumer/types/keys.go index d52c9c551e..093f78b450 100644 --- a/x/ccv/consumer/types/keys.go +++ b/x/ccv/consumer/types/keys.go @@ -49,6 +49,23 @@ const ( // received over CCV channel but not yet flushed over ABCI PendingChangesByteKey + // NOTE: This prefix is depreciated, but left in place to avoid consumer state migrations + // [DEPRECATED] + PendingDataPacketsByteKey + + // PreCCVByteKey is the byte to store the consumer is running on democracy staking module without consumer + PreCCVByteKey + + // InitialValSetByteKey is the byte to store the initial validator set for a consumer + InitialValSetByteKey + + // NOTE: This prefix is depreciated, but left in place to avoid consumer state migrations + // [DEPRECATED] + LastStandaloneHeightByteKey + + // SmallestNonOptOutPowerByteKey is the byte that will store the smallest val power that cannot opt out + SmallestNonOptOutPowerByteKey + // HistoricalInfoKey is the byte prefix that will store the historical info for a given height HistoricalInfoBytePrefix @@ -61,30 +78,18 @@ const ( // OutstandingDowntimePrefix is the byte prefix that will store the validators outstanding downtime by consensus address OutstandingDowntimeBytePrefix - // NOTE: This prefix is depreciated, but left in place to avoid consumer state migrations - PendingDataPacketsBytePrefix - - // CrossChainValidatorPrefix is the byte prefix that will store cross-chain validators by consensus address - CrossChainValidatorBytePrefix - - // PendingDataPacketsByteKey is the byte key for storing + // PendingDataPacketsBytePrefix is the byte prefix for storing // a list of data packets that cannot be sent yet to the provider // chain either because the CCV channel is not established or // because the client is expired - PendingDataPacketsByteKey - - // PreCCVByteKey is the byte to store the consumer is running on democracy staking module without consumer - PreCCVByteKey + PendingDataPacketsBytePrefix - // InitialValSetByteKey is the byte to store the initial validator set for a consumer - InitialValSetByteKey + // CrossChainValidatorPrefix is the byte prefix that will store cross-chain validators by consensus address + CrossChainValidatorBytePrefix // InitGenesisHeightByteKey is the byte that will store the init genesis height InitGenesisHeightByteKey - // SmallestNonOptOutPowerByteKey is the byte that will store the smallest val power that cannot opt out - SmallestNonOptOutPowerByteKey - // StandaloneTransferChannelIDByteKey is the byte storing the channelID of transfer channel // that existed from a standalone chain changing over to a consumer StandaloneTransferChannelIDByteKey @@ -170,7 +175,7 @@ func CrossChainValidatorKey(addr []byte) []byte { // that cannot be sent yet to the provider chain either because the CCV channel // is not established or because the client is expired. func PendingDataPacketsKey() []byte { - return []byte{PendingDataPacketsByteKey} + return []byte{PendingDataPacketsBytePrefix} } func PreCCVKey() []byte { diff --git a/x/ccv/consumer/types/keys_test.go b/x/ccv/consumer/types/keys_test.go index c0ab13391a..a63da6f326 100644 --- a/x/ccv/consumer/types/keys_test.go +++ b/x/ccv/consumer/types/keys_test.go @@ -27,16 +27,18 @@ func getAllKeyPrefixes() []byte { ProviderClientByteKey, ProviderChannelByteKey, PendingChangesByteKey, + PendingDataPacketsByteKey, + PreCCVByteKey, + InitialValSetByteKey, + LastStandaloneHeightByteKey, + SmallestNonOptOutPowerByteKey, HistoricalInfoBytePrefix, PacketMaturityTimeBytePrefix, HeightValsetUpdateIDBytePrefix, OutstandingDowntimeBytePrefix, + PendingDataPacketsBytePrefix, CrossChainValidatorBytePrefix, - PendingDataPacketsByteKey, - PreCCVByteKey, - InitialValSetByteKey, InitGenesisHeightByteKey, - SmallestNonOptOutPowerByteKey, StandaloneTransferChannelIDByteKey, PrevStandaloneChainByteKey, } @@ -61,16 +63,18 @@ func getAllFullyDefinedKeys() [][]byte { ProviderClientIDKey(), ProviderChannelKey(), PendingChangesKey(), + // PendingDataPacketsKey() does not use duplicated prefix with value of 0x06 + PreCCVKey(), + InitialValSetKey(), + // LastStandaloneHeightKey() is depreciated + SmallestNonOptOutPowerKey(), HistoricalInfoKey(0), PacketMaturityTimeKey(0, time.Time{}), HeightValsetUpdateIDKey(0), OutstandingDowntimeKey([]byte{}), - CrossChainValidatorKey([]byte{}), PendingDataPacketsKey(), - PreCCVKey(), - InitialValSetKey(), + CrossChainValidatorKey([]byte{}), InitGenesisHeightKey(), - SmallestNonOptOutPowerKey(), StandaloneTransferChannelIDKey(), PrevStandaloneChainKey(), } From e2ac9743e9a309b29e6e92ab64be2e4e79503f75 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Thu, 8 Jun 2023 11:46:35 -0700 Subject: [PATCH 034/108] feat: Remove consumer genesis migration on provider (#997) * Update keys.go * tests * fix another bug * remove consumer genesis deletion, link to test * remove unused bond denom method * Revert "remove unused bond denom method" This reverts commit f930eca428bade49a05368fe5dae2d96842659cc. * remove test too * update changelog --- CHANGELOG.md | 4 ++-- x/ccv/provider/keeper/migration.go | 14 ++++---------- x/ccv/provider/keeper/migration_test.go | 19 ------------------- 3 files changed, 6 insertions(+), 31 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f946901f2..d2b0b754e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,11 +25,11 @@ Some PRs from v2.0.0 may reappear from other releases below. This is due to the ## Notable PRs included in v2.0.0 -* (feat) v1->v2 migrations to accommodate a bugfix having to do with store keys, introduce new params, and deal with consumer genesis state schema changes [#975](https://github.com/cosmos/interchain-security/pull/975) +* (fix) cosumer key prefix order to avoid complex migrations [#963](https://github.com/cosmos/interchain-security/pull/963) and [#991](https://github.com/cosmos/interchain-security/pull/991). The latter PR is the proper fix. +* (feat) v1->v2 migrations to accommodate a bugfix having to do with store keys, introduce new params, and deal with consumer genesis state schema changes [#975](https://github.com/cosmos/interchain-security/pull/975) and [#997](https://github.com/cosmos/interchain-security/pull/997) * (deps) Bump github.com/cosmos/ibc-go/v4 from 4.4.0 to 4.4.2 [#982](https://github.com/cosmos/interchain-security/pull/982) * (fix) partially revert key assignment type safety PR [#980](https://github.com/cosmos/interchain-security/pull/980) * (fix) Remove panics on failure to send IBC packets [#876](https://github.com/cosmos/interchain-security/pull/876) -* (fix) consumer key prefix order to avoid complex migrations [#963](https://github.com/cosmos/interchain-security/pull/963) * (fix) Prevent denom DOS [#931](https://github.com/cosmos/interchain-security/pull/931) * (fix) multisig for assigning consumer key, use json [#916](https://github.com/cosmos/interchain-security/pull/916) * (deps) Bump github.com/cosmos/ibc-go/v4 from 4.3.0 to 4.4.0 [#902](https://github.com/cosmos/interchain-security/pull/902) diff --git a/x/ccv/provider/keeper/migration.go b/x/ccv/provider/keeper/migration.go index 4e899bcce2..d33fcb7968 100644 --- a/x/ccv/provider/keeper/migration.go +++ b/x/ccv/provider/keeper/migration.go @@ -33,8 +33,10 @@ func (m Migrator) Migratev1Tov2(ctx sdk.Context) error { sdk.NewCoin(m.ccvProviderKeeper.BondDenom(ctx), sdk.NewInt(10000000)), ) - // Delete select consumer genesis states for consumers that're launched - MigrateConsumerGenesisStatesv1Tov2(ctx, m.ccvProviderKeeper) + // Consumer genesis states persisted on the provider do not need to be migrated, + // as protobuf serialization is able to gracefully handle unpopulated fields when deserializing. + // See https://github.com/smarshall-spitzbart/ics-migration-tests/commit/b589e3982c26783ed66e954051f7da1ead16de68 + // which passes, proving the addition of preCCV will not break things. // Migrate keys to accommodate fix from https://github.com/cosmos/interchain-security/pull/786 MigrateKeysv1Tov2(ctx, m.ccvProviderKeeper) @@ -80,14 +82,6 @@ func MigrateParamsv1Tov2(ctx sdk.Context, paramsSubspace paramtypes.Subspace, co paramsSubspace.SetParamSet(ctx, &newParams) } -func MigrateConsumerGenesisStatesv1Tov2(ctx sdk.Context, providerKeeper Keeper) { - // We could try to migrate existing ConsumerGenesisStates, but they're not needed after consumer launch. - // Hence we delete them strategically. - providerKeeper.DeleteConsumerGenesis(ctx, "neutron-1") // See https://github.com/neutron-org/mainnet-assets#parameters - - // TODO: determine if any other ConsumerGenesisStates need to be deleted, or actually migrated! -} - // Due to https://github.com/cosmos/interchain-security/pull/786, // validators' slash logs are stored under the key prefix for slash acks. // This method will extract "slash logs" from the slash acks part of the store, and put the slash logs diff --git a/x/ccv/provider/keeper/migration_test.go b/x/ccv/provider/keeper/migration_test.go index 858aa193e6..e488dd2d36 100644 --- a/x/ccv/provider/keeper/migration_test.go +++ b/x/ccv/provider/keeper/migration_test.go @@ -13,7 +13,6 @@ import ( types2 "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" "github.com/cosmos/interchain-security/v2/testutil/crypto" testutil "github.com/cosmos/interchain-security/v2/testutil/keeper" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" @@ -124,24 +123,6 @@ type v1Params struct { MaxThrottledPackets int64 `protobuf:"varint,8,opt,name=max_throttled_packets,json=maxThrottledPackets,proto3" json:"max_throttled_packets,omitempty"` } -func TestMigrateConsumerGenesisv1Tov2(t *testing.T) { - providerKeeper, ctx, ctrl, _ := testutil.GetProviderKeeperAndCtx(t, testutil.NewInMemKeeperParams(t)) - defer ctrl.Finish() - - _, found := providerKeeper.GetConsumerGenesis(ctx, "neutron-1") - require.False(t, found) - - providerKeeper.SetConsumerGenesis(ctx, "neutron-1", consumertypes.GenesisState{}) - - _, found = providerKeeper.GetConsumerGenesis(ctx, "neutron-1") - require.True(t, found) - - providerkeeper.MigrateConsumerGenesisStatesv1Tov2(ctx, providerKeeper) - - _, found = providerKeeper.GetConsumerGenesis(ctx, "neutron-1") - require.False(t, found) -} - func TestMigrateKeysv1Tov2(t *testing.T) { providerKeeper, ctx, ctrl, _ := testutil.GetProviderKeeperAndCtx(t, testutil.NewInMemKeeperParams(t)) defer ctrl.Finish() From 67b93a4834cc756230f29fbcef11e2dfc0b61228 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Fri, 9 Jun 2023 10:52:59 -0700 Subject: [PATCH 035/108] docs: Update reward-distribution.md (#994) * Update reward-distribution.md * docs: add instructions for registering denoms * Update docs/docs/features/reward-distribution.md Co-authored-by: Marius Poke * Update reward-distribution.md * Update docs/docs/features/reward-distribution.md Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> --------- Co-authored-by: MSalopek Co-authored-by: Marius Poke --- docs/docs/features/reward-distribution.md | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/docs/docs/features/reward-distribution.md b/docs/docs/features/reward-distribution.md index 122eab5ad9..31b3f9e54e 100644 --- a/docs/docs/features/reward-distribution.md +++ b/docs/docs/features/reward-distribution.md @@ -12,6 +12,21 @@ The distributed reward tokens are IBC tokens and therefore cannot be staked on t Sending and distributing rewards from consumer chains to provider chain is handled by the `Reward Distribution` sub-protocol. +## Note +The ICS distribution system works by allowing consumer chains to send rewards to a module address on the provider called the `ConsumerRewardsPool`. +There is a new transaction type called `RegisterConsumerRewardDenom`. This transaction allows consumer chains to register denoms to be used as consumer chain rewards on the provider. +The cost to register a denom is configurable (`ConsumerRewardDenomRegistrationFee` chain param) and the full amount of this fee is transferred to the community pool of the provider chain. Only denoms registered through this transaction are then transferred from the `ConsumerRewardsPool` to the `FeePoolAddress`, to be distributed out to delegators and validators. + +### Instructions for adding a denom +The transaction must be carried out on the provider chain. Please use the `ibc/*` denom trace format. + +:::tip +``` +# reward denoms must be registered on the provider chain (gaia in this example) +gaiad tx provider register-consumer-reward-denom ibc/3C3D7B3BE4ECC85A0E5B52A3AEC3B7DFC2AA9CA47C37821E57020D6807043BE9 --from mykey +``` +::: + ## Parameters :::tip The following chain parameters dictate consumer chain distribution amount and frequency. @@ -21,12 +36,12 @@ They are set at consumer genesis and `blocks_per_distribution_transmission`, `co ### `consumer_redistribution_fraction` -The fraction of tokens sent from consumer to provider during distribution events. The fraction is a string representing a decimal number. For example "0.75" would represent 75%. +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%. :::tip Example: -With `consumer_redistribution_fraction` set to `0.75` the consumer chain would send 75% of its block rewards and accumulated fees to the consumer chain and the remaining 25% to the provider chain every `n` blocks where `n == blocks_per_distribution_transmission`. +With `consumer_redistribution_fraction` set to `0.75` the consumer chain would send 75% of its block rewards and accumulated fees to the consumer redistribution address, and the remaining 25% to the provider chain every `n` blocks where `n == blocks_per_distribution_transmission`. ::: ### `blocks_per_distribution_transmission` From 274eea0705fb52e3c7b613b01eee34c7d63e4ee2 Mon Sep 17 00:00:00 2001 From: Marius Poke Date: Mon, 12 Jun 2023 10:15:32 +0200 Subject: [PATCH 036/108] chore: update workflow re. issues and PRs (#1002) * update PR workflow * update issue workflow * rename other.md to others.md * fix typo --------- Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/epic-template.md | 8 +-- .github/ISSUE_TEMPLATE/feature-request.md | 16 +++++- .github/ISSUE_TEMPLATE/issue-template.md | 6 +-- .github/PULL_REQUEST_TEMPLATE.md | 54 ++----------------- .../{other.md => others.md} | 0 .github/PULL_REQUEST_TEMPLATE/production.md | 48 +++++++++++++++++ CONTRIBUTING.md | 7 +-- 7 files changed, 78 insertions(+), 61 deletions(-) rename .github/PULL_REQUEST_TEMPLATE/{other.md => others.md} (100%) create mode 100644 .github/PULL_REQUEST_TEMPLATE/production.md diff --git a/.github/ISSUE_TEMPLATE/epic-template.md b/.github/ISSUE_TEMPLATE/epic-template.md index ff49d57323..6738bb12d1 100644 --- a/.github/ISSUE_TEMPLATE/epic-template.md +++ b/.github/ISSUE_TEMPLATE/epic-template.md @@ -4,20 +4,20 @@ about: Basic template for EPICs (used by the team) labels: epic, needs-triage --- -# Problem +## Problem -# Closing criteria +## Closing criteria -# Problem details +## Problem details -# Task list +## Task list ```[tasklist] ### Must have diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md index e16a421183..44f19495cd 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.md +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -1,7 +1,7 @@ --- name: Feature Request about: Create a proposal to request a feature -labels: enhancement, needs-triage +labels: enhancement, epic, needs-triage --- +## Task list + +```[tasklist] +### Must have +- [ ] discuss proposal (if proposal rejected, close EPIC) +- [ ] create ADR (if ADR rejected, close EPIC) +- [ ] add sub-tasks needed to implement the proposed feature +``` + +```[tasklist] +### Nice to have +- [ ] add sub-tasks that are nice to have for the proposed feature +``` + ____ #### For Admin Use diff --git a/.github/ISSUE_TEMPLATE/issue-template.md b/.github/ISSUE_TEMPLATE/issue-template.md index 2ce98fd81b..bef74bd4bb 100644 --- a/.github/ISSUE_TEMPLATE/issue-template.md +++ b/.github/ISSUE_TEMPLATE/issue-template.md @@ -10,15 +10,15 @@ v Before smashing the submit button please review the template. v Please also ensure that this is not a duplicate issue :) ☺ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > --> -# Problem +## Problem -# Closing criteria +## Closing criteria -# Problem details +## Problem details diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 979c1d1c42..1036e0b387 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,51 +1,5 @@ - +Please go the the `Preview` tab and select the appropriate sub-template: -## Description - -Closes: #XXXX - - - ---- - -### Author Checklist - -*All items are required. Please add a note to the item if the item is not applicable and -please add links to any relevant follow up issues.* - -I have... - -* [ ] Included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title -* [ ] Added `!` to the type prefix if API or client breaking change -* [ ] Confirmed this PR does not introduce changes requiring state migrations, OR migration code has been added to consumer and/or provider modules -* [ ] Targeted the correct branch (see [PR Targeting](https://github.com/cosmos/interchain-security/blob/main/CONTRIBUTING.md#pr-targeting)) -* [ ] Provided a link to the relevant issue or specification -* [ ] Followed the guidelines for [building SDK modules](https://github.com/cosmos/cosmos-sdk/blob/main/docs/docs/building-modules) -* [ ] Included the necessary unit and integration [tests](https://github.com/cosmos/interchain-security/blob/main/CONTRIBUTING.md#testing) -* [ ] Added a changelog entry to `CHANGELOG.md` -* [ ] Included comments for [documenting Go code](https://blog.golang.org/godoc) -* [ ] Updated the relevant documentation or specification -* [ ] Reviewed "Files changed" and left comments if necessary -* [ ] Confirmed all CI checks have passed - -### Reviewers Checklist - -*All items are required. Please add a note if the item is not applicable and please add -your handle next to the items reviewed if you only reviewed selected items.* - -I have... - -* [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title -* [ ] confirmed `!` in the type prefix if API or client breaking change -* [ ] confirmed this PR does not introduce changes requiring state migrations, OR confirmed migration code has been added to consumer and/or provider modules -* [ ] confirmed all author checklist items have been addressed -* [ ] reviewed state machine logic -* [ ] reviewed API design and naming -* [ ] reviewed documentation is accurate -* [ ] reviewed tests and test coverage +* [Production code](?expand=1&template=production.md) - for types `fix`, `feat`, and `refactor`. +* [Docs](?expand=1&template=docs.md) - for documentation changes. +* [Others](?expand=1&template=others.md) - for changes that do not affect production code. \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE/other.md b/.github/PULL_REQUEST_TEMPLATE/others.md similarity index 100% rename from .github/PULL_REQUEST_TEMPLATE/other.md rename to .github/PULL_REQUEST_TEMPLATE/others.md diff --git a/.github/PULL_REQUEST_TEMPLATE/production.md b/.github/PULL_REQUEST_TEMPLATE/production.md new file mode 100644 index 0000000000..0d197d890c --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/production.md @@ -0,0 +1,48 @@ + + +## Description + +Closes: #XXXX + + + +--- + +### Author Checklist + +*All items are required. Please add a note to the item if the item is not applicable and +please add links to any relevant follow up issues.* + +I have... + +* [ ] Included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title +* [ ] Added `!` to the type prefix if API or client breaking change +* [ ] Confirmed this PR does not introduce changes requiring state migrations, OR migration code has been added to consumer and/or provider modules +* [ ] Targeted the correct branch (see [PR Targeting](https://github.com/cosmos/interchain-security/blob/main/CONTRIBUTING.md#pr-targeting)) +* [ ] Provided a link to the relevant issue or specification +* [ ] Followed the guidelines for [building SDK modules](https://github.com/cosmos/cosmos-sdk/blob/main/docs/docs/building-modules) +* [ ] Included the necessary unit and integration [tests](https://github.com/cosmos/interchain-security/blob/main/CONTRIBUTING.md#testing) +* [ ] Added a changelog entry to `CHANGELOG.md` +* [ ] Included comments for [documenting Go code](https://blog.golang.org/godoc) +* [ ] Updated the relevant documentation or specification +* [ ] Reviewed "Files changed" and left comments if necessary +* [ ] Confirmed all CI checks have passed + +### Reviewers Checklist + +*All items are required. Please add a note if the item is not applicable and please add +your handle next to the items reviewed if you only reviewed selected items.* + +I have... + +* [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title +* [ ] confirmed `!` in the type prefix if API or client breaking change +* [ ] confirmed this PR does not introduce changes requiring state migrations, OR confirmed migration code has been added to consumer and/or provider modules +* [ ] confirmed all author checklist items have been addressed +* [ ] reviewed state machine logic +* [ ] reviewed API design and naming +* [ ] reviewed documentation is accurate +* [ ] reviewed tests and test coverage diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 21fc360d3f..dca2431585 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -179,10 +179,11 @@ Additionally, **each PR should only address a single issue**. ### Pull Request Templates -There are three PR templates. The [default template](./.github/PULL_REQUEST_TEMPLATE.md) is for types `fix`, `feat`, and `refactor`. We also have a [docs template](./.github/PULL_REQUEST_TEMPLATE/docs.md) for documentation changes and an [other template](./.github/PULL_REQUEST_TEMPLATE/other.md) for changes that do not affect production code. When previewing a PR before it has been opened, you can change the template by adding one of the following parameters to the url: +There are three PR templates. The [default template](./.github/PULL_REQUEST_TEMPLATE.md) contains links to the three templates. Please go the the `Preview` tab and select the appropriate sub-template: -* `template=docs.md` -* `template=other.md` +- The [production template](./.github/PULL_REQUEST_TEMPLATE/production.md) is for types `fix`, `feat`, and `refactor`. +- The [docs template](./.github/PULL_REQUEST_TEMPLATE/docs.md) is for documentation changes. +- The [other template](./.github/PULL_REQUEST_TEMPLATE/other.md) is for changes that do not affect production code. ### Requesting Reviews From 1113ba40df1fe833a98f5c578e3db02705e12e62 Mon Sep 17 00:00:00 2001 From: Thomas Bruyelle Date: Mon, 12 Jun 2023 11:09:34 +0200 Subject: [PATCH 037/108] docs(adr): ADR-007 pause unbonding period during equivocation proposal (#964) * docs(adr): pause unbonding period during equivocation proposal Co-authored-by: Albert Le Batteux Co-authored-by: Giuseppe Natale * fix voting period duration * remove issue reference * docs: filter out unbonding operations before pause/unpause Co-authored-by: Albert Le Batteux Co-authored-by: Giuseppe Natale --------- Co-authored-by: Albert Le Batteux Co-authored-by: Giuseppe Natale --- .../adr-007-pause-unbonding-on-eqv-prop.md | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 docs/docs/adrs/adr-007-pause-unbonding-on-eqv-prop.md diff --git a/docs/docs/adrs/adr-007-pause-unbonding-on-eqv-prop.md b/docs/docs/adrs/adr-007-pause-unbonding-on-eqv-prop.md new file mode 100644 index 0000000000..bf3a761704 --- /dev/null +++ b/docs/docs/adrs/adr-007-pause-unbonding-on-eqv-prop.md @@ -0,0 +1,93 @@ +--- +sidebar_position: 2 +title: ADR Template +--- +# ADR 007: Pause validator unbonding during equivocation proposal + +## Changelog +* 2023-05-16: Initial Draft + +## Status + +Proposed + +## Context + +Currently, if an equivocation slashing proposal is created after more than one +week has passed since the equivocation, it is possible that the validator in +question could unbond and get away without being slashed, since the unbonding +period is 3 weeks, and the voting period is 2 weeks. For this reason, it might +be good to pause unbondings for validators named in an equivocation slashing +proposal until the proposal's voting period is over. + +## Decision + +### How + +Pausing the unbonding period is already possible thanks to the changes in the +`staking` module of the cosmos-sdk: +- `stakingKeeper.PutUnbondingOnHold` pauses an unbonding period +- `stakingKeeper.UnbondingCanComplete` unpauses an unbonding period + +These methods use a reference counter under the hood, that gets incremented +every time `PutUnbondingOnHold` is called, and decreased when +`UnbondingCanComplete` is called instead. A specific unbonding is considered +fully unpaused when its underlying reference counter reaches 0. Therefore, as +long as we safeguard consistency - i.e. we make sure we eventually decrement +the reference counter for each time we have incremented it - we can safely use +this existing mechanism without conflicts with the *Completion of Unbonding +Operations* system. + +### When pause + +The unbonding period (if there is any unbonding) should be paused once an +equivocation proposal enters the voting period. For that, the `gov` module's +hook `AfterProposalDeposit` can be used. + +If the hook is triggered with a an equivocation proposal in voting period, then +for each equivocation of the proposal, the unbonding operations of the related +validator that were initiated after the equivocation block time must be paused +- i.e. the underlying reference counter has to be increased. + +Note that even after the voting period has started, a proposal can receive +additional deposits. The hook is triggered however at arrival of a deposit, so +a check to verify that the proposal is not already in voting period is +required. + +### When unpause + +We can use a `gov` module's hook also here and it is +`AfterProposalVotingPeriodEnded`. + +If the hook is triggered with an equivocation proposal, then for each +associated equivocation, the unbonding operations of the related validator that +were initiated between the equivocation block time and the start of the +proposal voting period must be unpaused - i.e. decrease the underlying +reference counter - regardless of the proposal outcome. + +## Consequences + +### Positive + +- Validators subject to an equivocation proposal cannot finish unbonding + their tokens before the end of the voting period. + +### Negative + +- A malicious consumer chain could forge slash packets enabling submission of + an equivocation proposal on the provider chain, resulting in the freezing of + validator's unbondings for an undeterminated amount of time. +- Misbehavior on a consumer chain can potentially go unpunished, if no one + submits an equivocation proposal in time, or if the proposal doesn't pass. + +### Neutral + +- This feature can't be used for social slashing, because an equivocation + proposal is only accepted if there's a slash log for the related + validator(s), meaning the consumer chain has reported the equivocation to + the provider chain. + +## References + +* https://github.com/cosmos/interchain-security/issues/747 +* https://github.com/cosmos/interchain-security/pull/791 From 2b18b5e56896afe057cc41f04ad6f1ab86c81590 Mon Sep 17 00:00:00 2001 From: Marius Poke Date: Mon, 12 Jun 2023 21:28:10 +0200 Subject: [PATCH 038/108] docs: Add type prefix link to CONTRIBUTING.md (#1007) Update CONTRIBUTING.md --- CONTRIBUTING.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index dca2431585..61dd6a3102 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -170,8 +170,9 @@ Then: 4. Be sure to include a relevant changelog entry in the `Unreleased` section of `CHANGELOG.md` (see file for log format). The entry should be on top of all others changes in the section. PRs must have a category prefix that is based on the type of changes being made (for example, `fix`, `feat`, -`refactor`, `docs`, and so on). The *type* must be included in the PR title as a prefix (for example, -`fix: `). This convention ensures that all changes that are committed to the base branch follow the +`refactor`, `docs`, and so on). The [type](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) +must be included in the PR title as a prefix (for example, `fix: `). +This convention ensures that all changes that are committed to the base branch follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) specification. Additionally, **each PR should only address a single issue**. From 93e45a5133600d8bb5cd7a179173a2e61720faa7 Mon Sep 17 00:00:00 2001 From: Marius Poke Date: Tue, 13 Jun 2023 12:48:09 +0200 Subject: [PATCH 039/108] chore: enable mergify (#1009) * add config for mergify * enable security dependecies for v2.0.x --- .github/dependabot.yml | 10 ++++++++++ .mergify.yml | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 .mergify.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 029e4e2a7d..42241f2b1d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -15,5 +15,15 @@ updates: interval: weekly target-branch: "main" open-pull-requests-limit: 10 + labels: + - dependencies + + - package-ecosystem: gomod + directory: "/" + schedule: + interval: daily + target-branch: "release/v2.0.x" + # Only allow automated security-related dependency updates on release branches. + open-pull-requests-limit: 0 labels: - dependencies \ No newline at end of file diff --git a/.mergify.yml b/.mergify.yml new file mode 100644 index 0000000000..7eae0395e1 --- /dev/null +++ b/.mergify.yml @@ -0,0 +1,20 @@ +defaults: + actions: + backport: + assignees: + - "{{ author }}" + +queue_rules: + - name: default + conditions: + - "#approved-reviews-by>1" + +pull_request_rules: + - name: Backport patches to the release/v2.0.x branch + conditions: + - base=main + - label=A:backport/v2.0.x + actions: + backport: + branches: + - release/v2.0.x From 281a7ca146a3e5180c6b558c6c643cf2707dbbd2 Mon Sep 17 00:00:00 2001 From: Ruslan Akhtariev <46343690+pysel@users.noreply.github.com> Date: Tue, 13 Jun 2023 22:19:02 +0700 Subject: [PATCH 040/108] Markdownlint (#907) markdownlint Co-authored-by: Jacob Gadikian --- .markdownlint.json | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .markdownlint.json diff --git a/.markdownlint.json b/.markdownlint.json new file mode 100644 index 0000000000..a74b230946 --- /dev/null +++ b/.markdownlint.json @@ -0,0 +1,4 @@ +{ + "MD036": false, + "MD013": false +} \ No newline at end of file From 8c2fc562dedecee7799ac69bd72734c37a356638 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue, 13 Jun 2023 15:52:11 -0700 Subject: [PATCH 041/108] fix: limit vsc matured packets handled per endblocker (#1004) * initial implementation, still need tests * UTs * integration test * linter * Update CHANGELOG.md * make vsc matured handled this block a var * comment --- CHANGELOG.md | 1 + tests/integration/throttle.go | 85 ++++++++++++++++++++++++-- testutil/integration/debug_test.go | 4 ++ x/ccv/provider/keeper/relay.go | 22 +++++-- x/ccv/provider/keeper/throttle.go | 30 +++++++-- x/ccv/provider/keeper/throttle_test.go | 2 +- x/ccv/provider/types/keys.go | 8 +++ x/ccv/provider/types/keys_test.go | 2 + 8 files changed, 140 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2b0b754e8..208c4ec2c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ Some PRs from v2.0.0 may reappear from other releases below. This is due to the ## Notable PRs included in v2.0.0 +* (feat/fix) limit vsc matured packets handled per endblocker [#1004](https://github.com/cosmos/interchain-security/pull/1004) * (fix) cosumer key prefix order to avoid complex migrations [#963](https://github.com/cosmos/interchain-security/pull/963) and [#991](https://github.com/cosmos/interchain-security/pull/991). The latter PR is the proper fix. * (feat) v1->v2 migrations to accommodate a bugfix having to do with store keys, introduce new params, and deal with consumer genesis state schema changes [#975](https://github.com/cosmos/interchain-security/pull/975) and [#997](https://github.com/cosmos/interchain-security/pull/997) * (deps) Bump github.com/cosmos/ibc-go/v4 from 4.4.0 to 4.4.2 [#982](https://github.com/cosmos/interchain-security/pull/982) diff --git a/tests/integration/throttle.go b/tests/integration/throttle.go index c2ef98a4ae..b2dc390ea1 100644 --- a/tests/integration/throttle.go +++ b/tests/integration/throttle.go @@ -12,6 +12,8 @@ import ( tmtypes "github.com/tendermint/tendermint/types" ) +const fullSlashMeterString = "1.0" + // TestBasicSlashPacketThrottling tests slash packet throttling with a single consumer, // two slash packets, and no VSC matured packets. The most basic scenario. func (s *CCVTestSuite) TestBasicSlashPacketThrottling() { @@ -651,7 +653,7 @@ func (s *CCVTestSuite) TestSlashSameValidator() { // Set replenish fraction to 1.0 so that all sent packets should handled immediately (no throttling) params := providerKeeper.GetParams(s.providerCtx()) - params.SlashMeterReplenishFraction = "1.0" + params.SlashMeterReplenishFraction = fullSlashMeterString // needs to be const for linter providerKeeper.SetParams(s.providerCtx(), params) providerKeeper.InitializeSlashMeter(s.providerCtx()) @@ -706,7 +708,7 @@ func (s CCVTestSuite) TestSlashAllValidators() { //nolint:govet // this is a tes // Set replenish fraction to 1.0 so that all sent packets should be handled immediately (no throttling) params := providerKeeper.GetParams(s.providerCtx()) - params.SlashMeterReplenishFraction = "1.0" + params.SlashMeterReplenishFraction = fullSlashMeterString // needs to be const for linter providerKeeper.SetParams(s.providerCtx(), params) providerKeeper.InitializeSlashMeter(s.providerCtx()) @@ -779,7 +781,7 @@ func (s *CCVTestSuite) TestLeadingVSCMaturedAreDequeued() { // Queue up 50 slash packets for each consumer for _, bundle := range s.consumerBundles { - for i := 0; i < 50; i++ { + for i := 50; i < 100; i++ { ibcSeqNum := uint64(i) packet := s.constructSlashPacketFromConsumer(*bundle, *s.providerChain.Vals.Validators[0], stakingtypes.Downtime, ibcSeqNum) @@ -792,7 +794,7 @@ func (s *CCVTestSuite) TestLeadingVSCMaturedAreDequeued() { // Queue up another 50 vsc matured packets for each consumer for _, bundle := range s.consumerBundles { - for i := 0; i < 50; i++ { + for i := 100; i < 150; i++ { ibcSeqNum := uint64(i) packet := s.constructVSCMaturedPacketFromConsumer(*bundle, ibcSeqNum) packetData := ccvtypes.ConsumerPacketData{} @@ -818,6 +820,10 @@ func (s *CCVTestSuite) TestLeadingVSCMaturedAreDequeued() { 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). @@ -827,9 +833,80 @@ func (s *CCVTestSuite) TestLeadingVSCMaturedAreDequeued() { } // 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 + for _, bundle := range s.consumerBundles { + for i := 0; i < 100; i++ { + ibcSeqNum := uint64(i) + packet := s.constructVSCMaturedPacketFromConsumer(*bundle, ibcSeqNum) + packetData := ccvtypes.ConsumerPacketData{} + ccvtypes.ModuleCdc.MustUnmarshalJSON(packet.GetData(), &packetData) + 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) + packet := s.constructSlashPacketFromConsumer(*bundle, + *s.providerChain.Vals.Validators[0], stakingtypes.Downtime, ibcSeqNum) + packetData := ccvtypes.ConsumerPacketData{} + ccvtypes.ModuleCdc.MustUnmarshalJSON(packet.GetData(), &packetData) + providerKeeper.OnRecvSlashPacket(s.providerCtx(), + packet, *packetData.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/testutil/integration/debug_test.go b/testutil/integration/debug_test.go index 95190ba8a0..b6456663a9 100644 --- a/testutil/integration/debug_test.go +++ b/testutil/integration/debug_test.go @@ -205,6 +205,10 @@ func TestLeadingVSCMaturedAreDequeued(t *testing.T) { runCCVTestByName(t, "TestLeadingVSCMaturedAreDequeued") } +func TestVscMaturedHandledPerBlockLimit(t *testing.T) { + runCCVTestByName(t, "TestVscMaturedHandledPerBlockLimit") +} + // // Unbonding tests // diff --git a/x/ccv/provider/keeper/relay.go b/x/ccv/provider/keeper/relay.go index 1d93b2fdd9..ea07e0e9af 100644 --- a/x/ccv/provider/keeper/relay.go +++ b/x/ccv/provider/keeper/relay.go @@ -53,14 +53,25 @@ func (k Keeper) OnRecvVSCMaturedPacket( // 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) { +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) - for _, data := range leadingVscMatured { + 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, ibcSeqNums...) + k.DeleteThrottledPacketData(ctx, chain.ChainId, ibcSeqNumsHandled...) } + return vscMaturedHandledThisBlock } // HandleVSCMaturedPacket handles a VSCMatured packet. @@ -267,13 +278,14 @@ 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. - k.HandleLeadingVSCMaturedPackets(ctx) + vscMaturedHandledThisBlock := k.HandleLeadingVSCMaturedPackets(ctx) // Handle queue entries considering throttling logic. // // Note: HandleThrottleQueues contains panics for the following scenarios, any of which should never occur @@ -282,7 +294,7 @@ func (k Keeper) EndBlockCIS(ctx sdk.Context) { // - 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) + k.HandleThrottleQueues(ctx, vscMaturedHandledThisBlock) } // OnRecvSlashPacket delivers a received slash packet, validates it and diff --git a/x/ccv/provider/keeper/throttle.go b/x/ccv/provider/keeper/throttle.go index 704a2f6d19..d832125bfb 100644 --- a/x/ccv/provider/keeper/throttle.go +++ b/x/ccv/provider/keeper/throttle.go @@ -12,16 +12,25 @@ import ( // 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) { +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) @@ -35,7 +44,7 @@ func (k Keeper) HandleThrottleQueues(ctx sdktypes.Context) { // 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) + 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 @@ -82,18 +91,31 @@ func (k Keeper) GetEffectiveValPower(ctx sdktypes.Context, 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 _, vscMData := range vscMaturedData { + 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, seqNums...) + k.DeleteThrottledPacketData(ctx, consumerChainID, seqNumsHandled...) } // InitializeSlashMeter initializes the slash meter to it's max value (also its allowance), diff --git a/x/ccv/provider/keeper/throttle_test.go b/x/ccv/provider/keeper/throttle_test.go index 3be597e28a..3b93523d4b 100644 --- a/x/ccv/provider/keeper/throttle_test.go +++ b/x/ccv/provider/keeper/throttle_test.go @@ -134,7 +134,7 @@ func TestHandlePacketDataForChain(t *testing.T) { handledData = append(handledData, data) } - providerKeeper.HandlePacketDataForChain(ctx, tc.chainID, slashHandleCounter, vscMaturedHandleCounter) + 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)) diff --git a/x/ccv/provider/types/keys.go b/x/ccv/provider/types/keys.go index bb2ffcc881..4e15f566ef 100644 --- a/x/ccv/provider/types/keys.go +++ b/x/ccv/provider/types/keys.go @@ -134,6 +134,10 @@ const ( // ConsumerRewardDenomsBytePrefix is the byte prefix that will store a list of consumer reward denoms ConsumerRewardDenomsBytePrefix + // VSCMaturedHandledThisBlockBytePrefix is the byte prefix storing the number of vsc matured packets + // handled in the current block + VSCMaturedHandledThisBlockBytePrefix + // NOTE: DO NOT ADD NEW BYTE PREFIXES HERE WITHOUT ADDING THEM TO getAllKeyPrefixes() IN keys_test.go ) @@ -476,6 +480,10 @@ func ParseChainIdAndConsAddrKey(prefix byte, bz []byte) (string, sdk.ConsAddress return chainID, addr, nil } +func VSCMaturedHandledThisBlockKey() []byte { + return []byte{VSCMaturedHandledThisBlockBytePrefix} +} + // // End of generic helpers section // diff --git a/x/ccv/provider/types/keys_test.go b/x/ccv/provider/types/keys_test.go index d28232c6a2..03493c1138 100644 --- a/x/ccv/provider/types/keys_test.go +++ b/x/ccv/provider/types/keys_test.go @@ -51,6 +51,7 @@ func getAllKeyPrefixes() []byte { providertypes.KeyAssignmentReplacementsBytePrefix, providertypes.ConsumerAddrsToPruneBytePrefix, providertypes.SlashLogBytePrefix, + providertypes.VSCMaturedHandledThisBlockBytePrefix, } } @@ -94,6 +95,7 @@ func getAllFullyDefinedKeys() [][]byte { providertypes.KeyAssignmentReplacementsKey("chainID", providertypes.NewProviderConsAddress([]byte{0x05})), providertypes.ConsumerAddrsToPruneKey("chainID", 88), providertypes.SlashLogKey(providertypes.NewProviderConsAddress([]byte{0x05})), + providertypes.VSCMaturedHandledThisBlockKey(), } } From 07be71aa678a0ad204c62a6eb6033a526c0bef27 Mon Sep 17 00:00:00 2001 From: Philip Offtermatt <57488781+p-offtermatt@users.noreply.github.com> Date: Wed, 14 Jun 2023 10:51:38 +0200 Subject: [PATCH 042/108] feat: integrate cometmock (#989) * Add gorelayer and CometMock to Dockerfile * Add option to start with cometmock in start-chain script * Start adding support for rly * Adjust relayer start action * Add entrypoint for short happy path steps * Add . nosec G204 and waiting for blocks * Adjust rly config: Gas is free * Remove optout steps from short happy path * Use separate redelegate step for short happy path * Wait for blocks after unbonding * Make naming more descriptive and add comments * Add comment to chain name sorting and improve comments * Update start-chain.sh Address comments form joint review session with @MSalopek * Fix typo --- Dockerfile | 8 + tests/e2e/actions.go | 286 +++++++++++++++++- tests/e2e/config.go | 10 + tests/e2e/main.go | 24 +- tests/e2e/state.go | 5 + tests/e2e/step_delegation.go | 65 +++- tests/e2e/steps.go | 12 +- tests/e2e/steps_democracy.go | 9 +- tests/e2e/steps_double_sign.go | 9 +- tests/e2e/steps_downtime.go | 24 +- tests/e2e/steps_multi_consumer_delegation.go | 18 +- tests/e2e/steps_multi_consumer_double_sign.go | 15 +- tests/e2e/steps_multi_consumer_downtime.go | 27 +- tests/e2e/steps_reward_denom.go | 9 +- tests/e2e/steps_start_chains.go | 3 +- tests/e2e/steps_stop_chain.go | 6 +- .../e2e/steps_submit_equivocation_proposal.go | 3 +- tests/e2e/testnet-scripts/start-chain.sh | 65 +++- 18 files changed, 534 insertions(+), 64 deletions(-) diff --git a/Dockerfile b/Dockerfile index 0da9141620..ac528fa8fb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -30,12 +30,20 @@ RUN make install # Get Hermes build FROM ghcr.io/informalsystems/hermes:1.4.1 AS hermes-builder +# Get CometMock +FROM informalofftermatt/cometmock:latest as cometmock-builder + +# Get GoRelayer +FROM informalofftermatt/gorelayer:nogas AS gorelayer-builder + FROM --platform=linux/amd64 fedora:36 RUN dnf update -y RUN dnf install -y which iproute iputils procps-ng vim-minimal tmux net-tools htop jq USER root COPY --from=hermes-builder /usr/bin/hermes /usr/local/bin/ +COPY --from=cometmock-builder /usr/local/bin/cometmock /usr/local/bin/cometmock +COPY --from=gorelayer-builder /bin/rly /usr/local/bin/ COPY --from=is-builder /go/bin/interchain-security-pd /usr/local/bin/interchain-security-pd COPY --from=is-builder /go/bin/interchain-security-cd /usr/local/bin/interchain-security-cd diff --git a/tests/e2e/actions.go b/tests/e2e/actions.go index 4a4c471f79..b1e6863b7a 100644 --- a/tests/e2e/actions.go +++ b/tests/e2e/actions.go @@ -122,6 +122,13 @@ func (tr TestRun) startChain( genesisChanges = chainConfig.genesisChanges } + var cometmockArg string + if tr.useCometmock { + cometmockArg = "true" + } else { + cometmockArg = "false" + } + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. cmd := exec.Command("docker", "exec", tr.containerConfig.instanceName, "/bin/bash", "/testnet-scripts/start-chain.sh", chainConfig.binaryName, string(vals), @@ -132,6 +139,7 @@ func (tr TestRun) startChain( // lower timeout_commit means the blocks are produced faster making the test run shorter // with short timeout_commit (eg. timeout_commit = 1s) some nodes may miss blocks causing the test run to fail tr.tendermintConfigOverride, + cometmockArg, ) cmdReader, err := cmd.StdoutPipe() @@ -587,9 +595,80 @@ websocket_addr = "%s" numerator = "1" ` +// Set up the config for a new chain for gorelayer. +// This config is added to the container as a file. +// We then add the chain to the relayer, using this config as the chain config with `rly chains add --file` +// This is functionally similar to the config used by Hermes for chains, e.g. gas is free. +const gorelayerChainConfigTemplate = ` +{ + "type": "cosmos", + "value": { + "key": "default", + "chain-id": "%s", + "rpc-addr": "%s", + "account-prefix": "cosmos", + "keyring-backend": "test", + "gas-adjustment": 1.2, + "gas-prices": "0.00stake", + "debug": true, + "timeout": "20s", + "output-format": "json", + "sign-mode": "direct" + } +}` + func (tr TestRun) addChainToRelayer( action addChainToRelayerAction, verbose bool, +) { + if !tr.useGorelayer { + tr.addChainToHermes(action, verbose) + } else { + tr.addChainToGorelayer(action, verbose) + } +} + +func (tr TestRun) addChainToGorelayer( + action addChainToRelayerAction, + verbose bool, +) { + queryNodeIP := tr.getQueryNodeIP(action.chain) + chainId := tr.chainConfigs[action.chain].chainId + rpcAddr := "http://" + queryNodeIP + ":26658" + + chainConfig := fmt.Sprintf(gorelayerChainConfigTemplate, + chainId, + rpcAddr, + ) + + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. + bz, err := exec.Command("docker", "exec", tr.containerConfig.instanceName, "rly", "config", "init").CombinedOutput() + if err != nil && !strings.Contains(string(bz), "config already exists") { + log.Fatal(err, "\n", string(bz)) + } + + chainConfigFileName := fmt.Sprintf("/root/%s_config.json", chainId) + + bashCommand := fmt.Sprintf(`echo '%s' >> %s`, chainConfig, chainConfigFileName) + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. + bz, err = exec.Command("docker", "exec", tr.containerConfig.instanceName, "bash", "-c", + bashCommand).CombinedOutput() + if err != nil { + log.Fatal(err, "\n", string(bz)) + } + + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. + addChainCommand := exec.Command("docker", "exec", tr.containerConfig.instanceName, "rly", "chains", "add", "--file", chainConfigFileName, string(chainId)) + executeCommand(addChainCommand, "add chain") + + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. + keyRestoreCommand := exec.Command("docker", "exec", tr.containerConfig.instanceName, "rly", "keys", "restore", string(chainId), "default", tr.validatorConfigs[action.validator].mnemonic) + executeCommand(keyRestoreCommand, "restore keys") +} + +func (tr TestRun) addChainToHermes( + action addChainToRelayerAction, + verbose bool, ) { queryNodeIP := tr.getQueryNodeIP(action.chain) chainId := tr.chainConfigs[action.chain].chainId @@ -638,6 +717,26 @@ func (tr TestRun) addChainToRelayer( } } +// This config file is used by gorelayer to create a path between chains. +// Since the tests assume we use a certain client-id for certain paths, +// in the config we specify the client id, e.g. 07-tendermint-5. +// The src-channel-filter is empty because we want to relay all channels. +const gorelayerPathConfigTemplate = `{ + "src": { + "chain-id": "%s", + "client-id": "07-tendermint-%v" + }, + "dst": { + "chain-id": "%s", + "client-id": "07-tendermint-%v" + }, + "src-channel-filter": { + "rule": "", + "channel-list": [] + } +} +` + type addIbcConnectionAction struct { chainA chainID chainB chainID @@ -648,6 +747,67 @@ type addIbcConnectionAction struct { func (tr TestRun) addIbcConnection( action addIbcConnectionAction, verbose bool, +) { + if !tr.useGorelayer { + tr.addIbcConnectionHermes(action, verbose) + } else { + tr.addIbcConnectionGorelayer(action, verbose) + } +} + +func (tr TestRun) addIbcConnectionGorelayer( + action addIbcConnectionAction, + verbose bool, +) { + pathName := tr.GetPathNameForGorelayer(action.chainA, action.chainB) + + pathConfig := fmt.Sprintf(gorelayerPathConfigTemplate, action.chainA, action.clientA, action.chainB, action.clientB) + + pathConfigFileName := fmt.Sprintf("/root/%s_config.json", pathName) + + bashCommand := fmt.Sprintf(`echo '%s' >> %s`, pathConfig, pathConfigFileName) + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. + pathConfigCommand := exec.Command("docker", "exec", tr.containerConfig.instanceName, "bash", "-c", + bashCommand) + executeCommand(pathConfigCommand, "add path config") + + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. + newPathCommand := exec.Command("docker", "exec", tr.containerConfig.instanceName, "rly", + "paths", "add", + string(tr.chainConfigs[action.chainA].chainId), + string(tr.chainConfigs[action.chainB].chainId), + pathName, + "--file", pathConfigFileName, + ) + + executeCommand(newPathCommand, "new path") + + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. + newClientsCommand := exec.Command("docker", "exec", tr.containerConfig.instanceName, "rly", + "transact", "clients", + pathName, + ) + + executeCommand(newClientsCommand, "new clients") + + tr.waitBlocks(action.chainA, 1, 10*time.Second) + tr.waitBlocks(action.chainB, 1, 10*time.Second) + + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. + newConnectionCommand := exec.Command("docker", "exec", tr.containerConfig.instanceName, "rly", + "transact", "connection", + pathName, + ) + + executeCommand(newConnectionCommand, "new connection") + + tr.waitBlocks(action.chainA, 1, 10*time.Second) + tr.waitBlocks(action.chainB, 1, 10*time.Second) +} + +func (tr TestRun) addIbcConnectionHermes( + action addIbcConnectionAction, + verbose bool, ) { //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. cmd := exec.Command("docker", "exec", tr.containerConfig.instanceName, "hermes", @@ -692,10 +852,40 @@ type addIbcChannelAction struct { order string } -type startHermesAction struct{} +type startRelayerAction struct{} + +func (tr TestRun) startRelayer( + action startRelayerAction, + verbose bool, +) { + if tr.useGorelayer { + tr.startGorelayer(action, verbose) + } else { + tr.startHermes(action, verbose) + } +} + +func (tr TestRun) startGorelayer( + action startRelayerAction, + verbose bool, +) { + // gorelayer start is running in detached mode + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. + cmd := exec.Command("docker", "exec", "-d", tr.containerConfig.instanceName, "rly", + "start", + ) + + if err := cmd.Start(); err != nil { + log.Fatal(err) + } + + if verbose { + fmt.Println("started gorelayer") + } +} func (tr TestRun) startHermes( - action startHermesAction, + action startRelayerAction, verbose bool, ) { // hermes start is running in detached mode @@ -716,6 +906,35 @@ func (tr TestRun) startHermes( func (tr TestRun) addIbcChannel( action addIbcChannelAction, verbose bool, +) { + if tr.useGorelayer { + tr.addIbcChannelGorelayer(action, verbose) + } else { + tr.addIbcChannelHermes(action, verbose) + } +} + +func (tr TestRun) addIbcChannelGorelayer( + action addIbcChannelAction, + verbose bool, +) { + pathName := tr.GetPathNameForGorelayer(action.chainA, action.chainB) + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. + cmd := exec.Command("docker", "exec", tr.containerConfig.instanceName, "rly", + "transact", "channel", + pathName, + "--src-port", action.portA, + "--dst-port", action.portB, + "--version", tr.containerConfig.ccvVersion, + "--order", action.order, + "--debug", + ) + executeCommand(cmd, "addChannel") +} + +func (tr TestRun) addIbcChannelHermes( + action addIbcChannelAction, + verbose bool, ) { //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. cmd := exec.Command("docker", "exec", tr.containerConfig.instanceName, "hermes", @@ -773,6 +992,10 @@ func (tr TestRun) transferChannelComplete( action transferChannelCompleteAction, verbose bool, ) { + if tr.useGorelayer { + log.Fatal("transferChannelComplete is not implemented for rly") + } + //#nosec G204 -- Bypass linter warning for spawning subprocess with chanOpenTryCmd arguments. chanOpenTryCmd := exec.Command("docker", "exec", tr.containerConfig.instanceName, "hermes", "tx", "chan-open-try", @@ -841,7 +1064,8 @@ func executeCommand(cmd *exec.Cmd, cmdName string) { } type relayPacketsAction struct { - chain chainID + chainA chainID + chainB chainID port string channel uint } @@ -849,11 +1073,43 @@ type relayPacketsAction struct { func (tr TestRun) relayPackets( action relayPacketsAction, verbose bool, +) { + if tr.useGorelayer { + tr.relayPacketsGorelayer(action, verbose) + } else { + tr.relayPacketsHermes(action, verbose) + } +} + +func (tr TestRun) relayPacketsGorelayer( + action relayPacketsAction, + verbose bool, +) { + pathName := tr.GetPathNameForGorelayer(action.chainA, action.chainB) + + // rly transact relay-packets [path-name] --channel [channel-id] + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. + cmd := exec.Command("docker", "exec", tr.containerConfig.instanceName, "rly", "transact", "flush", + pathName, + "channel-"+fmt.Sprint(action.channel), + ) + if verbose { + log.Println("relayPackets cmd:", cmd.String()) + } + bz, err := cmd.CombinedOutput() + if err != nil { + log.Fatal(err, "\n", string(bz)) + } +} + +func (tr TestRun) relayPacketsHermes( + action relayPacketsAction, + verbose bool, ) { // hermes clear packets ibc0 transfer channel-13 //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. cmd := exec.Command("docker", "exec", tr.containerConfig.instanceName, "hermes", "clear", "packets", - "--chain", string(tr.chainConfigs[action.chain].chainId), + "--chain", string(tr.chainConfigs[action.chainA].chainId), "--port", action.port, "--channel", "channel-"+fmt.Sprint(action.channel), ) @@ -866,7 +1122,7 @@ func (tr TestRun) relayPackets( log.Fatal(err, "\n", string(bz)) } - tr.waitBlocks(action.chain, 1, 30*time.Second) + tr.waitBlocks(action.chainA, 1, 30*time.Second) } type relayRewardPacketsToProviderAction struct { @@ -886,7 +1142,7 @@ func (tr TestRun) relayRewardPacketsToProvider( tr.waitBlocks(action.consumerChain, uint(blockPerDistribution-currentBlock+1), 60*time.Second) } - tr.relayPackets(relayPacketsAction{chain: action.consumerChain, port: action.port, channel: action.channel}, verbose) + tr.relayPackets(relayPacketsAction{chainA: action.consumerChain, chainB: action.providerChain, port: action.port, channel: action.channel}, verbose) tr.waitBlocks(action.providerChain, 1, 10*time.Second) } @@ -929,6 +1185,8 @@ func (tr TestRun) delegateTokens( if err != nil { log.Fatal(err, "\n", string(bz)) } + + tr.waitBlocks(action.chain, 1, 10*time.Second) } type unbondTokensAction struct { @@ -971,6 +1229,8 @@ func (tr TestRun) unbondTokens( if err != nil { log.Fatal(err, "\n", string(bz)) } + + tr.waitBlocks(action.chain, 1, 10*time.Second) } type redelegateTokensAction struct { @@ -1370,3 +1630,17 @@ func (tr TestRun) waitForSlashThrottleDequeue( func uintPointer(i uint) *uint { return &i } + +// GetPathNameForGorelayer returns the name of the path between two given chains used by Gorelayer. +// Since paths are bidirectional, we need either chain to be able to be provided as first or second argument +// and still return the same name, so we sort the chain names alphabetically. +func (tr TestRun) GetPathNameForGorelayer(chainA, chainB chainID) string { + var pathName string + if string(chainA) < string(chainB) { + pathName = string(chainA) + "-" + string(chainB) + } else { + pathName = string(chainB) + "-" + string(chainA) + } + + return pathName +} diff --git a/tests/e2e/config.go b/tests/e2e/config.go index 6d7e36d637..cc755cb97a 100644 --- a/tests/e2e/config.go +++ b/tests/e2e/config.go @@ -70,6 +70,8 @@ type TestRun struct { tendermintConfigOverride string localSdkPath string useGaia bool + useCometmock bool // if false, nodes run CometBFT + useGorelayer bool // if false, Hermes is used as the relayer gaiaTag string name string @@ -339,6 +341,14 @@ func (s *TestRun) SetDockerConfig(localSdkPath string, useGaia bool, gaiaTag str s.localSdkPath = localSdkPath } +func (s *TestRun) SetCometMockConfig(useCometmock bool) { + s.useCometmock = useCometmock +} + +func (s *TestRun) SetRelayerConfig(useRly bool) { + s.useGorelayer = useRly +} + // validateStringLiterals enforces that configs follow the constraints // necessary to to execute the tests // diff --git a/tests/e2e/main.go b/tests/e2e/main.go index 8ef9d93b7a..141f8a8cd8 100644 --- a/tests/e2e/main.go +++ b/tests/e2e/main.go @@ -16,12 +16,19 @@ import ( ) var ( - verbose = flag.Bool("verbose", false, "turn verbose logging on/off") - happyPathOnly = flag.Bool("happy-path-only", false, "run happy path tests only") + verbose = flag.Bool("verbose", false, "turn verbose logging on/off") + happyPathOnly = flag.Bool("happy-path-only", false, "run happy path tests only") + shortHappyPathOnly = flag.Bool("short-happy-path", false, `run abridged happy path tests only. +This is like the happy path, but skips steps +that involve starting or stopping nodes for the same chain outside of the chain setup or teardown. +In particular, this skips steps related to downtime and double signing. +This is suited for CometMock+Gorelayer testing`) includeMultiConsumer = flag.Bool("include-multi-consumer", false, "include multiconsumer tests in run") parallel = flag.Bool("parallel", false, "run all tests in parallel") localSdkPath = flag.String("local-sdk-path", "", "path of a local sdk version to build and reference in integration tests") + useCometmock = flag.Bool("use-cometmock", false, "use cometmock instead of CometBFT") + useGorelayer = flag.Bool("use-gorelayer", false, "use go relayer instead of Hermes") ) var ( @@ -35,6 +42,13 @@ var ( func main() { flag.Parse() + if shortHappyPathOnly != nil && *shortHappyPathOnly { + fmt.Println("=============== running short happy path only ===============") + tr := DefaultTestRun() + tr.Run(shortHappyPathSteps, *localSdkPath, *useGaia, *gaiaTag) + return + } + if happyPathOnly != nil && *happyPathOnly { fmt.Println("=============== running happy path only ===============") tr := DefaultTestRun() @@ -80,6 +94,8 @@ func main() { // Docker containers are torn down after the test run is complete. func (tr *TestRun) Run(steps []Step, localSdkPath string, useGaia bool, gaiaTag string) { tr.SetDockerConfig(localSdkPath, useGaia, gaiaTag) + tr.SetCometMockConfig(*useCometmock) + tr.SetRelayerConfig(*useGorelayer) tr.validateStringLiterals() tr.startDocker() @@ -142,8 +158,8 @@ func (tr *TestRun) runStep(step Step, verbose bool) { tr.assignConsumerPubKey(action, verbose) case slashThrottleDequeue: tr.waitForSlashThrottleDequeue(action, verbose) - case startHermesAction: - tr.startHermes(action, verbose) + case startRelayerAction: + tr.startRelayer(action, verbose) case registerConsumerRewardDenomAction: tr.registerConsumerRewardDenom(action, verbose) default: diff --git a/tests/e2e/state.go b/tests/e2e/state.go index 98483ffb7e..9127c65df8 100644 --- a/tests/e2e/state.go +++ b/tests/e2e/state.go @@ -669,6 +669,11 @@ func (tr TestRun) getRegisteredConsumerRewardDenoms(chain chainID) []string { } func (tr TestRun) getValidatorNode(chain chainID, validator validatorID) string { + // for CometMock, validatorNodes are all the same address as the query node (which is CometMocks address) + if tr.useCometmock { + return tr.getQueryNode(chain) + } + return "tcp://" + tr.getValidatorIP(chain, validator) + ":26658" } diff --git a/tests/e2e/step_delegation.go b/tests/e2e/step_delegation.go index 8e9f090736..f33fc136d4 100644 --- a/tests/e2e/step_delegation.go +++ b/tests/e2e/step_delegation.go @@ -46,7 +46,8 @@ func stepsDelegate(consumerName string) []Step { }, { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumerName), port: "provider", channel: 0, }, @@ -110,7 +111,8 @@ func stepsUnbond(consumerName string) []Step { }, { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumerName), port: "provider", channel: 0, }, @@ -160,7 +162,8 @@ func stepsRedelegateForOptOut(consumerName string) []Step { }, { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumerName), port: "provider", channel: 0, }, @@ -212,7 +215,61 @@ func stepsRedelegate(consumerName string) []Step { }, { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumerName), + port: "provider", + channel: 0, + }, + state: State{ + chainID(consumerName): ChainState{ + ValPowers: &map[validatorID]uint{ + // Now power changes are seen by consumer + validatorID("alice"): 509, + validatorID("bob"): 500, + validatorID("carol"): 501, + }, + }, + }, + }, + } +} + +// stepsRedelegate tests redelegation and resulting validator power changes. +func stepsRedelegateShort(consumerName string) []Step { + return []Step{ + { + action: redelegateTokensAction{ + chain: chainID("provi"), + src: validatorID("alice"), + dst: validatorID("carol"), + txSender: validatorID("alice"), + // Leave alice with majority stake so non-faulty validators maintain more than + // 2/3 voting power during downtime tests below, avoiding chain halt + amount: 1000000, + }, + state: State{ + chainID("provi"): ChainState{ + ValPowers: &map[validatorID]uint{ + validatorID("alice"): 509, + validatorID("bob"): 500, + // carol always uses a consumer assigned key + validatorID("carol"): 501, + }, + }, + chainID(consumerName): ChainState{ + ValPowers: &map[validatorID]uint{ + // Voting power changes not seen by consumer yet + validatorID("alice"): 510, + validatorID("bob"): 500, + validatorID("carol"): 500, + }, + }, + }, + }, + { + action: relayPacketsAction{ + chainA: chainID("provi"), + chainB: chainID(consumerName), port: "provider", channel: 0, }, diff --git a/tests/e2e/steps.go b/tests/e2e/steps.go index 234672546b..8c0b4b2661 100644 --- a/tests/e2e/steps.go +++ b/tests/e2e/steps.go @@ -25,11 +25,21 @@ var happyPathSteps = concatSteps( stepsRejectEquivocationProposal("consu", 2), // prop to tombstone bob is rejected stepsDoubleSignOnProviderAndConsumer("consu"), // carol double signs on provider, bob double signs on consumer stepsSubmitEquivocationProposal("consu", 2), // now prop to tombstone bob is submitted and accepted - stepsStartHermes(), + stepsStartRelayer(), stepsConsumerRemovalPropNotPassing("consu", 3), // submit removal prop but vote no on it - chain should stay stepsStopChain("consu", 4), // stop chain ) +var shortHappyPathSteps = concatSteps( + stepsStartChains([]string{"consu"}, false), + stepsDelegate("consu"), + stepsUnbond("consu"), + stepsRedelegateShort("consu"), + stepsStartRelayer(), + stepsConsumerRemovalPropNotPassing("consu", 2), // submit removal prop but vote no on it - chain should stay + stepsStopChain("consu", 3), // stop chain +) + var slashThrottleSteps = concatSteps( stepsStartChains([]string{"consu"}, false), stepsDelegate("consu"), diff --git a/tests/e2e/steps_democracy.go b/tests/e2e/steps_democracy.go index 9f5915f71d..686fbf1c49 100644 --- a/tests/e2e/steps_democracy.go +++ b/tests/e2e/steps_democracy.go @@ -195,7 +195,8 @@ func stepsDemocracy(consumerName string) []Step { }, { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumerName), port: "provider", channel: 0, }, @@ -221,7 +222,8 @@ func stepsDemocracy(consumerName string) []Step { // and can now be relayed as packet to consumer { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumerName), port: "provider", channel: 0, }, @@ -260,7 +262,8 @@ func stepsDemocracy(consumerName string) []Step { }, { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumerName), port: "provider", channel: 0, }, diff --git a/tests/e2e/steps_double_sign.go b/tests/e2e/steps_double_sign.go index e4efca4bb5..c007fa5c1c 100644 --- a/tests/e2e/steps_double_sign.go +++ b/tests/e2e/steps_double_sign.go @@ -30,7 +30,8 @@ func stepsDoubleSignOnProviderAndConsumer(consumerName string) []Step { { // relay power change to consumerName action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumerName), port: "provider", channel: 0, // consumerName channel }, @@ -78,7 +79,8 @@ func stepsDoubleSignOnProviderAndConsumer(consumerName string) []Step { }, { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumerName), port: "provider", channel: 0, }, @@ -102,7 +104,8 @@ func stepsDoubleSignOnProviderAndConsumer(consumerName string) []Step { { // consumer learns about the double sign action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumerName), port: "provider", channel: 0, }, diff --git a/tests/e2e/steps_downtime.go b/tests/e2e/steps_downtime.go index af2d2f237e..74cb349000 100644 --- a/tests/e2e/steps_downtime.go +++ b/tests/e2e/steps_downtime.go @@ -39,7 +39,8 @@ func stepsDowntime(consumerName string) []Step { }, { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumerName), port: "provider", channel: 0, }, @@ -65,7 +66,8 @@ func stepsDowntime(consumerName string) []Step { // and can now be relayed as packet to consumer { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumerName), port: "provider", channel: 0, }, @@ -106,7 +108,8 @@ func stepsDowntime(consumerName string) []Step { }, { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumerName), port: "provider", channel: 0, }, @@ -150,7 +153,8 @@ func stepsDowntime(consumerName string) []Step { }, { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumerName), port: "provider", channel: 0, }, @@ -188,7 +192,8 @@ func stepsDowntime(consumerName string) []Step { }, { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumerName), port: "provider", channel: 0, }, @@ -236,7 +241,8 @@ func stepsDowntimeWithOptOut(consumerName string) []Step { }, { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumerName), port: "provider", channel: 0, }, @@ -314,7 +320,8 @@ func stepsThrottledDowntime(consumerName string) []Step { }, { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumerName), port: "provider", channel: 0, }, @@ -376,7 +383,8 @@ func stepsThrottledDowntime(consumerName string) []Step { // and can now be relayed as packet to consumer { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumerName), port: "provider", channel: 0, }, diff --git a/tests/e2e/steps_multi_consumer_delegation.go b/tests/e2e/steps_multi_consumer_delegation.go index 106307629d..45536c0679 100644 --- a/tests/e2e/steps_multi_consumer_delegation.go +++ b/tests/e2e/steps_multi_consumer_delegation.go @@ -38,7 +38,8 @@ func stepsMultiConsumerDelegate(consumer1, consumer2 string) []Step { { // relay changes to consumer1 action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumer1), port: "provider", channel: 0, // consumer1 channel }, @@ -69,7 +70,8 @@ func stepsMultiConsumerDelegate(consumer1, consumer2 string) []Step { { // relay changes to consumer2 action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumer2), port: "provider", channel: 1, // consumer2 channel }, @@ -138,7 +140,8 @@ func stepsMultiConsumerUnbond(consumer1, consumer2 string) []Step { { // relay to consumer1 action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumer1), port: "provider", channel: 0, // consumer1 channel }, @@ -169,7 +172,8 @@ func stepsMultiConsumerUnbond(consumer1, consumer2 string) []Step { { // relay to consumer2 action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumer2), port: "provider", channel: 1, // consumer2 channel }, @@ -242,7 +246,8 @@ func stepsMultiConsumerRedelegate(consumer1, consumer2 string) []Step { { // relay to consumer1 action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumer1), port: "provider", channel: 0, // consumer1 channel }, @@ -273,7 +278,8 @@ func stepsMultiConsumerRedelegate(consumer1, consumer2 string) []Step { { // relay to consumer2 action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumer2), port: "provider", channel: 1, // consumer1 channel }, diff --git a/tests/e2e/steps_multi_consumer_double_sign.go b/tests/e2e/steps_multi_consumer_double_sign.go index a50f21e11f..d12eb37eff 100644 --- a/tests/e2e/steps_multi_consumer_double_sign.go +++ b/tests/e2e/steps_multi_consumer_double_sign.go @@ -45,7 +45,8 @@ func stepsMultiConsumerDoubleSign(consumer1, consumer2 string) []Step { { // relay power change to consumer1 action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumer1), port: "provider", channel: 0, // consumer1 channel }, @@ -76,7 +77,8 @@ func stepsMultiConsumerDoubleSign(consumer1, consumer2 string) []Step { { // relay power change to consumer2 action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumer2), port: "provider", channel: 1, // consumer2 channel }, @@ -137,7 +139,8 @@ func stepsMultiConsumerDoubleSign(consumer1, consumer2 string) []Step { }, { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumer1), port: "provider", channel: 0, // consumer1 channel }, @@ -168,7 +171,8 @@ func stepsMultiConsumerDoubleSign(consumer1, consumer2 string) []Step { { // consumer1 learns about the double sign action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumer1), port: "provider", channel: 0, // consumer1 channel }, @@ -199,7 +203,8 @@ func stepsMultiConsumerDoubleSign(consumer1, consumer2 string) []Step { { // consumer2 learns about the double sign action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumer2), port: "provider", channel: 1, // consumer2 channel }, diff --git a/tests/e2e/steps_multi_consumer_downtime.go b/tests/e2e/steps_multi_consumer_downtime.go index 181ced029f..ce6cbdff59 100644 --- a/tests/e2e/steps_multi_consumer_downtime.go +++ b/tests/e2e/steps_multi_consumer_downtime.go @@ -40,7 +40,8 @@ func stepsMultiConsumerDowntimeFromConsumer(consumer1, consumer2 string) []Step // Downtime jailing and corresponding voting power change are processed by provider // Validator powers are unchanged on consumer chains action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumer1), port: "provider", channel: 0, }, @@ -73,7 +74,8 @@ func stepsMultiConsumerDowntimeFromConsumer(consumer1, consumer2 string) []Step // and can now be relayed as packet to consumer // consumer1 will now see the validator power changes - consumer2 will not (had not been relayed) action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumer1), port: "provider", channel: 0, // consumer1 chan }, @@ -100,7 +102,8 @@ func stepsMultiConsumerDowntimeFromConsumer(consumer1, consumer2 string) []Step { // both consumer1 and consumer will now see the validator power changes action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumer2), port: "provider", channel: 1, // consumer2 chan }, @@ -156,7 +159,8 @@ func stepsMultiConsumerDowntimeFromConsumer(consumer1, consumer2 string) []Step { // relay to consumer 1 action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumer1), port: "provider", channel: 0, }, @@ -187,7 +191,8 @@ func stepsMultiConsumerDowntimeFromConsumer(consumer1, consumer2 string) []Step { // relay to consumer2 action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumer2), port: "provider", channel: 1, // consumer2 chan }, @@ -255,7 +260,8 @@ func stepsMultiConsumerDowntimeFromProvider(consumer1, consumer2 string) []Step }, { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumer1), port: "provider", channel: 0, // consumer 1 channel }, @@ -288,7 +294,8 @@ func stepsMultiConsumerDowntimeFromProvider(consumer1, consumer2 string) []Step }, { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumer2), port: "provider", channel: 1, // consumer2 channel }, @@ -349,7 +356,8 @@ func stepsMultiConsumerDowntimeFromProvider(consumer1, consumer2 string) []Step }, { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumer1), port: "provider", channel: 0, // consumer1 channel }, @@ -380,7 +388,8 @@ func stepsMultiConsumerDowntimeFromProvider(consumer1, consumer2 string) []Step }, { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumer2), port: "provider", channel: 1, // consumer2 channel }, diff --git a/tests/e2e/steps_reward_denom.go b/tests/e2e/steps_reward_denom.go index bc26f38d27..dc10ccb7c6 100644 --- a/tests/e2e/steps_reward_denom.go +++ b/tests/e2e/steps_reward_denom.go @@ -193,7 +193,8 @@ func stepsRewardDenomConsumer(consumerName string) []Step { }, { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumerName), port: "provider", channel: 0, }, @@ -219,7 +220,8 @@ func stepsRewardDenomConsumer(consumerName string) []Step { // and can now be relayed as packet to consumer { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumerName), port: "provider", channel: 0, }, @@ -258,7 +260,8 @@ func stepsRewardDenomConsumer(consumerName string) []Step { }, { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumerName), port: "provider", channel: 0, }, diff --git a/tests/e2e/steps_start_chains.go b/tests/e2e/steps_start_chains.go index e3ba9d9ad8..c51042e8c8 100644 --- a/tests/e2e/steps_start_chains.go +++ b/tests/e2e/steps_start_chains.go @@ -265,7 +265,8 @@ func stepsAssignConsumerKeyOnStartedChain(consumerName, validator string) []Step }, { action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumerName), port: "provider", channel: 0, }, diff --git a/tests/e2e/steps_stop_chain.go b/tests/e2e/steps_stop_chain.go index 229b40b215..9cef49a9ea 100644 --- a/tests/e2e/steps_stop_chain.go +++ b/tests/e2e/steps_stop_chain.go @@ -2,11 +2,11 @@ package main import "time" -// start hermes so that all messages are relayed -func stepsStartHermes() []Step { +// start relayer so that all messages are relayed +func stepsStartRelayer() []Step { return []Step{ { - action: startHermesAction{}, + action: startRelayerAction{}, state: State{}, }, } diff --git a/tests/e2e/steps_submit_equivocation_proposal.go b/tests/e2e/steps_submit_equivocation_proposal.go index f8a91d5362..8af1d2464d 100644 --- a/tests/e2e/steps_submit_equivocation_proposal.go +++ b/tests/e2e/steps_submit_equivocation_proposal.go @@ -122,7 +122,8 @@ func stepsSubmitEquivocationProposal(consumerName string, propNumber uint) []Ste { // relay power change to consumer1 action: relayPacketsAction{ - chain: chainID("provi"), + chainA: chainID("provi"), + chainB: chainID(consumerName), port: "provider", channel: 0, }, diff --git a/tests/e2e/testnet-scripts/start-chain.sh b/tests/e2e/testnet-scripts/start-chain.sh index b4d139ec27..9d6e73fdbb 100644 --- a/tests/e2e/testnet-scripts/start-chain.sh +++ b/tests/e2e/testnet-scripts/start-chain.sh @@ -33,6 +33,18 @@ SKIP_GENTX=$6 # A sed string modifying the tendermint config TENDERMINT_CONFIG_TRANSFORM=$7 +# whether to use CometMock +USE_COMETMOCK=$8 + +# stores a comma separated list of nodes addresses +# needed for CometMock - these are the addresses that the ABCI servers of the apps are listening on +NODE_LISTEN_ADDR_STR="" # example value: 7.7.8.6:26655,7.7.8.4:26655,7.7.8.5:26655 + +# stores a comma separated list of nodes home folders +# needed for CometMock - validator nodes have their private keys in their home directories, and CometMock +# reads the keys to sign with from there +NODE_HOMES="" # example value: /consu/validatorcarol,/consu/validatoralice,/consu/validatorbob + # CREATE VALIDATORS AND DO GENESIS CEREMONY @@ -219,10 +231,13 @@ do VAL_IP_SUFFIX=$(echo "$VALIDATORS" | jq -r ".[$i].ip_suffix") NET_NAMESPACE_NAME="$CHAIN_ID-$VAL_ID" - GAIA_HOME="--home /$CHAIN_ID/validator$VAL_ID" + NODE_HOME="/$CHAIN_ID/validator$VAL_ID" + GAIA_HOME="--home $NODE_HOME" + NODE_HOMES="$NODE_HOME,$NODE_HOMES" RPC_ADDRESS="--rpc.laddr tcp://$CHAIN_IP_PREFIX.$VAL_IP_SUFFIX:26658" GRPC_ADDRESS="--grpc.address $CHAIN_IP_PREFIX.$VAL_IP_SUFFIX:9091" LISTEN_ADDRESS="--address tcp://$CHAIN_IP_PREFIX.$VAL_IP_SUFFIX:26655" + NODE_LISTEN_ADDR_STR="$CHAIN_IP_PREFIX.$VAL_IP_SUFFIX:26655,$NODE_LISTEN_ADDR_STR" P2P_ADDRESS="--p2p.laddr tcp://$CHAIN_IP_PREFIX.$VAL_IP_SUFFIX:26656" # LOG_LEVEL="--log_level trace" # switch to trace to see panic messages and rich and all debug msgs LOG_LEVEL="--log_level info" @@ -246,7 +261,13 @@ do PERSISTENT_PEERS="--p2p.persistent_peers ${PERSISTENT_PEERS:1}" ARGS="$GAIA_HOME $LISTEN_ADDRESS $RPC_ADDRESS $GRPC_ADDRESS $LOG_LEVEL $P2P_ADDRESS $ENABLE_WEBGRPC $PERSISTENT_PEERS" - ip netns exec $NET_NAMESPACE_NAME $BIN $ARGS start &> /$CHAIN_ID/validator$VAL_ID/logs & + if [[ "$USE_COMETMOCK" == "true" ]]; then + # to start with CometMock, ensure ABCI server uses grpc (--transport=grpc) and the app is started without in-process CometBFT (--with-tendermint=false) + ip netns exec $NET_NAMESPACE_NAME $BIN $ARGS start --transport=grpc --with-tendermint=false &> /$CHAIN_ID/validator$VAL_ID/logs & + else + ip netns exec $NET_NAMESPACE_NAME $BIN $ARGS start &> /$CHAIN_ID/validator$VAL_ID/logs & + fi + done ## SETUP DOUBLE SIGNING NODE NETWORK NAMESPACE @@ -321,16 +342,46 @@ QUERY_PERSISTENT_PEERS="--p2p.persistent_peers ${QUERY_PERSISTENT_PEERS:1}" ## START NODE ARGS="$QUERY_GAIA_HOME $QUERY_LISTEN_ADDRESS $QUERY_RPC_ADDRESS $QUERY_GRPC_ADDRESS $QUERY_LOG_LEVEL $QUERY_P2P_ADDRESS $QUERY_ENABLE_WEBGRPC $QUERY_PERSISTENT_PEERS" -ip netns exec $QUERY_NET_NAMESPACE_NAME $BIN $ARGS start &> /$CHAIN_ID/$QUERY_NODE_ID/logs & + +# Query node is only started if CometMock is not used - with CometMock, it takes the role of the query node +if [[ "$USE_COMETMOCK" != "true" ]]; then + ip netns exec $QUERY_NET_NAMESPACE_NAME $BIN $ARGS start &> /$CHAIN_ID/$QUERY_NODE_ID/logs & +fi ## DONE START NODE +echo "Node addresses:" +echo $NODE_LISTEN_ADDR_STR + +echo "Node homes:" +echo $NODE_HOMES + +NODE_LISTEN_ADDR_STR=${NODE_LISTEN_ADDR_STR%?} +NODE_HOMES=${NODE_HOMES%?} + + +# CometMock takes the role of the query node +if [[ "$USE_COMETMOCK" == "true" ]]; then + sleep 2 + ip netns exec $QUERY_NET_NAMESPACE_NAME cometmock $NODE_LISTEN_ADDR_STR /$CHAIN_ID/genesis.json tcp://$CHAIN_IP_PREFIX.$QUERY_IP_SUFFIX:26658 $NODE_HOMES &> cometmock_${CHAIN_ID}_out.log & + sleep 3 +fi + +# exit + # poll for chain start -set +e -until $BIN query block --node "tcp://$CHAIN_IP_PREFIX.$QUERY_IP_SUFFIX:26658" | grep -q -v '{"block_id":{"hash":"","parts":{"total":0,"hash":""}},"block":null}'; do sleep 0.3 ; done -set -e +if [[ "$USE_COMETMOCK" == "true" ]]; then + set +e + until $BIN query block --node "tcp://$CHAIN_IP_PREFIX.$QUERY_IP_SUFFIX:26658"; do sleep 0.3 ; done + set -e +else + set +e + until $BIN query block --node "tcp://$CHAIN_IP_PREFIX.$QUERY_IP_SUFFIX:26658" | grep -q -v '{"block_id":{"hash":"","parts":{"total":0,"hash": + ""}},"block":null}'; do sleep 0.3 ; done + set -e +fi echo "done!!!!!!!!" -read -p "Press Return to Close..." \ No newline at end of file +read -p "Press Return to Close..." From 669a33a9b7d627658b8a9c11db4e90979d443476 Mon Sep 17 00:00:00 2001 From: Jehan Date: Thu, 15 Jun 2023 10:11:47 -0700 Subject: [PATCH 043/108] docs: Create adr-004-denom-dos-fixes.md (#934) * Create adr-006-denom-dos-fixes * Update docs/docs/adrs/adr-006-denom-dos-fixes Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> * Update docs/docs/adrs/adr-006-denom-dos-fixes Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> * Update docs/docs/adrs/adr-006-denom-dos-fixes Co-authored-by: Marius Poke * Update docs/docs/adrs/adr-006-denom-dos-fixes * Update docs/docs/adrs/adr-006-denom-dos-fixes * rename to adr 004 * remove extra file * add entry to Table of Contents * add ADR 7 to ToC --------- Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Co-authored-by: Marius Poke --- docs/docs/adrs/adr-004-denom-dos-fixes | 53 ++++++++++++++++++++++++++ docs/docs/adrs/intro.md | 4 +- 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 docs/docs/adrs/adr-004-denom-dos-fixes diff --git a/docs/docs/adrs/adr-004-denom-dos-fixes b/docs/docs/adrs/adr-004-denom-dos-fixes new file mode 100644 index 0000000000..7ca260f4f6 --- /dev/null +++ b/docs/docs/adrs/adr-004-denom-dos-fixes @@ -0,0 +1,53 @@ +--- +sidebar_position: 2 +title: ADR Template +--- +# ADR 004: Denom DOS fixes + +## Changelog +* 5/9/2023: ADR created + +## Status + +Accepted + +## Context + +The provider and consumer modules are vulnerable to similar issues involving an attacker sending millions of denoms to certain addresses and causing the chain to halt. This ADR outlines both fixes since they are similar. Both fixes involve processing only denoms that are on a whitelist to avoid iterating over millions of junk denoms but have different requirements and are implemented in different ways. + +## Decision + +### Provider + +- Put the distribution module's FeePoolAddress back on the blocklist so that it cannot receive funds from users. +- Create a new address called ConsumerRewardPool and unblock it, allowing funds to be sent to it. +- Create a set of strings in the store for allowed ConsumerRewardDenoms. +- Create an endpoint called RegisterConsumerRewardDenom which deducts a fee from the sender's account, sends it to the community pool and adds a string to the ConsumerRewardDenoms set. +- Create a parameter called ConsumerRewardDenomRegistrationFee which determines the fee which is charged to register a consumer reward denom in the step above. +- Create a function called TransferRewardsToFeeCollector which gets the entire ConsumerRewardDenoms set from the store, iterates over it, and for each entry: + - Gets the balance of this denom for the ConsumerRewardPool account + - Sends the entire balance out to the FeePoolAddress using SendCoinsFromModuleToModule which is not affected by the blocklist. +- Run TransferRewardsToFeeCollector in the endblock + +Now, nobody can send millions of junk denoms to the FeePoolAddress because it is on the block list. If they send millions of junk denoms to the ConsumerRewardPool, this does not matter because all balances are not iterated over, only those which are in the ConsumerRewardDenoms set. + +We also add a new tx: register-consumer-reward-denom, and a new query: registered-consumer-reward-denoms + +### Consumer + +- Create a new param RewardDenoms with a list of strings +- Create a new param ProviderRewardDenoms with a list of strings +- Create a function AllowedRewardDenoms which iterates over ProviderRewardDenoms and converts each denom to its ibc-prefixed denom using the provider chain's ibc channel information, then concatenates the RewardDenoms list and returns the combined list of allowed denoms. +- In SendRewardsToProvider, instead of iterating over the balances of all denoms in the ToSendToProvider address, iterate over AllowedRewardDenoms + +Now, if somebody sends millions of junk denoms to ToSendToProvider, they will not be iterated over. Only the RewardDenoms and ProviderRewardDenoms will be iterated over. Since we do not require this feature to be permissionless on the consumer, the registration fee process is not needed. + +## Consequences + +### Positive + +- Denom DOS is no longer possible on either provider or consumer. + +### Negative + +- Consumer chain teams must pay a fee to register a denom for distribution on the provider, and add some extra parameters in their genesis file. diff --git a/docs/docs/adrs/intro.md b/docs/docs/adrs/intro.md index aa6b7781c9..528b4799ae 100644 --- a/docs/docs/adrs/intro.md +++ b/docs/docs/adrs/intro.md @@ -34,4 +34,6 @@ To suggest an ADR, please make use of the [ADR template](./adr-template.md) prov | ------ | ----------- | ------ | | [001](./adr-001-key-assignment.md) | Consumer chain key assignment | Accepted, Implemented | | [002](./adr-002-throttle.md) | Jail Throttling | Accepted, Implemented | -| [003](./adr-003-equivocation-gov-proposal.md) | Equivocation governance proposal | Accepted, Implemented +| [003](./adr-003-equivocation-gov-proposal.md) | Equivocation governance proposal | Accepted, Implemented | +| [004](./adr-004-denom-dos-fixes) | Denom DOS fixes | Accepted, Implemented | +| [007](./adr-007-pause-unbonding-on-eqv-prop.md) | Pause validator unbonding during equivocation proposal | Proposed | \ No newline at end of file From 6ee8315dd9014a217d20896999a62d40f171c7cd Mon Sep 17 00:00:00 2001 From: Philip Offtermatt <57488781+p-offtermatt@users.noreply.github.com> Date: Fri, 16 Jun 2023 16:34:18 +0200 Subject: [PATCH 044/108] docs: Fix link to template (#1027) Fix link to template Fixes typo in contributing.md --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 61dd6a3102..e9a3c092ae 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -184,7 +184,7 @@ There are three PR templates. The [default template](./.github/PULL_REQUEST_TEMP - The [production template](./.github/PULL_REQUEST_TEMPLATE/production.md) is for types `fix`, `feat`, and `refactor`. - The [docs template](./.github/PULL_REQUEST_TEMPLATE/docs.md) is for documentation changes. -- The [other template](./.github/PULL_REQUEST_TEMPLATE/other.md) is for changes that do not affect production code. +- The [others template](./.github/PULL_REQUEST_TEMPLATE/others.md) is for changes that do not affect production code. ### Requesting Reviews @@ -197,7 +197,7 @@ that you would like early feedback and tagging whoever you would like to receive Codeowners are marked automatically as the reviewers. All PRs require at least two review approvals before they can be merged (one review might be acceptable in -the case of minor changes to [docs](./.github/PULL_REQUEST_TEMPLATE/docs.md) or [other](./.github/PULL_REQUEST_TEMPLATE/other.md) changes that do not affect production code). Each PR template has a reviewers checklist that must be completed before the PR can be merged. Each reviewer is responsible +the case of minor changes to [docs](./.github/PULL_REQUEST_TEMPLATE/docs.md) or [others](./.github/PULL_REQUEST_TEMPLATE/others.md) changes that do not affect production code). Each PR template has a reviewers checklist that must be completed before the PR can be merged. Each reviewer is responsible for all checked items unless they have indicated otherwise by leaving their handle next to specific items. In addition, use the following review explanations: From 0b636da0b98abac18297492602a43afae95dabd9 Mon Sep 17 00:00:00 2001 From: Marius Poke Date: Fri, 16 Jun 2023 20:17:49 +0200 Subject: [PATCH 045/108] feat!: Add DistributionTransmissionChannel to ConsumerAdditionProposal (#965) * update proto * remove transfer_channel_id from consumer genesis * ConsumerAdditionProposal: transfer_channel_id -> distribution_transmission_channel * send updated ConsumerAdditionProposal * validate consumer genesis param * remove StandaloneTransferChannelID from store * fix TestOnChanOpenAck * remove state breaking change * finalize merge and fix issues * chore: update docs and changelog * chore: regenerate protos * re-add integrationt tests around changeover * mv entry in changelog * test: add sovereign to consumer changeover e2e (#1025) * tests: add sovereign to consumer e2e test * rm unused bash scripts * partially address review comments * apply remaining review comments * chore: apply formatting rules --------- Co-authored-by: MSalopek --- CHANGELOG.md | 1 + Dockerfile | 2 +- Dockerfile.gaia | 2 +- Makefile | 1 + app/consumer-democracy/app.go | 8 +- app/sovereign/ante_handler.go | 55 ++ app/sovereign/app.go | 838 ++++++++++++++++++ app/sovereign/export.go | 187 ++++ app/sovereign/genesis.go | 21 + cmd/interchain-security-sd/cmd/genaccounts.go | 180 ++++ cmd/interchain-security-sd/cmd/root.go | 305 +++++++ cmd/interchain-security-sd/main.go | 24 + docs/docs/consumer-development/onboarding.md | 7 + docs/docs/features/proposals.md | 3 + .../ccv/consumer/v1/genesis.proto | 8 +- .../ccv/provider/v1/provider.proto | 7 + tests/e2e/actions.go | 198 ++++- tests/e2e/actions_sovereign_chain.go | 166 ++++ tests/e2e/config.go | 48 + tests/e2e/main.go | 11 + tests/e2e/state.go | 44 +- tests/e2e/steps.go | 15 + tests/e2e/steps_sovereign_changeover.go | 367 ++++++++ .../testnet-scripts/sovereign-genesis.json | 279 ++++++ tests/e2e/testnet-scripts/start-changeover.sh | 187 ++++ tests/e2e/testnet-scripts/start-sovereign.sh | 133 +++ tests/integration/changeover.go | 2 +- testutil/keeper/unit_test_helpers.go | 1 + x/ccv/consumer/ibc_module.go | 13 +- x/ccv/consumer/ibc_module_test.go | 7 +- x/ccv/consumer/keeper/changeover.go | 1 + x/ccv/consumer/keeper/keeper.go | 14 - x/ccv/consumer/keeper/keeper_test.go | 13 - x/ccv/consumer/keeper/migration_test.go | 2 +- x/ccv/consumer/types/genesis_test.go | 21 +- x/ccv/consumer/types/params.go | 13 +- x/ccv/provider/client/proposal_handler.go | 9 +- x/ccv/provider/keeper/proposal.go | 2 +- x/ccv/provider/keeper/proposal_test.go | 6 + x/ccv/provider/proposal_handler_test.go | 5 +- x/ccv/provider/types/proposal.go | 10 +- x/ccv/provider/types/proposal_test.go | 30 + x/ccv/provider/types/provider.pb.go | 251 +++--- x/ccv/types/shared_params.go | 10 + 44 files changed, 3329 insertions(+), 178 deletions(-) create mode 100644 app/sovereign/ante_handler.go create mode 100644 app/sovereign/app.go create mode 100644 app/sovereign/export.go create mode 100644 app/sovereign/genesis.go create mode 100644 cmd/interchain-security-sd/cmd/genaccounts.go create mode 100644 cmd/interchain-security-sd/cmd/root.go create mode 100644 cmd/interchain-security-sd/main.go create mode 100644 tests/e2e/actions_sovereign_chain.go create mode 100644 tests/e2e/steps_sovereign_changeover.go create mode 100644 tests/e2e/testnet-scripts/sovereign-genesis.json create mode 100644 tests/e2e/testnet-scripts/start-changeover.sh create mode 100644 tests/e2e/testnet-scripts/start-sovereign.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index 208c4ec2c9..5960c76238 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ Some PRs from v2.0.0 may reappear from other releases below. This is due to the ## Notable PRs included in v2.0.0 +* (feat!) Add DistributionTransmissionChannel to ConsumerAdditionProposal [#965](https://github.com/cosmos/interchain-security/pull/965) * (feat/fix) limit vsc matured packets handled per endblocker [#1004](https://github.com/cosmos/interchain-security/pull/1004) * (fix) cosumer key prefix order to avoid complex migrations [#963](https://github.com/cosmos/interchain-security/pull/963) and [#991](https://github.com/cosmos/interchain-security/pull/991). The latter PR is the proper fix. * (feat) v1->v2 migrations to accommodate a bugfix having to do with store keys, introduce new params, and deal with consumer genesis state schema changes [#975](https://github.com/cosmos/interchain-security/pull/975) and [#997](https://github.com/cosmos/interchain-security/pull/997) diff --git a/Dockerfile b/Dockerfile index ac528fa8fb..4d81392316 100644 --- a/Dockerfile +++ b/Dockerfile @@ -48,7 +48,7 @@ COPY --from=gorelayer-builder /bin/rly /usr/local/bin/ COPY --from=is-builder /go/bin/interchain-security-pd /usr/local/bin/interchain-security-pd COPY --from=is-builder /go/bin/interchain-security-cd /usr/local/bin/interchain-security-cd COPY --from=is-builder /go/bin/interchain-security-cdd /usr/local/bin/interchain-security-cdd - +COPY --from=is-builder /go/bin/interchain-security-sd /usr/local/bin/interchain-security-sd # Copy in the shell scripts that run the testnet ADD ./tests/e2e/testnet-scripts /testnet-scripts diff --git a/Dockerfile.gaia b/Dockerfile.gaia index 196f7dfa74..87448a1d63 100644 --- a/Dockerfile.gaia +++ b/Dockerfile.gaia @@ -74,7 +74,7 @@ COPY --from=hermes-builder /usr/bin/hermes /usr/local/bin/ COPY --from=gaia-builder /go/gaia/build/gaiad /usr/local/bin/interchain-security-pd COPY --from=is-builder /go/bin/interchain-security-cd /usr/local/bin/interchain-security-cd COPY --from=is-builder /go/bin/interchain-security-cdd /usr/local/bin/interchain-security-cdd - +COPY --from=is-builder /go/bin/interchain-security-sd /usr/local/bin/interchain-security-sd # Copy in the shell scripts that run the testnet ADD ./tests/e2e/testnet-scripts /testnet-scripts diff --git a/Makefile b/Makefile index b84eca6524..351852cd21 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,7 @@ install: go.sum go install $(BUILD_FLAGS) ./cmd/interchain-security-pd go install $(BUILD_FLAGS) ./cmd/interchain-security-cd go install $(BUILD_FLAGS) ./cmd/interchain-security-cdd + go install $(BUILD_FLAGS) ./cmd/interchain-security-sd # run all tests: unit, integration, diff, and E2E test: diff --git a/app/consumer-democracy/app.go b/app/consumer-democracy/app.go index ee299d6221..e9406cfecd 100644 --- a/app/consumer-democracy/app.go +++ b/app/consumer-democracy/app.go @@ -117,7 +117,7 @@ import ( const ( AppName = "interchain-security-cd" - upgradeName = "ics-v1-to-v2" // arbitrary name, define your own appropriately named upgrade + upgradeName = "sovereign-changeover" // arbitrary name, define your own appropriately named upgrade AccountAddressPrefix = "cosmos" ) @@ -645,12 +645,6 @@ func New( // upgrade handler code is application specific. However, as an example, standalone to consumer // changeover chains should utilize customized upgrade handler code similar to below. - // Setting the standalone transfer channel ID is only needed for standalone to consumer changeover chains - // who wish to preserve existing IBC transfer denoms. Here's an example. - // - // Note: This setter needs to execute before the ccv channel handshake is initiated. - app.ConsumerKeeper.SetStandaloneTransferChannelID(ctx, "hardcoded-existing-channel-id") - // TODO: should have a way to read from current node home userHomeDir, err := os.UserHomeDir() if err != nil { diff --git a/app/sovereign/ante_handler.go b/app/sovereign/ante_handler.go new file mode 100644 index 0000000000..3b1a3b7d38 --- /dev/null +++ b/app/sovereign/ante_handler.go @@ -0,0 +1,55 @@ +package app + +import ( + errorsmod "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/cosmos/cosmos-sdk/x/auth/ante" + ibcante "github.com/cosmos/ibc-go/v4/modules/core/ante" + ibckeeper "github.com/cosmos/ibc-go/v4/modules/core/keeper" +) + +// HandlerOptions extend the SDK's AnteHandler options by requiring the IBC +// channel keeper. +type HandlerOptions struct { + ante.HandlerOptions + + IBCKeeper *ibckeeper.Keeper +} + +func NewAnteHandler(options HandlerOptions) (sdk.AnteHandler, error) { + if options.AccountKeeper == nil { + return nil, errorsmod.Wrap(sdkerrors.ErrLogic, "account keeper is required for AnteHandler") + } + if options.BankKeeper == nil { + return nil, errorsmod.Wrap(sdkerrors.ErrLogic, "bank keeper is required for AnteHandler") + } + if options.SignModeHandler == nil { + return nil, errorsmod.Wrap(sdkerrors.ErrLogic, "sign mode handler is required for ante builder") + } + + sigGasConsumer := options.SigGasConsumer + if sigGasConsumer == nil { + sigGasConsumer = ante.DefaultSigVerificationGasConsumer + } + + anteDecorators := []sdk.AnteDecorator{ + ante.NewSetUpContextDecorator(), + ante.NewRejectExtensionOptionsDecorator(), + ante.NewMempoolFeeDecorator(), + ante.NewValidateBasicDecorator(), + ante.NewTxTimeoutHeightDecorator(), + ante.NewValidateMemoDecorator(options.AccountKeeper), + ante.NewConsumeGasForTxSizeDecorator(options.AccountKeeper), + ante.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper), + // SetPubKeyDecorator must be called before all signature verification decorators + ante.NewSetPubKeyDecorator(options.AccountKeeper), + ante.NewValidateSigCountDecorator(options.AccountKeeper), + ante.NewSigGasConsumeDecorator(options.AccountKeeper, sigGasConsumer), + ante.NewSigVerificationDecorator(options.AccountKeeper, options.SignModeHandler), + ante.NewIncrementSequenceDecorator(options.AccountKeeper), + ibcante.NewAnteDecorator(options.IBCKeeper), + } + + return sdk.ChainAnteDecorators(anteDecorators...), nil +} diff --git a/app/sovereign/app.go b/app/sovereign/app.go new file mode 100644 index 0000000000..43d732884b --- /dev/null +++ b/app/sovereign/app.go @@ -0,0 +1,838 @@ +package app + +import ( + "fmt" + "io" + stdlog "log" + "net/http" + "os" + "path/filepath" + + appparams "github.com/cosmos/interchain-security/v2/app/params" + + "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" + "github.com/cosmos/cosmos-sdk/client/rpc" + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/server/api" + "github.com/cosmos/cosmos-sdk/server/config" + servertypes "github.com/cosmos/cosmos-sdk/server/types" + "github.com/cosmos/cosmos-sdk/simapp" + "github.com/cosmos/cosmos-sdk/std" + store "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/cosmos/cosmos-sdk/version" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/auth/ante" + authrest "github.com/cosmos/cosmos-sdk/x/auth/client/rest" + authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" + authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/cosmos/cosmos-sdk/x/auth/vesting" + vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" + "github.com/cosmos/cosmos-sdk/x/authz" + authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" + authzmodule "github.com/cosmos/cosmos-sdk/x/authz/module" + "github.com/cosmos/cosmos-sdk/x/bank" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/cosmos/cosmos-sdk/x/capability" + capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" + capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" + "github.com/cosmos/cosmos-sdk/x/crisis" + crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper" + crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types" + "github.com/cosmos/cosmos-sdk/x/evidence" + evidencekeeper "github.com/cosmos/cosmos-sdk/x/evidence/keeper" + evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" + "github.com/cosmos/cosmos-sdk/x/feegrant" + feegrantkeeper "github.com/cosmos/cosmos-sdk/x/feegrant/keeper" + feegrantmodule "github.com/cosmos/cosmos-sdk/x/feegrant/module" + "github.com/cosmos/cosmos-sdk/x/params" + paramsclient "github.com/cosmos/cosmos-sdk/x/params/client" + paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper" + paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" + upgradeclient "github.com/cosmos/cosmos-sdk/x/upgrade/client" + + "github.com/cosmos/cosmos-sdk/x/slashing" + slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" + slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" + "github.com/cosmos/cosmos-sdk/x/upgrade" + upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + "github.com/cosmos/ibc-go/v4/modules/apps/transfer" + ibctransferkeeper "github.com/cosmos/ibc-go/v4/modules/apps/transfer/keeper" + ibctransfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" + ibc "github.com/cosmos/ibc-go/v4/modules/core" + ibcconnectiontypes "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types" + porttypes "github.com/cosmos/ibc-go/v4/modules/core/05-port/types" + ibchost "github.com/cosmos/ibc-go/v4/modules/core/24-host" + ibckeeper "github.com/cosmos/ibc-go/v4/modules/core/keeper" + ibctestingcore "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/core" + ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" + "github.com/gorilla/mux" + "github.com/rakyll/statik/fs" + "github.com/spf13/cast" + abci "github.com/tendermint/tendermint/abci/types" + tmjson "github.com/tendermint/tendermint/libs/json" + "github.com/tendermint/tendermint/libs/log" + tmos "github.com/tendermint/tendermint/libs/os" + dbm "github.com/tendermint/tm-db" + + sdkdistr "github.com/cosmos/cosmos-sdk/x/distribution" + distrclient "github.com/cosmos/cosmos-sdk/x/distribution/client" + distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" + distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" + testutil "github.com/cosmos/interchain-security/v2/testutil/integration" + + sdkstaking "github.com/cosmos/cosmos-sdk/x/staking" + stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + + "github.com/cosmos/cosmos-sdk/x/genutil" + genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" + + sdkgov "github.com/cosmos/cosmos-sdk/x/gov" + govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + + // add mint + mint "github.com/cosmos/cosmos-sdk/x/mint" + mintkeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper" + minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" + + paramproposal "github.com/cosmos/cosmos-sdk/x/params/types/proposal" +) + +const ( + AppName = "interchain-security-s" + upgradeName = "v07-Theta" // arbitrary name, define your own appropriately named upgrade + AccountAddressPrefix = "cosmos" +) + +var ( + // DefaultNodeHome default home directories for the application daemon + DefaultNodeHome string + + // ModuleBasics defines the module BasicManager is in charge of setting up basic, + // non-dependant module elements, such as codec registration + // and genesis verification. + ModuleBasics = module.NewBasicManager( + auth.AppModuleBasic{}, + genutil.AppModuleBasic{}, + bank.AppModuleBasic{}, + capability.AppModuleBasic{}, + sdkstaking.AppModuleBasic{}, + mint.AppModuleBasic{}, + sdkdistr.AppModuleBasic{}, + sdkgov.NewAppModuleBasic( + // TODO: eventually remove upgrade proposal handler and cancel proposal handler + paramsclient.ProposalHandler, distrclient.ProposalHandler, upgradeclient.ProposalHandler, upgradeclient.CancelProposalHandler, + ), + params.AppModuleBasic{}, + crisis.AppModuleBasic{}, + slashing.AppModuleBasic{}, + feegrantmodule.AppModuleBasic{}, + authzmodule.AppModuleBasic{}, + ibc.AppModuleBasic{}, + upgrade.AppModuleBasic{}, + evidence.AppModuleBasic{}, + transfer.AppModuleBasic{}, + vesting.AppModuleBasic{}, + ) + + // module account permissions + maccPerms = map[string][]string{ + authtypes.FeeCollectorName: nil, + stakingtypes.BondedPoolName: {authtypes.Burner, authtypes.Staking}, + stakingtypes.NotBondedPoolName: {authtypes.Burner, authtypes.Staking}, + distrtypes.ModuleName: nil, + minttypes.ModuleName: {authtypes.Minter}, + ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner}, + govtypes.ModuleName: {authtypes.Burner}, + } +) + +var ( + _ simapp.App = (*App)(nil) + _ servertypes.Application = (*App)(nil) + _ ibctesting.TestingApp = (*App)(nil) +) + +// App extends an ABCI application, but with most of its parameters exported. +// They are exported for convenience in creating helper functions, as object +// capabilities aren't needed for testing. +type App struct { // nolint: golint + *baseapp.BaseApp + legacyAmino *codec.LegacyAmino + appCodec codec.Codec + interfaceRegistry types.InterfaceRegistry + + invCheckPeriod uint + + // keys to access the substores + keys map[string]*sdk.KVStoreKey + tkeys map[string]*sdk.TransientStoreKey + memKeys map[string]*sdk.MemoryStoreKey + + // keepers + AccountKeeper authkeeper.AccountKeeper + BankKeeper bankkeeper.Keeper + CapabilityKeeper *capabilitykeeper.Keeper + StakingKeeper stakingkeeper.Keeper + SlashingKeeper slashingkeeper.Keeper + MintKeeper mintkeeper.Keeper + + DistrKeeper distrkeeper.Keeper + + GovKeeper govkeeper.Keeper + CrisisKeeper crisiskeeper.Keeper + UpgradeKeeper upgradekeeper.Keeper + ParamsKeeper paramskeeper.Keeper + IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly + EvidenceKeeper evidencekeeper.Keeper + TransferKeeper ibctransferkeeper.Keeper + FeeGrantKeeper feegrantkeeper.Keeper + AuthzKeeper authzkeeper.Keeper + + // make scoped keepers public for test purposes + ScopedIBCKeeper capabilitykeeper.ScopedKeeper + ScopedTransferKeeper capabilitykeeper.ScopedKeeper + + // the module manager + MM *module.Manager + + // simulation manager + sm *module.SimulationManager + configurator module.Configurator +} + +func init() { + userHomeDir, err := os.UserHomeDir() + if err != nil { + stdlog.Println("Failed to get home dir %2", err) + } + + DefaultNodeHome = filepath.Join(userHomeDir, "."+AppName) +} + +// New returns a reference to an initialized App. +func New( + logger log.Logger, + db dbm.DB, + traceStore io.Writer, + loadLatest bool, + skipUpgradeHeights map[int64]bool, + homePath string, + invCheckPeriod uint, + encodingConfig appparams.EncodingConfig, + appOpts servertypes.AppOptions, + baseAppOptions ...func(*baseapp.BaseApp), +) *App { + appCodec := encodingConfig.Marshaler + legacyAmino := encodingConfig.Amino + interfaceRegistry := encodingConfig.InterfaceRegistry + + bApp := baseapp.NewBaseApp(AppName, logger, db, encodingConfig.TxConfig.TxDecoder(), baseAppOptions...) + bApp.SetCommitMultiStoreTracer(traceStore) + bApp.SetVersion(version.Version) + bApp.SetInterfaceRegistry(interfaceRegistry) + + keys := sdk.NewKVStoreKeys( + authtypes.StoreKey, banktypes.StoreKey, stakingtypes.StoreKey, + minttypes.StoreKey, distrtypes.StoreKey, slashingtypes.StoreKey, + govtypes.StoreKey, paramstypes.StoreKey, ibchost.StoreKey, upgradetypes.StoreKey, feegrant.StoreKey, + evidencetypes.StoreKey, ibctransfertypes.StoreKey, + capabilitytypes.StoreKey, authzkeeper.StoreKey, + ) + tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey) + memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey) + + app := &App{ + BaseApp: bApp, + legacyAmino: legacyAmino, + appCodec: appCodec, + interfaceRegistry: interfaceRegistry, + invCheckPeriod: invCheckPeriod, + keys: keys, + tkeys: tkeys, + memKeys: memKeys, + } + + app.ParamsKeeper = initParamsKeeper( + appCodec, + legacyAmino, + keys[paramstypes.StoreKey], + tkeys[paramstypes.TStoreKey], + ) + + // set the BaseApp's parameter store + bApp.SetParamStore( + app.ParamsKeeper.Subspace(baseapp.Paramspace).WithKeyTable( + paramskeeper.ConsensusParamsKeyTable()), + ) + + // add capability keeper and ScopeToModule for ibc module + app.CapabilityKeeper = capabilitykeeper.NewKeeper( + appCodec, + keys[capabilitytypes.StoreKey], + memKeys[capabilitytypes.MemStoreKey], + ) + scopedIBCKeeper := app.CapabilityKeeper.ScopeToModule(ibchost.ModuleName) + scopedTransferKeeper := app.CapabilityKeeper.ScopeToModule(ibctransfertypes.ModuleName) + app.CapabilityKeeper.Seal() + + // add keepers + app.AccountKeeper = authkeeper.NewAccountKeeper( + appCodec, + keys[authtypes.StoreKey], + app.GetSubspace(authtypes.ModuleName), + authtypes.ProtoBaseAccount, + maccPerms, + ) + + bankBlockedAddrs := app.ModuleAccountAddrs() + + app.BankKeeper = bankkeeper.NewBaseKeeper( + appCodec, + keys[banktypes.StoreKey], + app.AccountKeeper, + app.GetSubspace(banktypes.ModuleName), + bankBlockedAddrs, + ) + app.AuthzKeeper = authzkeeper.NewKeeper( + keys[authzkeeper.StoreKey], + appCodec, + app.BaseApp.MsgServiceRouter(), + ) + app.FeeGrantKeeper = feegrantkeeper.NewKeeper( + appCodec, + keys[feegrant.StoreKey], + app.AccountKeeper, + ) + + stakingKeeper := stakingkeeper.NewKeeper( + appCodec, + keys[stakingtypes.StoreKey], + app.AccountKeeper, + app.BankKeeper, + app.GetSubspace(stakingtypes.ModuleName), + ) + + app.MintKeeper = mintkeeper.NewKeeper( + appCodec, keys[minttypes.StoreKey], app.GetSubspace(minttypes.ModuleName), &stakingKeeper, + app.AccountKeeper, app.BankKeeper, authtypes.FeeCollectorName, + ) + + app.SlashingKeeper = slashingkeeper.NewKeeper( + appCodec, + keys[slashingtypes.StoreKey], + &app.StakingKeeper, + app.GetSubspace(slashingtypes.ModuleName), + ) + app.DistrKeeper = distrkeeper.NewKeeper( + appCodec, + keys[distrtypes.StoreKey], + app.GetSubspace(distrtypes.ModuleName), + app.AccountKeeper, + app.BankKeeper, + &stakingKeeper, + authtypes.FeeCollectorName, + app.ModuleAccountAddrs(), + ) + app.CrisisKeeper = crisiskeeper.NewKeeper( + app.GetSubspace(crisistypes.ModuleName), + invCheckPeriod, + app.BankKeeper, + authtypes.FeeCollectorName, + ) + app.UpgradeKeeper = upgradekeeper.NewKeeper( + skipUpgradeHeights, + keys[upgradetypes.StoreKey], + appCodec, + homePath, + app.BaseApp, + ) + + // register the staking hooks + // NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks + app.StakingKeeper = *stakingKeeper.SetHooks( + stakingtypes.NewMultiStakingHooks( + app.DistrKeeper.Hooks(), + app.SlashingKeeper.Hooks(), + ), + ) + + // register the proposal types + sdkgovRouter := govtypes.NewRouter() + sdkgovRouter.AddRoute(govtypes.RouterKey, govtypes.ProposalHandler). + AddRoute(paramproposal.RouterKey, params.NewParamChangeProposalHandler(app.ParamsKeeper)). + AddRoute(upgradetypes.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(app.UpgradeKeeper)) + govKeeper := govkeeper.NewKeeper( + appCodec, + keys[govtypes.StoreKey], + app.GetSubspace(govtypes.ModuleName), + app.AccountKeeper, + app.BankKeeper, + &stakingKeeper, + sdkgovRouter, + ) + + app.GovKeeper = *govKeeper.SetHooks( + govtypes.NewMultiGovHooks( + // register the governance hooks + ), + ) + + app.IBCKeeper = ibckeeper.NewKeeper( + appCodec, + keys[ibchost.StoreKey], + app.GetSubspace(ibchost.ModuleName), + &app.StakingKeeper, + app.UpgradeKeeper, + scopedIBCKeeper, + ) + + app.SlashingKeeper = slashingkeeper.NewKeeper( + appCodec, + keys[slashingtypes.StoreKey], + &app.StakingKeeper, + app.GetSubspace(slashingtypes.ModuleName), + ) + + app.TransferKeeper = ibctransferkeeper.NewKeeper( + appCodec, + keys[ibctransfertypes.StoreKey], + app.GetSubspace(ibctransfertypes.ModuleName), + app.IBCKeeper.ChannelKeeper, + app.IBCKeeper.ChannelKeeper, + &app.IBCKeeper.PortKeeper, + app.AccountKeeper, + app.BankKeeper, + scopedTransferKeeper, + ) + transferModule := transfer.NewAppModule(app.TransferKeeper) + ibcmodule := transfer.NewIBCModule(app.TransferKeeper) + + // create static IBC router, add transfer route, then set and seal it + ibcRouter := porttypes.NewRouter() + ibcRouter.AddRoute(ibctransfertypes.ModuleName, ibcmodule) + app.IBCKeeper.SetRouter(ibcRouter) + + // create evidence keeper with router + evidenceKeeper := evidencekeeper.NewKeeper( + appCodec, + keys[evidencetypes.StoreKey], + &app.StakingKeeper, + app.SlashingKeeper, + ) + + app.EvidenceKeeper = *evidenceKeeper + + skipGenesisInvariants := cast.ToBool(appOpts.Get(crisis.FlagSkipGenesisInvariants)) + + // NOTE: Any module instantiated in the module manager that is later modified + // must be passed by reference here. + app.MM = module.NewManager( + genutil.NewAppModule( + app.AccountKeeper, + app.StakingKeeper, + app.BaseApp.DeliverTx, + encodingConfig.TxConfig, + ), + auth.NewAppModule(appCodec, app.AccountKeeper, nil), + vesting.NewAppModule(app.AccountKeeper, app.BankKeeper), + bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper), + capability.NewAppModule(appCodec, *app.CapabilityKeeper), + crisis.NewAppModule(&app.CrisisKeeper, skipGenesisInvariants), + feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry), + sdkgov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper), + mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper), + slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), + sdkdistr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), + sdkstaking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper), + upgrade.NewAppModule(app.UpgradeKeeper), + evidence.NewAppModule(app.EvidenceKeeper), + params.NewAppModule(app.ParamsKeeper), + authzmodule.NewAppModule(appCodec, app.AuthzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), + ibc.NewAppModule(app.IBCKeeper), + transferModule, + ) + + app.MM.SetOrderBeginBlockers( + upgradetypes.ModuleName, + capabilitytypes.ModuleName, + minttypes.ModuleName, + distrtypes.ModuleName, + slashingtypes.ModuleName, + evidencetypes.ModuleName, + stakingtypes.ModuleName, + authtypes.ModuleName, + banktypes.ModuleName, + govtypes.ModuleName, + crisistypes.ModuleName, + authz.ModuleName, + feegrant.ModuleName, + paramstypes.ModuleName, + genutiltypes.ModuleName, + vestingtypes.ModuleName, + ibctransfertypes.ModuleName, + ibchost.ModuleName, + ) + app.MM.SetOrderEndBlockers( + crisistypes.ModuleName, + govtypes.ModuleName, + stakingtypes.ModuleName, + capabilitytypes.ModuleName, + authtypes.ModuleName, + banktypes.ModuleName, + distrtypes.ModuleName, + slashingtypes.ModuleName, + minttypes.ModuleName, + evidencetypes.ModuleName, + authz.ModuleName, + feegrant.ModuleName, + paramstypes.ModuleName, + genutiltypes.ModuleName, + upgradetypes.ModuleName, + vestingtypes.ModuleName, + ibctransfertypes.ModuleName, + ibchost.ModuleName, + ) + + // NOTE: The genutils module must occur after staking so that pools are + // properly initialized with tokens from genesis accounts. + // NOTE: The genutils module must also occur after auth so that it can access the params from auth. + // NOTE: Capability module must occur first so that it can initialize any capabilities + // so that other modules that want to create or claim capabilities afterwards in InitChain + // can do so safely. + app.MM.SetOrderInitGenesis( + capabilitytypes.ModuleName, + authtypes.ModuleName, + banktypes.ModuleName, + distrtypes.ModuleName, + stakingtypes.ModuleName, + slashingtypes.ModuleName, + govtypes.ModuleName, + minttypes.ModuleName, + crisistypes.ModuleName, + evidencetypes.ModuleName, + authz.ModuleName, + feegrant.ModuleName, + paramstypes.ModuleName, + upgradetypes.ModuleName, + vestingtypes.ModuleName, + genutiltypes.ModuleName, + ibchost.ModuleName, + ibctransfertypes.ModuleName, + ) + + app.MM.RegisterInvariants(&app.CrisisKeeper) + app.MM.RegisterRoutes(app.Router(), app.QueryRouter(), encodingConfig.Amino) + + app.configurator = module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter()) + app.MM.RegisterServices(app.configurator) + + // initialize stores + app.MountKVStores(keys) + app.MountTransientStores(tkeys) + app.MountMemoryStores(memKeys) + + anteHandler, err := NewAnteHandler( + HandlerOptions{ + HandlerOptions: ante.HandlerOptions{ + AccountKeeper: app.AccountKeeper, + BankKeeper: app.BankKeeper, + FeegrantKeeper: app.FeeGrantKeeper, + SignModeHandler: encodingConfig.TxConfig.SignModeHandler(), + SigGasConsumer: ante.DefaultSigVerificationGasConsumer, + }, + IBCKeeper: app.IBCKeeper, + }, + ) + if err != nil { + panic(fmt.Errorf("failed to create AnteHandler: %s", err)) + } + app.SetAnteHandler(anteHandler) + + app.SetInitChainer(app.InitChainer) + app.SetBeginBlocker(app.BeginBlocker) + app.SetEndBlocker(app.EndBlocker) + + app.UpgradeKeeper.SetUpgradeHandler( + upgradeName, + func(ctx sdk.Context, _ upgradetypes.Plan, _ module.VersionMap) (module.VersionMap, error) { + app.IBCKeeper.ConnectionKeeper.SetParams(ctx, ibcconnectiontypes.DefaultParams()) + + fromVM := make(map[string]uint64) + + for moduleName, eachModule := range app.MM.Modules { + fromVM[moduleName] = eachModule.ConsensusVersion() + } + + ctx.Logger().Info("start to run module migrations...") + + return app.MM.RunMigrations(ctx, app.configurator, fromVM) + }, + ) + + upgradeInfo, err := app.UpgradeKeeper.ReadUpgradeInfoFromDisk() + if err != nil { + panic(fmt.Sprintf("failed to read upgrade info from disk %s", err)) + } + + if upgradeInfo.Name == upgradeName && !app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) { + storeUpgrades := store.StoreUpgrades{} + app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades)) + } + + if loadLatest { + if err := app.LoadLatestVersion(); err != nil { + tmos.Exit(fmt.Sprintf("failed to load latest version: %s", err)) + } + } + + app.ScopedIBCKeeper = scopedIBCKeeper + app.ScopedTransferKeeper = scopedTransferKeeper + + return app +} + +// Name returns the name of the App +func (app *App) Name() string { return app.BaseApp.Name() } + +// BeginBlocker application updates every begin block +func (app *App) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { + return app.MM.BeginBlock(ctx, req) +} + +// EndBlocker application updates every end block +func (app *App) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { + return app.MM.EndBlock(ctx, req) +} + +// InitChainer application update at chain initialization +func (app *App) InitChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { + var genesisState GenesisState + if err := tmjson.Unmarshal(req.AppStateBytes, &genesisState); err != nil { + panic(err) + } + + app.UpgradeKeeper.SetModuleVersionMap(ctx, app.MM.GetVersionMap()) + return app.MM.InitGenesis(ctx, app.appCodec, genesisState) +} + +// LoadHeight loads a particular height +func (app *App) LoadHeight(height int64) error { + return app.LoadVersion(height) +} + +// ModuleAccountAddrs returns all the app's module account addresses. +func (app *App) ModuleAccountAddrs() map[string]bool { + modAccAddrs := make(map[string]bool) + for acc := range maccPerms { + modAccAddrs[authtypes.NewModuleAddress(acc).String()] = true + } + + return modAccAddrs +} + +// LegacyAmino returns App's amino codec. +// +// NOTE: This is solely to be used for testing purposes as it may be desirable +// for modules to register their own custom testing types. +func (app *App) LegacyAmino() *codec.LegacyAmino { + return app.legacyAmino +} + +// AppCodec returns the app codec. +// +// NOTE: This is solely to be used for testing purposes as it may be desirable +// for modules to register their own custom testing types. +func (app *App) AppCodec() codec.Codec { + return app.appCodec +} + +// InterfaceRegistry returns the InterfaceRegistry +func (app *App) InterfaceRegistry() types.InterfaceRegistry { + return app.interfaceRegistry +} + +// GetKey returns the KVStoreKey for the provided store key. +// +// NOTE: This is solely to be used for testing purposes. +func (app *App) GetKey(storeKey string) *sdk.KVStoreKey { + return app.keys[storeKey] +} + +// GetTKey returns the TransientStoreKey for the provided store key. +// +// NOTE: This is solely to be used for testing purposes. +func (app *App) GetTKey(storeKey string) *sdk.TransientStoreKey { + return app.tkeys[storeKey] +} + +// GetMemKey returns the MemStoreKey for the provided mem key. +// +// NOTE: This is solely used for testing purposes. +func (app *App) GetMemKey(storeKey string) *sdk.MemoryStoreKey { + return app.memKeys[storeKey] +} + +// GetSubspace returns a param subspace for a given module name. +// +// NOTE: This is solely to be used for testing purposes. +func (app *App) GetSubspace(moduleName string) paramstypes.Subspace { + subspace, _ := app.ParamsKeeper.GetSubspace(moduleName) + return subspace +} + +// SimulationManager implements the SimulationApp interface +func (app *App) SimulationManager() *module.SimulationManager { + return app.sm +} + +func (app *App) GetTestBankKeeper() testutil.TestBankKeeper { + return app.BankKeeper +} + +func (app *App) GetTestAccountKeeper() testutil.TestAccountKeeper { + return app.AccountKeeper +} + +func (app *App) GetTestSlashingKeeper() testutil.TestSlashingKeeper { + return app.SlashingKeeper +} + +func (app *App) GetTestEvidenceKeeper() testutil.TestEvidenceKeeper { + return app.EvidenceKeeper +} + +func (app *App) GetTestStakingKeeper() testutil.TestStakingKeeper { + return app.StakingKeeper +} + +func (app *App) GetTestDistributionKeeper() testutil.TestDistributionKeeper { + return app.DistrKeeper +} + +func (app *App) GetTestMintKeeper() testutil.TestMintKeeper { + return app.MintKeeper +} + +func (app *App) GetTestGovKeeper() testutil.TestGovKeeper { + return app.GovKeeper +} + +// TestingApp functions + +// GetBaseApp implements the TestingApp interface. +func (app *App) GetBaseApp() *baseapp.BaseApp { + return app.BaseApp +} + +// GetStakingKeeper implements the TestingApp interface. +func (app *App) GetStakingKeeper() ibctestingcore.StakingKeeper { + return app.StakingKeeper +} + +// GetIBCKeeper implements the TestingApp interface. +func (app *App) GetIBCKeeper() *ibckeeper.Keeper { + return app.IBCKeeper +} + +// GetScopedIBCKeeper implements the TestingApp interface. +func (app *App) GetScopedIBCKeeper() capabilitykeeper.ScopedKeeper { + return app.ScopedIBCKeeper +} + +// GetTxConfig implements the TestingApp interface. +func (app *App) GetTxConfig() client.TxConfig { + return MakeTestEncodingConfig().TxConfig +} + +// RegisterAPIRoutes registers all application module routes with the provided +// API server. +func (app *App) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIConfig) { + clientCtx := apiSvr.ClientCtx + rpc.RegisterRoutes(clientCtx, apiSvr.Router) + // Register legacy tx routes. + authrest.RegisterTxRoutes(clientCtx, apiSvr.Router) + // Register new tx routes from grpc-gateway. + authtx.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) + // Register new tendermint queries routes from grpc-gateway. + tmservice.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) + + // Register legacy and grpc-gateway routes for all modules. + ModuleBasics.RegisterRESTRoutes(clientCtx, apiSvr.Router) + ModuleBasics.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) + + // register swagger API from root so that other applications can override easily + if apiConfig.Swagger { + RegisterSwaggerAPI(apiSvr.Router) + } +} + +// RegisterTxService implements the Application.RegisterTxService method. +func (app *App) RegisterTxService(clientCtx client.Context) { + authtx.RegisterTxService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.BaseApp.Simulate, app.interfaceRegistry) +} + +// RegisterTendermintService implements the Application.RegisterTendermintService method. +func (app *App) RegisterTendermintService(clientCtx client.Context) { + tmservice.RegisterTendermintService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.interfaceRegistry) +} + +// RegisterSwaggerAPI registers swagger route with API Server +func RegisterSwaggerAPI(rtr *mux.Router) { + statikFS, err := fs.New() + if err != nil { + panic(err) + } + + staticServer := http.FileServer(statikFS) + rtr.PathPrefix("/swagger/").Handler(http.StripPrefix("/swagger/", staticServer)) +} + +// GetMaccPerms returns a copy of the module account permissions +func GetMaccPerms() map[string][]string { + dupMaccPerms := make(map[string][]string) + for k, v := range maccPerms { + dupMaccPerms[k] = v + } + return dupMaccPerms +} + +// initParamsKeeper init params keeper and its subspaces +func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey sdk.StoreKey) paramskeeper.Keeper { + paramsKeeper := paramskeeper.NewKeeper(appCodec, legacyAmino, key, tkey) + + paramsKeeper.Subspace(authtypes.ModuleName) + paramsKeeper.Subspace(banktypes.ModuleName) + paramsKeeper.Subspace(stakingtypes.ModuleName) + paramsKeeper.Subspace(minttypes.ModuleName) + paramsKeeper.Subspace(distrtypes.ModuleName) + paramsKeeper.Subspace(slashingtypes.ModuleName) + paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(govtypes.ParamKeyTable()) + paramsKeeper.Subspace(crisistypes.ModuleName) + paramsKeeper.Subspace(ibctransfertypes.ModuleName) + paramsKeeper.Subspace(ibchost.ModuleName) + + return paramsKeeper +} + +// MakeTestEncodingConfig creates an EncodingConfig for testing. This function +// should be used only in tests or when creating a new app instance (NewApp*()). +// App user shouldn't create new codecs - use the app.AppCodec instead. +// [DEPRECATED] +func MakeTestEncodingConfig() appparams.EncodingConfig { + encodingConfig := appparams.MakeTestEncodingConfig() + std.RegisterLegacyAminoCodec(encodingConfig.Amino) + std.RegisterInterfaces(encodingConfig.InterfaceRegistry) + ModuleBasics.RegisterLegacyAminoCodec(encodingConfig.Amino) + ModuleBasics.RegisterInterfaces(encodingConfig.InterfaceRegistry) + return encodingConfig +} diff --git a/app/sovereign/export.go b/app/sovereign/export.go new file mode 100644 index 0000000000..f0b3e3ed76 --- /dev/null +++ b/app/sovereign/export.go @@ -0,0 +1,187 @@ +package app + +import ( + "encoding/json" + "log" + + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + + servertypes "github.com/cosmos/cosmos-sdk/server/types" + sdk "github.com/cosmos/cosmos-sdk/types" + slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" + "github.com/cosmos/cosmos-sdk/x/staking" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" +) + +// ExportAppStateAndValidators exports the state of the application for a genesis +// file. +func (app *App) ExportAppStateAndValidators( + forZeroHeight bool, jailAllowedAddrs []string, +) (servertypes.ExportedApp, error) { + // as if they could withdraw from the start of the next block + ctx := app.NewContext(true, tmproto.Header{Height: app.LastBlockHeight()}) + + // We export at last height + 1, because that's the height at which + // Tendermint will start InitChain. + height := app.LastBlockHeight() + 1 + if forZeroHeight { + height = 0 + app.prepForZeroHeightGenesis(ctx, jailAllowedAddrs) + } + + genState := app.MM.ExportGenesis(ctx, app.appCodec) + appState, err := json.MarshalIndent(genState, "", " ") + if err != nil { + return servertypes.ExportedApp{}, err + } + + validators, err := staking.WriteValidators(ctx, app.StakingKeeper) + if err != nil { + return servertypes.ExportedApp{}, err + } + return servertypes.ExportedApp{ + AppState: appState, + Validators: validators, + Height: height, + ConsensusParams: app.BaseApp.GetConsensusParams(ctx), + }, nil +} + +// prepare for fresh start at zero height +// NOTE zero height genesis is a temporary feature which will be deprecated +// +// in favour of export at a block height +func (app *App) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs []string) { + applyAllowedAddrs := false + + // check if there is a allowed address list + if len(jailAllowedAddrs) > 0 { + applyAllowedAddrs = true + } + + allowedAddrsMap := make(map[string]bool) + + for _, addr := range jailAllowedAddrs { + _, err := sdk.ValAddressFromBech32(addr) + if err != nil { + log.Fatal(err) + } + allowedAddrsMap[addr] = true + } + + /* Just to be safe, assert the invariants on current state. */ + app.CrisisKeeper.AssertInvariants(ctx) + + /* Handle fee distribution state. */ + + // withdraw all validator commission + app.StakingKeeper.IterateValidators(ctx, func(_ int64, val stakingtypes.ValidatorI) (stop bool) { + _, err := app.DistrKeeper.WithdrawValidatorCommission(ctx, val.GetOperator()) + if err != nil { + panic(err) + } + return false + }) + + // withdraw all delegator rewards + dels := app.StakingKeeper.GetAllDelegations(ctx) + for _, delegation := range dels { + _, err := app.DistrKeeper.WithdrawDelegationRewards(ctx, delegation.GetDelegatorAddr(), delegation.GetValidatorAddr()) + if err != nil { + panic(err) + } + } + + // clear validator slash events + app.DistrKeeper.DeleteAllValidatorSlashEvents(ctx) + + // clear validator historical rewards + app.DistrKeeper.DeleteAllValidatorHistoricalRewards(ctx) + + // set context height to zero + height := ctx.BlockHeight() + ctx = ctx.WithBlockHeight(0) + + // reinitialize all validators + app.StakingKeeper.IterateValidators(ctx, func(_ int64, val stakingtypes.ValidatorI) (stop bool) { + // donate any unwithdrawn outstanding reward fraction tokens to the community pool + scraps := app.DistrKeeper.GetValidatorOutstandingRewardsCoins(ctx, val.GetOperator()) + feePool := app.DistrKeeper.GetFeePool(ctx) + feePool.CommunityPool = feePool.CommunityPool.Add(scraps...) + app.DistrKeeper.SetFeePool(ctx, feePool) + + app.DistrKeeper.Hooks().AfterValidatorCreated(ctx, val.GetOperator()) + return false + }) + + // reinitialize all delegations + for _, del := range dels { + app.DistrKeeper.Hooks().BeforeDelegationCreated(ctx, del.GetDelegatorAddr(), del.GetValidatorAddr()) + app.DistrKeeper.Hooks().AfterDelegationModified(ctx, del.GetDelegatorAddr(), del.GetValidatorAddr()) + } + + // reset context height + ctx = ctx.WithBlockHeight(height) + + /* Handle staking state. */ + + // iterate through redelegations, reset creation height + app.StakingKeeper.IterateRedelegations(ctx, func(_ int64, red stakingtypes.Redelegation) (stop bool) { + for i := range red.Entries { + red.Entries[i].CreationHeight = 0 + } + app.StakingKeeper.SetRedelegation(ctx, red) + return false + }) + + // iterate through unbonding delegations, reset creation height + app.StakingKeeper.IterateUnbondingDelegations(ctx, func(_ int64, ubd stakingtypes.UnbondingDelegation) (stop bool) { + for i := range ubd.Entries { + ubd.Entries[i].CreationHeight = 0 + } + app.StakingKeeper.SetUnbondingDelegation(ctx, ubd) + return false + }) + + // Iterate through validators by power descending, reset bond heights, and + // update bond intra-tx counters. + store := ctx.KVStore(app.keys[stakingtypes.StoreKey]) + iter := sdk.KVStoreReversePrefixIterator(store, stakingtypes.ValidatorsKey) + counter := int16(0) + + for ; iter.Valid(); iter.Next() { + addr := sdk.ValAddress(iter.Key()[1:]) + validator, found := app.StakingKeeper.GetValidator(ctx, addr) + if !found { + panic("expected validator, not found") + } + + validator.UnbondingHeight = 0 + if applyAllowedAddrs && !allowedAddrsMap[addr.String()] { + validator.Jailed = true + } + + app.StakingKeeper.SetValidator(ctx, validator) + counter++ + } + + if err := iter.Close(); err != nil { + panic(err) + } + + if _, err := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx); err != nil { + panic(err) + } + + /* Handle slashing state. */ + + // reset start height on signing infos + app.SlashingKeeper.IterateValidatorSigningInfos( + ctx, + func(addr sdk.ConsAddress, info slashingtypes.ValidatorSigningInfo) (stop bool) { + info.StartHeight = 0 + app.SlashingKeeper.SetValidatorSigningInfo(ctx, addr, info) + return false + }, + ) +} diff --git a/app/sovereign/genesis.go b/app/sovereign/genesis.go new file mode 100644 index 0000000000..5bf0c1da80 --- /dev/null +++ b/app/sovereign/genesis.go @@ -0,0 +1,21 @@ +package app + +import ( + "encoding/json" + + "github.com/cosmos/cosmos-sdk/codec" +) + +// The genesis state of the blockchain is represented here as a map of raw json +// messages key'd by a identifier string. +// The identifier is used to determine which module genesis information belongs +// to so it may be appropriately routed during init chain. +// Within this application default genesis information is retrieved from +// the ModuleBasicManager which populates json from each BasicModule +// object provided to it during init. +type GenesisState map[string]json.RawMessage + +// NewDefaultGenesisState generates the default state for the application. +func NewDefaultGenesisState(cdc codec.JSONCodec) GenesisState { + return ModuleBasics.DefaultGenesis(cdc) +} diff --git a/cmd/interchain-security-sd/cmd/genaccounts.go b/cmd/interchain-security-sd/cmd/genaccounts.go new file mode 100644 index 0000000000..c3340dccad --- /dev/null +++ b/cmd/interchain-security-sd/cmd/genaccounts.go @@ -0,0 +1,180 @@ +package cmd + +import ( + "bufio" + "encoding/json" + "errors" + "fmt" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/crypto/keyring" + "github.com/cosmos/cosmos-sdk/server" + sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + authvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/cosmos/cosmos-sdk/x/genutil" + genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" +) + +const ( + flagVestingStart = "vesting-start-time" + flagVestingEnd = "vesting-end-time" + flagVestingAmt = "vesting-amount" +) + +// AddGenesisAccountCmd returns add-genesis-account cobra Command. +func AddGenesisAccountCmd(defaultNodeHome string) *cobra.Command { + cmd := &cobra.Command{ + Use: "add-genesis-account [address_or_key_name] [coin][,[coin]]", + Short: "Add a genesis account to genesis.json", + Long: `Add a genesis account to genesis.json. The provided account must specify +the account address or key name and a list of initial coins. If a key name is given, +the address will be looked up in the local Keybase. The list of initial tokens must +contain valid denominations. Accounts may optionally be supplied with vesting parameters. +`, + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx := client.GetClientContextFromCmd(cmd) + serverCtx := server.GetServerContextFromCmd(cmd) + config := serverCtx.Config + + config.SetRoot(clientCtx.HomeDir) + + var kr keyring.Keyring + addr, err := sdk.AccAddressFromBech32(args[0]) + if err != nil { + inBuf := bufio.NewReader(cmd.InOrStdin()) + keyringBackend, _ := cmd.Flags().GetString(flags.FlagKeyringBackend) + if keyringBackend != "" && clientCtx.Keyring == nil { + var err error + kr, err = keyring.New(sdk.KeyringServiceName(), keyringBackend, clientCtx.HomeDir, inBuf) + if err != nil { + return err + } + } else { + kr = clientCtx.Keyring + } + + info, err := kr.Key(args[0]) + if err != nil { + return fmt.Errorf("failed to get address from Keyring: %w", err) + } + addr = info.GetAddress() + } + + coins, err := sdk.ParseCoinsNormalized(args[1]) + if err != nil { + return fmt.Errorf("failed to parse coins: %w", err) + } + + vestingStart, _ := cmd.Flags().GetInt64(flagVestingStart) + vestingEnd, _ := cmd.Flags().GetInt64(flagVestingEnd) + vestingAmtStr, _ := cmd.Flags().GetString(flagVestingAmt) + + vestingAmt, err := sdk.ParseCoinsNormalized(vestingAmtStr) + if err != nil { + return fmt.Errorf("failed to parse vesting amount: %w", err) + } + + // create concrete account type based on input parameters + var genAccount authtypes.GenesisAccount + + balances := banktypes.Balance{Address: addr.String(), Coins: coins.Sort()} + baseAccount := authtypes.NewBaseAccount(addr, nil, 0, 0) + + if !vestingAmt.IsZero() { + baseVestingAccount := authvesting.NewBaseVestingAccount(baseAccount, vestingAmt.Sort(), vestingEnd) + + if (balances.Coins.IsZero() && !baseVestingAccount.OriginalVesting.IsZero()) || + baseVestingAccount.OriginalVesting.IsAnyGT(balances.Coins) { + return errors.New("vesting amount cannot be greater than total amount") + } + + switch { + case vestingStart != 0 && vestingEnd != 0: + genAccount = authvesting.NewContinuousVestingAccountRaw(baseVestingAccount, vestingStart) + + case vestingEnd != 0: + genAccount = authvesting.NewDelayedVestingAccountRaw(baseVestingAccount) + + default: + return errors.New("invalid vesting parameters; must supply start and end time or end time") + } + } else { + genAccount = baseAccount + } + + if err := genAccount.Validate(); err != nil { + return fmt.Errorf("failed to validate new genesis account: %w", err) + } + + genFile := config.GenesisFile() + appState, genDoc, err := genutiltypes.GenesisStateFromGenFile(genFile) + if err != nil { + return fmt.Errorf("failed to unmarshal genesis state: %w", err) + } + + authGenState := authtypes.GetGenesisStateFromAppState(clientCtx.Codec, appState) + + accs, err := authtypes.UnpackAccounts(authGenState.Accounts) + if err != nil { + return fmt.Errorf("failed to get accounts from any: %w", err) + } + + if accs.Contains(addr) { + return fmt.Errorf("cannot add account at existing address %s", addr) + } + + // Add the new account to the set of genesis accounts and sanitize the + // accounts afterwards. + accs = append(accs, genAccount) + accs = authtypes.SanitizeGenesisAccounts(accs) + + genAccs, err := authtypes.PackAccounts(accs) + if err != nil { + return fmt.Errorf("failed to convert accounts into any's: %w", err) + } + authGenState.Accounts = genAccs + + authGenStateBz, err := clientCtx.Codec.MarshalJSON(&authGenState) + if err != nil { + return fmt.Errorf("failed to marshal auth genesis state: %w", err) + } + + appState[authtypes.ModuleName] = authGenStateBz + + bankGenState := banktypes.GetGenesisStateFromAppState(clientCtx.Codec, appState) + bankGenState.Balances = append(bankGenState.Balances, balances) + bankGenState.Balances = banktypes.SanitizeGenesisBalances(bankGenState.Balances) + bankGenState.Supply = bankGenState.Supply.Add(balances.Coins...) + + bankGenStateBz, err := clientCtx.Codec.MarshalJSON(bankGenState) + if err != nil { + return fmt.Errorf("failed to marshal bank genesis state: %w", err) + } + + appState[banktypes.ModuleName] = bankGenStateBz + + appStateJSON, err := json.Marshal(appState) + if err != nil { + return fmt.Errorf("failed to marshal application genesis state: %w", err) + } + + genDoc.AppState = appStateJSON + return genutil.ExportGenesisFile(genDoc, genFile) + }, + } + + cmd.Flags().String(flags.FlagHome, defaultNodeHome, "The application home directory") + cmd.Flags().String(flags.FlagKeyringBackend, flags.DefaultKeyringBackend, "Select keyring's backend (os|file|kwallet|pass|test)") + cmd.Flags().String(flagVestingAmt, "", "amount of coins for vesting accounts") + cmd.Flags().Int64(flagVestingStart, 0, "schedule start time (unix epoch) for vesting accounts") + cmd.Flags().Int64(flagVestingEnd, 0, "schedule end time (unix epoch) for vesting accounts") + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/cmd/interchain-security-sd/cmd/root.go b/cmd/interchain-security-sd/cmd/root.go new file mode 100644 index 0000000000..56f9ad667b --- /dev/null +++ b/cmd/interchain-security-sd/cmd/root.go @@ -0,0 +1,305 @@ +package cmd + +import ( + "errors" + "io" + "os" + "path/filepath" + + serverconfig "github.com/cosmos/cosmos-sdk/server/config" + "github.com/spf13/cast" + "github.com/spf13/cobra" + tmcli "github.com/tendermint/tendermint/libs/cli" + "github.com/tendermint/tendermint/libs/log" + dbm "github.com/tendermint/tm-db" + + "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/config" + "github.com/cosmos/cosmos-sdk/client/debug" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/keys" + "github.com/cosmos/cosmos-sdk/client/pruning" + "github.com/cosmos/cosmos-sdk/client/rpc" + "github.com/cosmos/cosmos-sdk/server" + servertypes "github.com/cosmos/cosmos-sdk/server/types" + "github.com/cosmos/cosmos-sdk/snapshots" + "github.com/cosmos/cosmos-sdk/store" + sdk "github.com/cosmos/cosmos-sdk/types" + authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" + "github.com/cosmos/cosmos-sdk/x/auth/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/cosmos/cosmos-sdk/x/crisis" + genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" + "github.com/cosmos/interchain-security/v2/app/params" + simapp "github.com/cosmos/interchain-security/v2/app/sovereign" +) + +// NewRootCmd creates a new root command for simd. It is called once in the +// main function. +func NewRootCmd() (*cobra.Command, params.EncodingConfig) { + encodingConfig := simapp.MakeTestEncodingConfig() + initClientCtx := client.Context{}. + WithCodec(encodingConfig.Marshaler). + WithInterfaceRegistry(encodingConfig.InterfaceRegistry). + WithTxConfig(encodingConfig.TxConfig). + WithLegacyAmino(encodingConfig.Amino). + WithInput(os.Stdin). + WithAccountRetriever(types.AccountRetriever{}). + WithHomeDir(simapp.DefaultNodeHome). + WithViper("") // In simapp, we don't use any prefix for env variables. + + rootCmd := &cobra.Command{ + Use: "interchain-security-sd", + Short: "simulation app", + PersistentPreRunE: func(cmd *cobra.Command, _ []string) error { + // set the default command outputs + cmd.SetOut(cmd.OutOrStdout()) + cmd.SetErr(cmd.ErrOrStderr()) + + initClientCtx, err := client.ReadPersistentCommandFlags(initClientCtx, cmd.Flags()) + if err != nil { + return err + } + + initClientCtx, err = config.ReadFromClientConfig(initClientCtx) + if err != nil { + return err + } + + if err := client.SetCmdClientContextHandler(initClientCtx, cmd); err != nil { + return err + } + + customAppTemplate, customAppConfig := initAppConfig() + + return server.InterceptConfigsPreRunHandler(cmd, customAppTemplate, customAppConfig) + }, + } + + initRootCmd(rootCmd, encodingConfig) + + return rootCmd, encodingConfig +} + +// initAppConfig helps to override default appConfig template and configs. +// return "", nil if no custom configuration is required for the application. +func initAppConfig() (string, interface{}) { + // The following code snippet is just for reference. + + // WASMConfig defines configuration for the wasm module. + type WASMConfig struct { + // This is the maximum sdk gas (wasm and storage) that we allow for any x/wasm "smart" queries + QueryGasLimit uint64 `mapstructure:"query_gas_limit"` + + // Address defines the gRPC-web server to listen on + LruSize uint64 `mapstructure:"lru_size"` + } + + type CustomAppConfig struct { + serverconfig.Config + + WASM WASMConfig `mapstructure:"wasm"` + } + + // Optionally allow the chain developer to overwrite the SDK's default + // server config. + srvCfg := serverconfig.DefaultConfig() + // The SDK's default minimum gas price is set to "" (empty value) inside + // app.toml. If left empty by validators, the node will halt on startup. + // However, the chain developer can set a default app.toml value for their + // validators here. + // + // In summary: + // - if you leave srvCfg.MinGasPrices = "", all validators MUST tweak their + // own app.toml config, + // - if you set srvCfg.MinGasPrices non-empty, validators CAN tweak their + // own app.toml to override, or use this default value. + // + // In simapp, we set the min gas prices to 0. + srvCfg.MinGasPrices = "0stake" + // srvCfg.BaseConfig.IAVLDisableFastNode = true // disable fastnode by default + + customAppConfig := CustomAppConfig{ + Config: *srvCfg, + WASM: WASMConfig{ + LruSize: 1, + QueryGasLimit: 300000, + }, + } + + customAppTemplate := serverconfig.DefaultConfigTemplate + ` +[wasm] +# This is the maximum sdk gas (wasm and storage) that we allow for any x/wasm "smart" queries +query_gas_limit = 300000 +# This is the number of wasm vm instances we keep cached in memory for speed-up +# Warning: this is currently unstable and may lead to crashes, best to keep for 0 unless testing locally +lru_size = 0` + + return customAppTemplate, customAppConfig +} + +func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) { + cfg := sdk.GetConfig() + cfg.Seal() + + a := appCreator{encodingConfig} + rootCmd.AddCommand( + genutilcli.InitCmd(simapp.ModuleBasics, simapp.DefaultNodeHome), + genutilcli.CollectGenTxsCmd(banktypes.GenesisBalancesIterator{}, simapp.DefaultNodeHome), + genutilcli.MigrateGenesisCmd(), + genutilcli.GenTxCmd(simapp.ModuleBasics, encodingConfig.TxConfig, banktypes.GenesisBalancesIterator{}, simapp.DefaultNodeHome), + genutilcli.ValidateGenesisCmd(simapp.ModuleBasics), + AddGenesisAccountCmd(simapp.DefaultNodeHome), + tmcli.NewCompletionCmd(rootCmd, true), + debug.Cmd(), + config.Cmd(), + pruning.PruningCmd(a.newApp), + ) + + server.AddCommands(rootCmd, simapp.DefaultNodeHome, a.newApp, a.appExport, addModuleInitFlags) + + // add keybase, auxiliary RPC, query, and tx child commands + rootCmd.AddCommand( + rpc.StatusCommand(), + queryCommand(), + txCommand(), + keys.Commands(simapp.DefaultNodeHome), + ) + + // add rosetta + rootCmd.AddCommand(server.RosettaCommand(encodingConfig.InterfaceRegistry, encodingConfig.Marshaler)) +} + +func addModuleInitFlags(startCmd *cobra.Command) { + crisis.AddModuleInitFlags(startCmd) +} + +func queryCommand() *cobra.Command { + cmd := &cobra.Command{ + Use: "query", + Aliases: []string{"q"}, + Short: "Querying subcommands", + DisableFlagParsing: true, + SuggestionsMinimumDistance: 2, + RunE: client.ValidateCmd, + } + + cmd.AddCommand( + authcmd.GetAccountCmd(), + rpc.ValidatorCommand(), + rpc.BlockCommand(), + authcmd.QueryTxsByEventsCmd(), + authcmd.QueryTxCmd(), + ) + + simapp.ModuleBasics.AddQueryCommands(cmd) + cmd.PersistentFlags().String(flags.FlagChainID, "", "The network chain ID") + + return cmd +} + +func txCommand() *cobra.Command { + cmd := &cobra.Command{ + Use: "tx", + Short: "Transactions subcommands", + DisableFlagParsing: true, + SuggestionsMinimumDistance: 2, + RunE: client.ValidateCmd, + } + + cmd.AddCommand( + authcmd.GetSignCommand(), + authcmd.GetSignBatchCommand(), + authcmd.GetMultiSignCommand(), + authcmd.GetMultiSignBatchCmd(), + authcmd.GetValidateSignaturesCommand(), + authcmd.GetBroadcastCommand(), + authcmd.GetEncodeCommand(), + authcmd.GetDecodeCommand(), + ) + + simapp.ModuleBasics.AddTxCommands(cmd) + cmd.PersistentFlags().String(flags.FlagChainID, "", "The network chain ID") + + return cmd +} + +type appCreator struct { + encCfg params.EncodingConfig +} + +// newApp is an appCreator +func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, appOpts servertypes.AppOptions) servertypes.Application { + var cache sdk.MultiStorePersistentCache + + if cast.ToBool(appOpts.Get(server.FlagInterBlockCache)) { + cache = store.NewCommitKVStoreCacheManager() + } + + skipUpgradeHeights := make(map[int64]bool) + for _, h := range cast.ToIntSlice(appOpts.Get(server.FlagUnsafeSkipUpgrades)) { + skipUpgradeHeights[int64(h)] = true + } + + pruningOpts, err := server.GetPruningOptionsFromFlags(appOpts) + if err != nil { + panic(err) + } + + snapshotDir := filepath.Join(cast.ToString(appOpts.Get(flags.FlagHome)), "data", "snapshots") + snapshotDB, err := sdk.NewLevelDB("metadata", snapshotDir) + if err != nil { + panic(err) + } + snapshotStore, err := snapshots.NewStore(snapshotDB, snapshotDir) + if err != nil { + panic(err) + } + + return simapp.New( + logger, db, traceStore, true, skipUpgradeHeights, + cast.ToString(appOpts.Get(flags.FlagHome)), + cast.ToUint(appOpts.Get(server.FlagInvCheckPeriod)), + a.encCfg, + appOpts, + baseapp.SetPruning(pruningOpts), + baseapp.SetMinGasPrices(cast.ToString(appOpts.Get(server.FlagMinGasPrices))), + baseapp.SetHaltHeight(cast.ToUint64(appOpts.Get(server.FlagHaltHeight))), + baseapp.SetHaltTime(cast.ToUint64(appOpts.Get(server.FlagHaltTime))), + baseapp.SetMinRetainBlocks(cast.ToUint64(appOpts.Get(server.FlagMinRetainBlocks))), + baseapp.SetInterBlockCache(cache), + baseapp.SetTrace(cast.ToBool(appOpts.Get(server.FlagTrace))), + baseapp.SetIndexEvents(cast.ToStringSlice(appOpts.Get(server.FlagIndexEvents))), + baseapp.SetSnapshotStore(snapshotStore), + baseapp.SetSnapshotInterval(cast.ToUint64(appOpts.Get(server.FlagStateSyncSnapshotInterval))), + baseapp.SetSnapshotKeepRecent(cast.ToUint32(appOpts.Get(server.FlagStateSyncSnapshotKeepRecent))), + baseapp.SetIAVLCacheSize(cast.ToInt(appOpts.Get(server.FlagIAVLCacheSize))), + baseapp.SetIAVLDisableFastNode(cast.ToBool(appOpts.Get(server.FlagDisableIAVLFastNode))), + ) +} + +// appExport creates a new simapp (optionally at a given height) +// and exports state. +func (a appCreator) appExport( + logger log.Logger, db dbm.DB, traceStore io.Writer, height int64, forZeroHeight bool, jailAllowedAddrs []string, + appOpts servertypes.AppOptions, +) (servertypes.ExportedApp, error) { + var simApp *simapp.App + homePath, ok := appOpts.Get(flags.FlagHome).(string) + if !ok || homePath == "" { + return servertypes.ExportedApp{}, errors.New("application home not set") + } + + if height != -1 { + simApp = simapp.New(logger, db, traceStore, false, map[int64]bool{}, homePath, uint(1), a.encCfg, appOpts) + + if err := simApp.LoadHeight(height); err != nil { + return servertypes.ExportedApp{}, err + } + } else { + simApp = simapp.New(logger, db, traceStore, true, map[int64]bool{}, homePath, uint(1), a.encCfg, appOpts) + } + + return simApp.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs) +} diff --git a/cmd/interchain-security-sd/main.go b/cmd/interchain-security-sd/main.go new file mode 100644 index 0000000000..6b43e7b396 --- /dev/null +++ b/cmd/interchain-security-sd/main.go @@ -0,0 +1,24 @@ +package main + +import ( + "os" + + "github.com/cosmos/cosmos-sdk/server" + svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" + app "github.com/cosmos/interchain-security/v2/app/sovereign" + "github.com/cosmos/interchain-security/v2/cmd/interchain-security-sd/cmd" +) + +func main() { + rootCmd, _ := cmd.NewRootCmd() + + if err := svrcmd.Execute(rootCmd, app.DefaultNodeHome); err != nil { + switch e := err.(type) { + case server.ErrorCode: + os.Exit(e.Code) + + default: + os.Exit(1) + } + } +} diff --git a/docs/docs/consumer-development/onboarding.md b/docs/docs/consumer-development/onboarding.md index faa2969e63..89c5f32dc5 100644 --- a/docs/docs/consumer-development/onboarding.md +++ b/docs/docs/consumer-development/onboarding.md @@ -91,6 +91,13 @@ Example of a consumer chain addition proposal. // 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. "historical_entries": 10000, + // The ID of a token transfer channel used for the Reward Distribution + // sub-protocol. If DistributionTransmissionChannel == "", a new transfer + // channel is created on top of the same connection as the CCV channel. + // Note that transfer_channel_id is the ID of the channel end on the consumer chain. + // it is most relevant for chains performing a sovereign to consumer changeover + // in order to maintan the existing ibc transfer channel + "distribution_transmission_channel": "channel-123" } ``` diff --git a/docs/docs/features/proposals.md b/docs/docs/features/proposals.md index 9285baa62b..a34160ecf4 100644 --- a/docs/docs/features/proposals.md +++ b/docs/docs/features/proposals.md @@ -43,6 +43,9 @@ Minimal example: "historical_entries": 10000, "genesis_hash": "d86d756e10118e66e6805e9cc476949da2e750098fcc7634fd0cc77f57a0b2b0", "binary_hash": "376cdbd3a222a3d5c730c9637454cd4dd925e2f9e2e0d0f3702fc922928583f1" + // relevant for chains performing a sovereign to consumer changeover + // in order to maintan the existing ibc transfer channel + "distribution_transmission_channel": "channel-123" } ``` More examples can be found in the replicated security testnet repository [here](https://github.com/cosmos/testnets/blob/master/replicated-security/baryon-1/proposal-baryon-1.json) and [here](https://github.com/cosmos/testnets/blob/master/replicated-security/noble-1/start-proposal-noble-1.json). diff --git a/proto/interchain_security/ccv/consumer/v1/genesis.proto b/proto/interchain_security/ccv/consumer/v1/genesis.proto index bf019879ac..578518086c 100644 --- a/proto/interchain_security/ccv/consumer/v1/genesis.proto +++ b/proto/interchain_security/ccv/consumer/v1/genesis.proto @@ -34,12 +34,12 @@ message GenesisState { // OutstandingDowntimes nil on new chain, filled in on restart. repeated OutstandingDowntime outstanding_downtime_slashing = 10 [ (gogoproto.nullable) = false ]; - // PendingConsumerPackets nil on new chain, filled in on restart. - interchain_security.ccv.v1.ConsumerPacketDataList pending_consumer_packets = 11 - [ (gogoproto.nullable) = false ]; + // PendingConsumerPackets nil on new chain, filled in on restart. + interchain_security.ccv.v1.ConsumerPacketDataList pending_consumer_packets = 11 + [ (gogoproto.nullable) = false ]; // LastTransmissionBlockHeight nil on new chain, filled in on restart. interchain_security.ccv.consumer.v1.LastTransmissionBlockHeight last_transmission_block_height = 12 - [ (gogoproto.nullable) = false ]; + [ (gogoproto.nullable) = false ]; bool preCCV = 13; // flag indicating whether the consumer CCV module starts in pre-CCV state } diff --git a/proto/interchain_security/ccv/provider/v1/provider.proto b/proto/interchain_security/ccv/provider/v1/provider.proto index 743d2c9c33..d190b3a6ca 100644 --- a/proto/interchain_security/ccv/provider/v1/provider.proto +++ b/proto/interchain_security/ccv/provider/v1/provider.proto @@ -62,6 +62,13 @@ message ConsumerAdditionProposal { // 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 = 13; + // The ID of a token transfer channel used for the Reward Distribution + // sub-protocol. If DistributionTransmissionChannel == "", a new transfer + // channel is created on top of the same connection as the CCV channel. + // Note that transfer_channel_id is the ID of the channel end on the consumer chain. + // it is most relevant for chains performing a sovereign to consumer changeover + // in order to maintan the existing ibc transfer channel + string distribution_transmission_channel = 14; } // ConsumerRemovalProposal is a governance proposal on the provider chain to remove (and stop) a consumer chain. diff --git a/tests/e2e/actions.go b/tests/e2e/actions.go index b1e6863b7a..06bcb7f5f7 100644 --- a/tests/e2e/actions.go +++ b/tests/e2e/actions.go @@ -209,12 +209,14 @@ func (tr TestRun) submitTextProposal( } type submitConsumerAdditionProposalAction struct { - chain chainID - from validatorID - deposit uint - consumerChain chainID - spawnTime uint - initialHeight clienttypes.Height + preCCV bool + chain chainID + from validatorID + deposit uint + consumerChain chainID + spawnTime uint + initialHeight clienttypes.Height + distributionChannel string } func (tr TestRun) submitConsumerAdditionProposal( @@ -238,6 +240,7 @@ func (tr TestRun) submitConsumerAdditionProposal( TransferTimeoutPeriod: params.TransferTimeoutPeriod, UnbondingPeriod: params.UnbondingPeriod, Deposit: fmt.Sprint(action.deposit) + `stake`, + DistributionTransmissionChannel: action.distributionChannel, } bz, err := json.Marshal(prop) @@ -565,6 +568,133 @@ func (tr TestRun) startConsumerChain( }, verbose) } +type ChangeoverChainAction struct { + sovereignChain chainID + providerChain chainID + validators []StartChainValidator + genesisChanges string +} + +func (tr TestRun) changeoverChain( + action ChangeoverChainAction, + verbose bool, +) { + // sleep until the consumer chain genesis is ready on consumer + time.Sleep(5 * time.Second) + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. + cmd := exec.Command("docker", "exec", tr.containerConfig.instanceName, tr.chainConfigs[action.providerChain].binaryName, + + "query", "provider", "consumer-genesis", + string(tr.chainConfigs[action.sovereignChain].chainId), + + `--node`, tr.getQueryNode(action.providerChain), + `-o`, `json`, + ) + + if verbose { + log.Println("changeoverChain cmd: ", cmd.String()) + } + + bz, err := cmd.CombinedOutput() + if err != nil { + log.Fatal(err, "\n", string(bz)) + } + + consumerGenesis := ".app_state.ccvconsumer = " + string(bz) + consumerGenesisChanges := tr.chainConfigs[action.sovereignChain].genesisChanges + if consumerGenesisChanges != "" { + consumerGenesis = consumerGenesis + " | " + consumerGenesisChanges + " | " + action.genesisChanges + } + + tr.startChangeover(ChangeoverChainAction{ + validators: action.validators, + genesisChanges: consumerGenesis, + }, verbose) +} + +func (tr TestRun) startChangeover( + action ChangeoverChainAction, + verbose bool, +) { + chainConfig := tr.chainConfigs[chainID("sover")] + type jsonValAttrs struct { + Mnemonic string `json:"mnemonic"` + Allocation string `json:"allocation"` + Stake string `json:"stake"` + ValId string `json:"val_id"` + PrivValidatorKey string `json:"priv_validator_key"` + NodeKey string `json:"node_key"` + IpSuffix string `json:"ip_suffix"` + + ConsumerMnemonic string `json:"consumer_mnemonic"` + ConsumerPrivValidatorKey string `json:"consumer_priv_validator_key"` + StartWithConsumerKey bool `json:"start_with_consumer_key"` + } + + var validators []jsonValAttrs + for _, val := range action.validators { + validators = append(validators, jsonValAttrs{ + Mnemonic: tr.validatorConfigs[val.id].mnemonic, + NodeKey: tr.validatorConfigs[val.id].nodeKey, + ValId: fmt.Sprint(val.id), + PrivValidatorKey: tr.validatorConfigs[val.id].privValidatorKey, + Allocation: fmt.Sprint(val.allocation) + "stake", + Stake: fmt.Sprint(val.stake) + "stake", + IpSuffix: tr.validatorConfigs[val.id].ipSuffix, + + ConsumerMnemonic: tr.validatorConfigs[val.id].consumerMnemonic, + ConsumerPrivValidatorKey: tr.validatorConfigs[val.id].consumerPrivValidatorKey, + // if true node will be started with consumer key for each consumer chain + StartWithConsumerKey: tr.validatorConfigs[val.id].useConsumerKey, + }) + } + + vals, err := json.Marshal(validators) + if err != nil { + log.Fatal(err) + } + + // Concat genesis changes defined in chain config, with any custom genesis changes for this chain instantiation + var genesisChanges string + if action.genesisChanges != "" { + genesisChanges = chainConfig.genesisChanges + " | " + action.genesisChanges + } else { + genesisChanges = chainConfig.genesisChanges + } + + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. + cmd := exec.Command("docker", "exec", tr.containerConfig.instanceName, "/bin/bash", + "/testnet-scripts/start-changeover.sh", chainConfig.upgradeBinary, string(vals), + "sover", chainConfig.ipPrefix, genesisChanges, + tr.tendermintConfigOverride, + ) + + cmdReader, err := cmd.StdoutPipe() + if err != nil { + log.Fatal(err) + } + cmd.Stderr = cmd.Stdout + + if err := cmd.Start(); err != nil { + log.Fatal(err) + } + + scanner := bufio.NewScanner(cmdReader) + + for scanner.Scan() { + out := scanner.Text() + if verbose { + fmt.Println("startChangeover: " + out) + } + if out == done { + break + } + } + if err := scanner.Err(); err != nil { + log.Fatal("startChangeover died", err) + } +} + type addChainToRelayerAction struct { chain chainID validator validatorID @@ -683,6 +813,7 @@ func (tr TestRun) addChainToHermes( keyName, rpcAddr, wsAddr, + // action.consumer, ) bashCommand := fmt.Sprintf(`echo '%s' >> %s`, chainConfig, "/root/.hermes/config.toml") @@ -805,6 +936,51 @@ func (tr TestRun) addIbcConnectionGorelayer( tr.waitBlocks(action.chainB, 1, 10*time.Second) } +type createIbcClientsAction struct { + chainA chainID + chainB chainID +} + +// if clients are not provided hermes will first +// create new clients and then a new connection +// otherwise, it would use client provided as CLI argument (-a-client) +func (tr TestRun) createIbcClientsHermes( + action createIbcClientsAction, + verbose bool, +) { + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. + cmd := exec.Command("docker", "exec", tr.containerConfig.instanceName, "hermes", + "create", "connection", + "--a-chain", string(tr.chainConfigs[action.chainA].chainId), + "--b-chain", string(tr.chainConfigs[action.chainB].chainId), + ) + + cmdReader, err := cmd.StdoutPipe() + if err != nil { + log.Fatal(err) + } + cmd.Stderr = cmd.Stdout + + if err := cmd.Start(); err != nil { + log.Fatal(err) + } + + scanner := bufio.NewScanner(cmdReader) + + for scanner.Scan() { + out := scanner.Text() + if verbose { + fmt.Println("createIbcClientsHermes: " + out) + } + if out == done { + break + } + } + if err := scanner.Err(); err != nil { + log.Fatal(err) + } +} + func (tr TestRun) addIbcConnectionHermes( action addIbcConnectionAction, verbose bool, @@ -850,6 +1026,7 @@ type addIbcChannelAction struct { portA string portB string order string + version string } type startRelayerAction struct{} @@ -936,6 +1113,13 @@ func (tr TestRun) addIbcChannelHermes( action addIbcChannelAction, verbose bool, ) { + // if version is not specified, use the default version when creating ccv connections + // otherwise, use the provided version schema (usually it is ICS20-1 for IBC transfer) + chanVersion := action.version + if chanVersion == "" { + chanVersion = tr.containerConfig.ccvVersion + } + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. cmd := exec.Command("docker", "exec", tr.containerConfig.instanceName, "hermes", "create", "channel", @@ -943,7 +1127,7 @@ func (tr TestRun) addIbcChannelHermes( "--a-connection", "connection-"+fmt.Sprint(action.connectionA), "--a-port", action.portA, "--b-port", action.portB, - "--channel-version", tr.containerConfig.ccvVersion, + "--channel-version", chanVersion, "--order", action.order, ) diff --git a/tests/e2e/actions_sovereign_chain.go b/tests/e2e/actions_sovereign_chain.go new file mode 100644 index 0000000000..c61a2a9a38 --- /dev/null +++ b/tests/e2e/actions_sovereign_chain.go @@ -0,0 +1,166 @@ +package main + +import ( + "bufio" + "encoding/json" + "fmt" + "log" + "os/exec" + "time" +) + +type StartSovereignChainAction struct { + chain chainID + validators []StartChainValidator + // Genesis changes specific to this action, appended to genesis changes defined in chain config + genesisChanges string +} + +// calls a simplified startup script (start-sovereign.sh) and runs a validator node +// upgrades are simpler with a single validator node since only one node needs to be upgraded +func (tr TestRun) startSovereignChain( + action StartSovereignChainAction, + verbose bool, +) { + chainConfig := tr.chainConfigs["sover"] + type jsonValAttrs struct { + Mnemonic string `json:"mnemonic"` + Allocation string `json:"allocation"` + Stake string `json:"stake"` + ValId string `json:"val_id"` + PrivValidatorKey string `json:"priv_validator_key"` + NodeKey string `json:"node_key"` + IpSuffix string `json:"ip_suffix"` + + ConsumerMnemonic string `json:"consumer_mnemonic"` + ConsumerPrivValidatorKey string `json:"consumer_priv_validator_key"` + StartWithConsumerKey bool `json:"start_with_consumer_key"` + } + + var validators []jsonValAttrs + for _, val := range action.validators { + validators = append(validators, jsonValAttrs{ + Mnemonic: tr.validatorConfigs[val.id].mnemonic, + NodeKey: tr.validatorConfigs[val.id].nodeKey, + ValId: fmt.Sprint(val.id), + PrivValidatorKey: tr.validatorConfigs[val.id].privValidatorKey, + Allocation: fmt.Sprint(val.allocation) + "stake", + Stake: fmt.Sprint(val.stake) + "stake", + IpSuffix: tr.validatorConfigs[val.id].ipSuffix, + + ConsumerMnemonic: tr.validatorConfigs[val.id].consumerMnemonic, + ConsumerPrivValidatorKey: tr.validatorConfigs[val.id].consumerPrivValidatorKey, + // if true node will be started with consumer key for each consumer chain + StartWithConsumerKey: tr.validatorConfigs[val.id].useConsumerKey, + }) + } + + vals, err := json.Marshal(validators) + if err != nil { + log.Fatal(err) + } + + // Concat genesis changes defined in chain config, with any custom genesis changes for this chain instantiation + var genesisChanges string + if action.genesisChanges != "" { + genesisChanges = chainConfig.genesisChanges + " | " + action.genesisChanges + } else { + genesisChanges = chainConfig.genesisChanges + } + + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. + cmd := exec.Command("docker", "exec", tr.containerConfig.instanceName, "/bin/bash", + "/testnet-scripts/start-sovereign.sh", chainConfig.binaryName, string(vals), + string(chainConfig.chainId), chainConfig.ipPrefix, genesisChanges, + tr.tendermintConfigOverride, + ) + + cmdReader, err := cmd.StdoutPipe() + if err != nil { + log.Fatal(err) + } + cmd.Stderr = cmd.Stdout + + if err := cmd.Start(); err != nil { + log.Fatal(err) + } + + scanner := bufio.NewScanner(cmdReader) + + for scanner.Scan() { + out := scanner.Text() + if verbose { + fmt.Println("startSovereignChain: " + out) + } + if out == done { + break + } + } + if err := scanner.Err(); err != nil { + log.Fatal(err) + } + tr.addChainToRelayer(addChainToRelayerAction{ + chain: action.chain, + validator: action.validators[0].id, + }, verbose) +} + +type UpgradeProposalAction struct { + chainID chainID + upgradeTitle string + proposer validatorID + upgradeHeight uint64 +} + +func (tr *TestRun) submitUpgradeProposal(action UpgradeProposalAction, verbose bool) { + submit := fmt.Sprintf( + `%s tx gov submit-proposal software-upgrade %s \ + --title %s \ + --deposit 10000000stake \ + --upgrade-height %s \ + --upgrade-info "perform changeover" \ + --description "perform changeover" \ + --gas 900000 \ + --from validator%s \ + --keyring-backend test \ + --chain-id %s \ + --home %s \ + --node %s \ + -b block \ + -y`, + tr.chainConfigs[chainID("sover")].binaryName, + action.upgradeTitle, + action.upgradeTitle, + fmt.Sprint(action.upgradeHeight), + action.proposer, + tr.chainConfigs[chainID("sover")].chainId, + tr.getValidatorHome(chainID("sover"), action.proposer), + tr.getValidatorNode(chainID("sover"), action.proposer), + ) + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. + cmd := exec.Command("docker", "exec", + tr.containerConfig.instanceName, + "/bin/bash", "-c", + submit, + ) + + if verbose { + fmt.Println("submitUpgradeProposal cmd:", cmd.String()) + } + + bz, err := cmd.CombinedOutput() + if err != nil { + log.Fatal(err, "\n", string(bz)) + } +} + +type waitUntilBlockAction struct { + block uint + chain chainID +} + +func (tr *TestRun) waitUntilBlockOnChain(action waitUntilBlockAction) { + fmt.Println("waitUntilBlockOnChain is waiting for block:", action.block) + tr.waitUntilBlock(action.chain, action.block, 120*time.Second) + fmt.Println("waitUntilBlockOnChain done waiting for block:", action.block) +} diff --git a/tests/e2e/config.go b/tests/e2e/config.go index cc755cb97a..3038f69f4e 100644 --- a/tests/e2e/config.go +++ b/tests/e2e/config.go @@ -47,6 +47,9 @@ type ChainConfig struct { // Example: ".app_state.gov.voting_params.voting_period = \"5s\" | .app_state.slashing.params.signed_blocks_window = \"2\" | .app_state.slashing.params.min_signed_per_window = \"0.500000000000000000\"" genesisChanges string binaryName string + + // binary to use after upgrade height + upgradeBinary string } type ContainerConfig struct { @@ -328,6 +331,51 @@ func MultiConsumerTestRun() TestRun { } } +func ChangeoverTestRun() TestRun { + return TestRun{ + name: "changeover", + containerConfig: ContainerConfig{ + containerName: "interchain-security-changeover-container", + instanceName: "interchain-security-changeover-instance", + ccvVersion: "1", + now: time.Now(), + }, + validatorConfigs: getDefaultValidators(), + chainConfigs: map[chainID]ChainConfig{ + chainID("provi"): { + chainId: chainID("provi"), + binaryName: "interchain-security-pd", + ipPrefix: "7.7.7", + votingWaitTime: 20, + genesisChanges: ".app_state.gov.voting_params.voting_period = \"20s\" | " + + // Custom slashing parameters for testing validator downtime functionality + // See https://docs.cosmos.network/main/modules/slashing/04_begin_block.html#uptime-tracking + ".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 = \"2s\" | " + + ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\" | " + + ".app_state.provider.params.slash_meter_replenish_fraction = \"1.0\" | " + // This disables slash packet throttling + ".app_state.provider.params.slash_meter_replenish_period = \"3s\"", + }, + chainID("sover"): { + chainId: chainID("sover"), + binaryName: "interchain-security-sd", + upgradeBinary: "interchain-security-cdd", + ipPrefix: "7.7.8", + votingWaitTime: 20, + genesisChanges: ".app_state.gov.voting_params.voting_period = \"20s\" | " + + ".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 = \"2s\" | " + + ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\" | " + + ".app_state.staking.params.unbonding_time = \"1728000s\"", // making the genesis unbonding time equal to unbonding time in the consumer addition proposal + }, + }, + tendermintConfigOverride: `s/timeout_commit = "5s"/timeout_commit = "1s"/;` + + `s/peer_gossip_sleep_duration = "100ms"/peer_gossip_sleep_duration = "50ms"/;`, + } +} + func (s *TestRun) SetDockerConfig(localSdkPath string, useGaia bool, gaiaTag string) { if localSdkPath != "" { fmt.Println("USING LOCAL SDK", localSdkPath) diff --git a/tests/e2e/main.go b/tests/e2e/main.go index 141f8a8cd8..737a318de2 100644 --- a/tests/e2e/main.go +++ b/tests/e2e/main.go @@ -57,6 +57,7 @@ func main() { } testRuns := []testRunWithSteps{ + {ChangeoverTestRun(), changeoverSteps}, {DefaultTestRun(), happyPathSteps}, {DemocracyTestRun(true), democracySteps}, {DemocracyTestRun(false), rewardDenomConsumerSteps}, @@ -112,6 +113,14 @@ func (tr *TestRun) runStep(step Step, verbose bool) { switch action := step.action.(type) { case StartChainAction: tr.startChain(action, verbose) + case StartSovereignChainAction: + tr.startSovereignChain(action, verbose) + case UpgradeProposalAction: + tr.submitUpgradeProposal(action, verbose) + case waitUntilBlockAction: + tr.waitUntilBlockOnChain(action) + case ChangeoverChainAction: + tr.changeoverChain(action, verbose) case SendTokensAction: tr.sendTokens(action, verbose) case submitTextProposalAction: @@ -130,6 +139,8 @@ func (tr *TestRun) runStep(step Step, verbose bool) { tr.startConsumerChain(action, verbose) case addChainToRelayerAction: tr.addChainToRelayer(action, verbose) + case createIbcClientsAction: + tr.createIbcClientsHermes(action, verbose) case addIbcConnectionAction: tr.addIbcConnection(action, verbose) case addIbcChannelAction: diff --git a/tests/e2e/state.go b/tests/e2e/state.go index 9127c65df8..15500dd01f 100644 --- a/tests/e2e/state.go +++ b/tests/e2e/state.go @@ -50,6 +50,17 @@ type ConsumerAdditionProposal struct { Status string } +type UpgradeProposal struct { + Title string + Description string + UpgradeHeight uint64 + Type string + Deposit uint + Status string +} + +func (p UpgradeProposal) isProposal() {} + func (p ConsumerAdditionProposal) isProposal() {} type ConsumerRemovalProposal struct { @@ -214,6 +225,20 @@ func (tr TestRun) waitBlocks(chain chainID, blocks uint, timeout time.Duration) } } +func (tr TestRun) waitUntilBlock(chain chainID, block uint, timeout time.Duration) { + start := time.Now() + for { + thisBlock := tr.getBlockHeight(chain) + if thisBlock >= block { + return + } + if time.Since(start) > timeout { + panic(fmt.Sprintf("\n\n\nwaitBlocks method has timed out after: %s\n\n", timeout)) + } + time.Sleep(500 * time.Millisecond) + } +} + func (tr TestRun) getBalances(chain chainID, modelState map[validatorID]uint) map[validatorID]uint { actualState := map[validatorID]uint{} for k := range modelState { @@ -390,6 +415,16 @@ func (tr TestRun) getProposal(chain chainID, proposal uint) Proposal { RevisionHeight: gjson.Get(string(bz), `content.initial_height.revision_height`).Uint(), }, } + case "/cosmos.upgrade.v1beta1.SoftwareUpgradeProposal": + height := gjson.Get(string(bz), `content.plan.height`).Uint() + title := gjson.Get(string(bz), `content.plan.name`).String() + return UpgradeProposal{ + Deposit: uint(deposit), + Status: status, + UpgradeHeight: height, + Title: title, + Type: "/cosmos.upgrade.v1beta1.SoftwareUpgradeProposal", + } case "/interchain_security.ccv.provider.v1.ConsumerRemovalProposal": chainId := gjson.Get(string(bz), `content.chain_id`).String() stopTime := gjson.Get(string(bz), `content.stop_time`).Time().Sub(tr.containerConfig.now) @@ -691,7 +726,14 @@ func (tr TestRun) getQueryNode(chain chainID) string { } // getQueryNodeIP returns query node IP for chain, -// ipSuffix is hardcoded to be 253 on all query nodes. +// ipSuffix is hardcoded to be 253 on all query nodes +// except for "sover" chain where there's only one node func (tr TestRun) getQueryNodeIP(chain chainID) string { + if chain == chainID("sover") { + // return address of first and only validator + return fmt.Sprintf("%s.%s", + tr.chainConfigs[chain].ipPrefix, + tr.validatorConfigs[validatorID("alice")].ipSuffix) + } return fmt.Sprintf("%s.253", tr.chainConfigs[chain].ipPrefix) } diff --git a/tests/e2e/steps.go b/tests/e2e/steps.go index 8c0b4b2661..7613b05558 100644 --- a/tests/e2e/steps.go +++ b/tests/e2e/steps.go @@ -72,3 +72,18 @@ var multipleConsumers = concatSteps( stepsMultiConsumerDowntimeFromProvider("consu", "densu"), stepsMultiConsumerDoubleSign("consu", "densu"), // double sign on one of the chains ) + +var changeoverSteps = concatSteps( + // start sovereign chain and test delegation operation + + stepRunSovereignChain(), + stepStartProviderChain(), + stepsSovereignTransferChan(), + + // the chain will halt once upgrade height is reached + // after upgrade height is reached, the chain will become a consumer + stepsUpgradeChain(), + stepsChangeoverToConsumer("sover"), + + stepsPostChangeoverDelegate("sover"), +) diff --git a/tests/e2e/steps_sovereign_changeover.go b/tests/e2e/steps_sovereign_changeover.go new file mode 100644 index 0000000000..e122c1fb2a --- /dev/null +++ b/tests/e2e/steps_sovereign_changeover.go @@ -0,0 +1,367 @@ +package main + +import clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" + +// this creates new clients on both chains and a connection (connection-0) between them +// connection-0 is used to create a transfer channel between the chains +// the transfer channel is maintained during the changeover process, meaning that +// the consumer chain will be able to send rewards to the provider chain using the old channel +// as opposed to creating a new transfer channel which happens for new consumers +func stepsSovereignTransferChan() []Step { + return []Step{ + { + action: createIbcClientsAction{ + chainA: chainID("sover"), + chainB: chainID("provi"), + }, + state: State{}, + }, + { + // this will create channel-0 connection end on both chain + action: addIbcChannelAction{ + chainA: chainID("sover"), + chainB: chainID("provi"), + connectionA: 0, + portA: "transfer", + portB: "transfer", + order: "unordered", + version: "ics20-1", + }, + state: State{}, + }, + } +} + +// steps to convert sovereign to consumer chain +func stepsChangeoverToConsumer(consumerName string) []Step { + s := []Step{ + { + action: submitConsumerAdditionProposalAction{ + preCCV: true, + chain: chainID("provi"), + from: validatorID("alice"), + deposit: 10000001, + consumerChain: chainID(consumerName), + // chain-0 is the transfer channelID that gets created in stepsSovereignTransferChan + // the consumer chain will use this channel to send rewards to the provider chain + // there is no need to create a new channel for rewards distribution + distributionChannel: "channel-0", + spawnTime: 0, + initialHeight: clienttypes.Height{RevisionNumber: 0, RevisionHeight: 111}, // 1 block after upgrade !important + }, + state: State{ + chainID("provi"): ChainState{ + ValBalances: &map[validatorID]uint{ + validatorID("alice"): 9489999999, + validatorID("bob"): 9500000000, + }, + Proposals: &map[uint]Proposal{ + 1: ConsumerAdditionProposal{ + Deposit: 10000001, + Chain: chainID(consumerName), + SpawnTime: 0, + InitialHeight: clienttypes.Height{RevisionNumber: 0, RevisionHeight: 111}, + Status: "PROPOSAL_STATUS_VOTING_PERIOD", + }, + }, + }, + }, + }, + { + action: voteGovProposalAction{ + chain: chainID("provi"), + from: []validatorID{validatorID("alice"), validatorID("bob"), validatorID("carol")}, + vote: []string{"yes", "yes", "yes"}, + propNumber: 1, + }, + state: State{ + chainID("provi"): ChainState{ + Proposals: &map[uint]Proposal{ + 1: ConsumerAdditionProposal{ + Deposit: 10000001, + Chain: chainID(consumerName), + SpawnTime: 0, + InitialHeight: clienttypes.Height{RevisionNumber: 0, RevisionHeight: 111}, + Status: "PROPOSAL_STATUS_PASSED", + }, + }, + ValBalances: &map[validatorID]uint{ + validatorID("alice"): 9500000000, + validatorID("bob"): 9500000000, + }, + }, + }, + }, + { + action: ChangeoverChainAction{ + sovereignChain: chainID(consumerName), + providerChain: chainID("provi"), + validators: []StartChainValidator{ + {id: validatorID("alice"), stake: 500000000, allocation: 10000000000}, + {id: validatorID("bob"), stake: 500000000, allocation: 10000000000}, + {id: validatorID("carol"), stake: 500000000, allocation: 10000000000}, + }, + genesisChanges: ".app_state.ccvconsumer.params.soft_opt_out_threshold = \"0.05\"", + }, + state: State{ + chainID("provi"): ChainState{ + ValPowers: &map[validatorID]uint{ + validatorID("alice"): 500, + validatorID("bob"): 500, + validatorID("carol"): 500, + }, + }, + chainID(consumerName): ChainState{ + ValPowers: &map[validatorID]uint{ + // uses val powers from consumer + validatorID("alice"): 500, + validatorID("bob"): 500, + validatorID("carol"): 500, + }, + }, + }, + }, + { + action: addIbcConnectionAction{ + chainA: chainID(consumerName), + chainB: chainID("provi"), + clientA: 1, + clientB: 1, + }, + state: State{}, + }, + { + action: addIbcChannelAction{ + chainA: chainID(consumerName), + chainB: chainID("provi"), + connectionA: 1, + portA: "consumer", + portB: "provider", + order: "ordered", + }, + state: State{}, + }, + } + + return s +} + +// start sovereign chain with a single validator so it is easier to manage +// when the chain is converted to a consumer chain the validators from the +// consumer chain will be used +// validatoralice is the only validator on the sovereign chain that is in both +// sovereign validator set and consumer validator set +func stepRunSovereignChain() []Step { + return []Step{ + { + action: StartSovereignChainAction{ + chain: chainID("sover"), + validators: []StartChainValidator{ + {id: validatorID("alice"), stake: 500000000, allocation: 10000000000}, + }, + }, + state: State{ + chainID("sover"): ChainState{ + ValBalances: &map[validatorID]uint{ + validatorID("alice"): 9500000000, + }, + }, + }, + }, + { + action: delegateTokensAction{ + chain: chainID("sover"), + from: validatorID("alice"), + to: validatorID("alice"), + amount: 11000000, + }, + state: State{ + chainID("sover"): ChainState{ + ValPowers: &map[validatorID]uint{ + validatorID("alice"): 511, + validatorID("bob"): 0, // does not exist on pre-ccv sover + validatorID("carol"): 0, // does not exist on pre-ccv sover + }, + }, + }, + }, + } +} + +// TODO: use args instead of hardcoding +func stepsUpgradeChain() []Step { + return []Step{ + { + action: UpgradeProposalAction{ + chainID: chainID("sover"), + upgradeTitle: "sovereign-changeover", + proposer: validatorID("alice"), + upgradeHeight: 110, + }, + state: State{ + chainID("sover"): ChainState{ + Proposals: &map[uint]Proposal{ + 1: UpgradeProposal{ + Title: "sovereign-changeover", + UpgradeHeight: 110, + Type: "/cosmos.upgrade.v1beta1.SoftwareUpgradeProposal", + Deposit: 10000000, + Status: "PROPOSAL_STATUS_VOTING_PERIOD", + }, + }, + }, + }, + }, + { + action: voteGovProposalAction{ + chain: chainID("sover"), + from: []validatorID{validatorID("alice")}, + vote: []string{"yes"}, + propNumber: 1, + }, + state: State{ + chainID("sover"): ChainState{ + Proposals: &map[uint]Proposal{ + 1: UpgradeProposal{ + Deposit: 10000000, + UpgradeHeight: 110, + Title: "sovereign-changeover", + Type: "/cosmos.upgrade.v1beta1.SoftwareUpgradeProposal", + Status: "PROPOSAL_STATUS_PASSED", + }, + }, + }, + }, + }, + { + action: waitUntilBlockAction{ + chain: chainID("sover"), + block: 110, + }, + state: State{}, + }, + } +} + +// stepsPostChangeoverDelegate tests basic delegation and resulting validator power changes after changeover +// we cannot use stepsDelegate and stepsUnbond because they make assumptions about which connection to use +// here we need to use connection-1, and in tests with new consumers connection-0 is used because the chain is new (has no IBC states prior to launch) +func stepsPostChangeoverDelegate(consumerName string) []Step { + return []Step{ + { + action: SendTokensAction{ + chain: chainID(consumerName), + from: validatorID("alice"), + to: validatorID("bob"), + amount: 100, + }, + state: State{ + chainID(consumerName): ChainState{ + // Tx should not go through, ICS channel is not setup until first VSC packet has been relayed to consumer + ValBalances: &map[validatorID]uint{ + validatorID("bob"): 0, + }, + }, + }, + }, + { + action: delegateTokensAction{ + chain: chainID("provi"), + from: validatorID("alice"), + to: validatorID("alice"), + amount: 11000000, + }, + state: State{ + chainID("provi"): ChainState{ + ValPowers: &map[validatorID]uint{ + validatorID("alice"): 511, + validatorID("bob"): 500, + validatorID("carol"): 500, + }, + }, + chainID(consumerName): ChainState{ + ValPowers: &map[validatorID]uint{ + validatorID("alice"): 500, + validatorID("bob"): 500, + validatorID("carol"): 500, + }, + }, + }, + }, + { + action: relayPacketsAction{ + chainA: chainID("provi"), + chainB: chainID(consumerName), + port: "provider", + channel: 1, + }, + state: State{ + chainID(consumerName): ChainState{ + ValPowers: &map[validatorID]uint{ + validatorID("alice"): 511, + validatorID("bob"): 500, + validatorID("carol"): 500, + }, + }, + }, + }, + { + action: SendTokensAction{ + chain: chainID(consumerName), + from: validatorID("alice"), + to: validatorID("bob"), + amount: 100, + }, + state: State{ + chainID(consumerName): ChainState{ + // Tx should go through, ICS channel is setup + ValBalances: &map[validatorID]uint{ + validatorID("bob"): 100, + }, + }, + }, + }, + { + action: unbondTokensAction{ + chain: chainID("provi"), + unbondFrom: validatorID("alice"), + sender: validatorID("alice"), + amount: 1000000, + }, + state: State{ + chainID("provi"): ChainState{ + ValPowers: &map[validatorID]uint{ + validatorID("alice"): 510, + validatorID("bob"): 500, + validatorID("carol"): 500, + }, + }, + chainID(consumerName): ChainState{ + ValPowers: &map[validatorID]uint{ + // Voting power on consumer should not be affected yet + validatorID("alice"): 511, + validatorID("bob"): 500, + validatorID("carol"): 500, + }, + }, + }, + }, + { + action: relayPacketsAction{ + chainA: chainID("provi"), + chainB: chainID(consumerName), + port: "provider", + channel: 1, + }, + state: State{ + chainID(consumerName): ChainState{ + ValPowers: &map[validatorID]uint{ + validatorID("alice"): 510, + validatorID("bob"): 500, + validatorID("carol"): 500, + }, + }, + }, + }, + } +} diff --git a/tests/e2e/testnet-scripts/sovereign-genesis.json b/tests/e2e/testnet-scripts/sovereign-genesis.json new file mode 100644 index 0000000000..94a279840e --- /dev/null +++ b/tests/e2e/testnet-scripts/sovereign-genesis.json @@ -0,0 +1,279 @@ +{ + "genesis_time": "2023-06-13T11:19:05.998449459Z", + "chain_id": "sover", + "initial_height": "1", + "consensus_params": { + "block": { + "max_bytes": "22020096", + "max_gas": "-1", + "time_iota_ms": "1000" + }, + "evidence": { + "max_age_num_blocks": "100000", + "max_age_duration": "172800000000000", + "max_bytes": "1048576" + }, + "validator": { + "pub_key_types": [ + "ed25519" + ] + }, + "version": {} + }, + "app_hash": "", + "app_state": { + "auth": { + "params": { + "max_memo_characters": "256", + "tx_sig_limit": "7", + "tx_size_cost_per_byte": "10", + "sig_verify_cost_ed25519": "590", + "sig_verify_cost_secp256k1": "1000" + }, + "accounts": [ + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "cosmos19pe9pg5dv9k5fzgzmsrgnw9rl9asf7ddwhu7lm", + "pub_key": null, + "account_number": "0", + "sequence": "0" + } + ] + }, + "authz": { + "authorization": [] + }, + "bank": { + "params": { + "send_enabled": [], + "default_send_enabled": true + }, + "balances": [ + { + "address": "cosmos19pe9pg5dv9k5fzgzmsrgnw9rl9asf7ddwhu7lm", + "coins": [ + { + "denom": "stake", + "amount": "10000000000" + } + ] + } + ], + "supply": [ + { + "denom": "stake", + "amount": "10000000000" + } + ], + "denom_metadata": [] + }, + "capability": { + "index": "1", + "owners": [] + }, + "crisis": { + "constant_fee": { + "denom": "stake", + "amount": "1000" + } + }, + "distribution": { + "params": { + "community_tax": "0.020000000000000000", + "base_proposer_reward": "0.010000000000000000", + "bonus_proposer_reward": "0.040000000000000000", + "withdraw_addr_enabled": true + }, + "fee_pool": { + "community_pool": [] + }, + "delegator_withdraw_infos": [], + "previous_proposer": "", + "outstanding_rewards": [], + "validator_accumulated_commissions": [], + "validator_historical_rewards": [], + "validator_current_rewards": [], + "delegator_starting_infos": [], + "validator_slash_events": [] + }, + "evidence": { + "evidence": [] + }, + "feegrant": { + "allowances": [] + }, + "genutil": { + "gen_txs": [ + { + "body": { + "messages": [ + { + "@type": "/cosmos.staking.v1beta1.MsgCreateValidator", + "description": { + "moniker": "validatoralice", + "identity": "", + "website": "", + "security_contact": "", + "details": "" + }, + "commission": { + "rate": "0.100000000000000000", + "max_rate": "0.200000000000000000", + "max_change_rate": "0.010000000000000000" + }, + "min_self_delegation": "1", + "delegator_address": "cosmos19pe9pg5dv9k5fzgzmsrgnw9rl9asf7ddwhu7lm", + "validator_address": "cosmosvaloper19pe9pg5dv9k5fzgzmsrgnw9rl9asf7ddtrgtng", + "pubkey": { + "@type": "/cosmos.crypto.ed25519.PubKey", + "key": "RrclQz9bIhkIy/gfL485g3PYMeiIku4qeo495787X10=" + }, + "value": { + "denom": "stake", + "amount": "500000000" + } + } + ], + "memo": "8339e14baab81c2a2350e261962263397a8d7fb0@7.7.8.254:26656", + "timeout_height": "0", + "extension_options": [], + "non_critical_extension_options": [] + }, + "auth_info": { + "signer_infos": [ + { + "public_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AsFC8tmbGGQSHthsVStbsQ13/+Yza9IT8KCSXXEN7y9f" + }, + "mode_info": { + "single": { + "mode": "SIGN_MODE_DIRECT" + } + }, + "sequence": "0" + } + ], + "fee": { + "amount": [], + "gas_limit": "200000", + "payer": "", + "granter": "" + } + }, + "signatures": [ + "rZuml3RLgrrZkUoNHw90FuHF/Orxzs0uiwflCkUOcvoA4bzohisjdQhkPWCn5aRw30mqZJGj1IxgXS15XleMvQ==" + ] + } + ] + }, + "gov": { + "starting_proposal_id": "1", + "deposits": [], + "votes": [], + "proposals": [], + "deposit_params": { + "min_deposit": [ + { + "denom": "stake", + "amount": "10000000" + } + ], + "max_deposit_period": "172800s" + }, + "voting_params": { + "voting_period": "20s" + }, + "tally_params": { + "quorum": "0.334000000000000000", + "threshold": "0.500000000000000000", + "veto_threshold": "0.334000000000000000" + } + }, + "ibc": { + "client_genesis": { + "clients": [], + "clients_consensus": [], + "clients_metadata": [], + "params": { + "allowed_clients": [ + "06-solomachine", + "07-tendermint" + ] + }, + "create_localhost": false, + "next_client_sequence": "0" + }, + "connection_genesis": { + "connections": [], + "client_connection_paths": [], + "next_connection_sequence": "0", + "params": { + "max_expected_time_per_block": "30000000000" + } + }, + "channel_genesis": { + "channels": [], + "acknowledgements": [], + "commitments": [], + "receipts": [], + "send_sequences": [], + "recv_sequences": [], + "ack_sequences": [], + "next_channel_sequence": "0" + } + }, + "mint": { + "minter": { + "inflation": "0.130000000000000000", + "annual_provisions": "0.000000000000000000" + }, + "params": { + "mint_denom": "stake", + "inflation_rate_change": "0.130000000000000000", + "inflation_max": "0.200000000000000000", + "inflation_min": "0.070000000000000000", + "goal_bonded": "0.670000000000000000", + "blocks_per_year": "6311520" + } + }, + "params": null, + "slashing": { + "params": { + "signed_blocks_window": "15", + "min_signed_per_window": "0.500000000000000000", + "downtime_jail_duration": "2s", + "slash_fraction_double_sign": "0.050000000000000000", + "slash_fraction_downtime": "0.010000000000000000" + }, + "signing_infos": [], + "missed_blocks": [] + }, + "staking": { + "params": { + "unbonding_time": "1814400s", + "max_validators": 100, + "max_entries": 7, + "historical_entries": 10000, + "bond_denom": "stake" + }, + "last_total_power": "0", + "last_validator_powers": [], + "validators": [], + "delegations": [], + "unbonding_delegations": [], + "redelegations": [], + "exported": false + }, + "transfer": { + "port_id": "transfer", + "denom_traces": [], + "params": { + "send_enabled": true, + "receive_enabled": true + } + }, + "upgrade": {}, + "vesting": {} + } + } \ No newline at end of file diff --git a/tests/e2e/testnet-scripts/start-changeover.sh b/tests/e2e/testnet-scripts/start-changeover.sh new file mode 100644 index 0000000000..d28479a8e7 --- /dev/null +++ b/tests/e2e/testnet-scripts/start-changeover.sh @@ -0,0 +1,187 @@ +#!/bin/bash +set -eux + +# The gaiad binary +BIN=$1 + +# JSON array of validator information +# [{ +# mnemonic: "crackle snap pop ... etc", +# allocation: "10000000000stake,10000000000footoken", +# stake: "5000000000stake", +# val_id: "alice", +# ip_suffix: "1", +# priv_validator_key: "{\"address\": \"3566F464673B2F069758DAE86FC25D04017BB147\",\"pub_key\": {\"type\": \"tendermint/PubKeyEd25519\",\"value\": \"XrLjKdc4mB2gfqplvnoySjSJq2E90RynUwaO3WhJutk=\"},\"priv_key\": {\"type\": \"tendermint/PrivKeyEd25519\",\"value\": \"czGSLs/Ocau8aJ5J5zQHMxf3d7NR0xjMECN6YGTIWqtesuMp1ziYHaB+qmW+ejJKNImrYT3RHKdTBo7daEm62Q==\"}}" +# node_key: "{\"priv_key\":{\"type\":\"tendermint/PrivKeyEd25519\",\"value\":\"alIHj6hXnzpLAadgb7+E2eeecwxoNdzuZrfhMX36EaD5/LgzL0ZUoVp7AK3np0K5T35JWLLv0jJKmeRIhG0GjA==\"}}" +# }, ... ] +VALIDATORS=$2 + +# The chain ID +CHAIN_ID=$3 + +# This is the first 3 fields of the IP addresses which will be used internally by the validators of this blockchain +# Recommended to use something starting with 7, since it is squatted by the DoD and is unroutable on the internet +# For example: "7.7.7" +CHAIN_IP_PREFIX=$4 + +# A transformation to apply to the genesis file, as a jq string +GENESIS_TRANSFORM=$5 + +# A sed string modifying the tendermint config +TENDERMINT_CONFIG_TRANSFORM=$6 + + +# CREATE VALIDATORS AND DO GENESIS CEREMONY +# !!!!!!!!!!!!!! IMPORTANT !!!!!!!!!!!!!!!! # +# data dir from the sovereign chain is copied to other nodes (namely bob and carol) +# alice simply performs a chain upgrade +echo "killing nodes" +pkill -f "^"interchain-security-sd &> /dev/null || true + +mkdir -p /root/.sovereign/config + +# apply genesis changes to existing genesis -> this creates the changeover genesis file wih intial validator set +jq "$GENESIS_TRANSFORM" /sover/validatoralice/config/genesis.json > /root/.sovereign/config/genesis.json + + +# Get number of nodes from length of validators array +NODES=$(echo "$VALIDATORS" | jq '. | length') + +# SETUP NETWORK NAMESPACES, see: https://adil.medium.com/container-networking-under-the-hood-network-namespaces-6b2b8fe8dc2a + +# Create virtual bridge device (acts like a switch) +ip link add name virtual-bridge type bridge || true + +for i in $(seq 0 $(($NODES - 1))); +do + # first validator is already setup + if [[ "$i" -ne 0 ]]; then + VAL_ID=$(echo "$VALIDATORS" | jq -r ".[$i].val_id") + VAL_IP_SUFFIX=$(echo "$VALIDATORS" | jq -r ".[$i].ip_suffix") + NET_NAMESPACE_NAME="$CHAIN_ID-$VAL_ID" + IP_ADDR="$CHAIN_IP_PREFIX.$VAL_IP_SUFFIX/24" + + # Create network namespace + ip netns add $NET_NAMESPACE_NAME + # Create virtual ethernet device to connect with bridge + ip link add $NET_NAMESPACE_NAME-in type veth peer name $NET_NAMESPACE_NAME-out + # Connect input end of virtual ethernet device to namespace + ip link set $NET_NAMESPACE_NAME-in netns $NET_NAMESPACE_NAME + # Assign ip address to namespace + ip netns exec $NET_NAMESPACE_NAME ip addr add $IP_ADDR dev $NET_NAMESPACE_NAME-in + # Connect output end of virtual ethernet device to bridge + ip link set $NET_NAMESPACE_NAME-out master virtual-bridge + fi +done + +# Enable bridge interface +ip link set virtual-bridge up + +for i in $(seq 0 $(($NODES - 1))); +do + # first validator is already setup + if [[ "$i" -ne 0 ]]; then + VAL_ID=$(echo "$VALIDATORS" | jq -r ".[$i].val_id") + NET_NAMESPACE_NAME="$CHAIN_ID-$VAL_ID" + + # Enable in/out interfaces for the namespace + ip link set $NET_NAMESPACE_NAME-out up + ip netns exec $NET_NAMESPACE_NAME ip link set dev $NET_NAMESPACE_NAME-in up + # Enable loopback device + ip netns exec $NET_NAMESPACE_NAME ip link set dev lo up + fi +done + +# Assign IP for bridge, to route between default network namespace and bridge +# BRIDGE_IP="$CHAIN_IP_PREFIX.254/24" +# ip addr add $BRIDGE_IP dev virtual-bridge + + +# HANDLE VALIDATOR HOMES, COPY OLD DATA FOLDER +for i in $(seq 0 $(($NODES - 1))); +do + # first validator is already setup + if [[ "$i" -ne 0 ]]; then + VAL_ID=$(echo "$VALIDATORS" | jq -r ".[$i].val_id") + echo "$VALIDATORS" | jq -r ".[$i].mnemonic" | $BIN keys add validator$VAL_ID \ + --home /$CHAIN_ID/validator$VAL_ID \ + --keyring-backend test \ + --recover > /dev/null + + # Copy in the genesis.json + cp /sover/validatoralice/config/genesis.json /$CHAIN_ID/validator$VAL_ID/config/genesis.json + cp -r /sover/validatoralice/data /$CHAIN_ID/validator$VAL_ID/ + + # Copy in validator state file + # echo '{"height": "0","round": 0,"step": 0}' > /$CHAIN_ID/validator$VAL_ID/data/priv_validator_state.json + + + PRIV_VALIDATOR_KEY=$(echo "$VALIDATORS" | jq -r ".[$i].priv_validator_key") + if [[ "$PRIV_VALIDATOR_KEY" ]]; then + echo "$PRIV_VALIDATOR_KEY" > /$CHAIN_ID/validator$VAL_ID/config/priv_validator_key.json + fi + + NODE_KEY=$(echo "$VALIDATORS" | jq -r ".[$i].node_key") + if [[ "$NODE_KEY" ]]; then + echo "$NODE_KEY" > /$CHAIN_ID/validator$VAL_ID/config/node_key.json + fi + + # Modify tendermint configs of validator + if [ "$TENDERMINT_CONFIG_TRANSFORM" != "" ] ; then + #'s/foo/bar/;s/abc/def/' + sed -i "$TENDERMINT_CONFIG_TRANSFORM" $CHAIN_ID/validator$VAL_ID/config/config.toml + fi + fi +done + + +# START VALIDATOR NODES -> this will perform the sovereign upgrade and start the chain +# ALICE is a validator on the sovereign and also the validator on the consumer chain +# BOB, CAROL are not validators on the sovereign, they will become validator once the chain switches to the consumer chain +echo "Starting validator nodes..." +for i in $(seq 0 $(($NODES - 1))); +do + VAL_ID=$(echo "$VALIDATORS" | jq -r ".[$i].val_id") + VAL_IP_SUFFIX=$(echo "$VALIDATORS" | jq -r ".[$i].ip_suffix") + NET_NAMESPACE_NAME="$CHAIN_ID-$VAL_ID" + + GAIA_HOME="--home /$CHAIN_ID/validator$VAL_ID" + RPC_ADDRESS="--rpc.laddr tcp://$CHAIN_IP_PREFIX.$VAL_IP_SUFFIX:26658" + GRPC_ADDRESS="--grpc.address $CHAIN_IP_PREFIX.$VAL_IP_SUFFIX:9091" + LISTEN_ADDRESS="--address tcp://$CHAIN_IP_PREFIX.$VAL_IP_SUFFIX:26655" + P2P_ADDRESS="--p2p.laddr tcp://$CHAIN_IP_PREFIX.$VAL_IP_SUFFIX:26656" + # LOG_LEVEL="--log_level trace" # switch to trace to see panic messages and rich and all debug msgs + LOG_LEVEL="--log_level info" + ENABLE_WEBGRPC="--grpc-web.enable=false" + + PERSISTENT_PEERS="" + + for j in $(seq 0 $(($NODES - 1))); + do + if [ $i -ne $j ]; then + PEER_VAL_ID=$(echo "$VALIDATORS" | jq -r ".[$j].val_id") + PEER_VAL_IP_SUFFIX=$(echo "$VALIDATORS" | jq -r ".[$j].ip_suffix") + NODE_ID=$($BIN tendermint show-node-id --home /$CHAIN_ID/validator$PEER_VAL_ID) + ADDRESS="$NODE_ID@$CHAIN_IP_PREFIX.$PEER_VAL_IP_SUFFIX:26656" + # (jq -r '.body.memo' /$CHAIN_ID/validator$j/config/gentx/*) # Getting the address from the gentx should also work + PERSISTENT_PEERS="$PERSISTENT_PEERS,$ADDRESS" + fi + done + + # Remove leading comma and concat to flag + PERSISTENT_PEERS="--p2p.persistent_peers ${PERSISTENT_PEERS:1}" + + ARGS="$GAIA_HOME $LISTEN_ADDRESS $RPC_ADDRESS $GRPC_ADDRESS $LOG_LEVEL $P2P_ADDRESS $ENABLE_WEBGRPC $PERSISTENT_PEERS" + ip netns exec $NET_NAMESPACE_NAME $BIN $ARGS start &> /$CHAIN_ID/validator$VAL_ID/logs & +done + +QUERY_NODE_SUFFIX=$(echo "$VALIDATORS" | jq -r ".[0].ip_suffix") +echo "NODE SUFFIX: $QUERY_NODE_SUFFIX" +# poll for chain start +set +e +until $BIN query block --node "tcp://$CHAIN_IP_PREFIX.$QUERY_NODE_SUFFIX:26658" | grep -q -v '{"block_id":{"hash":"","parts":{"total":0,"hash":""}},"block":null}'; do sleep 0.3 ; done +set -e + +echo "done!!!!!!!!" + +read -p "Press Return to Close..." \ No newline at end of file diff --git a/tests/e2e/testnet-scripts/start-sovereign.sh b/tests/e2e/testnet-scripts/start-sovereign.sh new file mode 100644 index 0000000000..9daed9a207 --- /dev/null +++ b/tests/e2e/testnet-scripts/start-sovereign.sh @@ -0,0 +1,133 @@ +#!/bin/bash +set -eux + +# The gaiad binary +BIN=$1 + +# JSON array of validator information +# [{ +# mnemonic: "crackle snap pop ... etc", +# allocation: "10000000000stake,10000000000footoken", +# stake: "5000000000stake", +# val_id: "alice", +# ip_suffix: "1", +# priv_validator_key: "{\"address\": \"3566F464673B2F069758DAE86FC25D04017BB147\",\"pub_key\": {\"type\": \"tendermint/PubKeyEd25519\",\"value\": \"XrLjKdc4mB2gfqplvnoySjSJq2E90RynUwaO3WhJutk=\"},\"priv_key\": {\"type\": \"tendermint/PrivKeyEd25519\",\"value\": \"czGSLs/Ocau8aJ5J5zQHMxf3d7NR0xjMECN6YGTIWqtesuMp1ziYHaB+qmW+ejJKNImrYT3RHKdTBo7daEm62Q==\"}}" +# node_key: "{\"priv_key\":{\"type\":\"tendermint/PrivKeyEd25519\",\"value\":\"alIHj6hXnzpLAadgb7+E2eeecwxoNdzuZrfhMX36EaD5/LgzL0ZUoVp7AK3np0K5T35JWLLv0jJKmeRIhG0GjA==\"}}" +# }, ... ] +VALIDATORS=$2 + +# The chain ID +CHAIN_ID=$3 + +# This is the first 3 fields of the IP addresses which will be used internally by the validators of this blockchain +# Recommended to use something starting with 7, since it is squatted by the DoD and is unroutable on the internet +# For example: "7.7.7" +CHAIN_IP_PREFIX=$4 + +# A transformation to apply to the genesis file, as a jq string +GENESIS_TRANSFORM=$5 + +# A sed string modifying the tendermint config +TENDERMINT_CONFIG_TRANSFORM=$6 + +# SETUP NETWORK NAMESPACES, see: https://adil.medium.com/container-networking-under-the-hood-network-namespaces-6b2b8fe8dc2a + +# Create virtual bridge device (acts like a switch) +ip link add name virtual-bridge type bridge || true + +# used globally in the whole script +VAL_ID=$(echo "$VALIDATORS" | jq -r ".[0].val_id") +VAL_IP_SUFFIX=$(echo "$VALIDATORS" | jq -r ".[0].ip_suffix") +NET_NAMESPACE_NAME="$CHAIN_ID-$VAL_ID" +IP_ADDR="$CHAIN_IP_PREFIX.$VAL_IP_SUFFIX/24" + +# Create network namespace +ip netns add $NET_NAMESPACE_NAME +# Create virtual ethernet device to connect with bridge +ip link add $NET_NAMESPACE_NAME-in type veth peer name $NET_NAMESPACE_NAME-out +# Connect input end of virtual ethernet device to namespace +ip link set $NET_NAMESPACE_NAME-in netns $NET_NAMESPACE_NAME +# Assign ip address to namespace +ip netns exec $NET_NAMESPACE_NAME ip addr add $IP_ADDR dev $NET_NAMESPACE_NAME-in +# Connect output end of virtual ethernet device to bridge +ip link set $NET_NAMESPACE_NAME-out master virtual-bridge + +# Enable bridge interface +ip link set virtual-bridge up + +NET_NAMESPACE_NAME="$CHAIN_ID-$VAL_ID" +# Enable in/out interfaces for the namespace +ip link set $NET_NAMESPACE_NAME-out up +ip netns exec $NET_NAMESPACE_NAME ip link set dev $NET_NAMESPACE_NAME-in up +# Enable loopback device +ip netns exec $NET_NAMESPACE_NAME ip link set dev lo up + +# Assign IP for bridge, to route between default network namespace and bridge +BRIDGE_IP="$CHAIN_IP_PREFIX.254/24" +ip addr add $BRIDGE_IP dev virtual-bridge + +# first we start a genesis.json with the first validator +# the first validator will also collect the gentx's once gnerated +echo "$VALIDATORS" | jq -r ".[0].mnemonic" | $BIN init --home /$CHAIN_ID/validator$VAL_ID --chain-id=$CHAIN_ID validator$VAL_ID --recover > /dev/null + +# !!!!!!!!! IMPORTANT !!!!!!!!! # +# move the sovereign genesis to the correct validator home dir +cp /testnet-scripts/sovereign-genesis.json /$CHAIN_ID/validator$VAL_ID/config/genesis.json + +# Apply jq transformations to genesis file +jq "$GENESIS_TRANSFORM" /$CHAIN_ID/validator$VAL_ID/config/genesis.json > /$CHAIN_ID/edited-genesis.json +mv /$CHAIN_ID/edited-genesis.json /$CHAIN_ID/genesis.json +cp /$CHAIN_ID/genesis.json /$CHAIN_ID/validator$VAL_ID/config/genesis.json + + + +# SETUP LOCAL VALIDATOR STATE +echo '{"height": "0","round": 0,"step": 0}' > /$CHAIN_ID/validator$VAL_ID/data/priv_validator_state.json + +PRIV_VALIDATOR_KEY=$(echo "$VALIDATORS" | jq -r ".[0].priv_validator_key") +if [[ "$PRIV_VALIDATOR_KEY" ]]; then + echo "$PRIV_VALIDATOR_KEY" > /$CHAIN_ID/validator$VAL_ID/config/priv_validator_key.json +fi + +NODE_KEY=$(echo "$VALIDATORS" | jq -r ".[0].node_key") +if [[ "$NODE_KEY" ]]; then + echo "$NODE_KEY" > /$CHAIN_ID/validator$VAL_ID/config/node_key.json +fi + +echo "$VALIDATORS" | jq -r ".[0].mnemonic" | $BIN keys add validator$VAL_ID \ +--home /$CHAIN_ID/validator$VAL_ID \ +--keyring-backend test \ +--recover > /dev/null + +# Modify tendermint configs of validator +if [ "$TENDERMINT_CONFIG_TRANSFORM" != "" ] ; then + #'s/foo/bar/;s/abc/def/' + sed -i "$TENDERMINT_CONFIG_TRANSFORM" $CHAIN_ID/validator$VAL_ID/config/config.toml +fi + + +# START VALIDATOR NODE +VAL_IP_SUFFIX=$(echo "$VALIDATORS" | jq -r ".[0].ip_suffix") +NET_NAMESPACE_NAME="$CHAIN_ID-$VAL_ID" + +GAIA_HOME="--home /$CHAIN_ID/validator$VAL_ID" +RPC_ADDRESS="--rpc.laddr tcp://$CHAIN_IP_PREFIX.$VAL_IP_SUFFIX:26658" +GRPC_ADDRESS="--grpc.address $CHAIN_IP_PREFIX.$VAL_IP_SUFFIX:9091" +LISTEN_ADDRESS="--address tcp://$CHAIN_IP_PREFIX.$VAL_IP_SUFFIX:26655" +P2P_ADDRESS="--p2p.laddr tcp://$CHAIN_IP_PREFIX.$VAL_IP_SUFFIX:26656" +# LOG_LEVEL="--log_level trace" # switch to trace to see panic messages and rich and all debug msgs +LOG_LEVEL="--log_level info" +ENABLE_WEBGRPC="--grpc-web.enable=false" + +ARGS="$GAIA_HOME $LISTEN_ADDRESS $RPC_ADDRESS $GRPC_ADDRESS $LOG_LEVEL $P2P_ADDRESS $ENABLE_WEBGRPC" +ip netns exec $NET_NAMESPACE_NAME $BIN $ARGS start &> /$CHAIN_ID/validator$VAL_ID/logs & + + +# poll for chain start +set +e +until $BIN query block --node "tcp://$CHAIN_IP_PREFIX.$VAL_IP_SUFFIX:26658" | grep -q -v '{"block_id":{"hash":"","parts":{"total":0,"hash":""}},"block":null}'; do sleep 0.3 ; done +set -e + +echo "done!!!!!!!!" + +read -p "Press Return to Close..." \ No newline at end of file diff --git a/tests/integration/changeover.go b/tests/integration/changeover.go index 3bf4e11932..13d18a4026 100644 --- a/tests/integration/changeover.go +++ b/tests/integration/changeover.go @@ -34,7 +34,7 @@ func (suite *CCVTestSuite) TestRecycleTransferChannel() { // Setup state s.t. the consumer keeper emulates a consumer that was previously standalone consumerKeeper.MarkAsPrevStandaloneChain(suite.consumerCtx()) suite.Require().True(consumerKeeper.IsPrevStandaloneChain(suite.consumerCtx())) - suite.consumerApp.GetConsumerKeeper().SetStandaloneTransferChannelID(suite.consumerCtx(), resp.ChannelId) + suite.consumerApp.GetConsumerKeeper().SetDistributionTransmissionChannel(suite.consumerCtx(), resp.ChannelId) // Now finish setting up CCV channel suite.ExecuteCCVChannelHandshake(suite.path) diff --git a/testutil/keeper/unit_test_helpers.go b/testutil/keeper/unit_test_helpers.go index 426a94b4b6..77a597c726 100644 --- a/testutil/keeper/unit_test_helpers.go +++ b/testutil/keeper/unit_test_helpers.go @@ -237,6 +237,7 @@ func GetTestConsumerAdditionProp() *providertypes.ConsumerAdditionProposal { time.Now(), consumertypes.DefaultConsumerRedistributeFrac, consumertypes.DefaultBlocksPerDistributionTransmission, + "", consumertypes.DefaultHistoricalEntries, types.DefaultCCVTimeoutPeriod, consumertypes.DefaultTransferTimeoutPeriod, diff --git a/x/ccv/consumer/ibc_module.go b/x/ccv/consumer/ibc_module.go index d7191d0be0..b3dde3d48a 100644 --- a/x/ccv/consumer/ibc_module.go +++ b/x/ccv/consumer/ibc_module.go @@ -140,15 +140,10 @@ func (am AppModule) OnChanOpenAck( /////////////////////////////////////////////////// // Initialize distribution token transfer channel - // First check if an existing transfer channel exists, if this consumer was a previously standalone chain. - if am.keeper.IsPrevStandaloneChain(ctx) { - transChannelID := am.keeper.GetStandaloneTransferChannelID(ctx) - found := am.keeper.TransferChannelExists(ctx, transChannelID) - if found { - // If existing transfer channel is found, persist that channel ID and return - am.keeper.SetDistributionTransmissionChannel(ctx, transChannelID) - return nil - } + // First check if an existing transfer channel already exists. + transChannelID := am.keeper.GetDistributionTransmissionChannel(ctx) + if found := am.keeper.TransferChannelExists(ctx, transChannelID); found { + return nil } // NOTE The handshake for this channel is handled by the ibc-go/transfer diff --git a/x/ccv/consumer/ibc_module_test.go b/x/ccv/consumer/ibc_module_test.go index fc6c3d2200..4c8377a8c8 100644 --- a/x/ccv/consumer/ibc_module_test.go +++ b/x/ccv/consumer/ibc_module_test.go @@ -214,7 +214,7 @@ func TestOnChanOpenAck(t *testing.T) { expPass bool }{ { - "success", + "success - empty transferChannelID", func(keeper *consumerkeeper.Keeper, params *params, mocks testkeeper.MockedKeepers) { // Expected msg distrTransferMsg := channeltypes.NewMsgChannelOpenInit( @@ -226,8 +226,13 @@ func TestOnChanOpenAck(t *testing.T) { "", // signer unused ) + transferChannelID := "" + keeper.SetDistributionTransmissionChannel(params.ctx, transferChannelID) + // Expected mock calls gomock.InOrder( + mocks.MockChannelKeeper.EXPECT().GetChannel( + params.ctx, transfertypes.PortID, transferChannelID).Return(channeltypes.Channel{}, false).Times(1), mocks.MockChannelKeeper.EXPECT().GetChannel( params.ctx, params.portID, params.channelID).Return(channeltypes.Channel{ ConnectionHops: []string{"connectionID"}, diff --git a/x/ccv/consumer/keeper/changeover.go b/x/ccv/consumer/keeper/changeover.go index 50e1a57184..57770a077d 100644 --- a/x/ccv/consumer/keeper/changeover.go +++ b/x/ccv/consumer/keeper/changeover.go @@ -48,5 +48,6 @@ func (k Keeper) ChangeoverToConsumer(ctx sdk.Context) (initialValUpdates []abci. // Therefore we set the PreCCV state to false so the endblocker caller doesn't call this method again. k.DeletePreCCV(ctx) + k.Logger(ctx).Info("ICS changeover complete - you are now a consumer chain!") return initialValUpdates } diff --git a/x/ccv/consumer/keeper/keeper.go b/x/ccv/consumer/keeper/keeper.go index 54c1cd5577..d420bb9bd4 100644 --- a/x/ccv/consumer/keeper/keeper.go +++ b/x/ccv/consumer/keeper/keeper.go @@ -618,17 +618,3 @@ func (k Keeper) IsPrevStandaloneChain(ctx sdk.Context) bool { store := ctx.KVStore(k.storeKey) return store.Has(types.PrevStandaloneChainKey()) } - -// SetStandaloneTransferChannelID sets the channelID of an existing transfer channel, -// for a chain which used to be a standalone chain. -func (k Keeper) SetStandaloneTransferChannelID(ctx sdk.Context, channelID string) { - store := ctx.KVStore(k.storeKey) - store.Set(types.StandaloneTransferChannelIDKey(), []byte(channelID)) -} - -// GetStandaloneTransferChannelID returns the channelID of an existing transfer channel, -// for a chain which used to be a standalone chain. -func (k Keeper) GetStandaloneTransferChannelID(ctx sdk.Context) string { - store := ctx.KVStore(k.storeKey) - return string(store.Get(types.StandaloneTransferChannelIDKey())) -} diff --git a/x/ccv/consumer/keeper/keeper_test.go b/x/ccv/consumer/keeper/keeper_test.go index 4280f1de37..fe523ce7cf 100644 --- a/x/ccv/consumer/keeper/keeper_test.go +++ b/x/ccv/consumer/keeper/keeper_test.go @@ -541,19 +541,6 @@ func TestGetAllOutstandingDowntimes(t *testing.T) { require.Equal(t, result, expectedGetAllOrder) } -// TestStandaloneTransferChannelID tests the getter and setter for the existing transfer channel id -func TestStandaloneTransferChannelID(t *testing.T) { - ck, ctx, ctrl, _ := testkeeper.GetConsumerKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) - defer ctrl.Finish() - - // Test that the default value is empty - require.Equal(t, "", ck.GetStandaloneTransferChannelID(ctx)) - - // Test that the value can be set and retrieved - ck.SetStandaloneTransferChannelID(ctx, "channelID1234") - require.Equal(t, "channelID1234", ck.GetStandaloneTransferChannelID(ctx)) -} - func TestPrevStandaloneChainFlag(t *testing.T) { ck, ctx, ctrl, _ := testkeeper.GetConsumerKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) defer ctrl.Finish() diff --git a/x/ccv/consumer/keeper/migration_test.go b/x/ccv/consumer/keeper/migration_test.go index ee14d2bcc8..29574a4808 100644 --- a/x/ccv/consumer/keeper/migration_test.go +++ b/x/ccv/consumer/keeper/migration_test.go @@ -116,7 +116,7 @@ func (p *v1Params) ParamSetPairs() paramtypes.ParamSetPairs { paramtypes.NewParamSetPair(consumertypes.KeyBlocksPerDistributionTransmission, p.BlocksPerDistributionTransmission, ccvtypes.ValidatePositiveInt64), paramtypes.NewParamSetPair(consumertypes.KeyDistributionTransmissionChannel, - p.DistributionTransmissionChannel, consumertypes.ValidateDistributionTransmissionChannel), + p.DistributionTransmissionChannel, ccvtypes.ValidateDistributionTransmissionChannel), paramtypes.NewParamSetPair(consumertypes.KeyProviderFeePoolAddrStr, p.ProviderFeePoolAddrStr, consumertypes.ValidateProviderFeePoolAddrStr), paramtypes.NewParamSetPair(ccvtypes.KeyCCVTimeoutPeriod, diff --git a/x/ccv/consumer/types/genesis_test.go b/x/ccv/consumer/types/genesis_test.go index f5e6ce075c..0398b39f54 100644 --- a/x/ccv/consumer/types/genesis_test.go +++ b/x/ccv/consumer/types/genesis_test.go @@ -210,7 +210,7 @@ func TestValidateInitialGenesisState(t *testing.T) { true, }, { - "invalid new consumer genesis state: invalid params", + "invalid new consumer genesis state: invalid params - ccvTimeoutPeriod", types.NewInitialGenesisState(cs, consensusState, valUpdates, types.NewParams( true, @@ -228,6 +228,25 @@ func TestValidateInitialGenesisState(t *testing.T) { )), true, }, + { + "invalid new consumer genesis state: invalid params - distributionTransmissionChannel", + types.NewInitialGenesisState(cs, consensusState, valUpdates, + types.NewParams( + true, + types.DefaultBlocksPerDistributionTransmission, + "badchannel/", + "", + ccv.DefaultCCVTimeoutPeriod, + types.DefaultTransferTimeoutPeriod, + types.DefaultConsumerRedistributeFrac, + types.DefaultHistoricalEntries, + types.DefaultConsumerUnbondingPeriod, + types.DefaultSoftOptOutThreshold, + []string{}, + []string{}, + )), + true, + }, } for _, c := range cases { diff --git a/x/ccv/consumer/types/params.go b/x/ccv/consumer/types/params.go index 509e3725b4..7ab51fbad8 100644 --- a/x/ccv/consumer/types/params.go +++ b/x/ccv/consumer/types/params.go @@ -113,7 +113,7 @@ func (p Params) Validate() error { if err := ccvtypes.ValidatePositiveInt64(p.BlocksPerDistributionTransmission); err != nil { return err } - if err := ValidateDistributionTransmissionChannel(p.DistributionTransmissionChannel); err != nil { + if err := ccvtypes.ValidateDistributionTransmissionChannel(p.DistributionTransmissionChannel); err != nil { return err } if err := ValidateProviderFeePoolAddrStr(p.ProviderFeePoolAddrStr); err != nil { @@ -153,7 +153,7 @@ func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { paramtypes.NewParamSetPair(KeyBlocksPerDistributionTransmission, p.BlocksPerDistributionTransmission, ccvtypes.ValidatePositiveInt64), paramtypes.NewParamSetPair(KeyDistributionTransmissionChannel, - p.DistributionTransmissionChannel, ValidateDistributionTransmissionChannel), + p.DistributionTransmissionChannel, ccvtypes.ValidateDistributionTransmissionChannel), paramtypes.NewParamSetPair(KeyProviderFeePoolAddrStr, p.ProviderFeePoolAddrStr, ValidateProviderFeePoolAddrStr), paramtypes.NewParamSetPair(ccvtypes.KeyCCVTimeoutPeriod, @@ -175,15 +175,6 @@ func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { } } -func ValidateDistributionTransmissionChannel(i interface{}) error { - // Accept empty string as valid, since this will be the default value on genesis - if i == "" { - return nil - } - // Otherwise validate as usual for a channelID - return ccvtypes.ValidateChannelIdentifier(i) -} - func ValidateProviderFeePoolAddrStr(i interface{}) error { // Accept empty string as valid, since this will be the default value on genesis if i == "" { diff --git a/x/ccv/provider/client/proposal_handler.go b/x/ccv/provider/client/proposal_handler.go index 19848d9282..76491b86d2 100644 --- a/x/ccv/provider/client/proposal_handler.go +++ b/x/ccv/provider/client/proposal_handler.go @@ -58,6 +58,7 @@ Where proposal.json contains: "spawn_time": "2022-01-27T15:59:50.121607-08:00", "blocks_per_distribution_transmission": 1000, "consumer_redistribution_fraction": "0.75", + "distribution_transmission_channel": "", "historical_entries": 10000, "transfer_timeout_period": 3600000000000, "ccv_timeout_period": 2419200000000000, @@ -82,7 +83,8 @@ Where proposal.json contains: content := types.NewConsumerAdditionProposal( proposal.Title, proposal.Description, proposal.ChainId, proposal.InitialHeight, proposal.GenesisHash, proposal.BinaryHash, proposal.SpawnTime, - proposal.ConsumerRedistributionFraction, proposal.BlocksPerDistributionTransmission, proposal.HistoricalEntries, + proposal.ConsumerRedistributionFraction, proposal.BlocksPerDistributionTransmission, + proposal.DistributionTransmissionChannel, proposal.HistoricalEntries, proposal.CcvTimeoutPeriod, proposal.TransferTimeoutPeriod, proposal.UnbondingPeriod) from := clientCtx.GetFromAddress() @@ -224,6 +226,7 @@ type ConsumerAdditionProposalJSON struct { ConsumerRedistributionFraction string `json:"consumer_redistribution_fraction"` BlocksPerDistributionTransmission int64 `json:"blocks_per_distribution_transmission"` + DistributionTransmissionChannel string `json:"distribution_transmission_channel"` HistoricalEntries int64 `json:"historical_entries"` CcvTimeoutPeriod time.Duration `json:"ccv_timeout_period"` TransferTimeoutPeriod time.Duration `json:"transfer_timeout_period"` @@ -246,6 +249,7 @@ type ConsumerAdditionProposalReq struct { ConsumerRedistributionFraction string `json:"consumer_redistribution_fraction"` BlocksPerDistributionTransmission int64 `json:"blocks_per_distribution_transmission"` + DistributionTransmissionChannel string `json:"distribution_transmission_channel"` HistoricalEntries int64 `json:"historical_entries"` CcvTimeoutPeriod time.Duration `json:"ccv_timeout_period"` TransferTimeoutPeriod time.Duration `json:"transfer_timeout_period"` @@ -375,7 +379,8 @@ func postConsumerAdditionProposalHandlerFn(clientCtx client.Context) http.Handle content := types.NewConsumerAdditionProposal( req.Title, req.Description, req.ChainId, req.InitialHeight, req.GenesisHash, req.BinaryHash, req.SpawnTime, - req.ConsumerRedistributionFraction, req.BlocksPerDistributionTransmission, req.HistoricalEntries, + req.ConsumerRedistributionFraction, req.BlocksPerDistributionTransmission, + req.DistributionTransmissionChannel, req.HistoricalEntries, req.CcvTimeoutPeriod, req.TransferTimeoutPeriod, req.UnbondingPeriod) msg, err := govtypes.NewMsgSubmitProposal(content, req.Deposit, req.Proposer) diff --git a/x/ccv/provider/keeper/proposal.go b/x/ccv/provider/keeper/proposal.go index dcff74385b..e50619c066 100644 --- a/x/ccv/provider/keeper/proposal.go +++ b/x/ccv/provider/keeper/proposal.go @@ -303,7 +303,7 @@ func (k Keeper) MakeConsumerGenesis( consumerGenesisParams := consumertypes.NewParams( true, prop.BlocksPerDistributionTransmission, - "", // distributionTransmissionChannel + prop.DistributionTransmissionChannel, "", // providerFeePoolAddrStr, prop.CcvTimeoutPeriod, prop.TransferTimeoutPeriod, diff --git a/x/ccv/provider/keeper/proposal_test.go b/x/ccv/provider/keeper/proposal_test.go index cb18a119b4..68ee7e9663 100644 --- a/x/ccv/provider/keeper/proposal_test.go +++ b/x/ccv/provider/keeper/proposal_test.go @@ -61,6 +61,7 @@ func TestHandleConsumerAdditionProposal(t *testing.T) { now, // Spawn time "0.75", 10, + "", 10000, 100000000000, 100000000000, @@ -85,6 +86,7 @@ func TestHandleConsumerAdditionProposal(t *testing.T) { now, "0.75", 10, + "", 10000, 100000000000, 100000000000, @@ -883,6 +885,7 @@ func TestBeginBlockInit(t *testing.T) { now.Add(-time.Hour*2).UTC(), "0.75", 10, + "", 10000, 100000000000, 100000000000, @@ -893,6 +896,7 @@ func TestBeginBlockInit(t *testing.T) { now.Add(-time.Hour*1).UTC(), "0.75", 10, + "", 10000, 100000000000, 100000000000, @@ -903,6 +907,7 @@ func TestBeginBlockInit(t *testing.T) { now.Add(time.Hour).UTC(), "0.75", 10, + "", 10000, 100000000000, 100000000000, @@ -913,6 +918,7 @@ func TestBeginBlockInit(t *testing.T) { now.UTC(), "0.75", 10, + "", 10000, 100000000000, 100000000000, diff --git a/x/ccv/provider/proposal_handler_test.go b/x/ccv/provider/proposal_handler_test.go index ddf3698b6f..1e8e9b34b5 100644 --- a/x/ccv/provider/proposal_handler_test.go +++ b/x/ccv/provider/proposal_handler_test.go @@ -41,6 +41,7 @@ func TestProviderProposalHandler(t *testing.T) { clienttypes.NewHeight(2, 3), []byte("gen_hash"), []byte("bin_hash"), now, "0.75", 10, + "", 10000, 100000000000, 100000000000, @@ -58,14 +59,14 @@ func TestProviderProposalHandler(t *testing.T) { }, { // no slash log for equivocation - name: "invalid equivocation posal", + name: "invalid equivocation proposal", content: providertypes.NewEquivocationProposal( "title", "description", []*evidencetypes.Equivocation{equivocation}), blockTime: hourFromNow, expValidEquivocation: false, }, { - name: "valid equivocation posal", + name: "valid equivocation proposal", content: providertypes.NewEquivocationProposal( "title", "description", []*evidencetypes.Equivocation{equivocation}), blockTime: hourFromNow, diff --git a/x/ccv/provider/types/proposal.go b/x/ccv/provider/types/proposal.go index 49fe00531f..913152e68c 100644 --- a/x/ccv/provider/types/proposal.go +++ b/x/ccv/provider/types/proposal.go @@ -36,7 +36,8 @@ func NewConsumerAdditionProposal(title, description, chainID string, initialHeight clienttypes.Height, genesisHash, binaryHash []byte, spawnTime time.Time, consumerRedistributionFraction string, - blocksPerDistributionTransmission, + blocksPerDistributionTransmission int64, + distributionTransmissionChannel string, historicalEntries int64, ccvTimeoutPeriod time.Duration, transferTimeoutPeriod time.Duration, @@ -52,6 +53,7 @@ func NewConsumerAdditionProposal(title, description, chainID string, SpawnTime: spawnTime, ConsumerRedistributionFraction: consumerRedistributionFraction, BlocksPerDistributionTransmission: blocksPerDistributionTransmission, + DistributionTransmissionChannel: distributionTransmissionChannel, HistoricalEntries: historicalEntries, CcvTimeoutPeriod: ccvTimeoutPeriod, TransferTimeoutPeriod: transferTimeoutPeriod, @@ -106,6 +108,10 @@ func (cccp *ConsumerAdditionProposal) ValidateBasic() error { return errorsmod.Wrap(ErrInvalidConsumerAdditionProposal, "blocks per distribution transmission cannot be < 1") } + if err := ccvtypes.ValidateDistributionTransmissionChannel(cccp.DistributionTransmissionChannel); err != nil { + return errorsmod.Wrap(ErrInvalidConsumerAdditionProposal, "distribution transmission channel") + } + if err := ccvtypes.ValidatePositiveInt64(cccp.HistoricalEntries); err != nil { return errorsmod.Wrap(ErrInvalidConsumerAdditionProposal, "historical entries cannot be < 1") } @@ -137,6 +143,7 @@ func (cccp *ConsumerAdditionProposal) String() string { SpawnTime: %s ConsumerRedistributionFraction: %s BlocksPerDistributionTransmission: %d + DistributionTransmissionChannel: %s HistoricalEntries: %d CcvTimeoutPeriod: %d TransferTimeoutPeriod: %d @@ -150,6 +157,7 @@ func (cccp *ConsumerAdditionProposal) String() string { cccp.SpawnTime, cccp.ConsumerRedistributionFraction, cccp.BlocksPerDistributionTransmission, + cccp.DistributionTransmissionChannel, cccp.HistoricalEntries, cccp.CcvTimeoutPeriod, cccp.TransferTimeoutPeriod, diff --git a/x/ccv/provider/types/proposal_test.go b/x/ccv/provider/types/proposal_test.go index db765a86ca..d1440eb9a0 100644 --- a/x/ccv/provider/types/proposal_test.go +++ b/x/ccv/provider/types/proposal_test.go @@ -32,6 +32,7 @@ func TestConsumerAdditionProposalValidateBasic(t *testing.T) { types.NewConsumerAdditionProposal("title", "description", "chainID", initialHeight, []byte("gen_hash"), []byte("bin_hash"), time.Now(), "0.75", 10, + "", 10000, 100000000000, 100000000000, @@ -44,6 +45,7 @@ func TestConsumerAdditionProposalValidateBasic(t *testing.T) { types.NewConsumerAdditionProposal("title", "description", "chainID", initialHeight, []byte("gen_hash"), []byte("bin_hash"), time.Now(), "0.0", // fraction can be 0.0 but not empty 10, + "", 10000, 100000000000, 100000000000, @@ -55,6 +57,7 @@ func TestConsumerAdditionProposalValidateBasic(t *testing.T) { types.NewConsumerAdditionProposal(" ", "description", "chainID", initialHeight, []byte("gen_hash"), []byte("bin_hash"), time.Now(), "0.75", 10, + "", 10000, 100000000000, 100000000000, @@ -66,6 +69,7 @@ func TestConsumerAdditionProposalValidateBasic(t *testing.T) { types.NewConsumerAdditionProposal("title", "description", " ", initialHeight, []byte("gen_hash"), []byte("bin_hash"), time.Now(), "0.75", 10, + "", 10000, 100000000000, 100000000000, @@ -86,6 +90,7 @@ func TestConsumerAdditionProposalValidateBasic(t *testing.T) { CcvTimeoutPeriod: 100000000000, TransferTimeoutPeriod: 100000000000, ConsumerRedistributionFraction: "0.75", + DistributionTransmissionChannel: "", HistoricalEntries: 10000, UnbondingPeriod: 100000000000, }, @@ -96,6 +101,7 @@ func TestConsumerAdditionProposalValidateBasic(t *testing.T) { types.NewConsumerAdditionProposal("title", "description", "chainID", initialHeight, []byte(""), []byte("bin_hash"), time.Now(), "0.75", 10, + "", 10000, 100000000000, 100000000000, @@ -107,6 +113,7 @@ func TestConsumerAdditionProposalValidateBasic(t *testing.T) { types.NewConsumerAdditionProposal("title", "description", "chainID", initialHeight, []byte("gen_hash"), []byte(""), time.Now(), "0.75", 10, + "", 10000, 100000000000, 100000000000, @@ -118,6 +125,7 @@ func TestConsumerAdditionProposalValidateBasic(t *testing.T) { types.NewConsumerAdditionProposal("title", "description", "chainID", initialHeight, []byte("gen_hash"), []byte("bin_hash"), time.Time{}, "0.75", 10, + "", 10000, 100000000000, 100000000000, @@ -129,6 +137,7 @@ func TestConsumerAdditionProposalValidateBasic(t *testing.T) { types.NewConsumerAdditionProposal("title", "description", "chainID", initialHeight, []byte("gen_hash"), []byte("bin_hash"), time.Now(), "", // fraction can be 0.0 but not empty 10, + "", 10000, 100000000000, 100000000000, @@ -140,17 +149,31 @@ func TestConsumerAdditionProposalValidateBasic(t *testing.T) { types.NewConsumerAdditionProposal("title", "description", "chainID", initialHeight, []byte("gen_hash"), []byte("bin_hash"), time.Now(), "0.75", 0, + "", 100000000000, 10000, 100000000000, 100000000000), false, }, + { + "distribution transmission channel is invalid", + types.NewConsumerAdditionProposal("title", "description", "chainID", initialHeight, []byte("gen_hash"), []byte("bin_hash"), time.Now(), + "0.75", + 10, + "badchannel/", + 10000, + 100000000000, + 100000000000, + 100000000000), + false, + }, { "historical entries is invalid", types.NewConsumerAdditionProposal("title", "description", "chainID", initialHeight, []byte("gen_hash"), []byte("bin_hash"), time.Now(), "0.75", 10, + "", -2, 100000000000, 100000000000, @@ -162,6 +185,7 @@ func TestConsumerAdditionProposalValidateBasic(t *testing.T) { types.NewConsumerAdditionProposal("title", "description", "chainID", initialHeight, []byte("gen_hash"), []byte("bin_hash"), time.Now(), "0.75", 10, + "", 10000, 0, 100000000000, @@ -173,6 +197,7 @@ func TestConsumerAdditionProposalValidateBasic(t *testing.T) { types.NewConsumerAdditionProposal("title", "description", "chainID", initialHeight, []byte("gen_hash"), []byte("bin_hash"), time.Now(), "0.75", 10, + "", 10000, 100000000000, 0, @@ -184,6 +209,7 @@ func TestConsumerAdditionProposalValidateBasic(t *testing.T) { types.NewConsumerAdditionProposal("title", "description", "chainID", initialHeight, []byte("gen_hash"), []byte("bin_hash"), time.Now(), "0.75", 10, + "", 10000, 100000000000, 100000000000, @@ -207,6 +233,7 @@ func TestMarshalConsumerAdditionProposal(t *testing.T) { content := types.NewConsumerAdditionProposal("title", "description", "chainID", clienttypes.NewHeight(0, 1), []byte("gen_hash"), []byte("bin_hash"), time.Now().UTC(), "0.75", 10, + "", 10000, 100000000000, 100000000000, @@ -248,6 +275,7 @@ func TestConsumerAdditionProposalString(t *testing.T) { spawnTime, "0.75", 10001, + "", 500000, 100000000000, 10000000000, @@ -263,12 +291,14 @@ func TestConsumerAdditionProposalString(t *testing.T) { SpawnTime: %s ConsumerRedistributionFraction: %s BlocksPerDistributionTransmission: %d + DistributionTransmissionChannel: %s HistoricalEntries: %d CcvTimeoutPeriod: %d TransferTimeoutPeriod: %d UnbondingPeriod: %d`, initialHeight, []byte("gen_hash"), []byte("bin_hash"), spawnTime, "0.75", 10001, + "", 500000, 100000000000, 10000000000, diff --git a/x/ccv/provider/types/provider.pb.go b/x/ccv/provider/types/provider.pb.go index 37e175acea..acc95ca9af 100644 --- a/x/ccv/provider/types/provider.pb.go +++ b/x/ccv/provider/types/provider.pb.go @@ -74,6 +74,13 @@ type ConsumerAdditionProposal struct { // 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. HistoricalEntries int64 `protobuf:"varint,13,opt,name=historical_entries,json=historicalEntries,proto3" json:"historical_entries,omitempty"` + // The ID of a token transfer channel used for the Reward Distribution + // sub-protocol. If DistributionTransmissionChannel == "", a new transfer + // channel is created on top of the same connection as the CCV channel. + // Note that transfer_channel_id is the ID of the channel end on the consumer chain. + // it is most relevant for chains performing a sovereign to consumer changeover + // in order to maintan the existing ibc transfer channel + DistributionTransmissionChannel string `protobuf:"bytes,14,opt,name=distribution_transmission_channel,json=distributionTransmissionChannel,proto3" json:"distribution_transmission_channel,omitempty"` } func (m *ConsumerAdditionProposal) Reset() { *m = ConsumerAdditionProposal{} } @@ -1220,106 +1227,107 @@ func init() { } var fileDescriptor_f22ec409a72b7b72 = []byte{ - // 1579 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x57, 0xcd, 0x72, 0xdc, 0xc6, - 0x11, 0x26, 0xb8, 0xfc, 0xdb, 0x59, 0xfe, 0x48, 0x10, 0x65, 0x2d, 0x15, 0x66, 0xb9, 0x86, 0x13, - 0x17, 0x53, 0x2e, 0x63, 0x43, 0xfa, 0x92, 0x52, 0xc5, 0xe5, 0x22, 0x57, 0x96, 0xc5, 0x30, 0xb6, - 0xd6, 0x20, 0x43, 0x55, 0x92, 0x03, 0x6a, 0x30, 0x68, 0xed, 0x4e, 0x11, 0xc0, 0x40, 0x33, 0x03, - 0x48, 0x7b, 0xc9, 0x39, 0x47, 0xa7, 0x72, 0x71, 0x25, 0x17, 0xe7, 0x09, 0xf2, 0x1a, 0x3e, 0xfa, - 0x98, 0x93, 0x93, 0xa2, 0x0e, 0x39, 0xe4, 0x25, 0x52, 0x33, 0xf8, 0x5f, 0x52, 0xca, 0xaa, 0x92, - 0xdc, 0x30, 0x3d, 0xdd, 0x5f, 0xf7, 0x4c, 0x77, 0x7f, 0x3d, 0x40, 0x87, 0x34, 0x92, 0xc0, 0xc9, - 0x04, 0xd3, 0xc8, 0x15, 0x40, 0x12, 0x4e, 0xe5, 0x74, 0x40, 0x48, 0x3a, 0x88, 0x39, 0x4b, 0xa9, - 0x0f, 0x7c, 0x90, 0x1e, 0x94, 0xdf, 0x76, 0xcc, 0x99, 0x64, 0xe6, 0x7b, 0x37, 0xd8, 0xd8, 0x84, - 0xa4, 0x76, 0xa9, 0x97, 0x1e, 0xdc, 0xdf, 0x1e, 0xb3, 0x31, 0xd3, 0xfa, 0x03, 0xf5, 0x95, 0x99, - 0xde, 0xdf, 0x1b, 0x33, 0x36, 0x0e, 0x60, 0xa0, 0x57, 0x5e, 0xf2, 0x6c, 0x20, 0x69, 0x08, 0x42, - 0xe2, 0x30, 0xce, 0x15, 0x7a, 0xb3, 0x0a, 0x7e, 0xc2, 0xb1, 0xa4, 0x2c, 0x2a, 0x00, 0xa8, 0x47, - 0x06, 0x84, 0x71, 0x18, 0x90, 0x80, 0x42, 0x24, 0x55, 0x78, 0xd9, 0x57, 0xae, 0x30, 0x50, 0x0a, - 0x01, 0x1d, 0x4f, 0x64, 0x26, 0x16, 0x03, 0x09, 0x91, 0x0f, 0x3c, 0xa4, 0x99, 0x72, 0xb5, 0xca, - 0x0d, 0x76, 0x6b, 0xfb, 0x84, 0x4f, 0x63, 0xc9, 0x06, 0x97, 0x30, 0x15, 0xf9, 0xee, 0xfb, 0x84, - 0x89, 0x90, 0x89, 0x01, 0xa8, 0x83, 0x45, 0x04, 0x06, 0xe9, 0x81, 0x07, 0x12, 0x1f, 0x94, 0x82, - 0x22, 0xee, 0x5c, 0xcf, 0xc3, 0xa2, 0xd2, 0x21, 0x8c, 0xe6, 0x71, 0x5b, 0x7f, 0x5c, 0x41, 0xdd, - 0x21, 0x8b, 0x44, 0x12, 0x02, 0x3f, 0xf2, 0x7d, 0xaa, 0x8e, 0x34, 0xe2, 0x2c, 0x66, 0x02, 0x07, - 0xe6, 0x36, 0x5a, 0x96, 0x54, 0x06, 0xd0, 0x35, 0xfa, 0xc6, 0x7e, 0xdb, 0xc9, 0x16, 0x66, 0x1f, - 0x75, 0x7c, 0x10, 0x84, 0xd3, 0x58, 0x29, 0x77, 0x17, 0xf5, 0x5e, 0x5d, 0x64, 0xee, 0xa0, 0xb5, - 0x2c, 0x0b, 0xd4, 0xef, 0xb6, 0xf4, 0xf6, 0xaa, 0x5e, 0x9f, 0xf8, 0xe6, 0x67, 0x68, 0x93, 0x46, - 0x54, 0x52, 0x1c, 0xb8, 0x13, 0x50, 0xb7, 0xd1, 0x5d, 0xea, 0x1b, 0xfb, 0x9d, 0xc3, 0xfb, 0x36, - 0xf5, 0x88, 0xad, 0x2e, 0xd0, 0xce, 0xaf, 0x2d, 0x3d, 0xb0, 0x1f, 0x6b, 0x8d, 0xe3, 0xa5, 0x6f, - 0xbf, 0xdf, 0x5b, 0x70, 0x36, 0x72, 0xbb, 0x4c, 0x68, 0xbe, 0x8b, 0xd6, 0xc7, 0x10, 0x81, 0xa0, - 0xc2, 0x9d, 0x60, 0x31, 0xe9, 0x2e, 0xf7, 0x8d, 0xfd, 0x75, 0xa7, 0x93, 0xcb, 0x1e, 0x63, 0x31, - 0x31, 0xf7, 0x50, 0xc7, 0xa3, 0x11, 0xe6, 0xd3, 0x4c, 0x63, 0x45, 0x6b, 0xa0, 0x4c, 0xa4, 0x15, - 0x86, 0x08, 0x89, 0x18, 0xbf, 0x88, 0x5c, 0x95, 0xed, 0xee, 0x6a, 0x1e, 0x48, 0x96, 0x69, 0xbb, - 0xc8, 0xb4, 0x7d, 0x5e, 0x94, 0xc2, 0xf1, 0x9a, 0x0a, 0xe4, 0xab, 0xbf, 0xef, 0x19, 0x4e, 0x5b, - 0xdb, 0xa9, 0x1d, 0xf3, 0x0b, 0x74, 0x2b, 0x89, 0x3c, 0x16, 0xf9, 0x34, 0x1a, 0xbb, 0x31, 0x70, - 0xca, 0xfc, 0xee, 0x9a, 0x86, 0xda, 0xb9, 0x06, 0xf5, 0x30, 0x2f, 0x9a, 0x0c, 0xe9, 0x6b, 0x85, - 0xb4, 0x55, 0x1a, 0x8f, 0xb4, 0xad, 0xf9, 0x25, 0x32, 0x09, 0x49, 0x75, 0x48, 0x2c, 0x91, 0x05, - 0x62, 0x7b, 0x7e, 0xc4, 0x5b, 0x84, 0xa4, 0xe7, 0x99, 0x75, 0x0e, 0xf9, 0x5b, 0x74, 0x4f, 0x72, - 0x1c, 0x89, 0x67, 0xc0, 0x67, 0x71, 0xd1, 0xfc, 0xb8, 0x77, 0x0b, 0x8c, 0x26, 0xf8, 0x63, 0xd4, - 0x27, 0x79, 0x01, 0xb9, 0x1c, 0x7c, 0x2a, 0x24, 0xa7, 0x5e, 0xa2, 0x6c, 0xdd, 0x67, 0x1c, 0x13, - 0x5d, 0x23, 0x1d, 0x5d, 0x04, 0xbd, 0x42, 0xcf, 0x69, 0xa8, 0x3d, 0xca, 0xb5, 0xcc, 0x27, 0xe8, - 0x47, 0x5e, 0xc0, 0xc8, 0xa5, 0x50, 0xc1, 0xb9, 0x0d, 0x24, 0xed, 0x3a, 0xa4, 0x42, 0x28, 0xb4, - 0xf5, 0xbe, 0xb1, 0xdf, 0x72, 0xde, 0xcd, 0x74, 0x47, 0xc0, 0x1f, 0xd6, 0x34, 0xcf, 0x6b, 0x8a, - 0xe6, 0x87, 0xc8, 0x9c, 0x50, 0x21, 0x19, 0xa7, 0x04, 0x07, 0x2e, 0x44, 0x92, 0x53, 0x10, 0xdd, - 0x0d, 0x6d, 0x7e, 0xbb, 0xda, 0xf9, 0x34, 0xdb, 0x78, 0xb0, 0xf6, 0xfb, 0x6f, 0xf6, 0x16, 0xbe, - 0xfe, 0x66, 0x6f, 0xc1, 0xfa, 0xab, 0x81, 0xee, 0x0d, 0xcb, 0x60, 0x43, 0x96, 0xe2, 0xe0, 0xff, - 0xd9, 0x14, 0x47, 0xa8, 0x2d, 0x24, 0x8b, 0xb3, 0x32, 0x5c, 0x7a, 0x8b, 0x32, 0x5c, 0x53, 0x66, - 0x6a, 0xc3, 0xfa, 0xb3, 0x81, 0xb6, 0x3f, 0x7d, 0x9e, 0xd0, 0x94, 0x11, 0xfc, 0x3f, 0xe9, 0xe1, - 0x53, 0xb4, 0x01, 0x35, 0x3c, 0xd1, 0x6d, 0xf5, 0x5b, 0xfb, 0x9d, 0xc3, 0x1f, 0xdb, 0x19, 0xa1, - 0xd8, 0x25, 0xcf, 0xe4, 0xa4, 0x62, 0xd7, 0xbd, 0x3b, 0x4d, 0x5b, 0xeb, 0x5f, 0x06, 0xba, 0xf5, - 0x59, 0xc0, 0x3c, 0x1c, 0x9c, 0x05, 0x58, 0x4c, 0xd4, 0x85, 0x4f, 0xd5, 0xa9, 0x39, 0xe4, 0x95, - 0xae, 0xa3, 0x9b, 0xfb, 0xd4, 0xca, 0x4c, 0xf7, 0xde, 0x27, 0xe8, 0x76, 0x59, 0x7b, 0xe5, 0xe5, - 0xea, 0xc3, 0x1c, 0xdf, 0xb9, 0xfa, 0x7e, 0x6f, 0xab, 0xc8, 0xe1, 0x50, 0x5f, 0xf4, 0x43, 0x67, - 0x8b, 0x34, 0x04, 0xbe, 0xd9, 0x43, 0x1d, 0xea, 0x11, 0x57, 0xc0, 0x73, 0x37, 0x4a, 0x42, 0x9d, - 0x97, 0x25, 0xa7, 0x4d, 0x3d, 0x72, 0x06, 0xcf, 0xbf, 0x48, 0x42, 0xf3, 0x23, 0xf4, 0x4e, 0x31, - 0x3c, 0xdc, 0x14, 0x07, 0xae, 0xb2, 0x77, 0xb1, 0xef, 0x73, 0x9d, 0xa6, 0x75, 0xe7, 0x4e, 0xb1, - 0x7b, 0x81, 0x03, 0xe5, 0xec, 0xc8, 0xf7, 0xb9, 0xf5, 0xcf, 0x65, 0xb4, 0x32, 0xc2, 0x1c, 0x87, - 0xc2, 0x3c, 0x47, 0x5b, 0x12, 0xc2, 0x38, 0xc0, 0x12, 0xdc, 0x8c, 0xd7, 0xf2, 0x93, 0x7e, 0xa0, - 0xf9, 0xae, 0x3e, 0x0f, 0xec, 0xda, 0x04, 0x48, 0x0f, 0xec, 0xa1, 0x96, 0x9e, 0x49, 0x2c, 0xc1, - 0xd9, 0x2c, 0x30, 0x32, 0xa1, 0xf9, 0x33, 0xd4, 0x95, 0x3c, 0x11, 0xb2, 0x62, 0x9c, 0xaa, 0xd5, - 0xb2, 0x54, 0xbe, 0x53, 0xec, 0x67, 0x4d, 0x5a, 0xb6, 0xd8, 0xcd, 0xe4, 0xd2, 0xfa, 0x6f, 0xc8, - 0xe5, 0x0c, 0xdd, 0x51, 0xcc, 0x3c, 0x8b, 0xb9, 0x34, 0x3f, 0xe6, 0x6d, 0x65, 0xdf, 0x04, 0xfd, - 0x12, 0x99, 0xa9, 0x20, 0xb3, 0x98, 0xcb, 0x6f, 0x11, 0x67, 0x2a, 0x48, 0x13, 0xd2, 0x47, 0xbb, - 0x42, 0x15, 0x9f, 0x1b, 0x82, 0xd4, 0x54, 0x15, 0x07, 0x10, 0x51, 0x31, 0x29, 0xc0, 0x57, 0xe6, - 0x07, 0xdf, 0xd1, 0x40, 0x9f, 0x2b, 0x1c, 0xa7, 0x80, 0xc9, 0xbd, 0x0c, 0x51, 0xef, 0x66, 0x2f, - 0x65, 0x82, 0x56, 0x75, 0x82, 0x7e, 0x70, 0x03, 0x44, 0x99, 0xa5, 0x43, 0x74, 0x37, 0xc4, 0x2f, - 0x5d, 0x39, 0xe1, 0x4c, 0xca, 0x00, 0x7c, 0x37, 0xc6, 0xe4, 0x12, 0xa4, 0xd0, 0x73, 0xa5, 0xe5, - 0xdc, 0x09, 0xf1, 0xcb, 0xf3, 0x62, 0x6f, 0x94, 0x6d, 0x99, 0x02, 0xbd, 0x5f, 0xa3, 0xe1, 0x17, - 0x98, 0xfb, 0xae, 0x0f, 0x11, 0x0b, 0x5d, 0x0e, 0x63, 0xc5, 0x8f, 0x38, 0x63, 0x64, 0x80, 0x72, - 0x94, 0xe4, 0x8d, 0xac, 0x5e, 0x06, 0x65, 0x13, 0x0f, 0x19, 0x8d, 0xf2, 0x79, 0x6b, 0x55, 0x6c, - 0xad, 0xd0, 0x1e, 0x2a, 0x30, 0xa7, 0x86, 0xf5, 0x08, 0xc0, 0xf2, 0xd0, 0xed, 0xc7, 0x38, 0xf2, - 0xc5, 0x04, 0x5f, 0xc2, 0xe7, 0x20, 0xb1, 0x8f, 0x25, 0x6e, 0xf4, 0xcc, 0x33, 0x00, 0x37, 0x66, - 0x2c, 0xc8, 0x7a, 0x26, 0xa3, 0xa0, 0xb2, 0x67, 0x1e, 0x01, 0x8c, 0x18, 0x0b, 0x54, 0xcf, 0x98, - 0x5d, 0xb4, 0x9a, 0x02, 0x17, 0x55, 0x05, 0x17, 0x4b, 0xeb, 0x27, 0xa8, 0xad, 0x49, 0xe3, 0x88, - 0x5c, 0x0a, 0x73, 0x17, 0xb5, 0x15, 0x12, 0x08, 0x01, 0xa2, 0x6b, 0xf4, 0x5b, 0xfb, 0x6d, 0xa7, - 0x12, 0x58, 0x12, 0xed, 0xbc, 0xee, 0x2d, 0x23, 0xcc, 0xa7, 0x68, 0x35, 0x06, 0x3d, 0x68, 0xb5, - 0x61, 0xe7, 0xf0, 0x63, 0x7b, 0x8e, 0xf7, 0xa2, 0xfd, 0x3a, 0x40, 0xa7, 0x40, 0xb3, 0x78, 0xf5, - 0x82, 0x9a, 0x99, 0x15, 0xc2, 0xbc, 0x98, 0x75, 0xfa, 0xf3, 0xb7, 0x72, 0x3a, 0x83, 0x57, 0xf9, - 0xfc, 0x00, 0x75, 0x8e, 0xb2, 0x63, 0xff, 0x92, 0x0a, 0x79, 0xfd, 0x5a, 0xd6, 0xeb, 0xd7, 0xf2, - 0x0b, 0xb4, 0x39, 0x9c, 0xe0, 0x28, 0x82, 0xe0, 0x9c, 0x69, 0xe2, 0x33, 0x7f, 0x88, 0x10, 0xc9, - 0x24, 0x8a, 0x30, 0xb3, 0xb4, 0xb4, 0x73, 0xc9, 0x89, 0xdf, 0x18, 0x55, 0x8b, 0x8d, 0x51, 0x65, - 0x39, 0x68, 0xeb, 0x42, 0x90, 0x5f, 0x15, 0x6f, 0x96, 0x27, 0xb1, 0x30, 0xef, 0xa2, 0x15, 0xd5, - 0xab, 0x39, 0xd0, 0x92, 0xb3, 0x9c, 0x0a, 0x72, 0xe2, 0x9b, 0xfb, 0xf5, 0x77, 0x11, 0x8b, 0x5d, - 0xea, 0x8b, 0xee, 0x62, 0xbf, 0xb5, 0xbf, 0xe4, 0x6c, 0x26, 0x95, 0xf9, 0x89, 0x2f, 0xac, 0x5f, - 0xa3, 0x4e, 0x0d, 0xd0, 0xdc, 0x44, 0x8b, 0x25, 0xd6, 0x22, 0xf5, 0xcd, 0x07, 0x68, 0xa7, 0x02, - 0x6a, 0xd2, 0x7d, 0x86, 0xd8, 0x76, 0xee, 0x95, 0x0a, 0x0d, 0xc6, 0x17, 0xd6, 0x13, 0xb4, 0x7d, - 0x52, 0x91, 0x4b, 0x39, 0x4c, 0x1a, 0x27, 0x34, 0x9a, 0xc3, 0x78, 0x17, 0xb5, 0xcb, 0xc7, 0xbf, - 0x3e, 0xfd, 0x92, 0x53, 0x09, 0xac, 0x10, 0xdd, 0xba, 0x10, 0xe4, 0x0c, 0x22, 0xbf, 0x02, 0x7b, - 0xcd, 0x05, 0x1c, 0xcf, 0x02, 0xcd, 0xfd, 0xb8, 0xac, 0xdc, 0xfd, 0xc1, 0x40, 0xdd, 0x53, 0x98, - 0x1e, 0x09, 0x41, 0xc7, 0x51, 0x08, 0x91, 0x54, 0x64, 0x81, 0x09, 0xa8, 0x4f, 0xf3, 0x3d, 0xb4, - 0x51, 0x36, 0x5a, 0xd9, 0x5f, 0xeb, 0xce, 0x7a, 0x21, 0xd4, 0x8d, 0xf5, 0x00, 0xa1, 0x98, 0x43, - 0xea, 0x12, 0xf7, 0x12, 0xa6, 0x79, 0x18, 0xbb, 0xf5, 0x59, 0x93, 0xfd, 0x5b, 0xd8, 0xa3, 0xc4, - 0x0b, 0x28, 0x39, 0x85, 0xa9, 0xb3, 0xa6, 0xf4, 0x87, 0xa7, 0x30, 0x55, 0x6f, 0x87, 0x98, 0xbd, - 0x00, 0xae, 0x07, 0x44, 0xcb, 0xc9, 0x16, 0xd6, 0x9f, 0x0c, 0x74, 0xef, 0x02, 0x07, 0xd4, 0xc7, - 0x92, 0xf1, 0xe2, 0xbe, 0x47, 0x89, 0xa7, 0x2c, 0xde, 0x70, 0xaf, 0xd7, 0xa2, 0x5d, 0xbc, 0x21, - 0xda, 0x4f, 0xd0, 0x7a, 0x99, 0x61, 0x15, 0x6f, 0x6b, 0x8e, 0x78, 0x3b, 0x85, 0xc5, 0x29, 0x4c, - 0xad, 0xdf, 0xd5, 0x62, 0x3b, 0x9e, 0xd6, 0x9a, 0x97, 0xff, 0x87, 0xd8, 0x4a, 0xb7, 0xf5, 0xd8, - 0x48, 0xdd, 0xfe, 0xda, 0x01, 0x5a, 0xd7, 0x0f, 0x60, 0xfd, 0xc5, 0x40, 0xdb, 0x75, 0xaf, 0xe2, - 0x9c, 0x8d, 0x78, 0x12, 0xc1, 0x9b, 0xbc, 0x57, 0xf5, 0xb3, 0x58, 0xaf, 0x9f, 0xa7, 0x68, 0xb3, - 0x11, 0x94, 0xc8, 0x6f, 0xe3, 0xa7, 0x73, 0x51, 0x48, 0x8d, 0x1e, 0x9c, 0x8d, 0xfa, 0x39, 0xc4, - 0xf1, 0xd3, 0x6f, 0xaf, 0x7a, 0xc6, 0x77, 0x57, 0x3d, 0xe3, 0x1f, 0x57, 0x3d, 0xe3, 0xab, 0x57, - 0xbd, 0x85, 0xef, 0x5e, 0xf5, 0x16, 0xfe, 0xf6, 0xaa, 0xb7, 0xf0, 0x9b, 0x8f, 0xc7, 0x54, 0x4e, - 0x12, 0xcf, 0x26, 0x2c, 0x1c, 0xe4, 0x3f, 0x8e, 0x95, 0xaf, 0x0f, 0xcb, 0xff, 0xf0, 0xf4, 0x70, - 0xf0, 0xb2, 0xf9, 0x33, 0x2e, 0xa7, 0x31, 0x08, 0x6f, 0x45, 0x97, 0xf5, 0x47, 0xff, 0x0e, 0x00, - 0x00, 0xff, 0xff, 0x50, 0x7d, 0x10, 0xbd, 0xbd, 0x0f, 0x00, 0x00, + // 1598 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x57, 0x4b, 0x73, 0xdc, 0xc6, + 0x11, 0x26, 0xb8, 0x7c, 0xed, 0x2c, 0x1f, 0x12, 0x44, 0x59, 0x4b, 0x85, 0x59, 0xae, 0xe0, 0xc4, + 0xc5, 0x94, 0xcb, 0xd8, 0x90, 0xbe, 0xa4, 0x54, 0x71, 0xb9, 0xc8, 0x95, 0x65, 0xd1, 0x8c, 0xad, + 0x35, 0xc8, 0x50, 0x95, 0xe4, 0x80, 0x1a, 0x0c, 0x5a, 0xbb, 0x53, 0x04, 0x30, 0xd0, 0xcc, 0x00, + 0xd2, 0x5e, 0x72, 0xce, 0xd1, 0xb9, 0xb9, 0x92, 0x8b, 0xf3, 0x0b, 0xf2, 0x37, 0x7c, 0xf4, 0x31, + 0x27, 0x3b, 0x45, 0x1d, 0x72, 0xc8, 0x9f, 0x48, 0xcd, 0xe0, 0xcd, 0x87, 0xb2, 0xaa, 0xc4, 0x37, + 0xcc, 0x4c, 0xf7, 0xd7, 0xdd, 0xd3, 0xdd, 0x5f, 0x0f, 0xd0, 0x3e, 0x8d, 0x24, 0x70, 0x32, 0xc1, + 0x34, 0x72, 0x05, 0x90, 0x84, 0x53, 0x39, 0x1d, 0x10, 0x92, 0x0e, 0x62, 0xce, 0x52, 0xea, 0x03, + 0x1f, 0xa4, 0x7b, 0xe5, 0xb7, 0x1d, 0x73, 0x26, 0x99, 0xf9, 0xee, 0x35, 0x3a, 0x36, 0x21, 0xa9, + 0x5d, 0xca, 0xa5, 0x7b, 0xf7, 0x37, 0xc7, 0x6c, 0xcc, 0xb4, 0xfc, 0x40, 0x7d, 0x65, 0xaa, 0xf7, + 0x77, 0xc6, 0x8c, 0x8d, 0x03, 0x18, 0xe8, 0x95, 0x97, 0x3c, 0x1f, 0x48, 0x1a, 0x82, 0x90, 0x38, + 0x8c, 0x73, 0x81, 0xde, 0x65, 0x01, 0x3f, 0xe1, 0x58, 0x52, 0x16, 0x15, 0x00, 0xd4, 0x23, 0x03, + 0xc2, 0x38, 0x0c, 0x48, 0x40, 0x21, 0x92, 0xca, 0xbd, 0xec, 0x2b, 0x17, 0x18, 0x28, 0x81, 0x80, + 0x8e, 0x27, 0x32, 0xdb, 0x16, 0x03, 0x09, 0x91, 0x0f, 0x3c, 0xa4, 0x99, 0x70, 0xb5, 0xca, 0x15, + 0xb6, 0x6b, 0xe7, 0x84, 0x4f, 0x63, 0xc9, 0x06, 0xe7, 0x30, 0x15, 0xf9, 0xe9, 0x7b, 0x84, 0x89, + 0x90, 0x89, 0x01, 0xa8, 0xc0, 0x22, 0x02, 0x83, 0x74, 0xcf, 0x03, 0x89, 0xf7, 0xca, 0x8d, 0xc2, + 0xef, 0x5c, 0xce, 0xc3, 0xa2, 0x92, 0x21, 0x8c, 0xe6, 0x7e, 0x5b, 0x3f, 0x2c, 0xa1, 0xee, 0x90, + 0x45, 0x22, 0x09, 0x81, 0x1f, 0xf8, 0x3e, 0x55, 0x21, 0x8d, 0x38, 0x8b, 0x99, 0xc0, 0x81, 0xb9, + 0x89, 0x16, 0x25, 0x95, 0x01, 0x74, 0x8d, 0xbe, 0xb1, 0xdb, 0x76, 0xb2, 0x85, 0xd9, 0x47, 0x1d, + 0x1f, 0x04, 0xe1, 0x34, 0x56, 0xc2, 0xdd, 0x79, 0x7d, 0x56, 0xdf, 0x32, 0xb7, 0xd0, 0x4a, 0x96, + 0x05, 0xea, 0x77, 0x5b, 0xfa, 0x78, 0x59, 0xaf, 0x8f, 0x7c, 0xf3, 0x53, 0xb4, 0x4e, 0x23, 0x2a, + 0x29, 0x0e, 0xdc, 0x09, 0xa8, 0xdb, 0xe8, 0x2e, 0xf4, 0x8d, 0xdd, 0xce, 0xfe, 0x7d, 0x9b, 0x7a, + 0xc4, 0x56, 0x17, 0x68, 0xe7, 0xd7, 0x96, 0xee, 0xd9, 0x4f, 0xb4, 0xc4, 0xe1, 0xc2, 0xb7, 0xdf, + 0xef, 0xcc, 0x39, 0x6b, 0xb9, 0x5e, 0xb6, 0x69, 0x3e, 0x40, 0xab, 0x63, 0x88, 0x40, 0x50, 0xe1, + 0x4e, 0xb0, 0x98, 0x74, 0x17, 0xfb, 0xc6, 0xee, 0xaa, 0xd3, 0xc9, 0xf7, 0x9e, 0x60, 0x31, 0x31, + 0x77, 0x50, 0xc7, 0xa3, 0x11, 0xe6, 0xd3, 0x4c, 0x62, 0x49, 0x4b, 0xa0, 0x6c, 0x4b, 0x0b, 0x0c, + 0x11, 0x12, 0x31, 0x7e, 0x19, 0xb9, 0x2a, 0xdb, 0xdd, 0xe5, 0xdc, 0x91, 0x2c, 0xd3, 0x76, 0x91, + 0x69, 0xfb, 0xb4, 0x28, 0x85, 0xc3, 0x15, 0xe5, 0xc8, 0x57, 0x3f, 0xec, 0x18, 0x4e, 0x5b, 0xeb, + 0xa9, 0x13, 0xf3, 0x0b, 0x74, 0x2b, 0x89, 0x3c, 0x16, 0xf9, 0x34, 0x1a, 0xbb, 0x31, 0x70, 0xca, + 0xfc, 0xee, 0x8a, 0x86, 0xda, 0xba, 0x02, 0xf5, 0x28, 0x2f, 0x9a, 0x0c, 0xe9, 0x6b, 0x85, 0xb4, + 0x51, 0x2a, 0x8f, 0xb4, 0xae, 0xf9, 0x25, 0x32, 0x09, 0x49, 0xb5, 0x4b, 0x2c, 0x91, 0x05, 0x62, + 0x7b, 0x76, 0xc4, 0x5b, 0x84, 0xa4, 0xa7, 0x99, 0x76, 0x0e, 0xf9, 0x07, 0x74, 0x4f, 0x72, 0x1c, + 0x89, 0xe7, 0xc0, 0x2f, 0xe3, 0xa2, 0xd9, 0x71, 0xef, 0x16, 0x18, 0x4d, 0xf0, 0x27, 0xa8, 0x4f, + 0xf2, 0x02, 0x72, 0x39, 0xf8, 0x54, 0x48, 0x4e, 0xbd, 0x44, 0xe9, 0xba, 0xcf, 0x39, 0x26, 0xba, + 0x46, 0x3a, 0xba, 0x08, 0x7a, 0x85, 0x9c, 0xd3, 0x10, 0x7b, 0x9c, 0x4b, 0x99, 0x4f, 0xd1, 0xcf, + 0xbc, 0x80, 0x91, 0x73, 0xa1, 0x9c, 0x73, 0x1b, 0x48, 0xda, 0x74, 0x48, 0x85, 0x50, 0x68, 0xab, + 0x7d, 0x63, 0xb7, 0xe5, 0x3c, 0xc8, 0x64, 0x47, 0xc0, 0x1f, 0xd5, 0x24, 0x4f, 0x6b, 0x82, 0xe6, + 0x07, 0xc8, 0x9c, 0x50, 0x21, 0x19, 0xa7, 0x04, 0x07, 0x2e, 0x44, 0x92, 0x53, 0x10, 0xdd, 0x35, + 0xad, 0x7e, 0xbb, 0x3a, 0xf9, 0x24, 0x3b, 0x30, 0x3f, 0x43, 0x0f, 0x6e, 0x34, 0xea, 0x92, 0x09, + 0x8e, 0x22, 0x08, 0xba, 0xeb, 0x3a, 0x94, 0x1d, 0xff, 0x06, 0x9b, 0xc3, 0x4c, 0xec, 0xe1, 0xca, + 0x9f, 0xbe, 0xd9, 0x99, 0xfb, 0xfa, 0x9b, 0x9d, 0x39, 0xeb, 0xef, 0x06, 0xba, 0x37, 0x2c, 0x03, + 0x0f, 0x59, 0x8a, 0x83, 0x1f, 0xb3, 0xc1, 0x0e, 0x50, 0x5b, 0x48, 0x16, 0x67, 0x25, 0xbd, 0xf0, + 0x16, 0x25, 0xbd, 0xa2, 0xd4, 0xd4, 0x81, 0xf5, 0x57, 0x03, 0x6d, 0x7e, 0xf2, 0x22, 0xa1, 0x29, + 0x23, 0xf8, 0xff, 0xc2, 0x07, 0xc7, 0x68, 0x0d, 0x6a, 0x78, 0xa2, 0xdb, 0xea, 0xb7, 0x76, 0x3b, + 0xfb, 0x3f, 0xb7, 0x33, 0x72, 0xb2, 0x4b, 0xce, 0xca, 0x09, 0xca, 0xae, 0x5b, 0x77, 0x9a, 0xba, + 0xd6, 0xbf, 0x0d, 0x74, 0xeb, 0xd3, 0x80, 0x79, 0x38, 0x38, 0x09, 0xb0, 0x98, 0xa8, 0xe4, 0x4d, + 0x55, 0xd4, 0x1c, 0xf2, 0xae, 0xd1, 0xde, 0xcd, 0x1c, 0xb5, 0x52, 0xd3, 0x7d, 0xfc, 0x31, 0xba, + 0x5d, 0xd6, 0x71, 0x79, 0xb9, 0x3a, 0x98, 0xc3, 0x3b, 0x17, 0xdf, 0xef, 0x6c, 0x14, 0x39, 0x1c, + 0xea, 0x8b, 0x7e, 0xe4, 0x6c, 0x90, 0xc6, 0x86, 0x6f, 0xf6, 0x50, 0x87, 0x7a, 0xc4, 0x15, 0xf0, + 0xc2, 0x8d, 0x92, 0x50, 0xe7, 0x65, 0xc1, 0x69, 0x53, 0x8f, 0x9c, 0xc0, 0x8b, 0x2f, 0x92, 0xd0, + 0xfc, 0x10, 0xbd, 0x53, 0x0c, 0x22, 0x37, 0xc5, 0x81, 0xab, 0xf4, 0x5d, 0xec, 0xfb, 0x5c, 0xa7, + 0x69, 0xd5, 0xb9, 0x53, 0x9c, 0x9e, 0xe1, 0x40, 0x19, 0x3b, 0xf0, 0x7d, 0x6e, 0xfd, 0x6b, 0x11, + 0x2d, 0x8d, 0x30, 0xc7, 0xa1, 0x30, 0x4f, 0xd1, 0x86, 0x84, 0x30, 0x0e, 0xb0, 0x04, 0x37, 0xe3, + 0xc8, 0x3c, 0xd2, 0xf7, 0x35, 0x77, 0xd6, 0x67, 0x8b, 0x5d, 0x9b, 0x26, 0xe9, 0x9e, 0x3d, 0xd4, + 0xbb, 0x27, 0x12, 0x4b, 0x70, 0xd6, 0x0b, 0x8c, 0x6c, 0xd3, 0xfc, 0x15, 0xea, 0x4a, 0x9e, 0x08, + 0x59, 0xb1, 0x57, 0xd5, 0xb6, 0x59, 0x2a, 0xdf, 0x29, 0xce, 0xb3, 0x86, 0x2f, 0xdb, 0xf5, 0x7a, + 0xa2, 0x6a, 0xfd, 0x2f, 0x44, 0x75, 0x82, 0xee, 0x28, 0x96, 0xbf, 0x8c, 0xb9, 0x30, 0x3b, 0xe6, + 0x6d, 0xa5, 0xdf, 0x04, 0xfd, 0x12, 0x99, 0xa9, 0x20, 0x97, 0x31, 0x17, 0xdf, 0xc2, 0xcf, 0x54, + 0x90, 0x26, 0xa4, 0x8f, 0xb6, 0x85, 0x2a, 0x3e, 0x37, 0x04, 0xa9, 0x69, 0x2f, 0x0e, 0x20, 0xa2, + 0x62, 0x52, 0x80, 0x2f, 0xcd, 0x0e, 0xbe, 0xa5, 0x81, 0x3e, 0x57, 0x38, 0x4e, 0x01, 0x93, 0x5b, + 0x19, 0xa2, 0xde, 0xf5, 0x56, 0xca, 0x04, 0x2d, 0xeb, 0x04, 0xfd, 0xe4, 0x1a, 0x88, 0x32, 0x4b, + 0xfb, 0xe8, 0x6e, 0x88, 0x5f, 0xb9, 0x72, 0xc2, 0x99, 0x94, 0x01, 0xf8, 0x6e, 0x8c, 0xc9, 0x39, + 0x48, 0xa1, 0x67, 0x54, 0xcb, 0xb9, 0x13, 0xe2, 0x57, 0xa7, 0xc5, 0xd9, 0x28, 0x3b, 0x32, 0x05, + 0x7a, 0xaf, 0x46, 0xe9, 0x2f, 0x31, 0xf7, 0x5d, 0x1f, 0x22, 0x16, 0xba, 0x1c, 0xc6, 0x8a, 0xf7, + 0x70, 0xc6, 0xee, 0x00, 0xe5, 0x58, 0xca, 0x1b, 0x59, 0xbd, 0x32, 0xca, 0x26, 0x1e, 0x32, 0x1a, + 0xe5, 0xb3, 0xdb, 0xaa, 0x98, 0x5f, 0xa1, 0x3d, 0x52, 0x60, 0x4e, 0x0d, 0xeb, 0x31, 0x80, 0xe5, + 0xa1, 0xdb, 0x4f, 0x70, 0xe4, 0x8b, 0x09, 0x3e, 0x87, 0xcf, 0x41, 0x62, 0x1f, 0x4b, 0xdc, 0xe8, + 0x99, 0xe7, 0x00, 0x6e, 0xcc, 0x58, 0x90, 0xf5, 0x4c, 0x46, 0x41, 0x65, 0xcf, 0x3c, 0x06, 0x18, + 0x31, 0x16, 0xa8, 0x9e, 0x31, 0xbb, 0x68, 0x39, 0x05, 0x2e, 0xaa, 0x0a, 0x2e, 0x96, 0xd6, 0x2f, + 0x50, 0x5b, 0x93, 0xc6, 0x01, 0x39, 0x17, 0xe6, 0x36, 0x6a, 0x2b, 0x24, 0x10, 0x02, 0x44, 0xd7, + 0xe8, 0xb7, 0x76, 0xdb, 0x4e, 0xb5, 0x61, 0x49, 0xb4, 0x75, 0xd3, 0xbb, 0x48, 0x98, 0xcf, 0xd0, + 0x72, 0x0c, 0x7a, 0x68, 0x6b, 0xc5, 0xce, 0xfe, 0x47, 0xf6, 0x0c, 0x6f, 0x4f, 0xfb, 0x26, 0x40, + 0xa7, 0x40, 0xb3, 0x78, 0xf5, 0x1a, 0xbb, 0x34, 0x2b, 0x84, 0x79, 0x76, 0xd9, 0xe8, 0xaf, 0xdf, + 0xca, 0xe8, 0x25, 0xbc, 0xca, 0xe6, 0xfb, 0xa8, 0x73, 0x90, 0x85, 0xfd, 0x1b, 0x2a, 0xe4, 0xd5, + 0x6b, 0x59, 0xad, 0x5f, 0xcb, 0x67, 0x68, 0x3d, 0x1f, 0x71, 0xa7, 0x4c, 0x13, 0x9f, 0xf9, 0x53, + 0x84, 0xf2, 0xd9, 0xa8, 0x08, 0x33, 0x4b, 0x4b, 0x3b, 0xdf, 0x39, 0xf2, 0x1b, 0xa3, 0x6a, 0xbe, + 0x31, 0xaa, 0x2c, 0x07, 0x6d, 0x9c, 0x09, 0xf2, 0xdb, 0xe2, 0xfd, 0xf3, 0x34, 0x16, 0xe6, 0x5d, + 0xb4, 0xa4, 0x7a, 0x35, 0x07, 0x5a, 0x70, 0x16, 0x53, 0x41, 0x8e, 0x7c, 0x73, 0xb7, 0xfe, 0xc6, + 0x62, 0xb1, 0x4b, 0x7d, 0xd1, 0x9d, 0xef, 0xb7, 0x76, 0x17, 0x9c, 0xf5, 0xa4, 0x52, 0x3f, 0xf2, + 0x85, 0xf5, 0x3b, 0xd4, 0xa9, 0x01, 0x9a, 0xeb, 0x68, 0xbe, 0xc4, 0x9a, 0xa7, 0xbe, 0xf9, 0x10, + 0x6d, 0x55, 0x40, 0x4d, 0xba, 0xcf, 0x10, 0xdb, 0xce, 0xbd, 0x52, 0xa0, 0xc1, 0xf8, 0xc2, 0x7a, + 0x8a, 0x36, 0x8f, 0x2a, 0x72, 0x29, 0x87, 0x49, 0x23, 0x42, 0xa3, 0x39, 0x8c, 0xb7, 0x51, 0xbb, + 0xfc, 0x91, 0xd0, 0xd1, 0x2f, 0x38, 0xd5, 0x86, 0x15, 0xa2, 0x5b, 0x67, 0x82, 0x9c, 0x40, 0xe4, + 0x57, 0x60, 0x37, 0x5c, 0xc0, 0xe1, 0x65, 0xa0, 0x99, 0x1f, 0xaa, 0x95, 0xb9, 0x3f, 0x1b, 0xa8, + 0x7b, 0x0c, 0xd3, 0x03, 0x21, 0xe8, 0x38, 0x0a, 0x21, 0x92, 0x8a, 0x2c, 0x30, 0x01, 0xf5, 0x69, + 0xbe, 0x8b, 0xd6, 0xca, 0x46, 0x2b, 0xfb, 0x6b, 0xd5, 0x59, 0x2d, 0x36, 0x75, 0x63, 0x3d, 0x44, + 0x28, 0xe6, 0x90, 0xba, 0xc4, 0x3d, 0x87, 0x69, 0xee, 0xc6, 0x76, 0x7d, 0xd6, 0x64, 0xff, 0x29, + 0xf6, 0x28, 0xf1, 0x02, 0x4a, 0x8e, 0x61, 0xea, 0xac, 0x28, 0xf9, 0xe1, 0x31, 0x4c, 0xd5, 0xdb, + 0x21, 0x66, 0x2f, 0x81, 0xeb, 0x01, 0xd1, 0x72, 0xb2, 0x85, 0xf5, 0x17, 0x03, 0xdd, 0x3b, 0xc3, + 0x01, 0xf5, 0xb1, 0x64, 0xbc, 0xb8, 0xef, 0x51, 0xe2, 0x29, 0x8d, 0x37, 0xdc, 0xeb, 0x15, 0x6f, + 0xe7, 0xaf, 0xf1, 0xf6, 0x63, 0xb4, 0x5a, 0x66, 0x58, 0xf9, 0xdb, 0x9a, 0xc1, 0xdf, 0x4e, 0xa1, + 0x71, 0x0c, 0x53, 0xeb, 0x8f, 0x35, 0xdf, 0x0e, 0xa7, 0xb5, 0xe6, 0xe5, 0xff, 0xc5, 0xb7, 0xd2, + 0x6c, 0xdd, 0x37, 0x52, 0xd7, 0xbf, 0x12, 0x40, 0xeb, 0x6a, 0x00, 0xd6, 0xdf, 0x0c, 0xb4, 0x59, + 0xb7, 0x2a, 0x4e, 0xd9, 0x88, 0x27, 0x11, 0xbc, 0xc9, 0x7a, 0x55, 0x3f, 0xf3, 0xf5, 0xfa, 0x79, + 0x86, 0xd6, 0x1b, 0x4e, 0x89, 0xfc, 0x36, 0x7e, 0x39, 0x13, 0x85, 0xd4, 0xe8, 0xc1, 0x59, 0xab, + 0xc7, 0x21, 0x0e, 0x9f, 0x7d, 0x7b, 0xd1, 0x33, 0xbe, 0xbb, 0xe8, 0x19, 0xff, 0xbc, 0xe8, 0x19, + 0x5f, 0xbd, 0xee, 0xcd, 0x7d, 0xf7, 0xba, 0x37, 0xf7, 0x8f, 0xd7, 0xbd, 0xb9, 0xdf, 0x7f, 0x34, + 0xa6, 0x72, 0x92, 0x78, 0x36, 0x61, 0xe1, 0x20, 0xff, 0x09, 0xad, 0x6c, 0x7d, 0x50, 0xfe, 0xd3, + 0xa7, 0xfb, 0x83, 0x57, 0xcd, 0x1f, 0x7b, 0x39, 0x8d, 0x41, 0x78, 0x4b, 0xba, 0xac, 0x3f, 0xfc, + 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7b, 0x4c, 0xb0, 0x24, 0x09, 0x10, 0x00, 0x00, } func (m *ConsumerAdditionProposal) Marshal() (dAtA []byte, err error) { @@ -1342,6 +1350,13 @@ func (m *ConsumerAdditionProposal) MarshalToSizedBuffer(dAtA []byte) (int, error _ = i var l int _ = l + if len(m.DistributionTransmissionChannel) > 0 { + i -= len(m.DistributionTransmissionChannel) + copy(dAtA[i:], m.DistributionTransmissionChannel) + i = encodeVarintProvider(dAtA, i, uint64(len(m.DistributionTransmissionChannel))) + i-- + dAtA[i] = 0x72 + } if m.HistoricalEntries != 0 { i = encodeVarintProvider(dAtA, i, uint64(m.HistoricalEntries)) i-- @@ -2298,6 +2313,10 @@ func (m *ConsumerAdditionProposal) Size() (n int) { if m.HistoricalEntries != 0 { n += 1 + sovProvider(uint64(m.HistoricalEntries)) } + l = len(m.DistributionTransmissionChannel) + if l > 0 { + n += 1 + l + sovProvider(uint64(l)) + } return n } @@ -3080,6 +3099,38 @@ func (m *ConsumerAdditionProposal) Unmarshal(dAtA []byte) error { break } } + case 14: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DistributionTransmissionChannel", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProvider + } + 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 ErrInvalidLengthProvider + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthProvider + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DistributionTransmissionChannel = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipProvider(dAtA[iNdEx:]) diff --git a/x/ccv/types/shared_params.go b/x/ccv/types/shared_params.go index 000a4c3815..04f1cf54e1 100644 --- a/x/ccv/types/shared_params.go +++ b/x/ccv/types/shared_params.go @@ -57,6 +57,16 @@ func ValidateString(i interface{}) error { return nil } +func ValidateDistributionTransmissionChannel(i interface{}) error { + // Accept empty string as valid, since this means a new + // distribution transmission channel will be created + if i == "" { + return nil + } + // Otherwise validate as usual for a channelID + return ValidateChannelIdentifier(i) +} + func ValidateChannelIdentifier(i interface{}) error { value, ok := i.(string) if !ok { From 05c2dae7c6372b1252b9e97215d07c6aa7618f33 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Fri, 16 Jun 2023 15:39:51 -0700 Subject: [PATCH 046/108] docs: ADR for throttle with retries (#1005) * all of ADR is filled out except design portion * design * Update adr-008-throttle-retries.md * Update adr-008-throttle-retries.md * Update adr-008-throttle-retries.md * Apply suggestions from code review Co-authored-by: Marius Poke * nit formatting * describe consumer changes first * add comment on rareness of throttling being triggered * split out paragraph * hopefully better explanation * Update adr-008-throttle-retries.md * accepted * TOC entry --------- Co-authored-by: Marius Poke --- docs/docs/adrs/adr-008-throttle-retries.md | 105 +++++++++++++++++++++ docs/docs/adrs/intro.md | 3 +- 2 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 docs/docs/adrs/adr-008-throttle-retries.md diff --git a/docs/docs/adrs/adr-008-throttle-retries.md b/docs/docs/adrs/adr-008-throttle-retries.md new file mode 100644 index 0000000000..a8f0d250ce --- /dev/null +++ b/docs/docs/adrs/adr-008-throttle-retries.md @@ -0,0 +1,105 @@ +--- +sidebar_position: 7 +title: Throttle with retries +--- + +## ADR 008: Throttle with retries + +## Changelog + +* 6/9/23: Initial draft + +## Status + +Accepted + +## Context + +For context on why the throttling mechanism exists, see [ADR 002](./adr-002-throttle.md). + +Note the terms slash throttling and jail throttling are synonymous, since in replicated security a `SlashPacket` simply jails a validator for downtime infractions. + +Currently the throttling mechanism is designed so that provider logic (slash meter, etc.) dictates how many slash packets can be handled over time. Throttled slash packets are persisted on the provider, leading to multiple possible issues. Namely: + +* If slash or vsc matured packets are actually throttled/queued on the provider, state can grow and potentially lead to a DoS attack. We have short term solutions around this, but overall they come with their own weaknesses. See [#594](https://github.com/cosmos/interchain-security/issues/594). +* If a jailing attack described in [ADR 002](adr-002-throttle.md) were actually to be carried out with the current throttling design, we'd likely have to halt the provider, and perform an emergency upgrade and/or migration to clear the queues of slash packets that were deemed to be malicious. Alternatively, validators would just have to _tough it out_ and wait for the queues to clear, during which all/most validators would be jailed. Right after being jailed, vals would have to unjail themselves promptly to ensure safety. The synchronous coordination required to maintain safety in such a scenario is not ideal. + +So what's the solution? We can improve the throttling mechanism to instead queue/persist relevant data on each consumer, and have consumers retry slash requests as needed. + +## Decision + +### Consumer changes + +Note the consumer already queues up both slash and vsc matured packets via `AppendPendingPacket`. Those packets are dequeued every endblock in `SendPackets` and sent to the provider. + +Instead, we will now introduce the following logic on endblock: + +* Slash packets will always be sent to the provider once they're at the head of the queue. However, once sent, the consumer will not send any trailing vsc matured packets from the queue until the provider responds with an ack that the slash packet has been handled (ie. val was jailed). That is, slash packets block the sending of trailing vsc matured packets in the consumer queue. +* If two slash packets are at the head of the queue, the consumer will send the first slash packet, and then wait for a success ack from the provider before sending the second slash packet. This seems like it'd simplify implementation. +* VSC matured packets at the head of the queue (ie. NOT trailing a slash packet) can be sent immediately, and do not block any other packets in the queue, since the provider always handles them immediately. + +To prevent the provider from having to keep track of what slash packets have been rejected, the consumer will have to retry the sending of slash packets over some period of time. This can be achieved with an on-chain consumer param. The suggested param value would probably be 1/2 of the provider's `SlashMeterReplenishmentPeriod`, although it doesn't matter too much as long as the param value is sane. + +Note to prevent weird edge case behavior, a retry would not be attempted until either a success ack or failure ack has been recv from the provider. + +With the behavior described, we maintain very similar behavior to the current throttling mechanism regarding the timing that slash and vsc matured packets are handled on the provider. Obviously the queueing and blocking logic is moved, and the two chains would have to send more messages between one another (only in the case the throttling mechanism is triggered). + +In the normal case, when no or a few slash packets are being sent, the VSCMaturedPackets will not be delayed, and hence unbonding will not be delayed. + +### Provider changes + +The main change needed for the provider is the removal of queuing logic for slash and vsc matured packets upon being received. + +Instead, the provider will consult the slash meter to determine if a slash packet can be handled immediately. If not, the provider will return an ack message to the consumer communicating that the slash packet could not be handled, and needs to be sent again in the future (retried). + +VSCMatured packets will always be handled immediately upon being received by the provider. + +Note [spec](https://github.com/cosmos/ibc/blob/main/spec/app/ics-028-cross-chain-validation/system_model_and_properties.md#consumer-initiated-slashing). Specifically the section on _VSC Maturity and Slashing Order_. Previously the onus was on the provider to maintain this property via queuing packets and handling them FIFO. + +Now this property will be maintained by the consumer sending packets in the correct order, and blocking the sending of VSCMatured packets as needed. Then, the ordered IBC channel will ensure that Slash/VSCMatured packets are received in the correct order on the provider. + +The provider's main responsibility regarding throttling will now be to determine if a recv slash packet can be handled via slash meter etc., and appropriately ack to the sending consumer. + +### Why the provider can handle VSCMatured packets immediately + +First we answer, what does a VSCMatured packet communicate to the provider? A VSCMatured packet communicates that a VSC has been applied to a consumer long enough that infractions committed on the consumer could have been submitted. + +If the consumer is following the queuing/blocking protocol described. No bad behavior occurs, `VSC Maturity and Slashing Order` property is maintained. + +If a consumer sends VSCMatured packets too leniently: The consumer is malicious and sending duplicate vsc matured packets, or sending the packets sooner than the ccv protocol specifies. In this scenario, the provider needs to handle vsc matured packets immediately to prevent DOS, state bloat, or other issues. The only possible negative outcome is that the malicious consumer may not be able to jail a validator who should have been jailed. The malicious behavior only creates a negative outcome for the chain that is being malicious. + +If a consumer blocks the sending of VSCMatured packets: The consumer is malicious and blocking vsc matured packets that should have been sent. This will block unbonding only up until the VSC timeout period has elapsed. At that time, the consumer is removed. Again the malicious behavior only creates a negative outcome for the chain that is being malicious. + +### Splitting of PRs + +We could split this feature into two PRs, one affecting the consumer and one affecting the provider, along with a third PR which could setup a clever way to upgrade the provider in multiple steps, ensuring that queued slash packets at upgrade time are handled properly. + +## Consequences + +* Consumers will now have to manage their own queues, and retry logic. +* Consumers still aren't trustless, but the provider is now less susceptible to mismanaged or malicious consumers. +* Recovering from the "jailing attack" is more elegant. +* Some issues like [#1001](https://github.com/cosmos/interchain-security/issues/1001) will now be handled implicitly by the improved throttling mechanism. +* Slash and vsc matured packets can be handled immediately once recv by the provider if the slash meter allows. +* In general, we reduce the amount of computation that happens in the provider end-blocker. + +### Positive + +* We no longer have to reason about a "global queue" and a "chain specific queue", and keeping those all in-sync. Now slash and vsc matured packet queuing is handled on each consumer individually. +* Due to the above, the throttling protocol becomes less complex overall. +* We no longer have to worry about throttle related DoS attack on the provider, since no queuing exists on the provider. + +### Negative + +* Increased number of IBC packets being relayed anytime throttling logic is triggered. +* Consumer complexity increases, since consumers now have manage queuing themselves, and implement packet retry logic. + +### Neutral + +* Core throttling logic on the provider remains unchanged, ie. slash meter, replenishment cycles, etc. + +## References + +* [EPIC](https://github.com/cosmos/interchain-security/issues/713) tracking the changes proposed by this ADR +* [ADR 002: Jail Throttling](./adr-002-throttle.md) +* [#594](https://github.com/cosmos/interchain-security/issues/594) \ No newline at end of file diff --git a/docs/docs/adrs/intro.md b/docs/docs/adrs/intro.md index 528b4799ae..bdd59ad20b 100644 --- a/docs/docs/adrs/intro.md +++ b/docs/docs/adrs/intro.md @@ -36,4 +36,5 @@ To suggest an ADR, please make use of the [ADR template](./adr-template.md) prov | [002](./adr-002-throttle.md) | Jail Throttling | Accepted, Implemented | | [003](./adr-003-equivocation-gov-proposal.md) | Equivocation governance proposal | Accepted, Implemented | | [004](./adr-004-denom-dos-fixes) | Denom DOS fixes | Accepted, Implemented | -| [007](./adr-007-pause-unbonding-on-eqv-prop.md) | Pause validator unbonding during equivocation proposal | Proposed | \ No newline at end of file +| [007](./adr-007-pause-unbonding-on-eqv-prop.md) | Pause validator unbonding during equivocation proposal | Proposed | +| [008](./adr-008-throttle-retries.md) | Throttle with retries | Accepted, In-progress | From 8c8e6a0804d39f14e7a030de19539ed037cddbc0 Mon Sep 17 00:00:00 2001 From: Philip Offtermatt <57488781+p-offtermatt@users.noreply.github.com> Date: Mon, 19 Jun 2023 09:59:40 +0200 Subject: [PATCH 047/108] Add time and block advancement integration for CometMock (#1017) * Add time and block advancement * Adhere to gocritic: use += * Remove extra debug output * Fix: use correct key when consumer key is not assigned * Correct private key address field * Clarify comment for WaitTime * Use bool instead of *bool type * Add review comments --- tests/e2e/actions.go | 103 ++++++++++++++++++++++++++++++++++++++++--- tests/e2e/config.go | 29 +++++++++--- tests/e2e/state.go | 26 ++++++++++- tests/e2e/steps.go | 1 + 4 files changed, 146 insertions(+), 13 deletions(-) diff --git a/tests/e2e/actions.go b/tests/e2e/actions.go index 06bcb7f5f7..ecad541290 100644 --- a/tests/e2e/actions.go +++ b/tests/e2e/actions.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "log" + "math" "os/exec" "strconv" "strings" @@ -72,7 +73,7 @@ type StartChainValidator struct { stake uint } -func (tr TestRun) startChain( +func (tr *TestRun) startChain( action StartChainAction, verbose bool, ) { @@ -171,6 +172,14 @@ func (tr TestRun) startChain( chain: action.chain, validator: action.validators[0].id, }, verbose) + + // store the fact that we started the chain + tr.runningChains[action.chain] = true + fmt.Println("Started chain", action.chain) + if tr.timeOffset != 0 { + // advance time for this chain so that it is in sync with the rest of the network + tr.AdvanceTimeForChain(action.chain, tr.timeOffset) + } } type submitTextProposalAction struct { @@ -489,7 +498,7 @@ type voteGovProposalAction struct { propNumber uint } -func (tr TestRun) voteGovProposal( +func (tr *TestRun) voteGovProposal( action voteGovProposalAction, verbose bool, ) { @@ -521,7 +530,7 @@ func (tr TestRun) voteGovProposal( } wg.Wait() - time.Sleep(time.Duration(tr.chainConfigs[action.chain].votingWaitTime) * time.Second) + tr.WaitTime(time.Duration(tr.chainConfigs[action.chain].votingWaitTime) * time.Second) } type startConsumerChainAction struct { @@ -531,7 +540,7 @@ type startConsumerChainAction struct { genesisChanges string } -func (tr TestRun) startConsumerChain( +func (tr *TestRun) startConsumerChain( action startConsumerChainAction, verbose bool, ) { @@ -1219,8 +1228,8 @@ func (tr TestRun) transferChannelComplete( executeCommand(chanOpenConfirmCmd, "transferChanOpenConfirm") } -func executeCommand(cmd *exec.Cmd, cmdName string) { - if verbose != nil && *verbose { +func executeCommandWithVerbosity(cmd *exec.Cmd, cmdName string, verbose bool) { + if verbose { fmt.Println(cmdName+" cmd:", cmd.String()) } @@ -1238,7 +1247,7 @@ func executeCommand(cmd *exec.Cmd, cmdName string) { for scanner.Scan() { out := scanner.Text() - if verbose != nil && *verbose { + if verbose { fmt.Println(cmdName + ": " + out) } } @@ -1247,6 +1256,11 @@ func executeCommand(cmd *exec.Cmd, cmdName string) { } } +// Executes a command with verbosity specified by CLI flag +func executeCommand(cmd *exec.Cmd, cmdName string) { + executeCommandWithVerbosity(cmd, cmdName, *verbose) +} + type relayPacketsAction struct { chainA chainID chainB chainID @@ -1284,6 +1298,8 @@ func (tr TestRun) relayPacketsGorelayer( if err != nil { log.Fatal(err, "\n", string(bz)) } + + tr.waitBlocks(action.chainA, 1, 30*time.Second) } func (tr TestRun) relayPacketsHermes( @@ -1466,6 +1482,8 @@ func (tr TestRun) redelegateTokens(action redelegateTokensAction, verbose bool) if err != nil { log.Fatal(err, "\n", string(bz)) } + + tr.waitBlocks(action.chain, 1, 10*time.Second) } type downtimeSlashAction struct { @@ -1473,6 +1491,20 @@ type downtimeSlashAction struct { validator validatorID } +// takes a string representation of the private key like +// `{"address":"DF090A4880B54CD57B2A79E64D9E969BD7514B09","pub_key":{"type":"tendermint/PubKeyEd25519","value":"ujY14AgopV907IYgPAk/5x8c9267S4fQf89nyeCPTes="},"priv_key":{"type":"tendermint/PrivKeyEd25519","value":"TRJgf7lkTjs/sj43pyweEOanyV7H7fhnVivOi0A4yjW6NjXgCCilX3TshiA8CT/nHxz3brtLh9B/z2fJ4I9N6w=="}}` +// and returns the value of the "address" field +func (tr TestRun) getValidatorKeyAddressFromString(keystring string) string { + var key struct { + Address string `json:"address"` + } + err := json.Unmarshal([]byte(keystring), &key) + if err != nil { + log.Fatal(err) + } + return key.Address +} + func (tr TestRun) invokeDowntimeSlash(action downtimeSlashAction, verbose bool) { // Bring validator down tr.setValidatorDowntime(action.chain, action.validator, true, verbose) @@ -1491,6 +1523,30 @@ func (tr TestRun) setValidatorDowntime(chain chainID, validator validatorID, dow lastArg = "up" } + if tr.useCometmock { + // send set_signing_status either to down or up for validator + var validatorAddress string + if chain == chainID("provi") { + validatorAddress = tr.getValidatorKeyAddressFromString(tr.validatorConfigs[validator].privValidatorKey) + } else { + var valAddressString string + if tr.validatorConfigs[validator].useConsumerKey { + valAddressString = tr.validatorConfigs[validator].consumerPrivValidatorKey + } else { + valAddressString = tr.validatorConfigs[validator].privValidatorKey + } + validatorAddress = tr.getValidatorKeyAddressFromString(valAddressString) + } + + method := "set_signing_status" + params := fmt.Sprintf(`{"private_key_address":"%s","status":"%s"}`, validatorAddress, lastArg) + address := tr.getQueryNodeRPCAddress(chain) + + tr.curlJsonRPCRequest(method, params, address) + tr.waitBlocks(chain, 1, 10*time.Second) + return + } + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. cmd := exec.Command( "docker", @@ -1764,6 +1820,8 @@ func (tr TestRun) assignConsumerPubKey(action assignConsumerPubKeyAction, verbos // TODO: @MSalopek refactor this so test config is not changed at runtime // make the validator use consumer key + // @POfftermatt I am currently using this for downtime slashing with cometmock + // (I need to find the currently used validator key address)Í valCfg.useConsumerKey = true tr.validatorConfigs[action.validator] = valCfg } @@ -1828,3 +1886,34 @@ func (tr TestRun) GetPathNameForGorelayer(chainA, chainB chainID) string { return pathName } + +// WaitTime waits for the given duration. +// The CometMock version of this takes a pointer to the TestRun as it needs to manipulate +// information in the testrun that stores how much each chain has waited, to keep times in sync. +// Be careful that all functions calling WaitTime should therefore also take a pointer to the TestRun. +func (tr *TestRun) WaitTime(duration time.Duration) { + if !tr.useCometmock { + time.Sleep(duration) + } else { + tr.timeOffset += duration + for chain, running := range tr.runningChains { + if !running { + continue + } + tr.AdvanceTimeForChain(chain, duration) + } + } +} + +func (tr TestRun) AdvanceTimeForChain(chain chainID, duration time.Duration) { + // cometmock avoids sleeping, and instead advances time for all chains + method := "advance_time" + params := fmt.Sprintf(`{"duration_in_seconds": "%d"}`, int(math.Ceil(duration.Seconds()))) + + address := tr.getQueryNodeRPCAddress(chain) + + tr.curlJsonRPCRequest(method, params, address) + + // wait for 1 block of the chain to get a block with the advanced timestamp + tr.waitBlocks(chain, 1, time.Minute) +} diff --git a/tests/e2e/config.go b/tests/e2e/config.go index 3038f69f4e..94fae8438f 100644 --- a/tests/e2e/config.go +++ b/tests/e2e/config.go @@ -76,10 +76,19 @@ type TestRun struct { useCometmock bool // if false, nodes run CometBFT useGorelayer bool // if false, Hermes is used as the relayer gaiaTag string + // chains which are running, i.e. producing blocks, at the moment + runningChains map[chainID]bool + // Used with CometMock. The time by which chains have been advanced. Used to keep chains in sync: when a new chain is started, advance its time by this value to keep chains in sync. + timeOffset time.Duration name string } +// Initialize initializes the TestRun instance by setting the runningChains field to an empty map. +func (tr *TestRun) Initialize() { + tr.runningChains = make(map[chainID]bool) +} + func getDefaultValidators() map[validatorID]ValidatorConfig { return map[validatorID]ValidatorConfig{ validatorID("alice"): { @@ -143,7 +152,7 @@ func getDefaultValidators() map[validatorID]ValidatorConfig { } func SlashThrottleTestRun() TestRun { - return TestRun{ + tr := TestRun{ name: "slash-throttling", containerConfig: ContainerConfig{ containerName: "interchain-security-slash-container", @@ -183,10 +192,12 @@ func SlashThrottleTestRun() TestRun { tendermintConfigOverride: `s/timeout_commit = "5s"/timeout_commit = "1s"/;` + `s/peer_gossip_sleep_duration = "100ms"/peer_gossip_sleep_duration = "50ms"/;`, } + tr.Initialize() + return tr } func DefaultTestRun() TestRun { - return TestRun{ + tr := TestRun{ name: "default", containerConfig: ContainerConfig{ containerName: "interchain-security-container", @@ -226,6 +237,8 @@ func DefaultTestRun() TestRun { tendermintConfigOverride: `s/timeout_commit = "5s"/timeout_commit = "1s"/;` + `s/peer_gossip_sleep_duration = "100ms"/peer_gossip_sleep_duration = "50ms"/;`, } + tr.Initialize() + return tr } func DemocracyTestRun(allowReward bool) TestRun { @@ -241,7 +254,7 @@ func DemocracyTestRun(allowReward bool) TestRun { consumerGenChanges += " | .app_state.ccvconsumer.params.reward_denoms = [\"stake\"]" } - return TestRun{ + tr := TestRun{ name: "democracy", containerConfig: ContainerConfig{ containerName: "interchain-security-democ-container", @@ -276,10 +289,12 @@ func DemocracyTestRun(allowReward bool) TestRun { tendermintConfigOverride: `s/timeout_commit = "5s"/timeout_commit = "1s"/;` + `s/peer_gossip_sleep_duration = "100ms"/peer_gossip_sleep_duration = "50ms"/;`, } + tr.Initialize() + return tr } func MultiConsumerTestRun() TestRun { - return TestRun{ + tr := TestRun{ name: "multi-consumer", containerConfig: ContainerConfig{ containerName: "interchain-security-multic-container", @@ -329,10 +344,12 @@ func MultiConsumerTestRun() TestRun { tendermintConfigOverride: `s/timeout_commit = "5s"/timeout_commit = "3s"/;` + `s/peer_gossip_sleep_duration = "100ms"/peer_gossip_sleep_duration = "100ms"/;`, } + tr.Initialize() + return tr } func ChangeoverTestRun() TestRun { - return TestRun{ + tr := TestRun{ name: "changeover", containerConfig: ContainerConfig{ containerName: "interchain-security-changeover-container", @@ -374,6 +391,8 @@ func ChangeoverTestRun() TestRun { tendermintConfigOverride: `s/timeout_commit = "5s"/timeout_commit = "1s"/;` + `s/peer_gossip_sleep_duration = "100ms"/peer_gossip_sleep_duration = "50ms"/;`, } + tr.Initialize() + return tr } func (s *TestRun) SetDockerConfig(localSdkPath string, useGaia bool, gaiaTag string) { diff --git a/tests/e2e/state.go b/tests/e2e/state.go index 15500dd01f..4de28277d2 100644 --- a/tests/e2e/state.go +++ b/tests/e2e/state.go @@ -210,6 +210,16 @@ func (tr TestRun) getBlockHeight(chain chainID) uint { } func (tr TestRun) waitBlocks(chain chainID, blocks uint, timeout time.Duration) { + if tr.useCometmock { + // call advance_blocks method on cometmock + // curl -H 'Content-Type: application/json' -H 'Accept:application/json' --data '{"jsonrpc":"2.0","method":"advance_blocks","params":{"num_blocks": "36000000"},"id":1}' 127.0.0.1:22331 + tcpAddress := tr.getQueryNodeRPCAddress(chain) + method := "advance_blocks" + params := fmt.Sprintf(`{"num_blocks": "%d"}`, blocks) + + tr.curlJsonRPCRequest(method, params, tcpAddress) + return + } startBlock := tr.getBlockHeight(chain) start := time.Now() @@ -722,7 +732,11 @@ func (tr TestRun) getValidatorHome(chain chainID, validator validatorID) string // getQueryNode returns query node tcp address on chain. func (tr TestRun) getQueryNode(chain chainID) string { - return fmt.Sprintf("tcp://%s:26658", tr.getQueryNodeIP(chain)) + return fmt.Sprintf("tcp://%s", tr.getQueryNodeRPCAddress(chain)) +} + +func (tr TestRun) getQueryNodeRPCAddress(chain chainID) string { + return fmt.Sprintf("%s:26658", tr.getQueryNodeIP(chain)) } // getQueryNodeIP returns query node IP for chain, @@ -737,3 +751,13 @@ func (tr TestRun) getQueryNodeIP(chain chainID) string { } return fmt.Sprintf("%s.253", tr.chainConfigs[chain].ipPrefix) } + +func (tr TestRun) curlJsonRPCRequest(method, params, address string) { + cmd_template := `curl -H 'Content-Type: application/json' -H 'Accept:application/json' --data '{"jsonrpc":"2.0","method":"%s","params":%s,"id":1}' %s` + + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. + cmd := exec.Command("docker", "exec", tr.containerConfig.instanceName, "bash", "-c", fmt.Sprintf(cmd_template, method, params, address)) + + verbosity := false + executeCommandWithVerbosity(cmd, "curlJsonRPCRequest", verbosity) +} diff --git a/tests/e2e/steps.go b/tests/e2e/steps.go index 7613b05558..ee53e9fd2a 100644 --- a/tests/e2e/steps.go +++ b/tests/e2e/steps.go @@ -35,6 +35,7 @@ var shortHappyPathSteps = concatSteps( stepsDelegate("consu"), stepsUnbond("consu"), stepsRedelegateShort("consu"), + stepsDowntime("consu"), stepsStartRelayer(), stepsConsumerRemovalPropNotPassing("consu", 2), // submit removal prop but vote no on it - chain should stay stepsStopChain("consu", 3), // stop chain From 8068773887b55204b9825e61492496ea69aad052 Mon Sep 17 00:00:00 2001 From: Marius Poke Date: Tue, 20 Jun 2023 18:45:29 +0200 Subject: [PATCH 048/108] ci: update sonar.exclusions (#1036) * update sonar.exclusions * fix comment --- sonar-project.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sonar-project.properties b/sonar-project.properties index 585cf1700f..34d8d28397 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -14,7 +14,7 @@ sonar.organization=cosmos # All golang artifacts sonar.sources=. # Do not calculate coverage metrics for statements in these files -sonar.exclusions=**/vendor/**,**/*.pb.go,**/*.pb.gw.go,proto,**/*_test.go,tests/**,testutil/**,legacy_ibc_testing/**,app/consumer/app.go +sonar.exclusions=**/vendor/**,**/*.pb.go,**/*.pb.gw.go,proto,**/*_test.go,tests/**,testutil/**,legacy_ibc_testing/**,docs/**,app/**,cmd/**, sonar.tests=. # Run unit and integration tests, but not E2E tests sonar.test.inclusions=**/*_test.go From 827eece97aa4f209c9aded543f13edb3d3e99904 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue, 20 Jun 2023 11:24:02 -0700 Subject: [PATCH 049/108] docs: soft opt out adr (#1014) * context and decision * consequences * everything stays on consumer * Update adr-009-soft-opt-out.md * Update adr-009-soft-opt-out.md * Apply suggestions from code review Co-authored-by: Marius Poke * ToC entry * update wasted computation consequence * Apply suggestions from code review Co-authored-by: Marius Poke --------- Co-authored-by: Marius Poke --- docs/docs/adrs/adr-009-soft-opt-out.md | 48 ++++++++++++++++++++++++++ docs/docs/adrs/intro.md | 1 + 2 files changed, 49 insertions(+) create mode 100644 docs/docs/adrs/adr-009-soft-opt-out.md diff --git a/docs/docs/adrs/adr-009-soft-opt-out.md b/docs/docs/adrs/adr-009-soft-opt-out.md new file mode 100644 index 0000000000..6d90710317 --- /dev/null +++ b/docs/docs/adrs/adr-009-soft-opt-out.md @@ -0,0 +1,48 @@ +--- +sidebar_position: 10 +title: Soft Opt-Out +--- +## ADR 009: Soft Opt-Out + +## Changelog + +* 6/13/23: Initial draft of ADR. Feature already implemented and in production. + +## Status + +Accepted + +## Context + +Some small validators may not have the resources needed to validate all consumer chains. Therefore a need exists to allow the bottom `x%` of validators to opt-out of validating a consumer chain. Meaning downtime infractions for these validators are dropped without ever reaching the provider. + +This document specifies a modification to the ccv protocol which allows the bottom x% of the validator set by power to opt out of validating consumer chains without being jailed or otherwise punished for it. The feature is implemented with entirely consumer-side code. + +## Decision + +A consumer param exists, known as `SoftOptOutThreshold`, which is a string decimal in the range of [0, 0.2], that determines the portion of validators which are allowed to opt out of validating that specific consumer. + +In every consumer beginblocker, a function is ran which determines the so called _smallest non opt-out voting power_. Validators with voting power greater than or equal to this value must validate the consumer chain, while validators below this value may opt out of validating the consumer chain. + +The smallest non opt-out voting power is recomputed every beginblocker in `UpdateSmallestNonOptOutPower()`. In a nutshell, the method obtains the total voting power of the consumer, iterates through the full valset (ordered power ascending) keeping track of a power sum, and when `powerSum / totalPower > SoftOptOutThreshold`, the `SmallestNonOptOutPower` is found and persisted. + +Then, whenever the `Slash()` interface is executed on the consumer, if the voting power of the relevant validator being slashed is less than `SmallestNonOptOutPower` for that block, the slash request is dropped and never sent to the provider. + +## Consequences + +### Positive + +* Small validators can opt out of validating specific consumers without being punished for it. + +### Negative + +* The bottom `x%` is still part of the total voting power of the consumer chain. This means that if the soft opt-out threshold is set to `10%` for example, and every validator in the bottom `10%` opts out from validating the consumer, then a `24%` downtime of the remaining voting power would halt the chain. This may be especially problematic during consumer upgrades. +* In nominal scenarios, consumers with soft opt out enabled will be constructing slash packets for small vals, which may be dropped. This is wasted computation, but necessary to keep implementation simple. Note that the sdk's [full downtime logic](https://github.com/cosmos/cosmos-sdk/blob/d3f09c222243bb3da3464969f0366330dcb977a8/x/slashing/keeper/infractions.go#L75) is always executed on the consumer, which can be computationally expensive and slow down certain blocks. + +### Neutral + +* Validators in the bottom of the valset who don't have to validate, may receive large delegation(s) which suddenly boost the validator to the subset that has to validate. This may catch the validator off guard. + +## References + +* Original issue with some napkin math [#784](https://github.com/cosmos/interchain-security/issues/784) diff --git a/docs/docs/adrs/intro.md b/docs/docs/adrs/intro.md index bdd59ad20b..d0c097fb06 100644 --- a/docs/docs/adrs/intro.md +++ b/docs/docs/adrs/intro.md @@ -38,3 +38,4 @@ To suggest an ADR, please make use of the [ADR template](./adr-template.md) prov | [004](./adr-004-denom-dos-fixes) | Denom DOS fixes | Accepted, Implemented | | [007](./adr-007-pause-unbonding-on-eqv-prop.md) | Pause validator unbonding during equivocation proposal | Proposed | | [008](./adr-008-throttle-retries.md) | Throttle with retries | Accepted, In-progress | +| [009](./adr-009-soft-opt-out.md) | Soft Opt-out | Accepted, Implemented | From 7b7bd65c305d45125993e94e5af1d90565edfcda Mon Sep 17 00:00:00 2001 From: Marius Poke Date: Tue, 20 Jun 2023 20:43:20 +0200 Subject: [PATCH 050/108] chore: update meaning of `type-prefix!` in production PRs (#1021) update meaning of in PRs Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> --- .github/PULL_REQUEST_TEMPLATE/production.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE/production.md b/.github/PULL_REQUEST_TEMPLATE/production.md index 0d197d890c..885d852cf0 100644 --- a/.github/PULL_REQUEST_TEMPLATE/production.md +++ b/.github/PULL_REQUEST_TEMPLATE/production.md @@ -19,7 +19,7 @@ please add links to any relevant follow up issues.* I have... * [ ] Included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title -* [ ] Added `!` to the type prefix if API or client breaking change +* [ ] Added `!` to the type prefix if state-machine breaking change (i.e., requires coordinated upgrade) * [ ] Confirmed this PR does not introduce changes requiring state migrations, OR migration code has been added to consumer and/or provider modules * [ ] Targeted the correct branch (see [PR Targeting](https://github.com/cosmos/interchain-security/blob/main/CONTRIBUTING.md#pr-targeting)) * [ ] Provided a link to the relevant issue or specification From d4dde74b062c2fded0d3b3dbef4b3b0229e317f3 Mon Sep 17 00:00:00 2001 From: MSalopek Date: Wed, 21 Jun 2023 11:23:16 +0200 Subject: [PATCH 051/108] feat!: upgrade ics sdk47 ibc7 (#1019) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Merge main into feat/upgrade-ics-sdk47-ibc7 (#955) * build(deps): bump gaurav-nelson/github-action-markdown-link-check from 1.0.13 to 1.0.15 (#928) build(deps): bump gaurav-nelson/github-action-markdown-link-check Bumps [gaurav-nelson/github-action-markdown-link-check](https://github.com/gaurav-nelson/github-action-markdown-link-check) from 1.0.13 to 1.0.15. - [Release notes](https://github.com/gaurav-nelson/github-action-markdown-link-check/releases) - [Commits](https://github.com/gaurav-nelson/github-action-markdown-link-check/compare/1.0.13...1.0.15) --- updated-dependencies: - dependency-name: gaurav-nelson/github-action-markdown-link-check dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore: bump hermes (#921) * bump the version of hermes used in docs and images * use the multiplatform ghcr.io build of hermes --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jacob Gadikian * feat!: upgrade ics to ibc-go/v7 and cosmos-sdk/v0.47 (#918) * change ibc module paths * Squashed commit of the following: commit ece7bc92a0b388fde32efc39358e3a096949457a Merge: 8763d99c ead0d214 Author: Jacob Gadikian Date: Fri Apr 21 16:26:55 2023 +0700 Merge remote-tracking branch 'filter/new_branch_sdk47' into new-new-new-sdk47 commit ead0d21487858fef5e30ddbaf7cedb47b41d7296 Author: Jacob Gadikian Date: Thu Apr 20 14:22:26 2023 +0700 remove proto files completely commit 79f565a4d51c08a961e48450be108f6a08ee7a23 Author: Jacob Gadikian Date: Thu Apr 20 14:16:49 2023 +0700 make protos match exactly commit c4c856c049c4a718ebf063df279a613d5db56819 Author: Jacob Gadikian Date: Thu Apr 20 14:14:51 2023 +0700 make protos match the v7.0.x branch exactly commit af812332d52cb972204490e89e1e3d75bb626141 Author: Jacob Gadikian Date: Thu Apr 20 14:11:31 2023 +0700 remove even more proto code commit 97e7021559eaa10a3a8020df5b930f688c7a3ecd Author: Jacob Gadikian Date: Thu Apr 20 13:56:33 2023 +0700 remove unneeded proto deps and build with many fewer commit ddb6218eccad467013b7c585a70bac2eb039d017 Author: Jacob Gadikian Date: Thu Apr 20 12:25:46 2023 +0700 update proto build image commit 19fc8a0da6ddd86bb295d413e8ae4928b33f4f0c Author: Ruslan Akhtariev Date: Thu Apr 20 11:35:55 2023 +0800 Revert "remove code from third party -> add deps directly to buf.yml" This reverts commit a53d890f831a20060da57877f19ec769d6a506f6. commit a53d890f831a20060da57877f19ec769d6a506f6 Author: Ruslan Akhtariev Date: Thu Apr 20 11:34:07 2023 +0800 remove code from third party -> add deps directly to buf.yml commit 88d79f88b8724754ca4a4a6a21f41a6c2d370d51 Merge: b672630b d0ee1ee6 Author: Jacob Gadikian Date: Wed Apr 19 23:13:10 2023 +0800 Merge branch 'main' into new_branch_sdk47 commit d0ee1ee66b2eb69c039402f5d3e34a2e2a01a51a Author: Thomas Bruyelle Date: Wed Apr 19 16:55:22 2023 +0200 fix(build): make proto-update-deps (#830) * fix(build): make proto-update-deps The URL to the cosmos-sdk SDK_PROTO_URL was using a branch that doesn't exists (any more I presume). As a result, `make proto-update-deps` wasn't working properly and was filling all the cosmos proto files with `404 Not Found`. Fix by using the correct branch name, which is `interchain-security-rebase.0.45.11`. * use SDK latest tag commit b672630bada19249db7bd759c0af771cae5697b8 Merge: 7ca44282 f7fb129e Author: Jacob Gadikian Date: Mon Apr 17 21:36:20 2023 +0700 Merge remote-tracking branch 'origin/main' into new_branch_sdk47 commit 7ca44282579d579874a6d9ea504e3184e63f1b96 Merge: 1909670e 5a94f896 Author: vuong <56973102+vuong177@users.noreply.github.com> Date: Fri Apr 14 16:17:35 2023 +0700 Merge pull request #1 from notional-labs/vuong/fix-proto fix gogo proto commit 5a94f896bbd909e75f32b83c084e355d276b1bdb Author: vuong Date: Fri Apr 14 16:14:41 2023 +0700 fix gogo proto commit f7fb129e9db991a6ab714ad6689221e84c7b894b Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Thu Apr 13 06:58:33 2023 -0700 Soft opt out (#833) * WIP soft opt out code with incomplete boilerplate * proto changes * Seems like it should work * Unit test for UpdateLargestSoftOptOutValidatorPower * fixes and renames, unit tests work * update comment * log * Update proto/interchain_security/ccv/consumer/v1/consumer.proto Co-authored-by: Marius Poke * better validation for soft opt out threshhold * improve test * slicestable * semantics and improved test * use correct key util * Update module.go * comment * updated semantics * separate files * fix TestMakeConsumerGenesis test * fix naming * change upper bound on soft opt out thresh * fix test * allow empty valset for tests * gofumpt and fix from merge * Update x/ccv/consumer/types/params_test.go * Update x/ccv/consumer/types/params.go * Soft opt out diff tests (#847) * wip * fixes for ts build * AI fixed my bug lol * throw error when needed * comment * disable soft opt-out in diff testing * update diff testing model * update UTs --------- Co-authored-by: mpoke * add comment about beginblocker order requirement for soft opt-out --------- Co-authored-by: Jehan Tremback Co-authored-by: Marius Poke Co-authored-by: Simon Noetzlin commit 673b6c44af8fd0eddbc90c7c3db05fc25cc8ae85 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Wed Apr 12 03:24:41 2023 -0700 Fix Makefile (#837) Update Makefile Co-authored-by: Simon Noetzlin commit 1909670e298a3d2dc94da45d6ec296e57fdca4de Merge: c76c7284 7fd358f4 Author: sontrinh16 Date: Wed Apr 5 15:48:00 2023 +0700 fix bug commit 7fd358f47df7c1ebef4548ed2bb507c33671a81f Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue Apr 4 20:43:46 2023 -0700 feat: standalone to consumer changeover part 1 (#757) * on-chain upgrade to consumer chain wip * add preCCV store and use it on democracy staking * add TODOs and one more packet possibility * status update * Resolve hermes start issue for trusted validator set by changing revision height * remove intermediary logs * remove further unused codebase * updates for endblocker test, existing test fixes, get last validators * update for slashing sovereign validators for the fault made before consumer chain upgrade height * resolve comments on github and slack communication * update sovereign app to use v4 ibc from v3 & resolve consumer module merge conflict fix issue * Update app/sovereign/upgrades/v3/upgrades.go Co-authored-by: yaruwangway <69694322+yaruwangway@users.noreply.github.com> * rm sovereign chain and tests. Will be replaced by simapp and integration tests * duplicate module name * add comment * small rename * remove democracy staking changes * consumer ccv beginblock, endblock, and initgenesis order shouldn't matter * add mock calls to compile * adjust tests for new keeper field * add registerDemocConsumer method * split out preCCV flag and initial valset * cleanup consumer module * cleanup * more cleanup * temp changes to validators.go * comment out test * rm bad code from merge * comment * Update app.go * UTs for CRUD * UTs for keys * use make for mocks * todo * changeover method and test * resolve #783 * comment * comments * add appropriate TODOs, restore changes to main * final nits before non-draft * comment on ChangeoverToConsumer * more clear comment * small comment change * update InitGenesis comment * sovereign -> standalone * missed a file * builds now * update comment after debug * naming refactor * edge case for val in old and new sets * restore keys after rebase --------- Co-authored-by: jstr1121 Co-authored-by: jstr1121 <118450565+jstr1121@users.noreply.github.com> Co-authored-by: yaruwangway <69694322+yaruwangway@users.noreply.github.com> commit c76c7284804f7a56f5a240c68c43fcb1c6db6d6b Merge: b9db2396 46f568f5 Author: sontrinh16 Date: Wed Apr 5 10:30:54 2023 +0700 fixing merge conflict commit 46f568f57de69b3462c167e898a770399c68c891 Author: Simon Noetzlin Date: Tue Apr 4 14:12:45 2023 +0200 chore: swap name of 'e2e' and 'integration' tests (#681) * save first changes * fix gh workflow * update gh actions * fix bug * squash commits * Simply use Test rather than Ingt for naming integration test keepers * update git workflows commit b9db2396b53235873072a26484e654ebfe2e9afa Author: Son Trinh Date: Thu Mar 30 17:06:37 2023 +0700 fix x folder commit b4103d3644db155df36653a873ddf3d06512efde Author: Son Trinh Date: Wed Mar 29 17:14:43 2023 +0700 add forked staking proto commit d8c696e45b6b7522665b55b4e05e9981126300b9 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Thu Mar 23 11:35:58 2023 -0700 Introduce docs website (#759) * init docusaurus repo * unify theme with cosmos-sdk docs * update config * add FAQ sections * terms * Create overview.md * consumer dev folder * smol * Create technical-specification.md * add new stuff * add key assignment documentation * fix typo * add clarification * update documentation; add features section; improve overview * mv website to docs root; mv old readmes to old_docs * add doc deployer * make deployable to github pages * add consumer initiated slashing doc page * sovereign -> standalone * add validators section * fix typos * update small things * rename validator stuff * add joining-testnet docs * add title to joining testnet * minor refactors * refactor faq, update testnet guide * update footers * update testnet repo links * Fix typo Change ". Ie." to ", i.e." * Fix typo: you key => your key * Fix typo: cosumer => consumer * update copyright section so docusaurus builds * Add . at the end of info boxes * Minor grammar change * Add missing word "the" * Fix typo * update broken link for ics-testnets * Remove duplicated paragraphs * Adjust wording --------- Co-authored-by: Matija Salopek Co-authored-by: MSalopek <35486649+MSalopek@users.noreply.github.com> Co-authored-by: Philip Offtermatt <57488781+p-offtermatt@users.noreply.github.com> commit 0f7ba20ec157afc8c0af2b974f08fdc000837c0c Author: Thomas Bruyelle Date: Thu Mar 16 08:13:24 2023 +0100 chore: add Makefile target to generate mocks (#769) commit 85235c8b0efabfce98c98bf5628bac46b9c8b7a4 Author: MSalopek <35486649+MSalopek@users.noreply.github.com> Date: Mon Mar 6 18:53:41 2023 +0100 allow using gaia as provider in integration tests (#735) * allow using gaia as provider in integration tests * add changes to makefile * add gaia dockerfile * update testing docs * update Makefile; validate gaia tags (support >= v9.x.x) --------- Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> commit cf02d4f45b0c935e890acfd1a7a1efc5869a033a Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Thu Mar 2 13:48:08 2023 -0800 Key assignment type safety (#725) * pb changes * nvm dont wanna open that can of worms * still wip * more fixes * almost * builds * helpers and fixed one file * comments * mas * test fix * fix another * types * smol * un mas * un mas * nit * reformat * mas * fix last bug * to fix integration test * proper way to do stringer * Update slashing.go * Update slashing.go * links * comments * Update keeper.go * smol * nit * changes to TestHandleEquivocationProposal * merge with fixes * merge fix * comment --------- Co-authored-by: MSalopek <35486649+MSalopek@users.noreply.github.com> commit 7f2207ad77b6faf568e8ff4b9d1d372d33b09692 Author: MSalopek <35486649+MSalopek@users.noreply.github.com> Date: Thu Mar 2 17:52:59 2023 +0100 update protos; fix missing proto dependencies (#752) commit 7ee9fcd763d712bede87748ada7b41590f731c10 Author: MSalopek <35486649+MSalopek@users.noreply.github.com> Date: Tue Feb 28 18:03:17 2023 +0100 add interchain security consumer QueryParams (#746) add QueryParams commit 0ddbd12b762d1120bb8fa1432edc10ed5de88689 Author: Thomas Bruyelle Date: Mon Feb 6 18:17:31 2023 +0100 feat: Equivocation gov proposal (#703) This change adds a new kind of gov proposal that will slash and tombstone validators for double-signing. The proposal handler is added in the `provider` module, and use the `evidence` module to handle the equivocations. Co-authored-by: Albert Le Batteux Co-authored-by: Jehan commit 0724edce7de9327dc57f50b95bc64738714824bf Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Mon Jan 30 10:16:30 2023 -0800 fix: slash meter replenishment (#687) * this test should fail * changes * refactors * smol * comments * naming * smalls * update E2e tests to validate new behavior * nit * whoops * change key name * set time w/in method * fix typo commit ac4be76bf07788ae5aae6fc40907aac51b531926 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Fri Jan 20 05:01:36 2023 -0800 Bump IBC refs to ver 4.2.0 (#654) * Update gitignore * Add ibc testing folder * WIP replacing ibcsim * Tests pass * Update ibc-go dependency * Remove TODOs * Remove unused code * Fixes ibcsim simapp dep * Remove unneeded simapp code from #632 (#636) delete code * Fix lint * Update dependencies and linters * Test gosec ignore * Fix gosec * Fix linting * Update sonarcloud ignore for ibc * Revert lint change * Removed unused code * Refactor ibc directory * Add back gaia tests and add ibc-testing disclosure * wip * compiles * tests pass * todos * fix codeql file indentation * 2nd attempt to fix codeql * 3rd attempt * update OnChanOpenInit version handling to follow ics26 * revert module version * remove version checking in provider OnChanOpenInit * address left TODOs Co-authored-by: lg Co-authored-by: Daniel Co-authored-by: lg <8335464+glnro@users.noreply.github.com> Co-authored-by: Simon Noetzlin Co-authored-by: Marius Poke commit 2e064193dd1e0aeea2149548818d23dc849ed189 Author: MSalopek <35486649+MSalopek@users.noreply.github.com> Date: Fri Jan 20 12:09:51 2023 +0100 run happy path tests on push; bump hermes version (#659) * use official hermes release * refactor integration test main.go * update automated-tests integration test run * fix worng container teardown * refactor main.go; add parallel execution * update Makefile * simplify code * refactor for naming consistency * fix string formatting commit 7c9d0934002377f2b95d7d722fe0101df5f190fc Author: Marius Poke Date: Fri Dec 23 18:44:10 2022 +0100 Fix: Iteration through PacketMaturityTimes assumes maturity time order (#622) * WIP convert iterators to array getters. Still need to rename functions, and some compile errors in tests. * WIP - compiles, fixing tests * Unit and e2e tests work * add notes about stopping iteration * WIP - rename and add some notes * Add types to proto * delete unused code * resolve naming conflict * implement another type as proto * fixing more stuff * delete TODOJEHAN.md * adds many of Marius's iteration order comments from 599, and does some small refactors for clarity * fix nil pointer deref * call GetAllConsumerChains once * expand TestGetAllChannelToChains * expand TestGetAllUnbondingOps * GetAllUnbondingOpIndexes; cleanup proto files * fix GetAllValsetUpdateBlockHeights and UTs * remove GetAllSlashAck * add tests for GetFirstVscSendTimestamp * key assignment iterators * reviewed proposals * add TestGetAllValsetUpdateBlockHeights * add TestGetAllOutstandingDowntimes * add GetElapsedPacketMaturityTimes * fix linter * fix linter * prevent implicit memory aliasing * add UTC to TestPacketMaturityTime * fix TestPacketMaturityTime * avoid local variable name shadowing * Update x/ccv/consumer/keeper/keeper.go Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> * replace cases with packets in TestPacketMaturityTime * add expected order to TestPacketMaturityTime * add expected order to TestGetAllHeightToValsetUpdateIDs * add expected order to TestGetAllOutstandingDowntimes * add TestGetAllCCValidator * add expected order to TestGetAllConsumerChains * add expected order to TestGetAllChannelToChains * add expected order to TestGetAllUnbondingOps * add expected order to TestGetAllUnbondingOpIndexes * add expected order to TestGetAllValsetUpdateBlockHeights * add expected order to TestInitTimeoutTimestamp * add expected order to TestVscSendTimestamp * add expected order to TestGetAllValidatorConsumerPubKey * add expected order to TestGetAllValidatorsByConsumerAddr * add expected order to TestGetAllKeyAssignmentReplacements * add expected order to TestGetAllConsumerAddrsToPrune * iterate over packet maturities in order of time * fix linter * move AppendMany to utils * review suggestions * refactor TestPacketMaturityTime UT * nits Co-authored-by: Jehan Tremback Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> commit 4063734e3584a93175159ef1e09843360fae3335 Author: Simon Noetzlin Date: Thu Dec 22 17:43:04 2022 +0100 refactor: wrap VSCMatured/Slash packets into a consumer packet type (#626) * refactor: create a consumer packet type - Create a ConsumerPacketData type definition at the CCV protocol level - Update consumer to send ConsumerPacketData to provider - Update provider to receive ConsumerPacketData Co-authored-by: mpoke commit e8bc5b878efef22b5dde5df4977abda5645d3322 Author: Jehan Date: Wed Dec 21 15:18:02 2022 -0800 Refactor: Convert iterators to array getters (#596) * WIP convert iterators to array getters. Still need to rename functions, and some compile errors in tests. * WIP - compiles, fixing tests * Unit and e2e tests work * add notes about stopping iteration * WIP - rename and add some notes * Add types to proto * delete unused code * resolve naming conflict * implement another type as proto * fixing more stuff * delete TODOJEHAN.md * adds many of Marius's iteration order comments from 599, and does some small refactors for clarity * fix nil pointer deref * call GetAllConsumerChains once * expand TestGetAllChannelToChains * expand TestGetAllUnbondingOps * GetAllUnbondingOpIndexes; cleanup proto files * fix GetAllValsetUpdateBlockHeights and UTs * remove GetAllSlashAck * add tests for GetFirstVscSendTimestamp * key assignment iterators * reviewed proposals * add TestGetAllValsetUpdateBlockHeights * add TestGetAllOutstandingDowntimes * add GetElapsedPacketMaturityTimes * fix linter * fix linter * prevent implicit memory aliasing * add UTC to TestPacketMaturityTime * fix TestPacketMaturityTime * avoid local variable name shadowing * Update x/ccv/consumer/keeper/keeper.go Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> * replace cases with packets in TestPacketMaturityTime * add expected order to TestPacketMaturityTime * add expected order to TestGetAllHeightToValsetUpdateIDs * add expected order to TestGetAllOutstandingDowntimes * add TestGetAllCCValidator * add expected order to TestGetAllConsumerChains * add expected order to TestGetAllChannelToChains * add expected order to TestGetAllUnbondingOps * add expected order to TestGetAllUnbondingOpIndexes * add expected order to TestGetAllValsetUpdateBlockHeights * add expected order to TestInitTimeoutTimestamp * add expected order to TestVscSendTimestamp * add expected order to TestGetAllValidatorConsumerPubKey * add expected order to TestGetAllValidatorsByConsumerAddr * add expected order to TestGetAllKeyAssignmentReplacements * add expected order to TestGetAllConsumerAddrsToPrune * Add test for GetSlashAndTrailingData (#623) * add test * comments * Update throttle.go * use InitTimeoutTimestamp instead of two slices * Fix: Change keys for storing proposals (#620) * change keys for storing proposals * apply review suggestions * Apply suggestions from code review Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Co-authored-by: Jehan Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Co-authored-by: mpoke Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> commit 8603f9c97548fb4f3979e85e99bb6979b0eaf269 Author: MSalopek <35486649+MSalopek@users.noreply.github.com> Date: Tue Dec 20 20:29:32 2022 +0100 add slash throttling queries (#600) * add slash throttle queries * add slash throttle integration tests * add integration tests * add integration tests * make tests pass * should build now * implicit memory aliasing stuff * rm file * refactor queries * changes * new wrapper type * Throttle queries refactors (#614) * refactors * Update state.go * rm duplicated imports * change slash meter params in default test run * add comment * move state checks to provider Co-authored-by: Shawn Marshall-Spitzbart <44221603+smarshall-spitzbart@users.noreply.github.com> commit 0657172ad63490f62ddbb22f7518e0b223cd9844 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue Dec 20 06:11:53 2022 -0800 GlobalSlashEntry protobuf type (#613) * changes * indentation fix * un mas commit 61608316cf01d1388907e18290c7f2c894c2c0fa Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Mon Dec 19 10:37:17 2022 -0800 Throttle refactors (#611) * comments and move panic * proto changes * naming * remove break label * refactor HandlePacketDataForChain * Revert "refactor HandlePacketDataForChain" This reverts commit 8f6a29679e1499d605579e941ed74ba67b1d4e05. * comment * comments commit a6716a6a6e6e00992a0f2b05b985edf98b76bad9 Author: lg <8335464+glnro@users.noreply.github.com> Date: Fri Dec 16 16:52:09 2022 +0100 refactor: TrustingPeriodFraction should be a fraction. (#593) * WIP * Refactor TrustingPeriodFraction * Update default TrustingPeriodFraction to 2/3 or 66% Co-authored-by: Jehan commit 3a8d0a27dfdb2abece8ce5dd86ae5172e8652581 Author: MSalopek <35486649+MSalopek@users.noreply.github.com> Date: Thu Dec 8 09:57:42 2022 +0100 update consumer addition proposal (#558) * update ConsumerAdditionProposal in provider.proto * add ValidateBasic for ConsumerAdditionProposal message * fix failing ValidateBasic tests * make all tests work * make all tests work * update proposal in integration tests * update comment * refactor after rebase * run make proto-gen after rebase on main * remove LockUnbonding flag and references from repo (PR #551) * refactor after reviews commit f57c604c2e2a51c1e9dafad1d9e0332e461e2bf4 Author: Marius Poke Date: Wed Dec 7 11:52:49 2022 +0100 Key assignment (#515) * add MsgAssignConsumerKey * add MsgAssignConsumerKey * fix package name * add keys * add keeper methods for key assignment * handle MsgAssignConsumerKey * map addresses in slash requests * prune old consumer addresses * move AssignConsumerKey logic to keeper * update consumer initial valset * add ApplyKeyAssignmentToValUpdates * fix client creation * do not check init valset on consumer * clean state on val removal * fix TestAssignConsensusKeyForConsumerChain * delete on val removal * remove reverse mapping on val removal * remove pending key assignment in EndBlock * add query endpoints add summary of indexes change ConsumerValidatorByVscID to ConsumerAddrsToPrune * Refactor AssignConsumerKey for clarity (IMO) * finish key assignment genesis code- untested * FIxed mocks compile issue - not sure if it works right though. * add test for init and export genesis * set after get in AssignConsumerKey * enable AssignConsumerKey to be called twice * remove key assignment on chain removal * apply some review comments * fix bug: two validator with same consumer key * rename key: ConsumerValidatorsByVscIDBytePrefix -> ConsumerAddrsToPruneBytePrefix * PendingKeyAssignment -> KeyAssignmentReplacements * msg.ProviderAddr is a validator addr * fix: key assignment genesis tests (#517) * Fix consumer init genesis test * fix provider genesis tests * fix key assignement handler * fix linter * fix merge conflict * fix ProviderValidatorAddress * remove unused expectation Co-authored-by: Marius Poke * add key assignment CRUD operations unit tests (#516) * test val consumer key related CRUD * test val consumer addr related CRUD * test pending key assignments related CRUD * refactor after review session * refactor after review session * add prune key CRUD tests * renamings in testfiles * improve KeyAssignmentReplacement set and get * remove ApplyKeyAssignmentToInitialValset (redundant) * add invariant to docstring of AppendConsumerAddrsToPrune * fix address conversion * adding e2e tests * fix linter * add queries; setup integration tests (#519) * add queries; setup integration testse * test key assignment before chain start * fix state queries; refactor * rm extra comment * rm unused action field * bump voting times in all tests * add provider address query to tests * Adds some very basic random testing and unit tests (#522) * Adds imports * Does multi iterations: fails! * Handle errs * checkpoint debug * Pre introduce dynamic mock * Issue seems to be resolved * Removes prints in key asisgn * Removes debug, pre reintroduce all test features * Fix some magic numbers, bring back prune check * Pre rework initial assignments * Refactor and tidyup * Better docs, clarity, org Co-authored-by: Daniel * Enable key assignment testing for all e2e tests (#524) * split CCVTestSuite.setupCallback in two * pre-assign keys for all vals of first consumer * fix linter * remove TestConsumerGenesis * adding ADR * move handler.go outside client/ * replace [][]byte with AddressList * remove IterateAllConsumerAddrsToPrune; not needed * apply review suggestions * fix linter * Danwt/key assignment slash test (#545) * cp * wip * note * cp * Adds slash test Co-authored-by: Daniel * Fixes #503 prevents two key assignment key overlap security issues (#556) * Deletes out of date duplicate code * Adds check that validator with key does not already exist * Partially adjust assign unit test * Finishes adjusting unit * Updates stress test to never find a validator * Improves comment * Fixes handler_test * Adds validatorI iterator to expected keeper * Implements AfterValidatorCreated hook * Names * Simplifies validator query * Adds hooks test * Remove TODO * Fix random sim test Co-authored-by: Daniel * Bump AssignConsumerKey comment * improve comments for iterators * Masa/key assignment integration tests amend (#548) * handle gosec false positive * add err checks for key assign; rm multiconsumer tests * guestimate block window for keyswaps in happyPeth * start multiconsumer with flag * remove node_modules * fix comment Co-authored-by: Jehan Tremback Co-authored-by: Simon Noetzlin Co-authored-by: MSalopek <35486649+MSalopek@users.noreply.github.com> Co-authored-by: Daniel T <30197399+danwt@users.noreply.github.com> Co-authored-by: Daniel Co-authored-by: Jehan commit 174f4cd5965b28fc7cb34fc1f4841857d71a8a18 Author: MSalopek <35486649+MSalopek@users.noreply.github.com> Date: Mon Dec 5 09:27:28 2022 +0100 refactor provider pending packets handling (#552) commit fb63b1849862b7d28541065a3636f48bb59555d7 Author: Simon Noetzlin Date: Thu Dec 1 22:05:17 2022 +0100 update provider genesis validation (#525) * update provider genesis validation * Update client ID validation for provider genesis * Make provider VSCID to be stricly positive Update provider genesis validation * update comment * remove tmp files * fix provider genesis validation bugs * remove wrongly introduced ibc-go dep * typo * improve coverage Co-authored-by: Shawn Marshall-Spitzbart <44221603+smarshall-spitzbart@users.noreply.github.com> commit b1a3e53ef301606be0dd09f231fd362c9cee92a9 Author: MSalopek <35486649+MSalopek@users.noreply.github.com> Date: Tue Nov 22 19:49:19 2022 +0100 add consumer addition proposal documentation (#502) * add consumer addition proposal documentation * update after reviews Co-authored-by: Shawn Marshall-Spitzbart <44221603+smarshall-spitzbart@users.noreply.github.com> commit 2466b26406258501f7d9b7c955a81d7248a84944 Author: Simon Noetzlin Date: Fri Nov 18 19:15:43 2022 +0100 Update #264 - updates genesis and genesis tests (#382) * reformat consumer genesis test * remove validator fill in of ExportAppStateAndValidators * checkpoint, testing export genesis consumer * test consumer export * make pass the tests * fix export height to valset update id in consumer * pass the tests * pass the tests * * Update the provider and consumer export/init genesis with the new CCV states * Improve consumer export genesis UT when channel is established or not * Set the consumer ExportAppStateAndValidators to not return validators * Add the new CCV states to the provider and consumer gensis proto files * remove pendingVSCPackets * remove references in create consumer chain proposal setters and getters * fix unchecked errors * fix iterator bug * fix linter * format provider genesis tests * format consumer genesis tests * clarify consumer keeper genesis * remove unused test helpers * Feat: update consumer init and export genesis * Stop exporting client and consensus states in consumer genesis * Add LastTransmissionBlockHeight to genesis proto * Revert "Feat: update consumer init and export genesis" This reverts commit eb59e502aa4c8adb35435ff006a7db0fdb5f14c0. * * Add LastTransmissionBlockHeight to consumer genesis proto * Set slashing states and LastTransmissionBlockHeight during consumer init genesis * Update consumer init * Update consumer genesis export * fix last nits * Fix consumer InitGenesis * Update comments in genesis.proto * format consumer genesis test * update comments * Update provider genesis comments * fix small lint errs * * Update consumer genesis validation * Fix export genesis bug * Document consumer genesis validation * Document consumer genesis validation * Update after #448 merge * Update x/ccv/consumer/types/genesis.go Co-authored-by: Marius Poke Co-authored-by: Jehan Co-authored-by: Shawn Marshall-Spitzbart <44221603+smarshall-spitzbart@users.noreply.github.com> Co-authored-by: Marius Poke commit 3362a1ccc44b62339be1c101da22ef14a485ba0c Author: Marius Poke Date: Fri Nov 18 09:45:29 2022 +0100 handle provider and consumer client expiration (#448) * handle expired client when sending packets * add e2e test * add upgradeExpiredClient to e2e tests * improve incrementTime... functions * fix golangci-lint error * add client expired check * replace incrementTimeBy w/ incrementTime * replace AppendPendingVSC w/ AppendPendingVSCs * simplify logic of sendValidatorUpdates * separate PrepareIBCPacketSend from SendIBCPacket * error handling on SendPacket * export pending VSC packets * improve comments * use k.GetCCVTimeoutPeriod * remove GetUpgradeKeeper * AppendPendingVSCs: use variadic function * remove unnecessary if * refactor pending VSC CRUD methods * refactor sending valset updates to chains * add tests for VSC queueing * refactor after reviews * refactor after reviews * Merge marius/435-client-expired-consumer into marius/435-client-expired Squashed commit of the following: commit 3d82d19304a49938bfef573c99d2a77182167645 Author: mpoke Date: Fri Nov 11 10:37:06 2022 +0100 fix typo commit 1efa9909162acb22a0e6d70e8da540ba437a3a59 Author: mpoke Date: Wed Nov 9 19:07:30 2022 +0100 avoid trying to send on expired client commit a0cb6452776cdf68bf1f35ec5c069bdd76086991 Author: mpoke Date: Wed Nov 9 15:56:59 2022 +0100 error handling on SendPacket commit 7c9c7629966a7d0b894fde3be9ad83f36afac97f Author: mpoke Date: Wed Nov 9 13:55:05 2022 +0100 use PrepareIBCPacketSend pattern on consumer commit e7ff9d96fd325f851c1c1eb7dc1ed87c65274878 Author: mpoke Date: Wed Nov 9 10:17:18 2022 +0100 update QA plan commit d7fafe8e9987f3b449e3cff07733f8316c484027 Author: mpoke Date: Wed Nov 9 10:09:41 2022 +0100 add e2e test TestConsumerPacketSendExpiredClient commit 1722f1319edb44e3dd867329c6c6875436d9457e Author: mpoke Date: Tue Nov 8 20:20:13 2022 +0100 remove SlashRequest from proto commit 241e13b2d9d47b641a9054973f4d109c78e68ec6 Author: mpoke Date: Tue Nov 8 20:17:52 2022 +0100 remove pending slash requests from genesis commit 073f10160dd9a1d4cd857043e4dcff494230e489 Author: mpoke Date: Tue Nov 8 19:44:46 2022 +0100 replace pending SlashRequests w/ peding DataPackets commit a2d1069459f99de0c3d2ce8d4794e51cff5cd8ed Author: mpoke Date: Tue Nov 8 19:08:33 2022 +0100 code for pending data packets commit acc3454279052237054abab26bf20c7f5a42c386 Author: mpoke Date: Mon Nov 7 21:03:03 2022 +0100 add e2e test commit 6170fa879745bb8f1e12f82b47deee13462f3c0e Author: mpoke Date: Mon Nov 7 11:37:57 2022 +0100 handle expired client when sending packets * and packet queueing to consumer keeper * refactor e2e tests * refactor after review session * additional refactor after reviews Co-authored-by: Matija Salopek Co-authored-by: Jehan commit 34c28bcd3f00afd6c2f0c7b4096abf4169accbec Author: Shawn Marshall-Spitzbart <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Mon Nov 14 16:32:31 2022 -0800 circuit breaker params (#444) * changes * Update params.go commit b0840486632e85dffc18420d53a720619949e09f Author: Marius Poke Date: Fri Nov 4 21:49:06 2022 +0100 VSCPackets should have timeout on provider (#422) * add provider-based timeout params * add InitTimeoutTimestamp to store * add init timeout logic * params boilerplate code & making tests pass * add TestInitTimeout* e2e tests * improve e2e tests; add test case to TestUndelegationDuringInit * remove VSC timeout * remove VSC timeout param * add testcase to TestValidateParams * handle StopConsumerChain error & gofmt * add VSC timeout period param * Fix init timeout conflicts (#409) * Importable e2e tests (#401) * fixes * add comment to GetInitTimeoutTimestamp * add VscTimeoutTimestamp key and tests * change VSCTimeoutTimestamp key * fix e2e tests * add e2e test * remove useless code * improve comment * copy -> append in provider key definitions (#426) Update keys.go * Update tests/e2e/unbonding.go Co-authored-by: Shawn Marshall-Spitzbart <44221603+smarshall-spitzbart@users.noreply.github.com> * Update x/ccv/provider/keeper/keeper_test.go Co-authored-by: Shawn Marshall-Spitzbart <44221603+smarshall-spitzbart@users.noreply.github.com> * update comment * replace removedChainIds w/ chainIdsToRemove * changing keys from (chainID, ts) to (chainID, vscID) * make UnbondingOpIndexKey consistent with VscSendingTimestampKey Co-authored-by: Shawn Marshall-Spitzbart <44221603+smarshall-spitzbart@users.noreply.github.com> commit 46d5c056aa2affe2683dae389274afc4e81fdbf8 Author: Marius Poke Date: Tue Nov 1 20:39:30 2022 +0100 Channel initialization timeout (#406) * add provider-based timeout params * add InitTimeoutTimestamp to store * add init timeout logic * params boilerplate code & making tests pass * add TestInitTimeout* e2e tests * improve e2e tests; add test case to TestUndelegationDuringInit * remove VSC timeout * remove VSC timeout param * add testcase to TestValidateParams * handle StopConsumerChain error & gofmt * Fix init timeout conflicts (#409) * Importable e2e tests (#401) * fixes * add comment to GetInitTimeoutTimestamp * Update proto/interchain_security/ccv/provider/v1/provider.proto Co-authored-by: Aditya * fix formatting in proto file * add comment to SetConsumerChain * fix typo * add comment re. EndBlock order * change name of testcase in TestUndelegationDuringInit Co-authored-by: Shawn Marshall-Spitzbart <44221603+smarshall-spitzbart@users.noreply.github.com> Co-authored-by: Aditya commit a6b8233c72c17019c187e0b6698a260741bd7416 Author: Shawn Marshall-Spitzbart <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Fri Oct 28 08:34:26 2022 -0700 Consumer Unbonding As Param (#410) Co-authored-by: Daniel T <30197399+danwt@users.noreply.github.com> Co-authored-by: Daniel commit 2046d8fff17840f166bd0a0f49a3fa938022103a Author: MSalopek <35486649+MSalopek@users.noreply.github.com> Date: Tue Oct 25 15:55:40 2022 +0200 324 create queries for internal ccv state (#366) * add query protos * add ConsumerChains provider query * wip: add queries for pending proposals and distributions * wip: add queries for pending proposals and distributions * add stop, start proposals to queries * add stop, start proposals queries to cli * add consumer queries * add fee distribution tests * test getting consumer chain add/remove proposals * register consumer queries * rm unnecessary iterator checks * unify naming in query functions * remove matured proposals * refactor tests and grpc queries * add client ID to consumer list query * run make proto-gen after rebase on main * fix failing tests; reflect repo changes in testutils * address review comments and refactor * refactor query consumer chains * add missing newline in query.proto Co-authored-by: Marius Poke Co-authored-by: Jehan commit d7bfd3a03b220618a9b5c82eaa8dc217384f39d8 Author: Shawn Marshall-Spitzbart <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Thu Oct 20 10:47:27 2022 -0700 Replace hardcoded constants with params (#393) * changes * edits * Update params_test.go * small * Update genesis_test.go * remove "num" from historical entries param * comment * use params p1 * use params p2 * use params p3 * p4 * change default transfer timeout period * Update proposal_test.go * default historical entries * is negative * add test case * forgot one * comment commit a8d1ee86ba8a96cc53f9475c30db0e98f699c007 Author: Shawn Marshall-Spitzbart <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Mon Oct 10 02:11:38 2022 -0700 Make CCV packet timeout a param (#376) * large commit * got ridda stuff * Update params.go Co-authored-by: Jehan Co-authored-by: Daniel T <30197399+danwt@users.noreply.github.com> commit 46a9e1a0a5456617511ed18bf720d86f82ab8c92 Author: Shawn Marshall-Spitzbart <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue Oct 4 15:41:29 2022 -0700 close 339 (#373) Co-authored-by: Jehan commit 45d52e962e87239988297fd2cd4377fbf44f7b31 Author: Simon Noetzlin Date: Wed Oct 5 00:09:58 2022 +0200 Update export and init genesis (#264) * reformat consumer genesis test * remove validator fill in of ExportAppStateAndValidators * checkpoint, testing export genesis consumer * test consumer export * make pass the tests * fix export height to valset update id in consumer * pass the tests * pass the tests * * Update the provider and consumer export/init genesis with the new CCV states * Improve consumer export genesis UT when channel is established or not * Set the consumer ExportAppStateAndValidators to not return validators * Add the new CCV states to the provider and consumer gensis proto files * remove pendingVSCPackets * remove references in create consumer chain proposal setters and getters * fix unchecked errors * fix iterator bug * fix linter * format provider genesis tests * format consumer genesis tests Co-authored-by: Jehan commit 8ac91e113f156d812e9dca22f74991905372b985 Author: Marius Poke Date: Fri Sep 23 01:22:54 2022 +0200 gov-distribution module (#130) * distribution alternative allocation * update distribution to work off of bonded validators not votes * copy of consumer app * added ccvstaking, ccvdistribution, ccvgov and ccvminting * add cmd interchain-security-cdd * distribution tokens should be coming from ConsumerRedistributeName not feeCollector * beginning of tests * Rebase and fix build errors * Democracy chain integration tests, part 1 * Democracy chain integration tests, part 2 * Clean up and e2e test for democracy distribution * gov-distribution module - cr fix * fix small merge issue Co-authored-by: rigelrozanski Co-authored-by: billy rennekamp Co-authored-by: dusan-ethernal Co-authored-by: stana-ethernal Co-authored-by: Jehan Co-authored-by: Jehan Tremback commit 2f1f620775e3f5450bc47e651db2d24ad11df03d Author: MSalopek <35486649+MSalopek@users.noreply.github.com> Date: Wed Sep 21 00:55:21 2022 +0200 use protobufs to define ccv state (#332) * refactor UnbondingOpsIndex operations Define message UnbondingOpsIndex in ccv protos. Use UnbondingOpsIndex instead of []uint64 where applicable. * update UnbondingOpsIndex tests * refactor MaturedUnboundingOps store operations Define message MaturedUnboundingOps in ccv protos. Refactor code to use new message where applicable. * update e2e tests * refactor protobuf usage for ccv state * add slash requests message * use protobuf for storing slashes on consumer * use protobuf for storing slash acks on provider Co-authored-by: Jehan commit 25bd62758a9940e55401075a2cb8505765e797aa Author: Shawn Marshall-Spitzbart <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue Sep 20 14:13:48 2022 -0700 Proposal naming refactors (#354) * consumer addition props * missed one * acronyms * consumer removal props * the rest * comment * handle cli and integration tests * remove unneeded returned err Co-authored-by: Jehan commit d6a3b1cf62a7d35d2db82b0e2c44fa383c12b802 Author: MSalopek <35486649+MSalopek@users.noreply.github.com> Date: Fri Sep 9 14:15:12 2022 +0200 update buf googleapis dependency (#352) * update buf googleapis dependency Updated buf dependencies usin buf mod update --only buf.build/googleapis/googleapis Changed tidy to be compatible to 1.18 only Closes: #347 * update proto-builder; third party staking module commit ea292999b84d5d075199cbc0d59f9fb0de459e24 Author: Shawn Marshall-Spitzbart <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Thu Sep 8 11:44:13 2022 -0700 Extend #350 (#355) readme and makefile commit 5dd941386ff560a92619a2f3cb9ee377449eb603 Author: MSalopek <35486649+MSalopek@users.noreply.github.com> Date: Thu Sep 8 15:43:38 2022 +0200 allow selecting test granularity using make (#350) * allow selecting test granularity using make Adds new commands to makefile: * make test-short (unit, e2e) * make test-diff (difference tests only) * make test-integration (integration tests only) * make test-no-cache (equivalent to make test with caching disabled) Closes: #345 * Update README.md (remove static analysis) Co-authored-by: Daniel T <30197399+danwt@users.noreply.github.com> commit bfd886d4201d0dd7247df378e9d6e3c68379348b Author: Marius Poke Date: Thu Jul 7 14:15:10 2022 +0200 Add VSCMatured packets instead of acks (#188) * iterate over all consumer chains * add pending VSCs * replace UnbondingTime with PacketMaturityTime; add method to compute consumer unbonding time * store unbonding time on consumer chain * Update x/ccv/consumer/keeper/keeper.go * fix EndBlockCallback on provider; add test for pendingVSCs * fix GetConsumerClient for nonexisting chainID * fix client unbonding times in tests * wip * TestUndelegationDuringInit done * fix TestUnbondingNoConsumer * test multiple pending VSC packets * add VSCMaturedPacketData and remove packets from UnbondingSequence * add found return to GetPendingVSCs * apply changes from review * fix TestUndelegationDuringInit * fix TestUndelegationEdgeCase * fix TestTimelyUndelegation1 and rename to TestUndelegationConsumerFirst * fix TestTimelyUndelegation2 and rename to TestUndelegationProviderFirst * cleanup unbonding tests * fix KeeperTestSuite/TestOnRecvPacket * fix KeeperTestSuite/TestUnbondMaturePackets * fix TestPacketRoundtrip * fixing ibc ack handling - wip * handle ibc acks correctly * remove TODO * fix typo * Update x/ccv/consumer/keeper/relay.go Co-authored-by: Aditya * add logging error on ErrorAcknowledgement * add logging error on ErrorAcknowledgement Co-authored-by: Aditya commit 744d4a7dbfc17f737d6097ebd7a3d589e982ae8d Merge: 27ab2ba5 d91b4101 Author: Simon Noetzlin Date: Fri Jun 24 14:19:06 2022 +0200 Merge pull request #124 from cosmos/sainoe/remove-consumer-chain Remove consumer chain from provider commit d91b4101043625b715e3ee0301f92fac6be3f2c9 Merge: eeb3c9dc 27ab2ba5 Author: Simon Date: Fri Jun 24 14:15:15 2022 +0200 merge main commit 27ab2ba594ab1f12e7490be5e4d702cd25ccafd7 Merge: e552182b df4138df Author: Simon Noetzlin Date: Mon Jun 20 11:02:55 2022 +0200 Merge pull request #150 from cosmos/sainoe/mvcc-hist-info Add Historical Info to consumer commit eeb3c9dca7af122fa514ab68f19a0c2f199cbac2 Author: Simon Date: Thu Jun 16 10:02:12 2022 +0200 * Move LockUbdOnTimeout from consumer parameters to CreateConsumerChainProposal to follow the spec * Close provider channel's end only for a passing governance StopChainProposal * Move LockUbdOnTimeout and ClientInfo setters and getters to keeper commit df4138dfc0d8f9ed18c35328f14c2d54830e888a Author: Simon Date: Tue Jun 14 11:05:08 2022 +0200 Implement Historical Info to consumer chain to work with IBC * Add validator public key to consumer chain states * Implement historical info and call TrackHistoricalInfo in consumer BeginBlock * Hardcode HistoricalEntries to 1000 like the staking module DefaultHistoricalEntries parameter commit c1e2c196db7d6937ea32c0ce7dc554235830fe13 Author: Simon Noetzlin Date: Tue Jun 7 08:44:38 2022 +0200 Update proto/interchain_security/ccv/provider/v1/provider.proto Co-authored-by: Marius Poke commit d8c5f4fd2807329d94a859254e823b22eab86b93 Author: Simon Date: Fri Jun 3 11:42:57 2022 +0200 fix nits commit 1b168595b20b76986b17c8f1210b9a66b1a6e921 Author: Simon Date: Thu Jun 2 17:37:31 2022 +0200 * Add lock_unbonding_on_timeout to consumer chain parameter * Create a new provider chain proposal to stop a consumer chain * Implement unbonding ops iterator to release locked fund in case of timeout * Implement StopConsumerChain * Generalize ConsumerChainProposal route in provider/app.go * Add StopConsumerChain call to in proposal handler, OnTimeout and BeginBlock logic * Add shutdown consumer if channel was established then closed commit e552182bf2c4531542be7c1ca9e68f2a7d02d28f Author: frog power 4000 Date: Mon May 30 11:19:09 2022 -0700 ConsumerRedistributeFrac now hardcoded (#102) * ConsumerRedistributeFrac now hardcoded * Update x/ccv/consumer/keeper/distribution.go * fix test to use 75% redistribution fraction Co-authored-by: Marius Poke commit 1ef5da1d808ab0b942d92d5ac54b9373cfa5bfd9 Author: Marius Poke Date: Mon May 30 20:10:59 2022 +0200 Fix proto-gen (#116) * fix proto-gen * go mod tidy commit bf808402157c306b506164395896ec7ef82ecf8c Merge: 616905be 3f7332b1 Author: Simon Noetzlin Date: Mon May 23 20:35:40 2022 +0200 Merge pull request #97 from cosmos/sainoe/consumer-initiated-slashing Add double-sign slashing commit 3f7332b1812faa685dd1f00173be171773f7bc61 Merge: 852e3e7c 616905be Author: Simon Date: Mon May 23 19:02:30 2022 +0200 Merge branch 'main' into sainoe/consumer-initiated-slashing commit 852e3e7c6d3bfa9d6a3fcf8fb577e8c0ff2d523f Author: Simon Date: Mon May 23 13:40:32 2022 +0200 Squashed commit of the following: * Use InfractionType enum in PendingSlashRequest * Reformat TestHandleSlashPacketDistribution * Update Cosmos-SDK import in go.mod * Vefify slash packet commit values in tests * Update Slash function to return when infraction argument is unspecified * Allow to slash jailed and not-tombstoned validator commit aaa0ce4658c0041cd8d53f381f9c30e833f81d93 Author: Marius Poke Date: Fri May 20 16:34:06 2022 +0200 Add proto-gen to Makefile (#92) * enable make proto-gen * add validator.proto and proto docs * remove proto docs * Update Makefile Co-authored-by: Marko * Update Makefile Co-authored-by: Marko * Update Makefile Co-authored-by: Marko * remove abci path duplicate from makefile * make proto generation work with buf (#108) * make proto generation work with buf * remove vscode * revert title change * proto cleanup (#109) * minor cleanup * fix test to comply with json * fix enabled authored-by: Marko Baricevic * go mod tidy -compat=1.17 * go mod tidy -go=1.16 && go mod tidy -go=1.17 Co-authored-by: Marko commit 616905beadecfe0ffe4739a4a443b92e1668081b Author: Marius Poke Date: Mon May 23 18:06:05 2022 +0200 Remove CCV channel state (rebased) (#110) * remove CCV channel state from code * go mod tidy -go=1.16 && go mod tidy -go=1.17 commit 85fac9c6e0c809c14cf7f37bb8e2b0333801dbe0 Author: Marius Poke Date: Fri May 20 16:34:06 2022 +0200 Add proto-gen to Makefile (#92) * enable make proto-gen * add validator.proto and proto docs * remove proto docs * Update Makefile Co-authored-by: Marko * Update Makefile Co-authored-by: Marko * Update Makefile Co-authored-by: Marko * remove abci path duplicate from makefile * make proto generation work with buf (#108) * make proto generation work with buf * remove vscode * revert title change * proto cleanup (#109) * minor cleanup * fix test to comply with json * fix enabled authored-by: Marko Baricevic * go mod tidy -compat=1.17 * go mod tidy -go=1.16 && go mod tidy -go=1.17 Co-authored-by: Marko commit 1961abfc5d9839094639fc88934ad55a5dbf5660 Merge: 01a1b45e 247d4e9d Author: Simon Date: Thu May 12 10:26:51 2022 +0200 Merge branch 'main' into cis-merge-main commit 247d4e9dcacbe4d3e510051f580544b0d3f5b91f Merge: dcda8d3b 2115750f Author: Daniel T <30197399+danwt@users.noreply.github.com> Date: Tue May 10 17:50:51 2022 +0100 Merge pull request #84 from cosmos/danwt/support-different-app.go Support different app.go's for consumer and provider commit 01a1b45ec03813935b5f8ef1569e96c7e468b1ee Author: Simon Date: Tue May 10 10:48:47 2022 +0200 Double-sign slashing Close #65 * Update the CCV slashing logic to handle double-signing evidences. * Add `InfractionType` enum to the `SlashPacketData` fields * Use `InfractionType` enum to distinguish between downtime and double-signing infractions in the logic * Use the provider chain slash fraction and jail duration parameters * Change the evidence keeper instantiation in app.go to use the CCV module instead of the staking module commit 2115750fbbf076d383bcc9f33065c0d0a2e5c621 Author: Daniel Date: Fri May 6 09:48:40 2022 +0100 Updates integration tests to use 2 app.go's commit dcda8d3b90e2c2aec45af7b05e11ffbb3d03214c Merge: ef119ede 67443cd3 Author: Simon Noetzlin Date: Tue May 3 16:15:21 2022 +0100 Merge pull request #75 from cosmos/frog/naming-update Naming Updates commit 67443cd33b21d79427ac24c69abad0bc7c813810 Author: rigelrozanski Date: Thu Apr 28 11:15:41 2022 -0700 child/baby->consumer, parent->provider renames commit ef119ede0299b347b29bbc835bb2640fe6b9e19c Merge: bcad4ce1 8eaf5882 Author: Jehan Date: Wed Apr 27 15:53:42 2022 -0700 Merge pull request #32 from cosmos/frog/simple-distr Simple Distribution commit 8eaf5882b8c69753f388400d3b27db3974d03ed9 Merge: d9dbf450 bcad4ce1 Author: Jehan Tremback Date: Wed Apr 27 15:49:51 2022 -0700 Merge branch 'main' into frog/simple-distr commit bcad4ce125c702112ed46318c038ca54c63e9057 Merge: 3b2fc9ea 3623b3b3 Author: Simon Noetzlin Date: Wed Apr 27 08:25:16 2022 +0100 Merge pull request #56 from cosmos/sainoe/consumer-initiated-slashing Add Pending Slashing commit 3b2fc9eaf6856e4c0137f95cb69e0e0f5a46525c Merge: 97223237 2c30f5ab Author: Jehan Date: Tue Apr 26 15:54:03 2022 -0700 Merge pull request #62 from cosmos/finish-staking-hooks-cherry-pick Finish staking hooks commit 2c30f5ab116e27923a464627c8752a67e10f01be Author: Jehan Tremback Date: Tue Apr 26 15:53:47 2022 -0700 removed unused field commit d9dbf450c55d92fe53b7d1d0c26188c4fdf02b33 Author: rigelrozanski Date: Tue Apr 26 11:06:03 2022 -0700 distribution param comments commit 9ed45afc1fd88f6c213f71b65cfe562a1e5a47f2 Author: Jehan Tremback Date: Wed Apr 20 15:23:24 2022 -0700 renaming cleanup and WIP parent tests commit 3623b3b385deea17bcb56aa63cdd81c8802d919c Author: Simon Date: Wed Apr 20 17:13:27 2022 +0200 Feat: add pending slash requests logic on consumer - Store slash packet data into pending slash requests when ccv channel isn't established - Send and clear pending slash requests once CCV channel is established commit 68089656b7402054dd623db6b23fac18062c147c Author: rigelrozanski Date: Tue Apr 5 16:36:40 2022 -0700 consumer redistribution split commit 511daef17d75c78988404abfe8511236e7c57755 Author: rigelrozanski Date: Tue Apr 5 12:07:51 2022 -0700 rebase, debug cleanup commit 841a2b247c31f542b6680fb3a87ce9ba630d13fb Author: rigelrozanski Date: Mon Mar 7 12:07:40 2022 -0800 params update, breaks tests commit 9ab56c67f115478fd97d3cd7caa71a9830367d87 Author: rigelrozanski Date: Wed Mar 2 12:40:39 2022 -0800 distr code compiling, existing tests pass, fix old ibc in proto commit 7917cf7f8b71707f612932b1f5970d062bbd6422 Author: rigelrozanski Date: Mon Jan 10 18:29:57 2022 -0800 Simple Distribution dist docs working dist ccv dist diagram diagram cleanup diagram update dist diagram diagram updates, excess model simplified distribution simple distribution . aditya ibc notes distr token transfer ibc working working parent-addr handshake information pass working simple distribution distribution near compiling, blocked on ibc-go upgrades address WIP PR comments connHops update merge conflict resolve commit 972232378fa5d5b07e03b2d24182562d3a0d0d43 Merge: 4174b794 3087ab79 Author: Simon Noetzlin Date: Tue Apr 5 16:48:19 2022 +0200 Merge pull request #52 from sainoe/sainoe/consumer-initiated-slashing Consumer downtime slashing commit 3087ab79932ea833d228ada01baed1e17c39cf85 Author: Simon Date: Fri Apr 1 13:04:10 2022 +0200 remove white space child proto commit 358fcf548b414fd9db2a07777aa3600ec8371dd5 Author: Simon Date: Fri Apr 1 12:59:19 2022 +0200 * remove pubkey from cross-chain validators type fields * update and test ApplyCCValidatorChanges commit 6750e1ef9819080ef6bc2123b45beb4b7edb3bc7 Author: Simon Noetzlin Date: Mon Mar 28 17:34:08 2022 +0200 Fix typo in app.go Co-authored-by: Aditya commit a06ee0628f626425a7b6707f08d62a02c2bb0c3b Author: Simon Date: Fri Mar 25 18:18:35 2022 +0100 - Fix validator address issue - Merge PR#48 changes commit 4174b794570e5d6ac4e8a47b18b0dc212547b4ed Merge: 770d5cdc 7c534426 Author: Jehan Date: Mon Mar 14 15:14:37 2022 -0700 Merge pull request #31 from cosmos/gov-cli-and-query Gov proposal cli and genesis state query commit 7c5344267a4d99f6ec6b7571514ba8adf9949078 Merge: e9e00ec0 770d5cdc Author: Jehan Tremback Date: Mon Mar 14 15:13:19 2022 -0700 Merge branch 'main' into gov-cli-and-query commit 770d5cdcb9a15a0bb83aab09e99409b15e9119ed Author: rigelrozanski Date: Mon Feb 14 13:43:49 2022 -0800 upgrade compile errors worked through commit da1a1211f04316b8d66766f1b6067459ad063d99 Merge: d5c395d5 359b4ae6 Author: Jehan Date: Wed Feb 2 14:08:53 2022 -0800 Merge pull request #29 from cosmos/local-testnet Gonna merge this myself because it is very small and does not involve any logic commit e9e00ec0a85b8ba8b63c57b24b6ff1f7803b65a7 Author: Jehan Tremback Date: Tue Feb 1 16:46:33 2022 -0800 genesis query finished but untested commit 863edec34d5d6df783b5d4474944e8697d5ce617 Author: Jehan Tremback Date: Fri Jan 14 11:30:22 2022 -0800 add minimal makefile commit d5c395d52c4824d03510836a16024f673f9a0a80 Merge: db485fac … * chore: sdk47 post upgrade cleanup (#970) * Finish legacy querier LCD/REST cleaning https://github.com/cosmos/cosmos-sdk/blob/release/v0.47.x/UPGRADING.md#appmodule-interface https://github.com/cosmos/cosmos-sdk/pull/9594 https://github.com/cosmos/cosmos-sdk/pull/11797 * Finish simulation migration https://github.com/cosmos/cosmos-sdk/blob/release/v0.47.x/UPGRADING.md#simulation * Replace usage of deprecated gov method * Remove duplicate ante.DeductFeeDecorator * fix!: avoid panicking on CancelUnbondingDelegation (#977) * handle CancelUnbondingDelegation message * tests: add cancel-unbond e2e test * fix: appease linter * chore: Hardcode golangci-lint version (#990) * Hardcode golangci-lint version * Hardcode version in CI config --------- Co-authored-by: MSalopek Co-authored-by: Philip Offtermatt <57488781+p-offtermatt@users.noreply.github.com> * refactor: first batch of post-merge changes * refactor: batch sovereign changes with v47 * refactor: another batch of post-merge changes * changes to go.mod * refactor: final batch of changes post-merge * refactor: rebuild protos for v47 * refactor: rebuild mocks for v47 * refactor: testing changes * refactor: update proto tooling and rebuild protos * lint: appease gosec * chore: rm unused string from Makefile * chore: rm unused in makefile .phony * temporarily disable proto-check to run automated tests * refactor: merge main into feature branch with fixes (#1038) * build(deps): bump gaurav-nelson/github-action-markdown-link-check from 1.0.13 to 1.0.15 (#928) build(deps): bump gaurav-nelson/github-action-markdown-link-check Bumps [gaurav-nelson/github-action-markdown-link-check](https://github.com/gaurav-nelson/github-action-markdown-link-check) from 1.0.13 to 1.0.15. - [Release notes](https://github.com/gaurav-nelson/github-action-markdown-link-check/releases) - [Commits](https://github.com/gaurav-nelson/github-action-markdown-link-check/compare/1.0.13...1.0.15) --- updated-dependencies: - dependency-name: gaurav-nelson/github-action-markdown-link-check dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore: bump hermes (#921) * bump the version of hermes used in docs and images * use the multiplatform ghcr.io build of hermes * build(deps): bump github.com/spf13/cast from 1.5.0 to 1.5.1 (#961) Bumps [github.com/spf13/cast](https://github.com/spf13/cast) from 1.5.0 to 1.5.1. - [Release notes](https://github.com/spf13/cast/releases) - [Commits](https://github.com/spf13/cast/compare/v1.5.0...v1.5.1) --- updated-dependencies: - dependency-name: github.com/spf13/cast dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * refactor: adopt the errors module to reduce the changeset for 47 (#920) adopt the errors module to reduce the changeset for 47 Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> * fix!: prevent denom DOS (#931) * Merge pull request from GHSA-chqw-ff63-95r8 * squash commit of multisig fix + everything involving denom fix * rebuild proto * fix todos --------- Co-authored-by: Jehan Tremback * regen proto * fix cherrypick issues * lint * cleans * gosec * restore param, remove tech debt from tests * ibc denom as const * add check for consumer reward denom already registered * lint * remove unneeded expect --------- Co-authored-by: Jehan Tremback Co-authored-by: Marius Poke * fix: all feature branches should have CI (#958) * Update automated-tests.yml * Update build.yml * all feature branches will now run all ci jobs relevant to them --------- Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> * fix!: consumer key prefix order to avoid complex migrations (#963) proper order matching v1.0.0 Co-authored-by: Marius Poke * docs: update changelog to prep for v1.3.0 release (#953) * wip * Update CHANGELOG.md * small comment * comment * progress save * another progress save * progress save * done * Update CHANGELOG.md * add denom dos entry * remove extraneous changelog entries * restore a couple entries * Changes from PR review * add entry for 963 * fix: mitigate e2e tests relaying and non-determinism (#968) * fix: mitigate e2e tests relaying non-determinism * fix: bump signed blocks windows in e2e test configs * deps: bump cometbft to v0.34.28 (#906) this bumps only cometbft Co-authored-by: MSalopek * fix!: Remove panics on failure to send IBC packets (#876) * provider: replace panic with StopConsumerChain * provider: replace panic with error message * Info logging on client expiration * add test for consumer * add test for provider * linter * Update CHANGELOG.md --------- Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> * build(deps): bump github.com/stretchr/testify from 1.8.2 to 1.8.3 (#969) Bumps [github.com/stretchr/testify](https://github.com/stretchr/testify) from 1.8.2 to 1.8.3. - [Release notes](https://github.com/stretchr/testify/releases) - [Commits](https://github.com/stretchr/testify/compare/v1.8.2...v1.8.3) --- updated-dependencies: - dependency-name: github.com/stretchr/testify dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> * build(deps): bump slackapi/slack-github-action from 1.23.0 to 1.24.0 (#971) Bumps [slackapi/slack-github-action](https://github.com/slackapi/slack-github-action) from 1.23.0 to 1.24.0. - [Release notes](https://github.com/slackapi/slack-github-action/releases) - [Commits](https://github.com/slackapi/slack-github-action/compare/v1.23.0...v1.24.0) --- updated-dependencies: - dependency-name: slackapi/slack-github-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * refactor!: upgrade ICS imports to v2 (#974) * v2 imports * Update CHANGELOG.md * docs: update PR template to consider migrations (#976) Update PULL_REQUEST_TEMPLATE.md * fix: v2 imports proto go_package option (#978) * add v2 to proto files, adjust protocgen scripts * regen proto * fix: partially revert key assignment type safety PR (#980) * use bytes in place where possible * fix tests * add v2 to proto files, adjust protocgen scripts * regen proto * change protos, define custom types, fix references * Update key_assignment_test.go * Update key_assignment.go * format * Update CHANGELOG.md * nit for better diff * docs: update top level readme for repo (#981) * Update base.css * Update README.md * smol --------- Co-authored-by: Marius Poke * ci: makefile target for checking if protos are updated (#979) * proto-check makefile target * comment * add to GH actions workflow * put proto check before other tests * gotta regenerate protos --------- Co-authored-by: Marius Poke * build(deps): bump github.com/cosmos/ibc-go/v4 from 4.4.0 to 4.4.2 (#982) * build(deps): bump github.com/cosmos/ibc-go/v4 from 4.4.0 to 4.4.2 Bumps [github.com/cosmos/ibc-go/v4](https://github.com/cosmos/ibc-go) from 4.4.0 to 4.4.2. - [Release notes](https://github.com/cosmos/ibc-go/releases) - [Changelog](https://github.com/cosmos/ibc-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/cosmos/ibc-go/compare/v4.4.0...v4.4.2) --- updated-dependencies: - dependency-name: github.com/cosmos/ibc-go/v4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * update changelog --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: mpoke Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> * build(deps): bump JamesIves/github-pages-deploy-action from 4.4.1 to 4.4.2 (#983) build(deps): bump JamesIves/github-pages-deploy-action Bumps [JamesIves/github-pages-deploy-action](https://github.com/JamesIves/github-pages-deploy-action) from 4.4.1 to 4.4.2. - [Release notes](https://github.com/JamesIves/github-pages-deploy-action/releases) - [Commits](https://github.com/JamesIves/github-pages-deploy-action/compare/v4.4.1...v4.4.2) --- updated-dependencies: - dependency-name: JamesIves/github-pages-deploy-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> * build(deps): bump github.com/stretchr/testify from 1.8.3 to 1.8.4 (#985) Bumps [github.com/stretchr/testify](https://github.com/stretchr/testify) from 1.8.3 to 1.8.4. - [Release notes](https://github.com/stretchr/testify/releases) - [Commits](https://github.com/stretchr/testify/compare/v1.8.3...v1.8.4) --- updated-dependencies: - dependency-name: github.com/stretchr/testify dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Marius Poke * feat: v2 migrations (#975) * v2 imports * Squashed commit of the following: commit a4c9224f854ecef9b8a0216a4c348c13368cdd06 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Wed May 24 10:13:10 2023 -0700 Revert "Merge branch 'shawn/v2-imports' into shawn/ccv-migrations" This reverts commit 53e3362749c05de1a44da1bbe632d8b7265eee5a, reversing changes made to 9c3f3380cbffe43f3a6d2c2b5e71c1412869786d. commit 6885ad1dffed403e21fe5a97421d21afe321ae98 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Wed May 24 10:12:49 2023 -0700 Revert "Merge branch 'shawn/v2-imports' into shawn/ccv-migrations" This reverts commit 45d74c70ff6e41d585255f039c5f814340e4bed1, reversing changes made to 53e3362749c05de1a44da1bbe632d8b7265eee5a. commit 958914412a72ebd2b79dccdfd92ec43104a431bb Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 14:48:06 2023 -0700 provider migration boilerplate commit 9521ecb3a8b9e7d87df183f879b3680bf65613e3 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 12:25:14 2023 -0700 lint commit fc3f27364c283aef53c305730f75f0e9e299d60b Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 12:20:33 2023 -0700 old default params commit 80a490cb57dc684dd740a27d753508f0a118c174 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 12:15:30 2023 -0700 naming commit 45d74c70ff6e41d585255f039c5f814340e4bed1 Merge: 53e33627 8e6bdfb2 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 12:12:03 2023 -0700 Merge branch 'shawn/v2-imports' into shawn/ccv-migrations commit 8e6bdfb21f53374874c3ea102ce04fe07f162b1d Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 12:10:22 2023 -0700 proto name for gov prop registration commit 53e3362749c05de1a44da1bbe632d8b7265eee5a Merge: 9c3f3380 5ca68d14 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 12:05:39 2023 -0700 Merge branch 'shawn/v2-imports' into shawn/ccv-migrations commit 5ca68d142070a8995b34c5111bc8e85363eac257 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 11:53:12 2023 -0700 fix e2e tests commit aa6bd0c87c93f6b1963ce7d71b51e22afe35b821 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 11:42:47 2023 -0700 rm bad files commit 6e3dc88d5a08cdaf039b0eef9c078e4461278f82 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 11:42:14 2023 -0700 correct generation commit 056ef7a71ef2b78ee22442be4978e02da9f2ca27 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 11:29:45 2023 -0700 proto upgrade too commit 9c3f3380cbffe43f3a6d2c2b5e71c1412869786d Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 10:57:25 2023 -0700 remove hardcoded old code commit 1e731730f34dd9bc5a0dda6a63095d9703c4379b Merge: dbf9dede 8769fd56 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 10:07:31 2023 -0700 Merge branch 'shawn/v2-imports' into shawn/ccv-migrations commit 8769fd5649713445c1770b8eb98d88ba5ded2d84 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue May 23 09:58:28 2023 -0700 v2 imports commit dbf9dede2a8935098cddae7db111b86659f92a4a Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Mon May 22 16:10:05 2023 -0700 provider migration commit 2d95e2e41bcf9812b5a22e06de8e5444ce0ed60a Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Mon May 22 15:01:47 2023 -0700 improve consumer test commit 85f4cfdd418d464bdd935f0ae2ceab6fe04e73c2 Author: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Mon May 22 14:03:20 2023 -0700 consumer params * rm old code * go.mod restore * better naming of hardcodes * consumer boilerplate * comments * migrate consumer genesis states * test and cleans * lint * migration and partial test * cleans * finish test * comments and doc * Update migration_test.go * Update CHANGELOG.md * expand in changelog * increment consensus ver * set key table on construction * rm semver migration funcs * comment explaining consensus version * docs: cleanup changelog for v2.0.0 on main (#988) cleans * chore: Hardcode golangci-lint version (#990) * Hardcode golangci-lint version * Hardcode version in CI config * docs: Increase the validator set of cosmos hub to 180 from 175 (#999) Updated number of validators to 180 * fix: proper consumer key prefix ordering (#991) * Update keys.go * tests * fix another bug * fix comments * feat: Remove consumer genesis migration on provider (#997) * Update keys.go * tests * fix another bug * remove consumer genesis deletion, link to test * remove unused bond denom method * Revert "remove unused bond denom method" This reverts commit f930eca428bade49a05368fe5dae2d96842659cc. * remove test too * update changelog * docs: Update reward-distribution.md (#994) * Update reward-distribution.md * docs: add instructions for registering denoms * Update docs/docs/features/reward-distribution.md Co-authored-by: Marius Poke * Update reward-distribution.md * Update docs/docs/features/reward-distribution.md Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> --------- Co-authored-by: MSalopek Co-authored-by: Marius Poke * chore: update workflow re. issues and PRs (#1002) * update PR workflow * update issue workflow * rename other.md to others.md * fix typo --------- Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> * docs(adr): ADR-007 pause unbonding period during equivocation proposal (#964) * docs(adr): pause unbonding period during equivocation proposal Co-authored-by: Albert Le Batteux Co-authored-by: Giuseppe Natale * fix voting period duration * remove issue reference * docs: filter out unbonding operations before pause/unpause Co-authored-by: Albert Le Batteux Co-authored-by: Giuseppe Natale --------- Co-authored-by: Albert Le Batteux Co-authored-by: Giuseppe Natale * docs: Add type prefix link to CONTRIBUTING.md (#1007) Update CONTRIBUTING.md * chore: enable mergify (#1009) * add config for mergify * enable security dependecies for v2.0.x * Markdownlint (#907) markdownlint Co-authored-by: Jacob Gadikian * fix: limit vsc matured packets handled per endblocker (#1004) * initial implementation, still need tests * UTs * integration test * linter * Update CHANGELOG.md * make vsc matured handled this block a var * comment * feat: integrate cometmock (#989) * Add gorelayer and CometMock to Dockerfile * Add option to start with cometmock in start-chain script * Start adding support for rly * Adjust relayer start action * Add entrypoint for short happy path steps * Add . nosec G204 and waiting for blocks * Adjust rly config: Gas is free * Remove optout steps from short happy path * Use separate redelegate step for short happy path * Wait for blocks after unbonding * Make naming more descriptive and add comments * Add comment to chain name sorting and improve comments * Update start-chain.sh Address comments form joint review session with @MSalopek * Fix typo * docs: Create adr-004-denom-dos-fixes.md (#934) * Create adr-006-denom-dos-fixes * Update docs/docs/adrs/adr-006-denom-dos-fixes Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> * Update docs/docs/adrs/adr-006-denom-dos-fixes Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> * Update docs/docs/adrs/adr-006-denom-dos-fixes Co-authored-by: Marius Poke * Update docs/docs/adrs/adr-006-denom-dos-fixes * Update docs/docs/adrs/adr-006-denom-dos-fixes * rename to adr 004 * remove extra file * add entry to Table of Contents * add ADR 7 to ToC --------- Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Co-authored-by: Marius Poke * docs: Fix link to template (#1027) Fix link to template Fixes typo in contributing.md * feat!: Add DistributionTransmissionChannel to ConsumerAdditionProposal (#965) * update proto * remove transfer_channel_id from consumer genesis * ConsumerAdditionProposal: transfer_channel_id -> distribution_transmission_channel * send updated ConsumerAdditionProposal * validate consumer genesis param * remove StandaloneTransferChannelID from store * fix TestOnChanOpenAck * remove state breaking change * finalize merge and fix issues * chore: update docs and changelog * chore: regenerate protos * re-add integrationt tests around changeover * mv entry in changelog * test: add sovereign to consumer changeover e2e (#1025) * tests: add sovereign to consumer e2e test * rm unused bash scripts * partially address review comments * apply remaining review comments * chore: apply formatting rules --------- Co-authored-by: MSalopek * docs: ADR for throttle with retries (#1005) * all of ADR is filled out except design portion * design * Update adr-008-throttle-retries.md * Update adr-008-throttle-retries.md * Update adr-008-throttle-retries.md * Apply suggestions from code review Co-authored-by: Marius Poke * nit formatting * describe consumer changes first * add comment on rareness of throttling being triggered * split out paragraph * hopefully better explanation * Update adr-008-throttle-retries.md * accepted * TOC entry --------- Co-authored-by: Marius Poke * Add time and block advancement integration for CometMock (#1017) * Add time and block advancement * Adhere to gocritic: use += * Remove extra debug output * Fix: use correct key when consumer key is not assigned * Correct private key address field * Clarify comment for WaitTime * Use bool instead of *bool type * Add review comments * refactor: first batch of post-merge changes * refactor: batch sovereign changes with v47 * refactor: another batch of post-merge changes * changes to go.mod * refactor: final batch of changes post-merge * refactor: rebuild protos for v47 * refactor: rebuild mocks for v47 * refactor: testing changes * refactor: update proto tooling and rebuild protos * lint: appease gosec * chore: rm unused string from Makefile * chore: rm unused in makefile .phony * temporarily disable proto-check to run automated tests --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jacob Gadikian Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Co-authored-by: Jehan Tremback Co-authored-by: Marius Poke Co-authored-by: Philip Offtermatt <57488781+p-offtermatt@users.noreply.github.com> Co-authored-by: Milan Mulji <98309852+mmulji-ic@users.noreply.github.com> Co-authored-by: Thomas Bruyelle Co-authored-by: Albert Le Batteux Co-authored-by: Giuseppe Natale Co-authored-by: Ruslan Akhtariev <46343690+pysel@users.noreply.github.com> Co-authored-by: Jehan * chore: bump sdk to v0.47.3 (#1040) --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jacob Gadikian Co-authored-by: vuong177 Co-authored-by: sontrinh16 Co-authored-by: Ruslan Akhtariev Co-authored-by: Ruslan Akhtariev <46343690+pysel@users.noreply.github.com> Co-authored-by: vuong <56973102+vuong177@users.noreply.github.com> Co-authored-by: sontrinh16 <48055119+sontrinh16@users.noreply.github.com> Co-authored-by: mpoke Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Co-authored-by: Thomas Bruyelle Co-authored-by: Philip Offtermatt <57488781+p-offtermatt@users.noreply.github.com> Co-authored-by: Jehan Tremback Co-authored-by: Milan Mulji <98309852+mmulji-ic@users.noreply.github.com> Co-authored-by: Albert Le Batteux Co-authored-by: Giuseppe Natale Co-authored-by: Jehan --- .dockerignore | 9 + .github/workflows/automated-tests.yml | 4 +- Dockerfile | 3 +- Dockerfile.gaia | 4 +- Makefile | 102 +- .../ante/forbidden_proposals_ante.go | 40 +- .../ante/forbidden_proposals_ante_test.go | 124 ++- app/consumer-democracy/ante_handler.go | 13 +- app/consumer-democracy/app.go | 343 ++++--- app/consumer-democracy/export.go | 6 +- .../proposals_whitelisting.go | 57 +- .../proposals_whitelisting_test.go | 2 +- .../ante/disabled_modules_ante_test.go | 2 +- app/consumer/ante/msg_filter_ante_test.go | 2 +- app/consumer/ante_handler.go | 12 +- app/consumer/app.go | 260 +++-- app/consumer/export.go | 6 +- app/params/encoding.go | 2 +- app/params/proto.go | 2 +- app/provider/ante_handler.go | 11 +- app/provider/app.go | 308 +++--- app/provider/export.go | 19 +- app/sovereign/ante_handler.go | 11 +- app/sovereign/app.go | 268 +++--- app/sovereign/export.go | 21 +- buf.work.yaml | 1 - cmd/interchain-security-cd/cmd/genaccounts.go | 180 ---- cmd/interchain-security-cd/cmd/root.go | 277 +++--- cmd/interchain-security-cd/main.go | 4 +- .../cmd/genaccounts.go | 180 ---- cmd/interchain-security-cdd/cmd/root.go | 276 +++--- cmd/interchain-security-cdd/main.go | 4 +- cmd/interchain-security-pd/cmd/genaccounts.go | 180 ---- cmd/interchain-security-pd/cmd/root.go | 272 +++--- cmd/interchain-security-pd/main.go | 4 +- cmd/interchain-security-sd/cmd/genaccounts.go | 180 ---- cmd/interchain-security-sd/cmd/root.go | 274 +++--- cmd/interchain-security-sd/main.go | 4 +- docs/docs/features/key-assignment.md | 16 +- docs/docs/validators/joining-testnet.md | 26 +- go.mod | 180 ++-- go.sum | 890 ++++++++++++------ legacy_ibc_testing/core/events.go | 8 +- legacy_ibc_testing/simapp/test_helpers.go | 13 +- legacy_ibc_testing/testing/app.go | 39 +- legacy_ibc_testing/testing/chain.go | 35 +- legacy_ibc_testing/testing/config.go | 10 +- legacy_ibc_testing/testing/coordinator.go | 2 +- legacy_ibc_testing/testing/endpoint.go | 30 +- legacy_ibc_testing/testing/events.go | 8 +- legacy_ibc_testing/testing/path.go | 2 +- legacy_ibc_testing/testing/utils.go | 4 +- legacy_ibc_testing/testing/values.go | 8 +- proto/buf.lock | 20 +- proto/buf.yaml | 4 + .../ccv/consumer/v1/consumer.proto | 23 +- .../ccv/consumer/v1/genesis.proto | 25 +- .../ccv/consumer/v1/query.proto | 6 +- .../ccv/provider/v1/genesis.proto | 46 +- .../ccv/provider/v1/provider.proto | 231 ++--- .../ccv/provider/v1/query.proto | 64 +- .../ccv/provider/v1/tx.proto | 20 +- proto/interchain_security/ccv/v1/ccv.proto | 30 +- scripts/protocgen.sh | 1 - tests/difference/core/driver/common.go | 11 +- tests/difference/core/driver/core_test.go | 16 +- .../core/driver/seed_gen_fuzzy_test.go | 4 +- tests/difference/core/driver/setup.go | 53 +- tests/e2e/actions.go | 210 +++-- tests/e2e/config.go | 36 +- tests/e2e/main.go | 4 +- tests/e2e/state.go | 31 +- tests/e2e/step_delegation.go | 91 ++ tests/e2e/steps.go | 1 + tests/e2e/steps_democracy.go | 17 +- tests/e2e/steps_reward_denom.go | 15 +- tests/e2e/steps_sovereign_changeover.go | 2 +- tests/e2e/steps_start_chains.go | 2 +- .../testnet-scripts/sovereign-genesis.json | 518 +++++----- tests/e2e/testnet-scripts/start-chain.sh | 6 +- tests/integration/changeover.go | 4 +- tests/integration/common.go | 29 +- tests/integration/democracy.go | 62 +- tests/integration/distribution.go | 13 +- tests/integration/expired_client.go | 15 +- tests/integration/key_assignment.go | 7 +- tests/integration/normal_operations.go | 2 +- tests/integration/setup.go | 11 +- tests/integration/slashing.go | 39 +- tests/integration/stop_consumer.go | 5 +- tests/integration/throttle.go | 47 +- tests/integration/unbonding.go | 9 +- tests/integration/valset_update.go | 6 +- testutil/crypto/crypto.go | 6 +- testutil/ibc_testing/generic_setup.go | 6 +- testutil/ibc_testing/specific_setup.go | 22 +- testutil/integration/interfaces.go | 17 +- testutil/keeper/expectations.go | 14 +- testutil/keeper/mocks.go | 237 +++-- testutil/keeper/unit_test_helpers.go | 16 +- testutil/simibc/chain_util.go | 8 +- testutil/simibc/ordered_outbox.go | 2 +- testutil/simibc/relay_util.go | 10 +- testutil/simibc/relayed_path.go | 2 +- third_party/gogoproto/gogo.proto | 145 --- third_party/google/api/annotations.proto | 31 - third_party/google/api/http.proto | 318 ------- third_party/google/api/httpbody.proto | 78 -- third_party/google/protobuf/any.proto | 164 ---- third_party/proto/buf.lock | 10 - third_party/proto/buf.yaml | 37 - third_party/proto/confio/proofs.proto | 235 ----- .../base/query/v1beta1/pagination.proto | 55 -- .../proto/cosmos/base/v1beta1/coin.proto | 40 - .../cosmos/evidence/v1beta1/evidence.proto | 21 - .../cosmos/staking/v1beta1/staking.proto | 370 -------- .../cosmos/upgrade/v1beta1/upgrade.proto | 78 -- third_party/proto/cosmos_proto/cosmos.proto | 16 - .../proto/ibc/core/channel/v1/channel.proto | 148 --- .../proto/ibc/core/channel/v1/genesis.proto | 32 - .../proto/ibc/core/channel/v1/query.proto | 376 -------- .../proto/ibc/core/channel/v1/tx.proto | 211 ----- .../proto/ibc/core/client/v1/client.proto | 100 -- .../proto/ibc/core/client/v1/genesis.proto | 48 - .../proto/ibc/core/client/v1/query.proto | 184 ---- third_party/proto/ibc/core/client/v1/tx.proto | 100 -- .../ibc/core/commitment/v1/commitment.proto | 41 - .../ibc/core/connection/v1/connection.proto | 114 --- .../ibc/core/connection/v1/genesis.proto | 18 - .../proto/ibc/core/connection/v1/query.proto | 138 --- .../proto/ibc/core/connection/v1/tx.proto | 119 --- .../proto/ibc/core/types/v1/genesis.proto | 23 - .../lightclients/localhost/v1/localhost.proto | 18 - .../solomachine/v1/solomachine.proto | 189 ---- .../solomachine/v2/solomachine.proto | 189 ---- .../tendermint/v1/tendermint.proto | 115 --- third_party/proto/tendermint/abci/types.proto | 407 -------- .../proto/tendermint/crypto/keys.proto | 17 - .../proto/tendermint/crypto/proof.proto | 41 - .../proto/tendermint/libs/bits/types.proto | 9 - .../proto/tendermint/types/params.proto | 80 -- .../proto/tendermint/types/types.proto | 157 --- .../proto/tendermint/types/validator.proto | 25 - .../proto/tendermint/version/types.proto | 24 - x/ccv/consumer/ibc_module.go | 15 +- x/ccv/consumer/ibc_module_test.go | 9 +- x/ccv/consumer/keeper/changeover.go | 2 +- x/ccv/consumer/keeper/changeover_test.go | 2 +- x/ccv/consumer/keeper/distribution.go | 32 +- x/ccv/consumer/keeper/distribution_test.go | 2 +- x/ccv/consumer/keeper/genesis.go | 5 +- x/ccv/consumer/keeper/genesis_test.go | 24 +- x/ccv/consumer/keeper/grpc_query.go | 2 +- x/ccv/consumer/keeper/hooks.go | 6 +- x/ccv/consumer/keeper/keeper.go | 47 +- x/ccv/consumer/keeper/keeper_test.go | 10 +- x/ccv/consumer/keeper/migration.go | 79 -- x/ccv/consumer/keeper/migration_test.go | 146 --- x/ccv/consumer/keeper/params.go | 12 +- x/ccv/consumer/keeper/params_test.go | 4 +- x/ccv/consumer/keeper/relay.go | 14 +- x/ccv/consumer/keeper/relay_test.go | 15 +- x/ccv/consumer/keeper/soft_opt_out_test.go | 4 +- x/ccv/consumer/keeper/validators.go | 44 +- x/ccv/consumer/keeper/validators_test.go | 23 +- x/ccv/consumer/module.go | 42 +- x/ccv/consumer/types/consumer.pb.go | 44 +- x/ccv/consumer/types/genesis.go | 6 +- x/ccv/consumer/types/genesis.pb.go | 36 +- x/ccv/consumer/types/genesis_test.go | 16 +- x/ccv/consumer/types/query.pb.go | 6 +- x/ccv/democracy/distribution/module.go | 7 +- x/ccv/democracy/governance/module.go | 76 +- x/ccv/democracy/staking/module.go | 9 +- x/ccv/provider/client/cli/tx.go | 7 +- x/ccv/provider/client/proposal_handler.go | 122 +-- x/ccv/provider/handler_test.go | 2 +- x/ccv/provider/ibc_module.go | 10 +- x/ccv/provider/ibc_module_test.go | 11 +- x/ccv/provider/keeper/genesis_test.go | 2 +- x/ccv/provider/keeper/hooks.go | 73 +- x/ccv/provider/keeper/keeper.go | 25 +- x/ccv/provider/keeper/keeper_test.go | 5 +- x/ccv/provider/keeper/key_assignment.go | 4 +- x/ccv/provider/keeper/key_assignment_test.go | 4 +- x/ccv/provider/keeper/migration.go | 172 ---- x/ccv/provider/keeper/migration_test.go | 171 ---- x/ccv/provider/keeper/msg_server.go | 5 +- x/ccv/provider/keeper/params.go | 2 +- x/ccv/provider/keeper/params_test.go | 9 +- x/ccv/provider/keeper/proposal.go | 16 +- x/ccv/provider/keeper/proposal_test.go | 8 +- x/ccv/provider/keeper/relay.go | 25 +- x/ccv/provider/keeper/relay_test.go | 33 +- x/ccv/provider/keeper/throttle.go | 12 +- x/ccv/provider/keeper/throttle_test.go | 33 +- x/ccv/provider/module.go | 43 +- x/ccv/provider/module_test.go | 4 +- x/ccv/provider/proposal_handler.go | 7 +- x/ccv/provider/proposal_handler_test.go | 17 +- x/ccv/provider/types/codec.go | 8 +- x/ccv/provider/types/genesis.go | 3 +- x/ccv/provider/types/genesis.pb.go | 12 +- x/ccv/provider/types/genesis_test.go | 45 +- x/ccv/provider/types/params.go | 10 +- x/ccv/provider/types/params_test.go | 36 +- x/ccv/provider/types/proposal.go | 29 +- x/ccv/provider/types/proposal_test.go | 14 +- x/ccv/provider/types/provider.pb.go | 175 ++-- x/ccv/provider/types/query.pb.go | 47 +- x/ccv/provider/types/tx.pb.go | 11 +- x/ccv/types/ccv.go | 6 +- x/ccv/types/ccv.pb.go | 107 +-- x/ccv/types/ccv_test.go | 2 +- x/ccv/types/expected_keepers.go | 43 +- x/ccv/types/shared_params.go | 2 +- x/ccv/types/utils.go | 43 +- x/ccv/types/utils_test.go | 2 +- 218 files changed, 4416 insertions(+), 9075 deletions(-) create mode 100644 .dockerignore delete mode 100644 cmd/interchain-security-cd/cmd/genaccounts.go delete mode 100644 cmd/interchain-security-cdd/cmd/genaccounts.go delete mode 100644 cmd/interchain-security-pd/cmd/genaccounts.go delete mode 100644 cmd/interchain-security-sd/cmd/genaccounts.go delete mode 100644 third_party/gogoproto/gogo.proto delete mode 100644 third_party/google/api/annotations.proto delete mode 100644 third_party/google/api/http.proto delete mode 100644 third_party/google/api/httpbody.proto delete mode 100644 third_party/google/protobuf/any.proto delete mode 100644 third_party/proto/buf.lock delete mode 100644 third_party/proto/buf.yaml delete mode 100644 third_party/proto/confio/proofs.proto delete mode 100644 third_party/proto/cosmos/base/query/v1beta1/pagination.proto delete mode 100644 third_party/proto/cosmos/base/v1beta1/coin.proto delete mode 100644 third_party/proto/cosmos/evidence/v1beta1/evidence.proto delete mode 100644 third_party/proto/cosmos/staking/v1beta1/staking.proto delete mode 100644 third_party/proto/cosmos/upgrade/v1beta1/upgrade.proto delete mode 100644 third_party/proto/cosmos_proto/cosmos.proto delete mode 100644 third_party/proto/ibc/core/channel/v1/channel.proto delete mode 100644 third_party/proto/ibc/core/channel/v1/genesis.proto delete mode 100644 third_party/proto/ibc/core/channel/v1/query.proto delete mode 100644 third_party/proto/ibc/core/channel/v1/tx.proto delete mode 100644 third_party/proto/ibc/core/client/v1/client.proto delete mode 100644 third_party/proto/ibc/core/client/v1/genesis.proto delete mode 100644 third_party/proto/ibc/core/client/v1/query.proto delete mode 100644 third_party/proto/ibc/core/client/v1/tx.proto delete mode 100644 third_party/proto/ibc/core/commitment/v1/commitment.proto delete mode 100644 third_party/proto/ibc/core/connection/v1/connection.proto delete mode 100644 third_party/proto/ibc/core/connection/v1/genesis.proto delete mode 100644 third_party/proto/ibc/core/connection/v1/query.proto delete mode 100644 third_party/proto/ibc/core/connection/v1/tx.proto delete mode 100644 third_party/proto/ibc/core/types/v1/genesis.proto delete mode 100644 third_party/proto/ibc/lightclients/localhost/v1/localhost.proto delete mode 100644 third_party/proto/ibc/lightclients/solomachine/v1/solomachine.proto delete mode 100644 third_party/proto/ibc/lightclients/solomachine/v2/solomachine.proto delete mode 100644 third_party/proto/ibc/lightclients/tendermint/v1/tendermint.proto delete mode 100644 third_party/proto/tendermint/abci/types.proto delete mode 100644 third_party/proto/tendermint/crypto/keys.proto delete mode 100644 third_party/proto/tendermint/crypto/proof.proto delete mode 100644 third_party/proto/tendermint/libs/bits/types.proto delete mode 100644 third_party/proto/tendermint/types/params.proto delete mode 100644 third_party/proto/tendermint/types/types.proto delete mode 100644 third_party/proto/tendermint/types/validator.proto delete mode 100644 third_party/proto/tendermint/version/types.proto delete mode 100644 x/ccv/consumer/keeper/migration.go delete mode 100644 x/ccv/consumer/keeper/migration_test.go delete mode 100644 x/ccv/provider/keeper/migration.go delete mode 100644 x/ccv/provider/keeper/migration_test.go diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000..333418f12d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ +.git/ +Dockerfile +*.md +.gitignore +.gitattributes +scripts/ +.vscode/ +.github/ +proto/ diff --git a/.github/workflows/automated-tests.yml b/.github/workflows/automated-tests.yml index 0a4a8fc6a0..175bec9545 100644 --- a/.github/workflows/automated-tests.yml +++ b/.github/workflows/automated-tests.yml @@ -24,8 +24,8 @@ jobs: uses: actions/setup-go@v4 with: go-version: "1.19" # The Go version to download (if necessary) and use. - - name: Proto Check - run: make proto-check + # - name: Proto Check + # run: make proto-check - name: Unit, integration and difference tests run: go test ./... - name: E2E tests diff --git a/Dockerfile b/Dockerfile index 4d81392316..dee88dae7c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,7 @@ # syntax=docker/dockerfile:1 -FROM golang:1.19-alpine AS is-builder + +FROM golang:1.20-alpine AS is-builder ENV PACKAGES curl make git libc-dev bash gcc linux-headers RUN apk add --no-cache $PACKAGES diff --git a/Dockerfile.gaia b/Dockerfile.gaia index 87448a1d63..b9f6ff007f 100644 --- a/Dockerfile.gaia +++ b/Dockerfile.gaia @@ -1,7 +1,7 @@ # syntax=docker/dockerfile:1 # build latest tagged gaia -FROM golang:1.19-alpine AS gaia-builder +FROM golang:1.20-alpine AS gaia-builder # WORKDIR is set to /go by default ARG USE_GAIA_TAG ENV GAIA_TAG=${USE_GAIA_TAG} @@ -43,7 +43,7 @@ RUN go mod tidy RUN go list -m github.com/cosmos/cosmos-sdk RUN make build -FROM golang:1.19-alpine AS is-builder +FROM golang:1.20-alpine AS is-builder ENV PACKAGES curl make git libc-dev bash gcc linux-headers RUN apk add --no-cache $PACKAGES diff --git a/Makefile b/Makefile index 351852cd21..69cdfa74be 100644 --- a/Makefile +++ b/Makefile @@ -13,6 +13,10 @@ install: go.sum test: go test ./... && go run ./tests/e2e/... +# run all unit tests +test-unit: + go test ./... + # run unit and integration tests test-short: go test ./x/... ./app/... ./tests/integration/... @@ -102,18 +106,20 @@ $(BUILDDIR)/: ### Protobuf ### ############################################################################### -containerProtoVer=0.9.0 +DOCKER := $(shell which docker) +HTTPS_GIT := https://github.com/cosmos/interchain-security.git + +containerProtoVer=0.13.0 containerProtoImage=ghcr.io/cosmos/proto-builder:$(containerProtoVer) -containerProtoGen=cosmos-sdk-proto-gen-$(containerProtoVer) -containerProtoGenSwagger=cosmos-sdk-proto-gen-swagger-$(containerProtoVer) -containerProtoFmt=cosmos-sdk-proto-fmt-$(containerProtoVer) + +protoImage=$(DOCKER) run --rm -v $(CURDIR):/workspace --workdir /workspace $(containerProtoImage) + proto-all: proto-format proto-lint proto-gen proto-gen: @echo "Generating Protobuf files" - @if docker ps -a --format '{{.Names}}' | grep -Eq "^${containerProtoGen}$$"; then docker start -a $(containerProtoGen); else docker run --name $(containerProtoGen) -v $(CURDIR):/workspace --workdir /workspace $(containerProtoImage) \ - sh ./scripts/protocgen.sh; fi + @$(protoImage) sh ./scripts/protocgen.sh; proto-check: @if git diff --quiet; then \ @@ -130,95 +136,25 @@ proto-check: exit 1; \ fi - proto-format: @echo "Formatting Protobuf files" - @if docker ps -a --format '{{.Names}}' | grep -Eq "^${containerProtoFmt}$$"; then docker start -a $(containerProtoFmt); else docker run --name $(containerProtoFmt) -v $(CURDIR):/workspace --workdir /workspace tendermintdev/docker-build-proto \ - find ./ -not -path "./third_party/*" -name "*.proto" -exec clang-format -i {} \; ; fi + @$(protoImage) find ./ -name "*.proto" -exec clang-format -i {} \; proto-swagger-gen: @echo "Generating Protobuf Swagger" - @if docker ps -a --format '{{.Names}}' | grep -Eq "^${containerProtoGenSwagger}$$"; then docker start -a $(containerProtoGenSwagger); else docker run --name $(containerProtoGenSwagger) -v $(CURDIR):/workspace --workdir /workspace $(containerProtoImage) \ - sh ./scripts/protoc-swagger-gen.sh; fi + @$(protoImage) sh ./scripts/protocgen.sh proto-lint: - @$(DOCKER_BUF) lint --error-format=json + @$(protoImage) buf lint --error-format=json proto-check-breaking: - @$(DOCKER_BUF) breaking --against $(HTTPS_GIT)#branch=main - -TM_URL = https://raw.githubusercontent.com/tendermint/tendermint/v0.34.5/proto/tendermint -GOGO_PROTO_URL = https://raw.githubusercontent.com/regen-network/protobuf/cosmos -CONFIO_URL = https://raw.githubusercontent.com/confio/ics23/v0.7.1 -COSMOS_PROTO_URL = https://raw.githubusercontent.com/regen-network/cosmos-proto/master -SDK_PROTO_URL = https://raw.githubusercontent.com/cosmos/cosmos-sdk/v0.45.13-ics/proto/cosmos - -TM_CRYPTO_TYPES = third_party/proto/tendermint/crypto -TM_ABCI_TYPES = third_party/proto/tendermint/abci -TM_TYPES = third_party/proto/tendermint/types -TM_VERSION = third_party/proto/tendermint/version -TM_LIBS = third_party/proto/tendermint/libs/bits -TM_P2P = third_party/proto/tendermint/p2p - -SDK_QUERY = third_party/proto/cosmos/base/query/v1beta1 -SDK_BASE = third_party/proto/cosmos/base/v1beta1 -SDK_UPGRADE = third_party/proto/cosmos/upgrade/v1beta1 -SDK_STAKING = third_party/proto/cosmos/staking/v1beta1 -SDK_EVIDENCE = third_party/proto/cosmos/evidence/v1beta1 - -GOGO_PROTO_TYPES = third_party/proto/gogoproto -CONFIO_TYPES = third_party/proto/confio -COSMOS_PROTO_TYPES = third_party/proto/cosmos_proto + @$(protoImage) buf breaking --against $(HTTPS_GIT)#branch=main proto-update-deps: - @mkdir -p $(COSMOS_PROTO_TYPES) - @curl -sSL $(COSMOS_PROTO_URL)/cosmos.proto > $(COSMOS_PROTO_TYPES)/cosmos.proto - - @mkdir -p $(SDK_QUERY) - @curl -sSL $(SDK_PROTO_URL)/base/query/v1beta1/pagination.proto > $(SDK_QUERY)/pagination.proto - - @mkdir -p $(SDK_BASE) - @curl -sSL $(SDK_PROTO_URL)/base/v1beta1/coin.proto > $(SDK_BASE)/coin.proto - - @mkdir -p $(SDK_UPGRADE) - @curl -sSL $(SDK_PROTO_URL)/upgrade/v1beta1/upgrade.proto > $(SDK_UPGRADE)/upgrade.proto - - @mkdir -p $(SDK_STAKING) - @curl -sSL $(SDK_PROTO_URL)/staking/v1beta1/staking.proto > $(SDK_STAKING)/staking.proto - - @mkdir -p $(SDK_EVIDENCE) - @curl -sSL $(SDK_PROTO_URL)/evidence/v1beta1/evidence.proto > $(SDK_EVIDENCE)/evidence.proto - -## Importing of tendermint protobuf definitions currently requires the -## use of `sed` in order to build properly with cosmos-sdk's proto file layout -## (which is the standard Buf.build FILE_LAYOUT) -## Issue link: https://github.com/tendermint/tendermint/issues/5021 - @mkdir -p $(TM_TYPES) - @curl -sSL $(TM_URL)/types/types.proto > $(TM_TYPES)/types.proto - @curl -sSL $(TM_URL)/types/params.proto > $(TM_TYPES)/params.proto - @curl -sSL $(TM_URL)/types/validator.proto > $(TM_TYPES)/validator.proto - - @mkdir -p $(TM_ABCI_TYPES) - @curl -sSL $(TM_URL)/abci/types.proto > $(TM_ABCI_TYPES)/types.proto - - @mkdir -p $(TM_VERSION) - @curl -sSL $(TM_URL)/version/types.proto > $(TM_VERSION)/types.proto - - @mkdir -p $(TM_LIBS) - @curl -sSL $(TM_URL)/libs/bits/types.proto > $(TM_LIBS)/types.proto - - @mkdir -p $(TM_CRYPTO_TYPES) - @curl -sSL $(TM_URL)/crypto/proof.proto > $(TM_CRYPTO_TYPES)/proof.proto - @curl -sSL $(TM_URL)/crypto/keys.proto > $(TM_CRYPTO_TYPES)/keys.proto - - @mkdir -p $(CONFIO_TYPES) - @curl -sSL $(CONFIO_URL)/proofs.proto > $(CONFIO_TYPES)/proofs.proto - -## insert go package option into proofs.proto file -## Issue link: https://github.com/confio/ics23/issues/32 - @perl -i -l -p -e 'print "option go_package = \"github.com/confio/ics23/go\";" if $$. == 4' $(CONFIO_TYPES)/proofs.proto + @echo "Updating Protobuf dependencies" + $(protoImage) buf mod update -.PHONY: proto-all proto-gen proto-gen-any proto-swagger-gen proto-format proto-lint proto-check-breaking proto-update-deps mocks +.PHONY: proto-all proto-gen proto-format proto-lint proto-check proto-check-breaking proto-update-deps mocks ############################################################################### ### Documentation ### diff --git a/app/consumer-democracy/ante/forbidden_proposals_ante.go b/app/consumer-democracy/ante/forbidden_proposals_ante.go index dd1b3d5e1e..f8acfd8bc5 100644 --- a/app/consumer-democracy/ante/forbidden_proposals_ante.go +++ b/app/consumer-democracy/ante/forbidden_proposals_ante.go @@ -4,25 +4,51 @@ import ( "fmt" sdk "github.com/cosmos/cosmos-sdk/types" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + + govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" ) type ForbiddenProposalsDecorator struct { - IsProposalWhitelisted func(govtypes.Content) bool + isLegacyProposalWhitelisted func(govv1beta1.Content) bool + isModuleWhiteList func(string) bool } -func NewForbiddenProposalsDecorator(whiteListFn func(govtypes.Content) bool) ForbiddenProposalsDecorator { - return ForbiddenProposalsDecorator{IsProposalWhitelisted: whiteListFn} +func NewForbiddenProposalsDecorator( + whiteListFn func(govv1beta1.Content) bool, + isModuleWhiteList func(string) bool, +) ForbiddenProposalsDecorator { + return ForbiddenProposalsDecorator{ + isLegacyProposalWhitelisted: whiteListFn, + isModuleWhiteList: isModuleWhiteList, + } } func (decorator ForbiddenProposalsDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (newCtx sdk.Context, err error) { currHeight := ctx.BlockHeight() for _, msg := range tx.GetMsgs() { - submitProposalMgs, ok := msg.(*govtypes.MsgSubmitProposal) // if the message is MsgSubmitProposal, check if proposal is whitelisted - if ok { - if !decorator.IsProposalWhitelisted(submitProposalMgs.GetContent()) { + submitProposalMgs, ok := msg.(*govv1.MsgSubmitProposal) + if !ok { + continue + } + + messages := submitProposalMgs.GetMessages() + for _, message := range messages { + if sdkMsg, isLegacyProposal := message.GetCachedValue().(*govv1.MsgExecLegacyContent); isLegacyProposal { + // legacy gov proposal content + content, err := govv1.LegacyContentFromMessage(sdkMsg) + if err != nil { + return ctx, fmt.Errorf("tx contains invalid LegacyContent") + } + if !decorator.isLegacyProposalWhitelisted(content) { + return ctx, fmt.Errorf("tx contains unsupported proposal message types at height %d", currHeight) + } + continue + } + // not legacy gov proposal content and not whitelisted + if !decorator.isModuleWhiteList(message.TypeUrl) { return ctx, fmt.Errorf("tx contains unsupported proposal message types at height %d", currHeight) } } diff --git a/app/consumer-democracy/ante/forbidden_proposals_ante_test.go b/app/consumer-democracy/ante/forbidden_proposals_ante_test.go index 00e5adc6e2..5c67506e7c 100644 --- a/app/consumer-democracy/ante/forbidden_proposals_ante_test.go +++ b/app/consumer-democracy/ante/forbidden_proposals_ante_test.go @@ -7,15 +7,35 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" "github.com/cosmos/cosmos-sdk/x/params/types/proposal" app "github.com/cosmos/interchain-security/v2/app/consumer-democracy" "github.com/cosmos/interchain-security/v2/app/consumer-democracy/ante" "github.com/stretchr/testify/require" + + ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" ) +// in SDKv47 parameter updates full params object is required +// either all params can be updated or none can be updated func TestForbiddenProposalsDecorator(t *testing.T) { txCfg := app.MakeTestEncodingConfig().TxConfig + // here we try to set whatever params exist to their default values + // the actual parameter setting is not important, what's being tested is the ante handle filter + // Note: mint params CAN be changed according to WhiteListModule in proposals_whitelisting.go + updateMintParams := &minttypes.MsgUpdateParams{ + Authority: authtypes.NewModuleAddress(govtypes.ModuleName).String(), + Params: minttypes.DefaultParams(), + } + + // Note: auth params CANNOT be changed according to WhiteListModule in proposals_whitelisting.go + updateAuthParams := &authtypes.MsgUpdateParams{ + Authority: authtypes.NewModuleAddress(govtypes.ModuleName).String(), + Params: authtypes.DefaultParams(), + } + testCases := []struct { name string ctx sdk.Context @@ -23,12 +43,78 @@ func TestForbiddenProposalsDecorator(t *testing.T) { expectErr bool }{ { - name: "Allowed param change", + name: "Allowed param change - mint module", + ctx: sdk.Context{}, + msgs: []sdk.Msg{ + newParamChangeProposalMsg([]sdk.Msg{updateMintParams}), + }, + expectErr: false, + }, + { + name: "Forbidden param change - auth module", + ctx: sdk.Context{}, + msgs: []sdk.Msg{ + newParamChangeProposalMsg([]sdk.Msg{updateAuthParams}), + }, + expectErr: true, + }, + { + name: "Allowed and forbidden param changes in the same msg", ctx: sdk.Context{}, msgs: []sdk.Msg{ - newParamChangeProposalMsg([]proposal.ParamChange{ + newParamChangeProposalMsg([]sdk.Msg{updateMintParams, updateAuthParams}), + }, + expectErr: true, + }, + { + name: "Allowed and forbidden param changes in different msg", + ctx: sdk.Context{}, + msgs: []sdk.Msg{ + newParamChangeProposalMsg([]sdk.Msg{updateMintParams}), + newParamChangeProposalMsg([]sdk.Msg{updateAuthParams}), + }, + expectErr: true, + }, + } + + for _, tc := range testCases { + tc := tc + + t.Run(tc.name, func(t *testing.T) { + handler := ante.NewForbiddenProposalsDecorator(app.IsProposalWhitelisted, app.IsModuleWhiteList) + + txBuilder := txCfg.NewTxBuilder() + require.NoError(t, txBuilder.SetMsgs(tc.msgs...)) + + _, err := handler.AnteHandle(tc.ctx, txBuilder.GetTx(), false, + func(ctx sdk.Context, _ sdk.Tx, _ bool) (sdk.Context, error) { return ctx, nil }) + if tc.expectErr { + require.Error(t, err) + } else { + require.NoError(t, err) + } + }) + } +} + +// Only ibctransfertypes.SendEnabled/ReceiveEnabled support legacy proposals for changing params +// Note: see LegacyWhitelistedParams in proposals_whitelisting.go +func TestForbiddenLegacyProposalsDecorator(t *testing.T) { + txCfg := app.MakeTestEncodingConfig().TxConfig + + testCases := []struct { + name string + ctx sdk.Context + msgs []sdk.Msg + expectErr bool + }{ + { + name: "Allowed legacy param change -- only for ibctransfertypes.SendEnabled/ReceiveEnabled", + ctx: sdk.Context{}, + msgs: []sdk.Msg{ + newLegacyParamChangeProposalMsg([]proposal.ParamChange{ // only subspace and key are relevant for testing - {Subspace: banktypes.ModuleName, Key: "SendEnabled", Value: ""}, + {Subspace: ibctransfertypes.ModuleName, Key: "SendEnabled", Value: "true"}, }), }, expectErr: false, @@ -37,7 +123,7 @@ func TestForbiddenProposalsDecorator(t *testing.T) { name: "Forbidden param change", ctx: sdk.Context{}, msgs: []sdk.Msg{ - newParamChangeProposalMsg([]proposal.ParamChange{ + newLegacyParamChangeProposalMsg([]proposal.ParamChange{ {Subspace: authtypes.ModuleName, Key: "MaxMemoCharacters", Value: ""}, }), }, @@ -47,8 +133,10 @@ func TestForbiddenProposalsDecorator(t *testing.T) { name: "Allowed and forbidden param changes in the same msg", ctx: sdk.Context{}, msgs: []sdk.Msg{ - newParamChangeProposalMsg([]proposal.ParamChange{ - {Subspace: banktypes.ModuleName, Key: "SendEnabled", Value: ""}, + newLegacyParamChangeProposalMsg([]proposal.ParamChange{ + // allowed + {Subspace: ibctransfertypes.ModuleName, Key: "SendEnabled", Value: "true"}, + // disallowed {Subspace: authtypes.ModuleName, Key: "MaxMemoCharacters", Value: ""}, }), }, @@ -58,11 +146,13 @@ func TestForbiddenProposalsDecorator(t *testing.T) { name: "Allowed and forbidden param changes in different msg", ctx: sdk.Context{}, msgs: []sdk.Msg{ - newParamChangeProposalMsg([]proposal.ParamChange{ + newLegacyParamChangeProposalMsg([]proposal.ParamChange{ + // disallowed {Subspace: banktypes.ModuleName, Key: "SendEnabled", Value: ""}, }), - newParamChangeProposalMsg([]proposal.ParamChange{ - {Subspace: authtypes.ModuleName, Key: "MaxMemoCharacters", Value: ""}, + newLegacyParamChangeProposalMsg([]proposal.ParamChange{ + // allowed + {Subspace: ibctransfertypes.ModuleName, Key: "SendEnabled", Value: "true"}, }), }, expectErr: true, @@ -73,7 +163,7 @@ func TestForbiddenProposalsDecorator(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { - handler := ante.NewForbiddenProposalsDecorator(app.IsProposalWhitelisted) + handler := ante.NewForbiddenProposalsDecorator(app.IsProposalWhitelisted, app.IsModuleWhiteList) txBuilder := txCfg.NewTxBuilder() require.NoError(t, txBuilder.SetMsgs(tc.msgs...)) @@ -89,8 +179,18 @@ func TestForbiddenProposalsDecorator(t *testing.T) { } } -func newParamChangeProposalMsg(changes []proposal.ParamChange) *govtypes.MsgSubmitProposal { +// Use ParamChangeProposal +func newLegacyParamChangeProposalMsg(changes []proposal.ParamChange) *govv1.MsgSubmitProposal { paramChange := proposal.ParameterChangeProposal{Changes: changes} - msg, _ := govtypes.NewMsgSubmitProposal(¶mChange, sdk.NewCoins(), sdk.AccAddress{}) + msgContent, err := govv1.NewLegacyContent(¶mChange, authtypes.NewModuleAddress(govtypes.ModuleName).String()) + if err != nil { + return nil + } + msg, _ := govv1.NewMsgSubmitProposal([]sdk.Msg{msgContent}, sdk.NewCoins(), sdk.AccAddress{}.String(), "", "", "") + return msg +} + +func newParamChangeProposalMsg(msgs []sdk.Msg) *govv1.MsgSubmitProposal { + msg, _ := govv1.NewMsgSubmitProposal(msgs, sdk.NewCoins(), sdk.AccAddress{}.String(), "", "", "") return msg } diff --git a/app/consumer-democracy/ante_handler.go b/app/consumer-democracy/ante_handler.go index b50d209312..b031c9fadc 100644 --- a/app/consumer-democracy/ante_handler.go +++ b/app/consumer-democracy/ante_handler.go @@ -5,8 +5,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/x/auth/ante" - ibcante "github.com/cosmos/ibc-go/v4/modules/core/ante" - ibckeeper "github.com/cosmos/ibc-go/v4/modules/core/keeper" + ibcante "github.com/cosmos/ibc-go/v7/modules/core/ante" + ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" democracyante "github.com/cosmos/interchain-security/v2/app/consumer-democracy/ante" consumerante "github.com/cosmos/interchain-security/v2/app/consumer/ante" ibcconsumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" @@ -39,23 +39,22 @@ func NewAnteHandler(options HandlerOptions) (sdk.AnteHandler, error) { anteDecorators := []sdk.AnteDecorator{ ante.NewSetUpContextDecorator(), - ante.NewRejectExtensionOptionsDecorator(), + ante.NewExtensionOptionsDecorator(nil), consumerante.NewMsgFilterDecorator(options.ConsumerKeeper), consumerante.NewDisabledModulesDecorator("/cosmos.evidence", "/cosmos.slashing"), - democracyante.NewForbiddenProposalsDecorator(IsProposalWhitelisted), - ante.NewMempoolFeeDecorator(), + democracyante.NewForbiddenProposalsDecorator(IsProposalWhitelisted, IsModuleWhiteList), ante.NewValidateBasicDecorator(), ante.NewTxTimeoutHeightDecorator(), ante.NewValidateMemoDecorator(options.AccountKeeper), ante.NewConsumeGasForTxSizeDecorator(options.AccountKeeper), - ante.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper), + ante.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper, options.TxFeeChecker), // SetPubKeyDecorator must be called before all signature verification decorators ante.NewSetPubKeyDecorator(options.AccountKeeper), ante.NewValidateSigCountDecorator(options.AccountKeeper), ante.NewSigGasConsumeDecorator(options.AccountKeeper, sigGasConsumer), ante.NewSigVerificationDecorator(options.AccountKeeper, options.SignModeHandler), ante.NewIncrementSequenceDecorator(options.AccountKeeper), - ibcante.NewAnteDecorator(options.IBCKeeper), + ibcante.NewRedundantRelayDecorator(options.IBCKeeper), } return sdk.ChainAnteDecorators(anteDecorators...), nil diff --git a/app/consumer-democracy/app.go b/app/consumer-democracy/app.go index e9406cfecd..e72b62c9e5 100644 --- a/app/consumer-democracy/app.go +++ b/app/consumer-democracy/app.go @@ -4,31 +4,37 @@ import ( "fmt" "io" stdlog "log" - "net/http" "os" "path/filepath" + "github.com/cosmos/cosmos-sdk/client/flags" + nodeservice "github.com/cosmos/cosmos-sdk/client/grpc/node" + "github.com/cosmos/cosmos-sdk/runtime" + "github.com/cosmos/cosmos-sdk/x/consensus" + consensusparamkeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" + consensusparamtypes "github.com/cosmos/cosmos-sdk/x/consensus/types" + "github.com/cosmos/cosmos-sdk/x/genutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" appparams "github.com/cosmos/interchain-security/v2/app/params" + autocliv1 "cosmossdk.io/api/cosmos/autocli/v1" + reflectionv1 "cosmossdk.io/api/cosmos/reflection/v1" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" - "github.com/cosmos/cosmos-sdk/client/rpc" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/server/api" "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" - "github.com/cosmos/cosmos-sdk/simapp" "github.com/cosmos/cosmos-sdk/std" - store "github.com/cosmos/cosmos-sdk/store/types" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/version" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/auth/ante" - authrest "github.com/cosmos/cosmos-sdk/x/auth/client/rest" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" authsims "github.com/cosmos/cosmos-sdk/x/auth/simulation" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" @@ -39,6 +45,8 @@ import ( authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" authzmodule "github.com/cosmos/cosmos-sdk/x/authz/module" "github.com/cosmos/cosmos-sdk/x/bank" + + runtimeservices "github.com/cosmos/cosmos-sdk/runtime/services" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/capability" @@ -59,34 +67,29 @@ import ( paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" upgradeclient "github.com/cosmos/cosmos-sdk/x/upgrade/client" + dbm "github.com/cometbft/cometbft-db" + abci "github.com/cometbft/cometbft/abci/types" + tmjson "github.com/cometbft/cometbft/libs/json" + "github.com/cometbft/cometbft/libs/log" + tmos "github.com/cometbft/cometbft/libs/os" "github.com/cosmos/cosmos-sdk/x/slashing" slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" "github.com/cosmos/cosmos-sdk/x/upgrade" upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - "github.com/cosmos/ibc-go/v4/modules/apps/transfer" - ibctransferkeeper "github.com/cosmos/ibc-go/v4/modules/apps/transfer/keeper" - ibctransfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" - ibc "github.com/cosmos/ibc-go/v4/modules/core" - ibcconnectiontypes "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types" - porttypes "github.com/cosmos/ibc-go/v4/modules/core/05-port/types" - ibchost "github.com/cosmos/ibc-go/v4/modules/core/24-host" - ibckeeper "github.com/cosmos/ibc-go/v4/modules/core/keeper" + "github.com/cosmos/ibc-go/v7/modules/apps/transfer" + ibctransferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper" + ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + ibc "github.com/cosmos/ibc-go/v7/modules/core" + ibcconnectiontypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" + ibchost "github.com/cosmos/ibc-go/v7/modules/core/exported" + ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" ibctestingcore "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/core" ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" - "github.com/gorilla/mux" - "github.com/rakyll/statik/fs" "github.com/spf13/cast" - abci "github.com/tendermint/tendermint/abci/types" - tmjson "github.com/tendermint/tendermint/libs/json" - "github.com/tendermint/tendermint/libs/log" - tmos "github.com/tendermint/tendermint/libs/os" - dbm "github.com/tendermint/tm-db" - - distr "github.com/cosmos/cosmos-sdk/x/distribution" - distrclient "github.com/cosmos/cosmos-sdk/x/distribution/client" distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" testutil "github.com/cosmos/interchain-security/v2/testutil/integration" @@ -97,8 +100,10 @@ import ( ccvstaking "github.com/cosmos/interchain-security/v2/x/ccv/democracy/staking" gov "github.com/cosmos/cosmos-sdk/x/gov" + govclient "github.com/cosmos/cosmos-sdk/x/gov/client" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" ccvgov "github.com/cosmos/interchain-security/v2/x/ccv/democracy/governance" // add mint @@ -107,6 +112,7 @@ import ( minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" paramproposal "github.com/cosmos/cosmos-sdk/x/params/types/proposal" + tendermint "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" consumer "github.com/cosmos/interchain-security/v2/x/ccv/consumer" consumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" @@ -130,6 +136,7 @@ var ( // and genesis verification. ModuleBasics = module.NewBasicManager( auth.AppModuleBasic{}, + genutil.NewAppModuleBasic(genutiltypes.DefaultMessageValidator), bank.AppModuleBasic{}, capability.AppModuleBasic{}, ccvstaking.AppModuleBasic{}, @@ -137,7 +144,11 @@ var ( ccvdistr.AppModuleBasic{}, gov.NewAppModuleBasic( // TODO: eventually remove upgrade proposal handler and cancel proposal handler - paramsclient.ProposalHandler, distrclient.ProposalHandler, upgradeclient.ProposalHandler, upgradeclient.CancelProposalHandler, + []govclient.ProposalHandler{ + paramsclient.ProposalHandler, + upgradeclient.LegacyProposalHandler, + upgradeclient.LegacyCancelProposalHandler, + }, ), params.AppModuleBasic{}, crisis.AppModuleBasic{}, @@ -149,8 +160,10 @@ var ( evidence.AppModuleBasic{}, transfer.AppModuleBasic{}, vesting.AppModuleBasic{}, + tendermint.AppModuleBasic{}, // router.AppModuleBasic{}, consumer.AppModuleBasic{}, + consensus.AppModuleBasic{}, ) // module account permissions @@ -168,7 +181,7 @@ var ( ) var ( - _ simapp.App = (*App)(nil) + _ runtime.AppI = (*App)(nil) _ servertypes.Application = (*App)(nil) _ ibctesting.TestingApp = (*App)(nil) ) @@ -180,33 +193,33 @@ type App struct { // nolint: golint *baseapp.BaseApp legacyAmino *codec.LegacyAmino appCodec codec.Codec + txConfig client.TxConfig interfaceRegistry types.InterfaceRegistry - invCheckPeriod uint - // keys to access the substores - keys map[string]*sdk.KVStoreKey - tkeys map[string]*sdk.TransientStoreKey - memKeys map[string]*sdk.MemoryStoreKey + keys map[string]*storetypes.KVStoreKey + tkeys map[string]*storetypes.TransientStoreKey + memKeys map[string]*storetypes.MemoryStoreKey // keepers - AccountKeeper authkeeper.AccountKeeper - BankKeeper bankkeeper.Keeper - CapabilityKeeper *capabilitykeeper.Keeper - StakingKeeper stakingkeeper.Keeper - SlashingKeeper slashingkeeper.Keeper - MintKeeper mintkeeper.Keeper - DistrKeeper distrkeeper.Keeper - GovKeeper govkeeper.Keeper - CrisisKeeper crisiskeeper.Keeper - UpgradeKeeper upgradekeeper.Keeper - ParamsKeeper paramskeeper.Keeper - IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly - EvidenceKeeper evidencekeeper.Keeper - TransferKeeper ibctransferkeeper.Keeper - FeeGrantKeeper feegrantkeeper.Keeper - AuthzKeeper authzkeeper.Keeper - ConsumerKeeper consumerkeeper.Keeper + AccountKeeper authkeeper.AccountKeeper + BankKeeper bankkeeper.Keeper + CapabilityKeeper *capabilitykeeper.Keeper + StakingKeeper *stakingkeeper.Keeper + SlashingKeeper slashingkeeper.Keeper + MintKeeper mintkeeper.Keeper + DistrKeeper distrkeeper.Keeper + GovKeeper govkeeper.Keeper + CrisisKeeper crisiskeeper.Keeper + UpgradeKeeper upgradekeeper.Keeper + ParamsKeeper paramskeeper.Keeper + IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly + EvidenceKeeper evidencekeeper.Keeper + TransferKeeper ibctransferkeeper.Keeper + FeeGrantKeeper feegrantkeeper.Keeper + AuthzKeeper authzkeeper.Keeper + ConsumerKeeper consumerkeeper.Keeper + ConsensusParamsKeeper consensusparamkeeper.Keeper // make scoped keepers public for test purposes ScopedIBCKeeper capabilitykeeper.ScopedKeeper @@ -236,16 +249,15 @@ func New( db dbm.DB, traceStore io.Writer, loadLatest bool, - skipUpgradeHeights map[int64]bool, - homePath string, - invCheckPeriod uint, - encodingConfig appparams.EncodingConfig, appOpts servertypes.AppOptions, baseAppOptions ...func(*baseapp.BaseApp), ) *App { - appCodec := encodingConfig.Marshaler + encodingConfig := makeEncodingConfig() + + appCodec := encodingConfig.Codec legacyAmino := encodingConfig.Amino interfaceRegistry := encodingConfig.InterfaceRegistry + txConfig := encodingConfig.TxConfig bApp := baseapp.NewBaseApp(AppName, logger, db, encodingConfig.TxConfig.TxDecoder(), baseAppOptions...) bApp.SetCommitMultiStoreTracer(traceStore) @@ -253,11 +265,11 @@ func New( bApp.SetInterfaceRegistry(interfaceRegistry) keys := sdk.NewKVStoreKeys( - authtypes.StoreKey, banktypes.StoreKey, stakingtypes.StoreKey, + authtypes.StoreKey, banktypes.StoreKey, stakingtypes.StoreKey, crisistypes.StoreKey, minttypes.StoreKey, distrtypes.StoreKey, slashingtypes.StoreKey, govtypes.StoreKey, paramstypes.StoreKey, ibchost.StoreKey, upgradetypes.StoreKey, feegrant.StoreKey, evidencetypes.StoreKey, ibctransfertypes.StoreKey, - capabilitytypes.StoreKey, authzkeeper.StoreKey, + capabilitytypes.StoreKey, authzkeeper.StoreKey, consensusparamtypes.StoreKey, consumertypes.StoreKey, ) tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey) @@ -267,8 +279,8 @@ func New( BaseApp: bApp, legacyAmino: legacyAmino, appCodec: appCodec, + txConfig: txConfig, interfaceRegistry: interfaceRegistry, - invCheckPeriod: invCheckPeriod, keys: keys, tkeys: tkeys, memKeys: memKeys, @@ -282,10 +294,8 @@ func New( ) // set the BaseApp's parameter store - bApp.SetParamStore( - app.ParamsKeeper.Subspace(baseapp.Paramspace).WithKeyTable( - paramskeeper.ConsensusParamsKeyTable()), - ) + app.ConsensusParamsKeeper = consensusparamkeeper.NewKeeper(appCodec, keys[upgradetypes.StoreKey], authtypes.NewModuleAddress(govtypes.ModuleName).String()) + bApp.SetParamStore(&app.ConsensusParamsKeeper) // add capability keeper and ScopeToModule for ibc module app.CapabilityKeeper = capabilitykeeper.NewKeeper( @@ -302,9 +312,10 @@ func New( app.AccountKeeper = authkeeper.NewAccountKeeper( appCodec, keys[authtypes.StoreKey], - app.GetSubspace(authtypes.ModuleName), authtypes.ProtoBaseAccount, maccPerms, + AccountAddressPrefix, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) // Remove the fee-pool from the group of blocked recipient addresses in bank @@ -318,13 +329,14 @@ func New( appCodec, keys[banktypes.StoreKey], app.AccountKeeper, - app.GetSubspace(banktypes.ModuleName), bankBlockedAddrs, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) app.AuthzKeeper = authzkeeper.NewKeeper( keys[authzkeeper.StoreKey], appCodec, app.BaseApp.MsgServiceRouter(), + app.AccountKeeper, ) app.FeeGrantKeeper = feegrantkeeper.NewKeeper( appCodec, @@ -332,72 +344,108 @@ func New( app.AccountKeeper, ) - stakingKeeper := stakingkeeper.NewKeeper( + app.StakingKeeper = stakingkeeper.NewKeeper( appCodec, keys[stakingtypes.StoreKey], app.AccountKeeper, app.BankKeeper, - app.GetSubspace(stakingtypes.ModuleName), + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) app.MintKeeper = mintkeeper.NewKeeper( - appCodec, keys[minttypes.StoreKey], app.GetSubspace(minttypes.ModuleName), &stakingKeeper, - app.AccountKeeper, app.BankKeeper, authtypes.FeeCollectorName, + appCodec, + keys[minttypes.StoreKey], + app.StakingKeeper, + app.AccountKeeper, + app.BankKeeper, + authtypes.FeeCollectorName, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) app.SlashingKeeper = slashingkeeper.NewKeeper( appCodec, + legacyAmino, keys[slashingtypes.StoreKey], &app.ConsumerKeeper, - app.GetSubspace(slashingtypes.ModuleName), + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) app.DistrKeeper = distrkeeper.NewKeeper( appCodec, keys[distrtypes.StoreKey], - app.GetSubspace(distrtypes.ModuleName), app.AccountKeeper, app.BankKeeper, - &stakingKeeper, + app.StakingKeeper, consumertypes.ConsumerRedistributeName, - app.ModuleAccountAddrs(), + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) - app.CrisisKeeper = crisiskeeper.NewKeeper( - app.GetSubspace(crisistypes.ModuleName), + + invCheckPeriod := cast.ToUint(appOpts.Get(server.FlagInvCheckPeriod)) + app.CrisisKeeper = *crisiskeeper.NewKeeper( + appCodec, + keys[crisistypes.StoreKey], invCheckPeriod, app.BankKeeper, authtypes.FeeCollectorName, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) - app.UpgradeKeeper = upgradekeeper.NewKeeper( + + // get skipUpgradeHeights from the app options + skipUpgradeHeights := map[int64]bool{} + for _, h := range cast.ToIntSlice(appOpts.Get(server.FlagUnsafeSkipUpgrades)) { + skipUpgradeHeights[int64(h)] = true + } + homePath := cast.ToString(appOpts.Get(flags.FlagHome)) + // set the governance module account as the authority for conducting upgrades + app.UpgradeKeeper = *upgradekeeper.NewKeeper( skipUpgradeHeights, keys[upgradetypes.StoreKey], appCodec, homePath, app.BaseApp, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) // register the staking hooks // NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks // NOTE: slashing hook was removed since it's only relevant for consumerKeeper - app.StakingKeeper = *stakingKeeper.SetHooks( + app.StakingKeeper.SetHooks( stakingtypes.NewMultiStakingHooks(app.DistrKeeper.Hooks()), ) // register the proposal types - ccvgovRouter := govtypes.NewRouter() - ccvgovRouter.AddRoute(govtypes.RouterKey, govtypes.ProposalHandler). + ccvgovRouter := govv1beta1.NewRouter() + ccvgovRouter.AddRoute(govtypes.RouterKey, govv1beta1.ProposalHandler). AddRoute(paramproposal.RouterKey, params.NewParamChangeProposalHandler(app.ParamsKeeper)). - AddRoute(distrtypes.RouterKey, distr.NewCommunityPoolSpendProposalHandler(app.DistrKeeper)). // TODO: remove upgrade handler from gov once admin module or decision for only signaling proposal is made. - AddRoute(upgradetypes.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(app.UpgradeKeeper)) + AddRoute(upgradetypes.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(&app.UpgradeKeeper)) + + govConfig := govtypes.DefaultConfig() govKeeper := govkeeper.NewKeeper( - appCodec, keys[govtypes.StoreKey], app.GetSubspace(govtypes.ModuleName), app.AccountKeeper, app.BankKeeper, - &stakingKeeper, ccvgovRouter, + appCodec, keys[govtypes.StoreKey], app.AccountKeeper, app.BankKeeper, + app.StakingKeeper, app.MsgServiceRouter(), govConfig, authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) - app.GovKeeper = *govKeeper.SetHooks( - govtypes.NewMultiGovHooks( - // register the governance hooks - ), + govKeeper.SetLegacyRouter(ccvgovRouter) + + app.GovKeeper = *govKeeper + + // pre-initialize ConsumerKeeper to satsfy ibckeeper.NewKeeper + // which would panic on nil or zero keeper + // ConsumerKeeper implements StakingKeeper but all function calls result in no-ops so this is safe + // communication over IBC is not affected by these changes + app.ConsumerKeeper = consumerkeeper.NewNonZeroKeeper( + appCodec, + keys[consumertypes.StoreKey], + app.GetSubspace(consumertypes.ModuleName), + ) + + app.IBCKeeper = ibckeeper.NewKeeper( + appCodec, + keys[ibchost.StoreKey], + app.GetSubspace(ibchost.ModuleName), + app.ConsumerKeeper, + app.UpgradeKeeper, + scopedIBCKeeper, ) app.IBCKeeper = ibckeeper.NewKeeper( @@ -434,9 +482,10 @@ func New( // of the slashing module app.SlashingKeeper = slashingkeeper.NewKeeper( appCodec, + legacyAmino, keys[slashingtypes.StoreKey], &app.ConsumerKeeper, - app.GetSubspace(slashingtypes.ModuleName), + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) // register slashing module StakingHooks to the consumer keeper @@ -478,24 +527,31 @@ func New( // NOTE: Any module instantiated in the module manager that is later modified // must be passed by reference here. app.MM = module.NewManager( - auth.NewAppModule(appCodec, app.AccountKeeper, nil), + genutil.NewAppModule( + app.AccountKeeper, + app.ConsumerKeeper, + app.BaseApp.DeliverTx, + encodingConfig.TxConfig, + ), + auth.NewAppModule(appCodec, app.AccountKeeper, nil, app.GetSubspace(authtypes.ModuleName)), vesting.NewAppModule(app.AccountKeeper, app.BankKeeper), - bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper), - capability.NewAppModule(appCodec, *app.CapabilityKeeper), - crisis.NewAppModule(&app.CrisisKeeper, skipGenesisInvariants), + bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper, app.GetSubspace(banktypes.ModuleName)), + capability.NewAppModule(appCodec, *app.CapabilityKeeper, false), + crisis.NewAppModule(&app.CrisisKeeper, skipGenesisInvariants, app.GetSubspace(crisistypes.ModuleName)), feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry), - ccvgov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper, IsProposalWhitelisted), - mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper), - slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.ConsumerKeeper), - ccvdistr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper, authtypes.FeeCollectorName), - ccvstaking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper), - upgrade.NewAppModule(app.UpgradeKeeper), + ccvgov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper, IsProposalWhitelisted, app.GetSubspace(govtypes.ModuleName), IsModuleWhiteList), + mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper, nil, app.GetSubspace(minttypes.ModuleName)), + slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.ConsumerKeeper, app.GetSubspace(slashingtypes.ModuleName)), + ccvdistr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, *app.StakingKeeper, authtypes.FeeCollectorName, app.GetSubspace(distrtypes.ModuleName)), + ccvstaking.NewAppModule(appCodec, *app.StakingKeeper, app.AccountKeeper, app.BankKeeper, app.GetSubspace(stakingtypes.ModuleName)), + upgrade.NewAppModule(&app.UpgradeKeeper), evidence.NewAppModule(app.EvidenceKeeper), params.NewAppModule(app.ParamsKeeper), authzmodule.NewAppModule(appCodec, app.AuthzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), ibc.NewAppModule(app.IBCKeeper), transferModule, consumerModule, + consensus.NewAppModule(appCodec, app.ConsensusParamsKeeper), ) // During begin block slashing happens after distr.BeginBlocker so that @@ -521,6 +577,8 @@ func New( feegrant.ModuleName, paramstypes.ModuleName, vestingtypes.ModuleName, + genutiltypes.ModuleName, + consensusparamtypes.ModuleName, ibctransfertypes.ModuleName, ibchost.ModuleName, consumertypes.ModuleName, @@ -540,6 +598,8 @@ func New( feegrant.ModuleName, paramstypes.ModuleName, upgradetypes.ModuleName, + genutiltypes.ModuleName, + consensusparamtypes.ModuleName, vestingtypes.ModuleName, ibctransfertypes.ModuleName, ibchost.ModuleName, @@ -568,14 +628,14 @@ func New( paramstypes.ModuleName, upgradetypes.ModuleName, vestingtypes.ModuleName, + genutiltypes.ModuleName, + consensusparamtypes.ModuleName, ibchost.ModuleName, ibctransfertypes.ModuleName, consumertypes.ModuleName, ) app.MM.RegisterInvariants(&app.CrisisKeeper) - app.MM.RegisterRoutes(app.Router(), app.QueryRouter(), encodingConfig.Amino) - app.configurator = module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter()) app.MM.RegisterServices(app.configurator) @@ -584,15 +644,15 @@ func New( // NOTE: this is not required apps that don't use the simulator for fuzz testing // transactions app.sm = module.NewSimulationManager( - auth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts), - bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper), - capability.NewAppModule(appCodec, *app.CapabilityKeeper), + auth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts, app.GetSubspace(authtypes.ModuleName)), + bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper, app.GetSubspace(banktypes.ModuleName)), + capability.NewAppModule(appCodec, *app.CapabilityKeeper, false), feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry), - ccvgov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper, IsProposalWhitelisted), - mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper), - ccvstaking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper), - ccvdistr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper, authtypes.FeeCollectorName), - slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), + ccvgov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper, IsProposalWhitelisted, app.GetSubspace(govtypes.ModuleName), IsModuleWhiteList), + mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper, nil, app.GetSubspace(minttypes.ModuleName)), + ccvstaking.NewAppModule(appCodec, *app.StakingKeeper, app.AccountKeeper, app.BankKeeper, app.GetSubspace(stakingtypes.ModuleName)), + ccvdistr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, *app.StakingKeeper, authtypes.FeeCollectorName, app.GetSubspace(distrtypes.ModuleName)), + slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, *app.StakingKeeper, app.GetSubspace(slashingtypes.ModuleName)), params.NewAppModule(app.ParamsKeeper), evidence.NewAppModule(app.EvidenceKeeper), ibc.NewAppModule(app.IBCKeeper), authzmodule.NewAppModule(appCodec, app.AuthzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), @@ -637,8 +697,11 @@ func New( fromVM := make(map[string]uint64) - for moduleName, eachModule := range app.MM.Modules { - fromVM[moduleName] = eachModule.ConsensusVersion() + for moduleName := range app.MM.Modules { + m := app.MM.Modules[moduleName] + if module, ok := m.(module.HasConsensusVersion); ok { + fromVM[moduleName] = module.ConsensusVersion() + } } // For a new consumer chain, this code (together with the entire SetUpgradeHandler) is not needed at all, @@ -681,7 +744,7 @@ func New( // Chains may need to add a KV store to their application. The following code // is needed for standalone chains that're changing over to a consumer chain, with a consumer ccv module. // When a chain starts from height 0 (like for testing purposes in this repo), the following code is not needed. - storeUpgrades := store.StoreUpgrades{ + storeUpgrades := storetypes.StoreUpgrades{ Added: []string{consumertypes.ModuleName}, } @@ -699,6 +762,14 @@ func New( app.ScopedTransferKeeper = scopedTransferKeeper app.ScopedIBCConsumerKeeper = scopedIBCConsumerKeeper + autocliv1.RegisterQueryServer(app.GRPCQueryRouter(), runtimeservices.NewAutoCLIQueryService(app.MM.Modules)) + + reflectionSvc, err := runtimeservices.NewReflectionService() + if err != nil { + panic(err) + } + reflectionv1.RegisterReflectionServiceServer(app.GRPCQueryRouter(), reflectionSvc) + return app } @@ -765,21 +836,21 @@ func (app *App) InterfaceRegistry() types.InterfaceRegistry { // GetKey returns the KVStoreKey for the provided store key. // // NOTE: This is solely to be used for testing purposes. -func (app *App) GetKey(storeKey string) *sdk.KVStoreKey { +func (app *App) GetKey(storeKey string) *storetypes.KVStoreKey { return app.keys[storeKey] } // GetTKey returns the TransientStoreKey for the provided store key. // // NOTE: This is solely to be used for testing purposes. -func (app *App) GetTKey(storeKey string) *sdk.TransientStoreKey { +func (app *App) GetTKey(storeKey string) *storetypes.TransientStoreKey { return app.tkeys[storeKey] } // GetMemKey returns the MemStoreKey for the provided mem key. // // NOTE: This is solely used for testing purposes. -func (app *App) GetMemKey(storeKey string) *sdk.MemoryStoreKey { +func (app *App) GetMemKey(storeKey string) *storetypes.MemoryStoreKey { return app.memKeys[storeKey] } @@ -870,25 +941,29 @@ func (app *App) GetTxConfig() client.TxConfig { return MakeTestEncodingConfig().TxConfig } +// TxConfig returns SimApp's TxConfig +func (app *App) TxConfig() client.TxConfig { + return app.txConfig +} + // RegisterAPIRoutes registers all application module routes with the provided // API server. func (app *App) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIConfig) { clientCtx := apiSvr.ClientCtx - rpc.RegisterRoutes(clientCtx, apiSvr.Router) - // Register legacy tx routes. - authrest.RegisterTxRoutes(clientCtx, apiSvr.Router) // Register new tx routes from grpc-gateway. authtx.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) // Register new tendermint queries routes from grpc-gateway. tmservice.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) - // Register legacy and grpc-gateway routes for all modules. - ModuleBasics.RegisterRESTRoutes(clientCtx, apiSvr.Router) + // Register node gRPC service for grpc-gateway. + nodeservice.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) + + // Register grpc-gateway routes for all modules. ModuleBasics.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) // register swagger API from root so that other applications can override easily - if apiConfig.Swagger { - RegisterSwaggerAPI(apiSvr.Router) + if err := server.RegisterSwaggerAPI(apiSvr.ClientCtx, apiSvr.Router, apiConfig.Swagger); err != nil { + panic(err) } } @@ -897,20 +972,13 @@ func (app *App) RegisterTxService(clientCtx client.Context) { authtx.RegisterTxService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.BaseApp.Simulate, app.interfaceRegistry) } -// RegisterTendermintService implements the Application.RegisterTendermintService method. -func (app *App) RegisterTendermintService(clientCtx client.Context) { - tmservice.RegisterTendermintService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.interfaceRegistry) +func (app *App) RegisterNodeService(clientCtx client.Context) { + nodeservice.RegisterNodeService(clientCtx, app.GRPCQueryRouter()) } -// RegisterSwaggerAPI registers swagger route with API Server -func RegisterSwaggerAPI(rtr *mux.Router) { - statikFS, err := fs.New() - if err != nil { - panic(err) - } - - staticServer := http.FileServer(statikFS) - rtr.PathPrefix("/swagger/").Handler(http.StripPrefix("/swagger/", staticServer)) +// RegisterTendermintService implements the Application.RegisterTendermintService method. +func (app *App) RegisterTendermintService(clientCtx client.Context) { + tmservice.RegisterTendermintService(clientCtx, app.BaseApp.GRPCQueryRouter(), app.interfaceRegistry, app.Query) } // GetMaccPerms returns a copy of the module account permissions @@ -923,16 +991,16 @@ func GetMaccPerms() map[string][]string { } // initParamsKeeper init params keeper and its subspaces -func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey sdk.StoreKey) paramskeeper.Keeper { +func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey storetypes.StoreKey) paramskeeper.Keeper { paramsKeeper := paramskeeper.NewKeeper(appCodec, legacyAmino, key, tkey) - paramsKeeper.Subspace(authtypes.ModuleName) + paramsKeeper.Subspace(authtypes.ModuleName).WithKeyTable(authtypes.ParamKeyTable()) //nolint:staticcheck // TODO: remove this temorary solution paramsKeeper.Subspace(banktypes.ModuleName) paramsKeeper.Subspace(stakingtypes.ModuleName) - paramsKeeper.Subspace(minttypes.ModuleName) + paramsKeeper.Subspace(minttypes.ModuleName).WithKeyTable(minttypes.ParamKeyTable()) //nolint:staticcheck // TODO: remove this temorary solution paramsKeeper.Subspace(distrtypes.ModuleName) paramsKeeper.Subspace(slashingtypes.ModuleName) - paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(govtypes.ParamKeyTable()) + paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(gov.ProvideKeyTable()) paramsKeeper.Subspace(crisistypes.ModuleName) paramsKeeper.Subspace(ibctransfertypes.ModuleName) paramsKeeper.Subspace(ibchost.ModuleName) @@ -953,3 +1021,12 @@ func MakeTestEncodingConfig() appparams.EncodingConfig { ModuleBasics.RegisterInterfaces(encodingConfig.InterfaceRegistry) return encodingConfig } + +func makeEncodingConfig() appparams.EncodingConfig { + encodingConfig := appparams.MakeTestEncodingConfig() + std.RegisterLegacyAminoCodec(encodingConfig.Amino) + std.RegisterInterfaces(encodingConfig.InterfaceRegistry) + ModuleBasics.RegisterLegacyAminoCodec(encodingConfig.Amino) + ModuleBasics.RegisterInterfaces(encodingConfig.InterfaceRegistry) + return encodingConfig +} diff --git a/app/consumer-democracy/export.go b/app/consumer-democracy/export.go index 36867df66a..6c511d6871 100644 --- a/app/consumer-democracy/export.go +++ b/app/consumer-democracy/export.go @@ -4,18 +4,18 @@ import ( "encoding/json" "fmt" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + tmtypes "github.com/cometbft/cometbft/types" servertypes "github.com/cosmos/cosmos-sdk/server/types" sdk "github.com/cosmos/cosmos-sdk/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" - tmtypes "github.com/tendermint/tendermint/types" ) // ExportAppStateAndValidators exports the state of the application for a genesis // file. func (app *App) ExportAppStateAndValidators( - forZeroHeight bool, jailAllowedAddrs []string, + forZeroHeight bool, jailAllowedAddrs, modulesToExport []string, ) (servertypes.ExportedApp, error) { // as if they could withdraw from the start of the next block ctx := app.NewContext(true, tmproto.Header{Height: app.LastBlockHeight()}) diff --git a/app/consumer-democracy/proposals_whitelisting.go b/app/consumer-democracy/proposals_whitelisting.go index 3f6f65b17f..ab9114343f 100644 --- a/app/consumer-democracy/proposals_whitelisting.go +++ b/app/consumer-democracy/proposals_whitelisting.go @@ -1,28 +1,24 @@ package app import ( - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" + "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" "github.com/cosmos/cosmos-sdk/x/params/types/proposal" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - ibctransfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" + ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" ) -func IsProposalWhitelisted(content govtypes.Content) bool { +func IsProposalWhitelisted(content v1beta1.Content) bool { switch c := content.(type) { case *proposal.ParameterChangeProposal: - return isParamChangeWhitelisted(c.Changes) + return isLegacyParamChangeWhitelisted(c.Changes) default: return false } } -func isParamChangeWhitelisted(paramChanges []proposal.ParamChange) bool { +func isLegacyParamChangeWhitelisted(paramChanges []proposal.ParamChange) bool { for _, paramChange := range paramChanges { - _, found := WhitelistedParams[paramChangeKey{Subspace: paramChange.Subspace, Key: paramChange.Key}] + _, found := LegacyWhitelistedParams[legacyParamChangeKey{Subspace: paramChange.Subspace, Key: paramChange.Key}] if !found { return false } @@ -30,37 +26,26 @@ func isParamChangeWhitelisted(paramChanges []proposal.ParamChange) bool { return true } -type paramChangeKey struct { +type legacyParamChangeKey struct { Subspace, Key string } -var WhitelistedParams = map[paramChangeKey]struct{}{ - // bank - {Subspace: banktypes.ModuleName, Key: "SendEnabled"}: {}, - // governance - {Subspace: govtypes.ModuleName, Key: "depositparams"}: {}, // min_deposit, max_deposit_period - {Subspace: govtypes.ModuleName, Key: "votingparams"}: {}, // voting_period - {Subspace: govtypes.ModuleName, Key: "tallyparams"}: {}, // quorum,threshold,veto_threshold - // staking - {Subspace: stakingtypes.ModuleName, Key: "UnbondingTime"}: {}, - {Subspace: stakingtypes.ModuleName, Key: "MaxValidators"}: {}, - {Subspace: stakingtypes.ModuleName, Key: "MaxEntries"}: {}, - {Subspace: stakingtypes.ModuleName, Key: "HistoricalEntries"}: {}, - {Subspace: stakingtypes.ModuleName, Key: "BondDenom"}: {}, - // distribution - {Subspace: distrtypes.ModuleName, Key: "communitytax"}: {}, - {Subspace: distrtypes.ModuleName, Key: "baseproposerreward"}: {}, - {Subspace: distrtypes.ModuleName, Key: "bonusproposerreward"}: {}, - {Subspace: distrtypes.ModuleName, Key: "withdrawaddrenabled"}: {}, - // mint - {Subspace: minttypes.ModuleName, Key: "MintDenom"}: {}, - {Subspace: minttypes.ModuleName, Key: "InflationRateChange"}: {}, - {Subspace: minttypes.ModuleName, Key: "InflationMax"}: {}, - {Subspace: minttypes.ModuleName, Key: "InflationMin"}: {}, - {Subspace: minttypes.ModuleName, Key: "GoalBonded"}: {}, - {Subspace: minttypes.ModuleName, Key: "BlocksPerYear"}: {}, +var LegacyWhitelistedParams = map[legacyParamChangeKey]struct{}{ // ibc transfer {Subspace: ibctransfertypes.ModuleName, Key: "SendEnabled"}: {}, {Subspace: ibctransfertypes.ModuleName, Key: "ReceiveEnabled"}: {}, // add interchain account params(HostEnabled, AllowedMessages) once the module is added to the consumer app } + +var WhiteListModule = map[string]struct{}{ + "/cosmos.gov.v1.MsgUpdateParams": {}, + "/cosmos.bank.v1beta1.MsgUpdateParams": {}, + "/cosmos.staking.v1beta1.MsgUpdateParams": {}, + "/cosmos.distribution.v1beta1.MsgUpdateParams": {}, + "/cosmos.mint.v1beta1.MsgUpdateParams": {}, +} + +func IsModuleWhiteList(typeUrl string) bool { + _, found := WhiteListModule[typeUrl] + return found +} diff --git a/app/consumer-democracy/proposals_whitelisting_test.go b/app/consumer-democracy/proposals_whitelisting_test.go index ecc14be44d..3b8bbdb855 100644 --- a/app/consumer-democracy/proposals_whitelisting_test.go +++ b/app/consumer-democracy/proposals_whitelisting_test.go @@ -13,7 +13,7 @@ func TestDemocracyGovernanceWhitelistingKeys(t *testing.T) { chain := ibctesting.NewTestChain(t, ibctesting.NewCoordinator(t, 0), icstestingutils.DemocracyConsumerAppIniter, "test") paramKeeper := chain.App.(*appConsumer.App).ParamsKeeper - for paramKey := range appConsumer.WhitelistedParams { + for paramKey := range appConsumer.LegacyWhitelistedParams { ss, ok := paramKeeper.GetSubspace(paramKey.Subspace) require.True(t, ok, "Unknown subspace %s", paramKey.Subspace) hasKey := ss.Has(chain.GetContext(), []byte(paramKey.Key)) diff --git a/app/consumer/ante/disabled_modules_ante_test.go b/app/consumer/ante/disabled_modules_ante_test.go index a41605b5df..2eb95e1ddb 100644 --- a/app/consumer/ante/disabled_modules_ante_test.go +++ b/app/consumer/ante/disabled_modules_ante_test.go @@ -7,7 +7,7 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" - ibcclienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" + ibcclienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" "github.com/cosmos/interchain-security/v2/app/consumer/ante" "github.com/cosmos/interchain-security/v2/app/params" "github.com/stretchr/testify/require" diff --git a/app/consumer/ante/msg_filter_ante_test.go b/app/consumer/ante/msg_filter_ante_test.go index a8771f399e..7ff11dc10f 100644 --- a/app/consumer/ante/msg_filter_ante_test.go +++ b/app/consumer/ante/msg_filter_ante_test.go @@ -5,7 +5,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - ibcclienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" + ibcclienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" "github.com/cosmos/interchain-security/v2/app/consumer/ante" "github.com/cosmos/interchain-security/v2/app/params" "github.com/stretchr/testify/require" diff --git a/app/consumer/ante_handler.go b/app/consumer/ante_handler.go index 12e0b3c5db..be33266f8d 100644 --- a/app/consumer/ante_handler.go +++ b/app/consumer/ante_handler.go @@ -5,8 +5,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/x/auth/ante" - ibcante "github.com/cosmos/ibc-go/v4/modules/core/ante" - ibckeeper "github.com/cosmos/ibc-go/v4/modules/core/keeper" + ibcante "github.com/cosmos/ibc-go/v7/modules/core/ante" + ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" + consumerante "github.com/cosmos/interchain-security/v2/app/consumer/ante" ibcconsumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" ) @@ -38,22 +39,21 @@ func NewAnteHandler(options HandlerOptions) (sdk.AnteHandler, error) { anteDecorators := []sdk.AnteDecorator{ ante.NewSetUpContextDecorator(), - ante.NewRejectExtensionOptionsDecorator(), + ante.NewExtensionOptionsDecorator(nil), consumerante.NewMsgFilterDecorator(options.ConsumerKeeper), consumerante.NewDisabledModulesDecorator("/cosmos.evidence", "/cosmos.slashing"), - ante.NewMempoolFeeDecorator(), ante.NewValidateBasicDecorator(), ante.NewTxTimeoutHeightDecorator(), ante.NewValidateMemoDecorator(options.AccountKeeper), ante.NewConsumeGasForTxSizeDecorator(options.AccountKeeper), - ante.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper), + ante.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper, options.TxFeeChecker), // SetPubKeyDecorator must be called before all signature verification decorators ante.NewSetPubKeyDecorator(options.AccountKeeper), ante.NewValidateSigCountDecorator(options.AccountKeeper), ante.NewSigGasConsumeDecorator(options.AccountKeeper, sigGasConsumer), ante.NewSigVerificationDecorator(options.AccountKeeper, options.SignModeHandler), ante.NewIncrementSequenceDecorator(options.AccountKeeper), - ibcante.NewAnteDecorator(options.IBCKeeper), + ibcante.NewRedundantRelayDecorator(options.IBCKeeper), } return sdk.ChainAnteDecorators(anteDecorators...), nil diff --git a/app/consumer/app.go b/app/consumer/app.go index 343349b040..34c18bb249 100644 --- a/app/consumer/app.go +++ b/app/consumer/app.go @@ -4,28 +4,40 @@ import ( "fmt" "io" stdlog "log" - "net/http" "os" "path/filepath" + autocliv1 "cosmossdk.io/api/cosmos/autocli/v1" + reflectionv1 "cosmossdk.io/api/cosmos/reflection/v1" + + dbm "github.com/cometbft/cometbft-db" + abci "github.com/cometbft/cometbft/abci/types" + tmjson "github.com/cometbft/cometbft/libs/json" + "github.com/cometbft/cometbft/libs/log" + tmos "github.com/cometbft/cometbft/libs/os" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + nodeservice "github.com/cosmos/cosmos-sdk/client/grpc/node" "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" - "github.com/cosmos/cosmos-sdk/client/rpc" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/runtime" + runtimeservices "github.com/cosmos/cosmos-sdk/runtime/services" + "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/server/api" "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" - "github.com/cosmos/cosmos-sdk/simapp" "github.com/cosmos/cosmos-sdk/std" - store "github.com/cosmos/cosmos-sdk/store/types" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/version" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/auth/ante" - authrest "github.com/cosmos/cosmos-sdk/x/auth/client/rest" + "github.com/cosmos/cosmos-sdk/x/genutil" + genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" + authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" authsims "github.com/cosmos/cosmos-sdk/x/auth/simulation" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" @@ -41,6 +53,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/capability" capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" + consensusparamkeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" "github.com/cosmos/cosmos-sdk/x/crisis" crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper" crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types" @@ -50,6 +63,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/feegrant" feegrantkeeper "github.com/cosmos/cosmos-sdk/x/feegrant/keeper" feegrantmodule "github.com/cosmos/cosmos-sdk/x/feegrant/module" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/cosmos/cosmos-sdk/x/params" paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper" paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" @@ -59,26 +73,20 @@ import ( "github.com/cosmos/cosmos-sdk/x/upgrade" upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - "github.com/cosmos/ibc-go/v4/modules/apps/transfer" - ibctransferkeeper "github.com/cosmos/ibc-go/v4/modules/apps/transfer/keeper" - ibctransfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" - ibc "github.com/cosmos/ibc-go/v4/modules/core" - ibcconnectiontypes "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types" - porttypes "github.com/cosmos/ibc-go/v4/modules/core/05-port/types" - ibchost "github.com/cosmos/ibc-go/v4/modules/core/24-host" - ibckeeper "github.com/cosmos/ibc-go/v4/modules/core/keeper" + "github.com/cosmos/ibc-go/v7/modules/apps/transfer" + ibctransferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper" + ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + ibc "github.com/cosmos/ibc-go/v7/modules/core" + ibcconnectiontypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" + ibchost "github.com/cosmos/ibc-go/v7/modules/core/exported" + ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" appparams "github.com/cosmos/interchain-security/v2/app/params" ibctestingcore "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/core" ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" - "github.com/gorilla/mux" - "github.com/rakyll/statik/fs" "github.com/spf13/cast" - abci "github.com/tendermint/tendermint/abci/types" - tmjson "github.com/tendermint/tendermint/libs/json" - "github.com/tendermint/tendermint/libs/log" - tmos "github.com/tendermint/tendermint/libs/os" - dbm "github.com/tendermint/tm-db" + tendermint "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" ibcconsumer "github.com/cosmos/interchain-security/v2/x/ccv/consumer" ibcconsumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" ibcconsumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" @@ -103,6 +111,7 @@ var ( // and genesis verification. ModuleBasics = module.NewBasicManager( auth.AppModuleBasic{}, + genutil.NewAppModuleBasic(genutiltypes.DefaultMessageValidator), bank.AppModuleBasic{}, capability.AppModuleBasic{}, params.AppModuleBasic{}, @@ -115,6 +124,7 @@ var ( evidence.AppModuleBasic{}, transfer.AppModuleBasic{}, vesting.AppModuleBasic{}, + tendermint.AppModuleBasic{}, // router.AppModuleBasic{}, ibcconsumer.AppModuleBasic{}, ) @@ -129,7 +139,7 @@ var ( ) var ( - _ simapp.App = (*App)(nil) + _ runtime.AppI = (*App)(nil) _ servertypes.Application = (*App)(nil) _ ibctesting.TestingApp = (*App)(nil) ) @@ -141,14 +151,13 @@ type App struct { // nolint: golint *baseapp.BaseApp legacyAmino *codec.LegacyAmino appCodec codec.Codec + txConfig client.TxConfig interfaceRegistry types.InterfaceRegistry - invCheckPeriod uint - // keys to access the substores - keys map[string]*sdk.KVStoreKey - tkeys map[string]*sdk.TransientStoreKey - memKeys map[string]*sdk.MemoryStoreKey + keys map[string]*storetypes.KVStoreKey + tkeys map[string]*storetypes.TransientStoreKey + memKeys map[string]*storetypes.MemoryStoreKey // keepers AccountKeeper authkeeper.AccountKeeper @@ -160,15 +169,16 @@ type App struct { // nolint: golint // from consumer chain or set to use an independent // different fee-pool from the consumer chain ConsumerKeeper - CrisisKeeper crisiskeeper.Keeper - UpgradeKeeper upgradekeeper.Keeper - ParamsKeeper paramskeeper.Keeper - IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly - EvidenceKeeper evidencekeeper.Keeper - TransferKeeper ibctransferkeeper.Keeper - FeeGrantKeeper feegrantkeeper.Keeper - AuthzKeeper authzkeeper.Keeper - ConsumerKeeper ibcconsumerkeeper.Keeper + CrisisKeeper crisiskeeper.Keeper + UpgradeKeeper upgradekeeper.Keeper + ParamsKeeper paramskeeper.Keeper + IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly + EvidenceKeeper evidencekeeper.Keeper + TransferKeeper ibctransferkeeper.Keeper + FeeGrantKeeper feegrantkeeper.Keeper + AuthzKeeper authzkeeper.Keeper + ConsumerKeeper ibcconsumerkeeper.Keeper + ConsensusParamsKeeper consensusparamkeeper.Keeper // make scoped keepers public for test purposes ScopedIBCKeeper capabilitykeeper.ScopedKeeper @@ -198,16 +208,15 @@ func New( db dbm.DB, traceStore io.Writer, loadLatest bool, - skipUpgradeHeights map[int64]bool, - homePath string, - invCheckPeriod uint, - encodingConfig appparams.EncodingConfig, appOpts servertypes.AppOptions, baseAppOptions ...func(*baseapp.BaseApp), ) *App { - appCodec := encodingConfig.Marshaler + encodingConfig := makeEncodingConfig() + + appCodec := encodingConfig.Codec legacyAmino := encodingConfig.Amino interfaceRegistry := encodingConfig.InterfaceRegistry + txConfig := encodingConfig.TxConfig bApp := baseapp.NewBaseApp(AppName, logger, db, encodingConfig.TxConfig.TxDecoder(), baseAppOptions...) bApp.SetCommitMultiStoreTracer(traceStore) @@ -215,7 +224,7 @@ func New( bApp.SetInterfaceRegistry(interfaceRegistry) keys := sdk.NewKVStoreKeys( - authtypes.StoreKey, banktypes.StoreKey, slashingtypes.StoreKey, + authtypes.StoreKey, banktypes.StoreKey, slashingtypes.StoreKey, crisistypes.StoreKey, paramstypes.StoreKey, ibchost.StoreKey, upgradetypes.StoreKey, evidencetypes.StoreKey, ibctransfertypes.StoreKey, capabilitytypes.StoreKey, feegrant.StoreKey, authzkeeper.StoreKey, @@ -228,8 +237,8 @@ func New( BaseApp: bApp, legacyAmino: legacyAmino, appCodec: appCodec, + txConfig: txConfig, interfaceRegistry: interfaceRegistry, - invCheckPeriod: invCheckPeriod, keys: keys, tkeys: tkeys, memKeys: memKeys, @@ -243,10 +252,8 @@ func New( ) // set the BaseApp's parameter store - bApp.SetParamStore( - app.ParamsKeeper.Subspace(baseapp.Paramspace).WithKeyTable( - paramskeeper.ConsensusParamsKeyTable()), - ) + app.ConsensusParamsKeeper = consensusparamkeeper.NewKeeper(appCodec, keys[upgradetypes.StoreKey], authtypes.NewModuleAddress(govtypes.ModuleName).String()) + bApp.SetParamStore(&app.ConsensusParamsKeeper) // add capability keeper and ScopeToModule for ibc module app.CapabilityKeeper = capabilitykeeper.NewKeeper( @@ -263,9 +270,10 @@ func New( app.AccountKeeper = authkeeper.NewAccountKeeper( appCodec, keys[authtypes.StoreKey], - app.GetSubspace(authtypes.ModuleName), authtypes.ProtoBaseAccount, maccPerms, + AccountAddressPrefix, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) // Remove the fee-pool from the group of blocked recipient addresses in bank @@ -279,13 +287,14 @@ func New( appCodec, keys[banktypes.StoreKey], app.AccountKeeper, - app.GetSubspace(banktypes.ModuleName), bankBlockedAddrs, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) app.AuthzKeeper = authzkeeper.NewKeeper( keys[authzkeeper.StoreKey], appCodec, app.BaseApp.MsgServiceRouter(), + app.AccountKeeper, ) app.FeeGrantKeeper = feegrantkeeper.NewKeeper( appCodec, @@ -297,33 +306,58 @@ func New( // of the slashing module app.SlashingKeeper = slashingkeeper.NewKeeper( appCodec, + legacyAmino, keys[slashingtypes.StoreKey], &app.ConsumerKeeper, - app.GetSubspace(slashingtypes.ModuleName), + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) - app.CrisisKeeper = crisiskeeper.NewKeeper( - app.GetSubspace(crisistypes.ModuleName), + + invCheckPeriod := cast.ToUint(appOpts.Get(server.FlagInvCheckPeriod)) + app.CrisisKeeper = *crisiskeeper.NewKeeper( + appCodec, + keys[crisistypes.StoreKey], invCheckPeriod, app.BankKeeper, authtypes.FeeCollectorName, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) - app.UpgradeKeeper = upgradekeeper.NewKeeper( + + // get skipUpgradeHeights from the app options + skipUpgradeHeights := map[int64]bool{} + for _, h := range cast.ToIntSlice(appOpts.Get(server.FlagUnsafeSkipUpgrades)) { + skipUpgradeHeights[int64(h)] = true + } + homePath := cast.ToString(appOpts.Get(flags.FlagHome)) + // set the governance module account as the authority for conducting upgrades + app.UpgradeKeeper = *upgradekeeper.NewKeeper( skipUpgradeHeights, keys[upgradetypes.StoreKey], appCodec, homePath, app.BaseApp, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + ) + + // pre-initialize ConsumerKeeper to satsfy ibckeeper.NewKeeper + // which would panic on nil or zero keeper + // ConsumerKeeper implements StakingKeeper but all function calls result in no-ops so this is safe + // communication over IBC is not affected by these changes + app.ConsumerKeeper = ibcconsumerkeeper.NewNonZeroKeeper( + appCodec, + keys[ibcconsumertypes.StoreKey], + app.GetSubspace(ibcconsumertypes.ModuleName), ) + app.IBCKeeper = ibckeeper.NewKeeper( appCodec, keys[ibchost.StoreKey], app.GetSubspace(ibchost.ModuleName), - &app.ConsumerKeeper, + app.ConsumerKeeper, app.UpgradeKeeper, scopedIBCKeeper, ) - // Create CCV consumer and modules + // initialize the actual consumer keeper app.ConsumerKeeper = ibcconsumerkeeper.NewKeeper( appCodec, keys[ibcconsumertypes.StoreKey], @@ -380,13 +414,19 @@ func New( // NOTE: Any module instantiated in the module manager that is later modified // must be passed by reference here. app.MM = module.NewManager( - auth.NewAppModule(appCodec, app.AccountKeeper, nil), + genutil.NewAppModule( + app.AccountKeeper, + app.ConsumerKeeper, + app.BaseApp.DeliverTx, + encodingConfig.TxConfig, + ), + auth.NewAppModule(appCodec, app.AccountKeeper, nil, app.GetSubspace(authtypes.ModuleName)), vesting.NewAppModule(app.AccountKeeper, app.BankKeeper), - bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper), - capability.NewAppModule(appCodec, *app.CapabilityKeeper), - crisis.NewAppModule(&app.CrisisKeeper, skipGenesisInvariants), - slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.ConsumerKeeper), - upgrade.NewAppModule(app.UpgradeKeeper), + bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper, app.GetSubspace(banktypes.ModuleName)), + capability.NewAppModule(appCodec, *app.CapabilityKeeper, false), + crisis.NewAppModule(&app.CrisisKeeper, skipGenesisInvariants, app.GetSubspace(crisistypes.ModuleName)), + slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.ConsumerKeeper, app.GetSubspace(slashingtypes.ModuleName)), + upgrade.NewAppModule(&app.UpgradeKeeper), evidence.NewAppModule(app.EvidenceKeeper), feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry), authzmodule.NewAppModule(appCodec, app.AuthzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), @@ -411,6 +451,7 @@ func New( authtypes.ModuleName, banktypes.ModuleName, slashingtypes.ModuleName, + genutiltypes.ModuleName, evidencetypes.ModuleName, authz.ModuleName, feegrant.ModuleName, @@ -428,6 +469,7 @@ func New( authtypes.ModuleName, banktypes.ModuleName, slashingtypes.ModuleName, + genutiltypes.ModuleName, evidencetypes.ModuleName, paramstypes.ModuleName, upgradetypes.ModuleName, @@ -453,7 +495,7 @@ func New( ibctransfertypes.ModuleName, feegrant.ModuleName, authz.ModuleName, - + genutiltypes.ModuleName, paramstypes.ModuleName, upgradetypes.ModuleName, vestingtypes.ModuleName, @@ -461,8 +503,6 @@ func New( ) app.MM.RegisterInvariants(&app.CrisisKeeper) - app.MM.RegisterRoutes(app.Router(), app.QueryRouter(), encodingConfig.Amino) - app.configurator = module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter()) app.MM.RegisterServices(app.configurator) @@ -471,9 +511,9 @@ func New( // NOTE: this is not required apps that don't use the simulator for fuzz testing // transactions app.sm = module.NewSimulationManager( - auth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts), - bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper), - capability.NewAppModule(appCodec, *app.CapabilityKeeper), + auth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts, app.GetSubspace(authtypes.ModuleName)), + bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper, app.GetSubspace(banktypes.ModuleName)), + capability.NewAppModule(appCodec, *app.CapabilityKeeper, false), feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry), authzmodule.NewAppModule(appCodec, app.AuthzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), params.NewAppModule(app.ParamsKeeper), @@ -519,8 +559,11 @@ func New( fromVM := make(map[string]uint64) - for moduleName, eachModule := range app.MM.Modules { - fromVM[moduleName] = eachModule.ConsensusVersion() + for moduleName := range app.MM.Modules { + m := app.MM.Modules[moduleName] + if module, ok := m.(module.HasConsensusVersion); ok { + fromVM[moduleName] = module.ConsensusVersion() + } } ctx.Logger().Info("start to run module migrations...") @@ -535,7 +578,7 @@ func New( } if upgradeInfo.Name == upgradeName && !app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) { - storeUpgrades := store.StoreUpgrades{} + storeUpgrades := storetypes.StoreUpgrades{} // configure store loader that checks if version == upgradeHeight and applies store upgrades app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades)) @@ -551,6 +594,14 @@ func New( app.ScopedTransferKeeper = scopedTransferKeeper app.ScopedIBCConsumerKeeper = scopedIBCConsumerKeeper + autocliv1.RegisterQueryServer(app.GRPCQueryRouter(), runtimeservices.NewAutoCLIQueryService(app.MM.Modules)) + + reflectionSvc, err := runtimeservices.NewReflectionService() + if err != nil { + panic(err) + } + reflectionv1.RegisterReflectionServiceServer(app.GRPCQueryRouter(), reflectionSvc) + return app } @@ -617,21 +668,21 @@ func (app *App) InterfaceRegistry() types.InterfaceRegistry { // GetKey returns the KVStoreKey for the provided store key. // // NOTE: This is solely to be used for testing purposes. -func (app *App) GetKey(storeKey string) *sdk.KVStoreKey { +func (app *App) GetKey(storeKey string) *storetypes.KVStoreKey { return app.keys[storeKey] } // GetTKey returns the TransientStoreKey for the provided store key. // // NOTE: This is solely to be used for testing purposes. -func (app *App) GetTKey(storeKey string) *sdk.TransientStoreKey { +func (app *App) GetTKey(storeKey string) *storetypes.TransientStoreKey { return app.tkeys[storeKey] } // GetMemKey returns the MemStoreKey for the provided mem key. // // NOTE: This is solely used for testing purposes. -func (app *App) GetMemKey(storeKey string) *sdk.MemoryStoreKey { +func (app *App) GetMemKey(storeKey string) *storetypes.MemoryStoreKey { return app.memKeys[storeKey] } @@ -699,29 +750,26 @@ func (app *App) GetScopedIBCKeeper() capabilitykeeper.ScopedKeeper { // GetTxConfig implements the TestingApp interface. func (app *App) GetTxConfig() client.TxConfig { - return MakeTestEncodingConfig().TxConfig + return app.txConfig +} + +// TxConfig returns SimApp's TxConfig +func (app *App) TxConfig() client.TxConfig { + return app.txConfig } // RegisterAPIRoutes registers all application module routes with the provided // API server. func (app *App) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIConfig) { clientCtx := apiSvr.ClientCtx - rpc.RegisterRoutes(clientCtx, apiSvr.Router) - // Register legacy tx routes. - authrest.RegisterTxRoutes(clientCtx, apiSvr.Router) + // Register new tx routes from grpc-gateway. authtx.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) // Register new tendermint queries routes from grpc-gateway. tmservice.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) - // Register legacy and grpc-gateway routes for all modules. - ModuleBasics.RegisterRESTRoutes(clientCtx, apiSvr.Router) + // Register grpc query routes. ModuleBasics.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) - - // register swagger API from root so that other applications can override easily - if apiConfig.Swagger { - RegisterSwaggerAPI(apiSvr.Router) - } } // RegisterTxService implements the Application.RegisterTxService method. @@ -729,20 +777,13 @@ func (app *App) RegisterTxService(clientCtx client.Context) { authtx.RegisterTxService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.BaseApp.Simulate, app.interfaceRegistry) } -// RegisterTendermintService implements the Application.RegisterTendermintService method. -func (app *App) RegisterTendermintService(clientCtx client.Context) { - tmservice.RegisterTendermintService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.interfaceRegistry) +func (app *App) RegisterNodeService(clientCtx client.Context) { + nodeservice.RegisterNodeService(clientCtx, app.GRPCQueryRouter()) } -// RegisterSwaggerAPI registers swagger route with API Server -func RegisterSwaggerAPI(rtr *mux.Router) { - statikFS, err := fs.New() - if err != nil { - panic(err) - } - - staticServer := http.FileServer(statikFS) - rtr.PathPrefix("/swagger/").Handler(http.StripPrefix("/swagger/", staticServer)) +// RegisterTendermintService implements the Application.RegisterTendermintService method. +func (app *App) RegisterTendermintService(clientCtx client.Context) { + tmservice.RegisterTendermintService(clientCtx, app.BaseApp.GRPCQueryRouter(), app.interfaceRegistry, app.Query) } // GetMaccPerms returns a copy of the module account permissions @@ -755,7 +796,7 @@ func GetMaccPerms() map[string][]string { } // initParamsKeeper init params keeper and its subspaces -func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey sdk.StoreKey) paramskeeper.Keeper { +func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey storetypes.StoreKey) paramskeeper.Keeper { paramsKeeper := paramskeeper.NewKeeper(appCodec, legacyAmino, key, tkey) paramsKeeper.Subspace(authtypes.ModuleName) @@ -773,6 +814,24 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino // should be used only in tests or when creating a new app instance (NewApp*()). // App user shouldn't create new codecs - use the app.AppCodec instead. // [DEPRECATED] +// func MakeTestEncodingConfig() appparams.EncodingConfig { +// encodingConfig := appparams.MakeTestEncodingConfig() +// std.RegisterLegacyAminoCodec(encodingConfig.Amino) +// std.RegisterInterfaces(encodingConfig.InterfaceRegistry) +// ModuleBasics.RegisterLegacyAminoCodec(encodingConfig.Amino) +// ModuleBasics.RegisterInterfaces(encodingConfig.InterfaceRegistry) +// return encodingConfig +// } + +// func makeEncodingConfig() simappparams.EncodingConfig { +// encodingConfig := simappparams.MakeTestEncodingConfig() +// std.RegisterLegacyAminoCodec(encodingConfig.Amino) +// std.RegisterInterfaces(encodingConfig.InterfaceRegistry) +// ModuleBasics.RegisterLegacyAminoCodec(encodingConfig.Amino) +// ModuleBasics.RegisterInterfaces(encodingConfig.InterfaceRegistry) +// return encodingConfig +// } + func MakeTestEncodingConfig() appparams.EncodingConfig { encodingConfig := appparams.MakeTestEncodingConfig() std.RegisterLegacyAminoCodec(encodingConfig.Amino) @@ -781,3 +840,12 @@ func MakeTestEncodingConfig() appparams.EncodingConfig { ModuleBasics.RegisterInterfaces(encodingConfig.InterfaceRegistry) return encodingConfig } + +func makeEncodingConfig() appparams.EncodingConfig { + encodingConfig := appparams.MakeTestEncodingConfig() + std.RegisterLegacyAminoCodec(encodingConfig.Amino) + std.RegisterInterfaces(encodingConfig.InterfaceRegistry) + ModuleBasics.RegisterLegacyAminoCodec(encodingConfig.Amino) + ModuleBasics.RegisterInterfaces(encodingConfig.InterfaceRegistry) + return encodingConfig +} diff --git a/app/consumer/export.go b/app/consumer/export.go index e0397dc61e..168e5385a1 100644 --- a/app/consumer/export.go +++ b/app/consumer/export.go @@ -4,18 +4,18 @@ import ( "encoding/json" "fmt" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + tmtypes "github.com/cometbft/cometbft/types" servertypes "github.com/cosmos/cosmos-sdk/server/types" sdk "github.com/cosmos/cosmos-sdk/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" - tmtypes "github.com/tendermint/tendermint/types" ) // ExportAppStateAndValidators implements the simapp app interface // by exporting the state of the application func (app *App) ExportAppStateAndValidators( - forZeroHeight bool, jailAllowedAddrs []string, + forZeroHeight bool, jailAllowedAddrs, modulesToExport []string, ) (servertypes.ExportedApp, error) { // as if they could withdraw from the start of the next block ctx := app.NewContext(true, tmproto.Header{Height: app.LastBlockHeight()}) diff --git a/app/params/encoding.go b/app/params/encoding.go index 3d634abf16..8ff9ea04b3 100644 --- a/app/params/encoding.go +++ b/app/params/encoding.go @@ -10,7 +10,7 @@ import ( // This is provided for compatibility between protobuf and amino implementations. type EncodingConfig struct { InterfaceRegistry types.InterfaceRegistry - Marshaler codec.Codec + Codec codec.Codec TxConfig client.TxConfig Amino *codec.LegacyAmino } diff --git a/app/params/proto.go b/app/params/proto.go index 5c5f3c3d4c..d11fe8d06c 100644 --- a/app/params/proto.go +++ b/app/params/proto.go @@ -15,7 +15,7 @@ func MakeTestEncodingConfig() EncodingConfig { return EncodingConfig{ InterfaceRegistry: interfaceRegistry, - Marshaler: chainCodec, + Codec: chainCodec, TxConfig: txCfg, Amino: amino, } diff --git a/app/provider/ante_handler.go b/app/provider/ante_handler.go index 3b1a3b7d38..0a71573b07 100644 --- a/app/provider/ante_handler.go +++ b/app/provider/ante_handler.go @@ -5,8 +5,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/x/auth/ante" - ibcante "github.com/cosmos/ibc-go/v4/modules/core/ante" - ibckeeper "github.com/cosmos/ibc-go/v4/modules/core/keeper" + ibcante "github.com/cosmos/ibc-go/v7/modules/core/ante" + ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" ) // HandlerOptions extend the SDK's AnteHandler options by requiring the IBC @@ -35,20 +35,19 @@ func NewAnteHandler(options HandlerOptions) (sdk.AnteHandler, error) { anteDecorators := []sdk.AnteDecorator{ ante.NewSetUpContextDecorator(), - ante.NewRejectExtensionOptionsDecorator(), - ante.NewMempoolFeeDecorator(), + ante.NewExtensionOptionsDecorator(nil), ante.NewValidateBasicDecorator(), ante.NewTxTimeoutHeightDecorator(), ante.NewValidateMemoDecorator(options.AccountKeeper), ante.NewConsumeGasForTxSizeDecorator(options.AccountKeeper), - ante.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper), + ante.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper, options.TxFeeChecker), // SetPubKeyDecorator must be called before all signature verification decorators ante.NewSetPubKeyDecorator(options.AccountKeeper), ante.NewValidateSigCountDecorator(options.AccountKeeper), ante.NewSigGasConsumeDecorator(options.AccountKeeper, sigGasConsumer), ante.NewSigVerificationDecorator(options.AccountKeeper, options.SignModeHandler), ante.NewIncrementSequenceDecorator(options.AccountKeeper), - ibcante.NewAnteDecorator(options.IBCKeeper), + ibcante.NewRedundantRelayDecorator(options.IBCKeeper), } return sdk.ChainAnteDecorators(anteDecorators...), nil diff --git a/app/provider/app.go b/app/provider/app.go index 94719cf2c6..1c73131b63 100644 --- a/app/provider/app.go +++ b/app/provider/app.go @@ -4,30 +4,35 @@ import ( "fmt" "io" stdlog "log" - "net/http" "os" "path/filepath" + "github.com/cosmos/cosmos-sdk/client/flags" + nodeservice "github.com/cosmos/cosmos-sdk/client/grpc/node" + "github.com/cosmos/cosmos-sdk/runtime" + "github.com/cosmos/cosmos-sdk/server" + + autocliv1 "cosmossdk.io/api/cosmos/autocli/v1" + reflectionv1 "cosmossdk.io/api/cosmos/reflection/v1" appparams "github.com/cosmos/interchain-security/v2/app/params" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" - "github.com/cosmos/cosmos-sdk/client/rpc" "github.com/cosmos/cosmos-sdk/codec" + runtimeservices "github.com/cosmos/cosmos-sdk/runtime/services" + "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/server/api" "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" - "github.com/cosmos/cosmos-sdk/simapp" "github.com/cosmos/cosmos-sdk/std" - store "github.com/cosmos/cosmos-sdk/store/types" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/version" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/auth/ante" - authrest "github.com/cosmos/cosmos-sdk/x/auth/client/rest" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" authsims "github.com/cosmos/cosmos-sdk/x/auth/simulation" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" @@ -40,11 +45,11 @@ import ( "github.com/cosmos/cosmos-sdk/x/capability" capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" + consensusparamkeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" "github.com/cosmos/cosmos-sdk/x/crisis" crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper" crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types" distr "github.com/cosmos/cosmos-sdk/x/distribution" - distrclient "github.com/cosmos/cosmos-sdk/x/distribution/client" distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" "github.com/cosmos/cosmos-sdk/x/evidence" @@ -53,8 +58,10 @@ import ( "github.com/cosmos/cosmos-sdk/x/genutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" "github.com/cosmos/cosmos-sdk/x/gov" + govclient "github.com/cosmos/cosmos-sdk/x/gov/client" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" "github.com/cosmos/cosmos-sdk/x/mint" mintkeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" @@ -73,28 +80,28 @@ import ( upgradeclient "github.com/cosmos/cosmos-sdk/x/upgrade/client" upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - "github.com/cosmos/ibc-go/v4/modules/apps/transfer" - ibctransferkeeper "github.com/cosmos/ibc-go/v4/modules/apps/transfer/keeper" - ibctransfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" - ibc "github.com/cosmos/ibc-go/v4/modules/core" - ibcclient "github.com/cosmos/ibc-go/v4/modules/core/02-client" - ibcclientclient "github.com/cosmos/ibc-go/v4/modules/core/02-client/client" - ibcclienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - ibcconnectiontypes "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types" - porttypes "github.com/cosmos/ibc-go/v4/modules/core/05-port/types" - ibchost "github.com/cosmos/ibc-go/v4/modules/core/24-host" - ibckeeper "github.com/cosmos/ibc-go/v4/modules/core/keeper" + "github.com/cosmos/ibc-go/v7/modules/apps/transfer" + ibctransferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper" + ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + ibc "github.com/cosmos/ibc-go/v7/modules/core" + ibcclient "github.com/cosmos/ibc-go/v7/modules/core/02-client" + ibcclientclient "github.com/cosmos/ibc-go/v7/modules/core/02-client/client" + ibcclienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + ibcconnectiontypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" + ibchost "github.com/cosmos/ibc-go/v7/modules/core/exported" + ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" + tendermint "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + ibctestingcore "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/core" ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" - "github.com/gorilla/mux" - "github.com/rakyll/statik/fs" + dbm "github.com/cometbft/cometbft-db" + abci "github.com/cometbft/cometbft/abci/types" + tmjson "github.com/cometbft/cometbft/libs/json" + "github.com/cometbft/cometbft/libs/log" + tmos "github.com/cometbft/cometbft/libs/os" "github.com/spf13/cast" - abci "github.com/tendermint/tendermint/abci/types" - tmjson "github.com/tendermint/tendermint/libs/json" - "github.com/tendermint/tendermint/libs/log" - tmos "github.com/tendermint/tendermint/libs/os" - dbm "github.com/tendermint/tm-db" ibcprovider "github.com/cosmos/interchain-security/v2/x/ccv/provider" ibcproviderclient "github.com/cosmos/interchain-security/v2/x/ccv/provider/client" @@ -124,22 +131,23 @@ var ( // and genesis verification. ModuleBasics = module.NewBasicManager( auth.AppModuleBasic{}, - genutil.AppModuleBasic{}, + genutil.NewAppModuleBasic(genutiltypes.DefaultMessageValidator), bank.AppModuleBasic{}, capability.AppModuleBasic{}, staking.AppModuleBasic{}, mint.AppModuleBasic{}, distr.AppModuleBasic{}, gov.NewAppModuleBasic( - paramsclient.ProposalHandler, - distrclient.ProposalHandler, - upgradeclient.ProposalHandler, - upgradeclient.CancelProposalHandler, - ibcclientclient.UpdateClientProposalHandler, - ibcclientclient.UpgradeProposalHandler, - ibcproviderclient.ConsumerAdditionProposalHandler, - ibcproviderclient.ConsumerRemovalProposalHandler, - ibcproviderclient.EquivocationProposalHandler, + []govclient.ProposalHandler{ + paramsclient.ProposalHandler, + upgradeclient.LegacyProposalHandler, + upgradeclient.LegacyCancelProposalHandler, + ibcclientclient.UpdateClientProposalHandler, + ibcclientclient.UpgradeProposalHandler, + ibcproviderclient.ConsumerAdditionProposalHandler, + ibcproviderclient.ConsumerRemovalProposalHandler, + ibcproviderclient.EquivocationProposalHandler, + }, ), params.AppModuleBasic{}, crisis.AppModuleBasic{}, @@ -149,6 +157,7 @@ var ( evidence.AppModuleBasic{}, transfer.AppModuleBasic{}, vesting.AppModuleBasic{}, + tendermint.AppModuleBasic{}, // router.AppModuleBasic{}, ibcprovider.AppModuleBasic{}, ) @@ -167,7 +176,7 @@ var ( ) var ( - _ simapp.App = (*App)(nil) + _ runtime.AppI = (*App)(nil) _ servertypes.Application = (*App)(nil) _ ibctesting.TestingApp = (*App)(nil) ) @@ -180,19 +189,18 @@ type App struct { // nolint: golint legacyAmino *codec.LegacyAmino appCodec codec.Codec interfaceRegistry types.InterfaceRegistry - - invCheckPeriod uint + txConfig client.TxConfig // keys to access the substores - keys map[string]*sdk.KVStoreKey - tkeys map[string]*sdk.TransientStoreKey - memKeys map[string]*sdk.MemoryStoreKey + keys map[string]*storetypes.KVStoreKey + tkeys map[string]*storetypes.TransientStoreKey + memKeys map[string]*storetypes.MemoryStoreKey // keepers AccountKeeper authkeeper.AccountKeeper BankKeeper bankkeeper.Keeper CapabilityKeeper *capabilitykeeper.Keeper - StakingKeeper stakingkeeper.Keeper + StakingKeeper *stakingkeeper.Keeper SlashingKeeper slashingkeeper.Keeper MintKeeper mintkeeper.Keeper @@ -201,14 +209,15 @@ type App struct { // nolint: golint // different fee-pool from the consumer chain ConsumerKeeper DistrKeeper distrkeeper.Keeper - GovKeeper govkeeper.Keeper - CrisisKeeper crisiskeeper.Keeper - UpgradeKeeper upgradekeeper.Keeper - ParamsKeeper paramskeeper.Keeper - IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly - EvidenceKeeper evidencekeeper.Keeper - TransferKeeper ibctransferkeeper.Keeper - ProviderKeeper ibcproviderkeeper.Keeper + GovKeeper govkeeper.Keeper + CrisisKeeper crisiskeeper.Keeper + UpgradeKeeper upgradekeeper.Keeper + ParamsKeeper paramskeeper.Keeper + IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly + EvidenceKeeper evidencekeeper.Keeper + TransferKeeper ibctransferkeeper.Keeper + ProviderKeeper ibcproviderkeeper.Keeper + ConsensusParamsKeeper consensusparamkeeper.Keeper // make scoped keepers public for test purposes ScopedIBCKeeper capabilitykeeper.ScopedKeeper @@ -238,14 +247,12 @@ func New( db dbm.DB, traceStore io.Writer, loadLatest bool, - skipUpgradeHeights map[int64]bool, - homePath string, - invCheckPeriod uint, - encodingConfig appparams.EncodingConfig, appOpts servertypes.AppOptions, baseAppOptions ...func(*baseapp.BaseApp), ) *App { - appCodec := encodingConfig.Marshaler + encodingConfig := makeEncodingConfig() + + appCodec := encodingConfig.Codec legacyAmino := encodingConfig.Amino interfaceRegistry := encodingConfig.InterfaceRegistry @@ -255,7 +262,7 @@ func New( bApp.SetInterfaceRegistry(interfaceRegistry) keys := sdk.NewKVStoreKeys( - authtypes.StoreKey, banktypes.StoreKey, stakingtypes.StoreKey, + authtypes.StoreKey, banktypes.StoreKey, stakingtypes.StoreKey, crisistypes.StoreKey, minttypes.StoreKey, distrtypes.StoreKey, slashingtypes.StoreKey, govtypes.StoreKey, paramstypes.StoreKey, ibchost.StoreKey, upgradetypes.StoreKey, evidencetypes.StoreKey, ibctransfertypes.StoreKey, @@ -270,10 +277,10 @@ func New( legacyAmino: legacyAmino, appCodec: appCodec, interfaceRegistry: interfaceRegistry, - invCheckPeriod: invCheckPeriod, keys: keys, tkeys: tkeys, memKeys: memKeys, + txConfig: encodingConfig.TxConfig, } app.ParamsKeeper = initParamsKeeper( @@ -284,10 +291,9 @@ func New( ) // set the BaseApp's parameter store - bApp.SetParamStore( - app.ParamsKeeper.Subspace(baseapp.Paramspace).WithKeyTable( - paramskeeper.ConsensusParamsKeyTable()), - ) + // upgradetypes.StoreKey -> maybe consensusparamtypes.StoreKey (package consensusparamtypes ("github.com/cosmos/cosmos-sdk/x/consensus/types") + app.ConsensusParamsKeeper = consensusparamkeeper.NewKeeper(appCodec, keys[upgradetypes.StoreKey], authtypes.NewModuleAddress(govtypes.ModuleName).String()) + bApp.SetParamStore(&app.ConsensusParamsKeeper) // add capability keeper and ScopeToModule for ibc module app.CapabilityKeeper = capabilitykeeper.NewKeeper( @@ -304,9 +310,10 @@ func New( app.AccountKeeper = authkeeper.NewAccountKeeper( appCodec, keys[authtypes.StoreKey], - app.GetSubspace(authtypes.ModuleName), authtypes.ProtoBaseAccount, maccPerms, + AccountAddressPrefix, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) // Remove the ConsumerRewardsPool from the group of blocked recipient addresses in bank @@ -320,59 +327,72 @@ func New( appCodec, keys[banktypes.StoreKey], app.AccountKeeper, - app.GetSubspace(banktypes.ModuleName), bankBlockedAddrs, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) - stakingKeeper := stakingkeeper.NewKeeper( + app.StakingKeeper = stakingkeeper.NewKeeper( appCodec, keys[stakingtypes.StoreKey], app.AccountKeeper, app.BankKeeper, - app.GetSubspace(stakingtypes.ModuleName), + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) app.MintKeeper = mintkeeper.NewKeeper( appCodec, keys[minttypes.StoreKey], - app.GetSubspace(minttypes.ModuleName), - &stakingKeeper, + app.StakingKeeper, app.AccountKeeper, app.BankKeeper, authtypes.FeeCollectorName, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) app.DistrKeeper = distrkeeper.NewKeeper( appCodec, keys[distrtypes.StoreKey], - app.GetSubspace(distrtypes.ModuleName), app.AccountKeeper, app.BankKeeper, - &stakingKeeper, + app.StakingKeeper, authtypes.FeeCollectorName, - app.ModuleAccountAddrs(), + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) app.SlashingKeeper = slashingkeeper.NewKeeper( appCodec, + legacyAmino, keys[slashingtypes.StoreKey], - &stakingKeeper, - app.GetSubspace(slashingtypes.ModuleName), + app.StakingKeeper, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) - app.CrisisKeeper = crisiskeeper.NewKeeper( - app.GetSubspace(crisistypes.ModuleName), + + invCheckPeriod := cast.ToUint(appOpts.Get(server.FlagInvCheckPeriod)) + app.CrisisKeeper = *crisiskeeper.NewKeeper( + appCodec, + keys[crisistypes.StoreKey], invCheckPeriod, app.BankKeeper, authtypes.FeeCollectorName, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) - app.UpgradeKeeper = upgradekeeper.NewKeeper( + + // get skipUpgradeHeights from the app options + skipUpgradeHeights := map[int64]bool{} + for _, h := range cast.ToIntSlice(appOpts.Get(server.FlagUnsafeSkipUpgrades)) { + skipUpgradeHeights[int64(h)] = true + } + homePath := cast.ToString(appOpts.Get(flags.FlagHome)) + // set the governance module account as the authority for conducting upgrades + app.UpgradeKeeper = *upgradekeeper.NewKeeper( skipUpgradeHeights, keys[upgradetypes.StoreKey], appCodec, homePath, app.BaseApp, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) // register the staking hooks // NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks - app.StakingKeeper = *stakingKeeper.SetHooks( + app.StakingKeeper.SetHooks( stakingtypes.NewMultiStakingHooks( app.DistrKeeper.Hooks(), app.SlashingKeeper.Hooks(), @@ -418,26 +438,30 @@ func New( providerModule := ibcprovider.NewAppModule(&app.ProviderKeeper, app.GetSubspace(providertypes.ModuleName)) // register the proposal types - govRouter := govtypes.NewRouter() + govRouter := govv1beta1.NewRouter() govRouter. - AddRoute(govtypes.RouterKey, govtypes.ProposalHandler). + AddRoute(govtypes.RouterKey, govv1beta1.ProposalHandler). AddRoute(paramproposal.RouterKey, params.NewParamChangeProposalHandler(app.ParamsKeeper)). - AddRoute(distrtypes.RouterKey, distr.NewCommunityPoolSpendProposalHandler(app.DistrKeeper)). - AddRoute(upgradetypes.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(app.UpgradeKeeper)). + AddRoute(upgradetypes.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(&app.UpgradeKeeper)). AddRoute(ibchost.RouterKey, ibcclient.NewClientProposalHandler(app.IBCKeeper.ClientKeeper)). AddRoute(providertypes.RouterKey, ibcprovider.NewProviderProposalHandler(app.ProviderKeeper)). AddRoute(ibcclienttypes.RouterKey, ibcclient.NewClientProposalHandler(app.IBCKeeper.ClientKeeper)) + govConfig := govtypes.DefaultConfig() - app.GovKeeper = govkeeper.NewKeeper( + app.GovKeeper = *govkeeper.NewKeeper( appCodec, keys[govtypes.StoreKey], - app.GetSubspace(govtypes.ModuleName), app.AccountKeeper, app.BankKeeper, - &stakingKeeper, - govRouter, + app.StakingKeeper, + app.MsgServiceRouter(), + govConfig, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) + // Set legacy router for backwards compatibility with gov v1beta1 + app.GovKeeper.SetLegacyRouter(govRouter) + app.TransferKeeper = ibctransferkeeper.NewKeeper( appCodec, keys[ibctransfertypes.StoreKey], @@ -469,17 +493,17 @@ func New( app.BaseApp.DeliverTx, encodingConfig.TxConfig, ), - auth.NewAppModule(appCodec, app.AccountKeeper, nil), + auth.NewAppModule(appCodec, app.AccountKeeper, nil, app.GetSubspace(authtypes.ModuleName)), vesting.NewAppModule(app.AccountKeeper, app.BankKeeper), - bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper), - capability.NewAppModule(appCodec, *app.CapabilityKeeper), - crisis.NewAppModule(&app.CrisisKeeper, skipGenesisInvariants), - gov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper), - mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper), - slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), - distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), - staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper), - upgrade.NewAppModule(app.UpgradeKeeper), + bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper, app.GetSubspace(banktypes.ModuleName)), + capability.NewAppModule(appCodec, *app.CapabilityKeeper, false), + crisis.NewAppModule(&app.CrisisKeeper, skipGenesisInvariants, app.GetSubspace(crisistypes.ModuleName)), + gov.NewAppModule(appCodec, &app.GovKeeper, app.AccountKeeper, app.BankKeeper, app.GetSubspace(govtypes.ModuleName)), + mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper, nil, app.GetSubspace(minttypes.ModuleName)), + slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper, app.GetSubspace(slashingtypes.ModuleName)), + distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper, app.GetSubspace(distrtypes.ModuleName)), + staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper, app.GetSubspace(stakingtypes.ModuleName)), + upgrade.NewAppModule(&app.UpgradeKeeper), evidence.NewAppModule(app.EvidenceKeeper), ibc.NewAppModule(app.IBCKeeper), params.NewAppModule(app.ParamsKeeper), @@ -565,8 +589,6 @@ func New( ) app.MM.RegisterInvariants(&app.CrisisKeeper) - app.MM.RegisterRoutes(app.Router(), app.QueryRouter(), encodingConfig.Amino) - app.configurator = module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter()) app.MM.RegisterServices(app.configurator) @@ -575,14 +597,14 @@ func New( // NOTE: this is not required apps that don't use the simulator for fuzz testing // transactions app.sm = module.NewSimulationManager( - auth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts), - bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper), - capability.NewAppModule(appCodec, *app.CapabilityKeeper), - gov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper), - mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper), - staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper), - distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), - slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), + auth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts, app.GetSubspace(authtypes.ModuleName)), + bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper, app.GetSubspace(banktypes.ModuleName)), + capability.NewAppModule(appCodec, *app.CapabilityKeeper, false), + gov.NewAppModule(appCodec, &app.GovKeeper, app.AccountKeeper, app.BankKeeper, app.GetSubspace(govtypes.ModuleName)), + mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper, nil, app.GetSubspace(minttypes.ModuleName)), + staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper, app.GetSubspace(stakingtypes.ModuleName)), + distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper, app.GetSubspace(distrtypes.ModuleName)), + slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper, app.GetSubspace(slashingtypes.ModuleName)), params.NewAppModule(app.ParamsKeeper), evidence.NewAppModule(app.EvidenceKeeper), ibc.NewAppModule(app.IBCKeeper), @@ -625,8 +647,11 @@ func New( fromVM := make(map[string]uint64) - for moduleName, eachModule := range app.MM.Modules { - fromVM[moduleName] = eachModule.ConsensusVersion() + for moduleName := range app.MM.Modules { + m := app.MM.Modules[moduleName] + if module, ok := m.(module.HasConsensusVersion); ok { + fromVM[moduleName] = module.ConsensusVersion() + } } ctx.Logger().Info("start to run module migrations...") @@ -641,7 +666,7 @@ func New( } if upgradeInfo.Name == upgradeName && !app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) { - storeUpgrades := store.StoreUpgrades{} + storeUpgrades := storetypes.StoreUpgrades{} // configure store loader that checks if version == upgradeHeight and applies store upgrades app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades)) @@ -657,6 +682,14 @@ func New( app.ScopedTransferKeeper = scopedTransferKeeper app.ScopedIBCProviderKeeper = scopedIBCProviderKeeper + autocliv1.RegisterQueryServer(app.GRPCQueryRouter(), runtimeservices.NewAutoCLIQueryService(app.MM.Modules)) + + reflectionSvc, err := runtimeservices.NewReflectionService() + if err != nil { + panic(err) + } + reflectionv1.RegisterReflectionServiceServer(app.GRPCQueryRouter(), reflectionSvc) + return app } @@ -724,21 +757,21 @@ func (app *App) InterfaceRegistry() types.InterfaceRegistry { // GetKey returns the KVStoreKey for the provided store key. // // NOTE: This is solely to be used for testing purposes. -func (app *App) GetKey(storeKey string) *sdk.KVStoreKey { +func (app *App) GetKey(storeKey string) *storetypes.KVStoreKey { return app.keys[storeKey] } // GetTKey returns the TransientStoreKey for the provided store key. // // NOTE: This is solely to be used for testing purposes. -func (app *App) GetTKey(storeKey string) *sdk.TransientStoreKey { +func (app *App) GetTKey(storeKey string) *storetypes.TransientStoreKey { return app.tkeys[storeKey] } // GetMemKey returns the MemStoreKey for the provided mem key. // // NOTE: This is solely used for testing purposes. -func (app *App) GetMemKey(storeKey string) *sdk.MemoryStoreKey { +func (app *App) GetMemKey(storeKey string) *storetypes.MemoryStoreKey { return app.memKeys[storeKey] } @@ -811,28 +844,32 @@ func (app *App) GetScopedIBCKeeper() capabilitykeeper.ScopedKeeper { // GetTxConfig implements the TestingApp interface. func (app *App) GetTxConfig() client.TxConfig { - return MakeTestEncodingConfig().TxConfig + return app.txConfig +} + +// TxConfig returns SimApp's TxConfig +func (app *App) TxConfig() client.TxConfig { + return app.txConfig } // RegisterAPIRoutes registers all application module routes with the provided // API server. func (app *App) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIConfig) { clientCtx := apiSvr.ClientCtx - rpc.RegisterRoutes(clientCtx, apiSvr.Router) - // Register legacy tx routes. - authrest.RegisterTxRoutes(clientCtx, apiSvr.Router) // Register new tx routes from grpc-gateway. authtx.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) // Register new tendermint queries routes from grpc-gateway. tmservice.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) + // Register node gRPC service for grpc-gateway. + nodeservice.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) + // Register legacy and grpc-gateway routes for all modules. - ModuleBasics.RegisterRESTRoutes(clientCtx, apiSvr.Router) ModuleBasics.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) // register swagger API from root so that other applications can override easily - if apiConfig.Swagger { - RegisterSwaggerAPI(apiSvr.Router) + if err := server.RegisterSwaggerAPI(apiSvr.ClientCtx, apiSvr.Router, apiConfig.Swagger); err != nil { + panic(err) } } @@ -841,20 +878,13 @@ func (app *App) RegisterTxService(clientCtx client.Context) { authtx.RegisterTxService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.BaseApp.Simulate, app.interfaceRegistry) } -// RegisterTendermintService implements the Application.RegisterTendermintService method. -func (app *App) RegisterTendermintService(clientCtx client.Context) { - tmservice.RegisterTendermintService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.interfaceRegistry) +func (app *App) RegisterNodeService(clientCtx client.Context) { + nodeservice.RegisterNodeService(clientCtx, app.GRPCQueryRouter()) } -// RegisterSwaggerAPI registers swagger route with API Server -func RegisterSwaggerAPI(rtr *mux.Router) { - statikFS, err := fs.New() - if err != nil { - panic(err) - } - - staticServer := http.FileServer(statikFS) - rtr.PathPrefix("/swagger/").Handler(http.StripPrefix("/swagger/", staticServer)) +// RegisterTendermintService implements the Application.RegisterTendermintService method. +func (app *App) RegisterTendermintService(clientCtx client.Context) { + tmservice.RegisterTendermintService(clientCtx, app.BaseApp.GRPCQueryRouter(), app.interfaceRegistry, app.Query) } // GetMaccPerms returns a copy of the module account permissions @@ -867,7 +897,7 @@ func GetMaccPerms() map[string][]string { } // initParamsKeeper init params keeper and its subspaces -func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey sdk.StoreKey) paramskeeper.Keeper { +func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey storetypes.StoreKey) paramskeeper.Keeper { paramsKeeper := paramskeeper.NewKeeper(appCodec, legacyAmino, key, tkey) paramsKeeper.Subspace(authtypes.ModuleName) @@ -876,7 +906,7 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino paramsKeeper.Subspace(minttypes.ModuleName) paramsKeeper.Subspace(distrtypes.ModuleName) paramsKeeper.Subspace(slashingtypes.ModuleName) - paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(govtypes.ParamKeyTable()) + paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(gov.ProvideKeyTable()) paramsKeeper.Subspace(crisistypes.ModuleName) paramsKeeper.Subspace(ibctransfertypes.ModuleName) paramsKeeper.Subspace(ibchost.ModuleName) @@ -889,6 +919,15 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino // should be used only in tests or when creating a new app instance (NewApp*()). // App user shouldn't create new codecs - use the app.AppCodec instead. // [DEPRECATED] +// func MakeTestEncodingConfig() appparams.EncodingConfig { +// encodingConfig := appparams.MakeTestEncodingConfig() +// std.RegisterLegacyAminoCodec(encodingConfig.Amino) +// std.RegisterInterfaces(encodingConfig.InterfaceRegistry) +// ModuleBasics.RegisterLegacyAminoCodec(encodingConfig.Amino) +// ModuleBasics.RegisterInterfaces(encodingConfig.InterfaceRegistry) +// return encodingConfig +// } + func MakeTestEncodingConfig() appparams.EncodingConfig { encodingConfig := appparams.MakeTestEncodingConfig() std.RegisterLegacyAminoCodec(encodingConfig.Amino) @@ -897,3 +936,12 @@ func MakeTestEncodingConfig() appparams.EncodingConfig { ModuleBasics.RegisterInterfaces(encodingConfig.InterfaceRegistry) return encodingConfig } + +func makeEncodingConfig() appparams.EncodingConfig { + encodingConfig := appparams.MakeTestEncodingConfig() + std.RegisterLegacyAminoCodec(encodingConfig.Amino) + std.RegisterInterfaces(encodingConfig.InterfaceRegistry) + ModuleBasics.RegisterLegacyAminoCodec(encodingConfig.Amino) + ModuleBasics.RegisterInterfaces(encodingConfig.InterfaceRegistry) + return encodingConfig +} diff --git a/app/provider/export.go b/app/provider/export.go index f0b3e3ed76..3865026b01 100644 --- a/app/provider/export.go +++ b/app/provider/export.go @@ -4,7 +4,7 @@ import ( "encoding/json" "log" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" servertypes "github.com/cosmos/cosmos-sdk/server/types" sdk "github.com/cosmos/cosmos-sdk/types" @@ -16,7 +16,7 @@ import ( // ExportAppStateAndValidators exports the state of the application for a genesis // file. func (app *App) ExportAppStateAndValidators( - forZeroHeight bool, jailAllowedAddrs []string, + forZeroHeight bool, jailAllowedAddrs, modulesToExport []string, ) (servertypes.ExportedApp, error) { // as if they could withdraw from the start of the next block ctx := app.NewContext(true, tmproto.Header{Height: app.LastBlockHeight()}) @@ -110,14 +110,23 @@ func (app *App) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs []str feePool.CommunityPool = feePool.CommunityPool.Add(scraps...) app.DistrKeeper.SetFeePool(ctx, feePool) - app.DistrKeeper.Hooks().AfterValidatorCreated(ctx, val.GetOperator()) + err := app.DistrKeeper.Hooks().AfterValidatorCreated(ctx, val.GetOperator()) + if err != nil { + panic(err) + } return false }) // reinitialize all delegations for _, del := range dels { - app.DistrKeeper.Hooks().BeforeDelegationCreated(ctx, del.GetDelegatorAddr(), del.GetValidatorAddr()) - app.DistrKeeper.Hooks().AfterDelegationModified(ctx, del.GetDelegatorAddr(), del.GetValidatorAddr()) + err := app.DistrKeeper.Hooks().BeforeDelegationCreated(ctx, del.GetDelegatorAddr(), del.GetValidatorAddr()) + if err != nil { + panic(err) + } + err = app.DistrKeeper.Hooks().AfterDelegationModified(ctx, del.GetDelegatorAddr(), del.GetValidatorAddr()) + if err != nil { + panic(err) + } } // reset context height diff --git a/app/sovereign/ante_handler.go b/app/sovereign/ante_handler.go index 3b1a3b7d38..0a71573b07 100644 --- a/app/sovereign/ante_handler.go +++ b/app/sovereign/ante_handler.go @@ -5,8 +5,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/x/auth/ante" - ibcante "github.com/cosmos/ibc-go/v4/modules/core/ante" - ibckeeper "github.com/cosmos/ibc-go/v4/modules/core/keeper" + ibcante "github.com/cosmos/ibc-go/v7/modules/core/ante" + ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" ) // HandlerOptions extend the SDK's AnteHandler options by requiring the IBC @@ -35,20 +35,19 @@ func NewAnteHandler(options HandlerOptions) (sdk.AnteHandler, error) { anteDecorators := []sdk.AnteDecorator{ ante.NewSetUpContextDecorator(), - ante.NewRejectExtensionOptionsDecorator(), - ante.NewMempoolFeeDecorator(), + ante.NewExtensionOptionsDecorator(nil), ante.NewValidateBasicDecorator(), ante.NewTxTimeoutHeightDecorator(), ante.NewValidateMemoDecorator(options.AccountKeeper), ante.NewConsumeGasForTxSizeDecorator(options.AccountKeeper), - ante.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper), + ante.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper, options.TxFeeChecker), // SetPubKeyDecorator must be called before all signature verification decorators ante.NewSetPubKeyDecorator(options.AccountKeeper), ante.NewValidateSigCountDecorator(options.AccountKeeper), ante.NewSigGasConsumeDecorator(options.AccountKeeper, sigGasConsumer), ante.NewSigVerificationDecorator(options.AccountKeeper, options.SignModeHandler), ante.NewIncrementSequenceDecorator(options.AccountKeeper), - ibcante.NewAnteDecorator(options.IBCKeeper), + ibcante.NewRedundantRelayDecorator(options.IBCKeeper), } return sdk.ChainAnteDecorators(anteDecorators...), nil diff --git a/app/sovereign/app.go b/app/sovereign/app.go index 43d732884b..9c729885f4 100644 --- a/app/sovereign/app.go +++ b/app/sovereign/app.go @@ -4,7 +4,6 @@ import ( "fmt" "io" stdlog "log" - "net/http" "os" "path/filepath" @@ -12,22 +11,25 @@ import ( "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + nodeservice "github.com/cosmos/cosmos-sdk/client/grpc/node" "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" - "github.com/cosmos/cosmos-sdk/client/rpc" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/runtime" + "github.com/cosmos/cosmos-sdk/server" + "github.com/cosmos/cosmos-sdk/server/api" "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" - "github.com/cosmos/cosmos-sdk/simapp" "github.com/cosmos/cosmos-sdk/std" - store "github.com/cosmos/cosmos-sdk/store/types" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/version" "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/auth/ante" - authrest "github.com/cosmos/cosmos-sdk/x/auth/client/rest" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -42,6 +44,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/capability" capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" + consensusparamkeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" "github.com/cosmos/cosmos-sdk/x/crisis" crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper" crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types" @@ -51,39 +54,39 @@ import ( "github.com/cosmos/cosmos-sdk/x/feegrant" feegrantkeeper "github.com/cosmos/cosmos-sdk/x/feegrant/keeper" feegrantmodule "github.com/cosmos/cosmos-sdk/x/feegrant/module" + govclient "github.com/cosmos/cosmos-sdk/x/gov/client" + govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" + "github.com/cosmos/cosmos-sdk/x/params" paramsclient "github.com/cosmos/cosmos-sdk/x/params/client" paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper" paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" upgradeclient "github.com/cosmos/cosmos-sdk/x/upgrade/client" + dbm "github.com/cometbft/cometbft-db" + abci "github.com/cometbft/cometbft/abci/types" + tmjson "github.com/cometbft/cometbft/libs/json" + "github.com/cometbft/cometbft/libs/log" + tmos "github.com/cometbft/cometbft/libs/os" "github.com/cosmos/cosmos-sdk/x/slashing" slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" "github.com/cosmos/cosmos-sdk/x/upgrade" upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - "github.com/cosmos/ibc-go/v4/modules/apps/transfer" - ibctransferkeeper "github.com/cosmos/ibc-go/v4/modules/apps/transfer/keeper" - ibctransfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" - ibc "github.com/cosmos/ibc-go/v4/modules/core" - ibcconnectiontypes "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types" - porttypes "github.com/cosmos/ibc-go/v4/modules/core/05-port/types" - ibchost "github.com/cosmos/ibc-go/v4/modules/core/24-host" - ibckeeper "github.com/cosmos/ibc-go/v4/modules/core/keeper" + "github.com/cosmos/ibc-go/v7/modules/apps/transfer" + ibctransferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper" + ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + ibc "github.com/cosmos/ibc-go/v7/modules/core" + ibcconnectiontypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" + ibchost "github.com/cosmos/ibc-go/v7/modules/core/exported" + ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" ibctestingcore "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/core" ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" - "github.com/gorilla/mux" - "github.com/rakyll/statik/fs" "github.com/spf13/cast" - abci "github.com/tendermint/tendermint/abci/types" - tmjson "github.com/tendermint/tendermint/libs/json" - "github.com/tendermint/tendermint/libs/log" - tmos "github.com/tendermint/tendermint/libs/os" - dbm "github.com/tendermint/tm-db" sdkdistr "github.com/cosmos/cosmos-sdk/x/distribution" - distrclient "github.com/cosmos/cosmos-sdk/x/distribution/client" distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" testutil "github.com/cosmos/interchain-security/v2/testutil/integration" @@ -129,8 +132,11 @@ var ( mint.AppModuleBasic{}, sdkdistr.AppModuleBasic{}, sdkgov.NewAppModuleBasic( - // TODO: eventually remove upgrade proposal handler and cancel proposal handler - paramsclient.ProposalHandler, distrclient.ProposalHandler, upgradeclient.ProposalHandler, upgradeclient.CancelProposalHandler, + []govclient.ProposalHandler{ + paramsclient.ProposalHandler, + upgradeclient.LegacyProposalHandler, + upgradeclient.LegacyCancelProposalHandler, + }, ), params.AppModuleBasic{}, crisis.AppModuleBasic{}, @@ -157,7 +163,7 @@ var ( ) var ( - _ simapp.App = (*App)(nil) + _ runtime.AppI = (*App)(nil) _ servertypes.Application = (*App)(nil) _ ibctesting.TestingApp = (*App)(nil) ) @@ -170,13 +176,12 @@ type App struct { // nolint: golint legacyAmino *codec.LegacyAmino appCodec codec.Codec interfaceRegistry types.InterfaceRegistry - - invCheckPeriod uint + txConfig client.TxConfig // keys to access the substores - keys map[string]*sdk.KVStoreKey - tkeys map[string]*sdk.TransientStoreKey - memKeys map[string]*sdk.MemoryStoreKey + keys map[string]*storetypes.KVStoreKey + tkeys map[string]*storetypes.TransientStoreKey + memKeys map[string]*storetypes.MemoryStoreKey // keepers AccountKeeper authkeeper.AccountKeeper @@ -188,15 +193,16 @@ type App struct { // nolint: golint DistrKeeper distrkeeper.Keeper - GovKeeper govkeeper.Keeper - CrisisKeeper crisiskeeper.Keeper - UpgradeKeeper upgradekeeper.Keeper - ParamsKeeper paramskeeper.Keeper - IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly - EvidenceKeeper evidencekeeper.Keeper - TransferKeeper ibctransferkeeper.Keeper - FeeGrantKeeper feegrantkeeper.Keeper - AuthzKeeper authzkeeper.Keeper + ConsensusParamsKeeper consensusparamkeeper.Keeper + GovKeeper govkeeper.Keeper + CrisisKeeper crisiskeeper.Keeper + UpgradeKeeper upgradekeeper.Keeper + ParamsKeeper paramskeeper.Keeper + IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly + EvidenceKeeper evidencekeeper.Keeper + TransferKeeper ibctransferkeeper.Keeper + FeeGrantKeeper feegrantkeeper.Keeper + AuthzKeeper authzkeeper.Keeper // make scoped keepers public for test purposes ScopedIBCKeeper capabilitykeeper.ScopedKeeper @@ -225,14 +231,12 @@ func New( db dbm.DB, traceStore io.Writer, loadLatest bool, - skipUpgradeHeights map[int64]bool, - homePath string, - invCheckPeriod uint, - encodingConfig appparams.EncodingConfig, appOpts servertypes.AppOptions, baseAppOptions ...func(*baseapp.BaseApp), ) *App { - appCodec := encodingConfig.Marshaler + encodingConfig := makeEncodingConfig() + + appCodec := encodingConfig.Codec legacyAmino := encodingConfig.Amino interfaceRegistry := encodingConfig.InterfaceRegistry @@ -256,7 +260,6 @@ func New( legacyAmino: legacyAmino, appCodec: appCodec, interfaceRegistry: interfaceRegistry, - invCheckPeriod: invCheckPeriod, keys: keys, tkeys: tkeys, memKeys: memKeys, @@ -270,10 +273,9 @@ func New( ) // set the BaseApp's parameter store - bApp.SetParamStore( - app.ParamsKeeper.Subspace(baseapp.Paramspace).WithKeyTable( - paramskeeper.ConsensusParamsKeyTable()), - ) + // upgradetypes.StoreKey -> maybe consensusparamtypes.StoreKey (package consensusparamtypes ("github.com/cosmos/cosmos-sdk/x/consensus/types") + app.ConsensusParamsKeeper = consensusparamkeeper.NewKeeper(appCodec, keys[upgradetypes.StoreKey], authtypes.NewModuleAddress(govtypes.ModuleName).String()) + bApp.SetParamStore(&app.ConsensusParamsKeeper) // add capability keeper and ScopeToModule for ibc module app.CapabilityKeeper = capabilitykeeper.NewKeeper( @@ -289,9 +291,10 @@ func New( app.AccountKeeper = authkeeper.NewAccountKeeper( appCodec, keys[authtypes.StoreKey], - app.GetSubspace(authtypes.ModuleName), authtypes.ProtoBaseAccount, maccPerms, + AccountAddressPrefix, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) bankBlockedAddrs := app.ModuleAccountAddrs() @@ -300,13 +303,14 @@ func New( appCodec, keys[banktypes.StoreKey], app.AccountKeeper, - app.GetSubspace(banktypes.ModuleName), bankBlockedAddrs, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) app.AuthzKeeper = authzkeeper.NewKeeper( keys[authzkeeper.StoreKey], appCodec, app.BaseApp.MsgServiceRouter(), + app.AccountKeeper, ) app.FeeGrantKeeper = feegrantkeeper.NewKeeper( appCodec, @@ -314,52 +318,70 @@ func New( app.AccountKeeper, ) - stakingKeeper := stakingkeeper.NewKeeper( + app.StakingKeeper = *stakingkeeper.NewKeeper( appCodec, keys[stakingtypes.StoreKey], app.AccountKeeper, app.BankKeeper, - app.GetSubspace(stakingtypes.ModuleName), + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) app.MintKeeper = mintkeeper.NewKeeper( - appCodec, keys[minttypes.StoreKey], app.GetSubspace(minttypes.ModuleName), &stakingKeeper, - app.AccountKeeper, app.BankKeeper, authtypes.FeeCollectorName, + appCodec, + keys[minttypes.StoreKey], + app.StakingKeeper, + app.AccountKeeper, + app.BankKeeper, + authtypes.FeeCollectorName, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) app.SlashingKeeper = slashingkeeper.NewKeeper( appCodec, + legacyAmino, keys[slashingtypes.StoreKey], - &app.StakingKeeper, - app.GetSubspace(slashingtypes.ModuleName), + app.StakingKeeper, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) + app.DistrKeeper = distrkeeper.NewKeeper( appCodec, keys[distrtypes.StoreKey], - app.GetSubspace(distrtypes.ModuleName), app.AccountKeeper, app.BankKeeper, - &stakingKeeper, + app.StakingKeeper, authtypes.FeeCollectorName, - app.ModuleAccountAddrs(), + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) - app.CrisisKeeper = crisiskeeper.NewKeeper( - app.GetSubspace(crisistypes.ModuleName), + + invCheckPeriod := cast.ToUint(appOpts.Get(server.FlagInvCheckPeriod)) + app.CrisisKeeper = *crisiskeeper.NewKeeper( + appCodec, + keys[crisistypes.StoreKey], invCheckPeriod, app.BankKeeper, authtypes.FeeCollectorName, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) - app.UpgradeKeeper = upgradekeeper.NewKeeper( + + // get skipUpgradeHeights from the app options + skipUpgradeHeights := map[int64]bool{} + for _, h := range cast.ToIntSlice(appOpts.Get(server.FlagUnsafeSkipUpgrades)) { + skipUpgradeHeights[int64(h)] = true + } + homePath := cast.ToString(appOpts.Get(flags.FlagHome)) + app.UpgradeKeeper = *upgradekeeper.NewKeeper( skipUpgradeHeights, keys[upgradetypes.StoreKey], appCodec, homePath, app.BaseApp, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) // register the staking hooks // NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks - app.StakingKeeper = *stakingKeeper.SetHooks( + app.StakingKeeper.SetHooks( stakingtypes.NewMultiStakingHooks( app.DistrKeeper.Hooks(), app.SlashingKeeper.Hooks(), @@ -367,25 +389,25 @@ func New( ) // register the proposal types - sdkgovRouter := govtypes.NewRouter() - sdkgovRouter.AddRoute(govtypes.RouterKey, govtypes.ProposalHandler). + sdkgovRouter := govv1beta1.NewRouter() + sdkgovRouter. + AddRoute(govtypes.RouterKey, govv1beta1.ProposalHandler). AddRoute(paramproposal.RouterKey, params.NewParamChangeProposalHandler(app.ParamsKeeper)). - AddRoute(upgradetypes.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(app.UpgradeKeeper)) - govKeeper := govkeeper.NewKeeper( + AddRoute(upgradetypes.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(&app.UpgradeKeeper)) + govConfig := govtypes.DefaultConfig() + + app.GovKeeper = *govkeeper.NewKeeper( appCodec, keys[govtypes.StoreKey], - app.GetSubspace(govtypes.ModuleName), app.AccountKeeper, app.BankKeeper, - &stakingKeeper, - sdkgovRouter, + app.StakingKeeper, + app.MsgServiceRouter(), + govConfig, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) - app.GovKeeper = *govKeeper.SetHooks( - govtypes.NewMultiGovHooks( - // register the governance hooks - ), - ) + app.GovKeeper.SetLegacyRouter(sdkgovRouter) app.IBCKeeper = ibckeeper.NewKeeper( appCodec, @@ -398,9 +420,10 @@ func New( app.SlashingKeeper = slashingkeeper.NewKeeper( appCodec, + legacyAmino, keys[slashingtypes.StoreKey], - &app.StakingKeeper, - app.GetSubspace(slashingtypes.ModuleName), + app.StakingKeeper, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) app.TransferKeeper = ibctransferkeeper.NewKeeper( @@ -443,18 +466,18 @@ func New( app.BaseApp.DeliverTx, encodingConfig.TxConfig, ), - auth.NewAppModule(appCodec, app.AccountKeeper, nil), + auth.NewAppModule(appCodec, app.AccountKeeper, nil, app.GetSubspace(authtypes.ModuleName)), vesting.NewAppModule(app.AccountKeeper, app.BankKeeper), - bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper), - capability.NewAppModule(appCodec, *app.CapabilityKeeper), - crisis.NewAppModule(&app.CrisisKeeper, skipGenesisInvariants), + bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper, app.GetSubspace(banktypes.ModuleName)), + capability.NewAppModule(appCodec, *app.CapabilityKeeper, false), + crisis.NewAppModule(&app.CrisisKeeper, skipGenesisInvariants, app.GetSubspace(crisistypes.ModuleName)), feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry), - sdkgov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper), - mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper), - slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), - sdkdistr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), - sdkstaking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper), - upgrade.NewAppModule(app.UpgradeKeeper), + sdkgov.NewAppModule(appCodec, &app.GovKeeper, app.AccountKeeper, app.BankKeeper, app.GetSubspace(govtypes.ModuleName)), + mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper, nil, app.GetSubspace(minttypes.ModuleName)), + slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper, app.GetSubspace(slashingtypes.ModuleName)), + sdkdistr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper, app.GetSubspace(distrtypes.ModuleName)), + sdkstaking.NewAppModule(appCodec, &app.StakingKeeper, app.AccountKeeper, app.BankKeeper, app.GetSubspace(stakingtypes.ModuleName)), + upgrade.NewAppModule(&app.UpgradeKeeper), evidence.NewAppModule(app.EvidenceKeeper), params.NewAppModule(app.ParamsKeeper), authzmodule.NewAppModule(appCodec, app.AuthzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), @@ -531,7 +554,6 @@ func New( ) app.MM.RegisterInvariants(&app.CrisisKeeper) - app.MM.RegisterRoutes(app.Router(), app.QueryRouter(), encodingConfig.Amino) app.configurator = module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter()) app.MM.RegisterServices(app.configurator) @@ -569,8 +591,11 @@ func New( fromVM := make(map[string]uint64) - for moduleName, eachModule := range app.MM.Modules { - fromVM[moduleName] = eachModule.ConsensusVersion() + for moduleName := range app.MM.Modules { + m := app.MM.Modules[moduleName] + if module, ok := m.(module.HasConsensusVersion); ok { + fromVM[moduleName] = module.ConsensusVersion() + } } ctx.Logger().Info("start to run module migrations...") @@ -585,7 +610,7 @@ func New( } if upgradeInfo.Name == upgradeName && !app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) { - storeUpgrades := store.StoreUpgrades{} + storeUpgrades := storetypes.StoreUpgrades{} app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades)) } @@ -664,21 +689,21 @@ func (app *App) InterfaceRegistry() types.InterfaceRegistry { // GetKey returns the KVStoreKey for the provided store key. // // NOTE: This is solely to be used for testing purposes. -func (app *App) GetKey(storeKey string) *sdk.KVStoreKey { +func (app *App) GetKey(storeKey string) *storetypes.KVStoreKey { return app.keys[storeKey] } // GetTKey returns the TransientStoreKey for the provided store key. // // NOTE: This is solely to be used for testing purposes. -func (app *App) GetTKey(storeKey string) *sdk.TransientStoreKey { +func (app *App) GetTKey(storeKey string) *storetypes.TransientStoreKey { return app.tkeys[storeKey] } // GetMemKey returns the MemStoreKey for the provided mem key. // // NOTE: This is solely used for testing purposes. -func (app *App) GetMemKey(storeKey string) *sdk.MemoryStoreKey { +func (app *App) GetMemKey(storeKey string) *storetypes.MemoryStoreKey { return app.memKeys[storeKey] } @@ -751,29 +776,31 @@ func (app *App) GetScopedIBCKeeper() capabilitykeeper.ScopedKeeper { // GetTxConfig implements the TestingApp interface. func (app *App) GetTxConfig() client.TxConfig { - return MakeTestEncodingConfig().TxConfig + return app.txConfig +} + +// TxConfig returns SimApp's TxConfig +func (app *App) TxConfig() client.TxConfig { + return app.txConfig } // RegisterAPIRoutes registers all application module routes with the provided // API server. func (app *App) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIConfig) { clientCtx := apiSvr.ClientCtx - rpc.RegisterRoutes(clientCtx, apiSvr.Router) - // Register legacy tx routes. - authrest.RegisterTxRoutes(clientCtx, apiSvr.Router) // Register new tx routes from grpc-gateway. authtx.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) // Register new tendermint queries routes from grpc-gateway. tmservice.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) + // Register node gRPC service for grpc-gateway. + nodeservice.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) // Register legacy and grpc-gateway routes for all modules. - ModuleBasics.RegisterRESTRoutes(clientCtx, apiSvr.Router) ModuleBasics.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) +} - // register swagger API from root so that other applications can override easily - if apiConfig.Swagger { - RegisterSwaggerAPI(apiSvr.Router) - } +func (app *App) RegisterNodeService(clientCtx client.Context) { + nodeservice.RegisterNodeService(clientCtx, app.GRPCQueryRouter()) } // RegisterTxService implements the Application.RegisterTxService method. @@ -783,18 +810,7 @@ func (app *App) RegisterTxService(clientCtx client.Context) { // RegisterTendermintService implements the Application.RegisterTendermintService method. func (app *App) RegisterTendermintService(clientCtx client.Context) { - tmservice.RegisterTendermintService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.interfaceRegistry) -} - -// RegisterSwaggerAPI registers swagger route with API Server -func RegisterSwaggerAPI(rtr *mux.Router) { - statikFS, err := fs.New() - if err != nil { - panic(err) - } - - staticServer := http.FileServer(statikFS) - rtr.PathPrefix("/swagger/").Handler(http.StripPrefix("/swagger/", staticServer)) + tmservice.RegisterTendermintService(clientCtx, app.BaseApp.GRPCQueryRouter(), app.interfaceRegistry, app.Query) } // GetMaccPerms returns a copy of the module account permissions @@ -807,7 +823,7 @@ func GetMaccPerms() map[string][]string { } // initParamsKeeper init params keeper and its subspaces -func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey sdk.StoreKey) paramskeeper.Keeper { +func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey storetypes.StoreKey) paramskeeper.Keeper { paramsKeeper := paramskeeper.NewKeeper(appCodec, legacyAmino, key, tkey) paramsKeeper.Subspace(authtypes.ModuleName) @@ -816,7 +832,7 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino paramsKeeper.Subspace(minttypes.ModuleName) paramsKeeper.Subspace(distrtypes.ModuleName) paramsKeeper.Subspace(slashingtypes.ModuleName) - paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(govtypes.ParamKeyTable()) + paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(sdkgov.ProvideKeyTable()) paramsKeeper.Subspace(crisistypes.ModuleName) paramsKeeper.Subspace(ibctransfertypes.ModuleName) paramsKeeper.Subspace(ibchost.ModuleName) @@ -828,6 +844,15 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino // should be used only in tests or when creating a new app instance (NewApp*()). // App user shouldn't create new codecs - use the app.AppCodec instead. // [DEPRECATED] +// func MakeTestEncodingConfig() appparams.EncodingConfig { +// encodingConfig := appparams.MakeTestEncodingConfig() +// std.RegisterLegacyAminoCodec(encodingConfig.Amino) +// std.RegisterInterfaces(encodingConfig.InterfaceRegistry) +// ModuleBasics.RegisterLegacyAminoCodec(encodingConfig.Amino) +// ModuleBasics.RegisterInterfaces(encodingConfig.InterfaceRegistry) +// return encodingConfig +// } + func MakeTestEncodingConfig() appparams.EncodingConfig { encodingConfig := appparams.MakeTestEncodingConfig() std.RegisterLegacyAminoCodec(encodingConfig.Amino) @@ -836,3 +861,12 @@ func MakeTestEncodingConfig() appparams.EncodingConfig { ModuleBasics.RegisterInterfaces(encodingConfig.InterfaceRegistry) return encodingConfig } + +func makeEncodingConfig() appparams.EncodingConfig { + encodingConfig := appparams.MakeTestEncodingConfig() + std.RegisterLegacyAminoCodec(encodingConfig.Amino) + std.RegisterInterfaces(encodingConfig.InterfaceRegistry) + ModuleBasics.RegisterLegacyAminoCodec(encodingConfig.Amino) + ModuleBasics.RegisterInterfaces(encodingConfig.InterfaceRegistry) + return encodingConfig +} diff --git a/app/sovereign/export.go b/app/sovereign/export.go index f0b3e3ed76..770d9b540f 100644 --- a/app/sovereign/export.go +++ b/app/sovereign/export.go @@ -4,7 +4,7 @@ import ( "encoding/json" "log" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" servertypes "github.com/cosmos/cosmos-sdk/server/types" sdk "github.com/cosmos/cosmos-sdk/types" @@ -16,7 +16,7 @@ import ( // ExportAppStateAndValidators exports the state of the application for a genesis // file. func (app *App) ExportAppStateAndValidators( - forZeroHeight bool, jailAllowedAddrs []string, + forZeroHeight bool, jailAllowedAddrs, modulesToExport []string, ) (servertypes.ExportedApp, error) { // as if they could withdraw from the start of the next block ctx := app.NewContext(true, tmproto.Header{Height: app.LastBlockHeight()}) @@ -35,7 +35,7 @@ func (app *App) ExportAppStateAndValidators( return servertypes.ExportedApp{}, err } - validators, err := staking.WriteValidators(ctx, app.StakingKeeper) + validators, err := staking.WriteValidators(ctx, &app.StakingKeeper) if err != nil { return servertypes.ExportedApp{}, err } @@ -110,14 +110,23 @@ func (app *App) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs []str feePool.CommunityPool = feePool.CommunityPool.Add(scraps...) app.DistrKeeper.SetFeePool(ctx, feePool) - app.DistrKeeper.Hooks().AfterValidatorCreated(ctx, val.GetOperator()) + err := app.DistrKeeper.Hooks().AfterValidatorCreated(ctx, val.GetOperator()) + if err != nil { + panic(err) + } return false }) // reinitialize all delegations for _, del := range dels { - app.DistrKeeper.Hooks().BeforeDelegationCreated(ctx, del.GetDelegatorAddr(), del.GetValidatorAddr()) - app.DistrKeeper.Hooks().AfterDelegationModified(ctx, del.GetDelegatorAddr(), del.GetValidatorAddr()) + err := app.DistrKeeper.Hooks().BeforeDelegationCreated(ctx, del.GetDelegatorAddr(), del.GetValidatorAddr()) + if err != nil { + panic(err) + } + err = app.DistrKeeper.Hooks().AfterDelegationModified(ctx, del.GetDelegatorAddr(), del.GetValidatorAddr()) + if err != nil { + panic(err) + } } // reset context height diff --git a/buf.work.yaml b/buf.work.yaml index 98094695ff..1b4a0d95c2 100644 --- a/buf.work.yaml +++ b/buf.work.yaml @@ -6,4 +6,3 @@ version: v1 directories: - proto - - third_party/proto diff --git a/cmd/interchain-security-cd/cmd/genaccounts.go b/cmd/interchain-security-cd/cmd/genaccounts.go deleted file mode 100644 index c3340dccad..0000000000 --- a/cmd/interchain-security-cd/cmd/genaccounts.go +++ /dev/null @@ -1,180 +0,0 @@ -package cmd - -import ( - "bufio" - "encoding/json" - "errors" - "fmt" - - "github.com/spf13/cobra" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/cosmos/cosmos-sdk/server" - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - authvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/cosmos/cosmos-sdk/x/genutil" - genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" -) - -const ( - flagVestingStart = "vesting-start-time" - flagVestingEnd = "vesting-end-time" - flagVestingAmt = "vesting-amount" -) - -// AddGenesisAccountCmd returns add-genesis-account cobra Command. -func AddGenesisAccountCmd(defaultNodeHome string) *cobra.Command { - cmd := &cobra.Command{ - Use: "add-genesis-account [address_or_key_name] [coin][,[coin]]", - Short: "Add a genesis account to genesis.json", - Long: `Add a genesis account to genesis.json. The provided account must specify -the account address or key name and a list of initial coins. If a key name is given, -the address will be looked up in the local Keybase. The list of initial tokens must -contain valid denominations. Accounts may optionally be supplied with vesting parameters. -`, - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx := client.GetClientContextFromCmd(cmd) - serverCtx := server.GetServerContextFromCmd(cmd) - config := serverCtx.Config - - config.SetRoot(clientCtx.HomeDir) - - var kr keyring.Keyring - addr, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - inBuf := bufio.NewReader(cmd.InOrStdin()) - keyringBackend, _ := cmd.Flags().GetString(flags.FlagKeyringBackend) - if keyringBackend != "" && clientCtx.Keyring == nil { - var err error - kr, err = keyring.New(sdk.KeyringServiceName(), keyringBackend, clientCtx.HomeDir, inBuf) - if err != nil { - return err - } - } else { - kr = clientCtx.Keyring - } - - info, err := kr.Key(args[0]) - if err != nil { - return fmt.Errorf("failed to get address from Keyring: %w", err) - } - addr = info.GetAddress() - } - - coins, err := sdk.ParseCoinsNormalized(args[1]) - if err != nil { - return fmt.Errorf("failed to parse coins: %w", err) - } - - vestingStart, _ := cmd.Flags().GetInt64(flagVestingStart) - vestingEnd, _ := cmd.Flags().GetInt64(flagVestingEnd) - vestingAmtStr, _ := cmd.Flags().GetString(flagVestingAmt) - - vestingAmt, err := sdk.ParseCoinsNormalized(vestingAmtStr) - if err != nil { - return fmt.Errorf("failed to parse vesting amount: %w", err) - } - - // create concrete account type based on input parameters - var genAccount authtypes.GenesisAccount - - balances := banktypes.Balance{Address: addr.String(), Coins: coins.Sort()} - baseAccount := authtypes.NewBaseAccount(addr, nil, 0, 0) - - if !vestingAmt.IsZero() { - baseVestingAccount := authvesting.NewBaseVestingAccount(baseAccount, vestingAmt.Sort(), vestingEnd) - - if (balances.Coins.IsZero() && !baseVestingAccount.OriginalVesting.IsZero()) || - baseVestingAccount.OriginalVesting.IsAnyGT(balances.Coins) { - return errors.New("vesting amount cannot be greater than total amount") - } - - switch { - case vestingStart != 0 && vestingEnd != 0: - genAccount = authvesting.NewContinuousVestingAccountRaw(baseVestingAccount, vestingStart) - - case vestingEnd != 0: - genAccount = authvesting.NewDelayedVestingAccountRaw(baseVestingAccount) - - default: - return errors.New("invalid vesting parameters; must supply start and end time or end time") - } - } else { - genAccount = baseAccount - } - - if err := genAccount.Validate(); err != nil { - return fmt.Errorf("failed to validate new genesis account: %w", err) - } - - genFile := config.GenesisFile() - appState, genDoc, err := genutiltypes.GenesisStateFromGenFile(genFile) - if err != nil { - return fmt.Errorf("failed to unmarshal genesis state: %w", err) - } - - authGenState := authtypes.GetGenesisStateFromAppState(clientCtx.Codec, appState) - - accs, err := authtypes.UnpackAccounts(authGenState.Accounts) - if err != nil { - return fmt.Errorf("failed to get accounts from any: %w", err) - } - - if accs.Contains(addr) { - return fmt.Errorf("cannot add account at existing address %s", addr) - } - - // Add the new account to the set of genesis accounts and sanitize the - // accounts afterwards. - accs = append(accs, genAccount) - accs = authtypes.SanitizeGenesisAccounts(accs) - - genAccs, err := authtypes.PackAccounts(accs) - if err != nil { - return fmt.Errorf("failed to convert accounts into any's: %w", err) - } - authGenState.Accounts = genAccs - - authGenStateBz, err := clientCtx.Codec.MarshalJSON(&authGenState) - if err != nil { - return fmt.Errorf("failed to marshal auth genesis state: %w", err) - } - - appState[authtypes.ModuleName] = authGenStateBz - - bankGenState := banktypes.GetGenesisStateFromAppState(clientCtx.Codec, appState) - bankGenState.Balances = append(bankGenState.Balances, balances) - bankGenState.Balances = banktypes.SanitizeGenesisBalances(bankGenState.Balances) - bankGenState.Supply = bankGenState.Supply.Add(balances.Coins...) - - bankGenStateBz, err := clientCtx.Codec.MarshalJSON(bankGenState) - if err != nil { - return fmt.Errorf("failed to marshal bank genesis state: %w", err) - } - - appState[banktypes.ModuleName] = bankGenStateBz - - appStateJSON, err := json.Marshal(appState) - if err != nil { - return fmt.Errorf("failed to marshal application genesis state: %w", err) - } - - genDoc.AppState = appStateJSON - return genutil.ExportGenesisFile(genDoc, genFile) - }, - } - - cmd.Flags().String(flags.FlagHome, defaultNodeHome, "The application home directory") - cmd.Flags().String(flags.FlagKeyringBackend, flags.DefaultKeyringBackend, "Select keyring's backend (os|file|kwallet|pass|test)") - cmd.Flags().String(flagVestingAmt, "", "amount of coins for vesting accounts") - cmd.Flags().Int64(flagVestingStart, 0, "schedule start time (unix epoch) for vesting accounts") - cmd.Flags().Int64(flagVestingEnd, 0, "schedule end time (unix epoch) for vesting accounts") - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} diff --git a/cmd/interchain-security-cd/cmd/root.go b/cmd/interchain-security-cd/cmd/root.go index d6b2b95098..10af60f25f 100644 --- a/cmd/interchain-security-cd/cmd/root.go +++ b/cmd/interchain-security-cd/cmd/root.go @@ -4,16 +4,16 @@ import ( "errors" "io" "os" - "path/filepath" + dbm "github.com/cometbft/cometbft-db" + tmcfg "github.com/cometbft/cometbft/config" + "github.com/cometbft/cometbft/libs/log" serverconfig "github.com/cosmos/cosmos-sdk/server/config" - "github.com/spf13/cast" + simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" "github.com/spf13/cobra" - tmcli "github.com/tendermint/tendermint/libs/cli" - "github.com/tendermint/tendermint/libs/log" - dbm "github.com/tendermint/tm-db" + "github.com/spf13/viper" - "github.com/cosmos/cosmos-sdk/baseapp" + rosettaCmd "cosmossdk.io/tools/rosetta/cmd" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/config" "github.com/cosmos/cosmos-sdk/client/debug" @@ -23,35 +23,40 @@ import ( "github.com/cosmos/cosmos-sdk/client/rpc" "github.com/cosmos/cosmos-sdk/server" servertypes "github.com/cosmos/cosmos-sdk/server/types" - "github.com/cosmos/cosmos-sdk/snapshots" - "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" "github.com/cosmos/cosmos-sdk/x/auth/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/crisis" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" - simapp "github.com/cosmos/interchain-security/v2/app/consumer" + consumer "github.com/cosmos/interchain-security/v2/app/consumer" "github.com/cosmos/interchain-security/v2/app/params" ) // NewRootCmd creates a new root command for simd. It is called once in the // main function. -func NewRootCmd() (*cobra.Command, params.EncodingConfig) { - encodingConfig := simapp.MakeTestEncodingConfig() +func NewRootCmd() *cobra.Command { + // we "pre"-instantiate the application for getting the injected/configured encoding configuration + tempApp := consumer.New(log.NewNopLogger(), dbm.NewMemDB(), nil, true, simtestutil.NewAppOptionsWithFlagHome(consumer.DefaultNodeHome)) + encodingConfig := params.EncodingConfig{ + InterfaceRegistry: tempApp.InterfaceRegistry(), + Codec: tempApp.AppCodec(), + TxConfig: tempApp.TxConfig(), + Amino: tempApp.LegacyAmino(), + } + initClientCtx := client.Context{}. - WithCodec(encodingConfig.Marshaler). + WithCodec(encodingConfig.Codec). WithInterfaceRegistry(encodingConfig.InterfaceRegistry). WithTxConfig(encodingConfig.TxConfig). WithLegacyAmino(encodingConfig.Amino). WithInput(os.Stdin). WithAccountRetriever(types.AccountRetriever{}). - WithHomeDir(simapp.DefaultNodeHome). + WithHomeDir(consumer.DefaultNodeHome). WithViper("") // In simapp, we don't use any prefix for env variables. rootCmd := &cobra.Command{ - Use: "simd", - Short: "simulation app", + Use: "interchain-security-cd", + Short: "interchain-security consumer simulation app", PersistentPreRunE: func(cmd *cobra.Command, _ []string) error { // set the default command outputs cmd.SetOut(cmd.OutOrStdout()) @@ -72,14 +77,53 @@ func NewRootCmd() (*cobra.Command, params.EncodingConfig) { } customAppTemplate, customAppConfig := initAppConfig() + customTMConfig := initTendermintConfig() - return server.InterceptConfigsPreRunHandler(cmd, customAppTemplate, customAppConfig) + return server.InterceptConfigsPreRunHandler(cmd, customAppTemplate, customAppConfig, customTMConfig) }, } initRootCmd(rootCmd, encodingConfig) - return rootCmd, encodingConfig + return rootCmd +} + +// initTendermintConfig helps to override default Tendermint Config values. +// return tmcfg.DefaultConfig if no custom configuration is required for the application. +func initTendermintConfig() *tmcfg.Config { + cfg := tmcfg.DefaultConfig() + + // these values put a higher strain on node memory + // cfg.P2P.MaxNumInboundPeers = 100 + // cfg.P2P.MaxNumOutboundPeers = 40 + + return cfg +} + +func txCommand() *cobra.Command { + cmd := &cobra.Command{ + Use: "tx", + Short: "Transactions subcommands", + DisableFlagParsing: false, + SuggestionsMinimumDistance: 2, + RunE: client.ValidateCmd, + } + + cmd.AddCommand( + authcmd.GetSignCommand(), + authcmd.GetSignBatchCommand(), + authcmd.GetMultiSignCommand(), + authcmd.GetMultiSignBatchCmd(), + authcmd.GetValidateSignaturesCommand(), + authcmd.GetBroadcastCommand(), + authcmd.GetEncodeCommand(), + authcmd.GetDecodeCommand(), + authcmd.GetAuxToFeeCommand(), + ) + + consumer.ModuleBasics.AddTxCommands(cmd) + + return cmd } // initAppConfig helps to override default appConfig template and configs. @@ -143,44 +187,107 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) { cfg := sdk.GetConfig() cfg.Seal() - a := appCreator{encodingConfig} rootCmd.AddCommand( - genutilcli.InitCmd(simapp.ModuleBasics, simapp.DefaultNodeHome), - genutilcli.CollectGenTxsCmd(banktypes.GenesisBalancesIterator{}, simapp.DefaultNodeHome), - genutilcli.MigrateGenesisCmd(), - genutilcli.GenTxCmd(simapp.ModuleBasics, encodingConfig.TxConfig, banktypes.GenesisBalancesIterator{}, simapp.DefaultNodeHome), - genutilcli.ValidateGenesisCmd(simapp.ModuleBasics), - AddGenesisAccountCmd(simapp.DefaultNodeHome), - tmcli.NewCompletionCmd(rootCmd, true), + genutilcli.InitCmd(consumer.ModuleBasics, consumer.DefaultNodeHome), debug.Cmd(), config.Cmd(), - pruning.PruningCmd(a.newApp), + pruning.PruningCmd(newApp), ) - server.AddCommands(rootCmd, simapp.DefaultNodeHome, a.newApp, a.appExport, addModuleInitFlags) + server.AddCommands(rootCmd, consumer.DefaultNodeHome, newApp, appExport, addModuleInitFlags) - // add keybase, auxiliary RPC, query, and tx child commands + // add keybase, auxiliary RPC, query, genesis, and tx child commands rootCmd.AddCommand( rpc.StatusCommand(), + genesisCommand(encodingConfig), queryCommand(), txCommand(), - keys.Commands(simapp.DefaultNodeHome), + keys.Commands(consumer.DefaultNodeHome), ) // add rosetta - rootCmd.AddCommand(server.RosettaCommand(encodingConfig.InterfaceRegistry, encodingConfig.Marshaler)) + rootCmd.AddCommand(rosettaCmd.RosettaCommand(encodingConfig.InterfaceRegistry, encodingConfig.Codec)) +} + +// newApp is an appCreator +// newApp creates the application +func newApp( + logger log.Logger, + db dbm.DB, + traceStore io.Writer, + appOpts servertypes.AppOptions, +) servertypes.Application { + baseappOptions := server.DefaultBaseappOptions(appOpts) + + return consumer.New( + logger, db, traceStore, true, + appOpts, + baseappOptions..., + ) +} + +// appExport creates a new simapp (optionally at a given height) and exports state. +func appExport( + logger log.Logger, + db dbm.DB, + traceStore io.Writer, + height int64, + forZeroHeight bool, + jailAllowedAddrs []string, + appOpts servertypes.AppOptions, + modulesToExport []string, +) (servertypes.ExportedApp, error) { + var simApp *consumer.App + + // this check is necessary as we use the flag in x/upgrade. + // we can exit more gracefully by checking the flag here. + homePath, ok := appOpts.Get(flags.FlagHome).(string) + if !ok || homePath == "" { + return servertypes.ExportedApp{}, errors.New("application home not set") + } + + viperAppOpts, ok := appOpts.(*viper.Viper) + if !ok { + return servertypes.ExportedApp{}, errors.New("appOpts is not viper.Viper") + } + + // overwrite the FlagInvCheckPeriod + viperAppOpts.Set(server.FlagInvCheckPeriod, 1) + appOpts = viperAppOpts + + if height != -1 { + simApp = consumer.New(logger, db, traceStore, false, appOpts) + + if err := simApp.LoadHeight(height); err != nil { + return servertypes.ExportedApp{}, err + } + } else { + simApp = consumer.New(logger, db, traceStore, true, appOpts) + } + + return simApp.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs, modulesToExport) } func addModuleInitFlags(startCmd *cobra.Command) { crisis.AddModuleInitFlags(startCmd) } +// genesisCommand builds genesis-related `simd genesis` command. Users may provide application specific commands as a parameter +func genesisCommand(encodingConfig params.EncodingConfig, cmds ...*cobra.Command) *cobra.Command { + cmd := genutilcli.GenesisCoreCommand(encodingConfig.TxConfig, consumer.ModuleBasics, consumer.DefaultNodeHome) + + for _, sub_cmd := range cmds { + cmd.AddCommand(sub_cmd) + } + return cmd +} + func queryCommand() *cobra.Command { cmd := &cobra.Command{ Use: "query", Aliases: []string{"q"}, Short: "Querying subcommands", - DisableFlagParsing: true, + DisableFlagParsing: false, SuggestionsMinimumDistance: 2, RunE: client.ValidateCmd, } @@ -191,115 +298,11 @@ func queryCommand() *cobra.Command { rpc.BlockCommand(), authcmd.QueryTxsByEventsCmd(), authcmd.QueryTxCmd(), - ) - - simapp.ModuleBasics.AddQueryCommands(cmd) - cmd.PersistentFlags().String(flags.FlagChainID, "", "The network chain ID") - - return cmd -} - -func txCommand() *cobra.Command { - cmd := &cobra.Command{ - Use: "tx", - Short: "Transactions subcommands", - DisableFlagParsing: true, - SuggestionsMinimumDistance: 2, - RunE: client.ValidateCmd, - } - - cmd.AddCommand( - authcmd.GetSignCommand(), - authcmd.GetSignBatchCommand(), - authcmd.GetMultiSignCommand(), - authcmd.GetMultiSignBatchCmd(), - authcmd.GetValidateSignaturesCommand(), - authcmd.GetBroadcastCommand(), authcmd.GetEncodeCommand(), authcmd.GetDecodeCommand(), ) - simapp.ModuleBasics.AddTxCommands(cmd) - cmd.PersistentFlags().String(flags.FlagChainID, "", "The network chain ID") + consumer.ModuleBasics.AddQueryCommands(cmd) return cmd } - -type appCreator struct { - encCfg params.EncodingConfig -} - -// newApp is an appCreator -func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, appOpts servertypes.AppOptions) servertypes.Application { - var cache sdk.MultiStorePersistentCache - - if cast.ToBool(appOpts.Get(server.FlagInterBlockCache)) { - cache = store.NewCommitKVStoreCacheManager() - } - - skipUpgradeHeights := make(map[int64]bool) - for _, h := range cast.ToIntSlice(appOpts.Get(server.FlagUnsafeSkipUpgrades)) { - skipUpgradeHeights[int64(h)] = true - } - - pruningOpts, err := server.GetPruningOptionsFromFlags(appOpts) - if err != nil { - panic(err) - } - - snapshotDir := filepath.Join(cast.ToString(appOpts.Get(flags.FlagHome)), "data", "snapshots") - snapshotDB, err := sdk.NewLevelDB("metadata", snapshotDir) - if err != nil { - panic(err) - } - snapshotStore, err := snapshots.NewStore(snapshotDB, snapshotDir) - if err != nil { - panic(err) - } - - return simapp.New( - logger, db, traceStore, true, skipUpgradeHeights, - cast.ToString(appOpts.Get(flags.FlagHome)), - cast.ToUint(appOpts.Get(server.FlagInvCheckPeriod)), - a.encCfg, - appOpts, - baseapp.SetPruning(pruningOpts), - baseapp.SetMinGasPrices(cast.ToString(appOpts.Get(server.FlagMinGasPrices))), - baseapp.SetHaltHeight(cast.ToUint64(appOpts.Get(server.FlagHaltHeight))), - baseapp.SetHaltTime(cast.ToUint64(appOpts.Get(server.FlagHaltTime))), - baseapp.SetMinRetainBlocks(cast.ToUint64(appOpts.Get(server.FlagMinRetainBlocks))), - baseapp.SetInterBlockCache(cache), - baseapp.SetTrace(cast.ToBool(appOpts.Get(server.FlagTrace))), - baseapp.SetIndexEvents(cast.ToStringSlice(appOpts.Get(server.FlagIndexEvents))), - baseapp.SetSnapshotStore(snapshotStore), - baseapp.SetSnapshotInterval(cast.ToUint64(appOpts.Get(server.FlagStateSyncSnapshotInterval))), - baseapp.SetSnapshotKeepRecent(cast.ToUint32(appOpts.Get(server.FlagStateSyncSnapshotKeepRecent))), - baseapp.SetIAVLCacheSize(cast.ToInt(appOpts.Get(server.FlagIAVLCacheSize))), - baseapp.SetIAVLDisableFastNode(cast.ToBool(appOpts.Get(server.FlagDisableIAVLFastNode))), - ) -} - -// appExport creates a new simapp (optionally at a given height) -// and exports state. -func (a appCreator) appExport( - logger log.Logger, db dbm.DB, traceStore io.Writer, height int64, forZeroHeight bool, jailAllowedAddrs []string, - appOpts servertypes.AppOptions, -) (servertypes.ExportedApp, error) { - var simApp *simapp.App - homePath, ok := appOpts.Get(flags.FlagHome).(string) - if !ok || homePath == "" { - return servertypes.ExportedApp{}, errors.New("application home not set") - } - - if height != -1 { - simApp = simapp.New(logger, db, traceStore, false, map[int64]bool{}, homePath, uint(1), a.encCfg, appOpts) - - if err := simApp.LoadHeight(height); err != nil { - return servertypes.ExportedApp{}, err - } - } else { - simApp = simapp.New(logger, db, traceStore, true, map[int64]bool{}, homePath, uint(1), a.encCfg, appOpts) - } - - return simApp.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs) -} diff --git a/cmd/interchain-security-cd/main.go b/cmd/interchain-security-cd/main.go index abccff8eae..589869cd43 100644 --- a/cmd/interchain-security-cd/main.go +++ b/cmd/interchain-security-cd/main.go @@ -10,9 +10,9 @@ import ( ) func main() { - rootCmd, _ := cmd.NewRootCmd() + rootCmd := cmd.NewRootCmd() - if err := svrcmd.Execute(rootCmd, app.DefaultNodeHome); err != nil { + if err := svrcmd.Execute(rootCmd, "", app.DefaultNodeHome); err != nil { switch e := err.(type) { case server.ErrorCode: os.Exit(e.Code) diff --git a/cmd/interchain-security-cdd/cmd/genaccounts.go b/cmd/interchain-security-cdd/cmd/genaccounts.go deleted file mode 100644 index c3340dccad..0000000000 --- a/cmd/interchain-security-cdd/cmd/genaccounts.go +++ /dev/null @@ -1,180 +0,0 @@ -package cmd - -import ( - "bufio" - "encoding/json" - "errors" - "fmt" - - "github.com/spf13/cobra" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/cosmos/cosmos-sdk/server" - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - authvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/cosmos/cosmos-sdk/x/genutil" - genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" -) - -const ( - flagVestingStart = "vesting-start-time" - flagVestingEnd = "vesting-end-time" - flagVestingAmt = "vesting-amount" -) - -// AddGenesisAccountCmd returns add-genesis-account cobra Command. -func AddGenesisAccountCmd(defaultNodeHome string) *cobra.Command { - cmd := &cobra.Command{ - Use: "add-genesis-account [address_or_key_name] [coin][,[coin]]", - Short: "Add a genesis account to genesis.json", - Long: `Add a genesis account to genesis.json. The provided account must specify -the account address or key name and a list of initial coins. If a key name is given, -the address will be looked up in the local Keybase. The list of initial tokens must -contain valid denominations. Accounts may optionally be supplied with vesting parameters. -`, - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx := client.GetClientContextFromCmd(cmd) - serverCtx := server.GetServerContextFromCmd(cmd) - config := serverCtx.Config - - config.SetRoot(clientCtx.HomeDir) - - var kr keyring.Keyring - addr, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - inBuf := bufio.NewReader(cmd.InOrStdin()) - keyringBackend, _ := cmd.Flags().GetString(flags.FlagKeyringBackend) - if keyringBackend != "" && clientCtx.Keyring == nil { - var err error - kr, err = keyring.New(sdk.KeyringServiceName(), keyringBackend, clientCtx.HomeDir, inBuf) - if err != nil { - return err - } - } else { - kr = clientCtx.Keyring - } - - info, err := kr.Key(args[0]) - if err != nil { - return fmt.Errorf("failed to get address from Keyring: %w", err) - } - addr = info.GetAddress() - } - - coins, err := sdk.ParseCoinsNormalized(args[1]) - if err != nil { - return fmt.Errorf("failed to parse coins: %w", err) - } - - vestingStart, _ := cmd.Flags().GetInt64(flagVestingStart) - vestingEnd, _ := cmd.Flags().GetInt64(flagVestingEnd) - vestingAmtStr, _ := cmd.Flags().GetString(flagVestingAmt) - - vestingAmt, err := sdk.ParseCoinsNormalized(vestingAmtStr) - if err != nil { - return fmt.Errorf("failed to parse vesting amount: %w", err) - } - - // create concrete account type based on input parameters - var genAccount authtypes.GenesisAccount - - balances := banktypes.Balance{Address: addr.String(), Coins: coins.Sort()} - baseAccount := authtypes.NewBaseAccount(addr, nil, 0, 0) - - if !vestingAmt.IsZero() { - baseVestingAccount := authvesting.NewBaseVestingAccount(baseAccount, vestingAmt.Sort(), vestingEnd) - - if (balances.Coins.IsZero() && !baseVestingAccount.OriginalVesting.IsZero()) || - baseVestingAccount.OriginalVesting.IsAnyGT(balances.Coins) { - return errors.New("vesting amount cannot be greater than total amount") - } - - switch { - case vestingStart != 0 && vestingEnd != 0: - genAccount = authvesting.NewContinuousVestingAccountRaw(baseVestingAccount, vestingStart) - - case vestingEnd != 0: - genAccount = authvesting.NewDelayedVestingAccountRaw(baseVestingAccount) - - default: - return errors.New("invalid vesting parameters; must supply start and end time or end time") - } - } else { - genAccount = baseAccount - } - - if err := genAccount.Validate(); err != nil { - return fmt.Errorf("failed to validate new genesis account: %w", err) - } - - genFile := config.GenesisFile() - appState, genDoc, err := genutiltypes.GenesisStateFromGenFile(genFile) - if err != nil { - return fmt.Errorf("failed to unmarshal genesis state: %w", err) - } - - authGenState := authtypes.GetGenesisStateFromAppState(clientCtx.Codec, appState) - - accs, err := authtypes.UnpackAccounts(authGenState.Accounts) - if err != nil { - return fmt.Errorf("failed to get accounts from any: %w", err) - } - - if accs.Contains(addr) { - return fmt.Errorf("cannot add account at existing address %s", addr) - } - - // Add the new account to the set of genesis accounts and sanitize the - // accounts afterwards. - accs = append(accs, genAccount) - accs = authtypes.SanitizeGenesisAccounts(accs) - - genAccs, err := authtypes.PackAccounts(accs) - if err != nil { - return fmt.Errorf("failed to convert accounts into any's: %w", err) - } - authGenState.Accounts = genAccs - - authGenStateBz, err := clientCtx.Codec.MarshalJSON(&authGenState) - if err != nil { - return fmt.Errorf("failed to marshal auth genesis state: %w", err) - } - - appState[authtypes.ModuleName] = authGenStateBz - - bankGenState := banktypes.GetGenesisStateFromAppState(clientCtx.Codec, appState) - bankGenState.Balances = append(bankGenState.Balances, balances) - bankGenState.Balances = banktypes.SanitizeGenesisBalances(bankGenState.Balances) - bankGenState.Supply = bankGenState.Supply.Add(balances.Coins...) - - bankGenStateBz, err := clientCtx.Codec.MarshalJSON(bankGenState) - if err != nil { - return fmt.Errorf("failed to marshal bank genesis state: %w", err) - } - - appState[banktypes.ModuleName] = bankGenStateBz - - appStateJSON, err := json.Marshal(appState) - if err != nil { - return fmt.Errorf("failed to marshal application genesis state: %w", err) - } - - genDoc.AppState = appStateJSON - return genutil.ExportGenesisFile(genDoc, genFile) - }, - } - - cmd.Flags().String(flags.FlagHome, defaultNodeHome, "The application home directory") - cmd.Flags().String(flags.FlagKeyringBackend, flags.DefaultKeyringBackend, "Select keyring's backend (os|file|kwallet|pass|test)") - cmd.Flags().String(flagVestingAmt, "", "amount of coins for vesting accounts") - cmd.Flags().Int64(flagVestingStart, 0, "schedule start time (unix epoch) for vesting accounts") - cmd.Flags().Int64(flagVestingEnd, 0, "schedule end time (unix epoch) for vesting accounts") - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} diff --git a/cmd/interchain-security-cdd/cmd/root.go b/cmd/interchain-security-cdd/cmd/root.go index 3586edafd8..615bdf499c 100644 --- a/cmd/interchain-security-cdd/cmd/root.go +++ b/cmd/interchain-security-cdd/cmd/root.go @@ -4,16 +4,15 @@ import ( "errors" "io" "os" - "path/filepath" + dbm "github.com/cometbft/cometbft-db" + "github.com/cometbft/cometbft/libs/log" serverconfig "github.com/cosmos/cosmos-sdk/server/config" - "github.com/spf13/cast" "github.com/spf13/cobra" - tmcli "github.com/tendermint/tendermint/libs/cli" - "github.com/tendermint/tendermint/libs/log" - dbm "github.com/tendermint/tm-db" + "github.com/spf13/viper" - "github.com/cosmos/cosmos-sdk/baseapp" + rosettaCmd "cosmossdk.io/tools/rosetta/cmd" + tmcfg "github.com/cometbft/cometbft/config" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/config" "github.com/cosmos/cosmos-sdk/client/debug" @@ -23,30 +22,37 @@ import ( "github.com/cosmos/cosmos-sdk/client/rpc" "github.com/cosmos/cosmos-sdk/server" servertypes "github.com/cosmos/cosmos-sdk/server/types" - "github.com/cosmos/cosmos-sdk/snapshots" - "github.com/cosmos/cosmos-sdk/store" + simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" "github.com/cosmos/cosmos-sdk/x/auth/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/crisis" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" - simapp "github.com/cosmos/interchain-security/v2/app/consumer-democracy" + + cdd "github.com/cosmos/interchain-security/v2/app/consumer-democracy" "github.com/cosmos/interchain-security/v2/app/params" ) // NewRootCmd creates a new root command for simd. It is called once in the // main function. -func NewRootCmd() (*cobra.Command, params.EncodingConfig) { - encodingConfig := simapp.MakeTestEncodingConfig() +func NewRootCmd() *cobra.Command { + // we "pre"-instantiate the application for getting the injected/configured encoding configuration + tempApp := cdd.New(log.NewNopLogger(), dbm.NewMemDB(), nil, true, simtestutil.NewAppOptionsWithFlagHome(cdd.DefaultNodeHome)) + encodingConfig := params.EncodingConfig{ + InterfaceRegistry: tempApp.InterfaceRegistry(), + Codec: tempApp.AppCodec(), + TxConfig: tempApp.TxConfig(), + Amino: tempApp.LegacyAmino(), + } + initClientCtx := client.Context{}. - WithCodec(encodingConfig.Marshaler). + WithCodec(encodingConfig.Codec). WithInterfaceRegistry(encodingConfig.InterfaceRegistry). WithTxConfig(encodingConfig.TxConfig). WithLegacyAmino(encodingConfig.Amino). WithInput(os.Stdin). WithAccountRetriever(types.AccountRetriever{}). - WithHomeDir(simapp.DefaultNodeHome). + WithHomeDir(cdd.DefaultNodeHome). WithViper("") // In simapp, we don't use any prefix for env variables. rootCmd := &cobra.Command{ @@ -72,14 +78,53 @@ func NewRootCmd() (*cobra.Command, params.EncodingConfig) { } customAppTemplate, customAppConfig := initAppConfig() + customTMConfig := initTendermintConfig() - return server.InterceptConfigsPreRunHandler(cmd, customAppTemplate, customAppConfig) + return server.InterceptConfigsPreRunHandler(cmd, customAppTemplate, customAppConfig, customTMConfig) }, } initRootCmd(rootCmd, encodingConfig) - return rootCmd, encodingConfig + return rootCmd +} + +// initTendermintConfig helps to override default Tendermint Config values. +// return tmcfg.DefaultConfig if no custom configuration is required for the application. +func initTendermintConfig() *tmcfg.Config { + cfg := tmcfg.DefaultConfig() + + // these values put a higher strain on node memory + // cfg.P2P.MaxNumInboundPeers = 100 + // cfg.P2P.MaxNumOutboundPeers = 40 + + return cfg +} + +func txCommand() *cobra.Command { + cmd := &cobra.Command{ + Use: "tx", + Short: "Transactions subcommands", + DisableFlagParsing: false, + SuggestionsMinimumDistance: 2, + RunE: client.ValidateCmd, + } + + cmd.AddCommand( + authcmd.GetSignCommand(), + authcmd.GetSignBatchCommand(), + authcmd.GetMultiSignCommand(), + authcmd.GetMultiSignBatchCmd(), + authcmd.GetValidateSignaturesCommand(), + authcmd.GetBroadcastCommand(), + authcmd.GetEncodeCommand(), + authcmd.GetDecodeCommand(), + authcmd.GetAuxToFeeCommand(), + ) + + cdd.ModuleBasics.AddTxCommands(cmd) + + return cmd } // initAppConfig helps to override default appConfig template and configs. @@ -143,44 +188,107 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) { cfg := sdk.GetConfig() cfg.Seal() - a := appCreator{encodingConfig} rootCmd.AddCommand( - genutilcli.InitCmd(simapp.ModuleBasics, simapp.DefaultNodeHome), - genutilcli.CollectGenTxsCmd(banktypes.GenesisBalancesIterator{}, simapp.DefaultNodeHome), - genutilcli.MigrateGenesisCmd(), - genutilcli.GenTxCmd(simapp.ModuleBasics, encodingConfig.TxConfig, banktypes.GenesisBalancesIterator{}, simapp.DefaultNodeHome), - genutilcli.ValidateGenesisCmd(simapp.ModuleBasics), - AddGenesisAccountCmd(simapp.DefaultNodeHome), - tmcli.NewCompletionCmd(rootCmd, true), + genutilcli.InitCmd(cdd.ModuleBasics, cdd.DefaultNodeHome), debug.Cmd(), config.Cmd(), - pruning.PruningCmd(a.newApp), + pruning.PruningCmd(newApp), ) - server.AddCommands(rootCmd, simapp.DefaultNodeHome, a.newApp, a.appExport, addModuleInitFlags) + server.AddCommands(rootCmd, cdd.DefaultNodeHome, newApp, appExport, addModuleInitFlags) - // add keybase, auxiliary RPC, query, and tx child commands + // add keybase, auxiliary RPC, query, genesis, and tx child commands rootCmd.AddCommand( rpc.StatusCommand(), + genesisCommand(encodingConfig), queryCommand(), txCommand(), - keys.Commands(simapp.DefaultNodeHome), + keys.Commands(cdd.DefaultNodeHome), ) // add rosetta - rootCmd.AddCommand(server.RosettaCommand(encodingConfig.InterfaceRegistry, encodingConfig.Marshaler)) + rootCmd.AddCommand(rosettaCmd.RosettaCommand(encodingConfig.InterfaceRegistry, encodingConfig.Codec)) +} + +// newApp is an appCreator +// newApp creates the application +func newApp( + logger log.Logger, + db dbm.DB, + traceStore io.Writer, + appOpts servertypes.AppOptions, +) servertypes.Application { + baseappOptions := server.DefaultBaseappOptions(appOpts) + + return cdd.New( + logger, db, traceStore, true, + appOpts, + baseappOptions..., + ) +} + +// appExport creates a new simapp (optionally at a given height) and exports state. +func appExport( + logger log.Logger, + db dbm.DB, + traceStore io.Writer, + height int64, + forZeroHeight bool, + jailAllowedAddrs []string, + appOpts servertypes.AppOptions, + modulesToExport []string, +) (servertypes.ExportedApp, error) { + var simApp *cdd.App + + // this check is necessary as we use the flag in x/upgrade. + // we can exit more gracefully by checking the flag here. + homePath, ok := appOpts.Get(flags.FlagHome).(string) + if !ok || homePath == "" { + return servertypes.ExportedApp{}, errors.New("application home not set") + } + + viperAppOpts, ok := appOpts.(*viper.Viper) + if !ok { + return servertypes.ExportedApp{}, errors.New("appOpts is not viper.Viper") + } + + // overwrite the FlagInvCheckPeriod + viperAppOpts.Set(server.FlagInvCheckPeriod, 1) + appOpts = viperAppOpts + + if height != -1 { + simApp = cdd.New(logger, db, traceStore, false, appOpts) + + if err := simApp.LoadHeight(height); err != nil { + return servertypes.ExportedApp{}, err + } + } else { + simApp = cdd.New(logger, db, traceStore, true, appOpts) + } + + return simApp.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs, modulesToExport) } func addModuleInitFlags(startCmd *cobra.Command) { crisis.AddModuleInitFlags(startCmd) } +// genesisCommand builds genesis-related `simd genesis` command. Users may provide application specific commands as a parameter +func genesisCommand(encodingConfig params.EncodingConfig, cmds ...*cobra.Command) *cobra.Command { + cmd := genutilcli.GenesisCoreCommand(encodingConfig.TxConfig, cdd.ModuleBasics, cdd.DefaultNodeHome) + + for _, sub_cmd := range cmds { + cmd.AddCommand(sub_cmd) + } + return cmd +} + func queryCommand() *cobra.Command { cmd := &cobra.Command{ Use: "query", Aliases: []string{"q"}, Short: "Querying subcommands", - DisableFlagParsing: true, + DisableFlagParsing: false, SuggestionsMinimumDistance: 2, RunE: client.ValidateCmd, } @@ -193,113 +301,7 @@ func queryCommand() *cobra.Command { authcmd.QueryTxCmd(), ) - simapp.ModuleBasics.AddQueryCommands(cmd) - cmd.PersistentFlags().String(flags.FlagChainID, "", "The network chain ID") - - return cmd -} - -func txCommand() *cobra.Command { - cmd := &cobra.Command{ - Use: "tx", - Short: "Transactions subcommands", - DisableFlagParsing: true, - SuggestionsMinimumDistance: 2, - RunE: client.ValidateCmd, - } - - cmd.AddCommand( - authcmd.GetSignCommand(), - authcmd.GetSignBatchCommand(), - authcmd.GetMultiSignCommand(), - authcmd.GetMultiSignBatchCmd(), - authcmd.GetValidateSignaturesCommand(), - authcmd.GetBroadcastCommand(), - authcmd.GetEncodeCommand(), - authcmd.GetDecodeCommand(), - ) - - simapp.ModuleBasics.AddTxCommands(cmd) - cmd.PersistentFlags().String(flags.FlagChainID, "", "The network chain ID") + cdd.ModuleBasics.AddQueryCommands(cmd) return cmd } - -type appCreator struct { - encCfg params.EncodingConfig -} - -// newApp is an appCreator -func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, appOpts servertypes.AppOptions) servertypes.Application { - var cache sdk.MultiStorePersistentCache - - if cast.ToBool(appOpts.Get(server.FlagInterBlockCache)) { - cache = store.NewCommitKVStoreCacheManager() - } - - skipUpgradeHeights := make(map[int64]bool) - for _, h := range cast.ToIntSlice(appOpts.Get(server.FlagUnsafeSkipUpgrades)) { - skipUpgradeHeights[int64(h)] = true - } - - pruningOpts, err := server.GetPruningOptionsFromFlags(appOpts) - if err != nil { - panic(err) - } - - snapshotDir := filepath.Join(cast.ToString(appOpts.Get(flags.FlagHome)), "data", "snapshots") - snapshotDB, err := sdk.NewLevelDB("metadata", snapshotDir) - if err != nil { - panic(err) - } - snapshotStore, err := snapshots.NewStore(snapshotDB, snapshotDir) - if err != nil { - panic(err) - } - - return simapp.New( - logger, db, traceStore, true, skipUpgradeHeights, - cast.ToString(appOpts.Get(flags.FlagHome)), - cast.ToUint(appOpts.Get(server.FlagInvCheckPeriod)), - a.encCfg, - appOpts, - baseapp.SetPruning(pruningOpts), - baseapp.SetMinGasPrices(cast.ToString(appOpts.Get(server.FlagMinGasPrices))), - baseapp.SetHaltHeight(cast.ToUint64(appOpts.Get(server.FlagHaltHeight))), - baseapp.SetHaltTime(cast.ToUint64(appOpts.Get(server.FlagHaltTime))), - baseapp.SetMinRetainBlocks(cast.ToUint64(appOpts.Get(server.FlagMinRetainBlocks))), - baseapp.SetInterBlockCache(cache), - baseapp.SetTrace(cast.ToBool(appOpts.Get(server.FlagTrace))), - baseapp.SetIndexEvents(cast.ToStringSlice(appOpts.Get(server.FlagIndexEvents))), - baseapp.SetSnapshotStore(snapshotStore), - baseapp.SetSnapshotInterval(cast.ToUint64(appOpts.Get(server.FlagStateSyncSnapshotInterval))), - baseapp.SetSnapshotKeepRecent(cast.ToUint32(appOpts.Get(server.FlagStateSyncSnapshotKeepRecent))), - baseapp.SetIAVLCacheSize(cast.ToInt(appOpts.Get(server.FlagIAVLCacheSize))), - baseapp.SetIAVLDisableFastNode(cast.ToBool(appOpts.Get(server.FlagDisableIAVLFastNode))), - ) -} - -// appExport creates a new simapp (optionally at a given height) -// and exports state. -func (a appCreator) appExport( - logger log.Logger, db dbm.DB, traceStore io.Writer, height int64, forZeroHeight bool, jailAllowedAddrs []string, - appOpts servertypes.AppOptions, -) (servertypes.ExportedApp, error) { - var simApp *simapp.App - homePath, ok := appOpts.Get(flags.FlagHome).(string) - if !ok || homePath == "" { - return servertypes.ExportedApp{}, errors.New("application home not set") - } - - if height != -1 { - simApp = simapp.New(logger, db, traceStore, false, map[int64]bool{}, homePath, uint(1), a.encCfg, appOpts) - - if err := simApp.LoadHeight(height); err != nil { - return servertypes.ExportedApp{}, err - } - } else { - simApp = simapp.New(logger, db, traceStore, true, map[int64]bool{}, homePath, uint(1), a.encCfg, appOpts) - } - - return simApp.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs) -} diff --git a/cmd/interchain-security-cdd/main.go b/cmd/interchain-security-cdd/main.go index 427fa3ae7d..f209f0046a 100644 --- a/cmd/interchain-security-cdd/main.go +++ b/cmd/interchain-security-cdd/main.go @@ -10,9 +10,9 @@ import ( ) func main() { - rootCmd, _ := cmd.NewRootCmd() + rootCmd := cmd.NewRootCmd() - if err := svrcmd.Execute(rootCmd, app.DefaultNodeHome); err != nil { + if err := svrcmd.Execute(rootCmd, "", app.DefaultNodeHome); err != nil { switch e := err.(type) { case server.ErrorCode: os.Exit(e.Code) diff --git a/cmd/interchain-security-pd/cmd/genaccounts.go b/cmd/interchain-security-pd/cmd/genaccounts.go deleted file mode 100644 index c3340dccad..0000000000 --- a/cmd/interchain-security-pd/cmd/genaccounts.go +++ /dev/null @@ -1,180 +0,0 @@ -package cmd - -import ( - "bufio" - "encoding/json" - "errors" - "fmt" - - "github.com/spf13/cobra" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/cosmos/cosmos-sdk/server" - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - authvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/cosmos/cosmos-sdk/x/genutil" - genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" -) - -const ( - flagVestingStart = "vesting-start-time" - flagVestingEnd = "vesting-end-time" - flagVestingAmt = "vesting-amount" -) - -// AddGenesisAccountCmd returns add-genesis-account cobra Command. -func AddGenesisAccountCmd(defaultNodeHome string) *cobra.Command { - cmd := &cobra.Command{ - Use: "add-genesis-account [address_or_key_name] [coin][,[coin]]", - Short: "Add a genesis account to genesis.json", - Long: `Add a genesis account to genesis.json. The provided account must specify -the account address or key name and a list of initial coins. If a key name is given, -the address will be looked up in the local Keybase. The list of initial tokens must -contain valid denominations. Accounts may optionally be supplied with vesting parameters. -`, - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx := client.GetClientContextFromCmd(cmd) - serverCtx := server.GetServerContextFromCmd(cmd) - config := serverCtx.Config - - config.SetRoot(clientCtx.HomeDir) - - var kr keyring.Keyring - addr, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - inBuf := bufio.NewReader(cmd.InOrStdin()) - keyringBackend, _ := cmd.Flags().GetString(flags.FlagKeyringBackend) - if keyringBackend != "" && clientCtx.Keyring == nil { - var err error - kr, err = keyring.New(sdk.KeyringServiceName(), keyringBackend, clientCtx.HomeDir, inBuf) - if err != nil { - return err - } - } else { - kr = clientCtx.Keyring - } - - info, err := kr.Key(args[0]) - if err != nil { - return fmt.Errorf("failed to get address from Keyring: %w", err) - } - addr = info.GetAddress() - } - - coins, err := sdk.ParseCoinsNormalized(args[1]) - if err != nil { - return fmt.Errorf("failed to parse coins: %w", err) - } - - vestingStart, _ := cmd.Flags().GetInt64(flagVestingStart) - vestingEnd, _ := cmd.Flags().GetInt64(flagVestingEnd) - vestingAmtStr, _ := cmd.Flags().GetString(flagVestingAmt) - - vestingAmt, err := sdk.ParseCoinsNormalized(vestingAmtStr) - if err != nil { - return fmt.Errorf("failed to parse vesting amount: %w", err) - } - - // create concrete account type based on input parameters - var genAccount authtypes.GenesisAccount - - balances := banktypes.Balance{Address: addr.String(), Coins: coins.Sort()} - baseAccount := authtypes.NewBaseAccount(addr, nil, 0, 0) - - if !vestingAmt.IsZero() { - baseVestingAccount := authvesting.NewBaseVestingAccount(baseAccount, vestingAmt.Sort(), vestingEnd) - - if (balances.Coins.IsZero() && !baseVestingAccount.OriginalVesting.IsZero()) || - baseVestingAccount.OriginalVesting.IsAnyGT(balances.Coins) { - return errors.New("vesting amount cannot be greater than total amount") - } - - switch { - case vestingStart != 0 && vestingEnd != 0: - genAccount = authvesting.NewContinuousVestingAccountRaw(baseVestingAccount, vestingStart) - - case vestingEnd != 0: - genAccount = authvesting.NewDelayedVestingAccountRaw(baseVestingAccount) - - default: - return errors.New("invalid vesting parameters; must supply start and end time or end time") - } - } else { - genAccount = baseAccount - } - - if err := genAccount.Validate(); err != nil { - return fmt.Errorf("failed to validate new genesis account: %w", err) - } - - genFile := config.GenesisFile() - appState, genDoc, err := genutiltypes.GenesisStateFromGenFile(genFile) - if err != nil { - return fmt.Errorf("failed to unmarshal genesis state: %w", err) - } - - authGenState := authtypes.GetGenesisStateFromAppState(clientCtx.Codec, appState) - - accs, err := authtypes.UnpackAccounts(authGenState.Accounts) - if err != nil { - return fmt.Errorf("failed to get accounts from any: %w", err) - } - - if accs.Contains(addr) { - return fmt.Errorf("cannot add account at existing address %s", addr) - } - - // Add the new account to the set of genesis accounts and sanitize the - // accounts afterwards. - accs = append(accs, genAccount) - accs = authtypes.SanitizeGenesisAccounts(accs) - - genAccs, err := authtypes.PackAccounts(accs) - if err != nil { - return fmt.Errorf("failed to convert accounts into any's: %w", err) - } - authGenState.Accounts = genAccs - - authGenStateBz, err := clientCtx.Codec.MarshalJSON(&authGenState) - if err != nil { - return fmt.Errorf("failed to marshal auth genesis state: %w", err) - } - - appState[authtypes.ModuleName] = authGenStateBz - - bankGenState := banktypes.GetGenesisStateFromAppState(clientCtx.Codec, appState) - bankGenState.Balances = append(bankGenState.Balances, balances) - bankGenState.Balances = banktypes.SanitizeGenesisBalances(bankGenState.Balances) - bankGenState.Supply = bankGenState.Supply.Add(balances.Coins...) - - bankGenStateBz, err := clientCtx.Codec.MarshalJSON(bankGenState) - if err != nil { - return fmt.Errorf("failed to marshal bank genesis state: %w", err) - } - - appState[banktypes.ModuleName] = bankGenStateBz - - appStateJSON, err := json.Marshal(appState) - if err != nil { - return fmt.Errorf("failed to marshal application genesis state: %w", err) - } - - genDoc.AppState = appStateJSON - return genutil.ExportGenesisFile(genDoc, genFile) - }, - } - - cmd.Flags().String(flags.FlagHome, defaultNodeHome, "The application home directory") - cmd.Flags().String(flags.FlagKeyringBackend, flags.DefaultKeyringBackend, "Select keyring's backend (os|file|kwallet|pass|test)") - cmd.Flags().String(flagVestingAmt, "", "amount of coins for vesting accounts") - cmd.Flags().Int64(flagVestingStart, 0, "schedule start time (unix epoch) for vesting accounts") - cmd.Flags().Int64(flagVestingEnd, 0, "schedule end time (unix epoch) for vesting accounts") - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} diff --git a/cmd/interchain-security-pd/cmd/root.go b/cmd/interchain-security-pd/cmd/root.go index 69341b917b..e480acfc34 100644 --- a/cmd/interchain-security-pd/cmd/root.go +++ b/cmd/interchain-security-pd/cmd/root.go @@ -4,16 +4,15 @@ import ( "errors" "io" "os" - "path/filepath" + dbm "github.com/cometbft/cometbft-db" + "github.com/cometbft/cometbft/libs/log" serverconfig "github.com/cosmos/cosmos-sdk/server/config" - "github.com/spf13/cast" "github.com/spf13/cobra" - tmcli "github.com/tendermint/tendermint/libs/cli" - "github.com/tendermint/tendermint/libs/log" - dbm "github.com/tendermint/tm-db" + "github.com/spf13/viper" - "github.com/cosmos/cosmos-sdk/baseapp" + rosettaCmd "cosmossdk.io/tools/rosetta/cmd" + tmcfg "github.com/cometbft/cometbft/config" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/config" "github.com/cosmos/cosmos-sdk/client/debug" @@ -23,30 +22,36 @@ import ( "github.com/cosmos/cosmos-sdk/client/rpc" "github.com/cosmos/cosmos-sdk/server" servertypes "github.com/cosmos/cosmos-sdk/server/types" - "github.com/cosmos/cosmos-sdk/snapshots" - "github.com/cosmos/cosmos-sdk/store" + simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" "github.com/cosmos/cosmos-sdk/x/auth/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/crisis" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" "github.com/cosmos/interchain-security/v2/app/params" - simapp "github.com/cosmos/interchain-security/v2/app/provider" + providerApp "github.com/cosmos/interchain-security/v2/app/provider" ) // NewRootCmd creates a new root command for simd. It is called once in the // main function. -func NewRootCmd() (*cobra.Command, params.EncodingConfig) { - encodingConfig := simapp.MakeTestEncodingConfig() +func NewRootCmd() *cobra.Command { + // we "pre"-instantiate the application for getting the injected/configured encoding configuration + tempApp := providerApp.New(log.NewNopLogger(), dbm.NewMemDB(), nil, true, simtestutil.NewAppOptionsWithFlagHome(providerApp.DefaultNodeHome)) + encodingConfig := params.EncodingConfig{ + InterfaceRegistry: tempApp.InterfaceRegistry(), + Codec: tempApp.AppCodec(), + TxConfig: tempApp.TxConfig(), + Amino: tempApp.LegacyAmino(), + } + initClientCtx := client.Context{}. - WithCodec(encodingConfig.Marshaler). + WithCodec(encodingConfig.Codec). WithInterfaceRegistry(encodingConfig.InterfaceRegistry). WithTxConfig(encodingConfig.TxConfig). WithLegacyAmino(encodingConfig.Amino). WithInput(os.Stdin). WithAccountRetriever(types.AccountRetriever{}). - WithHomeDir(simapp.DefaultNodeHome). + WithHomeDir(providerApp.DefaultNodeHome). WithViper("") // In simapp, we don't use any prefix for env variables. rootCmd := &cobra.Command{ @@ -72,14 +77,53 @@ func NewRootCmd() (*cobra.Command, params.EncodingConfig) { } customAppTemplate, customAppConfig := initAppConfig() + customTMConfig := initTendermintConfig() - return server.InterceptConfigsPreRunHandler(cmd, customAppTemplate, customAppConfig) + return server.InterceptConfigsPreRunHandler(cmd, customAppTemplate, customAppConfig, customTMConfig) }, } initRootCmd(rootCmd, encodingConfig) - return rootCmd, encodingConfig + return rootCmd +} + +// initTendermintConfig helps to override default Tendermint Config values. +// return tmcfg.DefaultConfig if no custom configuration is required for the application. +func initTendermintConfig() *tmcfg.Config { + cfg := tmcfg.DefaultConfig() + + // these values put a higher strain on node memory + // cfg.P2P.MaxNumInboundPeers = 100 + // cfg.P2P.MaxNumOutboundPeers = 40 + + return cfg +} + +func txCommand() *cobra.Command { + cmd := &cobra.Command{ + Use: "tx", + Short: "Transactions subcommands", + DisableFlagParsing: false, + SuggestionsMinimumDistance: 2, + RunE: client.ValidateCmd, + } + + cmd.AddCommand( + authcmd.GetSignCommand(), + authcmd.GetSignBatchCommand(), + authcmd.GetMultiSignCommand(), + authcmd.GetMultiSignBatchCmd(), + authcmd.GetValidateSignaturesCommand(), + authcmd.GetBroadcastCommand(), + authcmd.GetEncodeCommand(), + authcmd.GetDecodeCommand(), + authcmd.GetAuxToFeeCommand(), + ) + + providerApp.ModuleBasics.AddTxCommands(cmd) + + return cmd } // initAppConfig helps to override default appConfig template and configs. @@ -143,44 +187,106 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) { cfg := sdk.GetConfig() cfg.Seal() - a := appCreator{encodingConfig} rootCmd.AddCommand( - genutilcli.InitCmd(simapp.ModuleBasics, simapp.DefaultNodeHome), - genutilcli.CollectGenTxsCmd(banktypes.GenesisBalancesIterator{}, simapp.DefaultNodeHome), - genutilcli.MigrateGenesisCmd(), - genutilcli.GenTxCmd(simapp.ModuleBasics, encodingConfig.TxConfig, banktypes.GenesisBalancesIterator{}, simapp.DefaultNodeHome), - genutilcli.ValidateGenesisCmd(simapp.ModuleBasics), - AddGenesisAccountCmd(simapp.DefaultNodeHome), - tmcli.NewCompletionCmd(rootCmd, true), + genutilcli.InitCmd(providerApp.ModuleBasics, providerApp.DefaultNodeHome), debug.Cmd(), config.Cmd(), - pruning.PruningCmd(a.newApp), + pruning.PruningCmd(newApp), ) - server.AddCommands(rootCmd, simapp.DefaultNodeHome, a.newApp, a.appExport, addModuleInitFlags) + server.AddCommands(rootCmd, providerApp.DefaultNodeHome, newApp, appExport, addModuleInitFlags) - // add keybase, auxiliary RPC, query, and tx child commands + // add keybase, auxiliary RPC, query, genesis, and tx child commands rootCmd.AddCommand( rpc.StatusCommand(), + genesisCommand(encodingConfig), queryCommand(), txCommand(), - keys.Commands(simapp.DefaultNodeHome), + keys.Commands(providerApp.DefaultNodeHome), ) // add rosetta - rootCmd.AddCommand(server.RosettaCommand(encodingConfig.InterfaceRegistry, encodingConfig.Marshaler)) + rootCmd.AddCommand(rosettaCmd.RosettaCommand(encodingConfig.InterfaceRegistry, encodingConfig.Codec)) +} + +// newApp is an appCreator +// newApp creates the application +func newApp( + logger log.Logger, + db dbm.DB, + traceStore io.Writer, + appOpts servertypes.AppOptions, +) servertypes.Application { + baseappOptions := server.DefaultBaseappOptions(appOpts) + + return providerApp.New( + logger, db, traceStore, true, + appOpts, + baseappOptions..., + ) +} + +// appExport creates a new simapp (optionally at a given height) and exports state. +func appExport( + logger log.Logger, + db dbm.DB, + traceStore io.Writer, + height int64, + forZeroHeight bool, + jailAllowedAddrs []string, + appOpts servertypes.AppOptions, + modulesToExport []string, +) (servertypes.ExportedApp, error) { + var simApp *providerApp.App + + // this check is necessary as we use the flag in x/upgrade. + // we can exit more gracefully by checking the flag here. + homePath, ok := appOpts.Get(flags.FlagHome).(string) + if !ok || homePath == "" { + return servertypes.ExportedApp{}, errors.New("application home not set") + } + + viperAppOpts, ok := appOpts.(*viper.Viper) + if !ok { + return servertypes.ExportedApp{}, errors.New("appOpts is not viper.Viper") + } + + // overwrite the FlagInvCheckPeriod + viperAppOpts.Set(server.FlagInvCheckPeriod, 1) + appOpts = viperAppOpts + + if height != -1 { + simApp = providerApp.New(logger, db, traceStore, false, appOpts) + + if err := simApp.LoadHeight(height); err != nil { + return servertypes.ExportedApp{}, err + } + } else { + simApp = providerApp.New(logger, db, traceStore, true, appOpts) + } + + return simApp.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs, modulesToExport) } func addModuleInitFlags(startCmd *cobra.Command) { crisis.AddModuleInitFlags(startCmd) } +// genesisCommand builds genesis-related `simd genesis` command. Users may provide application specific commands as a parameter +func genesisCommand(encodingConfig params.EncodingConfig, cmds ...*cobra.Command) *cobra.Command { + cmd := genutilcli.GenesisCoreCommand(encodingConfig.TxConfig, providerApp.ModuleBasics, providerApp.DefaultNodeHome) + for _, sub_cmd := range cmds { + cmd.AddCommand(sub_cmd) + } + return cmd +} + func queryCommand() *cobra.Command { cmd := &cobra.Command{ Use: "query", Aliases: []string{"q"}, Short: "Querying subcommands", - DisableFlagParsing: true, + DisableFlagParsing: false, SuggestionsMinimumDistance: 2, RunE: client.ValidateCmd, } @@ -191,115 +297,11 @@ func queryCommand() *cobra.Command { rpc.BlockCommand(), authcmd.QueryTxsByEventsCmd(), authcmd.QueryTxCmd(), - ) - - simapp.ModuleBasics.AddQueryCommands(cmd) - cmd.PersistentFlags().String(flags.FlagChainID, "", "The network chain ID") - - return cmd -} - -func txCommand() *cobra.Command { - cmd := &cobra.Command{ - Use: "tx", - Short: "Transactions subcommands", - DisableFlagParsing: true, - SuggestionsMinimumDistance: 2, - RunE: client.ValidateCmd, - } - - cmd.AddCommand( - authcmd.GetSignCommand(), - authcmd.GetSignBatchCommand(), - authcmd.GetMultiSignCommand(), - authcmd.GetMultiSignBatchCmd(), - authcmd.GetValidateSignaturesCommand(), - authcmd.GetBroadcastCommand(), authcmd.GetEncodeCommand(), authcmd.GetDecodeCommand(), ) - simapp.ModuleBasics.AddTxCommands(cmd) - cmd.PersistentFlags().String(flags.FlagChainID, "", "The network chain ID") + providerApp.ModuleBasics.AddQueryCommands(cmd) return cmd } - -type appCreator struct { - encCfg params.EncodingConfig -} - -// newApp is an appCreator -func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, appOpts servertypes.AppOptions) servertypes.Application { - var cache sdk.MultiStorePersistentCache - - if cast.ToBool(appOpts.Get(server.FlagInterBlockCache)) { - cache = store.NewCommitKVStoreCacheManager() - } - - skipUpgradeHeights := make(map[int64]bool) - for _, h := range cast.ToIntSlice(appOpts.Get(server.FlagUnsafeSkipUpgrades)) { - skipUpgradeHeights[int64(h)] = true - } - - pruningOpts, err := server.GetPruningOptionsFromFlags(appOpts) - if err != nil { - panic(err) - } - - snapshotDir := filepath.Join(cast.ToString(appOpts.Get(flags.FlagHome)), "data", "snapshots") - snapshotDB, err := sdk.NewLevelDB("metadata", snapshotDir) - if err != nil { - panic(err) - } - snapshotStore, err := snapshots.NewStore(snapshotDB, snapshotDir) - if err != nil { - panic(err) - } - - return simapp.New( - logger, db, traceStore, true, skipUpgradeHeights, - cast.ToString(appOpts.Get(flags.FlagHome)), - cast.ToUint(appOpts.Get(server.FlagInvCheckPeriod)), - a.encCfg, - appOpts, - baseapp.SetPruning(pruningOpts), - baseapp.SetMinGasPrices(cast.ToString(appOpts.Get(server.FlagMinGasPrices))), - baseapp.SetHaltHeight(cast.ToUint64(appOpts.Get(server.FlagHaltHeight))), - baseapp.SetHaltTime(cast.ToUint64(appOpts.Get(server.FlagHaltTime))), - baseapp.SetMinRetainBlocks(cast.ToUint64(appOpts.Get(server.FlagMinRetainBlocks))), - baseapp.SetInterBlockCache(cache), - baseapp.SetTrace(cast.ToBool(appOpts.Get(server.FlagTrace))), - baseapp.SetIndexEvents(cast.ToStringSlice(appOpts.Get(server.FlagIndexEvents))), - baseapp.SetSnapshotStore(snapshotStore), - baseapp.SetSnapshotInterval(cast.ToUint64(appOpts.Get(server.FlagStateSyncSnapshotInterval))), - baseapp.SetSnapshotKeepRecent(cast.ToUint32(appOpts.Get(server.FlagStateSyncSnapshotKeepRecent))), - baseapp.SetIAVLCacheSize(cast.ToInt(appOpts.Get(server.FlagIAVLCacheSize))), - baseapp.SetIAVLDisableFastNode(cast.ToBool(appOpts.Get(server.FlagDisableIAVLFastNode))), - ) -} - -// appExport creates a new simapp (optionally at a given height) -// and exports state. -func (a appCreator) appExport( - logger log.Logger, db dbm.DB, traceStore io.Writer, height int64, forZeroHeight bool, jailAllowedAddrs []string, - appOpts servertypes.AppOptions, -) (servertypes.ExportedApp, error) { - var simApp *simapp.App - homePath, ok := appOpts.Get(flags.FlagHome).(string) - if !ok || homePath == "" { - return servertypes.ExportedApp{}, errors.New("application home not set") - } - - if height != -1 { - simApp = simapp.New(logger, db, traceStore, false, map[int64]bool{}, homePath, uint(1), a.encCfg, appOpts) - - if err := simApp.LoadHeight(height); err != nil { - return servertypes.ExportedApp{}, err - } - } else { - simApp = simapp.New(logger, db, traceStore, true, map[int64]bool{}, homePath, uint(1), a.encCfg, appOpts) - } - - return simApp.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs) -} diff --git a/cmd/interchain-security-pd/main.go b/cmd/interchain-security-pd/main.go index 09e145206a..d39371adc1 100644 --- a/cmd/interchain-security-pd/main.go +++ b/cmd/interchain-security-pd/main.go @@ -10,9 +10,9 @@ import ( ) func main() { - rootCmd, _ := cmd.NewRootCmd() + rootCmd := cmd.NewRootCmd() - if err := svrcmd.Execute(rootCmd, app.DefaultNodeHome); err != nil { + if err := svrcmd.Execute(rootCmd, "", app.DefaultNodeHome); err != nil { switch e := err.(type) { case server.ErrorCode: os.Exit(e.Code) diff --git a/cmd/interchain-security-sd/cmd/genaccounts.go b/cmd/interchain-security-sd/cmd/genaccounts.go deleted file mode 100644 index c3340dccad..0000000000 --- a/cmd/interchain-security-sd/cmd/genaccounts.go +++ /dev/null @@ -1,180 +0,0 @@ -package cmd - -import ( - "bufio" - "encoding/json" - "errors" - "fmt" - - "github.com/spf13/cobra" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/cosmos/cosmos-sdk/server" - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - authvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/cosmos/cosmos-sdk/x/genutil" - genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" -) - -const ( - flagVestingStart = "vesting-start-time" - flagVestingEnd = "vesting-end-time" - flagVestingAmt = "vesting-amount" -) - -// AddGenesisAccountCmd returns add-genesis-account cobra Command. -func AddGenesisAccountCmd(defaultNodeHome string) *cobra.Command { - cmd := &cobra.Command{ - Use: "add-genesis-account [address_or_key_name] [coin][,[coin]]", - Short: "Add a genesis account to genesis.json", - Long: `Add a genesis account to genesis.json. The provided account must specify -the account address or key name and a list of initial coins. If a key name is given, -the address will be looked up in the local Keybase. The list of initial tokens must -contain valid denominations. Accounts may optionally be supplied with vesting parameters. -`, - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx := client.GetClientContextFromCmd(cmd) - serverCtx := server.GetServerContextFromCmd(cmd) - config := serverCtx.Config - - config.SetRoot(clientCtx.HomeDir) - - var kr keyring.Keyring - addr, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - inBuf := bufio.NewReader(cmd.InOrStdin()) - keyringBackend, _ := cmd.Flags().GetString(flags.FlagKeyringBackend) - if keyringBackend != "" && clientCtx.Keyring == nil { - var err error - kr, err = keyring.New(sdk.KeyringServiceName(), keyringBackend, clientCtx.HomeDir, inBuf) - if err != nil { - return err - } - } else { - kr = clientCtx.Keyring - } - - info, err := kr.Key(args[0]) - if err != nil { - return fmt.Errorf("failed to get address from Keyring: %w", err) - } - addr = info.GetAddress() - } - - coins, err := sdk.ParseCoinsNormalized(args[1]) - if err != nil { - return fmt.Errorf("failed to parse coins: %w", err) - } - - vestingStart, _ := cmd.Flags().GetInt64(flagVestingStart) - vestingEnd, _ := cmd.Flags().GetInt64(flagVestingEnd) - vestingAmtStr, _ := cmd.Flags().GetString(flagVestingAmt) - - vestingAmt, err := sdk.ParseCoinsNormalized(vestingAmtStr) - if err != nil { - return fmt.Errorf("failed to parse vesting amount: %w", err) - } - - // create concrete account type based on input parameters - var genAccount authtypes.GenesisAccount - - balances := banktypes.Balance{Address: addr.String(), Coins: coins.Sort()} - baseAccount := authtypes.NewBaseAccount(addr, nil, 0, 0) - - if !vestingAmt.IsZero() { - baseVestingAccount := authvesting.NewBaseVestingAccount(baseAccount, vestingAmt.Sort(), vestingEnd) - - if (balances.Coins.IsZero() && !baseVestingAccount.OriginalVesting.IsZero()) || - baseVestingAccount.OriginalVesting.IsAnyGT(balances.Coins) { - return errors.New("vesting amount cannot be greater than total amount") - } - - switch { - case vestingStart != 0 && vestingEnd != 0: - genAccount = authvesting.NewContinuousVestingAccountRaw(baseVestingAccount, vestingStart) - - case vestingEnd != 0: - genAccount = authvesting.NewDelayedVestingAccountRaw(baseVestingAccount) - - default: - return errors.New("invalid vesting parameters; must supply start and end time or end time") - } - } else { - genAccount = baseAccount - } - - if err := genAccount.Validate(); err != nil { - return fmt.Errorf("failed to validate new genesis account: %w", err) - } - - genFile := config.GenesisFile() - appState, genDoc, err := genutiltypes.GenesisStateFromGenFile(genFile) - if err != nil { - return fmt.Errorf("failed to unmarshal genesis state: %w", err) - } - - authGenState := authtypes.GetGenesisStateFromAppState(clientCtx.Codec, appState) - - accs, err := authtypes.UnpackAccounts(authGenState.Accounts) - if err != nil { - return fmt.Errorf("failed to get accounts from any: %w", err) - } - - if accs.Contains(addr) { - return fmt.Errorf("cannot add account at existing address %s", addr) - } - - // Add the new account to the set of genesis accounts and sanitize the - // accounts afterwards. - accs = append(accs, genAccount) - accs = authtypes.SanitizeGenesisAccounts(accs) - - genAccs, err := authtypes.PackAccounts(accs) - if err != nil { - return fmt.Errorf("failed to convert accounts into any's: %w", err) - } - authGenState.Accounts = genAccs - - authGenStateBz, err := clientCtx.Codec.MarshalJSON(&authGenState) - if err != nil { - return fmt.Errorf("failed to marshal auth genesis state: %w", err) - } - - appState[authtypes.ModuleName] = authGenStateBz - - bankGenState := banktypes.GetGenesisStateFromAppState(clientCtx.Codec, appState) - bankGenState.Balances = append(bankGenState.Balances, balances) - bankGenState.Balances = banktypes.SanitizeGenesisBalances(bankGenState.Balances) - bankGenState.Supply = bankGenState.Supply.Add(balances.Coins...) - - bankGenStateBz, err := clientCtx.Codec.MarshalJSON(bankGenState) - if err != nil { - return fmt.Errorf("failed to marshal bank genesis state: %w", err) - } - - appState[banktypes.ModuleName] = bankGenStateBz - - appStateJSON, err := json.Marshal(appState) - if err != nil { - return fmt.Errorf("failed to marshal application genesis state: %w", err) - } - - genDoc.AppState = appStateJSON - return genutil.ExportGenesisFile(genDoc, genFile) - }, - } - - cmd.Flags().String(flags.FlagHome, defaultNodeHome, "The application home directory") - cmd.Flags().String(flags.FlagKeyringBackend, flags.DefaultKeyringBackend, "Select keyring's backend (os|file|kwallet|pass|test)") - cmd.Flags().String(flagVestingAmt, "", "amount of coins for vesting accounts") - cmd.Flags().Int64(flagVestingStart, 0, "schedule start time (unix epoch) for vesting accounts") - cmd.Flags().Int64(flagVestingEnd, 0, "schedule end time (unix epoch) for vesting accounts") - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} diff --git a/cmd/interchain-security-sd/cmd/root.go b/cmd/interchain-security-sd/cmd/root.go index 56f9ad667b..955da62464 100644 --- a/cmd/interchain-security-sd/cmd/root.go +++ b/cmd/interchain-security-sd/cmd/root.go @@ -4,16 +4,15 @@ import ( "errors" "io" "os" - "path/filepath" + dbm "github.com/cometbft/cometbft-db" + "github.com/cometbft/cometbft/libs/log" serverconfig "github.com/cosmos/cosmos-sdk/server/config" - "github.com/spf13/cast" "github.com/spf13/cobra" - tmcli "github.com/tendermint/tendermint/libs/cli" - "github.com/tendermint/tendermint/libs/log" - dbm "github.com/tendermint/tm-db" + "github.com/spf13/viper" - "github.com/cosmos/cosmos-sdk/baseapp" + rosettaCmd "cosmossdk.io/tools/rosetta/cmd" + tmcfg "github.com/cometbft/cometbft/config" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/config" "github.com/cosmos/cosmos-sdk/client/debug" @@ -23,34 +22,40 @@ import ( "github.com/cosmos/cosmos-sdk/client/rpc" "github.com/cosmos/cosmos-sdk/server" servertypes "github.com/cosmos/cosmos-sdk/server/types" - "github.com/cosmos/cosmos-sdk/snapshots" - "github.com/cosmos/cosmos-sdk/store" + simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" "github.com/cosmos/cosmos-sdk/x/auth/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/crisis" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" "github.com/cosmos/interchain-security/v2/app/params" - simapp "github.com/cosmos/interchain-security/v2/app/sovereign" + sovereignApp "github.com/cosmos/interchain-security/v2/app/sovereign" ) // NewRootCmd creates a new root command for simd. It is called once in the // main function. -func NewRootCmd() (*cobra.Command, params.EncodingConfig) { - encodingConfig := simapp.MakeTestEncodingConfig() +func NewRootCmd() *cobra.Command { + // we "pre"-instantiate the application for getting the injected/configured encoding configuration + tempApp := sovereignApp.New(log.NewNopLogger(), dbm.NewMemDB(), nil, true, simtestutil.NewAppOptionsWithFlagHome(sovereignApp.DefaultNodeHome)) + encodingConfig := params.EncodingConfig{ + InterfaceRegistry: tempApp.InterfaceRegistry(), + Codec: tempApp.AppCodec(), + TxConfig: tempApp.TxConfig(), + Amino: tempApp.LegacyAmino(), + } + initClientCtx := client.Context{}. - WithCodec(encodingConfig.Marshaler). + WithCodec(encodingConfig.Codec). WithInterfaceRegistry(encodingConfig.InterfaceRegistry). WithTxConfig(encodingConfig.TxConfig). WithLegacyAmino(encodingConfig.Amino). WithInput(os.Stdin). WithAccountRetriever(types.AccountRetriever{}). - WithHomeDir(simapp.DefaultNodeHome). + WithHomeDir(sovereignApp.DefaultNodeHome). WithViper("") // In simapp, we don't use any prefix for env variables. rootCmd := &cobra.Command{ - Use: "interchain-security-sd", + Use: "simd", Short: "simulation app", PersistentPreRunE: func(cmd *cobra.Command, _ []string) error { // set the default command outputs @@ -72,14 +77,53 @@ func NewRootCmd() (*cobra.Command, params.EncodingConfig) { } customAppTemplate, customAppConfig := initAppConfig() + customTMConfig := initTendermintConfig() - return server.InterceptConfigsPreRunHandler(cmd, customAppTemplate, customAppConfig) + return server.InterceptConfigsPreRunHandler(cmd, customAppTemplate, customAppConfig, customTMConfig) }, } initRootCmd(rootCmd, encodingConfig) - return rootCmd, encodingConfig + return rootCmd +} + +// initTendermintConfig helps to override default Tendermint Config values. +// return tmcfg.DefaultConfig if no custom configuration is required for the application. +func initTendermintConfig() *tmcfg.Config { + cfg := tmcfg.DefaultConfig() + + // these values put a higher strain on node memory + // cfg.P2P.MaxNumInboundPeers = 100 + // cfg.P2P.MaxNumOutboundPeers = 40 + + return cfg +} + +func txCommand() *cobra.Command { + cmd := &cobra.Command{ + Use: "tx", + Short: "Transactions subcommands", + DisableFlagParsing: false, + SuggestionsMinimumDistance: 2, + RunE: client.ValidateCmd, + } + + cmd.AddCommand( + authcmd.GetSignCommand(), + authcmd.GetSignBatchCommand(), + authcmd.GetMultiSignCommand(), + authcmd.GetMultiSignBatchCmd(), + authcmd.GetValidateSignaturesCommand(), + authcmd.GetBroadcastCommand(), + authcmd.GetEncodeCommand(), + authcmd.GetDecodeCommand(), + authcmd.GetAuxToFeeCommand(), + ) + + sovereignApp.ModuleBasics.AddTxCommands(cmd) + + return cmd } // initAppConfig helps to override default appConfig template and configs. @@ -143,44 +187,106 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) { cfg := sdk.GetConfig() cfg.Seal() - a := appCreator{encodingConfig} rootCmd.AddCommand( - genutilcli.InitCmd(simapp.ModuleBasics, simapp.DefaultNodeHome), - genutilcli.CollectGenTxsCmd(banktypes.GenesisBalancesIterator{}, simapp.DefaultNodeHome), - genutilcli.MigrateGenesisCmd(), - genutilcli.GenTxCmd(simapp.ModuleBasics, encodingConfig.TxConfig, banktypes.GenesisBalancesIterator{}, simapp.DefaultNodeHome), - genutilcli.ValidateGenesisCmd(simapp.ModuleBasics), - AddGenesisAccountCmd(simapp.DefaultNodeHome), - tmcli.NewCompletionCmd(rootCmd, true), + genutilcli.InitCmd(sovereignApp.ModuleBasics, sovereignApp.DefaultNodeHome), debug.Cmd(), config.Cmd(), - pruning.PruningCmd(a.newApp), + pruning.PruningCmd(newApp), ) - server.AddCommands(rootCmd, simapp.DefaultNodeHome, a.newApp, a.appExport, addModuleInitFlags) + server.AddCommands(rootCmd, sovereignApp.DefaultNodeHome, newApp, appExport, addModuleInitFlags) - // add keybase, auxiliary RPC, query, and tx child commands + // add keybase, auxiliary RPC, query, genesis, and tx child commands rootCmd.AddCommand( rpc.StatusCommand(), + genesisCommand(encodingConfig), queryCommand(), txCommand(), - keys.Commands(simapp.DefaultNodeHome), + keys.Commands(sovereignApp.DefaultNodeHome), ) // add rosetta - rootCmd.AddCommand(server.RosettaCommand(encodingConfig.InterfaceRegistry, encodingConfig.Marshaler)) + rootCmd.AddCommand(rosettaCmd.RosettaCommand(encodingConfig.InterfaceRegistry, encodingConfig.Codec)) +} + +// newApp is an appCreator +// newApp creates the application +func newApp( + logger log.Logger, + db dbm.DB, + traceStore io.Writer, + appOpts servertypes.AppOptions, +) servertypes.Application { + baseappOptions := server.DefaultBaseappOptions(appOpts) + + return sovereignApp.New( + logger, db, traceStore, true, + appOpts, + baseappOptions..., + ) +} + +// appExport creates a new simapp (optionally at a given height) and exports state. +func appExport( + logger log.Logger, + db dbm.DB, + traceStore io.Writer, + height int64, + forZeroHeight bool, + jailAllowedAddrs []string, + appOpts servertypes.AppOptions, + modulesToExport []string, +) (servertypes.ExportedApp, error) { + var simApp *sovereignApp.App + + // this check is necessary as we use the flag in x/upgrade. + // we can exit more gracefully by checking the flag here. + homePath, ok := appOpts.Get(flags.FlagHome).(string) + if !ok || homePath == "" { + return servertypes.ExportedApp{}, errors.New("application home not set") + } + + viperAppOpts, ok := appOpts.(*viper.Viper) + if !ok { + return servertypes.ExportedApp{}, errors.New("appOpts is not viper.Viper") + } + + // overwrite the FlagInvCheckPeriod + viperAppOpts.Set(server.FlagInvCheckPeriod, 1) + appOpts = viperAppOpts + + if height != -1 { + simApp = sovereignApp.New(logger, db, traceStore, false, appOpts) + + if err := simApp.LoadHeight(height); err != nil { + return servertypes.ExportedApp{}, err + } + } else { + simApp = sovereignApp.New(logger, db, traceStore, true, appOpts) + } + + return simApp.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs, modulesToExport) } func addModuleInitFlags(startCmd *cobra.Command) { crisis.AddModuleInitFlags(startCmd) } +// genesisCommand builds genesis-related `simd genesis` command. Users may provide application specific commands as a parameter +func genesisCommand(encodingConfig params.EncodingConfig, cmds ...*cobra.Command) *cobra.Command { + cmd := genutilcli.GenesisCoreCommand(encodingConfig.TxConfig, sovereignApp.ModuleBasics, sovereignApp.DefaultNodeHome) + for _, sub_cmd := range cmds { + cmd.AddCommand(sub_cmd) + } + return cmd +} + func queryCommand() *cobra.Command { cmd := &cobra.Command{ Use: "query", Aliases: []string{"q"}, Short: "Querying subcommands", - DisableFlagParsing: true, + DisableFlagParsing: false, SuggestionsMinimumDistance: 2, RunE: client.ValidateCmd, } @@ -191,115 +297,11 @@ func queryCommand() *cobra.Command { rpc.BlockCommand(), authcmd.QueryTxsByEventsCmd(), authcmd.QueryTxCmd(), - ) - - simapp.ModuleBasics.AddQueryCommands(cmd) - cmd.PersistentFlags().String(flags.FlagChainID, "", "The network chain ID") - - return cmd -} - -func txCommand() *cobra.Command { - cmd := &cobra.Command{ - Use: "tx", - Short: "Transactions subcommands", - DisableFlagParsing: true, - SuggestionsMinimumDistance: 2, - RunE: client.ValidateCmd, - } - - cmd.AddCommand( - authcmd.GetSignCommand(), - authcmd.GetSignBatchCommand(), - authcmd.GetMultiSignCommand(), - authcmd.GetMultiSignBatchCmd(), - authcmd.GetValidateSignaturesCommand(), - authcmd.GetBroadcastCommand(), authcmd.GetEncodeCommand(), authcmd.GetDecodeCommand(), ) - simapp.ModuleBasics.AddTxCommands(cmd) - cmd.PersistentFlags().String(flags.FlagChainID, "", "The network chain ID") + sovereignApp.ModuleBasics.AddQueryCommands(cmd) return cmd } - -type appCreator struct { - encCfg params.EncodingConfig -} - -// newApp is an appCreator -func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, appOpts servertypes.AppOptions) servertypes.Application { - var cache sdk.MultiStorePersistentCache - - if cast.ToBool(appOpts.Get(server.FlagInterBlockCache)) { - cache = store.NewCommitKVStoreCacheManager() - } - - skipUpgradeHeights := make(map[int64]bool) - for _, h := range cast.ToIntSlice(appOpts.Get(server.FlagUnsafeSkipUpgrades)) { - skipUpgradeHeights[int64(h)] = true - } - - pruningOpts, err := server.GetPruningOptionsFromFlags(appOpts) - if err != nil { - panic(err) - } - - snapshotDir := filepath.Join(cast.ToString(appOpts.Get(flags.FlagHome)), "data", "snapshots") - snapshotDB, err := sdk.NewLevelDB("metadata", snapshotDir) - if err != nil { - panic(err) - } - snapshotStore, err := snapshots.NewStore(snapshotDB, snapshotDir) - if err != nil { - panic(err) - } - - return simapp.New( - logger, db, traceStore, true, skipUpgradeHeights, - cast.ToString(appOpts.Get(flags.FlagHome)), - cast.ToUint(appOpts.Get(server.FlagInvCheckPeriod)), - a.encCfg, - appOpts, - baseapp.SetPruning(pruningOpts), - baseapp.SetMinGasPrices(cast.ToString(appOpts.Get(server.FlagMinGasPrices))), - baseapp.SetHaltHeight(cast.ToUint64(appOpts.Get(server.FlagHaltHeight))), - baseapp.SetHaltTime(cast.ToUint64(appOpts.Get(server.FlagHaltTime))), - baseapp.SetMinRetainBlocks(cast.ToUint64(appOpts.Get(server.FlagMinRetainBlocks))), - baseapp.SetInterBlockCache(cache), - baseapp.SetTrace(cast.ToBool(appOpts.Get(server.FlagTrace))), - baseapp.SetIndexEvents(cast.ToStringSlice(appOpts.Get(server.FlagIndexEvents))), - baseapp.SetSnapshotStore(snapshotStore), - baseapp.SetSnapshotInterval(cast.ToUint64(appOpts.Get(server.FlagStateSyncSnapshotInterval))), - baseapp.SetSnapshotKeepRecent(cast.ToUint32(appOpts.Get(server.FlagStateSyncSnapshotKeepRecent))), - baseapp.SetIAVLCacheSize(cast.ToInt(appOpts.Get(server.FlagIAVLCacheSize))), - baseapp.SetIAVLDisableFastNode(cast.ToBool(appOpts.Get(server.FlagDisableIAVLFastNode))), - ) -} - -// appExport creates a new simapp (optionally at a given height) -// and exports state. -func (a appCreator) appExport( - logger log.Logger, db dbm.DB, traceStore io.Writer, height int64, forZeroHeight bool, jailAllowedAddrs []string, - appOpts servertypes.AppOptions, -) (servertypes.ExportedApp, error) { - var simApp *simapp.App - homePath, ok := appOpts.Get(flags.FlagHome).(string) - if !ok || homePath == "" { - return servertypes.ExportedApp{}, errors.New("application home not set") - } - - if height != -1 { - simApp = simapp.New(logger, db, traceStore, false, map[int64]bool{}, homePath, uint(1), a.encCfg, appOpts) - - if err := simApp.LoadHeight(height); err != nil { - return servertypes.ExportedApp{}, err - } - } else { - simApp = simapp.New(logger, db, traceStore, true, map[int64]bool{}, homePath, uint(1), a.encCfg, appOpts) - } - - return simApp.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs) -} diff --git a/cmd/interchain-security-sd/main.go b/cmd/interchain-security-sd/main.go index 6b43e7b396..42675b10d2 100644 --- a/cmd/interchain-security-sd/main.go +++ b/cmd/interchain-security-sd/main.go @@ -10,9 +10,9 @@ import ( ) func main() { - rootCmd, _ := cmd.NewRootCmd() + rootCmd := cmd.NewRootCmd() - if err := svrcmd.Execute(rootCmd, app.DefaultNodeHome); err != nil { + if err := svrcmd.Execute(rootCmd, "", app.DefaultNodeHome); err != nil { switch e := err.(type) { case server.ErrorCode: os.Exit(e.Code) diff --git a/docs/docs/features/key-assignment.md b/docs/docs/features/key-assignment.md index 54d93359a7..c68343255c 100644 --- a/docs/docs/features/key-assignment.md +++ b/docs/docs/features/key-assignment.md @@ -3,6 +3,7 @@ sidebar_position: 1 --- # Key Assignment + Key Assignment (aka. as key delegation) allows validator operators to use different consensus keys for each consumer chain validator node that they operate. There are various reasons to use different consensus keys on different chains, but the main benefit is that validator's provider chain consensus key cannot be compromised if their consumer chain node (or other infrastructure) gets compromised. Interchain security module adds queries and transactions for assigning keys on consumer chains. @@ -14,40 +15,42 @@ By sending an `AssignConsumerKey` transaction, validators are able to indicate w Key assignment is handled only by the provider chain - the consumer chains are not aware of the fact that different consensus keys represent the same validator entity. ::: - ## Rules + - a key can be assigned before the consumer addition proposal passes on the provider - validator A cannot assign consumer key K to consumer chain X if there is already a validator B (B!=A) using K on the provider - validator A cannot assign consumer key K to consumer chain X if there is already a validator B using K on X - a new validator on the provider cannot use a consensus key K if K is already used by any validator on any consumer chain :::tip -Validators can use a different key for each consumer chain. +Validators can use a different key for each consumer chain. ::: - ## Adding a key First, create a new node on the consumer chain using the equivalent: + ```bash consumerd init ``` Then query your node for the consensus key. + ```bash consumerd tendermint show-validator # {"@type":"/cosmos.crypto.ed25519.PubKey","key":""} ``` Then, make an `assign-consensus-key` transaction on the provider chain in order to inform the provider chain about the consensus key you will be using for a specific consumer chain. -``` -gaiad tx provider assign-consensus-key '' --from --home --gas 900000 -b block -y -o json +```bash +gaiad tx provider assign-consensus-key '' --from --home --gas 900000 -b sync -y -o json ``` - `consumer-chain-id` is the string identifier of the consumer chain, as assigned on the provider chain - `consumer-pub-key` has the following format `{"@type":"/cosmos.crypto.ed25519.PubKey","key":""}` Check that the key was assigned correcly by querying the provider: + ```bash gaiad query provider validator-consumer-key cosmosvalcons1e....3xsj3ayzf4uv6 ``` @@ -63,8 +66,9 @@ gaiad query provider validator-provider-key consumervalcons1 You must use a `valcons` address. You can obtain it by querying your node on the consumer `consumerd tendermint show-address` ## Changing a key -To change your key, simply repeat all of the steps listed above. Take note that your old key will be remembered for at least the unbonding period of the consumer chain so any slashes can be correctly applied +To change your key, simply repeat all of the steps listed above. Take note that your old key will be remembered for at least the unbonding period of the consumer chain so any slashes can be correctly applied ## Removing a key + To remove a key, simply switch it back to the consensus key you have assigned on the provider chain by following steps in the `Adding a key` section and using your provider consensus key. diff --git a/docs/docs/validators/joining-testnet.md b/docs/docs/validators/joining-testnet.md index b9d9f8f9da..0e99c3710b 100644 --- a/docs/docs/validators/joining-testnet.md +++ b/docs/docs/validators/joining-testnet.md @@ -3,7 +3,8 @@ sidebar_position: 2 title: Joining Replicated Security testnet --- -# Introduction +## Introduction + This short guide will teach you how to join the [Replicated Security testnet](https://github.com/cosmos/testnets/tree/master/replicated-security). The experience gained in the testnet will prepare you for validating interchain secured chains. @@ -14,14 +15,14 @@ Provider and consumer chain represent distinct networks and infrastructures oper For general information about running cosmos-sdk based chains check out the [validator basics](https://hub.cosmos.network/main/validators/validator-setup.html) and [Running a Node section](https://docs.cosmos.network/main/run-node/run-node) of Cosmos SDK docs ::: -# Joining the provider chain +## Joining the provider chain + :::info At present, all validators of the provider chain must also validate all governance approved consumer chains. The consumer chains cannot have a validator set different than the provider, which means they cannot introduce validators that are not also validating the provider chain. ::: A comprehensive guide is available [here](https://github.com/cosmos/testnets/tree/master/replicated-security/provider). - ## Initialization First, initialize your `$NODE_HOME` using the `provider` chain binary. @@ -37,14 +38,16 @@ gaiad init $NODE_MONIKER --chain-id $CHAIN_ID --home $NODE_HOME Add your key to the keyring - more details available [here](https://docs.cosmos.network/main/run-node/keyring). In this example we will use the `test` keyring-backend. This option is not safe to use in production. + ```bash gaiad keys add --keyring-backend test # save the address as variable for later use MY_VALIDATOR_ADDRESS=$(gaiad keys show my_validator -a --keyring-backend test) -``` +``` Before issuing any transactions, use the `provider` testnet faucet to add funds to your address. + ```bash curl https://faucet.rs-testnet.polypore.xyz/request?address=$MY_VALIDATOR_ADDRESS&chain=provider @@ -82,6 +85,7 @@ Check this [guide](https://hub.cosmos.network/main/validators/validator-setup.ht After this step, your validator is created and you can start your node and catch up to the rest of the network. It is recommended that you use `statesync` to catch up to the rest of the network. You can use this script to modify your `config.toml` with the required statesync parameters. + ```bash # create the statesync script $: cd $NODE_HOME @@ -107,11 +111,13 @@ s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"|" $NODE_HOME/confi ``` Then, you can execute the script: + ```bash $: ./statesync.sh # setup config.toml for statesync ``` Finally, copy the provider genesis and start your node: + ```bash $: GENESIS_URL=https://github.com/cosmos/testnets/raw/master/replicated-security/provider/provider-genesis.json $: wget $GENESIS_URL -O genesis.json @@ -122,7 +128,8 @@ $: gaiad start --x-crisis-skip-assert-invariants --home $NODE_HOME --p2p.seeds=" Additional scripts to setup your nodes are available [here](https://github.com/cosmos/testnets/blob/master/replicated-security/provider/join-rs-provider.sh) and [here](https://github.com/cosmos/testnets/blob/master/replicated-security/provider/join-rs-provider-cv.sh). The scripts will configure your node and create the required services - the scripts only work in linux environments. -# Joining consumer chains +## Joining consumer chains + :::tip Once you reach the active set on the provider chain, you will be required to validate all available consumer chains. @@ -136,6 +143,7 @@ To join consumer chains, simply replicate the steps above for each consumer usin When running the provider chain and consumers on the same machine please update the `PORT` numbers for each of them and make sure they do not overlap (otherwise the binaries will not start). Important ports to re-configure: + - `--rpc.laddr` - `--p2p.laddr` - `--api.address` @@ -144,11 +152,13 @@ Important ports to re-configure: ::: ## Re-using consensus key + To reuse the key on the provider and consumer chains, simply initialize your consumer chain and place the `priv_validator_key.json` into the home directory of your consumer chain (`/config/priv_validator_key.json`). When you start the chain, the consensus key will be the same on the provider and the consumer chain. ## Assigning consensus keys + Whenever you initialize a new node, it will be configured with a consensus key you can use. ```bash @@ -161,16 +171,18 @@ consumerd tendermint show-validator ``` Then, let the provider know which key you will be using for the consumer chain: + ```bash # machine running the provider chain -gaiad tx provider assign-consensus-key consumer-1 '' --from --home $NODE_HOME --gas 900000 -b block -y -o json +gaiad tx provider assign-consensus-key consumer-1 '' --from --home $NODE_HOME --gas 900000 -b sync -y -o json ``` After this step, you are ready to copy the consumer genesis into your nodes's `/config` folder, start your consumer chain node and catch up to the network. ## Baryon -You can find the onboarding repo instructions for the Baryon chain [here](https://github.com/cosmos/testnets/blob/master/replicated-security/baryon-1/README.md) +You can find the onboarding repo instructions for the Baryon chain [here](https://github.com/cosmos/testnets/blob/master/replicated-security/baryon-1/README.md) ## Noble + You can find the onboarding repo instructions for the Noble chain [here](https://github.com/cosmos/testnets/blob/master/replicated-security/noble-1/README.md) diff --git a/go.mod b/go.mod index 58b8eaa667..b199160aa2 100644 --- a/go.mod +++ b/go.mod @@ -3,158 +3,178 @@ module github.com/cosmos/interchain-security/v2 go 1.19 require ( - github.com/confio/ics23/go v0.9.0 - github.com/cosmos/cosmos-sdk v0.45.15 - github.com/cosmos/ibc-go/v4 v4.4.2 - github.com/gogo/protobuf v1.3.3 + cosmossdk.io/errors v1.0.0-beta.7 + cosmossdk.io/math v1.0.1 + github.com/cometbft/cometbft v0.37.1 + github.com/cometbft/cometbft-db v0.8.0 + github.com/cosmos/cosmos-sdk v0.47.3 + github.com/cosmos/gogoproto v1.4.10 + github.com/cosmos/ibc-go/v7 v7.0.0 + github.com/cosmos/ics23/go v0.10.0 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.3 - github.com/gorilla/mux v1.8.0 + github.com/gorilla/mux v1.8.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/kylelemons/godebug v1.1.0 github.com/oxyno-zeta/gomock-extra-matcher v1.1.0 - github.com/rakyll/statik v0.1.7 - github.com/regen-network/cosmos-proto v0.3.1 - github.com/spf13/cast v1.5.1 - github.com/spf13/cobra v1.7.0 - github.com/stretchr/testify v1.8.4 - github.com/tendermint/tendermint v0.34.27 - github.com/tendermint/tm-db v0.6.7 + github.com/rakyll/statik v0.1.7 // indirect + github.com/spf13/cast v1.5.0 + github.com/spf13/cobra v1.6.1 + github.com/stretchr/testify v1.8.2 github.com/tidwall/gjson v1.14.4 - golang.org/x/crypto v0.5.0 // indirect - golang.org/x/exp v0.0.0-20221019170559-20944726eadf - golang.org/x/net v0.7.0 // indirect - golang.org/x/sys v0.5.0 // indirect - google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa - google.golang.org/grpc v1.52.3 + golang.org/x/crypto v0.7.0 // indirect + golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc + golang.org/x/net v0.9.0 // indirect + golang.org/x/sys v0.7.0 // indirect + google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 + google.golang.org/grpc v1.55.0 google.golang.org/protobuf v1.30.0 gopkg.in/yaml.v2 v2.4.0 ) -require cosmossdk.io/errors v1.0.0-beta.7 - require ( - cosmossdk.io/api v0.2.6 // indirect + cloud.google.com/go v0.110.0 // indirect + cloud.google.com/go/compute v1.18.0 // indirect + cloud.google.com/go/compute/metadata v0.2.3 // indirect + cloud.google.com/go/iam v0.12.0 // indirect + cloud.google.com/go/storage v1.29.0 // indirect + cosmossdk.io/api v0.3.1 cosmossdk.io/core v0.5.1 // indirect cosmossdk.io/depinject v1.0.0-alpha.3 // indirect - filippo.io/edwards25519 v1.0.0-rc.1 // indirect + cosmossdk.io/tools/rosetta v0.2.1 + filippo.io/edwards25519 v1.0.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.1 // indirect - github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect - github.com/DataDog/zstd v1.5.0 // indirect - github.com/HdrHistogram/hdrhistogram-go v1.1.2 // indirect - github.com/Workiva/go-datastructures v1.0.53 // indirect + github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d // indirect github.com/armon/go-metrics v0.4.1 // indirect + github.com/aws/aws-sdk-go v1.44.203 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cenkalti/backoff/v4 v4.1.3 // indirect github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/cockroachdb/errors v1.9.1 // indirect - github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20220817183557-09c6e030a677 // indirect - github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/chzyer/readline v1.5.1 // indirect + github.com/cockroachdb/apd/v2 v2.0.2 // indirect github.com/coinbase/rosetta-sdk-go v0.7.9 // indirect - github.com/cometbft/cometbft-db v0.7.0 // indirect - github.com/cosmos/btcutil v1.0.4 // indirect - github.com/cosmos/cosmos-db v0.0.0-20221226095112-f3c38ecb5e32 // indirect - github.com/cosmos/cosmos-proto v1.0.0-beta.1 // indirect + github.com/confio/ics23/go v0.9.0 // indirect + github.com/cosmos/btcutil v1.0.5 // indirect + github.com/cosmos/cosmos-proto v1.0.0-beta.2 github.com/cosmos/go-bip39 v1.0.0 // indirect - github.com/cosmos/gorocksdb v1.2.0 // indirect - github.com/cosmos/iavl v0.19.5 // indirect + github.com/cosmos/gogogateway v1.2.0 // indirect + github.com/cosmos/iavl v0.20.0 // indirect github.com/cosmos/ledger-cosmos-go v0.12.2 // indirect - github.com/creachadair/taskgroup v0.3.2 // indirect + github.com/cosmos/rosetta-sdk-go v0.10.0 // indirect + github.com/creachadair/taskgroup v0.4.2 // indirect github.com/danieljoos/wincred v1.1.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect github.com/dgraph-io/badger/v2 v2.2007.4 // indirect - github.com/dgraph-io/ristretto v0.1.0 // indirect + github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect - github.com/dustin/go-humanize v1.0.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect github.com/dvsekhvalnov/jose2go v1.5.0 // indirect github.com/felixge/httpsnoop v1.0.2 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/getsentry/sentry-go v0.17.0 // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect - github.com/go-logfmt/logfmt v0.5.1 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-playground/universal-translator v0.18.0 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect - github.com/gogo/gateway v1.1.0 // indirect - github.com/golang/glog v1.0.0 // indirect + github.com/gogo/googleapis v1.4.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/glog v1.1.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.1.2 // indirect - github.com/google/gofuzz v1.2.0 // indirect + github.com/google/go-cmp v0.5.9 // indirect github.com/google/orderedcode v0.0.1 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect + github.com/googleapis/gax-go/v2 v2.7.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/gtank/merlin v0.1.1 // indirect github.com/gtank/ristretto255 v0.1.2 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-getter v1.7.1 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-safetemp v1.0.0 // indirect github.com/hashicorp/go-uuid v1.0.2 // indirect + github.com/hashicorp/go-version v1.6.0 // indirect github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 // indirect + github.com/hdevalence/ed25519consensus v0.1.0 // indirect + github.com/huandu/skiplist v1.2.0 // indirect github.com/improbable-eng/grpc-web v0.15.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect - github.com/klauspost/compress v1.15.11 // indirect - github.com/kr/pretty v0.3.1 // indirect - github.com/kr/text v0.2.0 // indirect - github.com/lib/pq v1.10.6 // indirect + github.com/klauspost/compress v1.16.3 // indirect + github.com/leodido/go-urn v1.2.1 // indirect + github.com/lib/pq v1.10.7 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/linxGnu/grocksdb v1.7.10 // indirect - github.com/magiconair/properties v1.8.6 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect + github.com/linxGnu/grocksdb v1.7.16 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/manifoldco/promptui v0.9.0 // indirect + github.com/mattn/go-isatty v0.0.18 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/minio/highwayhash v1.0.2 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mtibben/percent v0.2.1 // indirect - github.com/onsi/ginkgo v1.16.4 // indirect - github.com/onsi/gomega v1.20.0 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.5 // indirect - github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect + github.com/pelletier/go-toml/v2 v2.0.7 // indirect + github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_golang v1.14.0 // indirect github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect + github.com/prometheus/common v0.42.0 // indirect + github.com/prometheus/procfs v0.9.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/rogpeppe/go-internal v1.9.0 // indirect - github.com/rs/cors v1.8.2 // indirect - github.com/rs/zerolog v1.27.0 // indirect + github.com/rs/cors v1.8.3 // indirect github.com/sasha-s/go-deadlock v0.3.1 // indirect - github.com/spf13/afero v1.9.2 // indirect + github.com/spf13/afero v1.9.3 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.14.0 // indirect - github.com/subosito/gotenv v1.4.1 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect - github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c // indirect + github.com/subosito/gotenv v1.4.2 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/tendermint/go-amino v0.16.0 // indirect - github.com/tidwall/btree v1.5.0 // indirect + github.com/tidwall/btree v1.6.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect + github.com/ugorji/go/codec v1.2.7 // indirect + github.com/ulikunitz/xz v0.5.11 // indirect github.com/zondax/hid v0.9.1 // indirect github.com/zondax/ledger-go v0.14.1 // indirect - go.etcd.io/bbolt v1.3.6 // indirect - golang.org/x/term v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect + go.etcd.io/bbolt v1.3.7 // indirect + go.opencensus.io v0.24.0 // indirect + golang.org/x/oauth2 v0.6.0 // indirect + golang.org/x/term v0.7.0 // indirect + golang.org/x/text v0.9.0 // indirect + golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect + google.golang.org/api v0.110.0 // indirect + google.golang.org/appengine v1.6.7 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect nhooyr.io/websocket v1.8.6 // indirect + pgregory.net/rapid v0.5.5 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect ) -replace ( - github.com/cosmos/cosmos-sdk => github.com/cosmos/cosmos-sdk v0.45.15-ics - github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 - github.com/tendermint/tendermint => github.com/cometbft/cometbft v0.34.28 - google.golang.org/grpc => google.golang.org/grpc v1.33.2 +require github.com/spf13/viper v1.15.0 + +require ( + cosmossdk.io/log v1.1.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/rs/zerolog v1.29.1 // indirect ) + +// following versions might cause unexpected behavior +replace github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 diff --git a/go.sum b/go.sum index ed38bf1bab..d175ed9849 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,4 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= @@ -18,84 +19,229 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.18.0 h1:FEigFqoDbys2cvFkZ9Fjq4gnHBP55anJ0yQyau2f9oY= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v0.12.0 h1:DRtTY29b75ciH6Ov1PHb4/iat2CLCvrOm40Q0a6DFpE= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.29.0 h1:6weCgzRvMg7lzuUurI4697AqIRPU1SvzHhynwpW31jI= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= -cosmossdk.io/api v0.2.6 h1:AoNwaLLapcLsphhMK6+o0kZl+D6MMUaHVqSdwinASGU= -cosmossdk.io/api v0.2.6/go.mod h1:u/d+GAxil0nWpl1XnQL8nkziQDIWuBDhv8VnDm/s6dI= +cosmossdk.io/api v0.3.1 h1:NNiOclKRR0AOlO4KIqeaG6PS6kswOMhHD0ir0SscNXE= +cosmossdk.io/api v0.3.1/go.mod h1:DfHfMkiNA2Uhy8fj0JJlOCYOBp4eWUUJ1te5zBGNyIw= cosmossdk.io/core v0.5.1 h1:vQVtFrIYOQJDV3f7rw4pjjVqc1id4+mE0L9hHP66pyI= cosmossdk.io/core v0.5.1/go.mod h1:KZtwHCLjcFuo0nmDc24Xy6CRNEL9Vl/MeimQ2aC7NLE= cosmossdk.io/depinject v1.0.0-alpha.3 h1:6evFIgj//Y3w09bqOUOzEpFj5tsxBqdc5CfkO7z+zfw= cosmossdk.io/depinject v1.0.0-alpha.3/go.mod h1:eRbcdQ7MRpIPEM5YUJh8k97nxHpYbc3sMUnEtt8HPWU= cosmossdk.io/errors v1.0.0-beta.7 h1:gypHW76pTQGVnHKo6QBkb4yFOJjC+sUGRc5Al3Odj1w= cosmossdk.io/errors v1.0.0-beta.7/go.mod h1:mz6FQMJRku4bY7aqS/Gwfcmr/ue91roMEKAmDUDpBfE= +cosmossdk.io/log v1.1.0 h1:v0ogPHYeTzPcBTcPR1A3j1hkei4pZama8kz8LKlCMv0= +cosmossdk.io/log v1.1.0/go.mod h1:6zjroETlcDs+mm62gd8Ig7mZ+N+fVOZS91V17H+M4N4= +cosmossdk.io/math v1.0.1 h1:Qx3ifyOPaMLNH/89WeZFH268yCvU4xEcnPLu3sJqPPg= +cosmossdk.io/math v1.0.1/go.mod h1:Ygz4wBHrgc7g0N+8+MrnTfS9LLn9aaTGa9hKopuym5k= +cosmossdk.io/tools/rosetta v0.2.1 h1:ddOMatOH+pbxWbrGJKRAawdBkPYLfKXutK9IETnjYxw= +cosmossdk.io/tools/rosetta v0.2.1/go.mod h1:Pqdc1FdvkNV3LcNIkYWt2RQY6IP1ge6YWZk8MhhO9Hw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -filippo.io/edwards25519 v1.0.0-rc.1 h1:m0VOOB23frXZvAOK44usCgLWvtsxIoMCTBGJZlpmGfU= filippo.io/edwards25519 v1.0.0-rc.1/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= +filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= +filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= git.sr.ht/~sircmpwn/getopt v0.0.0-20191230200459-23622cc906b3/go.mod h1:wMEGFFFNuPos7vHmWXfszqImLppbc0wEhh6JBfJIUgw= git.sr.ht/~sircmpwn/go-bare v0.0.0-20210406120253-ab86bc2846d9/go.mod h1:BVJwbDfVjCjoFiKrhkei6NdGcZYpkDkdyCdg1ukytRA= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= github.com/99designs/keyring v1.2.1 h1:tYLp1ULvO7i3fI5vE21ReQuj99QFSs7lGm0xWyJo87o= github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ChainSafe/go-schnorrkel v1.0.0 h1:3aDA67lAykLaG1y3AOjs88dMxC88PgUuHRrLeDnvGIM= -github.com/ChainSafe/go-schnorrkel v1.0.0/go.mod h1:dpzHYVxLZcp8pjlV+O+UR8K0Hp/z7vcchBSbMBEhCw4= -github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= -github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= +github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= +github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= -github.com/DataDog/zstd v1.5.0 h1:+K/VEwIAaPcHiMtQvpLD4lqW7f0Gk3xdYZmI1hD+CXo= github.com/DataDog/zstd v1.5.0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= -github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/Workiva/go-datastructures v1.0.53 h1:J6Y/52yX10Xc5JjXmGtWoSSxs3mZnGSaq37xZZh7Yig= -github.com/Workiva/go-datastructures v1.0.53/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A= github.com/Zilliqa/gozilliqa-sdk v1.2.1-0.20201201074141-dd0ecada1be6/go.mod h1:eSYp2T6f0apnuW8TzhV3f6Aff2SE8Dwio++U4ha4yEM= github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/participle/v2 v2.0.0-alpha7 h1:cK4vjj0VSgb3lN1nuKA5F7dw+1s1pWBe5bx7nNCnN+c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -118,6 +264,9 @@ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go v1.44.203 h1:pcsP805b9acL3wUqa4JR2vg1k2wnItkDYNvfmcy6F+U= +github.com/aws/aws-sdk-go v1.44.203/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= @@ -128,11 +277,12 @@ github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7 github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= @@ -162,6 +312,7 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= @@ -175,43 +326,44 @@ github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= +github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= +github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/apd/v3 v3.1.0 h1:MK3Ow7LH0W8zkd5GMKA1PvS9qG3bWFI95WaVNfyZJ/w= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= -github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= -github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= -github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20220817183557-09c6e030a677 h1:qbb/AE938DFhOajUYh9+OXELpSF9KZw2ZivtmW6eX1Q= -github.com/cockroachdb/pebble v0.0.0-20220817183557-09c6e030a677/go.mod h1:890yq1fUb9b6dGNwssgeUO5vQV9qfXnCPxAJhBQfXw0= -github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= -github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/coinbase/kryptology v1.8.0/go.mod h1:RYXOAPdzOGUe3qlSFkMGn58i3xUA8hmxYHksuq+8ciI= github.com/coinbase/rosetta-sdk-go v0.7.9 h1:lqllBjMnazTjIqYrOGv8h8jxjg9+hJazIGZr9ZvoCcA= github.com/coinbase/rosetta-sdk-go v0.7.9/go.mod h1:0/knutI7XGVqXmmH4OQD8OckFrbQ8yMsUZTG7FXCR2M= -github.com/cometbft/cometbft v0.34.28 h1:gwryf55P1SWMUP4nOXpRVI2D0yPoYEzN+IBqmRBOsDc= -github.com/cometbft/cometbft v0.34.28/go.mod h1:L9shMfbkZ8B+7JlwANEr+NZbBcn+hBpwdbeYvA5rLCw= -github.com/cometbft/cometbft-db v0.7.0 h1:uBjbrBx4QzU0zOEnU8KxoDl18dMNgDh+zZRUE0ucsbo= -github.com/cometbft/cometbft-db v0.7.0/go.mod h1:yiKJIm2WKrt6x8Cyxtq9YTEcIMPcEe4XPxhgX59Fzf0= +github.com/cometbft/cometbft v0.37.1 h1:KLxkQTK2hICXYq21U2hn1W5hOVYUdQgDQ1uB+90xPIg= +github.com/cometbft/cometbft v0.37.1/go.mod h1:Y2MMMN//O5K4YKd8ze4r9jmk4Y7h0ajqILXbH5JQFVs= +github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= +github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= github.com/confio/ics23/go v0.9.0/go.mod h1:4LPZ2NYqnYIVRklaozjNR1FScgDJ2s5Xrp+e/mYVRak= github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= @@ -223,32 +375,37 @@ github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cosmos/btcutil v1.0.4 h1:n7C2ngKXo7UC9gNyMNLbzqz7Asuf+7Qv4gnX/rOdQ44= -github.com/cosmos/btcutil v1.0.4/go.mod h1:Ffqc8Hn6TJUdDgHBwIZLtrLQC1KdJ9jGJl/TvgUaxbU= -github.com/cosmos/cosmos-db v0.0.0-20221226095112-f3c38ecb5e32 h1:zlCp9n3uwQieELltZWHRmwPmPaZ8+XoL2Sj+A2YJlr8= -github.com/cosmos/cosmos-db v0.0.0-20221226095112-f3c38ecb5e32/go.mod h1:kwMlEC4wWvB48zAShGKVqboJL6w4zCLesaNQ3YLU2BQ= -github.com/cosmos/cosmos-proto v1.0.0-beta.1 h1:iDL5qh++NoXxG8hSy93FdYJut4XfgbShIocllGaXx/0= -github.com/cosmos/cosmos-proto v1.0.0-beta.1/go.mod h1:8k2GNZghi5sDRFw/scPL8gMSowT1vDA+5ouxL8GjaUE= -github.com/cosmos/cosmos-sdk v0.45.15-ics h1:ujrXsulYGwggLCC0oD7CizvlAerqMQHfCHHjHqIamfY= -github.com/cosmos/cosmos-sdk v0.45.15-ics/go.mod h1:bScuNwWAP0TZJpUf+SHXRU3xGoUPp+X9nAzfeIXts40= +github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= +github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= +github.com/cosmos/cosmos-proto v1.0.0-beta.2 h1:X3OKvWgK9Gsejo0F1qs5l8Qn6xJV/AzgIWR2wZ8Nua8= +github.com/cosmos/cosmos-proto v1.0.0-beta.2/go.mod h1:+XRCLJ14pr5HFEHIUcn51IKXD1Fy3rkEQqt4WqmN4V0= +github.com/cosmos/cosmos-sdk v0.47.3 h1:r0hGmZoAzP2D+MaPaFGHwAaTdFQq3pNpHaUp1BsffbM= +github.com/cosmos/cosmos-sdk v0.47.3/go.mod h1:c4OfLdAykA9zsj1CqrxBRqXzVz48I++JSvIMPSPcEmk= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= -github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y= -github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= -github.com/cosmos/iavl v0.19.5 h1:rGA3hOrgNxgRM5wYcSCxgQBap7fW82WZgY78V9po/iY= -github.com/cosmos/iavl v0.19.5/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= -github.com/cosmos/ibc-go/v4 v4.4.2 h1:PG4Yy0/bw6Hvmha3RZbc53KYzaCwuB07Ot4GLyzcBvo= -github.com/cosmos/ibc-go/v4 v4.4.2/go.mod h1:j/kD2JCIaV5ozvJvaEkWhLxM2zva7/KTM++EtKFYcB8= +github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= +github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= +github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= +github.com/cosmos/gogoproto v1.4.10 h1:QH/yT8X+c0F4ZDacDv3z+xE3WU1P1Z3wQoLMBRJoKuI= +github.com/cosmos/gogoproto v1.4.10/go.mod h1:3aAZzeRWpAwr+SS/LLkICX2/kDFyaYVzckBDzygIxek= +github.com/cosmos/iavl v0.20.0 h1:fTVznVlepH0KK8NyKq8w+U7c2L6jofa27aFX6YGlm38= +github.com/cosmos/iavl v0.20.0/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XHcl7A= +github.com/cosmos/ibc-go/v7 v7.0.0 h1:j4kyywlG0hhDmT9FmSaR5iCIka7Pz7kJTxGWY1nlV9Q= +github.com/cosmos/ibc-go/v7 v7.0.0/go.mod h1:BFh8nKWjr5zeR2OZfhkzdgDzj1+KjRn3aJLpwapStj8= +github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= +github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= github.com/cosmos/ledger-cosmos-go v0.12.2 h1:/XYaBlE2BJxtvpkHiBm97gFGSGmYGKunKyF3nNqAXZA= github.com/cosmos/ledger-cosmos-go v0.12.2/go.mod h1:ZcqYgnfNJ6lAXe4HPtWgarNEY+B74i+2/8MhZw4ziiI= +github.com/cosmos/rosetta-sdk-go v0.10.0 h1:E5RhTruuoA7KTIXUcMicL76cffyeoyvNybzUGSKFTcM= +github.com/cosmos/rosetta-sdk-go v0.10.0/go.mod h1:SImAZkb96YbwvoRkzSMQB6noNJXFgWl/ENIznEoYQI4= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creachadair/taskgroup v0.3.2 h1:zlfutDS+5XG40AOxcHDSThxKzns8Tnr9jnr6VqkYlkM= -github.com/creachadair/taskgroup v0.3.2/go.mod h1:wieWwecHVzsidg2CsUnFinW1faVN4+kq+TDlRJQ0Wbk= +github.com/creachadair/taskgroup v0.4.2 h1:jsBLdAJE42asreGss2xZGZ8fJra7WtwnHWeJFxv2Li8= +github.com/creachadair/taskgroup v0.4.2/go.mod h1:qiXUOSrbwAY3u0JPGTzObbE3yf9hcXHDKBZ2ZjpCbgM= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cucumber/common/gherkin/go/v22 v22.0.0 h1:4K8NqptbvdOrjL9DEea6HFjSpbdT9+Q5kgLpmmsHYl0= @@ -264,20 +421,20 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= -github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= +github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= +github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= @@ -293,8 +450,9 @@ github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4 github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= @@ -302,53 +460,44 @@ github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1 github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/ethereum/go-ethereum v1.10.17/go.mod h1:Lt5WzjM07XlXc95YzrhosmR4J9Ahd6X2wyEV2SvGhk0= -github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= -github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= -github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 h1:7HZCaLC5+BZpmbhCOZJ293Lz68O7PYrF2EzeiFMwCLk= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= -github.com/getsentry/sentry-go v0.17.0 h1:UustVWnOoDFHBS7IJUB2QK/nB5pap748ZEp0swnQJak= -github.com/getsentry/sentry-go v0.17.0/go.mod h1:B82dxtBvxG0KaPD8/hfSV+VcHD+Lg/xUS4JuQn1P4cM= -github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -357,31 +506,29 @@ github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= @@ -394,28 +541,36 @@ github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6 github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.3.0+incompatible h1:CaSVZxm5B+7o45rtab4jC2G37WGYX1zQfuU2i6DSvnc= -github.com/gogo/gateway v1.1.0 h1:u0SuhL9+Il+UbjM9VIE3ntfRujKbvVpFvNB4HbjeVQ0= -github.com/gogo/gateway v1.1.0/go.mod h1:S7rR8FRQyG3QFESeSv4l2WnsyzlCLG0CzBbUUo/mbic= -github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -434,6 +589,7 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= @@ -442,7 +598,6 @@ github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= @@ -456,18 +611,24 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -480,13 +641,35 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= @@ -497,7 +680,6 @@ github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= @@ -508,7 +690,6 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaD github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= @@ -525,6 +706,10 @@ github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brv github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-getter v1.7.1 h1:SWiSWN/42qdpR0MdhaOc/bLR48PLuP1ZQtYLRlM69uY= +github.com/hashicorp/go-getter v1.7.1/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -532,6 +717,8 @@ github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iP github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= +github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -539,6 +726,7 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -551,22 +739,24 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 h1:aSVUgRRRtOrZOC1fYmY9gV0e9z/Iu+xNVSASWjsuyGU= -github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3/go.mod h1:5PC6ZNPde8bBqU/ewGZig35+UIZtw9Ytxez8/q5ZyFE= +github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= +github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= +github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= +github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= +github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v1.0.3-0.20220313090229-ca81a64b4204/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= -github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= @@ -581,19 +771,15 @@ github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19y github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= -github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jhump/protoreflect v1.13.1-0.20220928232736-101791cb1b4c h1:XImQJfpJLmGEEd8ll5yPVyL/aEvmgGHW4WYTyNseLOM= +github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= @@ -605,45 +791,29 @@ github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= -github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= -github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= -github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= -github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= -github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= -github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= -github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= -github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= -github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= -github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.15.11 h1:Lcadnb3RKGin4FYM/orgq0qde+nc15E5Cbqg4B9Sx9c= github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= +github.com/klauspost/compress v1.16.3 h1:XuJt9zzcnaz6a16/OU53ZjWp/v7/42WcR5t2a0PcNQY= +github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -652,69 +822,64 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= -github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs= -github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= +github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/linxGnu/grocksdb v1.7.10 h1:dz7RY7GnFUA+GJO6jodyxgkUeGMEkPp3ikt9hAcNGEw= -github.com/linxGnu/grocksdb v1.7.10/go.mod h1:0hTf+iA+GOr0jDX4CgIYyJZxqOH9XlBh6KVj8+zmF34= +github.com/linxGnu/grocksdb v1.7.16 h1:Q2co1xrpdkr5Hx3Fp+f+f7fRGhQFQhvi/+226dtLmA8= +github.com/linxGnu/grocksdb v1.7.16/go.mod h1:JkS7pl5qWpGpuVb3bPqTz8nC12X3YtPZT+Xq7+QfQo4= github.com/lucasjones/reggen v0.0.0-20180717132126-cdb49ff09d77/go.mod h1:5ELEyG+X8f+meRWHuqUOewBOhvHkl7M76pdGEansxW4= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= +github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= +github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= -github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= -github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94= @@ -723,8 +888,11 @@ github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= @@ -740,9 +908,7 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= @@ -755,9 +921,7 @@ github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= @@ -765,7 +929,6 @@ github.com/neilotoole/errgroup v0.1.6/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -773,18 +936,14 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.20.0 h1:8W0cWlwFkflGPLltQvLRB7ZVD5HuP6ng320w2IS245Q= -github.com/onsi/gomega v1.20.0/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034= @@ -799,7 +958,6 @@ github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= -github.com/otiai10/copy v1.6.0 h1:IinKAryFFuPONZ7cm6T6E2QX/vcJwSnlaA5lfoaXIiQ= github.com/oxyno-zeta/gomock-extra-matcher v1.1.0 h1:Yyk5ov0ZPKBXtVEeIWtc4J2XVrHuNoIK+0F2BUJgtsc= github.com/oxyno-zeta/gomock-extra-matcher v1.1.0/go.mod h1:UMGTHYEmJ1dRq8LDZ7VTAYO4nqM3GD1UGC3RJEUxEz0= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= @@ -809,22 +967,17 @@ github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144T github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= +github.com/pelletier/go-toml/v2 v2.0.7 h1:muncTPStnKRos5dpVKULv2FVd4bMOhNePj9CjgDb8Us= +github.com/pelletier/go-toml/v2 v2.0.7/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= -github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= +github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 h1:hDSdbBuw3Lefr6R18ax0tZ2BJeNB3NehB3trOwYBsdU= +github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= -github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -841,8 +994,6 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -861,62 +1012,47 @@ github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt2 github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= +github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/regen-network/cosmos-proto v0.3.1 h1:rV7iM4SSFAagvy8RiyhiACbWEGotmqzywPxOvwMdxcg= -github.com/regen-network/cosmos-proto v0.3.1/go.mod h1:jO0sVX6a1B36nmE8C9xBFXpNwWejXC7QqCOnH3O0+YM= github.com/regen-network/gocuke v0.6.2 h1:pHviZ0kKAq2U2hN2q3smKNxct6hS0mGByFMHGnWA97M= -github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= -github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= -github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.27.0 h1:1T7qCieN22GVc8S4Q2yuexzBb1EqjbgjSH9RohbMjKs= -github.com/rs/zerolog v1.27.0/go.mod h1:7frBqO0oezxmnO7GF86FY++uy8I0Tk/If5ni1G9Qc0U= +github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= +github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.29.1 h1:cO+d60CHkknCbvzEWxP0S9K6KqyTjrCNUy1LdQLCGPc= +github.com/rs/zerolog v1.29.1/go.mod h1:Le6ESbR7hc+DP6Lt1THiV8CQSdkkNrd3R0XbEgp3ZBU= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -932,15 +1068,15 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasO github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= +github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= -github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= +github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -949,8 +1085,8 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.14.0 h1:Rg7d3Lo706X9tHsJMUjdiwMpHB7W8WnSVOssIY+JElU= -github.com/spf13/viper v1.14.0/go.mod h1:WT//axPky3FdvXHzGw33dNdXXXfFQqmEalje+egj8As= +github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= +github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= @@ -959,6 +1095,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -968,20 +1105,17 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= -github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= +github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= -github.com/tendermint/tm-db v0.6.7 h1:fE00Cbl0jayAoqlExN6oyQJ7fR/ZtoVOmvPJ//+shu8= -github.com/tendermint/tm-db v0.6.7/go.mod h1:byQDzFkZV1syXr/ReXS808NxA2xvyuuVgXOJ/088L6I= -github.com/tidwall/btree v1.5.0 h1:iV0yVY/frd7r6qGBXfEYs7DH0gTDgrKTrDjS7xt/IyQ= -github.com/tidwall/btree v1.5.0/go.mod h1:LGm8L/DZjPLmeWGjv5kFrY8dL4uVhMmzmmLYmsObdKE= +github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg= +github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.14.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM= @@ -992,55 +1126,47 @@ github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.4/go.mod h1:098SZ494YoMWPmMO6ct4dcFnqxwj9r/gF0Etp19pSNM= github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= -github.com/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg= github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= +github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= +github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= +github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/ybbus/jsonrpc v2.1.2+incompatible/go.mod h1:XJrh1eMSzdIYFbM08flv0wp5G35eRniyeGut1z+LSiE= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo= github.com/zondax/hid v0.9.1/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= github.com/zondax/ledger-go v0.14.1 h1:Pip65OOl4iJ84WTpA4BKChvOufMhhbxED3BaihoZN4c= github.com/zondax/ledger-go v0.14.1/go.mod h1:fZ3Dqg6qcdXWSOJFKMG8GCTnD7slO/RL2feOQv8K320= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= +go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= +go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -1050,6 +1176,10 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -1071,7 +1201,6 @@ golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -1083,8 +1212,8 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= -golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= +golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1099,12 +1228,12 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20221019170559-20944726eadf h1:nFVjjKDgNY37+ZSYCJmtYf7tOlfQswHqplG2eosjOMg= -golang.org/x/exp v0.0.0-20221019170559-20944726eadf/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc h1:mCRnTeVUjcrhlRmO0VK8a6k6Rrf6TF9htwo2pJVSjIU= +golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -1127,9 +1256,11 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1139,7 +1270,6 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -1149,7 +1279,6 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1170,21 +1299,32 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1194,8 +1334,24 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= +golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1207,8 +1363,11 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1261,45 +1420,68 @@ golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210909193231-528a39cd75f3/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1309,23 +1491,26 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -1367,28 +1552,32 @@ golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.4.0 h1:7mTAgkunk3fr4GAloyyCasadO6h9zSsQZbwvcaIciV4= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= -gonum.org/v1/gonum v0.8.2 h1:CCXrcPKiGGotvnN6jfUsKk4rRqm7q09/YbKb5xCEvtM= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= @@ -1412,14 +1601,46 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.110.0 h1:l+rh0KYUooe9JGbGVx71tbFo4SMbMTXK3I3ia2QSEeU= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1444,7 +1665,6 @@ google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200324203455-a04cca1dde73/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -1463,12 +1683,120 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa h1:qQPhfbPO23fwm/9lQr91L1u62Zo6cm+zI+slZT+uf+o= -google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/grpc v1.33.2 h1:EQyQC3sa8M+p6Ulc8yy9SWSS2GVwyRc83gAbG8lrl4o= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 h1:DdoeryqhaXp1LtT/emMP1BRJPHHKFi5akj/nbx/zNTA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1481,26 +1809,25 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= @@ -1518,7 +1845,6 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= @@ -1526,6 +1852,7 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1536,11 +1863,14 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -pgregory.net/rapid v0.5.3 h1:163N50IHFqr1phZens4FQOdPgfJscR7a562mjQqeo4M= +pgregory.net/rapid v0.5.5 h1:jkgx1TjbQPD/feRoK+S/mXw9e1uj6WilpHrXJowi6oA= +pgregory.net/rapid v0.5.5/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/legacy_ibc_testing/core/events.go b/legacy_ibc_testing/core/events.go index fdf14c50f6..daabc92d54 100644 --- a/legacy_ibc_testing/core/events.go +++ b/legacy_ibc_testing/core/events.go @@ -3,10 +3,10 @@ package core import ( "strconv" - abci "github.com/tendermint/tendermint/abci/types" + abci "github.com/cometbft/cometbft/abci/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" ) /* @@ -20,7 +20,7 @@ These files will be deprecated once ICS is able to upgrade to ibc-go v5. func ReconstructPacketFromEvent(event abci.Event) (packet types.Packet, err error) { attrMap := make(map[string][]byte) for _, attr := range event.Attributes { - attrMap[string(attr.Key)] = attr.Value + attrMap[string(attr.Key)] = []byte(attr.Value) } sequence, err := strconv.Atoi(string(attrMap[string(types.AttributeKeySequence)])) diff --git a/legacy_ibc_testing/simapp/test_helpers.go b/legacy_ibc_testing/simapp/test_helpers.go index fb680aa082..2d11af5790 100644 --- a/legacy_ibc_testing/simapp/test_helpers.go +++ b/legacy_ibc_testing/simapp/test_helpers.go @@ -8,6 +8,8 @@ import ( "testing" "time" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + tmtypes "github.com/cometbft/cometbft/types" bam "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" @@ -15,9 +17,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/errors" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - tmtypes "github.com/tendermint/tendermint/types" "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/simapp/helpers" ) @@ -31,8 +30,8 @@ These files will be deprecated once ICS is able to upgrade to ibc-go v5. // DefaultConsensusParams defines the default Tendermint consensus params used in // SimApp testing. -var DefaultConsensusParams = &abci.ConsensusParams{ - Block: &abci.BlockParams{ +var DefaultConsensusParams = &tmproto.ConsensusParams{ + Block: &tmproto.BlockParams{ MaxBytes: 200000, MaxGas: 2000000, }, @@ -62,7 +61,7 @@ func ConvertAddrsToValAddrs(addrs []sdk.AccAddress) []sdk.ValAddress { } func TestAddr(addr string, bech string) (sdk.AccAddress, error) { - res, err := sdk.AccAddressFromHex(addr) + res, err := sdk.AccAddressFromHexUnsafe(addr) if err != nil { return nil, err } @@ -104,7 +103,7 @@ func SignAndDeliver( require.NoError(t, err) // Simulate a sending a transaction - gInfo, res, err := app.Deliver(txCfg.TxEncoder(), tx) + gInfo, res, err := app.SimDeliver(txCfg.TxEncoder(), tx) if expPass { require.NoError(t, err) diff --git a/legacy_ibc_testing/testing/app.go b/legacy_ibc_testing/testing/app.go index 45d5248773..ce4e32c90f 100644 --- a/legacy_ibc_testing/testing/app.go +++ b/legacy_ibc_testing/testing/app.go @@ -5,26 +5,29 @@ import ( "testing" "time" + "cosmossdk.io/math" "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/core" + abci "github.com/cometbft/cometbft/abci/types" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + tmtypes "github.com/cometbft/cometbft/types" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - tmtypes "github.com/tendermint/tendermint/types" - "github.com/cosmos/ibc-go/v4/modules/core/keeper" + "github.com/cosmos/ibc-go/v7/modules/core/keeper" "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/simapp" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" ) /* @@ -52,7 +55,7 @@ type TestingApp interface { AppCodec() codec.Codec // Implemented by BaseApp - LastCommitID() sdk.CommitID + LastCommitID() storetypes.CommitID LastBlockHeight() int64 } @@ -60,9 +63,10 @@ type TestingApp interface { // that also act as delegators. For simplicity, each validator is bonded with a delegation // of one consensus engine unit (10^6) in the default token of the simapp from first genesis // account. A Nop logger is set in SimApp. -func SetupWithGenesisValSet(t *testing.T, appIniter AppIniter, valSet *tmtypes.ValidatorSet, genAccs []authtypes.GenesisAccount, chainID string, powerReduction sdk.Int, balances ...banktypes.Balance) TestingApp { +func SetupWithGenesisValSet(t *testing.T, appIniter AppIniter, valSet *tmtypes.ValidatorSet, genAccs []authtypes.GenesisAccount, chainID string, powerReduction math.Int, balances ...banktypes.Balance) TestingApp { t.Helper() app, genesisState := appIniter() + baseapp.SetChainID(chainID)(app.GetBaseApp()) // set genesis accounts authGenesis := authtypes.NewGenesisState(authtypes.DefaultParams(), genAccs) @@ -73,6 +77,7 @@ func SetupWithGenesisValSet(t *testing.T, appIniter AppIniter, valSet *tmtypes.V bondAmt := sdk.TokensFromConsensusPower(1, powerReduction) + initValPowers := []abci.ValidatorUpdate{} for _, val := range valSet.Validators { pk, err := cryptocodec.FromTmPubKeyInterface(val.PubKey) require.NoError(t, err) @@ -94,14 +99,20 @@ func SetupWithGenesisValSet(t *testing.T, appIniter AppIniter, valSet *tmtypes.V validators = append(validators, validator) delegations = append(delegations, stakingtypes.NewDelegation(genAccs[0].GetAddress(), val.Address.Bytes(), sdk.OneDec())) + + pub, _ := val.ToProto() + initValPowers = append(initValPowers, abci.ValidatorUpdate{ + Power: val.VotingPower, + PubKey: pub.PubKey, + }) } // set validators and delegations var ( - stakingGenesis stakingtypes.GenesisState - bondDenom string + stakingGenesis stakingtypes.GenesisState + consumerGenesis consumertypes.GenesisState + bondDenom string ) - if genesisState[stakingtypes.ModuleName] != nil { app.AppCodec().MustUnmarshalJSON(genesisState[stakingtypes.ModuleName], &stakingGenesis) bondDenom = stakingGenesis.Params.BondDenom @@ -120,9 +131,16 @@ func SetupWithGenesisValSet(t *testing.T, appIniter AppIniter, valSet *tmtypes.V genesisState[stakingtypes.ModuleName] = app.AppCodec().MustMarshalJSON(&stakingGenesis) // update total supply - bankGenesis := banktypes.NewGenesisState(banktypes.DefaultGenesisState().Params, balances, sdk.NewCoins(), []banktypes.Metadata{}) + bankGenesis := banktypes.NewGenesisState(banktypes.DefaultGenesisState().Params, balances, sdk.NewCoins(), []banktypes.Metadata{}, []banktypes.SendEnabled{}) genesisState[banktypes.ModuleName] = app.AppCodec().MustMarshalJSON(bankGenesis) + if genesisState[consumertypes.ModuleName] != nil { + app.AppCodec().MustUnmarshalJSON(genesisState[consumertypes.ModuleName], &consumerGenesis) + consumerGenesis.InitialValSet = initValPowers + consumerGenesis.Params.Enabled = true + genesisState[consumertypes.ModuleName] = app.AppCodec().MustMarshalJSON(&consumerGenesis) + } + stateBytes, err := json.MarshalIndent(genesisState, "", " ") require.NoError(t, err) @@ -138,6 +156,7 @@ func SetupWithGenesisValSet(t *testing.T, appIniter AppIniter, valSet *tmtypes.V // commit genesis changes app.Commit() + app.BeginBlock( abci.RequestBeginBlock{ Header: tmproto.Header{ diff --git a/legacy_ibc_testing/testing/chain.go b/legacy_ibc_testing/testing/chain.go index f86bdda905..c037ca43c8 100644 --- a/legacy_ibc_testing/testing/chain.go +++ b/legacy_ibc_testing/testing/chain.go @@ -7,6 +7,12 @@ import ( "time" errorsmod "cosmossdk.io/errors" + abci "github.com/cometbft/cometbft/abci/types" + "github.com/cometbft/cometbft/crypto/tmhash" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + tmprotoversion "github.com/cometbft/cometbft/proto/tendermint/version" + tmtypes "github.com/cometbft/cometbft/types" + tmversion "github.com/cometbft/cometbft/version" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" @@ -16,24 +22,19 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - "github.com/cosmos/cosmos-sdk/x/staking/teststaking" + teststaking "github.com/cosmos/cosmos-sdk/x/staking/testutil" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/crypto/tmhash" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - tmprotoversion "github.com/tendermint/tendermint/proto/tendermint/version" - tmtypes "github.com/tendermint/tendermint/types" - tmversion "github.com/tendermint/tendermint/version" - - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - commitmenttypes "github.com/cosmos/ibc-go/v4/modules/core/23-commitment/types" - host "github.com/cosmos/ibc-go/v4/modules/core/24-host" - "github.com/cosmos/ibc-go/v4/modules/core/exported" - "github.com/cosmos/ibc-go/v4/modules/core/types" - ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - "github.com/cosmos/ibc-go/v4/testing/mock" + + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" + host "github.com/cosmos/ibc-go/v7/modules/core/24-host" + "github.com/cosmos/ibc-go/v7/modules/core/exported" + "github.com/cosmos/ibc-go/v7/modules/core/types" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + "github.com/cosmos/ibc-go/v7/testing/mock" + ibctestingcore "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/core" "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/simapp" ) @@ -211,7 +212,7 @@ func (chain *TestChain) QueryProof(key []byte) ([]byte, clienttypes.Height) { // for the query and the height at which the proof will succeed on a tendermint verifier. func (chain *TestChain) QueryProofAtHeight(key []byte, height int64) ([]byte, clienttypes.Height) { res := chain.App.Query(abci.RequestQuery{ - Path: fmt.Sprintf("store/%s/key", host.StoreKey), + Path: fmt.Sprintf("store/%s/key", exported.StoreKey), Height: height - 1, Data: key, Prove: true, diff --git a/legacy_ibc_testing/testing/config.go b/legacy_ibc_testing/testing/config.go index 5e94c8c4c3..dffe01053f 100644 --- a/legacy_ibc_testing/testing/config.go +++ b/legacy_ibc_testing/testing/config.go @@ -3,11 +3,11 @@ package testing import ( "time" - connectiontypes "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - "github.com/cosmos/ibc-go/v4/modules/core/exported" - ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - "github.com/cosmos/ibc-go/v4/testing/mock" + connectiontypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + "github.com/cosmos/ibc-go/v7/modules/core/exported" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + "github.com/cosmos/ibc-go/v7/testing/mock" ) /* diff --git a/legacy_ibc_testing/testing/coordinator.go b/legacy_ibc_testing/testing/coordinator.go index c56a505da0..4aee8f8923 100644 --- a/legacy_ibc_testing/testing/coordinator.go +++ b/legacy_ibc_testing/testing/coordinator.go @@ -6,8 +6,8 @@ import ( "testing" "time" + abci "github.com/cometbft/cometbft/abci/types" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" ) /* diff --git a/legacy_ibc_testing/testing/endpoint.go b/legacy_ibc_testing/testing/endpoint.go index 0929942511..c3f2ac9abb 100644 --- a/legacy_ibc_testing/testing/endpoint.go +++ b/legacy_ibc_testing/testing/endpoint.go @@ -6,13 +6,13 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - connectiontypes "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - commitmenttypes "github.com/cosmos/ibc-go/v4/modules/core/23-commitment/types" - host "github.com/cosmos/ibc-go/v4/modules/core/24-host" - "github.com/cosmos/ibc-go/v4/modules/core/exported" - ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + connectiontypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" + host "github.com/cosmos/ibc-go/v7/modules/core/24-host" + "github.com/cosmos/ibc-go/v7/modules/core/exported" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" ) /* @@ -86,7 +86,7 @@ func (endpoint *Endpoint) CreateClient() (err error) { height := endpoint.Counterparty.Chain.LastHeader.GetHeight().(clienttypes.Height) clientState = ibctmtypes.NewClientState( endpoint.Counterparty.Chain.ChainID, tmConfig.TrustLevel, tmConfig.TrustingPeriod, tmConfig.UnbondingPeriod, tmConfig.MaxClockDrift, - height, commitmenttypes.GetSDKSpecs(), UpgradePath, tmConfig.AllowUpdateAfterExpiry, tmConfig.AllowUpdateAfterMisbehaviour, + height, commitmenttypes.GetSDKSpecs(), UpgradePath, ) consensusState = endpoint.Counterparty.Chain.LastHeader.ConsensusState() case exported.Solomachine: @@ -124,7 +124,7 @@ func (endpoint *Endpoint) UpdateClient() (err error) { // ensure counterparty has committed state endpoint.Chain.Coordinator.CommitBlock(endpoint.Counterparty.Chain) - var header exported.Header + var header *ibctmtypes.Header switch endpoint.ClientConfig.GetClientType() { case exported.Tendermint: @@ -364,8 +364,18 @@ func (endpoint *Endpoint) ChanCloseInit() error { func (endpoint *Endpoint) SendPacket(packet exported.PacketI) error { channelCap := endpoint.Chain.GetChannelCapability(packet.GetSourcePort(), packet.GetSourceChannel()) + timeoutHeight := clienttypes.Height{ + RevisionNumber: packet.GetTimeoutHeight().GetRevisionNumber(), + RevisionHeight: packet.GetTimeoutHeight().GetRevisionHeight(), + } + // no need to send message, acting as a module - err := endpoint.Chain.App.GetIBCKeeper().ChannelKeeper.SendPacket(endpoint.Chain.GetContext(), channelCap, packet) + _, err := endpoint.Chain.App.GetIBCKeeper().ChannelKeeper.SendPacket(endpoint.Chain.GetContext(), + channelCap, packet.GetSourcePort(), + packet.GetSourceChannel(), + timeoutHeight, + packet.GetTimeoutTimestamp(), + packet.GetData()) if err != nil { return err } diff --git a/legacy_ibc_testing/testing/events.go b/legacy_ibc_testing/testing/events.go index 7d60e69799..763199a695 100644 --- a/legacy_ibc_testing/testing/events.go +++ b/legacy_ibc_testing/testing/events.go @@ -5,9 +5,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - connectiontypes "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + connectiontypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" ) /* @@ -70,7 +70,7 @@ func ParseAckFromEvents(events sdk.Events) ([]byte, error) { if ev.Type == channeltypes.EventTypeWriteAck { for _, attr := range ev.Attributes { if string(attr.Key) == channeltypes.AttributeKeyAck { - return attr.Value, nil + return []byte(attr.Value), nil } } } diff --git a/legacy_ibc_testing/testing/path.go b/legacy_ibc_testing/testing/path.go index 78aa4bacfa..31efe8215d 100644 --- a/legacy_ibc_testing/testing/path.go +++ b/legacy_ibc_testing/testing/path.go @@ -4,7 +4,7 @@ import ( "bytes" "fmt" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" ) /* diff --git a/legacy_ibc_testing/testing/utils.go b/legacy_ibc_testing/testing/utils.go index 3887f99352..885958f25e 100644 --- a/legacy_ibc_testing/testing/utils.go +++ b/legacy_ibc_testing/testing/utils.go @@ -3,9 +3,9 @@ package testing import ( "testing" + abci "github.com/cometbft/cometbft/abci/types" + tmtypes "github.com/cometbft/cometbft/types" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" - tmtypes "github.com/tendermint/tendermint/types" ) /* diff --git a/legacy_ibc_testing/testing/values.go b/legacy_ibc_testing/testing/values.go index ebc5f31fa4..579d00cea4 100644 --- a/legacy_ibc_testing/testing/values.go +++ b/legacy_ibc_testing/testing/values.go @@ -3,10 +3,10 @@ package testing import ( "time" - ibctransfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" - connectiontypes "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types" - ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - "github.com/cosmos/ibc-go/v4/testing/mock" + ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + connectiontypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + "github.com/cosmos/ibc-go/v7/testing/mock" ) /* diff --git a/proto/buf.lock b/proto/buf.lock index 68c709a8d9..1c8fbbc13a 100644 --- a/proto/buf.lock +++ b/proto/buf.lock @@ -1,11 +1,27 @@ # Generated by buf. DO NOT EDIT. version: v1 deps: + - remote: buf.build + owner: cosmos + repository: cosmos-proto + commit: 1935555c206d4afb9e94615dfd0fad31 + - remote: buf.build + owner: cosmos + repository: cosmos-sdk + commit: 954f7b05f38440fc8250134b15adec47 - remote: buf.build owner: cosmos repository: gogo-proto - commit: bee5511075b7499da6178d9e4aaa628b + commit: 34d970b699f84aa382f3c29773a60836 + - remote: buf.build + owner: cosmos + repository: ibc + commit: fbb44f5ad3194450af479a615fa715d9 + - remote: buf.build + owner: cosmos + repository: ics23 + commit: 55085f7c710a45f58fa09947208eb70b - remote: buf.build owner: googleapis repository: googleapis - commit: 62f35d8aed1149c291d606d958a7ce32 + commit: 5ae7f88519b04fe1965da0f8a375a088 diff --git a/proto/buf.yaml b/proto/buf.yaml index 5208a19c81..5ef6b4b743 100644 --- a/proto/buf.yaml +++ b/proto/buf.yaml @@ -7,7 +7,11 @@ version: v1 name: buf.build/cosmos/interchain-security deps: - buf.build/cosmos/gogo-proto + - buf.build/cosmos/cosmos-sdk:v0.47.0 + - buf.build/cosmos/ibc:fbb44f5ad3194450af479a615fa715d9 - buf.build/googleapis/googleapis + - buf.build/cosmos/ics23:b1abd8678aab07165efd453c96796a179eb3131f + breaking: use: - FILE diff --git a/proto/interchain_security/ccv/consumer/v1/consumer.proto b/proto/interchain_security/ccv/consumer/v1/consumer.proto index 92602eee4c..1487e579a8 100644 --- a/proto/interchain_security/ccv/consumer/v1/consumer.proto +++ b/proto/interchain_security/ccv/consumer/v1/consumer.proto @@ -32,11 +32,11 @@ message Params { 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]; + [ (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]; + [ (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 @@ -44,25 +44,27 @@ message Params { 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 + // 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]; + [ (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 + // 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. + // 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" + // 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; } @@ -84,5 +86,6 @@ message CrossChainValidator { // MaturingVSCPacket contains the maturing time of a received VSCPacket message MaturingVSCPacket { uint64 vscId = 1; - google.protobuf.Timestamp maturity_time = 2 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false]; + google.protobuf.Timestamp maturity_time = 2 + [ (gogoproto.stdtime) = true, (gogoproto.nullable) = false ]; } diff --git a/proto/interchain_security/ccv/consumer/v1/genesis.proto b/proto/interchain_security/ccv/consumer/v1/genesis.proto index 578518086c..739ac2798e 100644 --- a/proto/interchain_security/ccv/consumer/v1/genesis.proto +++ b/proto/interchain_security/ccv/consumer/v1/genesis.proto @@ -15,16 +15,18 @@ import "gogoproto/gogo.proto"; // GenesisState defines the CCV consumer chain genesis state message GenesisState { Params params = 1 [ (gogoproto.nullable) = false ]; - string provider_client_id = 2; // empty for a new chain, filled in on restart. - string provider_channel_id = 3; // empty for a new chain, filled in on restart. - bool new_chain = 4; // true for new chain GenesisState, false for chain restart. + string provider_client_id = 2; // empty for a new chain, filled in on restart. + string provider_channel_id = + 3; // empty for a new chain, filled in on restart. + bool new_chain = + 4; // true for new chain GenesisState, false for chain restart. // ProviderClientState filled in on new chain, nil on restart. ibc.lightclients.tendermint.v1.ClientState provider_client_state = 5; // ProviderConsensusState filled in on new chain, nil on restart. ibc.lightclients.tendermint.v1.ConsensusState provider_consensus_state = 6; // MaturingPackets nil on new chain, filled in on restart. - repeated interchain_security.ccv.consumer.v1.MaturingVSCPacket maturing_packets = 7 - [ (gogoproto.nullable) = false ]; + repeated interchain_security.ccv.consumer.v1.MaturingVSCPacket + maturing_packets = 7 [ (gogoproto.nullable) = false ]; // InitialValset filled in on new chain and on restart. repeated .tendermint.abci.ValidatorUpdate initial_val_set = 8 [ (gogoproto.nullable) = false ]; @@ -35,15 +37,16 @@ message GenesisState { repeated OutstandingDowntime outstanding_downtime_slashing = 10 [ (gogoproto.nullable) = false ]; // PendingConsumerPackets nil on new chain, filled in on restart. - interchain_security.ccv.v1.ConsumerPacketDataList pending_consumer_packets = 11 - [ (gogoproto.nullable) = false ]; + interchain_security.ccv.v1.ConsumerPacketDataList pending_consumer_packets = + 11 [ (gogoproto.nullable) = false ]; // LastTransmissionBlockHeight nil on new chain, filled in on restart. - interchain_security.ccv.consumer.v1.LastTransmissionBlockHeight last_transmission_block_height = 12 - [ (gogoproto.nullable) = false ]; - bool preCCV = 13; // flag indicating whether the consumer CCV module starts in pre-CCV state + interchain_security.ccv.consumer.v1.LastTransmissionBlockHeight + last_transmission_block_height = 12 [ (gogoproto.nullable) = false ]; + bool preCCV = 13; // flag indicating whether the consumer CCV module starts in + // pre-CCV state } -// HeightValsetUpdateID defines the genesis information for the mapping +// HeightValsetUpdateID defines the genesis information for the mapping // of each block height to a valset update id message HeightToValsetUpdateID { uint64 height = 1; diff --git a/proto/interchain_security/ccv/consumer/v1/query.proto b/proto/interchain_security/ccv/consumer/v1/query.proto index 8efbfa2f8b..b5576b57fe 100644 --- a/proto/interchain_security/ccv/consumer/v1/query.proto +++ b/proto/interchain_security/ccv/consumer/v1/query.proto @@ -39,10 +39,10 @@ message NextFeeDistributionEstimate { string toConsumer = 7; } -message QueryNextFeeDistributionEstimateRequest { } +message QueryNextFeeDistributionEstimateRequest {} message QueryNextFeeDistributionEstimateResponse { - NextFeeDistributionEstimate data = 1; + NextFeeDistributionEstimate data = 1; } message QueryParamsRequest {} @@ -50,5 +50,5 @@ message QueryParamsRequest {} // QueryParamsResponse is response type for the Query/Params RPC method. message QueryParamsResponse { // params holds all the parameters of this module. - Params params = 1 [(gogoproto.nullable) = false]; + Params params = 1 [ (gogoproto.nullable) = false ]; } diff --git a/proto/interchain_security/ccv/provider/v1/genesis.proto b/proto/interchain_security/ccv/provider/v1/genesis.proto index bf7fe58d15..e1c241413b 100644 --- a/proto/interchain_security/ccv/provider/v1/genesis.proto +++ b/proto/interchain_security/ccv/provider/v1/genesis.proto @@ -11,41 +11,39 @@ import "interchain_security/ccv/consumer/v1/consumer.proto"; import "interchain_security/ccv/consumer/v1/genesis.proto"; import "tendermint/crypto/keys.proto"; - // GenesisState defines the CCV provider chain genesis state message GenesisState { // strictly positive and set to 1 (DefaultValsetUpdateID) for a new chain - uint64 valset_update_id = 1; + uint64 valset_update_id = 1; // empty for a new chain - repeated ConsumerState consumer_states = 2 [ + repeated ConsumerState consumer_states = 2 [ (gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"consumer_states\"" ]; // empty for a new chain repeated interchain_security.ccv.provider.v1.UnbondingOp unbonding_ops = 3 - [ (gogoproto.nullable) = false ]; + [ (gogoproto.nullable) = false ]; // empty for a new chain interchain_security.ccv.v1.MaturedUnbondingOps mature_unbonding_ops = 4; - // empty for a new chain + // empty for a new chain repeated ValsetUpdateIdToHeight valset_update_id_to_height = 5 - [ (gogoproto.nullable) = false ]; + [ (gogoproto.nullable) = false ]; // empty for a new chain repeated ConsumerAdditionProposal consumer_addition_proposals = 6 - [ (gogoproto.nullable) = false ]; + [ (gogoproto.nullable) = false ]; // empty for a new chain repeated ConsumerRemovalProposal consumer_removal_proposals = 7 - [ (gogoproto.nullable) = false ]; - Params params = 8 - [ (gogoproto.nullable) = false ]; + [ (gogoproto.nullable) = false ]; + Params params = 8 [ (gogoproto.nullable) = false ]; // empty for a new chain repeated ValidatorConsumerPubKey validator_consumer_pubkeys = 9 - [ (gogoproto.nullable) = false ]; + [ (gogoproto.nullable) = false ]; // empty for a new chain repeated ValidatorByConsumerAddr validators_by_consumer_addr = 10 - [ (gogoproto.nullable) = false ]; + [ (gogoproto.nullable) = false ]; // empty for a new chain repeated ConsumerAddrsToPrune consumer_addrs_to_prune = 11 - [ (gogoproto.nullable) = false ]; + [ (gogoproto.nullable) = false ]; } // consumer chain @@ -60,19 +58,21 @@ message ConsumerState { uint64 initial_height = 4; // ConsumerGenesis defines the initial consumer chain genesis states interchain_security.ccv.consumer.v1.GenesisState consumer_genesis = 5 - [ (gogoproto.nullable) = false ]; - // PendingValsetChanges defines the pending validator set changes for the consumer chain - repeated interchain_security.ccv.v1.ValidatorSetChangePacketData pending_valset_changes = 6 - [ (gogoproto.nullable) = false ]; + [ (gogoproto.nullable) = false ]; + // PendingValsetChanges defines the pending validator set changes for the + // consumer chain + repeated interchain_security.ccv.v1.ValidatorSetChangePacketData + pending_valset_changes = 6 [ (gogoproto.nullable) = false ]; repeated string slash_downtime_ack = 7; - // UnbondingOpsIndex defines the unbonding operations waiting on this consumer chain - repeated interchain_security.ccv.provider.v1.VscUnbondingOps unbonding_ops_index = 8 - [ (gogoproto.nullable) = false ]; + // UnbondingOpsIndex defines the unbonding operations waiting on this consumer + // chain + repeated interchain_security.ccv.provider.v1.VscUnbondingOps + unbonding_ops_index = 8 [ (gogoproto.nullable) = false ]; } -// ValsetUpdateIdToHeight defines the genesis information for the mapping +// ValsetUpdateIdToHeight defines the genesis information for the mapping // of each valset udpate id to a block height message ValsetUpdateIdToHeight { - uint64 valset_update_id = 1; - uint64 height = 2; + uint64 valset_update_id = 1; + uint64 height = 2; } diff --git a/proto/interchain_security/ccv/provider/v1/provider.proto b/proto/interchain_security/ccv/provider/v1/provider.proto index d190b3a6ca..f235f0831a 100644 --- a/proto/interchain_security/ccv/provider/v1/provider.proto +++ b/proto/interchain_security/ccv/provider/v1/provider.proto @@ -13,141 +13,155 @@ import "tendermint/crypto/keys.proto"; import "cosmos/evidence/v1beta1/evidence.proto"; import "cosmos/base/v1beta1/coin.proto"; -// ConsumerAdditionProposal is a governance proposal on the provider chain to spawn a new consumer chain. -// If it passes, then all validators on the provider chain are expected to validate the consumer chain at spawn time -// or get slashed. It is recommended that spawn time occurs after the proposal end time. +// ConsumerAdditionProposal is a governance proposal on the provider chain to +// spawn a new consumer chain. If it passes, then all validators on the provider +// chain are expected to validate the consumer chain at spawn time or get +// slashed. It is recommended that spawn time occurs after the proposal end +// time. message ConsumerAdditionProposal { - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - - // the title of the proposal - string title = 1; - // the description of the proposal - string description = 2; - // the proposed chain-id of the new consumer chain, must be different from all other consumer chain ids of the executing - // provider chain. - string chain_id = 3 ; - // the proposed initial height of new consumer chain. - // For a completely new chain, this will be {0,1}. However, it may be different if this is a chain that is converting to a consumer chain. - ibc.core.client.v1.Height initial_height = 4 [(gogoproto.nullable) = false]; - // The hash of the consumer chain genesis state without the consumer CCV module genesis params. - // It is used for off-chain confirmation of genesis.json validity by validators and other parties. - bytes genesis_hash = 5 ; - // The hash of the consumer chain binary that should be run by validators on chain initialization. - // It is used for off-chain confirmation of binary validity by validators and other parties. - bytes binary_hash = 6 ; - // spawn time is the time on the provider chain at which the consumer chain genesis is finalized and all validators - // will be responsible for starting their consumer chain validator node. - google.protobuf.Timestamp spawn_time = 7 - [(gogoproto.stdtime) = true, (gogoproto.nullable) = false]; - - // Unbonding period for the consumer, - // which should be smaller than that of the provider in general. - google.protobuf.Duration unbonding_period = 8 - [(gogoproto.nullable) = false, (gogoproto.stdduration) = true]; - // Sent CCV related IBC packets will timeout after this duration - google.protobuf.Duration ccv_timeout_period = 9 - [(gogoproto.nullable) = false, (gogoproto.stdduration) = true]; - // Sent transfer related IBC packets will timeout after this duration - google.protobuf.Duration transfer_timeout_period = 10 - [(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 = 11; - // BlocksPerDistributionTransmission is the number of blocks between ibc-token-transfers from the consumer chain to the provider chain. - // On sending transmission event, `consumer_redistribution_fraction` of the accumulated tokens are sent to the consumer redistribution address. - int64 blocks_per_distribution_transmission = 12; - // 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 = 13; - // The ID of a token transfer channel used for the Reward Distribution - // sub-protocol. If DistributionTransmissionChannel == "", a new transfer - // channel is created on top of the same connection as the CCV channel. - // Note that transfer_channel_id is the ID of the channel end on the consumer chain. - // it is most relevant for chains performing a sovereign to consumer changeover - // in order to maintan the existing ibc transfer channel - string distribution_transmission_channel = 14; -} - -// ConsumerRemovalProposal is a governance proposal on the provider chain to remove (and stop) a consumer chain. -// If it passes, all the consumer chain's state is removed from the provider chain. The outstanding unbonding -// operation funds are released. + option (gogoproto.goproto_getters) = false; + option (gogoproto.goproto_stringer) = false; + + // the title of the proposal + string title = 1; + // the description of the proposal + string description = 2; + // the proposed chain-id of the new consumer chain, must be different from all + // other consumer chain ids of the executing provider chain. + string chain_id = 3; + // the proposed initial height of new consumer chain. + // For a completely new chain, this will be {0,1}. However, it may be + // different if this is a chain that is converting to a consumer chain. + ibc.core.client.v1.Height initial_height = 4 [ (gogoproto.nullable) = false ]; + // The hash of the consumer chain genesis state without the consumer CCV + // module genesis params. It is used for off-chain confirmation of + // genesis.json validity by validators and other parties. + bytes genesis_hash = 5; + // The hash of the consumer chain binary that should be run by validators on + // chain initialization. It is used for off-chain confirmation of binary + // validity by validators and other parties. + bytes binary_hash = 6; + // spawn time is the time on the provider chain at which the consumer chain + // genesis is finalized and all validators will be responsible for starting + // their consumer chain validator node. + google.protobuf.Timestamp spawn_time = 7 + [ (gogoproto.stdtime) = true, (gogoproto.nullable) = false ]; + + // Unbonding period for the consumer, + // which should be smaller than that of the provider in general. + google.protobuf.Duration unbonding_period = 8 + [ (gogoproto.nullable) = false, (gogoproto.stdduration) = true ]; + // Sent CCV related IBC packets will timeout after this duration + google.protobuf.Duration ccv_timeout_period = 9 + [ (gogoproto.nullable) = false, (gogoproto.stdduration) = true ]; + // Sent transfer related IBC packets will timeout after this duration + google.protobuf.Duration transfer_timeout_period = 10 + [ (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 = 11; + // BlocksPerDistributionTransmission is the number of blocks between + // ibc-token-transfers from the consumer chain to the provider chain. On + // sending transmission event, `consumer_redistribution_fraction` of the + // accumulated tokens are sent to the consumer redistribution address. + int64 blocks_per_distribution_transmission = 12; + // 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 = 13; + // The ID of a token transfer channel used for the Reward Distribution + // sub-protocol. If DistributionTransmissionChannel == "", a new transfer + // channel is created on top of the same connection as the CCV channel. + // Note that transfer_channel_id is the ID of the channel end on the consumer + // chain. it is most relevant for chains performing a sovereign to consumer + // changeover in order to maintan the existing ibc transfer channel + string distribution_transmission_channel = 14; +} + +// ConsumerRemovalProposal is a governance proposal on the provider chain to +// remove (and stop) a consumer chain. If it passes, all the consumer chain's +// state is removed from the provider chain. The outstanding unbonding operation +// funds are released. message ConsumerRemovalProposal { - // the title of the proposal - string title = 1; - // the description of the proposal - string description = 2; - // the chain-id of the consumer chain to be stopped - string chain_id = 3; - // the time on the provider chain at which all validators are responsible to stop their consumer chain validator node - google.protobuf.Timestamp stop_time = 4 - [(gogoproto.stdtime) = true, (gogoproto.nullable) = false]; - } + // the title of the proposal + string title = 1; + // the description of the proposal + string description = 2; + // the chain-id of the consumer chain to be stopped + string chain_id = 3; + // the time on the provider chain at which all validators are responsible to + // stop their consumer chain validator node + google.protobuf.Timestamp stop_time = 4 + [ (gogoproto.stdtime) = true, (gogoproto.nullable) = false ]; +} message EquivocationProposal { // the title of the proposal string title = 1; // the description of the proposal string description = 2; - // the list of equivocations that will be processed + // the list of equivocations that will be processed repeated cosmos.evidence.v1beta1.Equivocation equivocations = 3; } -// A persisted queue entry indicating that a slash packet data instance needs to be handled. -// This type belongs in the "global" queue, to coordinate slash packet handling times between consumers. +// A persisted queue entry indicating that a slash packet data instance needs to +// be handled. This type belongs in the "global" queue, to coordinate slash +// packet handling times between consumers. message GlobalSlashEntry { // Block time that slash packet was received by provider chain. // This field is used for store key iteration ordering. google.protobuf.Timestamp recv_time = 1 - [(gogoproto.stdtime) = true, (gogoproto.nullable) = false]; + [ (gogoproto.stdtime) = true, (gogoproto.nullable) = false ]; // The consumer that sent a slash packet. - string consumer_chain_id = 2 - [(gogoproto.customname) = "ConsumerChainID"]; - // The IBC sequence number of the recv packet. + string consumer_chain_id = 2 [ (gogoproto.customname) = "ConsumerChainID" ]; + // The IBC sequence number of the recv packet. // This field is used in the store key to ensure uniqueness. - uint64 ibc_seq_num = 3; - // The provider's consensus address of the validator being slashed. + uint64 ibc_seq_num = 3; + // The provider's consensus address of the validator being slashed. // This field is used to obtain validator power in HandleThrottleQueues. - // - // This field is not used in the store key, but is persisted in value bytes, see QueueGlobalSlashEntry. + // + // This field is not used in the store key, but is persisted in value bytes, + // see QueueGlobalSlashEntry. bytes provider_val_cons_addr = 4; } - + // Params defines the parameters for CCV Provider module message Params { 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 + // TrustingPeriodFraction is used to compute the consumer and provider IBC + // client's TrustingPeriod from the chain defined UnbondingPeriod string trusting_period_fraction = 2; // Sent IBC packets will timeout after this duration google.protobuf.Duration ccv_timeout_period = 3 - [(gogoproto.nullable) = false, (gogoproto.stdduration) = true]; - // The channel initialization (IBC channel opening handshake) will timeout after this duration + [ (gogoproto.nullable) = false, (gogoproto.stdduration) = true ]; + // The channel initialization (IBC channel opening handshake) will timeout + // after this duration google.protobuf.Duration init_timeout_period = 4 - [(gogoproto.nullable) = false, (gogoproto.stdduration) = true]; + [ (gogoproto.nullable) = false, (gogoproto.stdduration) = true ]; // The VSC packets sent by the provider will timeout after this duration. - // Note that unlike ccv_timeout_period which is an IBC param, - // the vsc_timeout_period is a provider-side param that enables the provider - // to timeout VSC packets even when a consumer chain is not live. + // Note that unlike ccv_timeout_period which is an IBC param, + // the vsc_timeout_period is a provider-side param that enables the provider + // to timeout VSC packets even when a consumer chain is not live. google.protobuf.Duration vsc_timeout_period = 5 - [(gogoproto.nullable) = false, (gogoproto.stdduration) = true]; + [ (gogoproto.nullable) = false, (gogoproto.stdduration) = true ]; // The period for which the slash meter is replenished google.protobuf.Duration slash_meter_replenish_period = 6 - [(gogoproto.nullable) = false, (gogoproto.stdduration) = true]; + [ (gogoproto.nullable) = false, (gogoproto.stdduration) = true ]; - // The fraction of total voting power 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. + // The fraction of total voting power 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. string slash_meter_replenish_fraction = 7; - // The maximum amount of throttled slash or vsc matured packets + // 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]; + [ (gogoproto.nullable) = false ]; } message HandshakeMetadata { @@ -157,26 +171,24 @@ message HandshakeMetadata { // SlashAcks contains cons addresses of consumer chain validators // successfully slashed on the provider chain -message SlashAcks { - repeated string addresses = 1; -} +message SlashAcks { repeated string addresses = 1; } -// ConsumerAdditionProposals holds pending governance proposals on the provider chain to spawn a new chain. +// ConsumerAdditionProposals holds pending governance proposals on the provider +// chain to spawn a new chain. message ConsumerAdditionProposals { // proposals waiting for spawn_time to pass repeated ConsumerAdditionProposal pending = 1; } -// ConsumerRemovalProposals holds pending governance proposals on the provider chain to remove (and stop) a consumer chain. +// ConsumerRemovalProposals holds pending governance proposals on the provider +// chain to remove (and stop) a consumer chain. message ConsumerRemovalProposals { // proposals waiting for stop_time to pass repeated ConsumerRemovalProposal pending = 1; } // AddressList contains a list of consensus addresses -message AddressList { - repeated bytes addresses = 1; -} +message AddressList { repeated bytes addresses = 1; } message ChannelToChain { string channel_id = 1; @@ -184,13 +196,13 @@ message ChannelToChain { } // VscUnbondingOps contains the IDs of unbonding operations that are waiting for -// at least one VSCMaturedPacket with vscID from a consumer chain +// at least one VSCMaturedPacket with vscID from a consumer chain message VscUnbondingOps { uint64 vsc_id = 1; repeated uint64 unbonding_op_ids = 2; } -// UnbondingOp contains the ids of consumer chains that need to unbond before +// UnbondingOp contains the ids of consumer chains that need to unbond before // the unbonding operation with the given ID can unbond message UnbondingOp { uint64 id = 1; @@ -205,7 +217,8 @@ message InitTimeoutTimestamp { message VscSendTimestamp { uint64 vsc_id = 1; - google.protobuf.Timestamp timestamp = 2 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false]; + google.protobuf.Timestamp timestamp = 2 + [ (gogoproto.stdtime) = true, (gogoproto.nullable) = false ]; } // @@ -219,7 +232,8 @@ message KeyAssignmentReplacement { } // Used to serialize the ValidatorConsumerPubKey index from key assignment -// ValidatorConsumerPubKey: (chainID, providerAddr consAddr) -> consumerKey tmprotocrypto.PublicKey +// ValidatorConsumerPubKey: (chainID, providerAddr consAddr) -> consumerKey +// tmprotocrypto.PublicKey message ValidatorConsumerPubKey { string chain_id = 1; bytes provider_addr = 2; @@ -227,7 +241,8 @@ message ValidatorConsumerPubKey { } // Used to serialize the ValidatorConsumerAddr index from key assignment -// ValidatorByConsumerAddr: (chainID, consumerAddr consAddr) -> providerAddr consAddr +// ValidatorByConsumerAddr: (chainID, consumerAddr consAddr) -> providerAddr +// consAddr message ValidatorByConsumerAddr { string chain_id = 1; bytes consumer_addr = 2; diff --git a/proto/interchain_security/ccv/provider/v1/query.proto b/proto/interchain_security/ccv/provider/v1/query.proto index c98a8cba1e..4709b287dd 100644 --- a/proto/interchain_security/ccv/provider/v1/query.proto +++ b/proto/interchain_security/ccv/provider/v1/query.proto @@ -10,7 +10,6 @@ import "interchain_security/ccv/v1/ccv.proto"; import "interchain_security/ccv/consumer/v1/genesis.proto"; import "interchain_security/ccv/provider/v1/provider.proto"; - service Query { // ConsumerGenesis queries the genesis state needed to start a consumer chain // whose proposal has been accepted @@ -46,33 +45,41 @@ service Query { // assigned by a validator for a consumer chain. rpc QueryValidatorConsumerAddr(QueryValidatorConsumerAddrRequest) returns (QueryValidatorConsumerAddrResponse) { - option (google.api.http).get = "/interchain_security/ccv/provider/validator_consumer_addr"; + option (google.api.http).get = + "/interchain_security/ccv/provider/validator_consumer_addr"; } // QueryProviderAddr returns the provider chain validator // given a consumer chain validator address rpc QueryValidatorProviderAddr(QueryValidatorProviderAddrRequest) returns (QueryValidatorProviderAddrResponse) { - option (google.api.http).get = "/interchain_security/ccv/provider/validator_provider_addr"; + option (google.api.http).get = + "/interchain_security/ccv/provider/validator_provider_addr"; } - // QueryThrottleState returns the main on-chain state relevant to currently throttled slash packets + // QueryThrottleState returns the main on-chain state relevant to currently + // throttled slash packets rpc QueryThrottleState(QueryThrottleStateRequest) returns (QueryThrottleStateResponse) { - option (google.api.http).get = "/interchain_security/ccv/provider/throttle_state"; + option (google.api.http).get = + "/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 + // 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"; + 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(QueryRegisteredConsumerRewardDenomsRequest) + // QueryRegisteredConsumerRewardDenoms returns a list of consumer reward + // denoms that are registered + rpc QueryRegisteredConsumerRewardDenoms( + QueryRegisteredConsumerRewardDenomsRequest) returns (QueryRegisteredConsumerRewardDenomsResponse) { - option (google.api.http).get = "/interchain_security/ccv/provider/registered_consumer_reward_denoms"; + option (google.api.http).get = + "/interchain_security/ccv/provider/registered_consumer_reward_denoms"; } } @@ -89,13 +96,13 @@ message QueryConsumerChainsResponse { repeated Chain chains = 1; } message QueryConsumerChainStartProposalsRequest {} -message QueryConsumerChainStartProposalsResponse { +message QueryConsumerChainStartProposalsResponse { ConsumerAdditionProposals proposals = 1; } message QueryConsumerChainStopProposalsRequest {} -message QueryConsumerChainStopProposalsResponse { +message QueryConsumerChainStopProposalsResponse { ConsumerRemovalProposals proposals = 1; } @@ -110,8 +117,7 @@ message QueryValidatorConsumerAddrRequest { // The id of the consumer chain string chain_id = 1; // The consensus address of the validator on the provider chain - string provider_address = 2 - [ (gogoproto.moretags) = "yaml:\"address\"" ]; + string provider_address = 2 [ (gogoproto.moretags) = "yaml:\"address\"" ]; } message QueryValidatorConsumerAddrResponse { @@ -125,8 +131,7 @@ message QueryValidatorProviderAddrRequest { // The id of the provider chain string chain_id = 1; // The consensus address of the validator on the consumer chain - string consumer_address = 2 - [ (gogoproto.moretags) = "yaml:\"address\"" ]; + string consumer_address = 2 [ (gogoproto.moretags) = "yaml:\"address\"" ]; } message QueryValidatorProviderAddrResponse { @@ -139,36 +144,37 @@ message QueryThrottleStateRequest {} message QueryThrottleStateResponse { // current slash_meter state int64 slash_meter = 1; - // allowance of voting power units (int) that the slash meter is given per replenish period - // this also serves as the max value for the meter. + // allowance of voting power units (int) that the slash meter is given per + // replenish period this also serves as the max value for the meter. int64 slash_meter_allowance = 2; - // next time the slash meter could potentially be replenished, iff it's not full + // next time the slash meter could potentially be replenished, iff it's not + // full google.protobuf.Timestamp next_replenish_candidate = 3 - [(gogoproto.stdtime) = true, (gogoproto.nullable) = false]; + [ (gogoproto.stdtime) = true, (gogoproto.nullable) = false ]; // data relevant to currently throttled slash packets repeated ThrottledSlashPacket packets = 4; } -message QueryThrottledConsumerPacketDataRequest { - string chain_id = 1; -} +message QueryThrottledConsumerPacketDataRequest { string chain_id = 1; } message QueryThrottledConsumerPacketDataResponse { string chain_id = 1; uint64 size = 2; repeated ThrottledPacketDataWrapper packetDataInstances = 3 - [(gogoproto.nullable) = false]; + [ (gogoproto.nullable) = false ]; } -// A query wrapper type for the global entry and data relevant to a throttled slash packet. +// 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]; + [ (gogoproto.nullable) = false ]; interchain_security.ccv.v1.SlashPacketData data = 2 - [(gogoproto.nullable) = false]; + [ (gogoproto.nullable) = false ]; } -// ThrottledPacketDataWrapper contains either SlashPacketData or VSCMaturedPacketData +// ThrottledPacketDataWrapper contains either SlashPacketData or +// VSCMaturedPacketData message ThrottledPacketDataWrapper { oneof data { interchain_security.ccv.v1.SlashPacketData slash_packet = 1; diff --git a/proto/interchain_security/ccv/provider/v1/tx.proto b/proto/interchain_security/ccv/provider/v1/tx.proto index 705e155317..3093132727 100644 --- a/proto/interchain_security/ccv/provider/v1/tx.proto +++ b/proto/interchain_security/ccv/provider/v1/tx.proto @@ -10,8 +10,10 @@ import "google/protobuf/any.proto"; // Msg defines the Msg service. service Msg { - rpc AssignConsumerKey(MsgAssignConsumerKey) returns (MsgAssignConsumerKeyResponse); - rpc RegisterConsumerRewardDenom(MsgRegisterConsumerRewardDenom) returns (MsgRegisterConsumerRewardDenomResponse); + rpc AssignConsumerKey(MsgAssignConsumerKey) + returns (MsgAssignConsumerKeyResponse); + rpc RegisterConsumerRewardDenom(MsgRegisterConsumerRewardDenom) + returns (MsgRegisterConsumerRewardDenomResponse); } message MsgAssignConsumerKey { @@ -20,26 +22,26 @@ message MsgAssignConsumerKey { // The chain id of the consumer chain to assign a consensus public key to string chain_id = 1; // The validator address on the provider - string provider_addr = 2 - [ (gogoproto.moretags) = "yaml:\"address\"" ]; + string provider_addr = 2 [ (gogoproto.moretags) = "yaml:\"address\"" ]; // The consensus public key to use on the consumer. - // in json string format corresponding to proto-any, ex: + // in json string format corresponding to proto-any, ex: // `{"@type":"/cosmos.crypto.ed25519.PubKey","key":"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is="}` string consumer_key = 3; } message MsgAssignConsumerKeyResponse {} -// MsgRegisterConsumerRewardDenom allows an account to register -// a consumer reward denom, i.e., add it to the list of denoms +// MsgRegisterConsumerRewardDenom allows an account to register +// a consumer reward denom, i.e., add it to the list of denoms // accepted by the provider as rewards. message MsgRegisterConsumerRewardDenom { - option (gogoproto.equal) = false; + option (gogoproto.equal) = false; option (gogoproto.goproto_getters) = false; string denom = 1; string depositor = 2; } -// MsgRegisterConsumerRewardDenomResponse defines the Msg/RegisterConsumerRewardDenom response type. +// MsgRegisterConsumerRewardDenomResponse defines the +// Msg/RegisterConsumerRewardDenom response type. message MsgRegisterConsumerRewardDenomResponse {} \ No newline at end of file diff --git a/proto/interchain_security/ccv/v1/ccv.proto b/proto/interchain_security/ccv/v1/ccv.proto index f13951f4d6..730366ea7f 100644 --- a/proto/interchain_security/ccv/v1/ccv.proto +++ b/proto/interchain_security/ccv/v1/ccv.proto @@ -27,9 +27,8 @@ message ValidatorSetChangePacketData { // List of ccv.ValidatorSetChangePacketData. message ValidatorSetChangePackets { - repeated ValidatorSetChangePacketData list = 1 [ - (gogoproto.nullable) = false - ]; + repeated ValidatorSetChangePacketData list = 1 + [ (gogoproto.nullable) = false ]; } // This packet is sent from the consumer chain to the provider chain @@ -50,17 +49,16 @@ message SlashPacketData { // map to the infraction block height on the provider uint64 valset_update_id = 2; // tell if the slashing is for a downtime or a double-signing infraction - cosmos.staking.v1beta1.InfractionType infraction = 3; + cosmos.staking.v1beta1.Infraction infraction = 3; } -// MaturedUnbondingOps defines a list of ids corresponding to ids of matured unbonding operations. -message MaturedUnbondingOps { - repeated uint64 ids = 1; -} +// MaturedUnbondingOps defines a list of ids corresponding to ids of matured +// unbonding operations. +message MaturedUnbondingOps { repeated uint64 ids = 1; } // ConsumerPacketData contains a consumer packet data and a type tag message ConsumerPacketData { - ConsumerPacketDataType type = 1; + ConsumerPacketDataType type = 1; oneof data { SlashPacketData slashPacketData = 2; @@ -68,22 +66,22 @@ message ConsumerPacketData { } } - // ConsumerPacketDataList is a list of consumer packet data packets. message ConsumerPacketDataList { - repeated ConsumerPacketData list = 1 - [ (gogoproto.nullable) = false ]; + repeated ConsumerPacketData list = 1 [ (gogoproto.nullable) = false ]; } - // ConsumerPacketType indicates interchain security specific packet types. enum ConsumerPacketDataType { option (gogoproto.goproto_enum_prefix) = false; // UNSPECIFIED packet type - CONSUMER_PACKET_TYPE_UNSPECIFIED = 0 [(gogoproto.enumvalue_customname) = "UnspecifiedPacket"]; + CONSUMER_PACKET_TYPE_UNSPECIFIED = 0 + [ (gogoproto.enumvalue_customname) = "UnspecifiedPacket" ]; // Slash packet - CONSUMER_PACKET_TYPE_SLASH = 1 [(gogoproto.enumvalue_customname) = "SlashPacket"]; + CONSUMER_PACKET_TYPE_SLASH = 1 + [ (gogoproto.enumvalue_customname) = "SlashPacket" ]; // VSCMatured packet - CONSUMER_PACKET_TYPE_VSCM = 2 [(gogoproto.enumvalue_customname) = "VscMaturedPacket"]; + CONSUMER_PACKET_TYPE_VSCM = 2 + [ (gogoproto.enumvalue_customname) = "VscMaturedPacket" ]; } \ No newline at end of file diff --git a/scripts/protocgen.sh b/scripts/protocgen.sh index 530b0fc24d..a6ca6098e4 100644 --- a/scripts/protocgen.sh +++ b/scripts/protocgen.sh @@ -19,4 +19,3 @@ cd .. cp -r github.com/cosmos/interchain-security/v2/* ./ rm -rf github.com -go mod tidy -compat=1.19 diff --git a/tests/difference/core/driver/common.go b/tests/difference/core/driver/common.go index b05b794203..bff271e235 100644 --- a/tests/difference/core/driver/common.go +++ b/tests/difference/core/driver/common.go @@ -3,11 +3,10 @@ package core import ( "time" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + tmtypes "github.com/cometbft/cometbft/types" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - abci "github.com/tendermint/tendermint/abci/types" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - tmtypes "github.com/tendermint/tendermint/types" ) const ( @@ -36,7 +35,7 @@ type InitState struct { Trusting time.Duration MaxClockDrift time.Duration BlockInterval time.Duration - ConsensusParams *abci.ConsensusParams + ConsensusParams *tmproto.ConsensusParams ValStates ValStates MaxEntries int } @@ -76,8 +75,8 @@ func init() { }, }, MaxEntries: 1000000, - ConsensusParams: &abci.ConsensusParams{ - Block: &abci.BlockParams{ + ConsensusParams: &tmproto.ConsensusParams{ + Block: &tmproto.BlockParams{ MaxBytes: 9223372036854775807, MaxGas: 9223372036854775807, }, diff --git a/tests/difference/core/driver/core_test.go b/tests/difference/core/driver/core_test.go index 389935e2bc..df20aef074 100644 --- a/tests/difference/core/driver/core_test.go +++ b/tests/difference/core/driver/core_test.go @@ -8,7 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/suite" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" ibctestingcore "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/core" ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" @@ -66,7 +66,7 @@ func (s *CoreSuite) consumerChain() *ibctesting.TestChain { } func (b *CoreSuite) providerStakingKeeper() stakingkeeper.Keeper { - return b.providerChain().App.(*appProvider.App).StakingKeeper + return *b.providerChain().App.(*appProvider.App).StakingKeeper } func (b *CoreSuite) providerSlashingKeeper() slashingkeeper.Keeper { @@ -152,7 +152,8 @@ func (s *CoreSuite) delegatorBalance() int64 { // delegate delegates amt tokens to validator val func (s *CoreSuite) delegate(val, amt int64) { - server := stakingkeeper.NewMsgServerImpl(s.providerStakingKeeper()) + providerStaking := s.providerStakingKeeper() + server := stakingkeeper.NewMsgServerImpl(&providerStaking) coin := sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(amt)) d := s.delegator() v := s.validator(val) @@ -164,7 +165,8 @@ func (s *CoreSuite) delegate(val, amt int64) { // undelegate undelegates amt tokens from validator val func (s *CoreSuite) undelegate(val, amt int64) { - server := stakingkeeper.NewMsgServerImpl(s.providerStakingKeeper()) + providerStaking := s.providerStakingKeeper() + server := stakingkeeper.NewMsgServerImpl(&providerStaking) coin := sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(amt)) d := s.delegator() v := s.validator(val) @@ -177,13 +179,13 @@ func (s *CoreSuite) undelegate(val, amt int64) { // consumerSlash simulates a slash event occurring on the consumer chain. // It can be for a downtime or doublesign. func (s *CoreSuite) consumerSlash(val sdk.ConsAddress, h int64, isDowntime bool) { - kind := stakingtypes.DoubleSign + kind := stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN if isDowntime { - kind = stakingtypes.Downtime + kind = stakingtypes.Infraction_INFRACTION_DOWNTIME } ctx := s.ctx(C) before := len(ctx.EventManager().Events()) - s.consumerKeeper().Slash(ctx, val, h, 0, sdk.Dec{}, kind) + s.consumerKeeper().SlashWithInfractionReason(ctx, val, h, 0, sdk.Dec{}, kind) // consumer module emits packets on slash, so these must be collected. evts := ctx.EventManager().ABCIEvents() for _, e := range evts[before:] { diff --git a/tests/difference/core/driver/seed_gen_fuzzy_test.go b/tests/difference/core/driver/seed_gen_fuzzy_test.go index 5843cf9f04..0ea051c63b 100644 --- a/tests/difference/core/driver/seed_gen_fuzzy_test.go +++ b/tests/difference/core/driver/seed_gen_fuzzy_test.go @@ -6,11 +6,11 @@ import ( cryptoEd25519 "crypto/ed25519" + tmtypes "github.com/cometbft/cometbft/types" cosmosEd25519 "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - mock "github.com/cosmos/ibc-go/v4/testing/mock" - tmtypes "github.com/tendermint/tendermint/types" + mock "github.com/cosmos/ibc-go/v7/testing/mock" ) func GetPV(seed []byte) mock.PV { diff --git a/tests/difference/core/driver/setup.go b/tests/difference/core/driver/setup.go index 4798c2e3ca..1e77588c64 100644 --- a/tests/difference/core/driver/setup.go +++ b/tests/difference/core/driver/setup.go @@ -6,6 +6,10 @@ import ( "encoding/json" "time" + abci "github.com/cometbft/cometbft/abci/types" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + tmtypes "github.com/cometbft/cometbft/types" + "github.com/cosmos/cosmos-sdk/baseapp" codectypes "github.com/cosmos/cosmos-sdk/codec/types" cosmosEd25519 "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" @@ -14,20 +18,17 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" - abci "github.com/tendermint/tendermint/abci/types" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - tmtypes "github.com/tendermint/tendermint/types" ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - commitmenttypes "github.com/cosmos/ibc-go/v4/modules/core/23-commitment/types" - ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - "github.com/cosmos/ibc-go/v4/testing/mock" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + "github.com/cosmos/ibc-go/v7/testing/mock" slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" @@ -68,7 +69,7 @@ func (b *Builder) consumerCtx() sdk.Context { } func (b *Builder) providerStakingKeeper() stakingkeeper.Keeper { - return b.provider().App.(*appProvider.App).StakingKeeper + return *b.provider().App.(*appProvider.App).StakingKeeper } func (b *Builder) providerSlashingKeeper() slashingkeeper.Keeper { @@ -156,6 +157,7 @@ func (b *Builder) getAppBytesAndSenders( // Sum bonded is needed for BondedPool account sumBonded := sdk.NewInt(0) + initValPowers := []abci.ValidatorUpdate{} for i, val := range validators.Validators { status := b.initState.ValStates.Status[i] @@ -195,10 +197,18 @@ func (b *Builder) getAppBytesAndSenders( delegations = append(delegations, stakingtypes.NewDelegation(accounts[0].GetAddress(), val.Address.Bytes(), delShares)) // Remaining delegation is from extra account delegations = append(delegations, stakingtypes.NewDelegation(accounts[1].GetAddress(), val.Address.Bytes(), sumShares.Sub(delShares))) + + // add initial validator powers so consumer InitGenesis runs correctly + pub, _ := val.ToProto() + initValPowers = append(initValPowers, abci.ValidatorUpdate{ + Power: val.VotingPower, + PubKey: pub.PubKey, + }) } bondDenom := sdk.DefaultBondDenom genesisStaking := stakingtypes.GenesisState{} + genesisConsumer := consumertypes.GenesisState{} if genesis[stakingtypes.ModuleName] != nil { // If staking module genesis already exists @@ -206,6 +216,13 @@ func (b *Builder) getAppBytesAndSenders( bondDenom = genesisStaking.Params.BondDenom } + if genesis[consumertypes.ModuleName] != nil { + app.AppCodec().MustUnmarshalJSON(genesis[consumertypes.ModuleName], &genesisConsumer) + genesisConsumer.InitialValSet = initValPowers + genesisConsumer.Params.Enabled = true + genesis[consumertypes.ModuleName] = app.AppCodec().MustMarshalJSON(&genesisConsumer) + } + // Set model parameters genesisStaking.Params.MaxEntries = uint32(b.initState.MaxEntries) genesisStaking.Params.MaxValidators = uint32(b.initState.MaxValidators) @@ -226,7 +243,7 @@ func (b *Builder) getAppBytesAndSenders( }) // update total funds supply - genesisBank := banktypes.NewGenesisState(banktypes.DefaultGenesisState().Params, balances, sdk.NewCoins(), []banktypes.Metadata{}) + genesisBank := banktypes.NewGenesisState(banktypes.DefaultGenesisState().Params, balances, sdk.NewCoins(), []banktypes.Metadata{}, []banktypes.SendEnabled{}) genesis[banktypes.ModuleName] = app.AppCodec().MustMarshalJSON(genesisBank) stateBytes, err := json.MarshalIndent(genesis, "", " ") @@ -244,6 +261,8 @@ func (b *Builder) newChain( ) *ibctesting.TestChain { app, genesis := appInit() + baseapp.SetChainID(chainID)(app.GetBaseApp()) + stateBytes, senderAccounts := b.getAppBytesAndSenders(chainID, app, genesis, validators) app.InitChain( @@ -387,7 +406,8 @@ func (b *Builder) delegate(del int, val sdk.ValAddress, amt int64) { d := b.provider().SenderAccounts[del].SenderAccount.GetAddress() coins := sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(amt)) msg := stakingtypes.NewMsgDelegate(d, val, coins) - pskServer := stakingkeeper.NewMsgServerImpl(b.providerStakingKeeper()) + providerStaking := b.providerStakingKeeper() + pskServer := stakingkeeper.NewMsgServerImpl(&providerStaking) _, err := pskServer.Delegate(sdk.WrapSDKContext(b.providerCtx()), msg) b.suite.Require().NoError(err) } @@ -415,7 +435,8 @@ func (b *Builder) addValidatorToStakingModule(privVal mock.PV) { stakingtypes.NewCommissionRates(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()), sdk.ZeroInt()) b.suite.Require().NoError(err) - pskServer := stakingkeeper.NewMsgServerImpl(b.providerStakingKeeper()) + providerStaking := b.providerStakingKeeper() + pskServer := stakingkeeper.NewMsgServerImpl(&providerStaking) _, _ = pskServer.CreateValidator(sdk.WrapSDKContext(b.providerCtx()), msg) } @@ -455,8 +476,10 @@ func (b *Builder) setProviderParams() { slash := b.providerSlashingKeeper().GetParams(b.providerCtx()) slash.SlashFractionDoubleSign = b.initState.SlashDoublesign slash.SlashFractionDowntime = b.initState.SlashDowntime - b.providerSlashingKeeper().SetParams(b.providerCtx(), slash) - + err := b.providerSlashingKeeper().SetParams(b.providerCtx(), slash) + if err != nil { + panic(err) + } // Set the throttle factors throttle := b.providerKeeper().GetParams(b.providerCtx()) throttle.SlashMeterReplenishFraction = "1.0" @@ -495,7 +518,7 @@ func (b *Builder) createConsumersLocalClientGenesis() *ibctmtypes.ClientState { return ibctmtypes.NewClientState( b.provider().ChainID, tmCfg.TrustLevel, tmCfg.TrustingPeriod, tmCfg.UnbondingPeriod, tmCfg.MaxClockDrift, b.provider().LastHeader.GetHeight().(clienttypes.Height), commitmenttypes.GetSDKSpecs(), - []string{"upgrade", "upgradedIBCState"}, tmCfg.AllowUpdateAfterExpiry, tmCfg.AllowUpdateAfterMisbehaviour, + []string{"upgrade", "upgradedIBCState"}, ) } diff --git a/tests/e2e/actions.go b/tests/e2e/actions.go index ecad541290..a16f6b3bd4 100644 --- a/tests/e2e/actions.go +++ b/tests/e2e/actions.go @@ -13,9 +13,9 @@ import ( "time" evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" "github.com/cosmos/interchain-security/v2/x/ccv/provider/client" "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" "github.com/tidwall/gjson" @@ -47,7 +47,6 @@ func (tr TestRun) sendTokens( `--home`, tr.getValidatorHome(action.chain, action.from), `--node`, tr.getValidatorNode(action.chain, action.from), `--keyring-backend`, `test`, - `-b`, `block`, `-y`, ) if verbose { @@ -57,6 +56,9 @@ func (tr TestRun) sendTokens( if err != nil { log.Fatal(err, "\n", string(bz)) } + + // wait for inclusion in a block -> '--broadcast-mode block' is deprecated + tr.waitBlocks(action.chain, 2, 30*time.Second) } type StartChainAction struct { @@ -186,7 +188,6 @@ type submitTextProposalAction struct { chain chainID from validatorID deposit uint - propType string title string description string } @@ -195,26 +196,26 @@ func (tr TestRun) submitTextProposal( action submitTextProposalAction, verbose bool, ) { + // TEXT PROPOSAL //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. bz, err := exec.Command("docker", "exec", tr.containerConfig.instanceName, tr.chainConfigs[action.chain].binaryName, - - "tx", "gov", "submit-proposal", + "tx", "gov", "submit-legacy-proposal", `--title`, action.title, `--description`, action.description, - `--type`, action.propType, `--deposit`, fmt.Sprint(action.deposit)+`stake`, - `--from`, `validator`+fmt.Sprint(action.from), `--chain-id`, string(tr.chainConfigs[action.chain].chainId), `--home`, tr.getValidatorHome(action.chain, action.from), `--node`, tr.getValidatorNode(action.chain, action.from), `--keyring-backend`, `test`, - `-b`, `block`, `-y`, ).CombinedOutput() if err != nil { log.Fatal(err, "\n", string(bz)) } + + // wait for inclusion in a block -> '--broadcast-mode block' is deprecated + tr.waitBlocks(action.chain, 1, 10*time.Second) } type submitConsumerAdditionProposalAction struct { @@ -236,7 +237,7 @@ func (tr TestRun) submitConsumerAdditionProposal( params := consumertypes.DefaultParams() prop := client.ConsumerAdditionProposalJSON{ Title: "Propose the addition of a new chain", - Description: "Gonna be a great chain", + Summary: "Gonna be a great chain", ChainId: string(tr.chainConfigs[action.consumerChain].chainId), InitialHeight: action.initialHeight, GenesisHash: []byte("gen_hash"), @@ -271,24 +272,24 @@ func (tr TestRun) submitConsumerAdditionProposal( } //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. + // CONSUMER ADDITION PROPOSAL bz, err = exec.Command("docker", "exec", tr.containerConfig.instanceName, tr.chainConfigs[action.chain].binaryName, - - "tx", "gov", "submit-proposal", "consumer-addition", - "/temp-proposal.json", - + "tx", "gov", "submit-legacy-proposal", "consumer-addition", "/temp-proposal.json", `--from`, `validator`+fmt.Sprint(action.from), `--chain-id`, string(tr.chainConfigs[action.chain].chainId), `--home`, tr.getValidatorHome(action.chain, action.from), `--gas`, `900000`, `--node`, tr.getValidatorNode(action.chain, action.from), `--keyring-backend`, `test`, - `-b`, `block`, `-y`, ).CombinedOutput() if err != nil { log.Fatal(err, "\n", string(bz)) } + + // wait for inclusion in a block -> '--broadcast-mode block' is deprecated + tr.waitBlocks(chainID("provi"), 2, 10*time.Second) } type submitConsumerRemovalProposalAction struct { @@ -305,11 +306,11 @@ func (tr TestRun) submitConsumerRemovalProposal( ) { stopTime := tr.containerConfig.now.Add(action.stopTimeOffset) prop := client.ConsumerRemovalProposalJSON{ - Title: fmt.Sprintf("Stop the %v chain", action.consumerChain), - Description: "It was a great chain", - ChainId: string(tr.chainConfigs[action.consumerChain].chainId), - StopTime: stopTime, - Deposit: fmt.Sprint(action.deposit) + `stake`, + Title: fmt.Sprintf("Stop the %v chain", action.consumerChain), + Summary: "It was a great chain", + ChainId: string(tr.chainConfigs[action.consumerChain].chainId), + StopTime: stopTime, + Deposit: fmt.Sprint(action.deposit) + `stake`, } bz, err := json.Marshal(prop) @@ -331,26 +332,27 @@ func (tr TestRun) submitConsumerRemovalProposal( } //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. + // CONSUMER REMOVAL PROPOSAL bz, err = exec.Command("docker", "exec", tr.containerConfig.instanceName, tr.chainConfigs[action.chain].binaryName, - - "tx", "gov", "submit-proposal", "consumer-removal", - "/temp-proposal.json", - + "tx", "gov", "submit-legacy-proposal", "consumer-removal", "/temp-proposal.json", `--from`, `validator`+fmt.Sprint(action.from), `--chain-id`, string(tr.chainConfigs[action.chain].chainId), `--home`, tr.getValidatorHome(action.chain, action.from), `--node`, tr.getValidatorNode(action.chain, action.from), + `--gas`, "900000", `--keyring-backend`, `test`, - `-b`, `block`, `-y`, ).CombinedOutput() if err != nil { log.Fatal(err, "\n", string(bz)) } + + // wait for inclusion in a block -> '--broadcast-mode block' is deprecated + tr.waitBlocks(chainID("provi"), 2, 20*time.Second) } -type submitParamChangeProposalAction struct { +type submitParamChangeLegacyProposalAction struct { chain chainID from validatorID deposit uint @@ -361,6 +363,7 @@ type submitParamChangeProposalAction struct { type paramChangeProposalJSON struct { Title string `json:"title"` + Summary string `json:"summary"` Description string `json:"description"` Changes []paramChangeJSON `json:"changes"` Deposit string `json:"deposit"` @@ -373,12 +376,13 @@ type paramChangeJSON struct { } func (tr TestRun) submitParamChangeProposal( - action submitParamChangeProposalAction, + action submitParamChangeLegacyProposalAction, verbose bool, ) { prop := paramChangeProposalJSON{ - Title: "Param change", - Description: "Changing module params", + Title: "Legacy Param change", + Summary: "Changing legacy module params", + Description: "Changing legacy module params", Changes: []paramChangeJSON{{Subspace: action.subspace, Key: action.key, Value: action.value}}, Deposit: fmt.Sprint(action.deposit) + `stake`, } @@ -402,24 +406,25 @@ func (tr TestRun) submitParamChangeProposal( } //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. - bz, err = exec.Command("docker", "exec", tr.containerConfig.instanceName, tr.chainConfigs[action.chain].binaryName, - - "tx", "gov", "submit-proposal", "param-change", - "/params-proposal.json", - + // PARAM CHANGE PROPOSAL // we should be able to make these all one command which will be cool + cmd := exec.Command("docker", "exec", tr.containerConfig.instanceName, tr.chainConfigs[action.chain].binaryName, + "tx", "gov", "submit-legacy-proposal", "param-change", "/params-proposal.json", `--from`, `validator`+fmt.Sprint(action.from), `--chain-id`, string(tr.chainConfigs[action.chain].chainId), `--home`, tr.getValidatorHome(action.chain, action.from), `--node`, tr.getValidatorNode(action.chain, action.from), `--gas`, "900000", `--keyring-backend`, `test`, - `-b`, `block`, `-y`, - ).CombinedOutput() + ) + bz, err = cmd.CombinedOutput() if err != nil { log.Fatal(err, "\n", string(bz)) } + + // wait for inclusion in a block -> '--broadcast-mode block' is deprecated + tr.waitBlocks(action.chain, 2, 60*time.Second) } type submitEquivocationProposalAction struct { @@ -437,6 +442,7 @@ func (tr TestRun) submitEquivocationProposal(action submitEquivocationProposalAc providerChain := tr.chainConfigs[chainID("provi")] prop := client.EquivocationProposalJSON{ + Summary: "Validator equivocation!", EquivocationProposal: types.EquivocationProposal{ Title: "Validator equivocation!", Description: fmt.Sprintf("Validator: %s has committed an equivocation infraction on chainID: %s", action.validator, action.chain), @@ -471,24 +477,24 @@ func (tr TestRun) submitEquivocationProposal(action submitEquivocationProposalAc } //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. + // EQUIVOCATION PROPOSAL bz, err = exec.Command("docker", "exec", tr.containerConfig.instanceName, providerChain.binaryName, - - "tx", "gov", "submit-proposal", "equivocation", - "/equivocation-proposal.json", - + "tx", "gov", "submit-legacy-proposal", "equivocation", "/equivocation-proposal.json", `--from`, `validator`+fmt.Sprint(action.from), `--chain-id`, string(providerChain.chainId), `--home`, tr.getValidatorHome(providerChain.chainId, action.from), `--node`, tr.getValidatorNode(providerChain.chainId, action.from), `--gas`, "9000000", `--keyring-backend`, `test`, - `-b`, `block`, `-y`, ).CombinedOutput() if err != nil { log.Fatal(err, "\n", string(bz)) } + + // wait for inclusion in a block -> '--broadcast-mode block' is deprecated + tr.waitBlocks(chainID("provi"), 2, 30*time.Second) } type voteGovProposalAction struct { @@ -520,7 +526,6 @@ func (tr *TestRun) voteGovProposal( `--node`, tr.getValidatorNode(action.chain, val), `--keyring-backend`, `test`, `--gas`, "900000", - `-b`, `block`, `-y`, ).CombinedOutput() if err != nil { @@ -530,7 +535,9 @@ func (tr *TestRun) voteGovProposal( } wg.Wait() - tr.WaitTime(time.Duration(tr.chainConfigs[action.chain].votingWaitTime) * time.Second) + // wait for inclusion in a block -> '--broadcast-mode block' is deprecated + tr.waitBlocks(action.chain, 1, 10*time.Second) + time.Sleep(time.Duration(tr.chainConfigs[action.chain].votingWaitTime) * time.Second) } type startConsumerChainAction struct { @@ -727,7 +734,7 @@ websocket_addr = "%s" [chains.gas_price] denom = "stake" - price = 0.00 + price = 0.000 [chains.trust_threshold] denominator = "3" @@ -1212,6 +1219,7 @@ func (tr TestRun) transferChannelComplete( "--dst-channel", "channel-"+fmt.Sprint(action.channelA), "--src-channel", "channel-"+fmt.Sprint(action.channelB), ) + executeCommand(chanOpenAckCmd, "transferChanOpenAck") //#nosec G204 -- Bypass linter warning for spawning subprocess with chanOpenConfirmCmd arguments. @@ -1374,9 +1382,9 @@ func (tr TestRun) delegateTokens( `--home`, tr.getValidatorHome(action.chain, action.from), `--node`, tr.getValidatorNode(action.chain, action.from), `--keyring-backend`, `test`, - `-b`, `block`, `-y`, ) + if verbose { fmt.Println("delegate cmd:", cmd.String()) } @@ -1386,6 +1394,7 @@ func (tr TestRun) delegateTokens( log.Fatal(err, "\n", string(bz)) } + // wait for inclusion in a block -> '--broadcast-mode block' is deprecated tr.waitBlocks(action.chain, 1, 10*time.Second) } @@ -1418,9 +1427,9 @@ func (tr TestRun) unbondTokens( `--node`, tr.getValidatorNode(action.chain, action.sender), `--gas`, "900000", `--keyring-backend`, `test`, - `-b`, `block`, `-y`, ) + if verbose { fmt.Println("unbond cmd:", cmd.String()) } @@ -1430,7 +1439,76 @@ func (tr TestRun) unbondTokens( log.Fatal(err, "\n", string(bz)) } - tr.waitBlocks(action.chain, 1, 10*time.Second) + // wait for inclusion in a block -> '--broadcast-mode block' is deprecated + tr.waitBlocks(action.chain, 2, 20*time.Second) +} + +type cancelUnbondTokensAction struct { + chain chainID + delegator validatorID + validator validatorID + amount uint +} + +func (tr TestRun) cancelUnbondTokens( + action cancelUnbondTokensAction, + verbose bool, +) { + validator := tr.validatorConfigs[action.validator].valoperAddress + if tr.validatorConfigs[action.validator].useConsumerKey { + validator = tr.validatorConfigs[action.validator].consumerValoperAddress + } + + // get creation-height from state + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. + cmd := exec.Command("docker", "exec", tr.containerConfig.instanceName, tr.chainConfigs[action.chain].binaryName, + "q", "staking", "unbonding-delegation", + tr.validatorConfigs[action.delegator].delAddress, + validator, + `--home`, tr.getValidatorHome(action.chain, action.delegator), + `--node`, tr.getValidatorNode(action.chain, action.delegator), + `-o`, `json`, + ) + if verbose { + fmt.Println("get unbonding delegations cmd:", cmd.String()) + } + + bz, err := cmd.CombinedOutput() + if err != nil { + log.Fatal(err, "\n", string(bz)) + } + creationHeight := gjson.Get(string(bz), "entries.0.creation_height").Int() + if creationHeight == 0 { + log.Fatal("invalid creation height") + } + + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. + cmd = exec.Command("docker", "exec", tr.containerConfig.instanceName, tr.chainConfigs[action.chain].binaryName, + "tx", "staking", "cancel-unbond", + validator, + fmt.Sprint(action.amount)+`stake`, + fmt.Sprint(creationHeight), + `--from`, `validator`+fmt.Sprint(action.delegator), + `--chain-id`, string(tr.chainConfigs[action.chain].chainId), + `--home`, tr.getValidatorHome(action.chain, action.delegator), + `--node`, tr.getValidatorNode(action.chain, action.delegator), + `--gas`, "900000", + `--keyring-backend`, `test`, + `-o`, `json`, + `-y`, + ) + + if verbose { + fmt.Println("unbond cmd:", cmd.String()) + } + + bz, err = cmd.CombinedOutput() + if err != nil { + log.Fatal(err, "\n", string(bz)) + } + + // wait for inclusion in a block -> '--broadcast-mode block' is deprecated + tr.waitBlocks(action.chain, 2, 20*time.Second) } type redelegateTokensAction struct { @@ -1470,7 +1548,6 @@ func (tr TestRun) redelegateTokens(action redelegateTokensAction, verbose bool) // Need to manually set gas limit past default (200000), since redelegate has a lot of operations `--gas`, "900000", `--keyring-backend`, `test`, - `-b`, `block`, `-y`, ) @@ -1483,7 +1560,8 @@ func (tr TestRun) redelegateTokens(action redelegateTokensAction, verbose bool) log.Fatal(err, "\n", string(bz)) } - tr.waitBlocks(action.chain, 1, 10*time.Second) + // wait for inclusion in a block -> '--broadcast-mode block' is deprecated + tr.waitBlocks(action.chain, 2, 10*time.Second) } type downtimeSlashAction struct { @@ -1509,7 +1587,7 @@ func (tr TestRun) invokeDowntimeSlash(action downtimeSlashAction, verbose bool) // Bring validator down tr.setValidatorDowntime(action.chain, action.validator, true, verbose) // Wait appropriate amount of blocks for validator to be slashed - tr.waitBlocks(action.chain, 12, 2*time.Minute) + tr.waitBlocks(action.chain, 10, 3*time.Minute) // Bring validator back up tr.setValidatorDowntime(action.chain, action.validator, false, verbose) } @@ -1577,7 +1655,7 @@ type unjailValidatorAction struct { // Sends an unjail transaction to the provider chain func (tr TestRun) unjailValidator(action unjailValidatorAction, verbose bool) { // wait a block to be sure downtime_jail_duration has elapsed - tr.waitBlocks(action.provider, 1, time.Minute) + time.Sleep(61 * time.Second) //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. cmd := exec.Command("docker", "exec", @@ -1591,9 +1669,9 @@ func (tr TestRun) unjailValidator(action unjailValidatorAction, verbose bool) { `--node`, tr.getValidatorNode(action.provider, action.validator), `--gas`, "900000", `--keyring-backend`, `test`, - `-b`, `block`, `-y`, ) + if verbose { fmt.Println("unjail cmd:", cmd.String()) } @@ -1605,7 +1683,7 @@ func (tr TestRun) unjailValidator(action unjailValidatorAction, verbose bool) { // wait for 1 blocks to make sure that tx got included // in a block and packets committed before proceeding - tr.waitBlocks(action.provider, 1, time.Minute) + tr.waitBlocks(action.provider, 2, time.Minute) } type registerRepresentativeAction struct { @@ -1651,12 +1729,14 @@ func (tr TestRun) registerRepresentative( `--home`, tr.getValidatorHome(action.chain, val), `--node`, tr.getValidatorNode(action.chain, val), `--keyring-backend`, `test`, - `-b`, `block`, `-y`, ).CombinedOutput() if err != nil { log.Fatal(err, "\n", string(bz)) } + + // wait for inclusion in a block -> '--broadcast-mode block' is deprecated + tr.waitBlocks(action.chain, 1, 10*time.Second) }(val, stake) } @@ -1738,7 +1818,7 @@ func (tr TestRun) assignConsumerPubKey(action assignConsumerPubKeyAction, verbos valCfg := tr.validatorConfigs[action.validator] assignKey := fmt.Sprintf( - `%s tx provider assign-consensus-key %s '%s' --from validator%s --chain-id %s --home %s --node %s --gas 900000 --keyring-backend test -b block -y -o json`, + `%s tx provider assign-consensus-key %s '%s' --from validator%s --chain-id %s --home %s --node %s --gas 90000 --keyring-backend test -y -o json`, tr.chainConfigs[chainID("provi")].binaryName, string(tr.chainConfigs[action.chain].chainId), action.consumerPubkey, @@ -1747,6 +1827,7 @@ func (tr TestRun) assignConsumerPubKey(action assignConsumerPubKeyAction, verbos tr.getValidatorHome(chainID("provi"), action.validator), tr.getValidatorNode(chainID("provi"), action.validator), ) + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. cmd := exec.Command("docker", "exec", tr.containerConfig.instanceName, @@ -1759,21 +1840,13 @@ func (tr TestRun) assignConsumerPubKey(action assignConsumerPubKeyAction, verbos } bz, err := cmd.CombinedOutput() - if err != nil { - log.Fatal(err, "\n", string(bz)) - } - - jsonStr := string(bz) - code := gjson.Get(jsonStr, "code") - rawLog := gjson.Get(jsonStr, "raw_log") - if !action.expectError && code.Int() != 0 { - log.Fatalf("unexpected error during key assignment - code: %s, output: %s", code, jsonStr) + if err != nil && !action.expectError { + log.Fatalf("unexpected error during key assignment - output: %s, err: %s", string(bz), err) } if action.expectError { - if code.Int() == 0 { - } else if verbose { - fmt.Printf("got expected error during key assignment | code: %v | log: %s\n", code, rawLog) + if verbose { + fmt.Printf("got expected error during key assignment | err: %s \n", err.Error()) } } @@ -1825,6 +1898,9 @@ func (tr TestRun) assignConsumerPubKey(action assignConsumerPubKeyAction, verbos valCfg.useConsumerKey = true tr.validatorConfigs[action.validator] = valCfg } + + // wait for inclusion in a block -> '--broadcast-mode block' is deprecated + tr.waitBlocks(chainID("provi"), 2, 30*time.Second) } // slashThrottleDequeue polls slash queue sizes until nextQueueSize is achieved diff --git a/tests/e2e/config.go b/tests/e2e/config.go index 94fae8438f..df54cbd4f4 100644 --- a/tests/e2e/config.go +++ b/tests/e2e/config.go @@ -44,7 +44,7 @@ type ChainConfig struct { ipPrefix string votingWaitTime uint // Any transformations to apply to the genesis file of all chains instantiated with this chain config, as a jq string. - // Example: ".app_state.gov.voting_params.voting_period = \"5s\" | .app_state.slashing.params.signed_blocks_window = \"2\" | .app_state.slashing.params.min_signed_per_window = \"0.500000000000000000\"" + // Example: ".app_state.gov.params.voting_period = \"5s\" | .app_state.slashing.params.signed_blocks_window = \"2\" | .app_state.slashing.params.min_signed_per_window = \"0.500000000000000000\"" genesisChanges string binaryName string @@ -167,12 +167,12 @@ func SlashThrottleTestRun() TestRun { binaryName: "interchain-security-pd", ipPrefix: "7.7.7", votingWaitTime: 20, - genesisChanges: ".app_state.gov.voting_params.voting_period = \"20s\" | " + + genesisChanges: ".app_state.gov.params.voting_period = \"20s\" | " + // Custom slashing parameters for testing validator downtime functionality // See https://docs.cosmos.network/main/modules/slashing/04_begin_block.html#uptime-tracking ".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 = \"2s\" | " + + ".app_state.slashing.params.downtime_jail_duration = \"60s\" | " + ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\" | " + ".app_state.provider.params.slash_meter_replenish_fraction = \"0.10\" | " + ".app_state.provider.params.slash_meter_replenish_period = \"20s\"", @@ -182,10 +182,10 @@ func SlashThrottleTestRun() TestRun { binaryName: "interchain-security-cd", ipPrefix: "7.7.8", votingWaitTime: 20, - genesisChanges: ".app_state.gov.voting_params.voting_period = \"20s\" | " + + genesisChanges: ".app_state.gov.params.voting_period = \"20s\" | " + ".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 = \"2s\" | " + + ".app_state.slashing.params.downtime_jail_duration = \"60s\" | " + ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\"", }, }, @@ -212,12 +212,12 @@ func DefaultTestRun() TestRun { binaryName: "interchain-security-pd", ipPrefix: "7.7.7", votingWaitTime: 20, - genesisChanges: ".app_state.gov.voting_params.voting_period = \"20s\" | " + + genesisChanges: ".app_state.gov.params.voting_period = \"20s\" | " + // Custom slashing parameters for testing validator downtime functionality // See https://docs.cosmos.network/main/modules/slashing/04_begin_block.html#uptime-tracking ".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 = \"2s\" | " + + ".app_state.slashing.params.downtime_jail_duration = \"60s\" | " + ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\" | " + ".app_state.provider.params.slash_meter_replenish_fraction = \"1.0\" | " + // This disables slash packet throttling ".app_state.provider.params.slash_meter_replenish_period = \"3s\"", @@ -227,10 +227,10 @@ func DefaultTestRun() TestRun { binaryName: "interchain-security-cd", ipPrefix: "7.7.8", votingWaitTime: 20, - genesisChanges: ".app_state.gov.voting_params.voting_period = \"20s\" | " + + genesisChanges: ".app_state.gov.params.voting_period = \"20s\" | " + ".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 = \"2s\" | " + + ".app_state.slashing.params.downtime_jail_duration = \"60s\" | " + ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\"", }, }, @@ -246,7 +246,7 @@ func DemocracyTestRun(allowReward bool) TestRun { ".app_state.gov.voting_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 = \"2s\" | " + + ".app_state.slashing.params.downtime_jail_duration = \"60s\" | " + ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\"" if allowReward { @@ -269,12 +269,12 @@ func DemocracyTestRun(allowReward bool) TestRun { binaryName: "interchain-security-pd", ipPrefix: "7.7.7", votingWaitTime: 20, - genesisChanges: ".app_state.gov.voting_params.voting_period = \"20s\" | " + + genesisChanges: ".app_state.gov.params.voting_period = \"20s\" | " + // Custom slashing parameters for testing validator downtime functionality // See https://docs.cosmos.network/main/modules/slashing/04_begin_block.html#uptime-tracking ".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 = \"2s\" | " + + ".app_state.slashing.params.downtime_jail_duration = \"60s\" | " + ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\" | " + ".app_state.provider.params.slash_meter_replenish_fraction = \"1.0\"", // This disables slash packet throttling }, @@ -309,12 +309,12 @@ func MultiConsumerTestRun() TestRun { binaryName: "interchain-security-pd", ipPrefix: "7.7.7", votingWaitTime: 20, - genesisChanges: ".app_state.gov.voting_params.voting_period = \"20s\" | " + + genesisChanges: ".app_state.gov.params.voting_period = \"30s\" | " + // Custom slashing parameters for testing validator downtime functionality // See https://docs.cosmos.network/main/modules/slashing/04_begin_block.html#uptime-tracking ".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 = \"2s\" | " + + ".app_state.slashing.params.downtime_jail_duration = \"60s\" | " + ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\" | " + ".app_state.provider.params.slash_meter_replenish_fraction = \"1.0\"", // This disables slash packet throttling }, @@ -323,10 +323,10 @@ func MultiConsumerTestRun() TestRun { binaryName: "interchain-security-cd", ipPrefix: "7.7.8", votingWaitTime: 20, - genesisChanges: ".app_state.gov.voting_params.voting_period = \"20s\" | " + + genesisChanges: ".app_state.gov.params.voting_period = \"20s\" | " + ".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 = \"2s\" | " + + ".app_state.slashing.params.downtime_jail_duration = \"60s\" | " + ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\"", }, chainID("densu"): { @@ -334,10 +334,10 @@ func MultiConsumerTestRun() TestRun { binaryName: "interchain-security-cd", ipPrefix: "7.7.9", votingWaitTime: 20, - genesisChanges: ".app_state.gov.voting_params.voting_period = \"20s\" | " + + genesisChanges: ".app_state.gov.params.voting_period = \"20s\" | " + ".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 = \"2s\" | " + + ".app_state.slashing.params.downtime_jail_duration = \"60s\" | " + ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\"", }, }, diff --git a/tests/e2e/main.go b/tests/e2e/main.go index 737a318de2..00967dfcac 100644 --- a/tests/e2e/main.go +++ b/tests/e2e/main.go @@ -131,7 +131,7 @@ func (tr *TestRun) runStep(step Step, verbose bool) { tr.submitConsumerRemovalProposal(action, verbose) case submitEquivocationProposalAction: tr.submitEquivocationProposal(action, verbose) - case submitParamChangeProposalAction: + case submitParamChangeLegacyProposalAction: tr.submitParamChangeProposal(action, verbose) case voteGovProposalAction: tr.voteGovProposal(action, verbose) @@ -155,6 +155,8 @@ func (tr *TestRun) runStep(step Step, verbose bool) { tr.delegateTokens(action, verbose) case unbondTokensAction: tr.unbondTokens(action, verbose) + case cancelUnbondTokensAction: + tr.cancelUnbondTokens(action, verbose) case redelegateTokensAction: tr.redelegateTokens(action, verbose) case downtimeSlashAction: diff --git a/tests/e2e/state.go b/tests/e2e/state.go index 4de28277d2..0c2573574f 100644 --- a/tests/e2e/state.go +++ b/tests/e2e/state.go @@ -8,7 +8,7 @@ import ( "strconv" "time" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" "github.com/tidwall/gjson" "gopkg.in/yaml.v2" ) @@ -231,7 +231,7 @@ func (tr TestRun) waitBlocks(chain chainID, blocks uint, timeout time.Duration) if time.Since(start) > timeout { panic(fmt.Sprintf("\n\n\nwaitBlocks method has timed out after: %s\n\n", timeout)) } - time.Sleep(500 * time.Millisecond) + time.Sleep(time.Second) } } @@ -388,7 +388,7 @@ func (tr TestRun) getProposal(chain chainID, proposal uint) Proposal { log.Fatal(err, "\n", string(bz)) } - propType := gjson.Get(string(bz), `content.@type`).String() + propType := gjson.Get(string(bz), `messages.0.content.@type`).String() deposit := gjson.Get(string(bz), `total_deposit.#(denom=="stake").amount`).Uint() status := gjson.Get(string(bz), `status`).String() @@ -404,8 +404,8 @@ func (tr TestRun) getProposal(chain chainID, proposal uint) Proposal { Description: description, } case "/interchain_security.ccv.provider.v1.ConsumerAdditionProposal": - chainId := gjson.Get(string(bz), `content.chain_id`).String() - spawnTime := gjson.Get(string(bz), `content.spawn_time`).Time().Sub(tr.containerConfig.now) + chainId := gjson.Get(string(bz), `messages.0.content.chain_id`).String() + spawnTime := gjson.Get(string(bz), `messages.0.content.spawn_time`).Time().Sub(tr.containerConfig.now) var chain chainID for i, conf := range tr.chainConfigs { @@ -421,8 +421,8 @@ func (tr TestRun) getProposal(chain chainID, proposal uint) Proposal { Chain: chain, SpawnTime: int(spawnTime.Milliseconds()), InitialHeight: clienttypes.Height{ - RevisionNumber: gjson.Get(string(bz), `content.initial_height.revision_number`).Uint(), - RevisionHeight: gjson.Get(string(bz), `content.initial_height.revision_height`).Uint(), + RevisionNumber: gjson.Get(string(bz), `messages.0.content.initial_height.revision_number`).Uint(), + RevisionHeight: gjson.Get(string(bz), `messages.0.content.initial_height.revision_height`).Uint(), }, } case "/cosmos.upgrade.v1beta1.SoftwareUpgradeProposal": @@ -436,8 +436,8 @@ func (tr TestRun) getProposal(chain chainID, proposal uint) Proposal { Type: "/cosmos.upgrade.v1beta1.SoftwareUpgradeProposal", } case "/interchain_security.ccv.provider.v1.ConsumerRemovalProposal": - chainId := gjson.Get(string(bz), `content.chain_id`).String() - stopTime := gjson.Get(string(bz), `content.stop_time`).Time().Sub(tr.containerConfig.now) + chainId := gjson.Get(string(bz), `messages.0.content.chain_id`).String() + stopTime := gjson.Get(string(bz), `messages.0.content.stop_time`).Time().Sub(tr.containerConfig.now) var chain chainID for i, conf := range tr.chainConfigs { @@ -458,18 +458,18 @@ func (tr TestRun) getProposal(chain chainID, proposal uint) Proposal { return EquivocationProposal{ Deposit: uint(deposit), Status: status, - Height: uint(gjson.Get(string(bz), `content.equivocations.0.height`).Uint()), - Power: uint(gjson.Get(string(bz), `content.equivocations.0.power`).Uint()), - ConsensusAddress: gjson.Get(string(bz), `content.equivocations.0.consensus_address`).String(), + Height: uint(gjson.Get(string(bz), `messages.0.content.equivocations.0.height`).Uint()), + Power: uint(gjson.Get(string(bz), `messages.0.content.equivocations.0.power`).Uint()), + ConsensusAddress: gjson.Get(string(bz), `messages.0.content.equivocations.0.consensus_address`).String(), } case "/cosmos.params.v1beta1.ParameterChangeProposal": return ParamsProposal{ Deposit: uint(deposit), Status: status, - Subspace: gjson.Get(string(bz), `content.changes.0.subspace`).String(), - Key: gjson.Get(string(bz), `content.changes.0.key`).String(), - Value: gjson.Get(string(bz), `content.changes.0.value`).String(), + Subspace: gjson.Get(string(bz), `messages.0.content.changes.0.subspace`).String(), + Key: gjson.Get(string(bz), `messages.0.content.changes.0.key`).String(), + Value: gjson.Get(string(bz), `messages.0.content.changes.0.value`).String(), } } @@ -647,6 +647,7 @@ func (tr TestRun) getProviderAddressFromConsumer(consumerChain chainID, validato `--node`, tr.getQueryNode(chainID("provi")), `-o`, `json`, ) + bz, err := cmd.CombinedOutput() if err != nil { log.Fatal(err, "\n", string(bz)) diff --git a/tests/e2e/step_delegation.go b/tests/e2e/step_delegation.go index f33fc136d4..b6e7c8ad76 100644 --- a/tests/e2e/step_delegation.go +++ b/tests/e2e/step_delegation.go @@ -129,6 +129,97 @@ func stepsUnbond(consumerName string) []Step { } } +// stepsCancelUnbond canceling unbonding operation for delegator and validator combination +// the steps perform a full unbonding where the unbonding delegation is removed from the unbonding queue +func stepsCancelUnbond(consumerName string) []Step { + return []Step{ + { + action: unbondTokensAction{ + chain: chainID("provi"), + unbondFrom: validatorID("alice"), + sender: validatorID("alice"), + amount: 1000000, + }, + state: State{ + chainID("provi"): ChainState{ + ValPowers: &map[validatorID]uint{ + validatorID("alice"): 509, + validatorID("bob"): 500, + validatorID("carol"): 500, + }, + }, + chainID("consu"): ChainState{ + ValPowers: &map[validatorID]uint{ + // Voting power on consumer should not be affected yet + validatorID("alice"): 510, + validatorID("bob"): 500, + validatorID("carol"): 500, + }, + }, + }, + }, + { + action: relayPacketsAction{ + chainA: chainID("provi"), + chainB: chainID(consumerName), + port: "provider", + channel: 0, + }, + state: State{ + chainID("consu"): ChainState{ + ValPowers: &map[validatorID]uint{ + validatorID("alice"): 509, + validatorID("bob"): 500, + validatorID("carol"): 500, + }, + }, + }, + }, + { + action: cancelUnbondTokensAction{ + chain: chainID("provi"), + delegator: validatorID("alice"), + validator: validatorID("alice"), + amount: 1000000, // cancel unbonding the full amount + }, + state: State{ + chainID("provi"): ChainState{ + ValPowers: &map[validatorID]uint{ + validatorID("alice"): 510, // power restored + validatorID("bob"): 500, + validatorID("carol"): 500, + }, + }, + chainID("consu"): ChainState{ + ValPowers: &map[validatorID]uint{ + // Voting power on consumer should not be affected yet + validatorID("alice"): 509, + validatorID("bob"): 500, + validatorID("carol"): 500, + }, + }, + }, + }, + { + action: relayPacketsAction{ + chainA: chainID("provi"), + chainB: chainID(consumerName), + port: "provider", + channel: 0, + }, + state: State{ + chainID("consu"): ChainState{ + ValPowers: &map[validatorID]uint{ + validatorID("alice"): 510, // power restored on consumer + validatorID("bob"): 500, + validatorID("carol"): 500, + }, + }, + }, + }, + } +} + // stepsRedelegateForOptOut tests redelegation, and sets up voting powers s.t // alice will have less than 5% of the total voting power. This is needed to // test opt-out functionality. diff --git a/tests/e2e/steps.go b/tests/e2e/steps.go index ee53e9fd2a..aa08426103 100644 --- a/tests/e2e/steps.go +++ b/tests/e2e/steps.go @@ -18,6 +18,7 @@ var happyPathSteps = concatSteps( stepsDelegate("consu"), stepsAssignConsumerKeyOnStartedChain("consu", "bob"), stepsUnbond("consu"), + stepsCancelUnbond("consu"), stepsRedelegateForOptOut("consu"), stepsDowntimeWithOptOut("consu"), stepsRedelegate("consu"), diff --git a/tests/e2e/steps_democracy.go b/tests/e2e/steps_democracy.go index 686fbf1c49..3c80818a24 100644 --- a/tests/e2e/steps_democracy.go +++ b/tests/e2e/steps_democracy.go @@ -62,13 +62,14 @@ func stepsDemocracy(consumerName string) []Step { }, }, { - action: submitParamChangeProposalAction{ + // whitelisted legacy proposal can only handle ibctransfer.SendEnabled/ReceiveEnabled + action: submitParamChangeLegacyProposalAction{ chain: chainID(consumerName), from: validatorID("alice"), deposit: 10000001, - subspace: "staking", - key: "MaxValidators", - value: 105, + subspace: "transfer", + key: "SendEnabled", + value: true, }, state: State{ chainID(consumerName): ChainState{ @@ -80,9 +81,9 @@ func stepsDemocracy(consumerName string) []Step { 1: ParamsProposal{ Deposit: 10000001, Status: "PROPOSAL_STATUS_VOTING_PERIOD", - Subspace: "staking", - Key: "MaxValidators", - Value: "105", + Subspace: "transfer", + Key: "SendEnabled", + Value: "true", }, }, }, @@ -103,7 +104,7 @@ func stepsDemocracy(consumerName string) []Step { validatorID("bob"): 9960000001, }, // Check that the parameter is changed on gov-consumer chain - Params: &([]Param{{Subspace: "staking", Key: "MaxValidators", Value: "105"}}), + Params: &([]Param{{Subspace: "transfer", Key: "SendEnabled", Value: "true"}}), }, }, }, diff --git a/tests/e2e/steps_reward_denom.go b/tests/e2e/steps_reward_denom.go index dc10ccb7c6..cb557f0471 100644 --- a/tests/e2e/steps_reward_denom.go +++ b/tests/e2e/steps_reward_denom.go @@ -60,13 +60,14 @@ func stepsRewardDenomConsumer(consumerName string) []Step { }, }, { - action: submitParamChangeProposalAction{ + // whitelisted legacy proposal can only handle ibctransfer.SendEnabled/ReceiveEnabled + action: submitParamChangeLegacyProposalAction{ chain: chainID(consumerName), from: validatorID("alice"), deposit: 10000001, - subspace: "staking", - key: "MaxValidators", - value: 105, + subspace: "transfer", + key: "SendEnabled", + value: true, }, state: State{ chainID(consumerName): ChainState{ @@ -78,9 +79,9 @@ func stepsRewardDenomConsumer(consumerName string) []Step { 1: ParamsProposal{ Deposit: 10000001, Status: "PROPOSAL_STATUS_VOTING_PERIOD", - Subspace: "staking", - Key: "MaxValidators", - Value: "105", + Subspace: "transfer", + Key: "SendEnabled", + Value: "true", }, }, }, diff --git a/tests/e2e/steps_sovereign_changeover.go b/tests/e2e/steps_sovereign_changeover.go index e122c1fb2a..71daad684b 100644 --- a/tests/e2e/steps_sovereign_changeover.go +++ b/tests/e2e/steps_sovereign_changeover.go @@ -1,6 +1,6 @@ package main -import clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" +import clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" // this creates new clients on both chains and a connection (connection-0) between them // connection-0 is used to create a transfer channel between the chains diff --git a/tests/e2e/steps_start_chains.go b/tests/e2e/steps_start_chains.go index c51042e8c8..15d0045760 100644 --- a/tests/e2e/steps_start_chains.go +++ b/tests/e2e/steps_start_chains.go @@ -1,7 +1,7 @@ package main import ( - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" ) func stepStartProviderChain() []Step { diff --git a/tests/e2e/testnet-scripts/sovereign-genesis.json b/tests/e2e/testnet-scripts/sovereign-genesis.json index 94a279840e..6c34a0ec1c 100644 --- a/tests/e2e/testnet-scripts/sovereign-genesis.json +++ b/tests/e2e/testnet-scripts/sovereign-genesis.json @@ -1,279 +1,281 @@ { - "genesis_time": "2023-06-13T11:19:05.998449459Z", - "chain_id": "sover", - "initial_height": "1", - "consensus_params": { - "block": { - "max_bytes": "22020096", - "max_gas": "-1", - "time_iota_ms": "1000" - }, - "evidence": { - "max_age_num_blocks": "100000", - "max_age_duration": "172800000000000", - "max_bytes": "1048576" - }, - "validator": { - "pub_key_types": [ - "ed25519" - ] - }, - "version": {} + "genesis_time": "2023-06-19T21:06:09.696739416Z", + "chain_id": "sover", + "initial_height": "1", + "consensus_params": { + "block": { + "max_bytes": "22020096", + "max_gas": "-1" }, - "app_hash": "", - "app_state": { - "auth": { - "params": { - "max_memo_characters": "256", - "tx_sig_limit": "7", - "tx_size_cost_per_byte": "10", - "sig_verify_cost_ed25519": "590", - "sig_verify_cost_secp256k1": "1000" - }, - "accounts": [ - { - "@type": "/cosmos.auth.v1beta1.BaseAccount", - "address": "cosmos19pe9pg5dv9k5fzgzmsrgnw9rl9asf7ddwhu7lm", - "pub_key": null, - "account_number": "0", - "sequence": "0" - } - ] - }, - "authz": { - "authorization": [] - }, - "bank": { - "params": { - "send_enabled": [], - "default_send_enabled": true - }, - "balances": [ - { - "address": "cosmos19pe9pg5dv9k5fzgzmsrgnw9rl9asf7ddwhu7lm", - "coins": [ - { - "denom": "stake", - "amount": "10000000000" - } - ] - } - ], - "supply": [ - { - "denom": "stake", - "amount": "10000000000" - } - ], - "denom_metadata": [] + "evidence": { + "max_age_num_blocks": "100000", + "max_age_duration": "172800000000000", + "max_bytes": "1048576" + }, + "validator": { + "pub_key_types": [ + "ed25519" + ] + }, + "version": { + "app": "0" + } + }, + "app_hash": "", + "app_state": { + "07-tendermint": null, + "auth": { + "params": { + "max_memo_characters": "256", + "tx_sig_limit": "7", + "tx_size_cost_per_byte": "10", + "sig_verify_cost_ed25519": "590", + "sig_verify_cost_secp256k1": "1000" }, - "capability": { - "index": "1", - "owners": [] + "accounts": [ + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "cosmos1dkas8mu4kyhl5jrh4nzvm65qz588hy9qcz08la", + "pub_key": null, + "account_number": "0", + "sequence": "0" + } + ] + }, + "bank": { + "params": { + "send_enabled": [], + "default_send_enabled": true }, - "crisis": { - "constant_fee": { + "balances": [ + { + "address": "cosmos19pe9pg5dv9k5fzgzmsrgnw9rl9asf7ddwhu7lm", + "coins": [ + { + "denom": "stake", + "amount": "10000000000" + } + ] + } + ], + "supply": [ + { "denom": "stake", - "amount": "1000" + "amount": "10000000000" } + ], + "denom_metadata": [], + "send_enabled": [] + }, + "capability": { + "index": "1", + "owners": [] + }, + "crisis": { + "constant_fee": { + "denom": "stake", + "amount": "1000" + } + }, + "distribution": { + "params": { + "community_tax": "0.020000000000000000", + "base_proposer_reward": "0.000000000000000000", + "bonus_proposer_reward": "0.000000000000000000", + "withdraw_addr_enabled": true }, - "distribution": { - "params": { - "community_tax": "0.020000000000000000", - "base_proposer_reward": "0.010000000000000000", - "bonus_proposer_reward": "0.040000000000000000", - "withdraw_addr_enabled": true - }, - "fee_pool": { - "community_pool": [] - }, - "delegator_withdraw_infos": [], - "previous_proposer": "", - "outstanding_rewards": [], - "validator_accumulated_commissions": [], - "validator_historical_rewards": [], - "validator_current_rewards": [], - "delegator_starting_infos": [], - "validator_slash_events": [] - }, - "evidence": { - "evidence": [] - }, - "feegrant": { - "allowances": [] + "fee_pool": { + "community_pool": [] }, - "genutil": { - "gen_txs": [ - { - "body": { - "messages": [ - { - "@type": "/cosmos.staking.v1beta1.MsgCreateValidator", - "description": { - "moniker": "validatoralice", - "identity": "", - "website": "", - "security_contact": "", - "details": "" - }, - "commission": { - "rate": "0.100000000000000000", - "max_rate": "0.200000000000000000", - "max_change_rate": "0.010000000000000000" - }, - "min_self_delegation": "1", - "delegator_address": "cosmos19pe9pg5dv9k5fzgzmsrgnw9rl9asf7ddwhu7lm", - "validator_address": "cosmosvaloper19pe9pg5dv9k5fzgzmsrgnw9rl9asf7ddtrgtng", - "pubkey": { - "@type": "/cosmos.crypto.ed25519.PubKey", - "key": "RrclQz9bIhkIy/gfL485g3PYMeiIku4qeo495787X10=" - }, - "value": { - "denom": "stake", - "amount": "500000000" - } - } - ], - "memo": "8339e14baab81c2a2350e261962263397a8d7fb0@7.7.8.254:26656", - "timeout_height": "0", - "extension_options": [], - "non_critical_extension_options": [] - }, - "auth_info": { - "signer_infos": [ - { - "public_key": { - "@type": "/cosmos.crypto.secp256k1.PubKey", - "key": "AsFC8tmbGGQSHthsVStbsQ13/+Yza9IT8KCSXXEN7y9f" - }, - "mode_info": { - "single": { - "mode": "SIGN_MODE_DIRECT" - } - }, - "sequence": "0" + "delegator_withdraw_infos": [], + "previous_proposer": "", + "outstanding_rewards": [], + "validator_accumulated_commissions": [], + "validator_historical_rewards": [], + "validator_current_rewards": [], + "delegator_starting_infos": [], + "validator_slash_events": [] + }, + "evidence": { + "evidence": [] + }, + "genutil": { + "gen_txs": [ + { + "body": { + "messages": [ + { + "@type": "/cosmos.staking.v1beta1.MsgCreateValidator", + "description": { + "moniker": "validatoralice", + "identity": "", + "website": "", + "security_contact": "", + "details": "" + }, + "commission": { + "rate": "0.100000000000000000", + "max_rate": "0.200000000000000000", + "max_change_rate": "0.010000000000000000" + }, + "min_self_delegation": "1", + "delegator_address": "cosmos19pe9pg5dv9k5fzgzmsrgnw9rl9asf7ddwhu7lm", + "validator_address": "cosmosvaloper19pe9pg5dv9k5fzgzmsrgnw9rl9asf7ddtrgtng", + "pubkey": { + "@type": "/cosmos.crypto.ed25519.PubKey", + "key": "RrclQz9bIhkIy/gfL485g3PYMeiIku4qeo495787X10=" + }, + "value": { + "denom": "stake", + "amount": "500000000" } - ], - "fee": { - "amount": [], - "gas_limit": "200000", - "payer": "", - "granter": "" } + ], + "memo": "8339e14baab81c2a2350e261962263397a8d7fb0@7.7.7.254:26656", + "timeout_height": "0", + "extension_options": [], + "non_critical_extension_options": [] + }, + "auth_info": { + "signer_infos": [ + { + "public_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AsFC8tmbGGQSHthsVStbsQ13/+Yza9IT8KCSXXEN7y9f" + }, + "mode_info": { + "single": { + "mode": "SIGN_MODE_DIRECT" + } + }, + "sequence": "0" + } + ], + "fee": { + "amount": [], + "gas_limit": "200000", + "payer": "", + "granter": "" }, - "signatures": [ - "rZuml3RLgrrZkUoNHw90FuHF/Orxzs0uiwflCkUOcvoA4bzohisjdQhkPWCn5aRw30mqZJGj1IxgXS15XleMvQ==" - ] - } - ] - }, - "gov": { - "starting_proposal_id": "1", - "deposits": [], - "votes": [], - "proposals": [], - "deposit_params": { - "min_deposit": [ - { - "denom": "stake", - "amount": "10000000" - } - ], - "max_deposit_period": "172800s" - }, - "voting_params": { - "voting_period": "20s" - }, - "tally_params": { - "quorum": "0.334000000000000000", - "threshold": "0.500000000000000000", - "veto_threshold": "0.334000000000000000" - } - }, - "ibc": { - "client_genesis": { - "clients": [], - "clients_consensus": [], - "clients_metadata": [], - "params": { - "allowed_clients": [ - "06-solomachine", - "07-tendermint" - ] + "tip": null }, - "create_localhost": false, - "next_client_sequence": "0" - }, - "connection_genesis": { - "connections": [], - "client_connection_paths": [], - "next_connection_sequence": "0", - "params": { - "max_expected_time_per_block": "30000000000" + "signatures": [ + "D06i2qqq2HathlT7cy+PDLTDuYKAmzw5Ne+Ehvzr9bVy3jpm2h8deDGeSXTSrhdP04UpFXerSn+zIPth5TKNrg==" + ] + } + ] + }, + "gov": { + "starting_proposal_id": "1", + "deposits": [], + "votes": [], + "proposals": [], + "deposit_params": null, + "voting_params": null, + "tally_params": null, + "params": { + "min_deposit": [ + { + "denom": "stake", + "amount": "10000000" } + ], + "max_deposit_period": "172800s", + "voting_period": "20s", + "quorum": "0.334000000000000000", + "threshold": "0.500000000000000000", + "veto_threshold": "0.334000000000000000", + "min_initial_deposit_ratio": "0.000000000000000000", + "burn_vote_quorum": false, + "burn_proposal_deposit_prevote": false, + "burn_vote_veto": true + } + }, + "ibc": { + "client_genesis": { + "clients": [], + "clients_consensus": [], + "clients_metadata": [], + "params": { + "allowed_clients": [ + "06-solomachine", + "07-tendermint" + ] }, - "channel_genesis": { - "channels": [], - "acknowledgements": [], - "commitments": [], - "receipts": [], - "send_sequences": [], - "recv_sequences": [], - "ack_sequences": [], - "next_channel_sequence": "0" - } + "create_localhost": false, + "next_client_sequence": "0" }, - "mint": { - "minter": { - "inflation": "0.130000000000000000", - "annual_provisions": "0.000000000000000000" - }, + "connection_genesis": { + "connections": [], + "client_connection_paths": [], + "next_connection_sequence": "0", "params": { - "mint_denom": "stake", - "inflation_rate_change": "0.130000000000000000", - "inflation_max": "0.200000000000000000", - "inflation_min": "0.070000000000000000", - "goal_bonded": "0.670000000000000000", - "blocks_per_year": "6311520" + "max_expected_time_per_block": "30000000000" } }, - "params": null, - "slashing": { - "params": { - "signed_blocks_window": "15", - "min_signed_per_window": "0.500000000000000000", - "downtime_jail_duration": "2s", - "slash_fraction_double_sign": "0.050000000000000000", - "slash_fraction_downtime": "0.010000000000000000" - }, - "signing_infos": [], - "missed_blocks": [] + "channel_genesis": { + "channels": [], + "acknowledgements": [], + "commitments": [], + "receipts": [], + "send_sequences": [], + "recv_sequences": [], + "ack_sequences": [], + "next_channel_sequence": "0" + } + }, + "mint": { + "minter": { + "inflation": "0.130000000000000000", + "annual_provisions": "0.000000000000000000" }, - "staking": { - "params": { - "unbonding_time": "1814400s", - "max_validators": 100, - "max_entries": 7, - "historical_entries": 10000, - "bond_denom": "stake" - }, - "last_total_power": "0", - "last_validator_powers": [], - "validators": [], - "delegations": [], - "unbonding_delegations": [], - "redelegations": [], - "exported": false + "params": { + "mint_denom": "stake", + "inflation_rate_change": "0.130000000000000000", + "inflation_max": "0.200000000000000000", + "inflation_min": "0.070000000000000000", + "goal_bonded": "0.670000000000000000", + "blocks_per_year": "6311520" + } + }, + "params": null, + "slashing": { + "params": { + "signed_blocks_window": "10", + "min_signed_per_window": "0.500000000000000000", + "downtime_jail_duration": "60s", + "slash_fraction_double_sign": "0.050000000000000000", + "slash_fraction_downtime": "0.010000000000000000" }, - "transfer": { - "port_id": "transfer", - "denom_traces": [], - "params": { - "send_enabled": true, - "receive_enabled": true - } + "signing_infos": [], + "missed_blocks": [] + }, + "staking": { + "params": { + "unbonding_time": "1814400s", + "max_validators": 100, + "max_entries": 7, + "historical_entries": 10000, + "bond_denom": "stake", + "min_commission_rate": "0.000000000000000000" }, - "upgrade": {}, - "vesting": {} - } - } \ No newline at end of file + "last_total_power": "0", + "last_validator_powers": [], + "validators": [], + "delegations": [], + "unbonding_delegations": [], + "redelegations": [], + "exported": false + }, + "transfer": { + "port_id": "transfer", + "denom_traces": [], + "params": { + "send_enabled": true, + "receive_enabled": true + } + }, + "upgrade": {}, + "vesting": {} + } +} \ No newline at end of file diff --git a/tests/e2e/testnet-scripts/start-chain.sh b/tests/e2e/testnet-scripts/start-chain.sh index 9d6e73fdbb..a3609acf73 100644 --- a/tests/e2e/testnet-scripts/start-chain.sh +++ b/tests/e2e/testnet-scripts/start-chain.sh @@ -136,7 +136,7 @@ do # give this validator some money ALLOCATION=$(echo "$VALIDATORS" | jq -r ".[$i].allocation") - $BIN add-genesis-account validator$VAL_ID $ALLOCATION \ + $BIN genesis add-genesis-account validator$VAL_ID $ALLOCATION \ --home /$CHAIN_ID/validator$VAL_ID \ --keyring-backend test @@ -180,7 +180,7 @@ do # Make a gentx (this command also sets up validator state on disk even if we are not going to use the gentx for anything) if [ "$SKIP_GENTX" = "false" ] ; then STAKE_AMOUNT=$(echo "$VALIDATORS" | jq -r ".[$i].stake") - $BIN gentx validator$VAL_ID "$STAKE_AMOUNT" \ + $BIN genesis gentx validator$VAL_ID "$STAKE_AMOUNT" \ --home /$CHAIN_ID/validator$VAL_ID \ --keyring-backend test \ --moniker validator$VAL_ID \ @@ -207,7 +207,7 @@ done if [ "$SKIP_GENTX" = "false" ] ; then # make the final genesis.json - $BIN collect-gentxs --home /$CHAIN_ID/validator$FIRST_VAL_ID + $BIN genesis collect-gentxs --home /$CHAIN_ID/validator$FIRST_VAL_ID # and copy it to the root cp /$CHAIN_ID/validator$FIRST_VAL_ID/config/genesis.json /$CHAIN_ID/genesis.json diff --git a/tests/integration/changeover.go b/tests/integration/changeover.go index 13d18a4026..bd94857598 100644 --- a/tests/integration/changeover.go +++ b/tests/integration/changeover.go @@ -1,8 +1,8 @@ package integration import ( - transfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" + transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" ) func (suite *CCVTestSuite) TestRecycleTransferChannel() { diff --git a/tests/integration/common.go b/tests/integration/common.go index 00ad6536cf..8f32193206 100644 --- a/tests/integration/common.go +++ b/tests/integration/common.go @@ -4,23 +4,24 @@ import ( "fmt" "time" + "cosmossdk.io/math" + abci "github.com/cometbft/cometbft/abci/types" + tmtypes "github.com/cometbft/cometbft/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" sdk "github.com/cosmos/cosmos-sdk/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - commitmenttypes "github.com/cosmos/ibc-go/v4/modules/core/23-commitment/types" - "github.com/cosmos/ibc-go/v4/modules/core/exported" - ibctm "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" + "github.com/cosmos/ibc-go/v7/modules/core/exported" + ibctm "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" icstestingutils "github.com/cosmos/interchain-security/v2/testutil/ibc_testing" testutil "github.com/cosmos/interchain-security/v2/testutil/integration" providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" - tmtypes "github.com/tendermint/tendermint/types" ) // ChainType defines the type of chain (either provider or consumer) @@ -84,13 +85,13 @@ func (s *CCVTestSuite) setDefaultValSigningInfo(tmVal tmtypes.Validator) { s.providerApp.GetTestSlashingKeeper().SetValidatorSigningInfo(s.providerCtx(), consAddr, valInfo) } -func getBalance(s *CCVTestSuite, providerCtx sdk.Context, delAddr sdk.AccAddress) sdk.Int { +func getBalance(s *CCVTestSuite, providerCtx sdk.Context, delAddr sdk.AccAddress) math.Int { return s.providerApp.GetTestBankKeeper().GetBalance(providerCtx, delAddr, s.providerBondDenom()).Amount } // delegateAndUndelegate delegates bondAmt from delAddr to the first validator // and then immediately undelegates 1/shareDiv of that delegation -func delegateAndUndelegate(s *CCVTestSuite, delAddr sdk.AccAddress, bondAmt sdk.Int, shareDiv int64) (initBalance sdk.Int, valsetUpdateId uint64) { +func delegateAndUndelegate(s *CCVTestSuite, delAddr sdk.AccAddress, bondAmt math.Int, shareDiv int64) (initBalance math.Int, valsetUpdateId uint64) { // delegate initBalance, shares, valAddr := delegate(s, delAddr, bondAmt) @@ -112,7 +113,7 @@ func delegateAndUndelegate(s *CCVTestSuite, delAddr sdk.AccAddress, bondAmt sdk. // Note: This function advances blocks in-between operations, where validator powers are // not checked, since they are checked in integration tests. func delegateAndRedelegate(s *CCVTestSuite, delAddr sdk.AccAddress, - srcValAddr, dstValAddr sdk.ValAddress, amount sdk.Int, + srcValAddr, dstValAddr sdk.ValAddress, amount math.Int, ) { // Delegate to src validator srcValTokensBefore := s.getVal(s.providerCtx(), srcValAddr).GetBondedTokens() @@ -142,12 +143,12 @@ func delegateAndRedelegate(s *CCVTestSuite, delAddr sdk.AccAddress, } // delegate delegates bondAmt to the first validator -func delegate(s *CCVTestSuite, delAddr sdk.AccAddress, bondAmt sdk.Int) (initBalance sdk.Int, shares sdk.Dec, valAddr sdk.ValAddress) { +func delegate(s *CCVTestSuite, delAddr sdk.AccAddress, bondAmt math.Int) (initBalance math.Int, shares sdk.Dec, valAddr sdk.ValAddress) { return delegateByIdx(s, delAddr, bondAmt, 0) } // delegateByIdx delegates bondAmt to the validator at specified index in provider val set -func delegateByIdx(s *CCVTestSuite, delAddr sdk.AccAddress, bondAmt sdk.Int, idx int) (initBalance sdk.Int, shares sdk.Dec, valAddr sdk.ValAddress) { +func delegateByIdx(s *CCVTestSuite, delAddr sdk.AccAddress, bondAmt math.Int, idx int) (initBalance math.Int, shares sdk.Dec, valAddr sdk.ValAddress) { initBalance = getBalance(s, s.providerCtx(), delAddr) // choose a validator validator, valAddr := s.getValByIdx(idx) @@ -407,7 +408,7 @@ 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.InfractionType, ibcSeqNum uint64, + tmVal tmtypes.Validator, infractionType stakingtypes.Infraction, ibcSeqNum uint64, ) channeltypes.Packet { valsetUpdateId := bundle.GetKeeper().GetHeightValsetUpdateID( bundle.GetCtx(), uint64(bundle.GetCtx().BlockHeight())) @@ -556,7 +557,7 @@ func (suite *CCVTestSuite) CreateCustomClient(endpoint *ibctesting.Endpoint, unb UpgradePath := []string{"upgrade", "upgradedIBCState"} clientState := ibctm.NewClientState( endpoint.Counterparty.Chain.ChainID, tmConfig.TrustLevel, tmConfig.TrustingPeriod, tmConfig.UnbondingPeriod, tmConfig.MaxClockDrift, - height, commitmenttypes.GetSDKSpecs(), UpgradePath, tmConfig.AllowUpdateAfterExpiry, tmConfig.AllowUpdateAfterMisbehaviour, + height, commitmenttypes.GetSDKSpecs(), UpgradePath, ) consensusState := endpoint.Counterparty.Chain.LastHeader.ConsensusState() diff --git a/tests/integration/democracy.go b/tests/integration/democracy.go index f13398aa91..c1262b31c1 100644 --- a/tests/integration/democracy.go +++ b/tests/integration/democracy.go @@ -1,19 +1,18 @@ package integration import ( - "fmt" - "strconv" "testing" "time" + "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" icstestingutils "github.com/cosmos/interchain-security/v2/testutil/ibc_testing" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" - proposaltypes "github.com/cosmos/cosmos-sdk/x/params/types/proposal" testutil "github.com/cosmos/interchain-security/v2/testutil/integration" consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" "github.com/stretchr/testify/suite" @@ -78,7 +77,7 @@ func (s *ConsumerDemocracyTestSuite) TestDemocracyRewardsDistribution() { currentRepresentativesRewards := map[string]sdk.Dec{} nextRepresentativesRewards := map[string]sdk.Dec{} - representativesTokens := map[string]sdk.Int{} + representativesTokens := map[string]math.Int{} for _, representative := range stakingKeeper.GetAllValidators(s.consumerCtx()) { currentRepresentativesRewards[representative.OperatorAddress] = sdk.NewDec(0) @@ -148,30 +147,42 @@ func (s *ConsumerDemocracyTestSuite) TestDemocracyRewardsDistribution() { func (s *ConsumerDemocracyTestSuite) TestDemocracyGovernanceWhitelisting() { govKeeper := s.consumerApp.GetTestGovKeeper() + params := govKeeper.GetParams(s.consumerCtx()) stakingKeeper := s.consumerApp.GetTestStakingKeeper() bankKeeper := s.consumerApp.GetTestBankKeeper() accountKeeper := s.consumerApp.GetTestAccountKeeper() mintKeeper := s.consumerApp.GetTestMintKeeper() newAuthParamValue := uint64(128) newMintParamValue := sdk.NewDecWithPrec(1, 1) // "0.100000000000000000" - allowedChange := proposaltypes.ParamChange{Subspace: minttypes.ModuleName, Key: "InflationMax", Value: fmt.Sprintf("\"%s\"", newMintParamValue)} - forbiddenChange := proposaltypes.ParamChange{Subspace: authtypes.ModuleName, Key: "MaxMemoCharacters", Value: fmt.Sprintf("\"%s\"", strconv.FormatUint(newAuthParamValue, 10))} votingAccounts := s.consumerChain.SenderAccounts bondDenom := stakingKeeper.BondDenom(s.consumerCtx()) - depositAmount := govKeeper.GetDepositParams(s.consumerCtx()).MinDeposit - votingParams := govKeeper.GetVotingParams(s.consumerCtx()) - votingParams.VotingPeriod = 3 * time.Second - govKeeper.SetVotingParams(s.consumerCtx(), votingParams) + depositAmount := params.MinDeposit + duration := (3 * time.Second) + params.VotingPeriod = &duration + err := govKeeper.SetParams(s.consumerCtx(), params) + s.Assert().NoError(err) + proposer := s.consumerChain.SenderAccount s.consumerChain.NextBlock() votersOldBalances := getAccountsBalances(s.consumerCtx(), bankKeeper, bondDenom, votingAccounts) // submit proposal with forbidden and allowed changes - paramChange := proposaltypes.ParameterChangeProposal{Changes: []proposaltypes.ParamChange{allowedChange, forbiddenChange}} - err := submitProposalWithDepositAndVote(govKeeper, s.consumerCtx(), paramChange, votingAccounts, depositAmount) + mintParams := mintKeeper.GetParams(s.consumerCtx()) + mintParams.InflationMax = newMintParamValue + msg_1 := &minttypes.MsgUpdateParams{ + Authority: authtypes.NewModuleAddress(govtypes.ModuleName).String(), + Params: mintParams, + } + authParams := accountKeeper.GetParams(s.consumerCtx()) + authParams.MaxMemoCharacters = newAuthParamValue + msg_2 := &authtypes.MsgUpdateParams{ + Authority: authtypes.NewModuleAddress(govtypes.ModuleName).String(), + Params: authParams, + } + err = submitProposalWithDepositAndVote(govKeeper, s.consumerCtx(), []sdk.Msg{msg_1, msg_2}, votingAccounts, proposer.GetAddress(), depositAmount) s.Assert().NoError(err) // set current header time to be equal or later than voting end time in order to process proposal from active queue, // once the proposal is added to the chain - s.consumerChain.CurrentHeader.Time = s.consumerChain.CurrentHeader.Time.Add(votingParams.VotingPeriod) + s.consumerChain.CurrentHeader.Time = s.consumerChain.CurrentHeader.Time.Add(*params.VotingPeriod) s.consumerChain.NextBlock() // at this moment, proposal is added, but not yet executed. we are saving old param values for comparison oldAuthParamValue := accountKeeper.GetParams(s.consumerCtx()).MaxMemoCharacters @@ -189,10 +200,9 @@ func (s *ConsumerDemocracyTestSuite) TestDemocracyGovernanceWhitelisting() { s.Assert().Equal(votersOldBalances, getAccountsBalances(s.consumerCtx(), bankKeeper, bondDenom, votingAccounts)) // submit proposal with allowed changes - paramChange = proposaltypes.ParameterChangeProposal{Changes: []proposaltypes.ParamChange{allowedChange}} - err = submitProposalWithDepositAndVote(govKeeper, s.consumerCtx(), paramChange, votingAccounts, depositAmount) + err = submitProposalWithDepositAndVote(govKeeper, s.consumerCtx(), []sdk.Msg{msg_1}, votingAccounts, proposer.GetAddress(), depositAmount) s.Assert().NoError(err) - s.consumerChain.CurrentHeader.Time = s.consumerChain.CurrentHeader.Time.Add(votingParams.VotingPeriod) + s.consumerChain.CurrentHeader.Time = s.consumerChain.CurrentHeader.Time.Add(*params.VotingPeriod) s.consumerChain.NextBlock() oldMintParamValue = mintKeeper.GetParams(s.consumerCtx()).InflationMax s.consumerChain.NextBlock() @@ -204,10 +214,10 @@ func (s *ConsumerDemocracyTestSuite) TestDemocracyGovernanceWhitelisting() { s.Assert().Equal(votersOldBalances, getAccountsBalances(s.consumerCtx(), bankKeeper, bondDenom, votingAccounts)) // submit proposal with forbidden changes - paramChange = proposaltypes.ParameterChangeProposal{Changes: []proposaltypes.ParamChange{forbiddenChange}} - err = submitProposalWithDepositAndVote(govKeeper, s.consumerCtx(), paramChange, votingAccounts, depositAmount) + + err = submitProposalWithDepositAndVote(govKeeper, s.consumerCtx(), []sdk.Msg{msg_2}, votingAccounts, proposer.GetAddress(), depositAmount) s.Assert().NoError(err) - s.consumerChain.CurrentHeader.Time = s.consumerChain.CurrentHeader.Time.Add(votingParams.VotingPeriod) + s.consumerChain.CurrentHeader.Time = s.consumerChain.CurrentHeader.Time.Add(*params.VotingPeriod) s.consumerChain.NextBlock() oldAuthParamValue = accountKeeper.GetParams(s.consumerCtx()).MaxMemoCharacters s.consumerChain.NextBlock() @@ -219,20 +229,20 @@ func (s *ConsumerDemocracyTestSuite) TestDemocracyGovernanceWhitelisting() { s.Assert().Equal(votersOldBalances, getAccountsBalances(s.consumerCtx(), bankKeeper, bondDenom, votingAccounts)) } -func submitProposalWithDepositAndVote(govKeeper testutil.TestGovKeeper, ctx sdk.Context, paramChange proposaltypes.ParameterChangeProposal, - accounts []ibctesting.SenderAccount, depositAmount sdk.Coins, +func submitProposalWithDepositAndVote(govKeeper testutil.TestGovKeeper, ctx sdk.Context, msgs []sdk.Msg, + accounts []ibctesting.SenderAccount, proposer sdk.AccAddress, depositAmount sdk.Coins, ) error { - proposal, err := govKeeper.SubmitProposal(ctx, ¶mChange) + proposal, err := govKeeper.SubmitProposal(ctx, msgs, "", "title", "summary", proposer) if err != nil { return err } - _, err = govKeeper.AddDeposit(ctx, proposal.ProposalId, accounts[0].SenderAccount.GetAddress(), depositAmount) // proposal becomes active + _, err = govKeeper.AddDeposit(ctx, proposal.Id, accounts[0].SenderAccount.GetAddress(), depositAmount) // proposal becomes active if err != nil { return err } for _, account := range accounts { - err = govKeeper.AddVote(ctx, proposal.ProposalId, account.SenderAccount.GetAddress(), govtypes.NewNonSplitVoteOption(govtypes.OptionYes)) + err = govKeeper.AddVote(ctx, proposal.Id, account.SenderAccount.GetAddress(), govv1.NewNonSplitVoteOption(govv1.OptionYes), "") if err != nil { return err } @@ -240,8 +250,8 @@ func submitProposalWithDepositAndVote(govKeeper testutil.TestGovKeeper, ctx sdk. return nil } -func getAccountsBalances(ctx sdk.Context, bankKeeper testutil.TestBankKeeper, bondDenom string, accounts []ibctesting.SenderAccount) map[string]sdk.Int { - accountsBalances := map[string]sdk.Int{} +func getAccountsBalances(ctx sdk.Context, bankKeeper testutil.TestBankKeeper, bondDenom string, accounts []ibctesting.SenderAccount) map[string]math.Int { + accountsBalances := map[string]math.Int{} for _, acc := range accounts { accountsBalances[string(acc.SenderAccount.GetAddress())] = bankKeeper.GetBalance(ctx, acc.SenderAccount.GetAddress(), bondDenom).Amount } diff --git a/tests/integration/distribution.go b/tests/integration/distribution.go index b9e3b9975e..58132fcc62 100644 --- a/tests/integration/distribution.go +++ b/tests/integration/distribution.go @@ -6,7 +6,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - transfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" + transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" @@ -23,7 +24,7 @@ func (s *CCVTestSuite) TestRewardsDistribution() { s.providerChain.NextBlock() // register a consumer reward denom - params := s.consumerApp.GetConsumerKeeper().GetParams(s.consumerCtx()) + params := s.consumerApp.GetConsumerKeeper().GetConsumerParams(s.consumerCtx()) params.RewardDenoms = []string{sdk.DefaultBondDenom} s.consumerApp.GetConsumerKeeper().SetParams(s.consumerCtx(), params) @@ -53,7 +54,7 @@ func (s *CCVTestSuite) TestRewardsDistribution() { frac, err := sdk.NewDecFromStr(s.consumerApp.GetConsumerKeeper().GetConsumerRedistributionFrac(s.consumerCtx())) s.Require().NoError(err) consumerExpectedRewards, _ := sdk.NewDecCoinsFromCoins(feePoolTokens...).MulDec(frac).TruncateDecimal() - providerExpectedRewards := feePoolTokens.Sub(consumerExpectedRewards) + providerExpectedRewards := feePoolTokens.Sub(consumerExpectedRewards...) s.consumerChain.NextBlock() // amount from the fee pool is divided between consumer redistribute address and address reserved for provider chain @@ -126,7 +127,7 @@ func (s *CCVTestSuite) TestRewardsDistribution() { // Check that the delAddr has the right amount less money in it after paying the fee senderCoins2 := providerBankKeeper.GetAllBalances(s.providerCtx(), delAddr) consumerRewardDenomRegistrationFee := s.providerApp.GetProviderKeeper().GetConsumerRewardDenomRegistrationFee(s.providerCtx()) - s.Require().Equal(senderCoins1.Sub(senderCoins2), sdk.NewCoins(consumerRewardDenomRegistrationFee)) + s.Require().Equal(senderCoins1.Sub(senderCoins2...), sdk.NewCoins(consumerRewardDenomRegistrationFee)) s.providerChain.NextBlock() @@ -152,7 +153,7 @@ func (s *CCVTestSuite) TestSendRewardsRetries() { s.providerChain.NextBlock() // Register denom on consumer chain - params := s.consumerApp.GetConsumerKeeper().GetParams(s.consumerCtx()) + params := s.consumerApp.GetConsumerKeeper().GetConsumerParams(s.consumerCtx()) params.RewardDenoms = []string{sdk.DefaultBondDenom} s.consumerApp.GetConsumerKeeper().SetParams(s.consumerCtx(), params) @@ -281,7 +282,7 @@ func (s *CCVTestSuite) TestEndBlockRD() { s.providerChain.NextBlock() if tc.denomRegistered { - params := s.consumerApp.GetConsumerKeeper().GetParams(s.consumerCtx()) + params := s.consumerApp.GetConsumerKeeper().GetConsumerParams(s.consumerCtx()) params.RewardDenoms = []string{sdk.DefaultBondDenom} s.consumerApp.GetConsumerKeeper().SetParams(s.consumerCtx(), params) } diff --git a/tests/integration/expired_client.go b/tests/integration/expired_client.go index 16abe75c35..ae7570a57f 100644 --- a/tests/integration/expired_client.go +++ b/tests/integration/expired_client.go @@ -3,15 +3,16 @@ package integration import ( "time" + abci "github.com/cometbft/cometbft/abci/types" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - ibcexported "github.com/cosmos/ibc-go/v4/modules/core/exported" - ibctm "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" + ibctm "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" - abci "github.com/tendermint/tendermint/abci/types" ) // TestVSCPacketSendWithExpiredClient tests queueing of VSCPackets when the consumer client is expired. @@ -127,11 +128,11 @@ func (s *CCVTestSuite) TestConsumerPacketSendExpiredClient() { // try to send slash packet for downtime infraction addr := ed25519.GenPrivKey().PubKey().Address() val := abci.Validator{Address: addr} - consumerKeeper.QueueSlashPacket(s.consumerCtx(), val, 2, stakingtypes.Downtime) + consumerKeeper.QueueSlashPacket(s.consumerCtx(), val, 2, stakingtypes.Infraction_INFRACTION_DOWNTIME) // try to send slash packet for the same downtime infraction - consumerKeeper.QueueSlashPacket(s.consumerCtx(), val, 3, stakingtypes.Downtime) + consumerKeeper.QueueSlashPacket(s.consumerCtx(), val, 3, stakingtypes.Infraction_INFRACTION_DOWNTIME) // try to send slash packet for the double-sign infraction - consumerKeeper.QueueSlashPacket(s.consumerCtx(), val, 3, stakingtypes.DoubleSign) + consumerKeeper.QueueSlashPacket(s.consumerCtx(), val, 3, stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN) // check that the packets were added to the list of pending data packets consumerPackets = consumerKeeper.GetPendingPackets(s.consumerCtx()) diff --git a/tests/integration/key_assignment.go b/tests/integration/key_assignment.go index bf0cc394c3..e6a794fedf 100644 --- a/tests/integration/key_assignment.go +++ b/tests/integration/key_assignment.go @@ -1,13 +1,14 @@ package integration import ( + tmencoding "github.com/cometbft/cometbft/crypto/encoding" + tmprotocrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/cosmos/ibc-go/v4/testing/mock" + "github.com/cosmos/ibc-go/v7/testing/mock" + providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" - tmencoding "github.com/tendermint/tendermint/crypto/encoding" - tmprotocrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" ) func (s *CCVTestSuite) TestKeyAssignment() { diff --git a/tests/integration/normal_operations.go b/tests/integration/normal_operations.go index e752d783a4..3318e29940 100644 --- a/tests/integration/normal_operations.go +++ b/tests/integration/normal_operations.go @@ -1,9 +1,9 @@ package integration import ( + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" ) // Tests the tracking of historical info in the context of new blocks being committed diff --git a/tests/integration/setup.go b/tests/integration/setup.go index ef1b85f3f7..86084545c6 100644 --- a/tests/integration/setup.go +++ b/tests/integration/setup.go @@ -3,18 +3,18 @@ package integration import ( "testing" + tmencoding "github.com/cometbft/cometbft/crypto/encoding" sdk "github.com/cosmos/cosmos-sdk/types" - ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - "github.com/cosmos/ibc-go/v4/testing/mock" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + "github.com/cosmos/ibc-go/v7/testing/mock" testutil "github.com/cosmos/interchain-security/v2/testutil/integration" - tmencoding "github.com/tendermint/tendermint/crypto/encoding" icstestingutils "github.com/cosmos/interchain-security/v2/testutil/ibc_testing" consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" - transfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" + transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" "github.com/stretchr/testify/suite" @@ -160,6 +160,7 @@ func initConsumerChain( // run CCV module init genesis s.NotPanics(func() { consumerKeeper := bundle.GetKeeper() + // this will set the initial valset on consumer consumerKeeper.InitGenesis(bundle.GetCtx(), genesisState) }) diff --git a/tests/integration/slashing.go b/tests/integration/slashing.go index 6e60bc5df3..8b4cb80547 100644 --- a/tests/integration/slashing.go +++ b/tests/integration/slashing.go @@ -4,6 +4,8 @@ import ( "fmt" "time" + abci "github.com/cometbft/cometbft/abci/types" + "github.com/cometbft/cometbft/crypto/ed25519" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" sdk "github.com/cosmos/cosmos-sdk/types" evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" @@ -11,14 +13,11 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" + tmtypes "github.com/cometbft/cometbft/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" keepertestutil "github.com/cosmos/interchain-security/v2/testutil/keeper" providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - tmtypes "github.com/tendermint/tendermint/types" - - abci "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/crypto/ed25519" ) // TestRelayAndApplyDowntimePacket tests that downtime slash packets can be properly relayed @@ -67,7 +66,7 @@ func (s *CCVTestSuite) TestRelayAndApplyDowntimePacket() { s.setDefaultValSigningInfo(*tmtypes.NewValidator(tmPk, stakingVal.ConsensusPower(sdk.DefaultPowerReduction))) // Send slash packet from the first consumer chain - packet := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmVal, stakingtypes.Downtime, 1) + packet := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmVal, stakingtypes.Infraction_INFRACTION_DOWNTIME, 1) err = s.getFirstBundle().Path.EndpointA.SendPacket(packet) s.Require().NoError(err) @@ -195,7 +194,7 @@ func (s *CCVTestSuite) TestRelayAndApplyDoubleSignPacket() { s.setDefaultValSigningInfo(*tmtypes.NewValidator(tmPk, stakingVal.ConsensusPower(sdk.DefaultPowerReduction))) // Send slash packet from the first consumer chain - packet := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmVal, stakingtypes.DoubleSign, 1) + packet := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmVal, stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN, 1) err = s.getFirstBundle().Path.EndpointA.SendPacket(packet) s.Require().NoError(err) @@ -289,7 +288,7 @@ func (suite *CCVTestSuite) TestHandleSlashPacketDowntime() { *ccv.NewSlashPacketData( abci.Validator{Address: tmVal.Address, Power: 0}, uint64(0), - stakingtypes.Downtime, + stakingtypes.Infraction_INFRACTION_DOWNTIME, ), ) @@ -338,7 +337,7 @@ func (suite *CCVTestSuite) TestOnRecvSlashPacketErrors() { providerKeeper.SetInitChainHeight(ctx, consumerChainID, initChainHeight) // now the method will fail at infraction height check. - packetData.Infraction = stakingtypes.InfractionEmpty + packetData.Infraction = stakingtypes.Infraction_INFRACTION_UNSPECIFIED errAck = providerKeeper.OnRecvSlashPacket(ctx, packet, packetData) suite.Require().False(errAck.Success()) errAckCast = errAck.(channeltypes.Acknowledgement) @@ -366,7 +365,7 @@ func (suite *CCVTestSuite) TestOnRecvSlashPacketErrors() { abci.Validator{ Address: ed25519.GenPrivKey().PubKey().Address(), Power: int64(0), - }, uint64(0), stakingtypes.Downtime, + }, uint64(0), stakingtypes.Infraction_INFRACTION_DOWNTIME, ) // Set initial block height for consumer chain @@ -398,7 +397,7 @@ func (suite *CCVTestSuite) TestOnRecvSlashPacketErrors() { // expect error ack when infraction type in unspecified tmAddr := suite.providerChain.Vals.Validators[1].Address slashingPkt.Validator.Address = tmAddr - slashingPkt.Infraction = stakingtypes.InfractionEmpty + slashingPkt.Infraction = stakingtypes.Infraction_INFRACTION_UNSPECIFIED valInfo.Address = sdk.ConsAddress(tmAddr).String() providerSlashingKeeper.SetValidatorSigningInfo(ctx, sdk.ConsAddress(tmAddr), valInfo) @@ -411,7 +410,7 @@ func (suite *CCVTestSuite) TestOnRecvSlashPacketErrors() { suite.Require().Equal(uint64(0), (providerKeeper.GetThrottledPacketDataSize(ctx, consumerChainID))) // expect to queue entries for the slash request - slashingPkt.Infraction = stakingtypes.Downtime + 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))) @@ -460,7 +459,7 @@ func (suite *CCVTestSuite) TestValidatorDowntime() { abci.Validator{Address: vals[0].Address, Power: valPower}, // get the VSC ID mapping the infraction height consumerKeeper.GetHeightValsetUpdateID(ctx, uint64(missedBlockThreshold-sdk.ValidatorUpdateDelay-1)), - stakingtypes.Downtime, + stakingtypes.Infraction_INFRACTION_DOWNTIME, ) expCommit := suite.commitSlashPacket(ctx, *packetData) @@ -564,7 +563,7 @@ func (suite *CCVTestSuite) TestValidatorDoubleSigning() { abci.Validator{Address: consAddr.Bytes(), Power: power}, // get VSC ID mapping to the infraction height with the TM delay subtracted suite.consumerApp.GetConsumerKeeper().GetHeightValsetUpdateID(ctx, uint64(infractionHeight-sdk.ValidatorUpdateDelay)), - stakingtypes.DoubleSign, + stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN, ) expCommit := suite.commitSlashPacket(ctx, *packetData) @@ -609,11 +608,11 @@ func (suite *CCVTestSuite) TestQueueAndSendSlashPacket() { // and 4 slash request for double-signing type slashedVal struct { validator abci.Validator - infraction stakingtypes.InfractionType + infraction stakingtypes.Infraction } slashedVals := []slashedVal{} - infraction := stakingtypes.Downtime + infraction := stakingtypes.Infraction_INFRACTION_DOWNTIME for j := 0; j < 2; j++ { for i := 0; i < 4; i++ { addr := ed25519.GenPrivKey().PubKey().Address() @@ -623,7 +622,7 @@ func (suite *CCVTestSuite) TestQueueAndSendSlashPacket() { consumerKeeper.QueueSlashPacket(ctx, val, 0, infraction) slashedVals = append(slashedVals, slashedVal{validator: val, infraction: infraction}) } - infraction = stakingtypes.DoubleSign + infraction = stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN } // expect to store a duplicate for each slash request @@ -676,8 +675,8 @@ func (suite *CCVTestSuite) TestCISBeforeCCVEstablished() { pendingPackets := consumerKeeper.GetPendingPackets(suite.consumerCtx()) suite.Require().Len(pendingPackets.List, 0) - consumerKeeper.Slash(suite.consumerCtx(), []byte{0x01, 0x02, 0x3}, - 66, 4324, sdk.MustNewDecFromStr("0.05"), stakingtypes.Downtime) + consumerKeeper.SlashWithInfractionReason(suite.consumerCtx(), []byte{0x01, 0x02, 0x3}, + 66, 4324, sdk.MustNewDecFromStr("0.05"), stakingtypes.Infraction_INFRACTION_DOWNTIME) // Check slash packet was queued pendingPackets = consumerKeeper.GetPendingPackets(suite.consumerCtx()) diff --git a/tests/integration/stop_consumer.go b/tests/integration/stop_consumer.go index 39da4eabe4..fda0aeb441 100644 --- a/tests/integration/stop_consumer.go +++ b/tests/integration/stop_consumer.go @@ -1,12 +1,13 @@ package integration import ( + abci "github.com/cometbft/cometbft/abci/types" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" - abci "github.com/tendermint/tendermint/abci/types" ) // Tests the functionality of stopping a consumer chain at a higher level than unit tests diff --git a/tests/integration/throttle.go b/tests/integration/throttle.go index b2dc390ea1..289c57e9d0 100644 --- a/tests/integration/throttle.go +++ b/tests/integration/throttle.go @@ -3,13 +3,14 @@ package integration import ( "time" + tmtypes "github.com/cometbft/cometbft/types" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + icstestingutils "github.com/cosmos/interchain-security/v2/testutil/ibc_testing" providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" - tmtypes "github.com/tendermint/tendermint/types" ) const fullSlashMeterString = "1.0" @@ -59,7 +60,7 @@ 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] - packet := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmVal, stakingtypes.Downtime, 1) + packet := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmVal, stakingtypes.Infraction_INFRACTION_DOWNTIME, 1) sendOnConsumerRecvOnProvider(s, s.getFirstBundle().Path, packet) // Assert validator 0 is jailed and has no power @@ -78,7 +79,7 @@ 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] - packet = s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmVal, stakingtypes.Downtime, 2) + packet = s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmVal, stakingtypes.Infraction_INFRACTION_DOWNTIME, 2) sendOnConsumerRecvOnProvider(s, s.getFirstBundle().Path, packet) // Require that slash packet has not been handled @@ -195,7 +196,7 @@ func (s *CCVTestSuite) TestMultiConsumerSlashPacketThrottling() { packet := s.constructSlashPacketFromConsumer( *bundle, *tmVal, - stakingtypes.Downtime, + stakingtypes.Infraction_INFRACTION_DOWNTIME, 3, // use sequence 3, 1 and 2 are used above. ) sendOnConsumerRecvOnProvider(s, bundle.Path, packet) @@ -301,11 +302,11 @@ func (s *CCVTestSuite) TestPacketSpam() { // Increment ibc seq num for each packet (starting at 1) ibcSeqNum++ // Set infraction type based on even/odd index. - var infractionType stakingtypes.InfractionType + var infractionType stakingtypes.Infraction if ibcSeqNum%2 == 0 { - infractionType = stakingtypes.Downtime + infractionType = stakingtypes.Infraction_INFRACTION_DOWNTIME } else { - infractionType = stakingtypes.DoubleSign + infractionType = stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN } valToJail := s.providerChain.Vals.Validators[ibcSeqNum%3] packets = append(packets, s.constructSlashPacketFromConsumer(firstBundle, *valToJail, infractionType, ibcSeqNum)) @@ -362,7 +363,7 @@ func (s *CCVTestSuite) TestDoubleSignDoesNotAffectThrottling() { // Increment ibc seq num for each packet (starting at 1) ibcSeqNum++ valToJail := s.providerChain.Vals.Validators[ibcSeqNum%3] - packets = append(packets, s.constructSlashPacketFromConsumer(firstBundle, *valToJail, stakingtypes.DoubleSign, ibcSeqNum)) + packets = append(packets, s.constructSlashPacketFromConsumer(firstBundle, *valToJail, stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN, ibcSeqNum)) } // Recv 500 packets from consumer to provider in same block @@ -458,7 +459,7 @@ func (s *CCVTestSuite) TestQueueOrdering() { // Else instantiate a slash packet valToJail := s.providerChain.Vals.Validators[ibcSeqNum%3] - packets = append(packets, s.constructSlashPacketFromConsumer(firstBundle, *valToJail, stakingtypes.Downtime, ibcSeqNum)) + packets = append(packets, s.constructSlashPacketFromConsumer(firstBundle, *valToJail, stakingtypes.Infraction_INFRACTION_DOWNTIME, ibcSeqNum)) } // Recv 500 packets from consumer to provider in same block @@ -592,9 +593,9 @@ func (s *CCVTestSuite) TestSlashingSmallValidators() { tmval1 := s.providerChain.Vals.Validators[1] tmval2 := s.providerChain.Vals.Validators[2] tmval3 := s.providerChain.Vals.Validators[3] - packet1 := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval1, stakingtypes.Downtime, 1) - packet2 := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval2, stakingtypes.Downtime, 2) - packet3 := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval3, stakingtypes.Downtime, 3) + packet1 := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval1, stakingtypes.Infraction_INFRACTION_DOWNTIME, 1) + packet2 := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval2, stakingtypes.Infraction_INFRACTION_DOWNTIME, 2) + packet3 := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval3, stakingtypes.Infraction_INFRACTION_DOWNTIME, 3) sendOnConsumerRecvOnProvider(s, s.getFirstBundle().Path, packet1) sendOnConsumerRecvOnProvider(s, s.getFirstBundle().Path, packet2) sendOnConsumerRecvOnProvider(s, s.getFirstBundle().Path, packet3) @@ -667,12 +668,12 @@ func (s *CCVTestSuite) TestSlashSameValidator() { s.setDefaultValSigningInfo(*tmval3) packets := []channeltypes.Packet{ - s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval1, stakingtypes.Downtime, 1), - s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval2, stakingtypes.Downtime, 2), - s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval3, stakingtypes.Downtime, 3), - s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval1, stakingtypes.Downtime, 4), - s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval2, stakingtypes.Downtime, 5), - s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval3, stakingtypes.Downtime, 6), + s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval1, stakingtypes.Infraction_INFRACTION_DOWNTIME, 1), + s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval2, stakingtypes.Infraction_INFRACTION_DOWNTIME, 2), + s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval3, stakingtypes.Infraction_INFRACTION_DOWNTIME, 3), + s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval1, stakingtypes.Infraction_INFRACTION_DOWNTIME, 4), + s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval2, stakingtypes.Infraction_INFRACTION_DOWNTIME, 5), + s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval3, stakingtypes.Infraction_INFRACTION_DOWNTIME, 6), } // Recv and queue all slash packets. @@ -723,7 +724,7 @@ func (s CCVTestSuite) TestSlashAllValidators() { //nolint:govet // this is a tes for _, val := range s.providerChain.Vals.Validators { s.setDefaultValSigningInfo(*val) packets = append(packets, s.constructSlashPacketFromConsumer( - s.getFirstBundle(), *val, stakingtypes.Downtime, ibcSeqNum)) + s.getFirstBundle(), *val, stakingtypes.Infraction_INFRACTION_DOWNTIME, ibcSeqNum)) ibcSeqNum++ } @@ -731,7 +732,7 @@ func (s CCVTestSuite) TestSlashAllValidators() { //nolint:govet // this is a tes for _, val := range s.providerChain.Vals.Validators { for i := 0; i < 5; i++ { packets = append(packets, s.constructSlashPacketFromConsumer( - s.getFirstBundle(), *val, stakingtypes.Downtime, ibcSeqNum)) + s.getFirstBundle(), *val, stakingtypes.Infraction_INFRACTION_DOWNTIME, ibcSeqNum)) ibcSeqNum++ } } @@ -784,7 +785,7 @@ func (s *CCVTestSuite) TestLeadingVSCMaturedAreDequeued() { for i := 50; i < 100; i++ { ibcSeqNum := uint64(i) packet := s.constructSlashPacketFromConsumer(*bundle, - *s.providerChain.Vals.Validators[0], stakingtypes.Downtime, ibcSeqNum) + *s.providerChain.Vals.Validators[0], stakingtypes.Infraction_INFRACTION_DOWNTIME, ibcSeqNum) packetData := ccvtypes.ConsumerPacketData{} ccvtypes.ModuleCdc.MustUnmarshalJSON(packet.GetData(), &packetData) providerKeeper.OnRecvSlashPacket(s.providerCtx(), @@ -875,7 +876,7 @@ func (s *CCVTestSuite) TestVscMaturedHandledPerBlockLimit() { for i := 100; i < 150; i++ { ibcSeqNum := uint64(i) packet := s.constructSlashPacketFromConsumer(*bundle, - *s.providerChain.Vals.Validators[0], stakingtypes.Downtime, ibcSeqNum) + *s.providerChain.Vals.Validators[0], stakingtypes.Infraction_INFRACTION_DOWNTIME, ibcSeqNum) packetData := ccvtypes.ConsumerPacketData{} ccvtypes.ModuleCdc.MustUnmarshalJSON(packet.GetData(), &packetData) providerKeeper.OnRecvSlashPacket(s.providerCtx(), diff --git a/tests/integration/unbonding.go b/tests/integration/unbonding.go index fdb3e3af13..6b14099d45 100644 --- a/tests/integration/unbonding.go +++ b/tests/integration/unbonding.go @@ -3,6 +3,7 @@ package integration import ( "time" + "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" @@ -25,10 +26,10 @@ func (s *CCVTestSuite) TestUndelegationNormalOperation() { testCases := []struct { name string shareDiv int64 - unbond func(expBalance, balance sdk.Int) + unbond func(expBalance, balance math.Int) }{ { - "provider unbonding period elapses first", 2, func(expBalance, balance sdk.Int) { + "provider unbonding period elapses first", 2, func(expBalance, balance math.Int) { // increment time so that the unbonding period ends on the provider incrementTimeByUnbondingPeriod(s, Provider) @@ -43,7 +44,7 @@ func (s *CCVTestSuite) TestUndelegationNormalOperation() { }, }, { - "consumer unbonding period elapses first", 2, func(expBalance, balance sdk.Int) { + "consumer unbonding period elapses first", 2, func(expBalance, balance math.Int) { // undelegation complete on consumer unbondConsumer(1) @@ -58,7 +59,7 @@ func (s *CCVTestSuite) TestUndelegationNormalOperation() { }, }, { - "no valset changes", 1, func(expBalance, balance sdk.Int) { + "no valset changes", 1, func(expBalance, balance math.Int) { // undelegation complete on consumer unbondConsumer(1) diff --git a/tests/integration/valset_update.go b/tests/integration/valset_update.go index d255c7f18d..6e231976c4 100644 --- a/tests/integration/valset_update.go +++ b/tests/integration/valset_update.go @@ -3,12 +3,12 @@ package integration import ( "time" + abci "github.com/cometbft/cometbft/abci/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" sdk "github.com/cosmos/cosmos-sdk/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" - abci "github.com/tendermint/tendermint/abci/types" ) // TestPacketRoundtrip tests a CCV packet roundtrip when tokens are bonded on provider diff --git a/testutil/crypto/crypto.go b/testutil/crypto/crypto.go index 891f357c9a..1becc4248e 100644 --- a/testutil/crypto/crypto.go +++ b/testutil/crypto/crypto.go @@ -13,9 +13,9 @@ import ( sdkstakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - tmcrypto "github.com/tendermint/tendermint/crypto" - tmprotocrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" - tmtypes "github.com/tendermint/tendermint/types" + tmcrypto "github.com/cometbft/cometbft/crypto" + tmprotocrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" + tmtypes "github.com/cometbft/cometbft/types" ) // CryptoIdentity is a test helper for generating keys and addresses of diff --git a/testutil/ibc_testing/generic_setup.go b/testutil/ibc_testing/generic_setup.go index 9a1bbdd48b..67e169af98 100644 --- a/testutil/ibc_testing/generic_setup.go +++ b/testutil/ibc_testing/generic_setup.go @@ -5,7 +5,7 @@ import ( "testing" sdk "github.com/cosmos/cosmos-sdk/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" testutil "github.com/cosmos/interchain-security/v2/testutil/integration" testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" @@ -13,8 +13,8 @@ import ( "github.com/stretchr/testify/suite" - tmencoding "github.com/tendermint/tendermint/crypto/encoding" - tmtypes "github.com/tendermint/tendermint/types" + tmencoding "github.com/cometbft/cometbft/crypto/encoding" + tmtypes "github.com/cometbft/cometbft/types" ) // Contains generic setup code for running integration tests against a provider, consumer, diff --git a/testutil/ibc_testing/specific_setup.go b/testutil/ibc_testing/specific_setup.go index 3e3886c818..ab9715ebd9 100644 --- a/testutil/ibc_testing/specific_setup.go +++ b/testutil/ibc_testing/specific_setup.go @@ -7,12 +7,11 @@ package ibc_testing import ( "encoding/json" - "github.com/cosmos/cosmos-sdk/simapp" - + simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" - "github.com/tendermint/tendermint/libs/log" - tmdb "github.com/tendermint/tm-db" + tmdb "github.com/cometbft/cometbft-db" + "github.com/cometbft/cometbft/libs/log" appConsumer "github.com/cosmos/interchain-security/v2/app/consumer" appConsumerDemocracy "github.com/cosmos/interchain-security/v2/app/consumer-democracy" @@ -22,23 +21,20 @@ import ( // ProviderAppIniter implements ibctesting.AppIniter for a provider app func ProviderAppIniter() (ibctesting.TestingApp, map[string]json.RawMessage) { encoding := appProvider.MakeTestEncodingConfig() - testApp := appProvider.New(log.NewNopLogger(), tmdb.NewMemDB(), nil, true, map[int64]bool{}, - simapp.DefaultNodeHome, 5, encoding, simapp.EmptyAppOptions{}) - return testApp, appProvider.NewDefaultGenesisState(encoding.Marshaler) + testApp := appProvider.New(log.NewNopLogger(), tmdb.NewMemDB(), nil, true, simtestutil.EmptyAppOptions{}) + return testApp, appProvider.NewDefaultGenesisState(encoding.Codec) } // ConsumerAppIniter implements ibctesting.AppIniter for a consumer app func ConsumerAppIniter() (ibctesting.TestingApp, map[string]json.RawMessage) { encoding := appConsumer.MakeTestEncodingConfig() - testApp := appConsumer.New(log.NewNopLogger(), tmdb.NewMemDB(), nil, true, map[int64]bool{}, - simapp.DefaultNodeHome, 5, encoding, simapp.EmptyAppOptions{}) - return testApp, appConsumer.NewDefaultGenesisState(encoding.Marshaler) + testApp := appConsumer.New(log.NewNopLogger(), tmdb.NewMemDB(), nil, true, simtestutil.EmptyAppOptions{}) + return testApp, appConsumer.NewDefaultGenesisState(encoding.Codec) } // DemocracyConsumerAppIniter implements ibctesting.AppIniter for a democracy consumer app func DemocracyConsumerAppIniter() (ibctesting.TestingApp, map[string]json.RawMessage) { encoding := appConsumerDemocracy.MakeTestEncodingConfig() - testApp := appConsumerDemocracy.New(log.NewNopLogger(), tmdb.NewMemDB(), nil, true, map[int64]bool{}, - simapp.DefaultNodeHome, 5, encoding, simapp.EmptyAppOptions{}) - return testApp, appConsumerDemocracy.NewDefaultGenesisState(encoding.Marshaler) + testApp := appConsumerDemocracy.New(log.NewNopLogger(), tmdb.NewMemDB(), nil, true, simtestutil.EmptyAppOptions{}) + return testApp, appConsumerDemocracy.NewDefaultGenesisState(encoding.Codec) } diff --git a/testutil/integration/interfaces.go b/testutil/integration/interfaces.go index 51ffe51154..6fe667c2fa 100644 --- a/testutil/integration/interfaces.go +++ b/testutil/integration/interfaces.go @@ -3,21 +3,23 @@ package integration import ( "time" + "cosmossdk.io/math" + abci "github.com/cometbft/cometbft/abci/types" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" "github.com/cosmos/cosmos-sdk/x/staking/types" + ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" consumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" - abci "github.com/tendermint/tendermint/abci/types" ) // The interface that any provider app must implement to be compatible with ccv integration tests. @@ -85,7 +87,7 @@ type DemocConsumerApp interface { type TestStakingKeeper interface { ccvtypes.StakingKeeper - Delegate(ctx sdk.Context, delAddr sdk.AccAddress, bondAmt sdk.Int, tokenSrc types.BondStatus, + Delegate(ctx sdk.Context, delAddr sdk.AccAddress, bondAmt math.Int, tokenSrc types.BondStatus, validator types.Validator, subtractAccount bool) (newShares sdk.Dec, err error) Undelegate(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress, sharesAmount sdk.Dec, ) (time.Time, error) @@ -144,10 +146,9 @@ type TestMintKeeper interface { } type TestGovKeeper interface { - GetDepositParams(ctx sdk.Context) govtypes.DepositParams - GetVotingParams(ctx sdk.Context) govtypes.VotingParams - SetVotingParams(ctx sdk.Context, votingParams govtypes.VotingParams) - SubmitProposal(ctx sdk.Context, content govtypes.Content) (govtypes.Proposal, error) + GetParams(ctx sdk.Context) govv1.Params + SetParams(ctx sdk.Context, params govv1.Params) error + SubmitProposal(ctx sdk.Context, messages []sdk.Msg, metadata, title, summary string, proposer sdk.AccAddress) (govv1.Proposal, error) AddDeposit(ctx sdk.Context, proposalID uint64, depositorAddr sdk.AccAddress, depositAmount sdk.Coins) (bool, error) - AddVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress, options govtypes.WeightedVoteOptions) error + AddVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress, options govv1.WeightedVoteOptions, metadata string) error } diff --git a/testutil/keeper/expectations.go b/testutil/keeper/expectations.go index 6377bf5613..06b5008750 100644 --- a/testutil/keeper/expectations.go +++ b/testutil/keeper/expectations.go @@ -6,14 +6,16 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - conntypes "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + "github.com/golang/mock/gomock" - host "github.com/cosmos/ibc-go/v4/modules/core/24-host" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + conntypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + + host "github.com/cosmos/ibc-go/v7/modules/core/24-host" ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" extra "github.com/oxyno-zeta/gomock-extra-matcher" diff --git a/testutil/keeper/mocks.go b/testutil/keeper/mocks.go index 4f931d8152..fea83079d3 100644 --- a/testutil/keeper/mocks.go +++ b/testutil/keeper/mocks.go @@ -9,18 +9,20 @@ import ( reflect "reflect" time "time" - types "github.com/cosmos/cosmos-sdk/types" - types0 "github.com/cosmos/cosmos-sdk/x/auth/types" - types1 "github.com/cosmos/cosmos-sdk/x/capability/types" - types2 "github.com/cosmos/cosmos-sdk/x/evidence/types" - types3 "github.com/cosmos/cosmos-sdk/x/slashing/types" - types4 "github.com/cosmos/cosmos-sdk/x/staking/types" - types5 "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - types6 "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types" - types7 "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - exported "github.com/cosmos/ibc-go/v4/modules/core/exported" + math "cosmossdk.io/math" + types "github.com/cometbft/cometbft/abci/types" + types0 "github.com/cosmos/cosmos-sdk/types" + types1 "github.com/cosmos/cosmos-sdk/x/auth/types" + types2 "github.com/cosmos/cosmos-sdk/x/capability/types" + types3 "github.com/cosmos/cosmos-sdk/x/evidence/types" + types4 "github.com/cosmos/cosmos-sdk/x/slashing/types" + types5 "github.com/cosmos/cosmos-sdk/x/staking/types" + types6 "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + types7 "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + types8 "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + types9 "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + exported "github.com/cosmos/ibc-go/v7/modules/core/exported" gomock "github.com/golang/mock/gomock" - types8 "github.com/tendermint/tendermint/abci/types" ) // MockStakingKeeper is a mock of StakingKeeper interface. @@ -47,7 +49,7 @@ func (m *MockStakingKeeper) EXPECT() *MockStakingKeeperMockRecorder { } // BondDenom mocks base method. -func (m *MockStakingKeeper) BondDenom(ctx types.Context) string { +func (m *MockStakingKeeper) BondDenom(ctx types0.Context) string { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "BondDenom", ctx) ret0, _ := ret[0].(string) @@ -61,10 +63,10 @@ func (mr *MockStakingKeeperMockRecorder) BondDenom(ctx interface{}) *gomock.Call } // Delegation mocks base method. -func (m *MockStakingKeeper) Delegation(ctx types.Context, addr types.AccAddress, valAddr types.ValAddress) types4.DelegationI { +func (m *MockStakingKeeper) Delegation(ctx types0.Context, addr types0.AccAddress, valAddr types0.ValAddress) types5.DelegationI { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Delegation", ctx, addr, valAddr) - ret0, _ := ret[0].(types4.DelegationI) + ret0, _ := ret[0].(types5.DelegationI) return ret0 } @@ -75,10 +77,10 @@ func (mr *MockStakingKeeperMockRecorder) Delegation(ctx, addr, valAddr interface } // GetLastTotalPower mocks base method. -func (m *MockStakingKeeper) GetLastTotalPower(ctx types.Context) types.Int { +func (m *MockStakingKeeper) GetLastTotalPower(ctx types0.Context) math.Int { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetLastTotalPower", ctx) - ret0, _ := ret[0].(types.Int) + ret0, _ := ret[0].(math.Int) return ret0 } @@ -89,7 +91,7 @@ func (mr *MockStakingKeeperMockRecorder) GetLastTotalPower(ctx interface{}) *gom } // GetLastValidatorPower mocks base method. -func (m *MockStakingKeeper) GetLastValidatorPower(ctx types.Context, operator types.ValAddress) int64 { +func (m *MockStakingKeeper) GetLastValidatorPower(ctx types0.Context, operator types0.ValAddress) int64 { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetLastValidatorPower", ctx, operator) ret0, _ := ret[0].(int64) @@ -103,10 +105,10 @@ func (mr *MockStakingKeeperMockRecorder) GetLastValidatorPower(ctx, operator int } // GetLastValidators mocks base method. -func (m *MockStakingKeeper) GetLastValidators(ctx types.Context) []types4.Validator { +func (m *MockStakingKeeper) GetLastValidators(ctx types0.Context) []types5.Validator { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetLastValidators", ctx) - ret0, _ := ret[0].([]types4.Validator) + ret0, _ := ret[0].([]types5.Validator) return ret0 } @@ -116,11 +118,26 @@ func (mr *MockStakingKeeperMockRecorder) GetLastValidators(ctx interface{}) *gom return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetLastValidators", reflect.TypeOf((*MockStakingKeeper)(nil).GetLastValidators), ctx) } +// GetUnbondingType mocks base method. +func (m *MockStakingKeeper) GetUnbondingType(ctx types0.Context, id uint64) (types5.UnbondingType, bool) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetUnbondingType", ctx, id) + ret0, _ := ret[0].(types5.UnbondingType) + ret1, _ := ret[1].(bool) + return ret0, ret1 +} + +// GetUnbondingType indicates an expected call of GetUnbondingType. +func (mr *MockStakingKeeperMockRecorder) GetUnbondingType(ctx, id interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUnbondingType", reflect.TypeOf((*MockStakingKeeper)(nil).GetUnbondingType), ctx, id) +} + // GetValidator mocks base method. -func (m *MockStakingKeeper) GetValidator(ctx types.Context, addr types.ValAddress) (types4.Validator, bool) { +func (m *MockStakingKeeper) GetValidator(ctx types0.Context, addr types0.ValAddress) (types5.Validator, bool) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetValidator", ctx, addr) - ret0, _ := ret[0].(types4.Validator) + ret0, _ := ret[0].(types5.Validator) ret1, _ := ret[1].(bool) return ret0, ret1 } @@ -132,10 +149,10 @@ func (mr *MockStakingKeeperMockRecorder) GetValidator(ctx, addr interface{}) *go } // GetValidatorByConsAddr mocks base method. -func (m *MockStakingKeeper) GetValidatorByConsAddr(ctx types.Context, consAddr types.ConsAddress) (types4.Validator, bool) { +func (m *MockStakingKeeper) GetValidatorByConsAddr(ctx types0.Context, consAddr types0.ConsAddress) (types5.Validator, bool) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetValidatorByConsAddr", ctx, consAddr) - ret0, _ := ret[0].(types4.Validator) + ret0, _ := ret[0].(types5.Validator) ret1, _ := ret[1].(bool) return ret0, ret1 } @@ -147,10 +164,10 @@ func (mr *MockStakingKeeperMockRecorder) GetValidatorByConsAddr(ctx, consAddr in } // GetValidatorUpdates mocks base method. -func (m *MockStakingKeeper) GetValidatorUpdates(ctx types.Context) []types8.ValidatorUpdate { +func (m *MockStakingKeeper) GetValidatorUpdates(ctx types0.Context) []types.ValidatorUpdate { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetValidatorUpdates", ctx) - ret0, _ := ret[0].([]types8.ValidatorUpdate) + ret0, _ := ret[0].([]types.ValidatorUpdate) return ret0 } @@ -161,7 +178,7 @@ func (mr *MockStakingKeeperMockRecorder) GetValidatorUpdates(ctx interface{}) *g } // IsValidatorJailed mocks base method. -func (m *MockStakingKeeper) IsValidatorJailed(ctx types.Context, addr types.ConsAddress) bool { +func (m *MockStakingKeeper) IsValidatorJailed(ctx types0.Context, addr types0.ConsAddress) bool { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "IsValidatorJailed", ctx, addr) ret0, _ := ret[0].(bool) @@ -175,7 +192,7 @@ func (mr *MockStakingKeeperMockRecorder) IsValidatorJailed(ctx, addr interface{} } // IterateLastValidatorPowers mocks base method. -func (m *MockStakingKeeper) IterateLastValidatorPowers(ctx types.Context, cb func(types.ValAddress, int64) bool) { +func (m *MockStakingKeeper) IterateLastValidatorPowers(ctx types0.Context, cb func(types0.ValAddress, int64) bool) { m.ctrl.T.Helper() m.ctrl.Call(m, "IterateLastValidatorPowers", ctx, cb) } @@ -187,7 +204,7 @@ func (mr *MockStakingKeeperMockRecorder) IterateLastValidatorPowers(ctx, cb inte } // IterateValidators mocks base method. -func (m *MockStakingKeeper) IterateValidators(ctx types.Context, f func(int64, types4.ValidatorI) bool) { +func (m *MockStakingKeeper) IterateValidators(ctx types0.Context, f func(int64, types5.ValidatorI) bool) { m.ctrl.T.Helper() m.ctrl.Call(m, "IterateValidators", ctx, f) } @@ -199,7 +216,7 @@ func (mr *MockStakingKeeperMockRecorder) IterateValidators(ctx, f interface{}) * } // Jail mocks base method. -func (m *MockStakingKeeper) Jail(arg0 types.Context, arg1 types.ConsAddress) { +func (m *MockStakingKeeper) Jail(arg0 types0.Context, arg1 types0.ConsAddress) { m.ctrl.T.Helper() m.ctrl.Call(m, "Jail", arg0, arg1) } @@ -211,7 +228,7 @@ func (mr *MockStakingKeeperMockRecorder) Jail(arg0, arg1 interface{}) *gomock.Ca } // MaxValidators mocks base method. -func (m *MockStakingKeeper) MaxValidators(ctx types.Context) uint32 { +func (m *MockStakingKeeper) MaxValidators(ctx types0.Context) uint32 { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MaxValidators", ctx) ret0, _ := ret[0].(uint32) @@ -225,10 +242,10 @@ func (mr *MockStakingKeeperMockRecorder) MaxValidators(ctx interface{}) *gomock. } // PowerReduction mocks base method. -func (m *MockStakingKeeper) PowerReduction(ctx types.Context) types.Int { +func (m *MockStakingKeeper) PowerReduction(ctx types0.Context) math.Int { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PowerReduction", ctx) - ret0, _ := ret[0].(types.Int) + ret0, _ := ret[0].(math.Int) return ret0 } @@ -239,7 +256,7 @@ func (mr *MockStakingKeeperMockRecorder) PowerReduction(ctx interface{}) *gomock } // PutUnbondingOnHold mocks base method. -func (m *MockStakingKeeper) PutUnbondingOnHold(ctx types.Context, id uint64) error { +func (m *MockStakingKeeper) PutUnbondingOnHold(ctx types0.Context, id uint64) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutUnbondingOnHold", ctx, id) ret0, _ := ret[0].(error) @@ -253,19 +270,35 @@ func (mr *MockStakingKeeperMockRecorder) PutUnbondingOnHold(ctx, id interface{}) } // Slash mocks base method. -func (m *MockStakingKeeper) Slash(arg0 types.Context, arg1 types.ConsAddress, arg2, arg3 int64, arg4 types.Dec, arg5 types4.InfractionType) { +func (m *MockStakingKeeper) Slash(arg0 types0.Context, arg1 types0.ConsAddress, arg2, arg3 int64, arg4 types0.Dec) math.Int { m.ctrl.T.Helper() - m.ctrl.Call(m, "Slash", arg0, arg1, arg2, arg3, arg4, arg5) + ret := m.ctrl.Call(m, "Slash", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(math.Int) + return ret0 } // Slash indicates an expected call of Slash. -func (mr *MockStakingKeeperMockRecorder) Slash(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { +func (mr *MockStakingKeeperMockRecorder) Slash(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Slash", reflect.TypeOf((*MockStakingKeeper)(nil).Slash), arg0, arg1, arg2, arg3, arg4, arg5) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Slash", reflect.TypeOf((*MockStakingKeeper)(nil).Slash), arg0, arg1, arg2, arg3, arg4) +} + +// SlashWithInfractionReason mocks base method. +func (m *MockStakingKeeper) SlashWithInfractionReason(arg0 types0.Context, arg1 types0.ConsAddress, arg2, arg3 int64, arg4 types0.Dec, arg5 types5.Infraction) math.Int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SlashWithInfractionReason", arg0, arg1, arg2, arg3, arg4, arg5) + ret0, _ := ret[0].(math.Int) + return ret0 +} + +// SlashWithInfractionReason indicates an expected call of SlashWithInfractionReason. +func (mr *MockStakingKeeperMockRecorder) SlashWithInfractionReason(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SlashWithInfractionReason", reflect.TypeOf((*MockStakingKeeper)(nil).SlashWithInfractionReason), arg0, arg1, arg2, arg3, arg4, arg5) } // UnbondingCanComplete mocks base method. -func (m *MockStakingKeeper) UnbondingCanComplete(ctx types.Context, id uint64) error { +func (m *MockStakingKeeper) UnbondingCanComplete(ctx types0.Context, id uint64) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "UnbondingCanComplete", ctx, id) ret0, _ := ret[0].(error) @@ -279,7 +312,7 @@ func (mr *MockStakingKeeperMockRecorder) UnbondingCanComplete(ctx, id interface{ } // UnbondingTime mocks base method. -func (m *MockStakingKeeper) UnbondingTime(ctx types.Context) time.Duration { +func (m *MockStakingKeeper) UnbondingTime(ctx types0.Context) time.Duration { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "UnbondingTime", ctx) ret0, _ := ret[0].(time.Duration) @@ -293,7 +326,7 @@ func (mr *MockStakingKeeperMockRecorder) UnbondingTime(ctx interface{}) *gomock. } // Unjail mocks base method. -func (m *MockStakingKeeper) Unjail(ctx types.Context, addr types.ConsAddress) { +func (m *MockStakingKeeper) Unjail(ctx types0.Context, addr types0.ConsAddress) { m.ctrl.T.Helper() m.ctrl.Call(m, "Unjail", ctx, addr) } @@ -305,10 +338,10 @@ func (mr *MockStakingKeeperMockRecorder) Unjail(ctx, addr interface{}) *gomock.C } // Validator mocks base method. -func (m *MockStakingKeeper) Validator(ctx types.Context, addr types.ValAddress) types4.ValidatorI { +func (m *MockStakingKeeper) Validator(ctx types0.Context, addr types0.ValAddress) types5.ValidatorI { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Validator", ctx, addr) - ret0, _ := ret[0].(types4.ValidatorI) + ret0, _ := ret[0].(types5.ValidatorI) return ret0 } @@ -319,10 +352,10 @@ func (mr *MockStakingKeeperMockRecorder) Validator(ctx, addr interface{}) *gomoc } // ValidatorByConsAddr mocks base method. -func (m *MockStakingKeeper) ValidatorByConsAddr(ctx types.Context, consAddr types.ConsAddress) types4.ValidatorI { +func (m *MockStakingKeeper) ValidatorByConsAddr(ctx types0.Context, consAddr types0.ConsAddress) types5.ValidatorI { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ValidatorByConsAddr", ctx, consAddr) - ret0, _ := ret[0].(types4.ValidatorI) + ret0, _ := ret[0].(types5.ValidatorI) return ret0 } @@ -356,7 +389,7 @@ func (m *MockEvidenceKeeper) EXPECT() *MockEvidenceKeeperMockRecorder { } // HandleEquivocationEvidence mocks base method. -func (m *MockEvidenceKeeper) HandleEquivocationEvidence(ctx types.Context, evidence *types2.Equivocation) { +func (m *MockEvidenceKeeper) HandleEquivocationEvidence(ctx types0.Context, evidence *types3.Equivocation) { m.ctrl.T.Helper() m.ctrl.Call(m, "HandleEquivocationEvidence", ctx, evidence) } @@ -391,7 +424,7 @@ func (m *MockSlashingKeeper) EXPECT() *MockSlashingKeeperMockRecorder { } // DowntimeJailDuration mocks base method. -func (m *MockSlashingKeeper) DowntimeJailDuration(arg0 types.Context) time.Duration { +func (m *MockSlashingKeeper) DowntimeJailDuration(arg0 types0.Context) time.Duration { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DowntimeJailDuration", arg0) ret0, _ := ret[0].(time.Duration) @@ -405,10 +438,10 @@ func (mr *MockSlashingKeeperMockRecorder) DowntimeJailDuration(arg0 interface{}) } // GetValidatorSigningInfo mocks base method. -func (m *MockSlashingKeeper) GetValidatorSigningInfo(ctx types.Context, address types.ConsAddress) (types3.ValidatorSigningInfo, bool) { +func (m *MockSlashingKeeper) GetValidatorSigningInfo(ctx types0.Context, address types0.ConsAddress) (types4.ValidatorSigningInfo, bool) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetValidatorSigningInfo", ctx, address) - ret0, _ := ret[0].(types3.ValidatorSigningInfo) + ret0, _ := ret[0].(types4.ValidatorSigningInfo) ret1, _ := ret[1].(bool) return ret0, ret1 } @@ -420,7 +453,7 @@ func (mr *MockSlashingKeeperMockRecorder) GetValidatorSigningInfo(ctx, address i } // IsTombstoned mocks base method. -func (m *MockSlashingKeeper) IsTombstoned(arg0 types.Context, arg1 types.ConsAddress) bool { +func (m *MockSlashingKeeper) IsTombstoned(arg0 types0.Context, arg1 types0.ConsAddress) bool { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "IsTombstoned", arg0, arg1) ret0, _ := ret[0].(bool) @@ -434,7 +467,7 @@ func (mr *MockSlashingKeeperMockRecorder) IsTombstoned(arg0, arg1 interface{}) * } // JailUntil mocks base method. -func (m *MockSlashingKeeper) JailUntil(arg0 types.Context, arg1 types.ConsAddress, arg2 time.Time) { +func (m *MockSlashingKeeper) JailUntil(arg0 types0.Context, arg1 types0.ConsAddress, arg2 time.Time) { m.ctrl.T.Helper() m.ctrl.Call(m, "JailUntil", arg0, arg1, arg2) } @@ -446,10 +479,10 @@ func (mr *MockSlashingKeeperMockRecorder) JailUntil(arg0, arg1, arg2 interface{} } // SlashFractionDoubleSign mocks base method. -func (m *MockSlashingKeeper) SlashFractionDoubleSign(ctx types.Context) types.Dec { +func (m *MockSlashingKeeper) SlashFractionDoubleSign(ctx types0.Context) types0.Dec { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SlashFractionDoubleSign", ctx) - ret0, _ := ret[0].(types.Dec) + ret0, _ := ret[0].(types0.Dec) return ret0 } @@ -460,10 +493,10 @@ func (mr *MockSlashingKeeperMockRecorder) SlashFractionDoubleSign(ctx interface{ } // SlashFractionDowntime mocks base method. -func (m *MockSlashingKeeper) SlashFractionDowntime(arg0 types.Context) types.Dec { +func (m *MockSlashingKeeper) SlashFractionDowntime(arg0 types0.Context) types0.Dec { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SlashFractionDowntime", arg0) - ret0, _ := ret[0].(types.Dec) + ret0, _ := ret[0].(types0.Dec) return ret0 } @@ -474,7 +507,7 @@ func (mr *MockSlashingKeeperMockRecorder) SlashFractionDowntime(arg0 interface{} } // Tombstone mocks base method. -func (m *MockSlashingKeeper) Tombstone(arg0 types.Context, arg1 types.ConsAddress) { +func (m *MockSlashingKeeper) Tombstone(arg0 types0.Context, arg1 types0.ConsAddress) { m.ctrl.T.Helper() m.ctrl.Call(m, "Tombstone", arg0, arg1) } @@ -509,7 +542,7 @@ func (m *MockChannelKeeper) EXPECT() *MockChannelKeeperMockRecorder { } // ChanCloseInit mocks base method. -func (m *MockChannelKeeper) ChanCloseInit(ctx types.Context, portID, channelID string, chanCap *types1.Capability) error { +func (m *MockChannelKeeper) ChanCloseInit(ctx types0.Context, portID, channelID string, chanCap *types2.Capability) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChanCloseInit", ctx, portID, channelID, chanCap) ret0, _ := ret[0].(error) @@ -523,10 +556,10 @@ func (mr *MockChannelKeeperMockRecorder) ChanCloseInit(ctx, portID, channelID, c } // GetChannel mocks base method. -func (m *MockChannelKeeper) GetChannel(ctx types.Context, srcPort, srcChan string) (types7.Channel, bool) { +func (m *MockChannelKeeper) GetChannel(ctx types0.Context, srcPort, srcChan string) (types9.Channel, bool) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetChannel", ctx, srcPort, srcChan) - ret0, _ := ret[0].(types7.Channel) + ret0, _ := ret[0].(types9.Channel) ret1, _ := ret[1].(bool) return ret0, ret1 } @@ -538,7 +571,7 @@ func (mr *MockChannelKeeperMockRecorder) GetChannel(ctx, srcPort, srcChan interf } // GetNextSequenceSend mocks base method. -func (m *MockChannelKeeper) GetNextSequenceSend(ctx types.Context, portID, channelID string) (uint64, bool) { +func (m *MockChannelKeeper) GetNextSequenceSend(ctx types0.Context, portID, channelID string) (uint64, bool) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetNextSequenceSend", ctx, portID, channelID) ret0, _ := ret[0].(uint64) @@ -553,21 +586,22 @@ func (mr *MockChannelKeeperMockRecorder) GetNextSequenceSend(ctx, portID, channe } // SendPacket mocks base method. -func (m *MockChannelKeeper) SendPacket(ctx types.Context, channelCap *types1.Capability, packet exported.PacketI) error { +func (m *MockChannelKeeper) SendPacket(ctx types0.Context, chanCap *types2.Capability, sourcePort, sourceChannel string, timeoutHeight types7.Height, timeoutTimestamp uint64, data []byte) (uint64, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SendPacket", ctx, channelCap, packet) - ret0, _ := ret[0].(error) - return ret0 + ret := m.ctrl.Call(m, "SendPacket", ctx, chanCap, sourcePort, sourceChannel, timeoutHeight, timeoutTimestamp, data) + ret0, _ := ret[0].(uint64) + ret1, _ := ret[1].(error) + return ret0, ret1 } // SendPacket indicates an expected call of SendPacket. -func (mr *MockChannelKeeperMockRecorder) SendPacket(ctx, channelCap, packet interface{}) *gomock.Call { +func (mr *MockChannelKeeperMockRecorder) SendPacket(ctx, chanCap, sourcePort, sourceChannel, timeoutHeight, timeoutTimestamp, data interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendPacket", reflect.TypeOf((*MockChannelKeeper)(nil).SendPacket), ctx, channelCap, packet) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendPacket", reflect.TypeOf((*MockChannelKeeper)(nil).SendPacket), ctx, chanCap, sourcePort, sourceChannel, timeoutHeight, timeoutTimestamp, data) } // WriteAcknowledgement mocks base method. -func (m *MockChannelKeeper) WriteAcknowledgement(ctx types.Context, chanCap *types1.Capability, packet exported.PacketI, acknowledgement exported.Acknowledgement) error { +func (m *MockChannelKeeper) WriteAcknowledgement(ctx types0.Context, chanCap *types2.Capability, packet exported.PacketI, acknowledgement exported.Acknowledgement) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WriteAcknowledgement", ctx, chanCap, packet, acknowledgement) ret0, _ := ret[0].(error) @@ -604,10 +638,10 @@ func (m *MockPortKeeper) EXPECT() *MockPortKeeperMockRecorder { } // BindPort mocks base method. -func (m *MockPortKeeper) BindPort(ctx types.Context, portID string) *types1.Capability { +func (m *MockPortKeeper) BindPort(ctx types0.Context, portID string) *types2.Capability { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "BindPort", ctx, portID) - ret0, _ := ret[0].(*types1.Capability) + ret0, _ := ret[0].(*types2.Capability) return ret0 } @@ -641,10 +675,10 @@ func (m *MockConnectionKeeper) EXPECT() *MockConnectionKeeperMockRecorder { } // GetConnection mocks base method. -func (m *MockConnectionKeeper) GetConnection(ctx types.Context, connectionID string) (types6.ConnectionEnd, bool) { +func (m *MockConnectionKeeper) GetConnection(ctx types0.Context, connectionID string) (types8.ConnectionEnd, bool) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetConnection", ctx, connectionID) - ret0, _ := ret[0].(types6.ConnectionEnd) + ret0, _ := ret[0].(types8.ConnectionEnd) ret1, _ := ret[1].(bool) return ret0, ret1 } @@ -679,7 +713,7 @@ func (m *MockClientKeeper) EXPECT() *MockClientKeeperMockRecorder { } // CreateClient mocks base method. -func (m *MockClientKeeper) CreateClient(ctx types.Context, clientState exported.ClientState, consensusState exported.ConsensusState) (string, error) { +func (m *MockClientKeeper) CreateClient(ctx types0.Context, clientState exported.ClientState, consensusState exported.ConsensusState) (string, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CreateClient", ctx, clientState, consensusState) ret0, _ := ret[0].(string) @@ -694,7 +728,7 @@ func (mr *MockClientKeeperMockRecorder) CreateClient(ctx, clientState, consensus } // GetClientState mocks base method. -func (m *MockClientKeeper) GetClientState(ctx types.Context, clientID string) (exported.ClientState, bool) { +func (m *MockClientKeeper) GetClientState(ctx types0.Context, clientID string) (exported.ClientState, bool) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetClientState", ctx, clientID) ret0, _ := ret[0].(exported.ClientState) @@ -709,7 +743,7 @@ func (mr *MockClientKeeperMockRecorder) GetClientState(ctx, clientID interface{} } // GetLatestClientConsensusState mocks base method. -func (m *MockClientKeeper) GetLatestClientConsensusState(ctx types.Context, clientID string) (exported.ConsensusState, bool) { +func (m *MockClientKeeper) GetLatestClientConsensusState(ctx types0.Context, clientID string) (exported.ConsensusState, bool) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetLatestClientConsensusState", ctx, clientID) ret0, _ := ret[0].(exported.ConsensusState) @@ -724,7 +758,7 @@ func (mr *MockClientKeeperMockRecorder) GetLatestClientConsensusState(ctx, clien } // GetSelfConsensusState mocks base method. -func (m *MockClientKeeper) GetSelfConsensusState(ctx types.Context, height exported.Height) (exported.ConsensusState, error) { +func (m *MockClientKeeper) GetSelfConsensusState(ctx types0.Context, height exported.Height) (exported.ConsensusState, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetSelfConsensusState", ctx, height) ret0, _ := ret[0].(exported.ConsensusState) @@ -762,7 +796,7 @@ func (m *MockDistributionKeeper) EXPECT() *MockDistributionKeeperMockRecorder { } // FundCommunityPool mocks base method. -func (m *MockDistributionKeeper) FundCommunityPool(ctx types.Context, amount types.Coins, sender types.AccAddress) error { +func (m *MockDistributionKeeper) FundCommunityPool(ctx types0.Context, amount types0.Coins, sender types0.AccAddress) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FundCommunityPool", ctx, amount, sender) ret0, _ := ret[0].(error) @@ -799,15 +833,17 @@ func (m *MockConsumerHooks) EXPECT() *MockConsumerHooksMockRecorder { } // AfterValidatorBonded mocks base method. -func (m *MockConsumerHooks) AfterValidatorBonded(ctx types.Context, consAddr types.ConsAddress, arg2 types.ValAddress) { +func (m *MockConsumerHooks) AfterValidatorBonded(ctx types0.Context, consAddr types0.ConsAddress, valAddresses types0.ValAddress) error { m.ctrl.T.Helper() - m.ctrl.Call(m, "AfterValidatorBonded", ctx, consAddr, arg2) + ret := m.ctrl.Call(m, "AfterValidatorBonded", ctx, consAddr, valAddresses) + ret0, _ := ret[0].(error) + return ret0 } // AfterValidatorBonded indicates an expected call of AfterValidatorBonded. -func (mr *MockConsumerHooksMockRecorder) AfterValidatorBonded(ctx, consAddr, arg2 interface{}) *gomock.Call { +func (mr *MockConsumerHooksMockRecorder) AfterValidatorBonded(ctx, consAddr, valAddresses interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AfterValidatorBonded", reflect.TypeOf((*MockConsumerHooks)(nil).AfterValidatorBonded), ctx, consAddr, arg2) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AfterValidatorBonded", reflect.TypeOf((*MockConsumerHooks)(nil).AfterValidatorBonded), ctx, consAddr, valAddresses) } // MockBankKeeper is a mock of BankKeeper interface. @@ -834,10 +870,10 @@ func (m *MockBankKeeper) EXPECT() *MockBankKeeperMockRecorder { } // GetAllBalances mocks base method. -func (m *MockBankKeeper) GetAllBalances(ctx types.Context, addr types.AccAddress) types.Coins { +func (m *MockBankKeeper) GetAllBalances(ctx types0.Context, addr types0.AccAddress) types0.Coins { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetAllBalances", ctx, addr) - ret0, _ := ret[0].(types.Coins) + ret0, _ := ret[0].(types0.Coins) return ret0 } @@ -848,10 +884,10 @@ func (mr *MockBankKeeperMockRecorder) GetAllBalances(ctx, addr interface{}) *gom } // GetBalance mocks base method. -func (m *MockBankKeeper) GetBalance(ctx types.Context, addr types.AccAddress, denom string) types.Coin { +func (m *MockBankKeeper) GetBalance(ctx types0.Context, addr types0.AccAddress, denom string) types0.Coin { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBalance", ctx, addr, denom) - ret0, _ := ret[0].(types.Coin) + ret0, _ := ret[0].(types0.Coin) return ret0 } @@ -862,7 +898,7 @@ func (mr *MockBankKeeperMockRecorder) GetBalance(ctx, addr, denom interface{}) * } // SendCoinsFromModuleToModule mocks base method. -func (m *MockBankKeeper) SendCoinsFromModuleToModule(ctx types.Context, senderModule, recipientModule string, amt types.Coins) error { +func (m *MockBankKeeper) SendCoinsFromModuleToModule(ctx types0.Context, senderModule, recipientModule string, amt types0.Coins) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SendCoinsFromModuleToModule", ctx, senderModule, recipientModule, amt) ret0, _ := ret[0].(error) @@ -899,10 +935,10 @@ func (m *MockAccountKeeper) EXPECT() *MockAccountKeeperMockRecorder { } // GetModuleAccount mocks base method. -func (m *MockAccountKeeper) GetModuleAccount(ctx types.Context, name string) types0.ModuleAccountI { +func (m *MockAccountKeeper) GetModuleAccount(ctx types0.Context, name string) types1.ModuleAccountI { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetModuleAccount", ctx, name) - ret0, _ := ret[0].(types0.ModuleAccountI) + ret0, _ := ret[0].(types1.ModuleAccountI) return ret0 } @@ -935,18 +971,19 @@ func (m *MockIBCTransferKeeper) EXPECT() *MockIBCTransferKeeperMockRecorder { return m.recorder } -// SendTransfer mocks base method. -func (m *MockIBCTransferKeeper) SendTransfer(ctx types.Context, sourcePort, sourceChannel string, token types.Coin, sender types.AccAddress, receiver string, timeoutHeight types5.Height, timeoutTimestamp uint64) error { +// Transfer mocks base method. +func (m *MockIBCTransferKeeper) Transfer(arg0 context.Context, arg1 *types6.MsgTransfer) (*types6.MsgTransferResponse, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SendTransfer", ctx, sourcePort, sourceChannel, token, sender, receiver, timeoutHeight, timeoutTimestamp) - ret0, _ := ret[0].(error) - return ret0 + ret := m.ctrl.Call(m, "Transfer", arg0, arg1) + ret0, _ := ret[0].(*types6.MsgTransferResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 } -// SendTransfer indicates an expected call of SendTransfer. -func (mr *MockIBCTransferKeeperMockRecorder) SendTransfer(ctx, sourcePort, sourceChannel, token, sender, receiver, timeoutHeight, timeoutTimestamp interface{}) *gomock.Call { +// Transfer indicates an expected call of Transfer. +func (mr *MockIBCTransferKeeperMockRecorder) Transfer(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendTransfer", reflect.TypeOf((*MockIBCTransferKeeper)(nil).SendTransfer), ctx, sourcePort, sourceChannel, token, sender, receiver, timeoutHeight, timeoutTimestamp) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Transfer", reflect.TypeOf((*MockIBCTransferKeeper)(nil).Transfer), arg0, arg1) } // MockIBCCoreKeeper is a mock of IBCCoreKeeper interface. @@ -973,10 +1010,10 @@ func (m *MockIBCCoreKeeper) EXPECT() *MockIBCCoreKeeperMockRecorder { } // ChannelOpenInit mocks base method. -func (m *MockIBCCoreKeeper) ChannelOpenInit(goCtx context.Context, msg *types7.MsgChannelOpenInit) (*types7.MsgChannelOpenInitResponse, error) { +func (m *MockIBCCoreKeeper) ChannelOpenInit(goCtx context.Context, msg *types9.MsgChannelOpenInit) (*types9.MsgChannelOpenInitResponse, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ChannelOpenInit", goCtx, msg) - ret0, _ := ret[0].(*types7.MsgChannelOpenInitResponse) + ret0, _ := ret[0].(*types9.MsgChannelOpenInitResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1011,7 +1048,7 @@ func (m *MockScopedKeeper) EXPECT() *MockScopedKeeperMockRecorder { } // AuthenticateCapability mocks base method. -func (m *MockScopedKeeper) AuthenticateCapability(ctx types.Context, cap *types1.Capability, name string) bool { +func (m *MockScopedKeeper) AuthenticateCapability(ctx types0.Context, cap *types2.Capability, name string) bool { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AuthenticateCapability", ctx, cap, name) ret0, _ := ret[0].(bool) @@ -1025,7 +1062,7 @@ func (mr *MockScopedKeeperMockRecorder) AuthenticateCapability(ctx, cap, name in } // ClaimCapability mocks base method. -func (m *MockScopedKeeper) ClaimCapability(ctx types.Context, cap *types1.Capability, name string) error { +func (m *MockScopedKeeper) ClaimCapability(ctx types0.Context, cap *types2.Capability, name string) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ClaimCapability", ctx, cap, name) ret0, _ := ret[0].(error) @@ -1039,10 +1076,10 @@ func (mr *MockScopedKeeperMockRecorder) ClaimCapability(ctx, cap, name interface } // GetCapability mocks base method. -func (m *MockScopedKeeper) GetCapability(ctx types.Context, name string) (*types1.Capability, bool) { +func (m *MockScopedKeeper) GetCapability(ctx types0.Context, name string) (*types2.Capability, bool) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetCapability", ctx, name) - ret0, _ := ret[0].(*types1.Capability) + ret0, _ := ret[0].(*types2.Capability) ret1, _ := ret[1].(bool) return ret0, ret1 } diff --git a/testutil/keeper/unit_test_helpers.go b/testutil/keeper/unit_test_helpers.go index 77a597c726..d13ab17a63 100644 --- a/testutil/keeper/unit_test_helpers.go +++ b/testutil/keeper/unit_test_helpers.go @@ -6,9 +6,12 @@ import ( "testing" "time" + abci "github.com/cometbft/cometbft/abci/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - abci "github.com/tendermint/tendermint/abci/types" + tmdb "github.com/cometbft/cometbft-db" + "github.com/cometbft/cometbft/libs/log" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/store" @@ -23,15 +26,12 @@ import ( "github.com/cosmos/interchain-security/v2/x/ccv/types" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/libs/log" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - tmdb "github.com/tendermint/tm-db" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" ) // Parameters needed to instantiate an in-memory keeper @@ -50,8 +50,8 @@ func NewInMemKeeperParams(tb testing.TB) InMemKeeperParams { db := tmdb.NewMemDB() stateStore := store.NewCommitMultiStore(db) - stateStore.MountStoreWithDB(storeKey, sdk.StoreTypeIAVL, db) - stateStore.MountStoreWithDB(memStoreKey, sdk.StoreTypeMemory, nil) + stateStore.MountStoreWithDB(storeKey, storetypes.StoreTypeIAVL, db) + stateStore.MountStoreWithDB(memStoreKey, storetypes.StoreTypeMemory, nil) require.NoError(tb, stateStore.LoadLatestVersion()) registry := codectypes.NewInterfaceRegistry() @@ -195,7 +195,7 @@ func GetNewSlashPacketData() types.SlashPacketData { Power: int64(binary.BigEndian.Uint64(b1)), }, ValsetUpdateId: binary.BigEndian.Uint64(b2), - Infraction: stakingtypes.InfractionType(binary.BigEndian.Uint64(b2) % 3), + Infraction: stakingtypes.Infraction(binary.BigEndian.Uint64(b2) % 3), } } diff --git a/testutil/simibc/chain_util.go b/testutil/simibc/chain_util.go index 144fca7bf0..50015834e3 100644 --- a/testutil/simibc/chain_util.go +++ b/testutil/simibc/chain_util.go @@ -3,12 +3,12 @@ package simibc import ( "time" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" + abci "github.com/cometbft/cometbft/abci/types" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" ibctestingcore "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/core" ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" - abci "github.com/tendermint/tendermint/abci/types" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" ) // BeginBlock updates the current header and calls the app.BeginBlock method. diff --git a/testutil/simibc/ordered_outbox.go b/testutil/simibc/ordered_outbox.go index a408b0b9cc..3c969d2a32 100644 --- a/testutil/simibc/ordered_outbox.go +++ b/testutil/simibc/ordered_outbox.go @@ -1,6 +1,6 @@ package simibc -import channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" +import channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" // Ack represents a (sent) ack committed to block state type Ack struct { diff --git a/testutil/simibc/relay_util.go b/testutil/simibc/relay_util.go index 761b1b5512..48e127aa60 100644 --- a/testutil/simibc/relay_util.go +++ b/testutil/simibc/relay_util.go @@ -2,15 +2,15 @@ package simibc import ( errorsmod "cosmossdk.io/errors" + tmtypes "github.com/cometbft/cometbft/types" sdk "github.com/cosmos/cosmos-sdk/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - host "github.com/cosmos/ibc-go/v4/modules/core/24-host" - ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + host "github.com/cosmos/ibc-go/v7/modules/core/24-host" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" simapp "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/simapp" ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" "github.com/stretchr/testify/require" - tmtypes "github.com/tendermint/tendermint/types" ) // UpdateReceiverClient DELIVERs a header to the receiving endpoint diff --git a/testutil/simibc/relayed_path.go b/testutil/simibc/relayed_path.go index d13303009a..b5339b2923 100644 --- a/testutil/simibc/relayed_path.go +++ b/testutil/simibc/relayed_path.go @@ -4,7 +4,7 @@ import ( "testing" "time" - ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" ) diff --git a/third_party/gogoproto/gogo.proto b/third_party/gogoproto/gogo.proto deleted file mode 100644 index 49e78f99fe..0000000000 --- a/third_party/gogoproto/gogo.proto +++ /dev/null @@ -1,145 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -syntax = "proto2"; -package gogoproto; - -import "google/protobuf/descriptor.proto"; - -option java_package = "com.google.protobuf"; -option java_outer_classname = "GoGoProtos"; -option go_package = "github.com/gogo/protobuf/gogoproto"; - -extend google.protobuf.EnumOptions { - optional bool goproto_enum_prefix = 62001; - optional bool goproto_enum_stringer = 62021; - optional bool enum_stringer = 62022; - optional string enum_customname = 62023; - optional bool enumdecl = 62024; -} - -extend google.protobuf.EnumValueOptions { - optional string enumvalue_customname = 66001; -} - -extend google.protobuf.FileOptions { - optional bool goproto_getters_all = 63001; - optional bool goproto_enum_prefix_all = 63002; - optional bool goproto_stringer_all = 63003; - optional bool verbose_equal_all = 63004; - optional bool face_all = 63005; - optional bool gostring_all = 63006; - optional bool populate_all = 63007; - optional bool stringer_all = 63008; - optional bool onlyone_all = 63009; - - optional bool equal_all = 63013; - optional bool description_all = 63014; - optional bool testgen_all = 63015; - optional bool benchgen_all = 63016; - optional bool marshaler_all = 63017; - optional bool unmarshaler_all = 63018; - optional bool stable_marshaler_all = 63019; - - optional bool sizer_all = 63020; - - optional bool goproto_enum_stringer_all = 63021; - optional bool enum_stringer_all = 63022; - - optional bool unsafe_marshaler_all = 63023; - optional bool unsafe_unmarshaler_all = 63024; - - optional bool goproto_extensions_map_all = 63025; - optional bool goproto_unrecognized_all = 63026; - optional bool gogoproto_import = 63027; - optional bool protosizer_all = 63028; - optional bool compare_all = 63029; - optional bool typedecl_all = 63030; - optional bool enumdecl_all = 63031; - - optional bool goproto_registration = 63032; - optional bool messagename_all = 63033; - - optional bool goproto_sizecache_all = 63034; - optional bool goproto_unkeyed_all = 63035; -} - -extend google.protobuf.MessageOptions { - optional bool goproto_getters = 64001; - optional bool goproto_stringer = 64003; - optional bool verbose_equal = 64004; - optional bool face = 64005; - optional bool gostring = 64006; - optional bool populate = 64007; - optional bool stringer = 67008; - optional bool onlyone = 64009; - - optional bool equal = 64013; - optional bool description = 64014; - optional bool testgen = 64015; - optional bool benchgen = 64016; - optional bool marshaler = 64017; - optional bool unmarshaler = 64018; - optional bool stable_marshaler = 64019; - - optional bool sizer = 64020; - - optional bool unsafe_marshaler = 64023; - optional bool unsafe_unmarshaler = 64024; - - optional bool goproto_extensions_map = 64025; - optional bool goproto_unrecognized = 64026; - - optional bool protosizer = 64028; - optional bool compare = 64029; - - optional bool typedecl = 64030; - - optional bool messagename = 64033; - - optional bool goproto_sizecache = 64034; - optional bool goproto_unkeyed = 64035; -} - -extend google.protobuf.FieldOptions { - optional bool nullable = 65001; - optional bool embed = 65002; - optional string customtype = 65003; - optional string customname = 65004; - optional string jsontag = 65005; - optional string moretags = 65006; - optional string casttype = 65007; - optional string castkey = 65008; - optional string castvalue = 65009; - - optional bool stdtime = 65010; - optional bool stdduration = 65011; - optional bool wktpointer = 65012; - - optional string castrepeated = 65013; -} diff --git a/third_party/google/api/annotations.proto b/third_party/google/api/annotations.proto deleted file mode 100644 index 85c361b47f..0000000000 --- a/third_party/google/api/annotations.proto +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2015, Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -package google.api; - -import "google/api/http.proto"; -import "google/protobuf/descriptor.proto"; - -option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; -option java_multiple_files = true; -option java_outer_classname = "AnnotationsProto"; -option java_package = "com.google.api"; -option objc_class_prefix = "GAPI"; - -extend google.protobuf.MethodOptions { - // See `HttpRule`. - HttpRule http = 72295728; -} diff --git a/third_party/google/api/http.proto b/third_party/google/api/http.proto deleted file mode 100644 index 2bd3a19bfa..0000000000 --- a/third_party/google/api/http.proto +++ /dev/null @@ -1,318 +0,0 @@ -// Copyright 2018 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -package google.api; - -option cc_enable_arenas = true; -option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; -option java_multiple_files = true; -option java_outer_classname = "HttpProto"; -option java_package = "com.google.api"; -option objc_class_prefix = "GAPI"; - - -// Defines the HTTP configuration for an API service. It contains a list of -// [HttpRule][google.api.HttpRule], each specifying the mapping of an RPC method -// to one or more HTTP REST API methods. -message Http { - // A list of HTTP configuration rules that apply to individual API methods. - // - // **NOTE:** All service configuration rules follow "last one wins" order. - repeated HttpRule rules = 1; - - // When set to true, URL path parmeters will be fully URI-decoded except in - // cases of single segment matches in reserved expansion, where "%2F" will be - // left encoded. - // - // The default behavior is to not decode RFC 6570 reserved characters in multi - // segment matches. - bool fully_decode_reserved_expansion = 2; -} - -// `HttpRule` defines the mapping of an RPC method to one or more HTTP -// REST API methods. The mapping specifies how different portions of the RPC -// request message are mapped to URL path, URL query parameters, and -// HTTP request body. The mapping is typically specified as an -// `google.api.http` annotation on the RPC method, -// see "google/api/annotations.proto" for details. -// -// The mapping consists of a field specifying the path template and -// method kind. The path template can refer to fields in the request -// message, as in the example below which describes a REST GET -// operation on a resource collection of messages: -// -// -// service Messaging { -// rpc GetMessage(GetMessageRequest) returns (Message) { -// option (google.api.http).get = "/v1/messages/{message_id}/{sub.subfield}"; -// } -// } -// message GetMessageRequest { -// message SubMessage { -// string subfield = 1; -// } -// string message_id = 1; // mapped to the URL -// SubMessage sub = 2; // `sub.subfield` is url-mapped -// } -// message Message { -// string text = 1; // content of the resource -// } -// -// The same http annotation can alternatively be expressed inside the -// `GRPC API Configuration` YAML file. -// -// http: -// rules: -// - selector: .Messaging.GetMessage -// get: /v1/messages/{message_id}/{sub.subfield} -// -// This definition enables an automatic, bidrectional mapping of HTTP -// JSON to RPC. Example: -// -// HTTP | RPC -// -----|----- -// `GET /v1/messages/123456/foo` | `GetMessage(message_id: "123456" sub: SubMessage(subfield: "foo"))` -// -// In general, not only fields but also field paths can be referenced -// from a path pattern. Fields mapped to the path pattern cannot be -// repeated and must have a primitive (non-message) type. -// -// Any fields in the request message which are not bound by the path -// pattern automatically become (optional) HTTP query -// parameters. Assume the following definition of the request message: -// -// -// service Messaging { -// rpc GetMessage(GetMessageRequest) returns (Message) { -// option (google.api.http).get = "/v1/messages/{message_id}"; -// } -// } -// message GetMessageRequest { -// message SubMessage { -// string subfield = 1; -// } -// string message_id = 1; // mapped to the URL -// int64 revision = 2; // becomes a parameter -// SubMessage sub = 3; // `sub.subfield` becomes a parameter -// } -// -// -// This enables a HTTP JSON to RPC mapping as below: -// -// HTTP | RPC -// -----|----- -// `GET /v1/messages/123456?revision=2&sub.subfield=foo` | `GetMessage(message_id: "123456" revision: 2 sub: SubMessage(subfield: "foo"))` -// -// Note that fields which are mapped to HTTP parameters must have a -// primitive type or a repeated primitive type. Message types are not -// allowed. In the case of a repeated type, the parameter can be -// repeated in the URL, as in `...?param=A¶m=B`. -// -// For HTTP method kinds which allow a request body, the `body` field -// specifies the mapping. Consider a REST update method on the -// message resource collection: -// -// -// service Messaging { -// rpc UpdateMessage(UpdateMessageRequest) returns (Message) { -// option (google.api.http) = { -// put: "/v1/messages/{message_id}" -// body: "message" -// }; -// } -// } -// message UpdateMessageRequest { -// string message_id = 1; // mapped to the URL -// Message message = 2; // mapped to the body -// } -// -// -// The following HTTP JSON to RPC mapping is enabled, where the -// representation of the JSON in the request body is determined by -// protos JSON encoding: -// -// HTTP | RPC -// -----|----- -// `PUT /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: "123456" message { text: "Hi!" })` -// -// The special name `*` can be used in the body mapping to define that -// every field not bound by the path template should be mapped to the -// request body. This enables the following alternative definition of -// the update method: -// -// service Messaging { -// rpc UpdateMessage(Message) returns (Message) { -// option (google.api.http) = { -// put: "/v1/messages/{message_id}" -// body: "*" -// }; -// } -// } -// message Message { -// string message_id = 1; -// string text = 2; -// } -// -// -// The following HTTP JSON to RPC mapping is enabled: -// -// HTTP | RPC -// -----|----- -// `PUT /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: "123456" text: "Hi!")` -// -// Note that when using `*` in the body mapping, it is not possible to -// have HTTP parameters, as all fields not bound by the path end in -// the body. This makes this option more rarely used in practice of -// defining REST APIs. The common usage of `*` is in custom methods -// which don't use the URL at all for transferring data. -// -// It is possible to define multiple HTTP methods for one RPC by using -// the `additional_bindings` option. Example: -// -// service Messaging { -// rpc GetMessage(GetMessageRequest) returns (Message) { -// option (google.api.http) = { -// get: "/v1/messages/{message_id}" -// additional_bindings { -// get: "/v1/users/{user_id}/messages/{message_id}" -// } -// }; -// } -// } -// message GetMessageRequest { -// string message_id = 1; -// string user_id = 2; -// } -// -// -// This enables the following two alternative HTTP JSON to RPC -// mappings: -// -// HTTP | RPC -// -----|----- -// `GET /v1/messages/123456` | `GetMessage(message_id: "123456")` -// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: "me" message_id: "123456")` -// -// # Rules for HTTP mapping -// -// The rules for mapping HTTP path, query parameters, and body fields -// to the request message are as follows: -// -// 1. The `body` field specifies either `*` or a field path, or is -// omitted. If omitted, it indicates there is no HTTP request body. -// 2. Leaf fields (recursive expansion of nested messages in the -// request) can be classified into three types: -// (a) Matched in the URL template. -// (b) Covered by body (if body is `*`, everything except (a) fields; -// else everything under the body field) -// (c) All other fields. -// 3. URL query parameters found in the HTTP request are mapped to (c) fields. -// 4. Any body sent with an HTTP request can contain only (b) fields. -// -// The syntax of the path template is as follows: -// -// Template = "/" Segments [ Verb ] ; -// Segments = Segment { "/" Segment } ; -// Segment = "*" | "**" | LITERAL | Variable ; -// Variable = "{" FieldPath [ "=" Segments ] "}" ; -// FieldPath = IDENT { "." IDENT } ; -// Verb = ":" LITERAL ; -// -// The syntax `*` matches a single path segment. The syntax `**` matches zero -// or more path segments, which must be the last part of the path except the -// `Verb`. The syntax `LITERAL` matches literal text in the path. -// -// The syntax `Variable` matches part of the URL path as specified by its -// template. A variable template must not contain other variables. If a variable -// matches a single path segment, its template may be omitted, e.g. `{var}` -// is equivalent to `{var=*}`. -// -// If a variable contains exactly one path segment, such as `"{var}"` or -// `"{var=*}"`, when such a variable is expanded into a URL path, all characters -// except `[-_.~0-9a-zA-Z]` are percent-encoded. Such variables show up in the -// Discovery Document as `{var}`. -// -// If a variable contains one or more path segments, such as `"{var=foo/*}"` -// or `"{var=**}"`, when such a variable is expanded into a URL path, all -// characters except `[-_.~/0-9a-zA-Z]` are percent-encoded. Such variables -// show up in the Discovery Document as `{+var}`. -// -// NOTE: While the single segment variable matches the semantics of -// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2 -// Simple String Expansion, the multi segment variable **does not** match -// RFC 6570 Reserved Expansion. The reason is that the Reserved Expansion -// does not expand special characters like `?` and `#`, which would lead -// to invalid URLs. -// -// NOTE: the field paths in variables and in the `body` must not refer to -// repeated fields or map fields. -message HttpRule { - // Selects methods to which this rule applies. - // - // Refer to [selector][google.api.DocumentationRule.selector] for syntax details. - string selector = 1; - - // Determines the URL pattern is matched by this rules. This pattern can be - // used with any of the {get|put|post|delete|patch} methods. A custom method - // can be defined using the 'custom' field. - oneof pattern { - // Used for listing and getting information about resources. - string get = 2; - - // Used for updating a resource. - string put = 3; - - // Used for creating a resource. - string post = 4; - - // Used for deleting a resource. - string delete = 5; - - // Used for updating a resource. - string patch = 6; - - // The custom pattern is used for specifying an HTTP method that is not - // included in the `pattern` field, such as HEAD, or "*" to leave the - // HTTP method unspecified for this rule. The wild-card rule is useful - // for services that provide content to Web (HTML) clients. - CustomHttpPattern custom = 8; - } - - // The name of the request field whose value is mapped to the HTTP body, or - // `*` for mapping all fields not captured by the path pattern to the HTTP - // body. NOTE: the referred field must not be a repeated field and must be - // present at the top-level of request message type. - string body = 7; - - // Optional. The name of the response field whose value is mapped to the HTTP - // body of response. Other response fields are ignored. When - // not set, the response message will be used as HTTP body of response. - string response_body = 12; - - // Additional HTTP bindings for the selector. Nested bindings must - // not contain an `additional_bindings` field themselves (that is, - // the nesting may only be one level deep). - repeated HttpRule additional_bindings = 11; -} - -// A custom pattern is used for defining custom HTTP verb. -message CustomHttpPattern { - // The name of this custom HTTP verb. - string kind = 1; - - // The path matched by this custom verb. - string path = 2; -} diff --git a/third_party/google/api/httpbody.proto b/third_party/google/api/httpbody.proto deleted file mode 100644 index 4428515c12..0000000000 --- a/third_party/google/api/httpbody.proto +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2018 Google LLC. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -syntax = "proto3"; - -package google.api; - -import "google/protobuf/any.proto"; - -option cc_enable_arenas = true; -option go_package = "google.golang.org/genproto/googleapis/api/httpbody;httpbody"; -option java_multiple_files = true; -option java_outer_classname = "HttpBodyProto"; -option java_package = "com.google.api"; -option objc_class_prefix = "GAPI"; - -// Message that represents an arbitrary HTTP body. It should only be used for -// payload formats that can't be represented as JSON, such as raw binary or -// an HTML page. -// -// -// This message can be used both in streaming and non-streaming API methods in -// the request as well as the response. -// -// It can be used as a top-level request field, which is convenient if one -// wants to extract parameters from either the URL or HTTP template into the -// request fields and also want access to the raw HTTP body. -// -// Example: -// -// message GetResourceRequest { -// // A unique request id. -// string request_id = 1; -// -// // The raw HTTP body is bound to this field. -// google.api.HttpBody http_body = 2; -// } -// -// service ResourceService { -// rpc GetResource(GetResourceRequest) returns (google.api.HttpBody); -// rpc UpdateResource(google.api.HttpBody) returns -// (google.protobuf.Empty); -// } -// -// Example with streaming methods: -// -// service CaldavService { -// rpc GetCalendar(stream google.api.HttpBody) -// returns (stream google.api.HttpBody); -// rpc UpdateCalendar(stream google.api.HttpBody) -// returns (stream google.api.HttpBody); -// } -// -// Use of this type only changes how the request and response bodies are -// handled, all other features will continue to work unchanged. -message HttpBody { - // The HTTP Content-Type header value specifying the content type of the body. - string content_type = 1; - - // The HTTP request/response body as raw binary. - bytes data = 2; - - // Application specific response metadata. Must be set in the first response - // for streaming APIs. - repeated google.protobuf.Any extensions = 3; -} \ No newline at end of file diff --git a/third_party/google/protobuf/any.proto b/third_party/google/protobuf/any.proto deleted file mode 100644 index 58b511583a..0000000000 --- a/third_party/google/protobuf/any.proto +++ /dev/null @@ -1,164 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -syntax = "proto3"; - -package google.protobuf; - -import "gogoproto/gogo.proto"; - -option csharp_namespace = "Google.Protobuf.WellKnownTypes"; -option go_package = "types"; -option java_package = "com.google.protobuf"; -option java_outer_classname = "AnyProto"; -option java_multiple_files = true; -option objc_class_prefix = "GPB"; - -// `Any` contains an arbitrary serialized protocol buffer message along with a -// URL that describes the type of the serialized message. -// -// Protobuf library provides support to pack/unpack Any values in the form -// of utility functions or additional generated methods of the Any type. -// -// Example 1: Pack and unpack a message in C++. -// -// Foo foo = ...; -// Any any; -// any.PackFrom(foo); -// ... -// if (any.UnpackTo(&foo)) { -// ... -// } -// -// Example 2: Pack and unpack a message in Java. -// -// Foo foo = ...; -// Any any = Any.pack(foo); -// ... -// if (any.is(Foo.class)) { -// foo = any.unpack(Foo.class); -// } -// -// Example 3: Pack and unpack a message in Python. -// -// foo = Foo(...) -// any = Any() -// any.Pack(foo) -// ... -// if any.Is(Foo.DESCRIPTOR): -// any.Unpack(foo) -// ... -// -// Example 4: Pack and unpack a message in Go -// -// foo := &pb.Foo{...} -// any, err := ptypes.MarshalAny(foo) -// ... -// foo := &pb.Foo{} -// if err := ptypes.UnmarshalAny(any, foo); err != nil { -// ... -// } -// -// The pack methods provided by protobuf library will by default use -// 'type.googleapis.com/full.type.name' as the type URL and the unpack -// methods only use the fully qualified type name after the last '/' -// in the type URL, for example "foo.bar.com/x/y.z" will yield type -// name "y.z". -// -// -// JSON -// ==== -// The JSON representation of an `Any` value uses the regular -// representation of the deserialized, embedded message, with an -// additional field `@type` which contains the type URL. Example: -// -// package google.profile; -// message Person { -// string first_name = 1; -// string last_name = 2; -// } -// -// { -// "@type": "type.googleapis.com/google.profile.Person", -// "firstName": , -// "lastName": -// } -// -// If the embedded message type is well-known and has a custom JSON -// representation, that representation will be embedded adding a field -// `value` which holds the custom JSON in addition to the `@type` -// field. Example (for message [google.protobuf.Duration][]): -// -// { -// "@type": "type.googleapis.com/google.protobuf.Duration", -// "value": "1.212s" -// } -// -message Any { - // A URL/resource name that uniquely identifies the type of the serialized - // protocol buffer message. This string must contain at least - // one "/" character. The last segment of the URL's path must represent - // the fully qualified name of the type (as in - // `path/google.protobuf.Duration`). The name should be in a canonical form - // (e.g., leading "." is not accepted). - // - // In practice, teams usually precompile into the binary all types that they - // expect it to use in the context of Any. However, for URLs which use the - // scheme `http`, `https`, or no scheme, one can optionally set up a type - // server that maps type URLs to message definitions as follows: - // - // * If no scheme is provided, `https` is assumed. - // * An HTTP GET on the URL must yield a [google.protobuf.Type][] - // value in binary format, or produce an error. - // * Applications are allowed to cache lookup results based on the - // URL, or have them precompiled into a binary to avoid any - // lookup. Therefore, binary compatibility needs to be preserved - // on changes to types. (Use versioned type names to manage - // breaking changes.) - // - // Note: this functionality is not currently available in the official - // protobuf release, and it is not used for type URLs beginning with - // type.googleapis.com. - // - // Schemes other than `http`, `https` (or the empty scheme) might be - // used with implementation specific semantics. - // - string type_url = 1; - - // Must be a valid serialized protocol buffer of the above specified type. - bytes value = 2; - - option (gogoproto.typedecl) = false; - option (gogoproto.goproto_stringer) = false; - option (gogoproto.gostring) = false; - option (gogoproto.stringer) = false; -} - -option (gogoproto.goproto_registration) = false; diff --git a/third_party/proto/buf.lock b/third_party/proto/buf.lock deleted file mode 100644 index dff37ae0ae..0000000000 --- a/third_party/proto/buf.lock +++ /dev/null @@ -1,10 +0,0 @@ -# Generated by buf. DO NOT EDIT. -version: v1 -deps: - - remote: buf.build - owner: cosmos - repository: gogo-proto - branch: main - commit: bee5511075b7499da6178d9e4aaa628b - digest: b1-rrBIustouD-S80cVoZ_rM0qJsmei9AgbXy9GPQu6vxg= - create_time: 2021-12-02T20:01:17.069307Z diff --git a/third_party/proto/buf.yaml b/third_party/proto/buf.yaml deleted file mode 100644 index 2aad5fd692..0000000000 --- a/third_party/proto/buf.yaml +++ /dev/null @@ -1,37 +0,0 @@ -# Generated by "buf config migrate-v1beta1". Edit as necessary, and -# remove this comment when you're finished. -# -# This module represents the "third_party/proto" root found in -# the previous configuration. -version: v1 -deps: - - buf.build/cosmos/gogo-proto -build: - excludes: - - google/protobuf -breaking: - use: - - FILE - ignore: - - confio - - cosmos_proto - - gogoproto - - google - - tendermint -lint: - use: - - DEFAULT - - COMMENTS - - FILE_LOWER_SNAKE_CASE - except: - - UNARY_RPC - - COMMENT_FIELD - - SERVICE_SUFFIX - - PACKAGE_VERSION_SUFFIX - - RPC_REQUEST_STANDARD_NAME - ignore: - - confio - - cosmos_proto - - gogoproto - - google - - tendermint diff --git a/third_party/proto/confio/proofs.proto b/third_party/proto/confio/proofs.proto deleted file mode 100644 index a1397dff5f..0000000000 --- a/third_party/proto/confio/proofs.proto +++ /dev/null @@ -1,235 +0,0 @@ -syntax = "proto3"; - -package ics23; -option go_package = "github.com/confio/ics23/go"; - -enum HashOp { - // NO_HASH is the default if no data passed. Note this is an illegal argument some places. - NO_HASH = 0; - SHA256 = 1; - SHA512 = 2; - KECCAK = 3; - RIPEMD160 = 4; - BITCOIN = 5; // ripemd160(sha256(x)) - SHA512_256 = 6; -} - -/** -LengthOp defines how to process the key and value of the LeafOp -to include length information. After encoding the length with the given -algorithm, the length will be prepended to the key and value bytes. -(Each one with it's own encoded length) -*/ -enum LengthOp { - // NO_PREFIX don't include any length info - NO_PREFIX = 0; - // VAR_PROTO uses protobuf (and go-amino) varint encoding of the length - VAR_PROTO = 1; - // VAR_RLP uses rlp int encoding of the length - VAR_RLP = 2; - // FIXED32_BIG uses big-endian encoding of the length as a 32 bit integer - FIXED32_BIG = 3; - // FIXED32_LITTLE uses little-endian encoding of the length as a 32 bit integer - FIXED32_LITTLE = 4; - // FIXED64_BIG uses big-endian encoding of the length as a 64 bit integer - FIXED64_BIG = 5; - // FIXED64_LITTLE uses little-endian encoding of the length as a 64 bit integer - FIXED64_LITTLE = 6; - // REQUIRE_32_BYTES is like NONE, but will fail if the input is not exactly 32 bytes (sha256 output) - REQUIRE_32_BYTES = 7; - // REQUIRE_64_BYTES is like NONE, but will fail if the input is not exactly 64 bytes (sha512 output) - REQUIRE_64_BYTES = 8; -} - -/** -ExistenceProof takes a key and a value and a set of steps to perform on it. -The result of peforming all these steps will provide a "root hash", which can -be compared to the value in a header. - -Since it is computationally infeasible to produce a hash collission for any of the used -cryptographic hash functions, if someone can provide a series of operations to transform -a given key and value into a root hash that matches some trusted root, these key and values -must be in the referenced merkle tree. - -The only possible issue is maliablity in LeafOp, such as providing extra prefix data, -which should be controlled by a spec. Eg. with lengthOp as NONE, - prefix = FOO, key = BAR, value = CHOICE -and - prefix = F, key = OOBAR, value = CHOICE -would produce the same value. - -With LengthOp this is tricker but not impossible. Which is why the "leafPrefixEqual" field -in the ProofSpec is valuable to prevent this mutability. And why all trees should -length-prefix the data before hashing it. -*/ -message ExistenceProof { - bytes key = 1; - bytes value = 2; - LeafOp leaf = 3; - repeated InnerOp path = 4; -} - -/* -NonExistenceProof takes a proof of two neighbors, one left of the desired key, -one right of the desired key. If both proofs are valid AND they are neighbors, -then there is no valid proof for the given key. -*/ -message NonExistenceProof { - bytes key = 1; // TODO: remove this as unnecessary??? we prove a range - ExistenceProof left = 2; - ExistenceProof right = 3; -} - -/* -CommitmentProof is either an ExistenceProof or a NonExistenceProof, or a Batch of such messages -*/ -message CommitmentProof { - oneof proof { - ExistenceProof exist = 1; - NonExistenceProof nonexist = 2; - BatchProof batch = 3; - CompressedBatchProof compressed = 4; - } -} - -/** -LeafOp represents the raw key-value data we wish to prove, and -must be flexible to represent the internal transformation from -the original key-value pairs into the basis hash, for many existing -merkle trees. - -key and value are passed in. So that the signature of this operation is: - leafOp(key, value) -> output - -To process this, first prehash the keys and values if needed (ANY means no hash in this case): - hkey = prehashKey(key) - hvalue = prehashValue(value) - -Then combine the bytes, and hash it - output = hash(prefix || length(hkey) || hkey || length(hvalue) || hvalue) -*/ -message LeafOp { - HashOp hash = 1; - HashOp prehash_key = 2; - HashOp prehash_value = 3; - LengthOp length = 4; - // prefix is a fixed bytes that may optionally be included at the beginning to differentiate - // a leaf node from an inner node. - bytes prefix = 5; -} - -/** -InnerOp represents a merkle-proof step that is not a leaf. -It represents concatenating two children and hashing them to provide the next result. - -The result of the previous step is passed in, so the signature of this op is: - innerOp(child) -> output - -The result of applying InnerOp should be: - output = op.hash(op.prefix || child || op.suffix) - - where the || operator is concatenation of binary data, -and child is the result of hashing all the tree below this step. - -Any special data, like prepending child with the length, or prepending the entire operation with -some value to differentiate from leaf nodes, should be included in prefix and suffix. -If either of prefix or suffix is empty, we just treat it as an empty string -*/ -message InnerOp { - HashOp hash = 1; - bytes prefix = 2; - bytes suffix = 3; -} - - -/** -ProofSpec defines what the expected parameters are for a given proof type. -This can be stored in the client and used to validate any incoming proofs. - - verify(ProofSpec, Proof) -> Proof | Error - -As demonstrated in tests, if we don't fix the algorithm used to calculate the -LeafHash for a given tree, there are many possible key-value pairs that can -generate a given hash (by interpretting the preimage differently). -We need this for proper security, requires client knows a priori what -tree format server uses. But not in code, rather a configuration object. -*/ -message ProofSpec { - // any field in the ExistenceProof must be the same as in this spec. - // except Prefix, which is just the first bytes of prefix (spec can be longer) - LeafOp leaf_spec = 1; - InnerSpec inner_spec = 2; - // max_depth (if > 0) is the maximum number of InnerOps allowed (mainly for fixed-depth tries) - int32 max_depth = 3; - // min_depth (if > 0) is the minimum number of InnerOps allowed (mainly for fixed-depth tries) - int32 min_depth = 4; -} - -/* -InnerSpec contains all store-specific structure info to determine if two proofs from a -given store are neighbors. - -This enables: - - isLeftMost(spec: InnerSpec, op: InnerOp) - isRightMost(spec: InnerSpec, op: InnerOp) - isLeftNeighbor(spec: InnerSpec, left: InnerOp, right: InnerOp) -*/ -message InnerSpec { - // Child order is the ordering of the children node, must count from 0 - // iavl tree is [0, 1] (left then right) - // merk is [0, 2, 1] (left, right, here) - repeated int32 child_order = 1; - int32 child_size = 2; - int32 min_prefix_length = 3; - int32 max_prefix_length = 4; - // empty child is the prehash image that is used when one child is nil (eg. 20 bytes of 0) - bytes empty_child = 5; - // hash is the algorithm that must be used for each InnerOp - HashOp hash = 6; -} - -/* -BatchProof is a group of multiple proof types than can be compressed -*/ -message BatchProof { - repeated BatchEntry entries = 1; -} - -// Use BatchEntry not CommitmentProof, to avoid recursion -message BatchEntry { - oneof proof { - ExistenceProof exist = 1; - NonExistenceProof nonexist = 2; - } -} - - -/****** all items here are compressed forms *******/ - -message CompressedBatchProof { - repeated CompressedBatchEntry entries = 1; - repeated InnerOp lookup_inners = 2; -} - -// Use BatchEntry not CommitmentProof, to avoid recursion -message CompressedBatchEntry { - oneof proof { - CompressedExistenceProof exist = 1; - CompressedNonExistenceProof nonexist = 2; - } -} - -message CompressedExistenceProof { - bytes key = 1; - bytes value = 2; - LeafOp leaf = 3; - // these are indexes into the lookup_inners table in CompressedBatchProof - repeated int32 path = 4; -} - -message CompressedNonExistenceProof { - bytes key = 1; // TODO: remove this as unnecessary??? we prove a range - CompressedExistenceProof left = 2; - CompressedExistenceProof right = 3; -} diff --git a/third_party/proto/cosmos/base/query/v1beta1/pagination.proto b/third_party/proto/cosmos/base/query/v1beta1/pagination.proto deleted file mode 100644 index cd5eb066d3..0000000000 --- a/third_party/proto/cosmos/base/query/v1beta1/pagination.proto +++ /dev/null @@ -1,55 +0,0 @@ -syntax = "proto3"; -package cosmos.base.query.v1beta1; - -option go_package = "github.com/cosmos/cosmos-sdk/types/query"; - -// PageRequest is to be embedded in gRPC request messages for efficient -// pagination. Ex: -// -// message SomeRequest { -// Foo some_parameter = 1; -// PageRequest pagination = 2; -// } -message PageRequest { - // key is a value returned in PageResponse.next_key to begin - // querying the next page most efficiently. Only one of offset or key - // should be set. - bytes key = 1; - - // offset is a numeric offset that can be used when key is unavailable. - // It is less efficient than using key. Only one of offset or key should - // be set. - uint64 offset = 2; - - // limit is the total number of results to be returned in the result page. - // If left empty it will default to a value to be set by each app. - uint64 limit = 3; - - // count_total is set to true to indicate that the result set should include - // a count of the total number of items available for pagination in UIs. - // count_total is only respected when offset is used. It is ignored when key - // is set. - bool count_total = 4; - - // reverse is set to true if results are to be returned in the descending order. - // - // Since: cosmos-sdk 0.43 - bool reverse = 5; -} - -// PageResponse is to be embedded in gRPC response messages where the -// corresponding request message has used PageRequest. -// -// message SomeResponse { -// repeated Bar results = 1; -// PageResponse page = 2; -// } -message PageResponse { - // next_key is the key to be passed to PageRequest.key to - // query the next page most efficiently - bytes next_key = 1; - - // total is total number of results available if PageRequest.count_total - // was set, its value is undefined otherwise - uint64 total = 2; -} diff --git a/third_party/proto/cosmos/base/v1beta1/coin.proto b/third_party/proto/cosmos/base/v1beta1/coin.proto deleted file mode 100644 index fab75284b7..0000000000 --- a/third_party/proto/cosmos/base/v1beta1/coin.proto +++ /dev/null @@ -1,40 +0,0 @@ -syntax = "proto3"; -package cosmos.base.v1beta1; - -import "gogoproto/gogo.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/types"; -option (gogoproto.goproto_stringer_all) = false; -option (gogoproto.stringer_all) = false; - -// Coin defines a token with a denomination and an amount. -// -// NOTE: The amount field is an Int which implements the custom method -// signatures required by gogoproto. -message Coin { - option (gogoproto.equal) = true; - - string denom = 1; - string amount = 2 [(gogoproto.customtype) = "Int", (gogoproto.nullable) = false]; -} - -// DecCoin defines a token with a denomination and a decimal amount. -// -// NOTE: The amount field is an Dec which implements the custom method -// signatures required by gogoproto. -message DecCoin { - option (gogoproto.equal) = true; - - string denom = 1; - string amount = 2 [(gogoproto.customtype) = "Dec", (gogoproto.nullable) = false]; -} - -// IntProto defines a Protobuf wrapper around an Int object. -message IntProto { - string int = 1 [(gogoproto.customtype) = "Int", (gogoproto.nullable) = false]; -} - -// DecProto defines a Protobuf wrapper around a Dec object. -message DecProto { - string dec = 1 [(gogoproto.customtype) = "Dec", (gogoproto.nullable) = false]; -} diff --git a/third_party/proto/cosmos/evidence/v1beta1/evidence.proto b/third_party/proto/cosmos/evidence/v1beta1/evidence.proto deleted file mode 100644 index 14612c314f..0000000000 --- a/third_party/proto/cosmos/evidence/v1beta1/evidence.proto +++ /dev/null @@ -1,21 +0,0 @@ -syntax = "proto3"; -package cosmos.evidence.v1beta1; - -option go_package = "github.com/cosmos/cosmos-sdk/x/evidence/types"; -option (gogoproto.equal_all) = true; - -import "gogoproto/gogo.proto"; -import "google/protobuf/timestamp.proto"; - -// Equivocation implements the Evidence interface and defines evidence of double -// signing misbehavior. -message Equivocation { - option (gogoproto.goproto_stringer) = false; - option (gogoproto.goproto_getters) = false; - option (gogoproto.equal) = false; - - int64 height = 1; - google.protobuf.Timestamp time = 2 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; - int64 power = 3; - string consensus_address = 4 [(gogoproto.moretags) = "yaml:\"consensus_address\""]; -} \ No newline at end of file diff --git a/third_party/proto/cosmos/staking/v1beta1/staking.proto b/third_party/proto/cosmos/staking/v1beta1/staking.proto deleted file mode 100644 index 27581a12cf..0000000000 --- a/third_party/proto/cosmos/staking/v1beta1/staking.proto +++ /dev/null @@ -1,370 +0,0 @@ -syntax = "proto3"; -package cosmos.staking.v1beta1; - -import "gogoproto/gogo.proto"; -import "google/protobuf/any.proto"; -import "google/protobuf/duration.proto"; -import "google/protobuf/timestamp.proto"; - -import "cosmos_proto/cosmos.proto"; -import "cosmos/base/v1beta1/coin.proto"; -import "tendermint/types/types.proto"; -import "tendermint/abci/types.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/staking/types"; - -// HistoricalInfo contains header and validator information for a given block. -// It is stored as part of staking module's state, which persists the `n` most -// recent HistoricalInfo -// (`n` is set by the staking module's `historical_entries` parameter). -message HistoricalInfo { - tendermint.types.Header header = 1 [(gogoproto.nullable) = false]; - repeated Validator valset = 2 [(gogoproto.nullable) = false]; -} - -// CommissionRates defines the initial commission rates to be used for creating -// a validator. -message CommissionRates { - option (gogoproto.equal) = true; - option (gogoproto.goproto_stringer) = false; - - // rate is the commission rate charged to delegators, as a fraction. - string rate = 1 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false]; - // max_rate defines the maximum commission rate which validator can ever charge, as a fraction. - string max_rate = 2 [ - (gogoproto.moretags) = "yaml:\"max_rate\"", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - // max_change_rate defines the maximum daily increase of the validator commission, as a fraction. - string max_change_rate = 3 [ - (gogoproto.moretags) = "yaml:\"max_change_rate\"", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; -} - -// Commission defines commission parameters for a given validator. -message Commission { - option (gogoproto.equal) = true; - option (gogoproto.goproto_stringer) = false; - - // commission_rates defines the initial commission rates to be used for creating a validator. - CommissionRates commission_rates = 1 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - // update_time is the last time the commission rate was changed. - google.protobuf.Timestamp update_time = 2 - [(gogoproto.nullable) = false, (gogoproto.stdtime) = true, (gogoproto.moretags) = "yaml:\"update_time\""]; -} - -// Description defines a validator description. -message Description { - option (gogoproto.equal) = true; - option (gogoproto.goproto_stringer) = false; - - // moniker defines a human-readable name for the validator. - string moniker = 1; - // identity defines an optional identity signature (ex. UPort or Keybase). - string identity = 2; - // website defines an optional website link. - string website = 3; - // security_contact defines an optional email for security contact. - string security_contact = 4 [(gogoproto.moretags) = "yaml:\"security_contact\""]; - // details define other optional details. - string details = 5; -} - -// Validator defines a validator, together with the total amount of the -// Validator's bond shares and their exchange rate to coins. Slashing results in -// a decrease in the exchange rate, allowing correct calculation of future -// undelegations without iterating over delegators. When coins are delegated to -// this validator, the validator is credited with a delegation whose number of -// bond shares is based on the amount of coins delegated divided by the current -// exchange rate. Voting power can be calculated as total bonded shares -// multiplied by exchange rate. -message Validator { - option (gogoproto.equal) = false; - option (gogoproto.goproto_stringer) = false; - option (gogoproto.goproto_getters) = false; - - // operator_address defines the address of the validator's operator; bech encoded in JSON. - string operator_address = 1 [(gogoproto.moretags) = "yaml:\"operator_address\""]; - // consensus_pubkey is the consensus public key of the validator, as a Protobuf Any. - google.protobuf.Any consensus_pubkey = 2 - [(cosmos_proto.accepts_interface) = "cosmos.crypto.PubKey", (gogoproto.moretags) = "yaml:\"consensus_pubkey\""]; - // jailed defined whether the validator has been jailed from bonded status or not. - bool jailed = 3; - // status is the validator status (bonded/unbonding/unbonded). - BondStatus status = 4; - // tokens define the delegated tokens (incl. self-delegation). - string tokens = 5 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = false]; - // delegator_shares defines total shares issued to a validator's delegators. - string delegator_shares = 6 [ - (gogoproto.moretags) = "yaml:\"delegator_shares\"", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - // description defines the description terms for the validator. - Description description = 7 [(gogoproto.nullable) = false]; - // unbonding_height defines, if unbonding, the height at which this validator has begun unbonding. - int64 unbonding_height = 8 [(gogoproto.moretags) = "yaml:\"unbonding_height\""]; - // unbonding_time defines, if unbonding, the min time for the validator to complete unbonding. - google.protobuf.Timestamp unbonding_time = 9 - [(gogoproto.nullable) = false, (gogoproto.stdtime) = true, (gogoproto.moretags) = "yaml:\"unbonding_time\""]; - // commission defines the commission parameters. - Commission commission = 10 [(gogoproto.nullable) = false]; - // min_self_delegation is the validator's self declared minimum self delegation. - string min_self_delegation = 11 [ - (gogoproto.moretags) = "yaml:\"min_self_delegation\"", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.nullable) = false - ]; - - // strictly positive if this validator's unbonding has been stopped by external modules - int64 unbonding_on_hold_ref_count = 12; - - // list of unbonding ids, each uniquely identifing an unbonding of this validator - repeated uint64 unbonding_ids = 13; -} - -// BondStatus is the status of a validator. -enum BondStatus { - option (gogoproto.goproto_enum_prefix) = false; - - // UNSPECIFIED defines an invalid validator status. - BOND_STATUS_UNSPECIFIED = 0 [(gogoproto.enumvalue_customname) = "Unspecified"]; - // UNBONDED defines a validator that is not bonded. - BOND_STATUS_UNBONDED = 1 [(gogoproto.enumvalue_customname) = "Unbonded"]; - // UNBONDING defines a validator that is unbonding. - BOND_STATUS_UNBONDING = 2 [(gogoproto.enumvalue_customname) = "Unbonding"]; - // BONDED defines a validator that is bonded. - BOND_STATUS_BONDED = 3 [(gogoproto.enumvalue_customname) = "Bonded"]; -} - -// ValAddresses defines a repeated set of validator addresses. -message ValAddresses { - option (gogoproto.goproto_stringer) = false; - option (gogoproto.stringer) = true; - - repeated string addresses = 1; -} - -// DVPair is struct that just has a delegator-validator pair with no other data. -// It is intended to be used as a marshalable pointer. For example, a DVPair can -// be used to construct the key to getting an UnbondingDelegation from state. -message DVPair { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - - string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; - string validator_address = 2 [(gogoproto.moretags) = "yaml:\"validator_address\""]; -} - -// DVPairs defines an array of DVPair objects. -message DVPairs { - repeated DVPair pairs = 1 [(gogoproto.nullable) = false]; -} - -// DVVTriplet is struct that just has a delegator-validator-validator triplet -// with no other data. It is intended to be used as a marshalable pointer. For -// example, a DVVTriplet can be used to construct the key to getting a -// Redelegation from state. -message DVVTriplet { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - - string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; - string validator_src_address = 2 [(gogoproto.moretags) = "yaml:\"validator_src_address\""]; - string validator_dst_address = 3 [(gogoproto.moretags) = "yaml:\"validator_dst_address\""]; -} - -// DVVTriplets defines an array of DVVTriplet objects. -message DVVTriplets { - repeated DVVTriplet triplets = 1 [(gogoproto.nullable) = false]; -} - -// Delegation represents the bond with tokens held by an account. It is -// owned by one delegator, and is associated with the voting power of one -// validator. -message Delegation { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - - // delegator_address is the bech32-encoded address of the delegator. - string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; - // validator_address is the bech32-encoded address of the validator. - string validator_address = 2 [(gogoproto.moretags) = "yaml:\"validator_address\""]; - // shares define the delegation shares received. - string shares = 3 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false]; -} - -// UnbondingDelegation stores all of a single delegator's unbonding bonds -// for a single validator in an time-ordered list. -message UnbondingDelegation { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - - // delegator_address is the bech32-encoded address of the delegator. - string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; - // validator_address is the bech32-encoded address of the validator. - string validator_address = 2 [(gogoproto.moretags) = "yaml:\"validator_address\""]; - // entries are the unbonding delegation entries. - repeated UnbondingDelegationEntry entries = 3 [(gogoproto.nullable) = false]; // unbonding delegation entries -} - -// UnbondingDelegationEntry defines an unbonding object with relevant metadata. -message UnbondingDelegationEntry { - option (gogoproto.equal) = true; - option (gogoproto.goproto_stringer) = false; - - // creation_height is the height which the unbonding took place. - int64 creation_height = 1 [(gogoproto.moretags) = "yaml:\"creation_height\""]; - // completion_time is the unix time for unbonding completion. - google.protobuf.Timestamp completion_time = 2 - [(gogoproto.nullable) = false, (gogoproto.stdtime) = true, (gogoproto.moretags) = "yaml:\"completion_time\""]; - // initial_balance defines the tokens initially scheduled to receive at completion. - string initial_balance = 3 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.nullable) = false, - (gogoproto.moretags) = "yaml:\"initial_balance\"" - ]; - // balance defines the tokens to receive at completion. - string balance = 4 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = false]; - - // Incrementing id that uniquely identifies this entry - uint64 unbonding_id = 5; - - // Strictly positive if this entry's unbonding has been stopped by external modules - int64 unbonding_on_hold_ref_count = 6; -} - -// RedelegationEntry defines a redelegation object with relevant metadata. -message RedelegationEntry { - option (gogoproto.equal) = true; - option (gogoproto.goproto_stringer) = false; - - // creation_height defines the height which the redelegation took place. - int64 creation_height = 1 [(gogoproto.moretags) = "yaml:\"creation_height\""]; - // completion_time defines the unix time for redelegation completion. - google.protobuf.Timestamp completion_time = 2 - [(gogoproto.nullable) = false, (gogoproto.stdtime) = true, (gogoproto.moretags) = "yaml:\"completion_time\""]; - // initial_balance defines the initial balance when redelegation started. - string initial_balance = 3 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.nullable) = false, - (gogoproto.moretags) = "yaml:\"initial_balance\"" - ]; - // shares_dst is the amount of destination-validator shares created by redelegation. - string shares_dst = 4 - [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false]; - - // Incrementing id that uniquely identifies this entry - uint64 unbonding_id = 5; - - // Strictly positive if this entry's unbonding has been stopped by external modules - int64 unbonding_on_hold_ref_count = 6; -} - -// Redelegation contains the list of a particular delegator's redelegating bonds -// from a particular source validator to a particular destination validator. -message Redelegation { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - - // delegator_address is the bech32-encoded address of the delegator. - string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; - // validator_src_address is the validator redelegation source operator address. - string validator_src_address = 2 [(gogoproto.moretags) = "yaml:\"validator_src_address\""]; - // validator_dst_address is the validator redelegation destination operator address. - string validator_dst_address = 3 [(gogoproto.moretags) = "yaml:\"validator_dst_address\""]; - // entries are the redelegation entries. - repeated RedelegationEntry entries = 4 [(gogoproto.nullable) = false]; // redelegation entries -} - -// Params defines the parameters for the staking module. -message Params { - option (gogoproto.equal) = true; - option (gogoproto.goproto_stringer) = false; - - // unbonding_time is the time duration of unbonding. - google.protobuf.Duration unbonding_time = 1 - [(gogoproto.nullable) = false, (gogoproto.stdduration) = true, (gogoproto.moretags) = "yaml:\"unbonding_time\""]; - // max_validators is the maximum number of validators. - uint32 max_validators = 2 [(gogoproto.moretags) = "yaml:\"max_validators\""]; - // max_entries is the max entries for either unbonding delegation or redelegation (per pair/trio). - uint32 max_entries = 3 [(gogoproto.moretags) = "yaml:\"max_entries\""]; - // historical_entries is the number of historical entries to persist. - uint32 historical_entries = 4 [(gogoproto.moretags) = "yaml:\"historical_entries\""]; - // bond_denom defines the bondable coin denomination. - string bond_denom = 5 [(gogoproto.moretags) = "yaml:\"bond_denom\""]; -} - -// DelegationResponse is equivalent to Delegation except that it contains a -// balance in addition to shares which is more suitable for client responses. -message DelegationResponse { - option (gogoproto.equal) = false; - option (gogoproto.goproto_stringer) = false; - - Delegation delegation = 1 [(gogoproto.nullable) = false]; - - cosmos.base.v1beta1.Coin balance = 2 [(gogoproto.nullable) = false]; -} - -// RedelegationEntryResponse is equivalent to a RedelegationEntry except that it -// contains a balance in addition to shares which is more suitable for client -// responses. -message RedelegationEntryResponse { - option (gogoproto.equal) = true; - - RedelegationEntry redelegation_entry = 1 [(gogoproto.nullable) = false]; - string balance = 4 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = false]; -} - -// RedelegationResponse is equivalent to a Redelegation except that its entries -// contain a balance in addition to shares which is more suitable for client -// responses. -message RedelegationResponse { - option (gogoproto.equal) = false; - - Redelegation redelegation = 1 [(gogoproto.nullable) = false]; - repeated RedelegationEntryResponse entries = 2 [(gogoproto.nullable) = false]; -} - -// Pool is used for tracking bonded and not-bonded token supply of the bond -// denomination. -message Pool { - option (gogoproto.description) = true; - option (gogoproto.equal) = true; - string not_bonded_tokens = 1 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.jsontag) = "not_bonded_tokens", - (gogoproto.nullable) = false - ]; - string bonded_tokens = 2 [ - (gogoproto.jsontag) = "bonded_tokens", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.nullable) = false, - (gogoproto.moretags) = "yaml:\"bonded_tokens\"" - ]; -} - -// InfractionType indicates the infraction type a validator commited. -enum InfractionType { - option (gogoproto.goproto_enum_prefix) = false; - - // UNSPECIFIED defines an empty infraction type. - INFRACTION_TYPE_UNSPECIFIED = 0 [(gogoproto.enumvalue_customname) = "InfractionEmpty"]; - // DOUBLE_SIGN defines a validator that double-signs a block. - INFRACTION_TYPE_DOUBLE_SIGN = 1 [(gogoproto.enumvalue_customname) = "DoubleSign"]; - // DOWNTIME defines a validator that missed signing too many blocks. - INFRACTION_TYPE_DOWNTIME = 2 [(gogoproto.enumvalue_customname) = "Downtime"]; -} - -// ValidatorUpdates defines an array of abci.ValidatorUpdate objects. -message ValidatorUpdates { - repeated tendermint.abci.ValidatorUpdate updates = 1 [(gogoproto.nullable) = false]; -} \ No newline at end of file diff --git a/third_party/proto/cosmos/upgrade/v1beta1/upgrade.proto b/third_party/proto/cosmos/upgrade/v1beta1/upgrade.proto deleted file mode 100644 index e888b393d6..0000000000 --- a/third_party/proto/cosmos/upgrade/v1beta1/upgrade.proto +++ /dev/null @@ -1,78 +0,0 @@ -syntax = "proto3"; -package cosmos.upgrade.v1beta1; - -import "google/protobuf/any.proto"; -import "gogoproto/gogo.proto"; -import "google/protobuf/timestamp.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/x/upgrade/types"; -option (gogoproto.goproto_getters_all) = false; - -// Plan specifies information about a planned upgrade and when it should occur. -message Plan { - option (gogoproto.equal) = true; - option (gogoproto.goproto_stringer) = false; - - // Sets the name for the upgrade. This name will be used by the upgraded - // version of the software to apply any special "on-upgrade" commands during - // the first BeginBlock method after the upgrade is applied. It is also used - // to detect whether a software version can handle a given upgrade. If no - // upgrade handler with this name has been set in the software, it will be - // assumed that the software is out-of-date when the upgrade Time or Height is - // reached and the software will exit. - string name = 1; - - // Deprecated: Time based upgrades have been deprecated. Time based upgrade logic - // has been removed from the SDK. - // If this field is not empty, an error will be thrown. - google.protobuf.Timestamp time = 2 [deprecated = true, (gogoproto.stdtime) = true, (gogoproto.nullable) = false]; - - // The height at which the upgrade must be performed. - // Only used if Time is not set. - int64 height = 3; - - // Any application specific upgrade info to be included on-chain - // such as a git commit that validators could automatically upgrade to - string info = 4; - - // Deprecated: UpgradedClientState field has been deprecated. IBC upgrade logic has been - // moved to the IBC module in the sub module 02-client. - // If this field is not empty, an error will be thrown. - google.protobuf.Any upgraded_client_state = 5 - [deprecated = true, (gogoproto.moretags) = "yaml:\"upgraded_client_state\""]; -} - -// SoftwareUpgradeProposal is a gov Content type for initiating a software -// upgrade. -message SoftwareUpgradeProposal { - option (gogoproto.equal) = true; - option (gogoproto.goproto_stringer) = false; - - string title = 1; - string description = 2; - Plan plan = 3 [(gogoproto.nullable) = false]; -} - -// CancelSoftwareUpgradeProposal is a gov Content type for cancelling a software -// upgrade. -message CancelSoftwareUpgradeProposal { - option (gogoproto.equal) = true; - option (gogoproto.goproto_stringer) = false; - - string title = 1; - string description = 2; -} - -// ModuleVersion specifies a module and its consensus version. -// -// Since: cosmos-sdk 0.43 -message ModuleVersion { - option (gogoproto.equal) = true; - option (gogoproto.goproto_stringer) = true; - - // name of the app module - string name = 1; - - // consensus version of the app module - uint64 version = 2; -} diff --git a/third_party/proto/cosmos_proto/cosmos.proto b/third_party/proto/cosmos_proto/cosmos.proto deleted file mode 100644 index 167b170757..0000000000 --- a/third_party/proto/cosmos_proto/cosmos.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; -package cosmos_proto; - -import "google/protobuf/descriptor.proto"; - -option go_package = "github.com/regen-network/cosmos-proto"; - -extend google.protobuf.MessageOptions { - string interface_type = 93001; - - string implements_interface = 93002; -} - -extend google.protobuf.FieldOptions { - string accepts_interface = 93001; -} diff --git a/third_party/proto/ibc/core/channel/v1/channel.proto b/third_party/proto/ibc/core/channel/v1/channel.proto deleted file mode 100644 index 87c4324d3c..0000000000 --- a/third_party/proto/ibc/core/channel/v1/channel.proto +++ /dev/null @@ -1,148 +0,0 @@ -syntax = "proto3"; - -package ibc.core.channel.v1; - -option go_package = "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types"; - -import "gogoproto/gogo.proto"; -import "ibc/core/client/v1/client.proto"; - -// Channel defines pipeline for exactly-once packet delivery between specific -// modules on separate blockchains, which has at least one end capable of -// sending packets and one end capable of receiving packets. -message Channel { - option (gogoproto.goproto_getters) = false; - - // current state of the channel end - State state = 1; - // whether the channel is ordered or unordered - Order ordering = 2; - // counterparty channel end - Counterparty counterparty = 3 [(gogoproto.nullable) = false]; - // list of connection identifiers, in order, along which packets sent on - // this channel will travel - repeated string connection_hops = 4 [(gogoproto.moretags) = "yaml:\"connection_hops\""]; - // opaque channel version, which is agreed upon during the handshake - string version = 5; -} - -// IdentifiedChannel defines a channel with additional port and channel -// identifier fields. -message IdentifiedChannel { - option (gogoproto.goproto_getters) = false; - - // current state of the channel end - State state = 1; - // whether the channel is ordered or unordered - Order ordering = 2; - // counterparty channel end - Counterparty counterparty = 3 [(gogoproto.nullable) = false]; - // list of connection identifiers, in order, along which packets sent on - // this channel will travel - repeated string connection_hops = 4 [(gogoproto.moretags) = "yaml:\"connection_hops\""]; - // opaque channel version, which is agreed upon during the handshake - string version = 5; - // port identifier - string port_id = 6; - // channel identifier - string channel_id = 7; -} - -// State defines if a channel is in one of the following states: -// CLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED. -enum State { - option (gogoproto.goproto_enum_prefix) = false; - - // Default State - STATE_UNINITIALIZED_UNSPECIFIED = 0 [(gogoproto.enumvalue_customname) = "UNINITIALIZED"]; - // A channel has just started the opening handshake. - STATE_INIT = 1 [(gogoproto.enumvalue_customname) = "INIT"]; - // A channel has acknowledged the handshake step on the counterparty chain. - STATE_TRYOPEN = 2 [(gogoproto.enumvalue_customname) = "TRYOPEN"]; - // A channel has completed the handshake. Open channels are - // ready to send and receive packets. - STATE_OPEN = 3 [(gogoproto.enumvalue_customname) = "OPEN"]; - // A channel has been closed and can no longer be used to send or receive - // packets. - STATE_CLOSED = 4 [(gogoproto.enumvalue_customname) = "CLOSED"]; -} - -// Order defines if a channel is ORDERED or UNORDERED -enum Order { - option (gogoproto.goproto_enum_prefix) = false; - - // zero-value for channel ordering - ORDER_NONE_UNSPECIFIED = 0 [(gogoproto.enumvalue_customname) = "NONE"]; - // packets can be delivered in any order, which may differ from the order in - // which they were sent. - ORDER_UNORDERED = 1 [(gogoproto.enumvalue_customname) = "UNORDERED"]; - // packets are delivered exactly in the order which they were sent - ORDER_ORDERED = 2 [(gogoproto.enumvalue_customname) = "ORDERED"]; -} - -// Counterparty defines a channel end counterparty -message Counterparty { - option (gogoproto.goproto_getters) = false; - - // port on the counterparty chain which owns the other end of the channel. - string port_id = 1 [(gogoproto.moretags) = "yaml:\"port_id\""]; - // channel end on the counterparty chain - string channel_id = 2 [(gogoproto.moretags) = "yaml:\"channel_id\""]; -} - -// Packet defines a type that carries data across different chains through IBC -message Packet { - option (gogoproto.goproto_getters) = false; - - // number corresponds to the order of sends and receives, where a Packet - // with an earlier sequence number must be sent and received before a Packet - // with a later sequence number. - uint64 sequence = 1; - // identifies the port on the sending chain. - string source_port = 2 [(gogoproto.moretags) = "yaml:\"source_port\""]; - // identifies the channel end on the sending chain. - string source_channel = 3 [(gogoproto.moretags) = "yaml:\"source_channel\""]; - // identifies the port on the receiving chain. - string destination_port = 4 [(gogoproto.moretags) = "yaml:\"destination_port\""]; - // identifies the channel end on the receiving chain. - string destination_channel = 5 [(gogoproto.moretags) = "yaml:\"destination_channel\""]; - // actual opaque bytes transferred directly to the application module - bytes data = 6; - // block height after which the packet times out - ibc.core.client.v1.Height timeout_height = 7 - [(gogoproto.moretags) = "yaml:\"timeout_height\"", (gogoproto.nullable) = false]; - // block timestamp (in nanoseconds) after which the packet times out - uint64 timeout_timestamp = 8 [(gogoproto.moretags) = "yaml:\"timeout_timestamp\""]; -} - -// PacketState defines the generic type necessary to retrieve and store -// packet commitments, acknowledgements, and receipts. -// Caller is responsible for knowing the context necessary to interpret this -// state as a commitment, acknowledgement, or a receipt. -message PacketState { - option (gogoproto.goproto_getters) = false; - - // channel port identifier. - string port_id = 1 [(gogoproto.moretags) = "yaml:\"port_id\""]; - // channel unique identifier. - string channel_id = 2 [(gogoproto.moretags) = "yaml:\"channel_id\""]; - // packet sequence. - uint64 sequence = 3; - // embedded data that represents packet state. - bytes data = 4; -} - -// Acknowledgement is the recommended acknowledgement format to be used by -// app-specific protocols. -// NOTE: The field numbers 21 and 22 were explicitly chosen to avoid accidental -// conflicts with other protobuf message formats used for acknowledgements. -// The first byte of any message with this format will be the non-ASCII values -// `0xaa` (result) or `0xb2` (error). Implemented as defined by ICS: -// https://github.com/cosmos/ics/tree/master/spec/ics-004-channel-and-packet-semantics#acknowledgement-envelope -message Acknowledgement { - // response contains either a result or an error and must be non-empty - oneof response { - bytes result = 21; - string error = 22; - } -} diff --git a/third_party/proto/ibc/core/channel/v1/genesis.proto b/third_party/proto/ibc/core/channel/v1/genesis.proto deleted file mode 100644 index 1c0ff6ee88..0000000000 --- a/third_party/proto/ibc/core/channel/v1/genesis.proto +++ /dev/null @@ -1,32 +0,0 @@ -syntax = "proto3"; - -package ibc.core.channel.v1; - -option go_package = "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types"; - -import "gogoproto/gogo.proto"; -import "ibc/core/channel/v1/channel.proto"; - -// GenesisState defines the ibc channel submodule's genesis state. -message GenesisState { - repeated IdentifiedChannel channels = 1 [(gogoproto.casttype) = "IdentifiedChannel", (gogoproto.nullable) = false]; - repeated PacketState acknowledgements = 2 [(gogoproto.nullable) = false]; - repeated PacketState commitments = 3 [(gogoproto.nullable) = false]; - repeated PacketState receipts = 4 [(gogoproto.nullable) = false]; - repeated PacketSequence send_sequences = 5 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"send_sequences\""]; - repeated PacketSequence recv_sequences = 6 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"recv_sequences\""]; - repeated PacketSequence ack_sequences = 7 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"ack_sequences\""]; - // the sequence for the next generated channel identifier - uint64 next_channel_sequence = 8 [(gogoproto.moretags) = "yaml:\"next_channel_sequence\""]; -} - -// PacketSequence defines the genesis type necessary to retrieve and store -// next send and receive sequences. -message PacketSequence { - string port_id = 1 [(gogoproto.moretags) = "yaml:\"port_id\""]; - string channel_id = 2 [(gogoproto.moretags) = "yaml:\"channel_id\""]; - uint64 sequence = 3; -} diff --git a/third_party/proto/ibc/core/channel/v1/query.proto b/third_party/proto/ibc/core/channel/v1/query.proto deleted file mode 100644 index 986633173c..0000000000 --- a/third_party/proto/ibc/core/channel/v1/query.proto +++ /dev/null @@ -1,376 +0,0 @@ -syntax = "proto3"; - -package ibc.core.channel.v1; - -option go_package = "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types"; - -import "ibc/core/client/v1/client.proto"; -import "cosmos/base/query/v1beta1/pagination.proto"; -import "ibc/core/channel/v1/channel.proto"; -import "google/api/annotations.proto"; -import "google/protobuf/any.proto"; -import "gogoproto/gogo.proto"; - -// Query provides defines the gRPC querier service -service Query { - // Channel queries an IBC Channel. - rpc Channel(QueryChannelRequest) returns (QueryChannelResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}"; - } - - // Channels queries all the IBC channels of a chain. - rpc Channels(QueryChannelsRequest) returns (QueryChannelsResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/channels"; - } - - // ConnectionChannels queries all the channels associated with a connection - // end. - rpc ConnectionChannels(QueryConnectionChannelsRequest) returns (QueryConnectionChannelsResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/connections/{connection}/channels"; - } - - // ChannelClientState queries for the client state for the channel associated - // with the provided channel identifiers. - rpc ChannelClientState(QueryChannelClientStateRequest) returns (QueryChannelClientStateResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/channels/{channel_id}/" - "ports/{port_id}/client_state"; - } - - // ChannelConsensusState queries for the consensus state for the channel - // associated with the provided channel identifiers. - rpc ChannelConsensusState(QueryChannelConsensusStateRequest) returns (QueryChannelConsensusStateResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/channels/{channel_id}/" - "ports/{port_id}/consensus_state/revision/" - "{revision_number}/height/{revision_height}"; - } - - // PacketCommitment queries a stored packet commitment hash. - rpc PacketCommitment(QueryPacketCommitmentRequest) returns (QueryPacketCommitmentResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/" - "packet_commitments/{sequence}"; - } - - // PacketCommitments returns all the packet commitments hashes associated - // with a channel. - rpc PacketCommitments(QueryPacketCommitmentsRequest) returns (QueryPacketCommitmentsResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/channels/{channel_id}/" - "ports/{port_id}/packet_commitments"; - } - - // PacketReceipt queries if a given packet sequence has been received on the - // queried chain - rpc PacketReceipt(QueryPacketReceiptRequest) returns (QueryPacketReceiptResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/channels/{channel_id}/" - "ports/{port_id}/packet_receipts/{sequence}"; - } - - // PacketAcknowledgement queries a stored packet acknowledgement hash. - rpc PacketAcknowledgement(QueryPacketAcknowledgementRequest) returns (QueryPacketAcknowledgementResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/channels/{channel_id}/" - "ports/{port_id}/packet_acks/{sequence}"; - } - - // PacketAcknowledgements returns all the packet acknowledgements associated - // with a channel. - rpc PacketAcknowledgements(QueryPacketAcknowledgementsRequest) returns (QueryPacketAcknowledgementsResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/channels/{channel_id}/" - "ports/{port_id}/packet_acknowledgements"; - } - - // UnreceivedPackets returns all the unreceived IBC packets associated with a - // channel and sequences. - rpc UnreceivedPackets(QueryUnreceivedPacketsRequest) returns (QueryUnreceivedPacketsResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/" - "packet_commitments/" - "{packet_commitment_sequences}/unreceived_packets"; - } - - // UnreceivedAcks returns all the unreceived IBC acknowledgements associated - // with a channel and sequences. - rpc UnreceivedAcks(QueryUnreceivedAcksRequest) returns (QueryUnreceivedAcksResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/channels/{channel_id}/" - "ports/{port_id}/packet_commitments/" - "{packet_ack_sequences}/unreceived_acks"; - } - - // NextSequenceReceive returns the next receive sequence for a given channel. - rpc NextSequenceReceive(QueryNextSequenceReceiveRequest) returns (QueryNextSequenceReceiveResponse) { - option (google.api.http).get = "/ibc/core/channel/v1/channels/{channel_id}/" - "ports/{port_id}/next_sequence"; - } -} - -// QueryChannelRequest is the request type for the Query/Channel RPC method -message QueryChannelRequest { - // port unique identifier - string port_id = 1; - // channel unique identifier - string channel_id = 2; -} - -// QueryChannelResponse is the response type for the Query/Channel RPC method. -// Besides the Channel end, it includes a proof and the height from which the -// proof was retrieved. -message QueryChannelResponse { - // channel associated with the request identifiers - ibc.core.channel.v1.Channel channel = 1; - // merkle proof of existence - bytes proof = 2; - // height at which the proof was retrieved - ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false]; -} - -// QueryChannelsRequest is the request type for the Query/Channels RPC method -message QueryChannelsRequest { - // pagination request - cosmos.base.query.v1beta1.PageRequest pagination = 1; -} - -// QueryChannelsResponse is the response type for the Query/Channels RPC method. -message QueryChannelsResponse { - // list of stored channels of the chain. - repeated ibc.core.channel.v1.IdentifiedChannel channels = 1; - // pagination response - cosmos.base.query.v1beta1.PageResponse pagination = 2; - // query block height - ibc.core.client.v1.Height height = 3 [(gogoproto.nullable) = false]; -} - -// QueryConnectionChannelsRequest is the request type for the -// Query/QueryConnectionChannels RPC method -message QueryConnectionChannelsRequest { - // connection unique identifier - string connection = 1; - // pagination request - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -// QueryConnectionChannelsResponse is the Response type for the -// Query/QueryConnectionChannels RPC method -message QueryConnectionChannelsResponse { - // list of channels associated with a connection. - repeated ibc.core.channel.v1.IdentifiedChannel channels = 1; - // pagination response - cosmos.base.query.v1beta1.PageResponse pagination = 2; - // query block height - ibc.core.client.v1.Height height = 3 [(gogoproto.nullable) = false]; -} - -// QueryChannelClientStateRequest is the request type for the Query/ClientState -// RPC method -message QueryChannelClientStateRequest { - // port unique identifier - string port_id = 1; - // channel unique identifier - string channel_id = 2; -} - -// QueryChannelClientStateResponse is the Response type for the -// Query/QueryChannelClientState RPC method -message QueryChannelClientStateResponse { - // client state associated with the channel - ibc.core.client.v1.IdentifiedClientState identified_client_state = 1; - // merkle proof of existence - bytes proof = 2; - // height at which the proof was retrieved - ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false]; -} - -// QueryChannelConsensusStateRequest is the request type for the -// Query/ConsensusState RPC method -message QueryChannelConsensusStateRequest { - // port unique identifier - string port_id = 1; - // channel unique identifier - string channel_id = 2; - // revision number of the consensus state - uint64 revision_number = 3; - // revision height of the consensus state - uint64 revision_height = 4; -} - -// QueryChannelClientStateResponse is the Response type for the -// Query/QueryChannelClientState RPC method -message QueryChannelConsensusStateResponse { - // consensus state associated with the channel - google.protobuf.Any consensus_state = 1; - // client ID associated with the consensus state - string client_id = 2; - // merkle proof of existence - bytes proof = 3; - // height at which the proof was retrieved - ibc.core.client.v1.Height proof_height = 4 [(gogoproto.nullable) = false]; -} - -// QueryPacketCommitmentRequest is the request type for the -// Query/PacketCommitment RPC method -message QueryPacketCommitmentRequest { - // port unique identifier - string port_id = 1; - // channel unique identifier - string channel_id = 2; - // packet sequence - uint64 sequence = 3; -} - -// QueryPacketCommitmentResponse defines the client query response for a packet -// which also includes a proof and the height from which the proof was -// retrieved -message QueryPacketCommitmentResponse { - // packet associated with the request fields - bytes commitment = 1; - // merkle proof of existence - bytes proof = 2; - // height at which the proof was retrieved - ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false]; -} - -// QueryPacketCommitmentsRequest is the request type for the -// Query/QueryPacketCommitments RPC method -message QueryPacketCommitmentsRequest { - // port unique identifier - string port_id = 1; - // channel unique identifier - string channel_id = 2; - // pagination request - cosmos.base.query.v1beta1.PageRequest pagination = 3; -} - -// QueryPacketCommitmentsResponse is the request type for the -// Query/QueryPacketCommitments RPC method -message QueryPacketCommitmentsResponse { - repeated ibc.core.channel.v1.PacketState commitments = 1; - // pagination response - cosmos.base.query.v1beta1.PageResponse pagination = 2; - // query block height - ibc.core.client.v1.Height height = 3 [(gogoproto.nullable) = false]; -} - -// QueryPacketReceiptRequest is the request type for the -// Query/PacketReceipt RPC method -message QueryPacketReceiptRequest { - // port unique identifier - string port_id = 1; - // channel unique identifier - string channel_id = 2; - // packet sequence - uint64 sequence = 3; -} - -// QueryPacketReceiptResponse defines the client query response for a packet -// receipt which also includes a proof, and the height from which the proof was -// retrieved -message QueryPacketReceiptResponse { - // success flag for if receipt exists - bool received = 2; - // merkle proof of existence - bytes proof = 3; - // height at which the proof was retrieved - ibc.core.client.v1.Height proof_height = 4 [(gogoproto.nullable) = false]; -} - -// QueryPacketAcknowledgementRequest is the request type for the -// Query/PacketAcknowledgement RPC method -message QueryPacketAcknowledgementRequest { - // port unique identifier - string port_id = 1; - // channel unique identifier - string channel_id = 2; - // packet sequence - uint64 sequence = 3; -} - -// QueryPacketAcknowledgementResponse defines the client query response for a -// packet which also includes a proof and the height from which the -// proof was retrieved -message QueryPacketAcknowledgementResponse { - // packet associated with the request fields - bytes acknowledgement = 1; - // merkle proof of existence - bytes proof = 2; - // height at which the proof was retrieved - ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false]; -} - -// QueryPacketAcknowledgementsRequest is the request type for the -// Query/QueryPacketCommitments RPC method -message QueryPacketAcknowledgementsRequest { - // port unique identifier - string port_id = 1; - // channel unique identifier - string channel_id = 2; - // pagination request - cosmos.base.query.v1beta1.PageRequest pagination = 3; - // list of packet sequences - repeated uint64 packet_commitment_sequences = 4; -} - -// QueryPacketAcknowledgemetsResponse is the request type for the -// Query/QueryPacketAcknowledgements RPC method -message QueryPacketAcknowledgementsResponse { - repeated ibc.core.channel.v1.PacketState acknowledgements = 1; - // pagination response - cosmos.base.query.v1beta1.PageResponse pagination = 2; - // query block height - ibc.core.client.v1.Height height = 3 [(gogoproto.nullable) = false]; -} - -// QueryUnreceivedPacketsRequest is the request type for the -// Query/UnreceivedPackets RPC method -message QueryUnreceivedPacketsRequest { - // port unique identifier - string port_id = 1; - // channel unique identifier - string channel_id = 2; - // list of packet sequences - repeated uint64 packet_commitment_sequences = 3; -} - -// QueryUnreceivedPacketsResponse is the response type for the -// Query/UnreceivedPacketCommitments RPC method -message QueryUnreceivedPacketsResponse { - // list of unreceived packet sequences - repeated uint64 sequences = 1; - // query block height - ibc.core.client.v1.Height height = 2 [(gogoproto.nullable) = false]; -} - -// QueryUnreceivedAcks is the request type for the -// Query/UnreceivedAcks RPC method -message QueryUnreceivedAcksRequest { - // port unique identifier - string port_id = 1; - // channel unique identifier - string channel_id = 2; - // list of acknowledgement sequences - repeated uint64 packet_ack_sequences = 3; -} - -// QueryUnreceivedAcksResponse is the response type for the -// Query/UnreceivedAcks RPC method -message QueryUnreceivedAcksResponse { - // list of unreceived acknowledgement sequences - repeated uint64 sequences = 1; - // query block height - ibc.core.client.v1.Height height = 2 [(gogoproto.nullable) = false]; -} - -// QueryNextSequenceReceiveRequest is the request type for the -// Query/QueryNextSequenceReceiveRequest RPC method -message QueryNextSequenceReceiveRequest { - // port unique identifier - string port_id = 1; - // channel unique identifier - string channel_id = 2; -} - -// QuerySequenceResponse is the request type for the -// Query/QueryNextSequenceReceiveResponse RPC method -message QueryNextSequenceReceiveResponse { - // next sequence receive number - uint64 next_sequence_receive = 1; - // merkle proof of existence - bytes proof = 2; - // height at which the proof was retrieved - ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false]; -} diff --git a/third_party/proto/ibc/core/channel/v1/tx.proto b/third_party/proto/ibc/core/channel/v1/tx.proto deleted file mode 100644 index c1ab67a16b..0000000000 --- a/third_party/proto/ibc/core/channel/v1/tx.proto +++ /dev/null @@ -1,211 +0,0 @@ -syntax = "proto3"; - -package ibc.core.channel.v1; - -option go_package = "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types"; - -import "gogoproto/gogo.proto"; -import "ibc/core/client/v1/client.proto"; -import "ibc/core/channel/v1/channel.proto"; - -// Msg defines the ibc/channel Msg service. -service Msg { - // ChannelOpenInit defines a rpc handler method for MsgChannelOpenInit. - rpc ChannelOpenInit(MsgChannelOpenInit) returns (MsgChannelOpenInitResponse); - - // ChannelOpenTry defines a rpc handler method for MsgChannelOpenTry. - rpc ChannelOpenTry(MsgChannelOpenTry) returns (MsgChannelOpenTryResponse); - - // ChannelOpenAck defines a rpc handler method for MsgChannelOpenAck. - rpc ChannelOpenAck(MsgChannelOpenAck) returns (MsgChannelOpenAckResponse); - - // ChannelOpenConfirm defines a rpc handler method for MsgChannelOpenConfirm. - rpc ChannelOpenConfirm(MsgChannelOpenConfirm) returns (MsgChannelOpenConfirmResponse); - - // ChannelCloseInit defines a rpc handler method for MsgChannelCloseInit. - rpc ChannelCloseInit(MsgChannelCloseInit) returns (MsgChannelCloseInitResponse); - - // ChannelCloseConfirm defines a rpc handler method for - // MsgChannelCloseConfirm. - rpc ChannelCloseConfirm(MsgChannelCloseConfirm) returns (MsgChannelCloseConfirmResponse); - - // RecvPacket defines a rpc handler method for MsgRecvPacket. - rpc RecvPacket(MsgRecvPacket) returns (MsgRecvPacketResponse); - - // Timeout defines a rpc handler method for MsgTimeout. - rpc Timeout(MsgTimeout) returns (MsgTimeoutResponse); - - // TimeoutOnClose defines a rpc handler method for MsgTimeoutOnClose. - rpc TimeoutOnClose(MsgTimeoutOnClose) returns (MsgTimeoutOnCloseResponse); - - // Acknowledgement defines a rpc handler method for MsgAcknowledgement. - rpc Acknowledgement(MsgAcknowledgement) returns (MsgAcknowledgementResponse); -} - -// MsgChannelOpenInit defines an sdk.Msg to initialize a channel handshake. It -// is called by a relayer on Chain A. -message MsgChannelOpenInit { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string port_id = 1 [(gogoproto.moretags) = "yaml:\"port_id\""]; - Channel channel = 2 [(gogoproto.nullable) = false]; - string signer = 3; -} - -// MsgChannelOpenInitResponse defines the Msg/ChannelOpenInit response type. -message MsgChannelOpenInitResponse {} - -// MsgChannelOpenInit defines a msg sent by a Relayer to try to open a channel -// on Chain B. -message MsgChannelOpenTry { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string port_id = 1 [(gogoproto.moretags) = "yaml:\"port_id\""]; - // in the case of crossing hello's, when both chains call OpenInit, we need - // the channel identifier of the previous channel in state INIT - string previous_channel_id = 2 [(gogoproto.moretags) = "yaml:\"previous_channel_id\""]; - Channel channel = 3 [(gogoproto.nullable) = false]; - string counterparty_version = 4 [(gogoproto.moretags) = "yaml:\"counterparty_version\""]; - bytes proof_init = 5 [(gogoproto.moretags) = "yaml:\"proof_init\""]; - ibc.core.client.v1.Height proof_height = 6 - [(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false]; - string signer = 7; -} - -// MsgChannelOpenTryResponse defines the Msg/ChannelOpenTry response type. -message MsgChannelOpenTryResponse {} - -// MsgChannelOpenAck defines a msg sent by a Relayer to Chain A to acknowledge -// the change of channel state to TRYOPEN on Chain B. -message MsgChannelOpenAck { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string port_id = 1 [(gogoproto.moretags) = "yaml:\"port_id\""]; - string channel_id = 2 [(gogoproto.moretags) = "yaml:\"channel_id\""]; - string counterparty_channel_id = 3 [(gogoproto.moretags) = "yaml:\"counterparty_channel_id\""]; - string counterparty_version = 4 [(gogoproto.moretags) = "yaml:\"counterparty_version\""]; - bytes proof_try = 5 [(gogoproto.moretags) = "yaml:\"proof_try\""]; - ibc.core.client.v1.Height proof_height = 6 - [(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false]; - string signer = 7; -} - -// MsgChannelOpenAckResponse defines the Msg/ChannelOpenAck response type. -message MsgChannelOpenAckResponse {} - -// MsgChannelOpenConfirm defines a msg sent by a Relayer to Chain B to -// acknowledge the change of channel state to OPEN on Chain A. -message MsgChannelOpenConfirm { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string port_id = 1 [(gogoproto.moretags) = "yaml:\"port_id\""]; - string channel_id = 2 [(gogoproto.moretags) = "yaml:\"channel_id\""]; - bytes proof_ack = 3 [(gogoproto.moretags) = "yaml:\"proof_ack\""]; - ibc.core.client.v1.Height proof_height = 4 - [(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false]; - string signer = 5; -} - -// MsgChannelOpenConfirmResponse defines the Msg/ChannelOpenConfirm response -// type. -message MsgChannelOpenConfirmResponse {} - -// MsgChannelCloseInit defines a msg sent by a Relayer to Chain A -// to close a channel with Chain B. -message MsgChannelCloseInit { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string port_id = 1 [(gogoproto.moretags) = "yaml:\"port_id\""]; - string channel_id = 2 [(gogoproto.moretags) = "yaml:\"channel_id\""]; - string signer = 3; -} - -// MsgChannelCloseInitResponse defines the Msg/ChannelCloseInit response type. -message MsgChannelCloseInitResponse {} - -// MsgChannelCloseConfirm defines a msg sent by a Relayer to Chain B -// to acknowledge the change of channel state to CLOSED on Chain A. -message MsgChannelCloseConfirm { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string port_id = 1 [(gogoproto.moretags) = "yaml:\"port_id\""]; - string channel_id = 2 [(gogoproto.moretags) = "yaml:\"channel_id\""]; - bytes proof_init = 3 [(gogoproto.moretags) = "yaml:\"proof_init\""]; - ibc.core.client.v1.Height proof_height = 4 - [(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false]; - string signer = 5; -} - -// MsgChannelCloseConfirmResponse defines the Msg/ChannelCloseConfirm response -// type. -message MsgChannelCloseConfirmResponse {} - -// MsgRecvPacket receives incoming IBC packet -message MsgRecvPacket { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - Packet packet = 1 [(gogoproto.nullable) = false]; - bytes proof_commitment = 2 [(gogoproto.moretags) = "yaml:\"proof_commitment\""]; - ibc.core.client.v1.Height proof_height = 3 - [(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false]; - string signer = 4; -} - -// MsgRecvPacketResponse defines the Msg/RecvPacket response type. -message MsgRecvPacketResponse {} - -// MsgTimeout receives timed-out packet -message MsgTimeout { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - Packet packet = 1 [(gogoproto.nullable) = false]; - bytes proof_unreceived = 2 [(gogoproto.moretags) = "yaml:\"proof_unreceived\""]; - ibc.core.client.v1.Height proof_height = 3 - [(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false]; - uint64 next_sequence_recv = 4 [(gogoproto.moretags) = "yaml:\"next_sequence_recv\""]; - string signer = 5; -} - -// MsgTimeoutResponse defines the Msg/Timeout response type. -message MsgTimeoutResponse {} - -// MsgTimeoutOnClose timed-out packet upon counterparty channel closure. -message MsgTimeoutOnClose { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - Packet packet = 1 [(gogoproto.nullable) = false]; - bytes proof_unreceived = 2 [(gogoproto.moretags) = "yaml:\"proof_unreceived\""]; - bytes proof_close = 3 [(gogoproto.moretags) = "yaml:\"proof_close\""]; - ibc.core.client.v1.Height proof_height = 4 - [(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false]; - uint64 next_sequence_recv = 5 [(gogoproto.moretags) = "yaml:\"next_sequence_recv\""]; - string signer = 6; -} - -// MsgTimeoutOnCloseResponse defines the Msg/TimeoutOnClose response type. -message MsgTimeoutOnCloseResponse {} - -// MsgAcknowledgement receives incoming IBC acknowledgement -message MsgAcknowledgement { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - Packet packet = 1 [(gogoproto.nullable) = false]; - bytes acknowledgement = 2; - bytes proof_acked = 3 [(gogoproto.moretags) = "yaml:\"proof_acked\""]; - ibc.core.client.v1.Height proof_height = 4 - [(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false]; - string signer = 5; -} - -// MsgAcknowledgementResponse defines the Msg/Acknowledgement response type. -message MsgAcknowledgementResponse {} diff --git a/third_party/proto/ibc/core/client/v1/client.proto b/third_party/proto/ibc/core/client/v1/client.proto deleted file mode 100644 index 11edeeca87..0000000000 --- a/third_party/proto/ibc/core/client/v1/client.proto +++ /dev/null @@ -1,100 +0,0 @@ -syntax = "proto3"; - -package ibc.core.client.v1; - -option go_package = "github.com/cosmos/ibc-go/v4/modules/core/02-client/types"; - -import "gogoproto/gogo.proto"; -import "google/protobuf/any.proto"; -import "cosmos/upgrade/v1beta1/upgrade.proto"; - -// IdentifiedClientState defines a client state with an additional client -// identifier field. -message IdentifiedClientState { - // client identifier - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // client state - google.protobuf.Any client_state = 2 [(gogoproto.moretags) = "yaml:\"client_state\""]; -} - -// ConsensusStateWithHeight defines a consensus state with an additional height -// field. -message ConsensusStateWithHeight { - // consensus state height - Height height = 1 [(gogoproto.nullable) = false]; - // consensus state - google.protobuf.Any consensus_state = 2 [(gogoproto.moretags) = "yaml\"consensus_state\""]; -} - -// ClientConsensusStates defines all the stored consensus states for a given -// client. -message ClientConsensusStates { - // client identifier - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // consensus states and their heights associated with the client - repeated ConsensusStateWithHeight consensus_states = 2 - [(gogoproto.moretags) = "yaml:\"consensus_states\"", (gogoproto.nullable) = false]; -} - -// ClientUpdateProposal is a governance proposal. If it passes, the substitute -// client's latest consensus state is copied over to the subject client. The proposal -// handler may fail if the subject and the substitute do not match in client and -// chain parameters (with exception to latest height, frozen height, and chain-id). -message ClientUpdateProposal { - option (gogoproto.goproto_getters) = false; - // the title of the update proposal - string title = 1; - // the description of the proposal - string description = 2; - // the client identifier for the client to be updated if the proposal passes - string subject_client_id = 3 [(gogoproto.moretags) = "yaml:\"subject_client_id\""]; - // the substitute client identifier for the client standing in for the subject - // client - string substitute_client_id = 4 [(gogoproto.moretags) = "yaml:\"substitute_client_id\""]; -} - -// UpgradeProposal is a gov Content type for initiating an IBC breaking -// upgrade. -message UpgradeProposal { - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - option (gogoproto.equal) = true; - - string title = 1; - string description = 2; - cosmos.upgrade.v1beta1.Plan plan = 3 [(gogoproto.nullable) = false]; - - // An UpgradedClientState must be provided to perform an IBC breaking upgrade. - // This will make the chain commit to the correct upgraded (self) client state - // before the upgrade occurs, so that connecting chains can verify that the - // new upgraded client is valid by verifying a proof on the previous version - // of the chain. This will allow IBC connections to persist smoothly across - // planned chain upgrades - google.protobuf.Any upgraded_client_state = 4 [(gogoproto.moretags) = "yaml:\"upgraded_client_state\""]; -} - -// Height is a monotonically increasing data type -// that can be compared against another Height for the purposes of updating and -// freezing clients -// -// Normally the RevisionHeight is incremented at each height while keeping -// RevisionNumber the same. However some consensus algorithms may choose to -// reset the height in certain conditions e.g. hard forks, state-machine -// breaking changes In these cases, the RevisionNumber is incremented so that -// height continues to be monitonically increasing even as the RevisionHeight -// gets reset -message Height { - option (gogoproto.goproto_getters) = false; - option (gogoproto.goproto_stringer) = false; - - // the revision that the client is currently on - uint64 revision_number = 1 [(gogoproto.moretags) = "yaml:\"revision_number\""]; - // the height within the given revision - uint64 revision_height = 2 [(gogoproto.moretags) = "yaml:\"revision_height\""]; -} - -// Params defines the set of IBC light client parameters. -message Params { - // allowed_clients defines the list of allowed client state types. - repeated string allowed_clients = 1 [(gogoproto.moretags) = "yaml:\"allowed_clients\""]; -} diff --git a/third_party/proto/ibc/core/client/v1/genesis.proto b/third_party/proto/ibc/core/client/v1/genesis.proto deleted file mode 100644 index b2930c4841..0000000000 --- a/third_party/proto/ibc/core/client/v1/genesis.proto +++ /dev/null @@ -1,48 +0,0 @@ -syntax = "proto3"; - -package ibc.core.client.v1; - -option go_package = "github.com/cosmos/ibc-go/v4/modules/core/02-client/types"; - -import "ibc/core/client/v1/client.proto"; -import "gogoproto/gogo.proto"; - -// GenesisState defines the ibc client submodule's genesis state. -message GenesisState { - // client states with their corresponding identifiers - repeated IdentifiedClientState clients = 1 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "IdentifiedClientStates"]; - // consensus states from each client - repeated ClientConsensusStates clients_consensus = 2 [ - (gogoproto.nullable) = false, - (gogoproto.castrepeated) = "ClientsConsensusStates", - (gogoproto.moretags) = "yaml:\"clients_consensus\"" - ]; - // metadata from each client - repeated IdentifiedGenesisMetadata clients_metadata = 3 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"clients_metadata\""]; - Params params = 4 [(gogoproto.nullable) = false]; - // create localhost on initialization - bool create_localhost = 5 [(gogoproto.moretags) = "yaml:\"create_localhost\""]; - // the sequence for the next generated client identifier - uint64 next_client_sequence = 6 [(gogoproto.moretags) = "yaml:\"next_client_sequence\""]; -} - -// GenesisMetadata defines the genesis type for metadata that clients may return -// with ExportMetadata -message GenesisMetadata { - option (gogoproto.goproto_getters) = false; - - // store key of metadata without clientID-prefix - bytes key = 1; - // metadata value - bytes value = 2; -} - -// IdentifiedGenesisMetadata has the client metadata with the corresponding -// client id. -message IdentifiedGenesisMetadata { - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - repeated GenesisMetadata client_metadata = 2 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"client_metadata\""]; -} diff --git a/third_party/proto/ibc/core/client/v1/query.proto b/third_party/proto/ibc/core/client/v1/query.proto deleted file mode 100644 index b930569313..0000000000 --- a/third_party/proto/ibc/core/client/v1/query.proto +++ /dev/null @@ -1,184 +0,0 @@ -syntax = "proto3"; - -package ibc.core.client.v1; - -option go_package = "github.com/cosmos/ibc-go/v4/modules/core/02-client/types"; - -import "cosmos/base/query/v1beta1/pagination.proto"; -import "ibc/core/client/v1/client.proto"; -import "google/protobuf/any.proto"; -import "google/api/annotations.proto"; -import "gogoproto/gogo.proto"; - -// Query provides defines the gRPC querier service -service Query { - // ClientState queries an IBC light client. - rpc ClientState(QueryClientStateRequest) returns (QueryClientStateResponse) { - option (google.api.http).get = "/ibc/core/client/v1/client_states/{client_id}"; - } - - // ClientStates queries all the IBC light clients of a chain. - rpc ClientStates(QueryClientStatesRequest) returns (QueryClientStatesResponse) { - option (google.api.http).get = "/ibc/core/client/v1/client_states"; - } - - // ConsensusState queries a consensus state associated with a client state at - // a given height. - rpc ConsensusState(QueryConsensusStateRequest) returns (QueryConsensusStateResponse) { - option (google.api.http).get = "/ibc/core/client/v1/consensus_states/" - "{client_id}/revision/{revision_number}/" - "height/{revision_height}"; - } - - // ConsensusStates queries all the consensus state associated with a given - // client. - rpc ConsensusStates(QueryConsensusStatesRequest) returns (QueryConsensusStatesResponse) { - option (google.api.http).get = "/ibc/core/client/v1/consensus_states/{client_id}"; - } - - // Status queries the status of an IBC client. - rpc ClientStatus(QueryClientStatusRequest) returns (QueryClientStatusResponse) { - option (google.api.http).get = "/ibc/core/client/v1/client_status/{client_id}"; - } - - // ClientParams queries all parameters of the ibc client. - rpc ClientParams(QueryClientParamsRequest) returns (QueryClientParamsResponse) { - option (google.api.http).get = "/ibc/client/v1/params"; - } - - // UpgradedClientState queries an Upgraded IBC light client. - rpc UpgradedClientState(QueryUpgradedClientStateRequest) returns (QueryUpgradedClientStateResponse) { - option (google.api.http).get = "/ibc/core/client/v1/upgraded_client_states"; - } - - // UpgradedConsensusState queries an Upgraded IBC consensus state. - rpc UpgradedConsensusState(QueryUpgradedConsensusStateRequest) returns (QueryUpgradedConsensusStateResponse) { - option (google.api.http).get = "/ibc/core/client/v1/upgraded_consensus_states"; - } -} - -// QueryClientStateRequest is the request type for the Query/ClientState RPC -// method -message QueryClientStateRequest { - // client state unique identifier - string client_id = 1; -} - -// QueryClientStateResponse is the response type for the Query/ClientState RPC -// method. Besides the client state, it includes a proof and the height from -// which the proof was retrieved. -message QueryClientStateResponse { - // client state associated with the request identifier - google.protobuf.Any client_state = 1; - // merkle proof of existence - bytes proof = 2; - // height at which the proof was retrieved - ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false]; -} - -// QueryClientStatesRequest is the request type for the Query/ClientStates RPC -// method -message QueryClientStatesRequest { - // pagination request - cosmos.base.query.v1beta1.PageRequest pagination = 1; -} - -// QueryClientStatesResponse is the response type for the Query/ClientStates RPC -// method. -message QueryClientStatesResponse { - // list of stored ClientStates of the chain. - repeated IdentifiedClientState client_states = 1 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "IdentifiedClientStates"]; - // pagination response - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryConsensusStateRequest is the request type for the Query/ConsensusState -// RPC method. Besides the consensus state, it includes a proof and the height -// from which the proof was retrieved. -message QueryConsensusStateRequest { - // client identifier - string client_id = 1; - // consensus state revision number - uint64 revision_number = 2; - // consensus state revision height - uint64 revision_height = 3; - // latest_height overrrides the height field and queries the latest stored - // ConsensusState - bool latest_height = 4; -} - -// QueryConsensusStateResponse is the response type for the Query/ConsensusState -// RPC method -message QueryConsensusStateResponse { - // consensus state associated with the client identifier at the given height - google.protobuf.Any consensus_state = 1; - // merkle proof of existence - bytes proof = 2; - // height at which the proof was retrieved - ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false]; -} - -// QueryConsensusStatesRequest is the request type for the Query/ConsensusStates -// RPC method. -message QueryConsensusStatesRequest { - // client identifier - string client_id = 1; - // pagination request - cosmos.base.query.v1beta1.PageRequest pagination = 2; -} - -// QueryConsensusStatesResponse is the response type for the -// Query/ConsensusStates RPC method -message QueryConsensusStatesResponse { - // consensus states associated with the identifier - repeated ConsensusStateWithHeight consensus_states = 1 [(gogoproto.nullable) = false]; - // pagination response - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryClientStatusRequest is the request type for the Query/ClientStatus RPC -// method -message QueryClientStatusRequest { - // client unique identifier - string client_id = 1; -} - -// QueryClientStatusResponse is the response type for the Query/ClientStatus RPC -// method. It returns the current status of the IBC client. -message QueryClientStatusResponse { - string status = 1; -} - -// QueryClientParamsRequest is the request type for the Query/ClientParams RPC -// method. -message QueryClientParamsRequest {} - -// QueryClientParamsResponse is the response type for the Query/ClientParams RPC -// method. -message QueryClientParamsResponse { - // params defines the parameters of the module. - Params params = 1; -} - -// QueryUpgradedClientStateRequest is the request type for the -// Query/UpgradedClientState RPC method -message QueryUpgradedClientStateRequest {} - -// QueryUpgradedClientStateResponse is the response type for the -// Query/UpgradedClientState RPC method. -message QueryUpgradedClientStateResponse { - // client state associated with the request identifier - google.protobuf.Any upgraded_client_state = 1; -} - -// QueryUpgradedConsensusStateRequest is the request type for the -// Query/UpgradedConsensusState RPC method -message QueryUpgradedConsensusStateRequest {} - -// QueryUpgradedConsensusStateResponse is the response type for the -// Query/UpgradedConsensusState RPC method. -message QueryUpgradedConsensusStateResponse { - // Consensus state associated with the request identifier - google.protobuf.Any upgraded_consensus_state = 1; -} diff --git a/third_party/proto/ibc/core/client/v1/tx.proto b/third_party/proto/ibc/core/client/v1/tx.proto deleted file mode 100644 index 4c0e981795..0000000000 --- a/third_party/proto/ibc/core/client/v1/tx.proto +++ /dev/null @@ -1,100 +0,0 @@ -syntax = "proto3"; - -package ibc.core.client.v1; - -option go_package = "github.com/cosmos/ibc-go/v4/modules/core/02-client/types"; - -import "gogoproto/gogo.proto"; -import "google/protobuf/any.proto"; -import "ibc/core/client/v1/client.proto"; - -// Msg defines the ibc/client Msg service. -service Msg { - // CreateClient defines a rpc handler method for MsgCreateClient. - rpc CreateClient(MsgCreateClient) returns (MsgCreateClientResponse); - - // UpdateClient defines a rpc handler method for MsgUpdateClient. - rpc UpdateClient(MsgUpdateClient) returns (MsgUpdateClientResponse); - - // UpgradeClient defines a rpc handler method for MsgUpgradeClient. - rpc UpgradeClient(MsgUpgradeClient) returns (MsgUpgradeClientResponse); - - // SubmitMisbehaviour defines a rpc handler method for MsgSubmitMisbehaviour. - rpc SubmitMisbehaviour(MsgSubmitMisbehaviour) returns (MsgSubmitMisbehaviourResponse); -} - -// MsgCreateClient defines a message to create an IBC client -message MsgCreateClient { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // light client state - google.protobuf.Any client_state = 1 [(gogoproto.moretags) = "yaml:\"client_state\""]; - // consensus state associated with the client that corresponds to a given - // height. - google.protobuf.Any consensus_state = 2 [(gogoproto.moretags) = "yaml:\"consensus_state\""]; - // signer address - string signer = 3; -} - -// MsgCreateClientResponse defines the Msg/CreateClient response type. -message MsgCreateClientResponse {} - -// MsgUpdateClient defines an sdk.Msg to update a IBC client state using -// the given header. -message MsgUpdateClient { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // client unique identifier - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // header to update the light client - google.protobuf.Any header = 2; - // signer address - string signer = 3; -} - -// MsgUpdateClientResponse defines the Msg/UpdateClient response type. -message MsgUpdateClientResponse {} - -// MsgUpgradeClient defines an sdk.Msg to upgrade an IBC client to a new client -// state -message MsgUpgradeClient { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // client unique identifier - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // upgraded client state - google.protobuf.Any client_state = 2 [(gogoproto.moretags) = "yaml:\"client_state\""]; - // upgraded consensus state, only contains enough information to serve as a - // basis of trust in update logic - google.protobuf.Any consensus_state = 3 [(gogoproto.moretags) = "yaml:\"consensus_state\""]; - // proof that old chain committed to new client - bytes proof_upgrade_client = 4 [(gogoproto.moretags) = "yaml:\"proof_upgrade_client\""]; - // proof that old chain committed to new consensus state - bytes proof_upgrade_consensus_state = 5 [(gogoproto.moretags) = "yaml:\"proof_upgrade_consensus_state\""]; - // signer address - string signer = 6; -} - -// MsgUpgradeClientResponse defines the Msg/UpgradeClient response type. -message MsgUpgradeClientResponse {} - -// MsgSubmitMisbehaviour defines an sdk.Msg type that submits Evidence for -// light client misbehaviour. -message MsgSubmitMisbehaviour { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // client unique identifier - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // misbehaviour used for freezing the light client - google.protobuf.Any misbehaviour = 2; - // signer address - string signer = 3; -} - -// MsgSubmitMisbehaviourResponse defines the Msg/SubmitMisbehaviour response -// type. -message MsgSubmitMisbehaviourResponse {} diff --git a/third_party/proto/ibc/core/commitment/v1/commitment.proto b/third_party/proto/ibc/core/commitment/v1/commitment.proto deleted file mode 100644 index 1c36fcfbde..0000000000 --- a/third_party/proto/ibc/core/commitment/v1/commitment.proto +++ /dev/null @@ -1,41 +0,0 @@ -syntax = "proto3"; - -package ibc.core.commitment.v1; - -option go_package = "github.com/cosmos/ibc-go/v4/modules/core/23-commitment/types"; - -import "gogoproto/gogo.proto"; -import "confio/proofs.proto"; - -// MerkleRoot defines a merkle root hash. -// In the Cosmos SDK, the AppHash of a block header becomes the root. -message MerkleRoot { - option (gogoproto.goproto_getters) = false; - - bytes hash = 1; -} - -// MerklePrefix is merkle path prefixed to the key. -// The constructed key from the Path and the key will be append(Path.KeyPath, -// append(Path.KeyPrefix, key...)) -message MerklePrefix { - bytes key_prefix = 1 [(gogoproto.moretags) = "yaml:\"key_prefix\""]; -} - -// MerklePath is the path used to verify commitment proofs, which can be an -// arbitrary structured object (defined by a commitment type). -// MerklePath is represented from root-to-leaf -message MerklePath { - option (gogoproto.goproto_stringer) = false; - - repeated string key_path = 1 [(gogoproto.moretags) = "yaml:\"key_path\""]; -} - -// MerkleProof is a wrapper type over a chain of CommitmentProofs. -// It demonstrates membership or non-membership for an element or set of -// elements, verifiable in conjunction with a known commitment root. Proofs -// should be succinct. -// MerkleProofs are ordered from leaf-to-root -message MerkleProof { - repeated ics23.CommitmentProof proofs = 1; -} diff --git a/third_party/proto/ibc/core/connection/v1/connection.proto b/third_party/proto/ibc/core/connection/v1/connection.proto deleted file mode 100644 index 29e998568d..0000000000 --- a/third_party/proto/ibc/core/connection/v1/connection.proto +++ /dev/null @@ -1,114 +0,0 @@ -syntax = "proto3"; - -package ibc.core.connection.v1; - -option go_package = "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types"; - -import "gogoproto/gogo.proto"; -import "ibc/core/commitment/v1/commitment.proto"; - -// ICS03 - Connection Data Structures as defined in -// https://github.com/cosmos/ics/tree/master/spec/ics-003-connection-semantics#data-structures - -// ConnectionEnd defines a stateful object on a chain connected to another -// separate one. -// NOTE: there must only be 2 defined ConnectionEnds to establish -// a connection between two chains. -message ConnectionEnd { - option (gogoproto.goproto_getters) = false; - // client associated with this connection. - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // IBC version which can be utilised to determine encodings or protocols for - // channels or packets utilising this connection. - repeated Version versions = 2; - // current state of the connection end. - State state = 3; - // counterparty chain associated with this connection. - Counterparty counterparty = 4 [(gogoproto.nullable) = false]; - // delay period that must pass before a consensus state can be used for - // packet-verification NOTE: delay period logic is only implemented by some - // clients. - uint64 delay_period = 5 [(gogoproto.moretags) = "yaml:\"delay_period\""]; -} - -// IdentifiedConnection defines a connection with additional connection -// identifier field. -message IdentifiedConnection { - option (gogoproto.goproto_getters) = false; - // connection identifier. - string id = 1 [(gogoproto.moretags) = "yaml:\"id\""]; - // client associated with this connection. - string client_id = 2 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // IBC version which can be utilised to determine encodings or protocols for - // channels or packets utilising this connection - repeated Version versions = 3; - // current state of the connection end. - State state = 4; - // counterparty chain associated with this connection. - Counterparty counterparty = 5 [(gogoproto.nullable) = false]; - // delay period associated with this connection. - uint64 delay_period = 6 [(gogoproto.moretags) = "yaml:\"delay_period\""]; -} - -// State defines if a connection is in one of the following states: -// INIT, TRYOPEN, OPEN or UNINITIALIZED. -enum State { - option (gogoproto.goproto_enum_prefix) = false; - - // Default State - STATE_UNINITIALIZED_UNSPECIFIED = 0 [(gogoproto.enumvalue_customname) = "UNINITIALIZED"]; - // A connection end has just started the opening handshake. - STATE_INIT = 1 [(gogoproto.enumvalue_customname) = "INIT"]; - // A connection end has acknowledged the handshake step on the counterparty - // chain. - STATE_TRYOPEN = 2 [(gogoproto.enumvalue_customname) = "TRYOPEN"]; - // A connection end has completed the handshake. - STATE_OPEN = 3 [(gogoproto.enumvalue_customname) = "OPEN"]; -} - -// Counterparty defines the counterparty chain associated with a connection end. -message Counterparty { - option (gogoproto.goproto_getters) = false; - - // identifies the client on the counterparty chain associated with a given - // connection. - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // identifies the connection end on the counterparty chain associated with a - // given connection. - string connection_id = 2 [(gogoproto.moretags) = "yaml:\"connection_id\""]; - // commitment merkle prefix of the counterparty chain. - ibc.core.commitment.v1.MerklePrefix prefix = 3 [(gogoproto.nullable) = false]; -} - -// ClientPaths define all the connection paths for a client state. -message ClientPaths { - // list of connection paths - repeated string paths = 1; -} - -// ConnectionPaths define all the connection paths for a given client state. -message ConnectionPaths { - // client state unique identifier - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // list of connection paths - repeated string paths = 2; -} - -// Version defines the versioning scheme used to negotiate the IBC verison in -// the connection handshake. -message Version { - option (gogoproto.goproto_getters) = false; - - // unique version identifier - string identifier = 1; - // list of features compatible with the specified identifier - repeated string features = 2; -} - -// Params defines the set of Connection parameters. -message Params { - // maximum expected time per block (in nanoseconds), used to enforce block delay. This parameter should reflect the - // largest amount of time that the chain might reasonably take to produce the next block under normal operating - // conditions. A safe choice is 3-5x the expected time per block. - uint64 max_expected_time_per_block = 1 [(gogoproto.moretags) = "yaml:\"max_expected_time_per_block\""]; -} diff --git a/third_party/proto/ibc/core/connection/v1/genesis.proto b/third_party/proto/ibc/core/connection/v1/genesis.proto deleted file mode 100644 index f616ae67e0..0000000000 --- a/third_party/proto/ibc/core/connection/v1/genesis.proto +++ /dev/null @@ -1,18 +0,0 @@ -syntax = "proto3"; - -package ibc.core.connection.v1; - -option go_package = "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types"; - -import "gogoproto/gogo.proto"; -import "ibc/core/connection/v1/connection.proto"; - -// GenesisState defines the ibc connection submodule's genesis state. -message GenesisState { - repeated IdentifiedConnection connections = 1 [(gogoproto.nullable) = false]; - repeated ConnectionPaths client_connection_paths = 2 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"client_connection_paths\""]; - // the sequence for the next generated connection identifier - uint64 next_connection_sequence = 3 [(gogoproto.moretags) = "yaml:\"next_connection_sequence\""]; - Params params = 4 [(gogoproto.nullable) = false]; -} diff --git a/third_party/proto/ibc/core/connection/v1/query.proto b/third_party/proto/ibc/core/connection/v1/query.proto deleted file mode 100644 index 129f30a71a..0000000000 --- a/third_party/proto/ibc/core/connection/v1/query.proto +++ /dev/null @@ -1,138 +0,0 @@ -syntax = "proto3"; - -package ibc.core.connection.v1; - -option go_package = "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types"; - -import "gogoproto/gogo.proto"; -import "cosmos/base/query/v1beta1/pagination.proto"; -import "ibc/core/client/v1/client.proto"; -import "ibc/core/connection/v1/connection.proto"; -import "google/api/annotations.proto"; -import "google/protobuf/any.proto"; - -// Query provides defines the gRPC querier service -service Query { - // Connection queries an IBC connection end. - rpc Connection(QueryConnectionRequest) returns (QueryConnectionResponse) { - option (google.api.http).get = "/ibc/core/connection/v1/connections/{connection_id}"; - } - - // Connections queries all the IBC connections of a chain. - rpc Connections(QueryConnectionsRequest) returns (QueryConnectionsResponse) { - option (google.api.http).get = "/ibc/core/connection/v1/connections"; - } - - // ClientConnections queries the connection paths associated with a client - // state. - rpc ClientConnections(QueryClientConnectionsRequest) returns (QueryClientConnectionsResponse) { - option (google.api.http).get = "/ibc/core/connection/v1/client_connections/{client_id}"; - } - - // ConnectionClientState queries the client state associated with the - // connection. - rpc ConnectionClientState(QueryConnectionClientStateRequest) returns (QueryConnectionClientStateResponse) { - option (google.api.http).get = "/ibc/core/connection/v1/connections/{connection_id}/client_state"; - } - - // ConnectionConsensusState queries the consensus state associated with the - // connection. - rpc ConnectionConsensusState(QueryConnectionConsensusStateRequest) returns (QueryConnectionConsensusStateResponse) { - option (google.api.http).get = "/ibc/core/connection/v1/connections/{connection_id}/consensus_state/" - "revision/{revision_number}/height/{revision_height}"; - } -} - -// QueryConnectionRequest is the request type for the Query/Connection RPC -// method -message QueryConnectionRequest { - // connection unique identifier - string connection_id = 1; -} - -// QueryConnectionResponse is the response type for the Query/Connection RPC -// method. Besides the connection end, it includes a proof and the height from -// which the proof was retrieved. -message QueryConnectionResponse { - // connection associated with the request identifier - ibc.core.connection.v1.ConnectionEnd connection = 1; - // merkle proof of existence - bytes proof = 2; - // height at which the proof was retrieved - ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false]; -} - -// QueryConnectionsRequest is the request type for the Query/Connections RPC -// method -message QueryConnectionsRequest { - cosmos.base.query.v1beta1.PageRequest pagination = 1; -} - -// QueryConnectionsResponse is the response type for the Query/Connections RPC -// method. -message QueryConnectionsResponse { - // list of stored connections of the chain. - repeated ibc.core.connection.v1.IdentifiedConnection connections = 1; - // pagination response - cosmos.base.query.v1beta1.PageResponse pagination = 2; - // query block height - ibc.core.client.v1.Height height = 3 [(gogoproto.nullable) = false]; -} - -// QueryClientConnectionsRequest is the request type for the -// Query/ClientConnections RPC method -message QueryClientConnectionsRequest { - // client identifier associated with a connection - string client_id = 1; -} - -// QueryClientConnectionsResponse is the response type for the -// Query/ClientConnections RPC method -message QueryClientConnectionsResponse { - // slice of all the connection paths associated with a client. - repeated string connection_paths = 1; - // merkle proof of existence - bytes proof = 2; - // height at which the proof was generated - ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false]; -} - -// QueryConnectionClientStateRequest is the request type for the -// Query/ConnectionClientState RPC method -message QueryConnectionClientStateRequest { - // connection identifier - string connection_id = 1 [(gogoproto.moretags) = "yaml:\"connection_id\""]; -} - -// QueryConnectionClientStateResponse is the response type for the -// Query/ConnectionClientState RPC method -message QueryConnectionClientStateResponse { - // client state associated with the channel - ibc.core.client.v1.IdentifiedClientState identified_client_state = 1; - // merkle proof of existence - bytes proof = 2; - // height at which the proof was retrieved - ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false]; -} - -// QueryConnectionConsensusStateRequest is the request type for the -// Query/ConnectionConsensusState RPC method -message QueryConnectionConsensusStateRequest { - // connection identifier - string connection_id = 1 [(gogoproto.moretags) = "yaml:\"connection_id\""]; - uint64 revision_number = 2; - uint64 revision_height = 3; -} - -// QueryConnectionConsensusStateResponse is the response type for the -// Query/ConnectionConsensusState RPC method -message QueryConnectionConsensusStateResponse { - // consensus state associated with the channel - google.protobuf.Any consensus_state = 1; - // client ID associated with the consensus state - string client_id = 2; - // merkle proof of existence - bytes proof = 3; - // height at which the proof was retrieved - ibc.core.client.v1.Height proof_height = 4 [(gogoproto.nullable) = false]; -} diff --git a/third_party/proto/ibc/core/connection/v1/tx.proto b/third_party/proto/ibc/core/connection/v1/tx.proto deleted file mode 100644 index 1ca0b40400..0000000000 --- a/third_party/proto/ibc/core/connection/v1/tx.proto +++ /dev/null @@ -1,119 +0,0 @@ -syntax = "proto3"; - -package ibc.core.connection.v1; - -option go_package = "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types"; - -import "gogoproto/gogo.proto"; -import "google/protobuf/any.proto"; -import "ibc/core/client/v1/client.proto"; -import "ibc/core/connection/v1/connection.proto"; - -// Msg defines the ibc/connection Msg service. -service Msg { - // ConnectionOpenInit defines a rpc handler method for MsgConnectionOpenInit. - rpc ConnectionOpenInit(MsgConnectionOpenInit) returns (MsgConnectionOpenInitResponse); - - // ConnectionOpenTry defines a rpc handler method for MsgConnectionOpenTry. - rpc ConnectionOpenTry(MsgConnectionOpenTry) returns (MsgConnectionOpenTryResponse); - - // ConnectionOpenAck defines a rpc handler method for MsgConnectionOpenAck. - rpc ConnectionOpenAck(MsgConnectionOpenAck) returns (MsgConnectionOpenAckResponse); - - // ConnectionOpenConfirm defines a rpc handler method for - // MsgConnectionOpenConfirm. - rpc ConnectionOpenConfirm(MsgConnectionOpenConfirm) returns (MsgConnectionOpenConfirmResponse); -} - -// MsgConnectionOpenInit defines the msg sent by an account on Chain A to -// initialize a connection with Chain B. -message MsgConnectionOpenInit { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - Counterparty counterparty = 2 [(gogoproto.nullable) = false]; - Version version = 3; - uint64 delay_period = 4 [(gogoproto.moretags) = "yaml:\"delay_period\""]; - string signer = 5; -} - -// MsgConnectionOpenInitResponse defines the Msg/ConnectionOpenInit response -// type. -message MsgConnectionOpenInitResponse {} - -// MsgConnectionOpenTry defines a msg sent by a Relayer to try to open a -// connection on Chain B. -message MsgConnectionOpenTry { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // in the case of crossing hello's, when both chains call OpenInit, we need - // the connection identifier of the previous connection in state INIT - string previous_connection_id = 2 [(gogoproto.moretags) = "yaml:\"previous_connection_id\""]; - google.protobuf.Any client_state = 3 [(gogoproto.moretags) = "yaml:\"client_state\""]; - Counterparty counterparty = 4 [(gogoproto.nullable) = false]; - uint64 delay_period = 5 [(gogoproto.moretags) = "yaml:\"delay_period\""]; - repeated Version counterparty_versions = 6 [(gogoproto.moretags) = "yaml:\"counterparty_versions\""]; - ibc.core.client.v1.Height proof_height = 7 - [(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false]; - // proof of the initialization the connection on Chain A: `UNITIALIZED -> - // INIT` - bytes proof_init = 8 [(gogoproto.moretags) = "yaml:\"proof_init\""]; - // proof of client state included in message - bytes proof_client = 9 [(gogoproto.moretags) = "yaml:\"proof_client\""]; - // proof of client consensus state - bytes proof_consensus = 10 [(gogoproto.moretags) = "yaml:\"proof_consensus\""]; - ibc.core.client.v1.Height consensus_height = 11 - [(gogoproto.moretags) = "yaml:\"consensus_height\"", (gogoproto.nullable) = false]; - string signer = 12; -} - -// MsgConnectionOpenTryResponse defines the Msg/ConnectionOpenTry response type. -message MsgConnectionOpenTryResponse {} - -// MsgConnectionOpenAck defines a msg sent by a Relayer to Chain A to -// acknowledge the change of connection state to TRYOPEN on Chain B. -message MsgConnectionOpenAck { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string connection_id = 1 [(gogoproto.moretags) = "yaml:\"connection_id\""]; - string counterparty_connection_id = 2 [(gogoproto.moretags) = "yaml:\"counterparty_connection_id\""]; - Version version = 3; - google.protobuf.Any client_state = 4 [(gogoproto.moretags) = "yaml:\"client_state\""]; - ibc.core.client.v1.Height proof_height = 5 - [(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false]; - // proof of the initialization the connection on Chain B: `UNITIALIZED -> - // TRYOPEN` - bytes proof_try = 6 [(gogoproto.moretags) = "yaml:\"proof_try\""]; - // proof of client state included in message - bytes proof_client = 7 [(gogoproto.moretags) = "yaml:\"proof_client\""]; - // proof of client consensus state - bytes proof_consensus = 8 [(gogoproto.moretags) = "yaml:\"proof_consensus\""]; - ibc.core.client.v1.Height consensus_height = 9 - [(gogoproto.moretags) = "yaml:\"consensus_height\"", (gogoproto.nullable) = false]; - string signer = 10; -} - -// MsgConnectionOpenAckResponse defines the Msg/ConnectionOpenAck response type. -message MsgConnectionOpenAckResponse {} - -// MsgConnectionOpenConfirm defines a msg sent by a Relayer to Chain B to -// acknowledge the change of connection state to OPEN on Chain A. -message MsgConnectionOpenConfirm { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - string connection_id = 1 [(gogoproto.moretags) = "yaml:\"connection_id\""]; - // proof for the change of the connection state on Chain A: `INIT -> OPEN` - bytes proof_ack = 2 [(gogoproto.moretags) = "yaml:\"proof_ack\""]; - ibc.core.client.v1.Height proof_height = 3 - [(gogoproto.moretags) = "yaml:\"proof_height\"", (gogoproto.nullable) = false]; - string signer = 4; -} - -// MsgConnectionOpenConfirmResponse defines the Msg/ConnectionOpenConfirm -// response type. -message MsgConnectionOpenConfirmResponse {} diff --git a/third_party/proto/ibc/core/types/v1/genesis.proto b/third_party/proto/ibc/core/types/v1/genesis.proto deleted file mode 100644 index 4cc931d32f..0000000000 --- a/third_party/proto/ibc/core/types/v1/genesis.proto +++ /dev/null @@ -1,23 +0,0 @@ -syntax = "proto3"; - -package ibc.core.types.v1; - -option go_package = "github.com/cosmos/ibc-go/v4/modules/core/types"; - -import "gogoproto/gogo.proto"; -import "ibc/core/client/v1/genesis.proto"; -import "ibc/core/connection/v1/genesis.proto"; -import "ibc/core/channel/v1/genesis.proto"; - -// GenesisState defines the ibc module's genesis state. -message GenesisState { - // ICS002 - Clients genesis state - ibc.core.client.v1.GenesisState client_genesis = 1 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"client_genesis\""]; - // ICS003 - Connections genesis state - ibc.core.connection.v1.GenesisState connection_genesis = 2 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"connection_genesis\""]; - // ICS004 - Channel genesis state - ibc.core.channel.v1.GenesisState channel_genesis = 3 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"channel_genesis\""]; -} diff --git a/third_party/proto/ibc/lightclients/localhost/v1/localhost.proto b/third_party/proto/ibc/lightclients/localhost/v1/localhost.proto deleted file mode 100644 index 9eda835ebb..0000000000 --- a/third_party/proto/ibc/lightclients/localhost/v1/localhost.proto +++ /dev/null @@ -1,18 +0,0 @@ -syntax = "proto3"; - -package ibc.lightclients.localhost.v1; - -option go_package = "github.com/cosmos/ibc-go/v4/modules/light-clients/09-localhost/types"; - -import "gogoproto/gogo.proto"; -import "ibc/core/client/v1/client.proto"; - -// ClientState defines a loopback (localhost) client. It requires (read-only) -// access to keys outside the client prefix. -message ClientState { - option (gogoproto.goproto_getters) = false; - // self chain ID - string chain_id = 1 [(gogoproto.moretags) = "yaml:\"chain_id\""]; - // self latest block height - ibc.core.client.v1.Height height = 2 [(gogoproto.nullable) = false]; -} diff --git a/third_party/proto/ibc/lightclients/solomachine/v1/solomachine.proto b/third_party/proto/ibc/lightclients/solomachine/v1/solomachine.proto deleted file mode 100644 index 37bd81e923..0000000000 --- a/third_party/proto/ibc/lightclients/solomachine/v1/solomachine.proto +++ /dev/null @@ -1,189 +0,0 @@ -syntax = "proto3"; - -package ibc.lightclients.solomachine.v1; - -option go_package = "github.com/cosmos/ibc-go/v4/modules/core/02-client/legacy/v100"; - -import "ibc/core/connection/v1/connection.proto"; -import "ibc/core/channel/v1/channel.proto"; -import "gogoproto/gogo.proto"; -import "google/protobuf/any.proto"; - -// ClientState defines a solo machine client that tracks the current consensus -// state and if the client is frozen. -message ClientState { - option (gogoproto.goproto_getters) = false; - // latest sequence of the client state - uint64 sequence = 1; - // frozen sequence of the solo machine - uint64 frozen_sequence = 2 [(gogoproto.moretags) = "yaml:\"frozen_sequence\""]; - ConsensusState consensus_state = 3 [(gogoproto.moretags) = "yaml:\"consensus_state\""]; - // when set to true, will allow governance to update a solo machine client. - // The client will be unfrozen if it is frozen. - bool allow_update_after_proposal = 4 [(gogoproto.moretags) = "yaml:\"allow_update_after_proposal\""]; -} - -// ConsensusState defines a solo machine consensus state. The sequence of a -// consensus state is contained in the "height" key used in storing the -// consensus state. -message ConsensusState { - option (gogoproto.goproto_getters) = false; - // public key of the solo machine - google.protobuf.Any public_key = 1 [(gogoproto.moretags) = "yaml:\"public_key\""]; - // diversifier allows the same public key to be re-used across different solo - // machine clients (potentially on different chains) without being considered - // misbehaviour. - string diversifier = 2; - uint64 timestamp = 3; -} - -// Header defines a solo machine consensus header -message Header { - option (gogoproto.goproto_getters) = false; - // sequence to update solo machine public key at - uint64 sequence = 1; - uint64 timestamp = 2; - bytes signature = 3; - google.protobuf.Any new_public_key = 4 [(gogoproto.moretags) = "yaml:\"new_public_key\""]; - string new_diversifier = 5 [(gogoproto.moretags) = "yaml:\"new_diversifier\""]; -} - -// Misbehaviour defines misbehaviour for a solo machine which consists -// of a sequence and two signatures over different messages at that sequence. -message Misbehaviour { - option (gogoproto.goproto_getters) = false; - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - uint64 sequence = 2; - SignatureAndData signature_one = 3 [(gogoproto.moretags) = "yaml:\"signature_one\""]; - SignatureAndData signature_two = 4 [(gogoproto.moretags) = "yaml:\"signature_two\""]; -} - -// SignatureAndData contains a signature and the data signed over to create that -// signature. -message SignatureAndData { - option (gogoproto.goproto_getters) = false; - bytes signature = 1; - DataType data_type = 2 [(gogoproto.moretags) = "yaml:\"data_type\""]; - bytes data = 3; - uint64 timestamp = 4; -} - -// TimestampedSignatureData contains the signature data and the timestamp of the -// signature. -message TimestampedSignatureData { - option (gogoproto.goproto_getters) = false; - bytes signature_data = 1 [(gogoproto.moretags) = "yaml:\"signature_data\""]; - uint64 timestamp = 2; -} - -// SignBytes defines the signed bytes used for signature verification. -message SignBytes { - option (gogoproto.goproto_getters) = false; - - uint64 sequence = 1; - uint64 timestamp = 2; - string diversifier = 3; - // type of the data used - DataType data_type = 4 [(gogoproto.moretags) = "yaml:\"data_type\""]; - // marshaled data - bytes data = 5; -} - -// DataType defines the type of solo machine proof being created. This is done -// to preserve uniqueness of different data sign byte encodings. -enum DataType { - option (gogoproto.goproto_enum_prefix) = false; - - // Default State - DATA_TYPE_UNINITIALIZED_UNSPECIFIED = 0 [(gogoproto.enumvalue_customname) = "UNSPECIFIED"]; - // Data type for client state verification - DATA_TYPE_CLIENT_STATE = 1 [(gogoproto.enumvalue_customname) = "CLIENT"]; - // Data type for consensus state verification - DATA_TYPE_CONSENSUS_STATE = 2 [(gogoproto.enumvalue_customname) = "CONSENSUS"]; - // Data type for connection state verification - DATA_TYPE_CONNECTION_STATE = 3 [(gogoproto.enumvalue_customname) = "CONNECTION"]; - // Data type for channel state verification - DATA_TYPE_CHANNEL_STATE = 4 [(gogoproto.enumvalue_customname) = "CHANNEL"]; - // Data type for packet commitment verification - DATA_TYPE_PACKET_COMMITMENT = 5 [(gogoproto.enumvalue_customname) = "PACKETCOMMITMENT"]; - // Data type for packet acknowledgement verification - DATA_TYPE_PACKET_ACKNOWLEDGEMENT = 6 [(gogoproto.enumvalue_customname) = "PACKETACKNOWLEDGEMENT"]; - // Data type for packet receipt absence verification - DATA_TYPE_PACKET_RECEIPT_ABSENCE = 7 [(gogoproto.enumvalue_customname) = "PACKETRECEIPTABSENCE"]; - // Data type for next sequence recv verification - DATA_TYPE_NEXT_SEQUENCE_RECV = 8 [(gogoproto.enumvalue_customname) = "NEXTSEQUENCERECV"]; - // Data type for header verification - DATA_TYPE_HEADER = 9 [(gogoproto.enumvalue_customname) = "HEADER"]; -} - -// HeaderData returns the SignBytes data for update verification. -message HeaderData { - option (gogoproto.goproto_getters) = false; - - // header public key - google.protobuf.Any new_pub_key = 1 [(gogoproto.moretags) = "yaml:\"new_pub_key\""]; - // header diversifier - string new_diversifier = 2 [(gogoproto.moretags) = "yaml:\"new_diversifier\""]; -} - -// ClientStateData returns the SignBytes data for client state verification. -message ClientStateData { - option (gogoproto.goproto_getters) = false; - - bytes path = 1; - google.protobuf.Any client_state = 2 [(gogoproto.moretags) = "yaml:\"client_state\""]; -} - -// ConsensusStateData returns the SignBytes data for consensus state -// verification. -message ConsensusStateData { - option (gogoproto.goproto_getters) = false; - - bytes path = 1; - google.protobuf.Any consensus_state = 2 [(gogoproto.moretags) = "yaml:\"consensus_state\""]; -} - -// ConnectionStateData returns the SignBytes data for connection state -// verification. -message ConnectionStateData { - option (gogoproto.goproto_getters) = false; - - bytes path = 1; - ibc.core.connection.v1.ConnectionEnd connection = 2; -} - -// ChannelStateData returns the SignBytes data for channel state -// verification. -message ChannelStateData { - option (gogoproto.goproto_getters) = false; - - bytes path = 1; - ibc.core.channel.v1.Channel channel = 2; -} - -// PacketCommitmentData returns the SignBytes data for packet commitment -// verification. -message PacketCommitmentData { - bytes path = 1; - bytes commitment = 2; -} - -// PacketAcknowledgementData returns the SignBytes data for acknowledgement -// verification. -message PacketAcknowledgementData { - bytes path = 1; - bytes acknowledgement = 2; -} - -// PacketReceiptAbsenceData returns the SignBytes data for -// packet receipt absence verification. -message PacketReceiptAbsenceData { - bytes path = 1; -} - -// NextSequenceRecvData returns the SignBytes data for verification of the next -// sequence to be received. -message NextSequenceRecvData { - bytes path = 1; - uint64 next_seq_recv = 2 [(gogoproto.moretags) = "yaml:\"next_seq_recv\""]; -} diff --git a/third_party/proto/ibc/lightclients/solomachine/v2/solomachine.proto b/third_party/proto/ibc/lightclients/solomachine/v2/solomachine.proto deleted file mode 100644 index c735fddddf..0000000000 --- a/third_party/proto/ibc/lightclients/solomachine/v2/solomachine.proto +++ /dev/null @@ -1,189 +0,0 @@ -syntax = "proto3"; - -package ibc.lightclients.solomachine.v2; - -option go_package = "github.com/cosmos/ibc-go/v4/modules/light-clients/06-solomachine/types"; - -import "ibc/core/connection/v1/connection.proto"; -import "ibc/core/channel/v1/channel.proto"; -import "gogoproto/gogo.proto"; -import "google/protobuf/any.proto"; - -// ClientState defines a solo machine client that tracks the current consensus -// state and if the client is frozen. -message ClientState { - option (gogoproto.goproto_getters) = false; - // latest sequence of the client state - uint64 sequence = 1; - // frozen sequence of the solo machine - bool is_frozen = 2 [(gogoproto.moretags) = "yaml:\"is_frozen\""]; - ConsensusState consensus_state = 3 [(gogoproto.moretags) = "yaml:\"consensus_state\""]; - // when set to true, will allow governance to update a solo machine client. - // The client will be unfrozen if it is frozen. - bool allow_update_after_proposal = 4 [(gogoproto.moretags) = "yaml:\"allow_update_after_proposal\""]; -} - -// ConsensusState defines a solo machine consensus state. The sequence of a -// consensus state is contained in the "height" key used in storing the -// consensus state. -message ConsensusState { - option (gogoproto.goproto_getters) = false; - // public key of the solo machine - google.protobuf.Any public_key = 1 [(gogoproto.moretags) = "yaml:\"public_key\""]; - // diversifier allows the same public key to be re-used across different solo - // machine clients (potentially on different chains) without being considered - // misbehaviour. - string diversifier = 2; - uint64 timestamp = 3; -} - -// Header defines a solo machine consensus header -message Header { - option (gogoproto.goproto_getters) = false; - // sequence to update solo machine public key at - uint64 sequence = 1; - uint64 timestamp = 2; - bytes signature = 3; - google.protobuf.Any new_public_key = 4 [(gogoproto.moretags) = "yaml:\"new_public_key\""]; - string new_diversifier = 5 [(gogoproto.moretags) = "yaml:\"new_diversifier\""]; -} - -// Misbehaviour defines misbehaviour for a solo machine which consists -// of a sequence and two signatures over different messages at that sequence. -message Misbehaviour { - option (gogoproto.goproto_getters) = false; - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - uint64 sequence = 2; - SignatureAndData signature_one = 3 [(gogoproto.moretags) = "yaml:\"signature_one\""]; - SignatureAndData signature_two = 4 [(gogoproto.moretags) = "yaml:\"signature_two\""]; -} - -// SignatureAndData contains a signature and the data signed over to create that -// signature. -message SignatureAndData { - option (gogoproto.goproto_getters) = false; - bytes signature = 1; - DataType data_type = 2 [(gogoproto.moretags) = "yaml:\"data_type\""]; - bytes data = 3; - uint64 timestamp = 4; -} - -// TimestampedSignatureData contains the signature data and the timestamp of the -// signature. -message TimestampedSignatureData { - option (gogoproto.goproto_getters) = false; - bytes signature_data = 1 [(gogoproto.moretags) = "yaml:\"signature_data\""]; - uint64 timestamp = 2; -} - -// SignBytes defines the signed bytes used for signature verification. -message SignBytes { - option (gogoproto.goproto_getters) = false; - - uint64 sequence = 1; - uint64 timestamp = 2; - string diversifier = 3; - // type of the data used - DataType data_type = 4 [(gogoproto.moretags) = "yaml:\"data_type\""]; - // marshaled data - bytes data = 5; -} - -// DataType defines the type of solo machine proof being created. This is done -// to preserve uniqueness of different data sign byte encodings. -enum DataType { - option (gogoproto.goproto_enum_prefix) = false; - - // Default State - DATA_TYPE_UNINITIALIZED_UNSPECIFIED = 0 [(gogoproto.enumvalue_customname) = "UNSPECIFIED"]; - // Data type for client state verification - DATA_TYPE_CLIENT_STATE = 1 [(gogoproto.enumvalue_customname) = "CLIENT"]; - // Data type for consensus state verification - DATA_TYPE_CONSENSUS_STATE = 2 [(gogoproto.enumvalue_customname) = "CONSENSUS"]; - // Data type for connection state verification - DATA_TYPE_CONNECTION_STATE = 3 [(gogoproto.enumvalue_customname) = "CONNECTION"]; - // Data type for channel state verification - DATA_TYPE_CHANNEL_STATE = 4 [(gogoproto.enumvalue_customname) = "CHANNEL"]; - // Data type for packet commitment verification - DATA_TYPE_PACKET_COMMITMENT = 5 [(gogoproto.enumvalue_customname) = "PACKETCOMMITMENT"]; - // Data type for packet acknowledgement verification - DATA_TYPE_PACKET_ACKNOWLEDGEMENT = 6 [(gogoproto.enumvalue_customname) = "PACKETACKNOWLEDGEMENT"]; - // Data type for packet receipt absence verification - DATA_TYPE_PACKET_RECEIPT_ABSENCE = 7 [(gogoproto.enumvalue_customname) = "PACKETRECEIPTABSENCE"]; - // Data type for next sequence recv verification - DATA_TYPE_NEXT_SEQUENCE_RECV = 8 [(gogoproto.enumvalue_customname) = "NEXTSEQUENCERECV"]; - // Data type for header verification - DATA_TYPE_HEADER = 9 [(gogoproto.enumvalue_customname) = "HEADER"]; -} - -// HeaderData returns the SignBytes data for update verification. -message HeaderData { - option (gogoproto.goproto_getters) = false; - - // header public key - google.protobuf.Any new_pub_key = 1 [(gogoproto.moretags) = "yaml:\"new_pub_key\""]; - // header diversifier - string new_diversifier = 2 [(gogoproto.moretags) = "yaml:\"new_diversifier\""]; -} - -// ClientStateData returns the SignBytes data for client state verification. -message ClientStateData { - option (gogoproto.goproto_getters) = false; - - bytes path = 1; - google.protobuf.Any client_state = 2 [(gogoproto.moretags) = "yaml:\"client_state\""]; -} - -// ConsensusStateData returns the SignBytes data for consensus state -// verification. -message ConsensusStateData { - option (gogoproto.goproto_getters) = false; - - bytes path = 1; - google.protobuf.Any consensus_state = 2 [(gogoproto.moretags) = "yaml:\"consensus_state\""]; -} - -// ConnectionStateData returns the SignBytes data for connection state -// verification. -message ConnectionStateData { - option (gogoproto.goproto_getters) = false; - - bytes path = 1; - ibc.core.connection.v1.ConnectionEnd connection = 2; -} - -// ChannelStateData returns the SignBytes data for channel state -// verification. -message ChannelStateData { - option (gogoproto.goproto_getters) = false; - - bytes path = 1; - ibc.core.channel.v1.Channel channel = 2; -} - -// PacketCommitmentData returns the SignBytes data for packet commitment -// verification. -message PacketCommitmentData { - bytes path = 1; - bytes commitment = 2; -} - -// PacketAcknowledgementData returns the SignBytes data for acknowledgement -// verification. -message PacketAcknowledgementData { - bytes path = 1; - bytes acknowledgement = 2; -} - -// PacketReceiptAbsenceData returns the SignBytes data for -// packet receipt absence verification. -message PacketReceiptAbsenceData { - bytes path = 1; -} - -// NextSequenceRecvData returns the SignBytes data for verification of the next -// sequence to be received. -message NextSequenceRecvData { - bytes path = 1; - uint64 next_seq_recv = 2 [(gogoproto.moretags) = "yaml:\"next_seq_recv\""]; -} diff --git a/third_party/proto/ibc/lightclients/tendermint/v1/tendermint.proto b/third_party/proto/ibc/lightclients/tendermint/v1/tendermint.proto deleted file mode 100644 index 7dd925f58d..0000000000 --- a/third_party/proto/ibc/lightclients/tendermint/v1/tendermint.proto +++ /dev/null @@ -1,115 +0,0 @@ -syntax = "proto3"; - -package ibc.lightclients.tendermint.v1; - -option go_package = "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types"; - -import "tendermint/types/validator.proto"; -import "tendermint/types/types.proto"; -import "confio/proofs.proto"; -import "google/protobuf/duration.proto"; -import "google/protobuf/timestamp.proto"; -import "ibc/core/client/v1/client.proto"; -import "ibc/core/commitment/v1/commitment.proto"; -import "gogoproto/gogo.proto"; - -// ClientState from Tendermint tracks the current validator set, latest height, -// and a possible frozen height. -message ClientState { - option (gogoproto.goproto_getters) = false; - - string chain_id = 1; - Fraction trust_level = 2 [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"trust_level\""]; - // duration of the period since the LastestTimestamp during which the - // submitted headers are valid for upgrade - google.protobuf.Duration trusting_period = 3 - [(gogoproto.nullable) = false, (gogoproto.stdduration) = true, (gogoproto.moretags) = "yaml:\"trusting_period\""]; - // duration of the staking unbonding period - google.protobuf.Duration unbonding_period = 4 [ - (gogoproto.nullable) = false, - (gogoproto.stdduration) = true, - (gogoproto.moretags) = "yaml:\"unbonding_period\"" - ]; - // defines how much new (untrusted) header's Time can drift into the future. - google.protobuf.Duration max_clock_drift = 5 - [(gogoproto.nullable) = false, (gogoproto.stdduration) = true, (gogoproto.moretags) = "yaml:\"max_clock_drift\""]; - // Block height when the client was frozen due to a misbehaviour - ibc.core.client.v1.Height frozen_height = 6 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"frozen_height\""]; - // Latest height the client was updated to - ibc.core.client.v1.Height latest_height = 7 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"latest_height\""]; - - // Proof specifications used in verifying counterparty state - repeated ics23.ProofSpec proof_specs = 8 [(gogoproto.moretags) = "yaml:\"proof_specs\""]; - - // Path at which next upgraded client will be committed. - // Each element corresponds to the key for a single CommitmentProof in the - // chained proof. NOTE: ClientState must stored under - // `{upgradePath}/{upgradeHeight}/clientState` ConsensusState must be stored - // under `{upgradepath}/{upgradeHeight}/consensusState` For SDK chains using - // the default upgrade module, upgrade_path should be []string{"upgrade", - // "upgradedIBCState"}` - repeated string upgrade_path = 9 [(gogoproto.moretags) = "yaml:\"upgrade_path\""]; - - // This flag, when set to true, will allow governance to recover a client - // which has expired - bool allow_update_after_expiry = 10 [(gogoproto.moretags) = "yaml:\"allow_update_after_expiry\""]; - // This flag, when set to true, will allow governance to unfreeze a client - // whose chain has experienced a misbehaviour event - bool allow_update_after_misbehaviour = 11 [(gogoproto.moretags) = "yaml:\"allow_update_after_misbehaviour\""]; -} - -// ConsensusState defines the consensus state from Tendermint. -message ConsensusState { - option (gogoproto.goproto_getters) = false; - - // timestamp that corresponds to the block height in which the ConsensusState - // was stored. - google.protobuf.Timestamp timestamp = 1 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; - // commitment root (i.e app hash) - ibc.core.commitment.v1.MerkleRoot root = 2 [(gogoproto.nullable) = false]; - bytes next_validators_hash = 3 [ - (gogoproto.casttype) = "github.com/tendermint/tendermint/libs/bytes.HexBytes", - (gogoproto.moretags) = "yaml:\"next_validators_hash\"" - ]; -} - -// Misbehaviour is a wrapper over two conflicting Headers -// that implements Misbehaviour interface expected by ICS-02 -message Misbehaviour { - option (gogoproto.goproto_getters) = false; - - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - Header header_1 = 2 [(gogoproto.customname) = "Header1", (gogoproto.moretags) = "yaml:\"header_1\""]; - Header header_2 = 3 [(gogoproto.customname) = "Header2", (gogoproto.moretags) = "yaml:\"header_2\""]; -} - -// Header defines the Tendermint client consensus Header. -// It encapsulates all the information necessary to update from a trusted -// Tendermint ConsensusState. The inclusion of TrustedHeight and -// TrustedValidators allows this update to process correctly, so long as the -// ConsensusState for the TrustedHeight exists, this removes race conditions -// among relayers The SignedHeader and ValidatorSet are the new untrusted update -// fields for the client. The TrustedHeight is the height of a stored -// ConsensusState on the client that will be used to verify the new untrusted -// header. The Trusted ConsensusState must be within the unbonding period of -// current time in order to correctly verify, and the TrustedValidators must -// hash to TrustedConsensusState.NextValidatorsHash since that is the last -// trusted validator set at the TrustedHeight. -message Header { - .tendermint.types.SignedHeader signed_header = 1 - [(gogoproto.embed) = true, (gogoproto.moretags) = "yaml:\"signed_header\""]; - - .tendermint.types.ValidatorSet validator_set = 2 [(gogoproto.moretags) = "yaml:\"validator_set\""]; - ibc.core.client.v1.Height trusted_height = 3 - [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"trusted_height\""]; - .tendermint.types.ValidatorSet trusted_validators = 4 [(gogoproto.moretags) = "yaml:\"trusted_validators\""]; -} - -// Fraction defines the protobuf message type for tmmath.Fraction that only -// supports positive values. -message Fraction { - uint64 numerator = 1; - uint64 denominator = 2; -} diff --git a/third_party/proto/tendermint/abci/types.proto b/third_party/proto/tendermint/abci/types.proto deleted file mode 100644 index 2cbcabb29b..0000000000 --- a/third_party/proto/tendermint/abci/types.proto +++ /dev/null @@ -1,407 +0,0 @@ -syntax = "proto3"; -package tendermint.abci; - -option go_package = "github.com/tendermint/tendermint/abci/types"; - -// For more information on gogo.proto, see: -// https://github.com/gogo/protobuf/blob/master/extensions.md -import "tendermint/crypto/proof.proto"; -import "tendermint/types/types.proto"; -import "tendermint/crypto/keys.proto"; -import "tendermint/types/params.proto"; -import "google/protobuf/timestamp.proto"; -import "gogoproto/gogo.proto"; - -// This file is copied from http://github.com/tendermint/abci -// NOTE: When using custom types, mind the warnings. -// https://github.com/gogo/protobuf/blob/master/custom_types.md#warnings-and-issues - -//---------------------------------------- -// Request types - -message Request { - oneof value { - RequestEcho echo = 1; - RequestFlush flush = 2; - RequestInfo info = 3; - RequestSetOption set_option = 4; - RequestInitChain init_chain = 5; - RequestQuery query = 6; - RequestBeginBlock begin_block = 7; - RequestCheckTx check_tx = 8; - RequestDeliverTx deliver_tx = 9; - RequestEndBlock end_block = 10; - RequestCommit commit = 11; - RequestListSnapshots list_snapshots = 12; - RequestOfferSnapshot offer_snapshot = 13; - RequestLoadSnapshotChunk load_snapshot_chunk = 14; - RequestApplySnapshotChunk apply_snapshot_chunk = 15; - } -} - -message RequestEcho { - string message = 1; -} - -message RequestFlush {} - -message RequestInfo { - string version = 1; - uint64 block_version = 2; - uint64 p2p_version = 3; -} - -// nondeterministic -message RequestSetOption { - string key = 1; - string value = 2; -} - -message RequestInitChain { - google.protobuf.Timestamp time = 1 - [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; - string chain_id = 2; - ConsensusParams consensus_params = 3; - repeated ValidatorUpdate validators = 4 [(gogoproto.nullable) = false]; - bytes app_state_bytes = 5; - int64 initial_height = 6; -} - -message RequestQuery { - bytes data = 1; - string path = 2; - int64 height = 3; - bool prove = 4; -} - -message RequestBeginBlock { - bytes hash = 1; - tendermint.types.Header header = 2 [(gogoproto.nullable) = false]; - LastCommitInfo last_commit_info = 3 [(gogoproto.nullable) = false]; - repeated Evidence byzantine_validators = 4 [(gogoproto.nullable) = false]; -} - -enum CheckTxType { - NEW = 0 [(gogoproto.enumvalue_customname) = "New"]; - RECHECK = 1 [(gogoproto.enumvalue_customname) = "Recheck"]; -} - -message RequestCheckTx { - bytes tx = 1; - CheckTxType type = 2; -} - -message RequestDeliverTx { - bytes tx = 1; -} - -message RequestEndBlock { - int64 height = 1; -} - -message RequestCommit {} - -// lists available snapshots -message RequestListSnapshots { -} - -// offers a snapshot to the application -message RequestOfferSnapshot { - Snapshot snapshot = 1; // snapshot offered by peers - bytes app_hash = 2; // light client-verified app hash for snapshot height -} - -// loads a snapshot chunk -message RequestLoadSnapshotChunk { - uint64 height = 1; - uint32 format = 2; - uint32 chunk = 3; -} - -// Applies a snapshot chunk -message RequestApplySnapshotChunk { - uint32 index = 1; - bytes chunk = 2; - string sender = 3; -} - -//---------------------------------------- -// Response types - -message Response { - oneof value { - ResponseException exception = 1; - ResponseEcho echo = 2; - ResponseFlush flush = 3; - ResponseInfo info = 4; - ResponseSetOption set_option = 5; - ResponseInitChain init_chain = 6; - ResponseQuery query = 7; - ResponseBeginBlock begin_block = 8; - ResponseCheckTx check_tx = 9; - ResponseDeliverTx deliver_tx = 10; - ResponseEndBlock end_block = 11; - ResponseCommit commit = 12; - ResponseListSnapshots list_snapshots = 13; - ResponseOfferSnapshot offer_snapshot = 14; - ResponseLoadSnapshotChunk load_snapshot_chunk = 15; - ResponseApplySnapshotChunk apply_snapshot_chunk = 16; - } -} - -// nondeterministic -message ResponseException { - string error = 1; -} - -message ResponseEcho { - string message = 1; -} - -message ResponseFlush {} - -message ResponseInfo { - string data = 1; - - string version = 2; - uint64 app_version = 3; - - int64 last_block_height = 4; - bytes last_block_app_hash = 5; -} - -// nondeterministic -message ResponseSetOption { - uint32 code = 1; - // bytes data = 2; - string log = 3; - string info = 4; -} - -message ResponseInitChain { - ConsensusParams consensus_params = 1; - repeated ValidatorUpdate validators = 2 [(gogoproto.nullable) = false]; - bytes app_hash = 3; -} - -message ResponseQuery { - uint32 code = 1; - // bytes data = 2; // use "value" instead. - string log = 3; // nondeterministic - string info = 4; // nondeterministic - int64 index = 5; - bytes key = 6; - bytes value = 7; - tendermint.crypto.ProofOps proof_ops = 8; - int64 height = 9; - string codespace = 10; -} - -message ResponseBeginBlock { - repeated Event events = 1 - [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"]; -} - -message ResponseCheckTx { - uint32 code = 1; - bytes data = 2; - string log = 3; // nondeterministic - string info = 4; // nondeterministic - int64 gas_wanted = 5 [json_name = "gas_wanted"]; - int64 gas_used = 6 [json_name = "gas_used"]; - repeated Event events = 7 - [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"]; - string codespace = 8; -} - -message ResponseDeliverTx { - uint32 code = 1; - bytes data = 2; - string log = 3; // nondeterministic - string info = 4; // nondeterministic - int64 gas_wanted = 5 [json_name = "gas_wanted"]; - int64 gas_used = 6 [json_name = "gas_used"]; - repeated Event events = 7 - [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"]; - string codespace = 8; -} - -message ResponseEndBlock { - repeated ValidatorUpdate validator_updates = 1 - [(gogoproto.nullable) = false]; - ConsensusParams consensus_param_updates = 2; - repeated Event events = 3 - [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"]; -} - -message ResponseCommit { - // reserve 1 - bytes data = 2; - int64 retain_height = 3; -} - -message ResponseListSnapshots { - repeated Snapshot snapshots = 1; -} - -message ResponseOfferSnapshot { - Result result = 1; - - enum Result { - UNKNOWN = 0; // Unknown result, abort all snapshot restoration - ACCEPT = 1; // Snapshot accepted, apply chunks - ABORT = 2; // Abort all snapshot restoration - REJECT = 3; // Reject this specific snapshot, try others - REJECT_FORMAT = 4; // Reject all snapshots of this format, try others - REJECT_SENDER = 5; // Reject all snapshots from the sender(s), try others - } -} - -message ResponseLoadSnapshotChunk { - bytes chunk = 1; -} - -message ResponseApplySnapshotChunk { - Result result = 1; - repeated uint32 refetch_chunks = 2; // Chunks to refetch and reapply - repeated string reject_senders = 3; // Chunk senders to reject and ban - - enum Result { - UNKNOWN = 0; // Unknown result, abort all snapshot restoration - ACCEPT = 1; // Chunk successfully accepted - ABORT = 2; // Abort all snapshot restoration - RETRY = 3; // Retry chunk (combine with refetch and reject) - RETRY_SNAPSHOT = 4; // Retry snapshot (combine with refetch and reject) - REJECT_SNAPSHOT = 5; // Reject this snapshot, try others - } -} - -//---------------------------------------- -// Misc. - -// ConsensusParams contains all consensus-relevant parameters -// that can be adjusted by the abci app -message ConsensusParams { - BlockParams block = 1; - tendermint.types.EvidenceParams evidence = 2; - tendermint.types.ValidatorParams validator = 3; - tendermint.types.VersionParams version = 4; -} - -// BlockParams contains limits on the block size. -message BlockParams { - // Note: must be greater than 0 - int64 max_bytes = 1; - // Note: must be greater or equal to -1 - int64 max_gas = 2; -} - -message LastCommitInfo { - int32 round = 1; - repeated VoteInfo votes = 2 [(gogoproto.nullable) = false]; -} - -// Event allows application developers to attach additional information to -// ResponseBeginBlock, ResponseEndBlock, ResponseCheckTx and ResponseDeliverTx. -// Later, transactions may be queried using these events. -message Event { - string type = 1; - repeated EventAttribute attributes = 2 [ - (gogoproto.nullable) = false, - (gogoproto.jsontag) = "attributes,omitempty" - ]; -} - -// EventAttribute is a single key-value pair, associated with an event. -message EventAttribute { - bytes key = 1; - bytes value = 2; - bool index = 3; // nondeterministic -} - -// TxResult contains results of executing the transaction. -// -// One usage is indexing transaction results. -message TxResult { - int64 height = 1; - uint32 index = 2; - bytes tx = 3; - ResponseDeliverTx result = 4 [(gogoproto.nullable) = false]; -} - -//---------------------------------------- -// Blockchain Types - -// Validator -message Validator { - bytes address = 1; // The first 20 bytes of SHA256(public key) - // PubKey pub_key = 2 [(gogoproto.nullable)=false]; - int64 power = 3; // The voting power -} - -// ValidatorUpdate -message ValidatorUpdate { - tendermint.crypto.PublicKey pub_key = 1 [(gogoproto.nullable) = false]; - int64 power = 2; -} - -// VoteInfo -message VoteInfo { - Validator validator = 1 [(gogoproto.nullable) = false]; - bool signed_last_block = 2; -} - -enum EvidenceType { - UNKNOWN = 0; - DUPLICATE_VOTE = 1; - LIGHT_CLIENT_ATTACK = 2; -} - -message Evidence { - EvidenceType type = 1; - // The offending validator - Validator validator = 2 [(gogoproto.nullable) = false]; - // The height when the offense occurred - int64 height = 3; - // The corresponding time where the offense occurred - google.protobuf.Timestamp time = 4 [ - (gogoproto.nullable) = false, - (gogoproto.stdtime) = true - ]; - // Total voting power of the validator set in case the ABCI application does - // not store historical validators. - // https://github.com/tendermint/tendermint/issues/4581 - int64 total_voting_power = 5; -} - -//---------------------------------------- -// State Sync Types - -message Snapshot { - uint64 height = 1; // The height at which the snapshot was taken - uint32 format = 2; // The application-specific snapshot format - uint32 chunks = 3; // Number of chunks in the snapshot - bytes hash = 4; // Arbitrary snapshot hash, equal only if identical - bytes metadata = 5; // Arbitrary application metadata -} - -//---------------------------------------- -// Service Definition - -service ABCIApplication { - rpc Echo(RequestEcho) returns (ResponseEcho); - rpc Flush(RequestFlush) returns (ResponseFlush); - rpc Info(RequestInfo) returns (ResponseInfo); - rpc SetOption(RequestSetOption) returns (ResponseSetOption); - rpc DeliverTx(RequestDeliverTx) returns (ResponseDeliverTx); - rpc CheckTx(RequestCheckTx) returns (ResponseCheckTx); - rpc Query(RequestQuery) returns (ResponseQuery); - rpc Commit(RequestCommit) returns (ResponseCommit); - rpc InitChain(RequestInitChain) returns (ResponseInitChain); - rpc BeginBlock(RequestBeginBlock) returns (ResponseBeginBlock); - rpc EndBlock(RequestEndBlock) returns (ResponseEndBlock); - rpc ListSnapshots(RequestListSnapshots) returns (ResponseListSnapshots); - rpc OfferSnapshot(RequestOfferSnapshot) returns (ResponseOfferSnapshot); - rpc LoadSnapshotChunk(RequestLoadSnapshotChunk) returns (ResponseLoadSnapshotChunk); - rpc ApplySnapshotChunk(RequestApplySnapshotChunk) returns (ResponseApplySnapshotChunk); -} diff --git a/third_party/proto/tendermint/crypto/keys.proto b/third_party/proto/tendermint/crypto/keys.proto deleted file mode 100644 index 16fd7adf3e..0000000000 --- a/third_party/proto/tendermint/crypto/keys.proto +++ /dev/null @@ -1,17 +0,0 @@ -syntax = "proto3"; -package tendermint.crypto; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/crypto"; - -import "gogoproto/gogo.proto"; - -// PublicKey defines the keys available for use with Tendermint Validators -message PublicKey { - option (gogoproto.compare) = true; - option (gogoproto.equal) = true; - - oneof sum { - bytes ed25519 = 1; - bytes secp256k1 = 2; - } -} diff --git a/third_party/proto/tendermint/crypto/proof.proto b/third_party/proto/tendermint/crypto/proof.proto deleted file mode 100644 index 975df76853..0000000000 --- a/third_party/proto/tendermint/crypto/proof.proto +++ /dev/null @@ -1,41 +0,0 @@ -syntax = "proto3"; -package tendermint.crypto; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/crypto"; - -import "gogoproto/gogo.proto"; - -message Proof { - int64 total = 1; - int64 index = 2; - bytes leaf_hash = 3; - repeated bytes aunts = 4; -} - -message ValueOp { - // Encoded in ProofOp.Key. - bytes key = 1; - - // To encode in ProofOp.Data - Proof proof = 2; -} - -message DominoOp { - string key = 1; - string input = 2; - string output = 3; -} - -// ProofOp defines an operation used for calculating Merkle root -// The data could be arbitrary format, providing nessecary data -// for example neighbouring node hash -message ProofOp { - string type = 1; - bytes key = 2; - bytes data = 3; -} - -// ProofOps is Merkle proof defined by the list of ProofOps -message ProofOps { - repeated ProofOp ops = 1 [(gogoproto.nullable) = false]; -} diff --git a/third_party/proto/tendermint/libs/bits/types.proto b/third_party/proto/tendermint/libs/bits/types.proto deleted file mode 100644 index 3111d113a5..0000000000 --- a/third_party/proto/tendermint/libs/bits/types.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; -package tendermint.libs.bits; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/libs/bits"; - -message BitArray { - int64 bits = 1; - repeated uint64 elems = 2; -} diff --git a/third_party/proto/tendermint/types/params.proto b/third_party/proto/tendermint/types/params.proto deleted file mode 100644 index 0de7d846fb..0000000000 --- a/third_party/proto/tendermint/types/params.proto +++ /dev/null @@ -1,80 +0,0 @@ -syntax = "proto3"; -package tendermint.types; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/types"; - -import "gogoproto/gogo.proto"; -import "google/protobuf/duration.proto"; - -option (gogoproto.equal_all) = true; - -// ConsensusParams contains consensus critical parameters that determine the -// validity of blocks. -message ConsensusParams { - BlockParams block = 1 [(gogoproto.nullable) = false]; - EvidenceParams evidence = 2 [(gogoproto.nullable) = false]; - ValidatorParams validator = 3 [(gogoproto.nullable) = false]; - VersionParams version = 4 [(gogoproto.nullable) = false]; -} - -// BlockParams contains limits on the block size. -message BlockParams { - // Max block size, in bytes. - // Note: must be greater than 0 - int64 max_bytes = 1; - // Max gas per block. - // Note: must be greater or equal to -1 - int64 max_gas = 2; - // Minimum time increment between consecutive blocks (in milliseconds) If the - // block header timestamp is ahead of the system clock, decrease this value. - // - // Not exposed to the application. - int64 time_iota_ms = 3; -} - -// EvidenceParams determine how we handle evidence of malfeasance. -message EvidenceParams { - // Max age of evidence, in blocks. - // - // The basic formula for calculating this is: MaxAgeDuration / {average block - // time}. - int64 max_age_num_blocks = 1; - - // Max age of evidence, in time. - // - // It should correspond with an app's "unbonding period" or other similar - // mechanism for handling [Nothing-At-Stake - // attacks](https://github.com/ethereum/wiki/wiki/Proof-of-Stake-FAQ#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed). - google.protobuf.Duration max_age_duration = 2 - [(gogoproto.nullable) = false, (gogoproto.stdduration) = true]; - - // This sets the maximum size of total evidence in bytes that can be committed in a single block. - // and should fall comfortably under the max block bytes. - // Default is 1048576 or 1MB - int64 max_bytes = 3; -} - -// ValidatorParams restrict the public key types validators can use. -// NOTE: uses ABCI pubkey naming, not Amino names. -message ValidatorParams { - option (gogoproto.populate) = true; - option (gogoproto.equal) = true; - - repeated string pub_key_types = 1; -} - -// VersionParams contains the ABCI application version. -message VersionParams { - option (gogoproto.populate) = true; - option (gogoproto.equal) = true; - - uint64 app_version = 1; -} - -// HashedParams is a subset of ConsensusParams. -// -// It is hashed into the Header.ConsensusHash. -message HashedParams { - int64 block_max_bytes = 1; - int64 block_max_gas = 2; -} diff --git a/third_party/proto/tendermint/types/types.proto b/third_party/proto/tendermint/types/types.proto deleted file mode 100644 index 7f7ea74cac..0000000000 --- a/third_party/proto/tendermint/types/types.proto +++ /dev/null @@ -1,157 +0,0 @@ -syntax = "proto3"; -package tendermint.types; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/types"; - -import "gogoproto/gogo.proto"; -import "google/protobuf/timestamp.proto"; -import "tendermint/crypto/proof.proto"; -import "tendermint/version/types.proto"; -import "tendermint/types/validator.proto"; - -// BlockIdFlag indicates which BlcokID the signature is for -enum BlockIDFlag { - option (gogoproto.goproto_enum_stringer) = true; - option (gogoproto.goproto_enum_prefix) = false; - - BLOCK_ID_FLAG_UNKNOWN = 0 [(gogoproto.enumvalue_customname) = "BlockIDFlagUnknown"]; - BLOCK_ID_FLAG_ABSENT = 1 [(gogoproto.enumvalue_customname) = "BlockIDFlagAbsent"]; - BLOCK_ID_FLAG_COMMIT = 2 [(gogoproto.enumvalue_customname) = "BlockIDFlagCommit"]; - BLOCK_ID_FLAG_NIL = 3 [(gogoproto.enumvalue_customname) = "BlockIDFlagNil"]; -} - -// SignedMsgType is a type of signed message in the consensus. -enum SignedMsgType { - option (gogoproto.goproto_enum_stringer) = true; - option (gogoproto.goproto_enum_prefix) = false; - - SIGNED_MSG_TYPE_UNKNOWN = 0 [(gogoproto.enumvalue_customname) = "UnknownType"]; - // Votes - SIGNED_MSG_TYPE_PREVOTE = 1 [(gogoproto.enumvalue_customname) = "PrevoteType"]; - SIGNED_MSG_TYPE_PRECOMMIT = 2 [(gogoproto.enumvalue_customname) = "PrecommitType"]; - - // Proposals - SIGNED_MSG_TYPE_PROPOSAL = 32 [(gogoproto.enumvalue_customname) = "ProposalType"]; -} - -// PartsetHeader -message PartSetHeader { - uint32 total = 1; - bytes hash = 2; -} - -message Part { - uint32 index = 1; - bytes bytes = 2; - tendermint.crypto.Proof proof = 3 [(gogoproto.nullable) = false]; -} - -// BlockID -message BlockID { - bytes hash = 1; - PartSetHeader part_set_header = 2 [(gogoproto.nullable) = false]; -} - -// -------------------------------- - -// Header defines the structure of a Tendermint block header. -message Header { - // basic block info - tendermint.version.Consensus version = 1 [(gogoproto.nullable) = false]; - string chain_id = 2 [(gogoproto.customname) = "ChainID"]; - int64 height = 3; - google.protobuf.Timestamp time = 4 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; - - // prev block info - BlockID last_block_id = 5 [(gogoproto.nullable) = false]; - - // hashes of block data - bytes last_commit_hash = 6; // commit from validators from the last block - bytes data_hash = 7; // transactions - - // hashes from the app output from the prev block - bytes validators_hash = 8; // validators for the current block - bytes next_validators_hash = 9; // validators for the next block - bytes consensus_hash = 10; // consensus params for current block - bytes app_hash = 11; // state after txs from the previous block - bytes last_results_hash = 12; // root hash of all results from the txs from the previous block - - // consensus info - bytes evidence_hash = 13; // evidence included in the block - bytes proposer_address = 14; // original proposer of the block -} - -// Data contains the set of transactions included in the block -message Data { - // Txs that will be applied by state @ block.Height+1. - // NOTE: not all txs here are valid. We're just agreeing on the order first. - // This means that block.AppHash does not include these txs. - repeated bytes txs = 1; -} - -// Vote represents a prevote, precommit, or commit vote from validators for -// consensus. -message Vote { - SignedMsgType type = 1; - int64 height = 2; - int32 round = 3; - BlockID block_id = 4 - [(gogoproto.nullable) = false, (gogoproto.customname) = "BlockID"]; // zero if vote is nil. - google.protobuf.Timestamp timestamp = 5 - [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; - bytes validator_address = 6; - int32 validator_index = 7; - bytes signature = 8; -} - -// Commit contains the evidence that a block was committed by a set of validators. -message Commit { - int64 height = 1; - int32 round = 2; - BlockID block_id = 3 [(gogoproto.nullable) = false, (gogoproto.customname) = "BlockID"]; - repeated CommitSig signatures = 4 [(gogoproto.nullable) = false]; -} - -// CommitSig is a part of the Vote included in a Commit. -message CommitSig { - BlockIDFlag block_id_flag = 1; - bytes validator_address = 2; - google.protobuf.Timestamp timestamp = 3 - [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; - bytes signature = 4; -} - -message Proposal { - SignedMsgType type = 1; - int64 height = 2; - int32 round = 3; - int32 pol_round = 4; - BlockID block_id = 5 [(gogoproto.customname) = "BlockID", (gogoproto.nullable) = false]; - google.protobuf.Timestamp timestamp = 6 - [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; - bytes signature = 7; -} - -message SignedHeader { - Header header = 1; - Commit commit = 2; -} - -message LightBlock { - SignedHeader signed_header = 1; - tendermint.types.ValidatorSet validator_set = 2; -} - -message BlockMeta { - BlockID block_id = 1 [(gogoproto.customname) = "BlockID", (gogoproto.nullable) = false]; - int64 block_size = 2; - Header header = 3 [(gogoproto.nullable) = false]; - int64 num_txs = 4; -} - -// TxProof represents a Merkle proof of the presence of a transaction in the Merkle tree. -message TxProof { - bytes root_hash = 1; - bytes data = 2; - tendermint.crypto.Proof proof = 3; -} diff --git a/third_party/proto/tendermint/types/validator.proto b/third_party/proto/tendermint/types/validator.proto deleted file mode 100644 index 49860b96d6..0000000000 --- a/third_party/proto/tendermint/types/validator.proto +++ /dev/null @@ -1,25 +0,0 @@ -syntax = "proto3"; -package tendermint.types; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/types"; - -import "gogoproto/gogo.proto"; -import "tendermint/crypto/keys.proto"; - -message ValidatorSet { - repeated Validator validators = 1; - Validator proposer = 2; - int64 total_voting_power = 3; -} - -message Validator { - bytes address = 1; - tendermint.crypto.PublicKey pub_key = 2 [(gogoproto.nullable) = false]; - int64 voting_power = 3; - int64 proposer_priority = 4; -} - -message SimpleValidator { - tendermint.crypto.PublicKey pub_key = 1; - int64 voting_power = 2; -} diff --git a/third_party/proto/tendermint/version/types.proto b/third_party/proto/tendermint/version/types.proto deleted file mode 100644 index 6061868bd4..0000000000 --- a/third_party/proto/tendermint/version/types.proto +++ /dev/null @@ -1,24 +0,0 @@ -syntax = "proto3"; -package tendermint.version; - -option go_package = "github.com/tendermint/tendermint/proto/tendermint/version"; - -import "gogoproto/gogo.proto"; - -// App includes the protocol and software version for the application. -// This information is included in ResponseInfo. The App.Protocol can be -// updated in ResponseEndBlock. -message App { - uint64 protocol = 1; - string software = 2; -} - -// Consensus captures the consensus rules for processing a block in the blockchain, -// including all blockchain data structures and the rules of the application's -// state transition machine. -message Consensus { - option (gogoproto.equal) = true; - - uint64 block = 1; - uint64 app = 2; -} diff --git a/x/ccv/consumer/ibc_module.go b/x/ccv/consumer/ibc_module.go index b3dde3d48a..410ca0d0fa 100644 --- a/x/ccv/consumer/ibc_module.go +++ b/x/ccv/consumer/ibc_module.go @@ -5,14 +5,17 @@ import ( "strings" errorsmod "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + + sdk "github.com/cosmos/cosmos-sdk/types" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - transfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - porttypes "github.com/cosmos/ibc-go/v4/modules/core/05-port/types" - host "github.com/cosmos/ibc-go/v4/modules/core/24-host" - ibcexported "github.com/cosmos/ibc-go/v4/modules/core/exported" + + transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" + host "github.com/cosmos/ibc-go/v7/modules/core/24-host" + ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" + "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" diff --git a/x/ccv/consumer/ibc_module_test.go b/x/ccv/consumer/ibc_module_test.go index 4c8377a8c8..18bbba83cf 100644 --- a/x/ccv/consumer/ibc_module_test.go +++ b/x/ccv/consumer/ibc_module_test.go @@ -5,15 +5,16 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - transfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" - conntypes "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - host "github.com/cosmos/ibc-go/v4/modules/core/24-host" + transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + conntypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + host "github.com/cosmos/ibc-go/v7/modules/core/24-host" testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" "github.com/cosmos/interchain-security/v2/x/ccv/consumer" consumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" ) diff --git a/x/ccv/consumer/keeper/changeover.go b/x/ccv/consumer/keeper/changeover.go index 57770a077d..1221792d3c 100644 --- a/x/ccv/consumer/keeper/changeover.go +++ b/x/ccv/consumer/keeper/changeover.go @@ -1,8 +1,8 @@ package keeper import ( + abci "github.com/cometbft/cometbft/abci/types" sdk "github.com/cosmos/cosmos-sdk/types" - abci "github.com/tendermint/tendermint/abci/types" ) // ChangeoverIsComplete returns whether the standalone to consumer changeover process is complete. diff --git a/x/ccv/consumer/keeper/changeover_test.go b/x/ccv/consumer/keeper/changeover_test.go index 971811c204..9296dcb951 100644 --- a/x/ccv/consumer/keeper/changeover_test.go +++ b/x/ccv/consumer/keeper/changeover_test.go @@ -3,13 +3,13 @@ package keeper_test import ( "testing" + abci "github.com/cometbft/cometbft/abci/types" sdkcryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/cosmos/interchain-security/v2/testutil/crypto" uthelpers "github.com/cosmos/interchain-security/v2/testutil/keeper" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" ) func TestChangeoverToConsumer(t *testing.T) { diff --git a/x/ccv/consumer/keeper/distribution.go b/x/ccv/consumer/keeper/distribution.go index 6d56f6c901..fac98c3cfc 100644 --- a/x/ccv/consumer/keeper/distribution.go +++ b/x/ccv/consumer/keeper/distribution.go @@ -7,9 +7,9 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" - transfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" + transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" @@ -78,7 +78,7 @@ func (k Keeper) DistributeRewardsInternally(ctx sdk.Context) { // tokens do not go through the consumer redistribute split twice in the // event that the transfer fails the tokens are returned to the consumer // chain. - remainingTokens := fpTokens.Sub(consRedistrTokens) + remainingTokens := fpTokens.Sub(consRedistrTokens...) err = k.bankKeeper.SendCoinsFromModuleToModule(ctx, k.feeCollectorName, types.ConsumerToSendToProviderName, remainingTokens) if err != nil { @@ -113,7 +113,6 @@ func (k Keeper) SendRewardsToProvider(ctx sdk.Context) error { timeoutTimestamp := uint64(ctx.BlockTime().Add(transferTimeoutPeriod).UnixNano()) sentCoins := sdk.NewCoins() - // iterate over all whitelisted reward denoms for _, denom := range k.AllowedRewardDenoms(ctx) { // get the balance of the denom in the toSendToProviderTokens address @@ -121,16 +120,17 @@ func (k Keeper) SendRewardsToProvider(ctx sdk.Context) error { // if the balance is not zero, if !balance.IsZero() { - // send the balance to the provider - err := k.ibcTransferKeeper.SendTransfer(ctx, - transfertypes.PortID, - ch, - balance, - tstProviderAddr, - providerAddr, - timeoutHeight, - timeoutTimestamp, - ) + packetTransfer := &transfertypes.MsgTransfer{ + SourcePort: transfertypes.PortID, + SourceChannel: ch, + Token: balance, + Sender: tstProviderAddr.String(), // consumer address to send from + Receiver: providerAddr, // provider fee pool address to send to + TimeoutHeight: timeoutHeight, // timeout height disabled + TimeoutTimestamp: timeoutTimestamp, + Memo: "consumer chain rewards distribution", + } + _, err := k.ibcTransferKeeper.Transfer(ctx, packetTransfer) if err != nil { return err } @@ -250,7 +250,7 @@ func (k Keeper) GetEstimatedNextFeeDistribution(ctx sdk.Context) types.NextFeeDi totalTokens := sdk.NewDecCoinsFromCoins(total...) // truncated decimals are implicitly added to provider consumerTokens, _ := totalTokens.MulDec(frac).TruncateDecimal() - providerTokens := total.Sub(consumerTokens) + providerTokens := total.Sub(consumerTokens...) return types.NextFeeDistributionEstimate{ CurrentHeight: ctx.BlockHeight(), diff --git a/x/ccv/consumer/keeper/distribution_test.go b/x/ccv/consumer/keeper/distribution_test.go index 7e17157c3d..bb09c7e26b 100644 --- a/x/ccv/consumer/keeper/distribution_test.go +++ b/x/ccv/consumer/keeper/distribution_test.go @@ -37,7 +37,7 @@ func TestGetEstimatedNextFeeDistribution(t *testing.T) { feeAmountCoins := sdk.Coins([]sdk.Coin{feeAmount}) feeAmountDec := sdk.NewDecCoinsFromCoins(feeAmountCoins...) consumerTokens, _ := feeAmountDec.MulDec(fracDec).TruncateDecimal() - providerTokens := feeAmountCoins.Sub(consumerTokens) + providerTokens := feeAmountCoins.Sub(consumerTokens...) mAcc := authTypes.NewModuleAccount(&authTypes.BaseAccount{}, "", "auth") // Setup mock calls diff --git a/x/ccv/consumer/keeper/genesis.go b/x/ccv/consumer/keeper/genesis.go index 08f6327909..04c97dd4e3 100644 --- a/x/ccv/consumer/keeper/genesis.go +++ b/x/ccv/consumer/keeper/genesis.go @@ -7,7 +7,7 @@ import ( consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" - abci "github.com/tendermint/tendermint/abci/types" + abci "github.com/cometbft/cometbft/abci/types" ) // InitGenesis initializes the CCV consumer state and binds to PortID. @@ -108,13 +108,12 @@ func (k Keeper) InitGenesis(ctx sdk.Context, state *consumertypes.GenesisState) // populate cross chain validators states with initial valset k.ApplyCCValidatorChanges(ctx, state.InitialValSet) - return state.InitialValSet } // ExportGenesis returns the CCV consumer module's exported genesis func (k Keeper) ExportGenesis(ctx sdk.Context) (genesis *consumertypes.GenesisState) { - params := k.GetParams(ctx) + params := k.GetConsumerParams(ctx) if !params.Enabled { return consumertypes.DefaultGenesisState() } diff --git a/x/ccv/consumer/keeper/genesis_test.go b/x/ccv/consumer/keeper/genesis_test.go index 55c5c41b19..f05d8c960f 100644 --- a/x/ccv/consumer/keeper/genesis_test.go +++ b/x/ccv/consumer/keeper/genesis_test.go @@ -4,19 +4,21 @@ import ( "testing" "time" + abci "github.com/cometbft/cometbft/abci/types" + tmtypes "github.com/cometbft/cometbft/types" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - commitmenttypes "github.com/cosmos/ibc-go/v4/modules/core/23-commitment/types" - ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" + + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" "github.com/cosmos/interchain-security/v2/testutil/crypto" testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" consumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" - tmtypes "github.com/tendermint/tendermint/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" @@ -57,8 +59,6 @@ func TestInitGenesis(t *testing.T) { clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"upgrade", "upgradedIBCState"}, - true, - true, ) matPackets := []consumertypes.MaturingVSCPacket{ @@ -72,7 +72,7 @@ func TestInitGenesis(t *testing.T) { { Type: ccv.SlashPacket, Data: &ccv.ConsumerPacketData_SlashPacketData{ - SlashPacketData: ccv.NewSlashPacketData(abciValidator, vscID, stakingtypes.Downtime), + SlashPacketData: ccv.NewSlashPacketData(abciValidator, vscID, stakingtypes.Infraction_INFRACTION_DOWNTIME), }, }, { @@ -125,7 +125,7 @@ func TestInitGenesis(t *testing.T) { assertHeightValsetUpdateIDs(t, ctx, &ck, defaultHeightValsetUpdateIDs) require.Equal(t, validator.Address.Bytes(), ck.GetAllCCValidator(ctx)[0].Address) - require.Equal(t, gs.Params, ck.GetParams(ctx)) + require.Equal(t, gs.Params, ck.GetConsumerParams(ctx)) }, }, { "restart a chain without an established CCV channel", @@ -152,7 +152,7 @@ func TestInitGenesis(t *testing.T) { assertHeightValsetUpdateIDs(t, ctx, &ck, defaultHeightValsetUpdateIDs) assertProviderClientID(t, ctx, &ck, provClientID) require.Equal(t, validator.Address.Bytes(), ck.GetAllCCValidator(ctx)[0].Address) - require.Equal(t, gs.Params, ck.GetParams(ctx)) + require.Equal(t, gs.Params, ck.GetConsumerParams(ctx)) }, }, { "restart a chain with an established CCV channel", @@ -196,7 +196,7 @@ func TestInitGenesis(t *testing.T) { assertHeightValsetUpdateIDs(t, ctx, &ck, updatedHeightValsetUpdateIDs) assertProviderClientID(t, ctx, &ck, provClientID) - require.Equal(t, gs.Params, ck.GetParams(ctx)) + require.Equal(t, gs.Params, ck.GetConsumerParams(ctx)) }, }, } @@ -250,7 +250,7 @@ func TestExportGenesis(t *testing.T) { { Type: ccv.SlashPacket, Data: &ccv.ConsumerPacketData_SlashPacketData{ - SlashPacketData: ccv.NewSlashPacketData(abciValidator, vscID, stakingtypes.Downtime), + SlashPacketData: ccv.NewSlashPacketData(abciValidator, vscID, stakingtypes.Infraction_INFRACTION_DOWNTIME), }, }, { diff --git a/x/ccv/consumer/keeper/grpc_query.go b/x/ccv/consumer/keeper/grpc_query.go index 7fc2e0faeb..9658edf64c 100644 --- a/x/ccv/consumer/keeper/grpc_query.go +++ b/x/ccv/consumer/keeper/grpc_query.go @@ -34,7 +34,7 @@ func (k Keeper) QueryParams(c context.Context, return nil, status.Errorf(codes.InvalidArgument, "empty request") } - p := k.GetParams(ctx) + p := k.GetConsumerParams(ctx) return &types.QueryParamsResponse{Params: p}, nil } diff --git a/x/ccv/consumer/keeper/hooks.go b/x/ccv/consumer/keeper/hooks.go index 6067f2adb3..33a756d525 100644 --- a/x/ccv/consumer/keeper/hooks.go +++ b/x/ccv/consumer/keeper/hooks.go @@ -17,8 +17,10 @@ func (k Keeper) Hooks() Hooks { return Hooks{k} } -func (k Keeper) AfterValidatorBonded(ctx sdk.Context, consAddr sdk.ConsAddress, _ sdk.ValAddress) { +func (k Keeper) AfterValidatorBonded(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) error { if k.hooks != nil { - k.hooks.AfterValidatorBonded(ctx, consAddr, nil) + err := k.hooks.AfterValidatorBonded(ctx, consAddr, nil) + return err } + return nil } diff --git a/x/ccv/consumer/keeper/keeper.go b/x/ccv/consumer/keeper/keeper.go index d420bb9bd4..b50b330efa 100644 --- a/x/ccv/consumer/keeper/keeper.go +++ b/x/ccv/consumer/keeper/keeper.go @@ -12,21 +12,23 @@ import ( paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - conntypes "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - host "github.com/cosmos/ibc-go/v4/modules/core/24-host" - + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + conntypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + host "github.com/cosmos/ibc-go/v7/modules/core/24-host" + + tmtypes "github.com/cometbft/cometbft/abci/types" + "github.com/cometbft/cometbft/libs/log" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" - tmtypes "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/libs/log" ) // Keeper defines the Cross-Chain Validation Consumer Keeper type Keeper struct { - storeKey sdk.StoreKey + storeKey storetypes.StoreKey cdc codec.BinaryCodec paramStore paramtypes.Subspace scopedKeeper ccv.ScopedKeeper @@ -51,7 +53,7 @@ type Keeper struct { // NOTE: the feeCollectorName is in reference to the consumer-chain fee // collector (and not the provider chain) func NewKeeper( - cdc codec.BinaryCodec, key sdk.StoreKey, paramSpace paramtypes.Subspace, + cdc codec.BinaryCodec, key storetypes.StoreKey, paramSpace paramtypes.Subspace, scopedKeeper ccv.ScopedKeeper, channelKeeper ccv.ChannelKeeper, portKeeper ccv.PortKeeper, connectionKeeper ccv.ConnectionKeeper, clientKeeper ccv.ClientKeeper, @@ -86,6 +88,16 @@ func NewKeeper( return k } +// Returns a keeper with cdc, key and paramSpace set it does not raise any panics during registration (eg with IBCKeeper). +// Used only in testing. +func NewNonZeroKeeper(cdc codec.BinaryCodec, key storetypes.StoreKey, paramSpace paramtypes.Subspace) Keeper { + return Keeper{ + storeKey: key, + cdc: cdc, + paramStore: paramSpace, + } +} + // SetStandaloneStakingKeeper sets the standalone staking keeper for the consumer chain. // This method should only be called for previously standalone chains that are now consumers. func (k *Keeper) SetStandaloneStakingKeeper(sk ccv.StakingKeeper) { @@ -128,7 +140,7 @@ func (k Keeper) mustValidateFields() { // Logger returns a module-specific logger. func (k Keeper) Logger(ctx sdk.Context) log.Logger { - return ctx.Logger().With("module", "x/"+host.ModuleName+"-"+types.ModuleName) + return ctx.Logger().With("module", "x/"+host.SubModuleName+"-"+types.ModuleName) } func (k *Keeper) SetHooks(sh ccv.ConsumerHooks) *Keeper { @@ -565,6 +577,21 @@ func (k Keeper) GetAllCCValidator(ctx sdk.Context) (validators []types.CrossChai return validators } +// Implement from stakingkeeper interface +func (k Keeper) GetAllValidators(ctx sdk.Context) (validators []stakingtypes.Validator) { + store := ctx.KVStore(k.storeKey) + + iterator := sdk.KVStorePrefixIterator(store, stakingtypes.ValidatorsKey) + defer iterator.Close() + + for ; iterator.Valid(); iterator.Next() { + validator := stakingtypes.MustUnmarshalValidator(k.cdc, iterator.Value()) + validators = append(validators, validator) + } + + return validators +} + // SetPendingPackets sets the pending CCV packets func (k Keeper) SetPendingPackets(ctx sdk.Context, packets ccv.ConsumerPacketDataList) { store := ctx.KVStore(k.storeKey) diff --git a/x/ccv/consumer/keeper/keeper_test.go b/x/ccv/consumer/keeper/keeper_test.go index fe523ce7cf..c6443958b6 100644 --- a/x/ccv/consumer/keeper/keeper_test.go +++ b/x/ccv/consumer/keeper/keeper_test.go @@ -6,17 +6,19 @@ import ( "testing" "time" + abci "github.com/cometbft/cometbft/abci/types" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - conntypes "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types" + + conntypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" "github.com/cosmos/interchain-security/v2/testutil/crypto" testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" ) @@ -336,7 +338,7 @@ func TestSetPendingPackets(t *testing.T) { SlashPacketData: ccv.NewSlashPacketData( abci.Validator{Address: ed25519.GenPrivKey().PubKey().Address(), Power: int64(0)}, 3, - stakingtypes.DoubleSign, + stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN, ), }, }, @@ -359,7 +361,7 @@ func TestSetPendingPackets(t *testing.T) { Power: int64(2), }, uint64(4), - stakingtypes.Downtime, + stakingtypes.Infraction_INFRACTION_DOWNTIME, ) dataPackets = append(dataPackets, ccv.ConsumerPacketData{ Type: ccv.SlashPacket, diff --git a/x/ccv/consumer/keeper/migration.go b/x/ccv/consumer/keeper/migration.go deleted file mode 100644 index a44b89404b..0000000000 --- a/x/ccv/consumer/keeper/migration.go +++ /dev/null @@ -1,79 +0,0 @@ -package keeper - -import ( - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" -) - -// Migrator is a struct for handling in-place store migrations. -type Migrator struct { - ccvConsumerKeeper Keeper - ccvConsumerParamSpace paramtypes.Subspace -} - -// NewMigrator returns a new Migrator. -func NewMigrator(ccvConsumerKeeper Keeper, ccvConsumerParamSpace paramtypes.Subspace) Migrator { - return Migrator{ccvConsumerKeeper: ccvConsumerKeeper, ccvConsumerParamSpace: ccvConsumerParamSpace} -} - -// Note: If migrating from v1.2.0-multiden to v2.0.0, there are no migrations required. -// This is due to the fact that the former version includes both of: -// - https://github.com/cosmos/interchain-security/commit/54e9852d3c89a2513cd0170a56c6eec894fc878d -// - https://github.com/cosmos/interchain-security/pull/833 -// both of which handle the introduction of new params. - -// Migratev1Tov2 migrates a consumer from v1.0.0 to v2.0.0. -func (m Migrator) Migratev1Tov2(ctx sdk.Context) error { - // Migrate params - MigrateParamsv1Tov2(ctx, m.ccvConsumerParamSpace) - - return nil -} - -// MigrateParamsv1Tov2 migrates the consumer CCV module params from v1.0.0 to v2.0.0, -// setting default values for new params. -func MigrateParamsv1Tov2(ctx sdk.Context, paramsSubspace paramtypes.Subspace) { - // Get old params - var enabled bool - paramsSubspace.Get(ctx, consumertypes.KeyEnabled, &enabled) - var blocksPerDistributionTransmission int64 - paramsSubspace.Get(ctx, consumertypes.KeyBlocksPerDistributionTransmission, &blocksPerDistributionTransmission) - var distributionTransmissionChannel string - paramsSubspace.Get(ctx, consumertypes.KeyDistributionTransmissionChannel, &distributionTransmissionChannel) - var providerFeePoolAddrStr string - paramsSubspace.Get(ctx, consumertypes.KeyProviderFeePoolAddrStr, &providerFeePoolAddrStr) - var ccvTimeoutPeriod time.Duration - paramsSubspace.Get(ctx, ccvtypes.KeyCCVTimeoutPeriod, &ccvTimeoutPeriod) - var transferTimeoutPeriod time.Duration - paramsSubspace.Get(ctx, consumertypes.KeyTransferTimeoutPeriod, &transferTimeoutPeriod) - var consumerRedistributionFrac string - paramsSubspace.Get(ctx, consumertypes.KeyConsumerRedistributionFrac, &consumerRedistributionFrac) - var historicalEntries int64 - paramsSubspace.Get(ctx, consumertypes.KeyHistoricalEntries, &historicalEntries) - var unbondingPeriod time.Duration - paramsSubspace.Get(ctx, consumertypes.KeyConsumerUnbondingPeriod, &unbondingPeriod) - - // Recycle old params, set new params to default values - defaultParams := consumertypes.DefaultParams() - newParams := consumertypes.NewParams( - enabled, - blocksPerDistributionTransmission, - distributionTransmissionChannel, - providerFeePoolAddrStr, - ccvTimeoutPeriod, - transferTimeoutPeriod, - consumerRedistributionFrac, - historicalEntries, - unbondingPeriod, - defaultParams.SoftOptOutThreshold, - defaultParams.RewardDenoms, - defaultParams.ProviderRewardDenoms, - ) - - // Persist new params - paramsSubspace.SetParamSet(ctx, &newParams) -} diff --git a/x/ccv/consumer/keeper/migration_test.go b/x/ccv/consumer/keeper/migration_test.go deleted file mode 100644 index 29574a4808..0000000000 --- a/x/ccv/consumer/keeper/migration_test.go +++ /dev/null @@ -1,146 +0,0 @@ -package keeper_test - -import ( - "testing" - "time" - - "github.com/cosmos/cosmos-sdk/codec" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/cosmos/cosmos-sdk/store" - storetypes "github.com/cosmos/cosmos-sdk/store/types" - sdk "github.com/cosmos/cosmos-sdk/types" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - consumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" - "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/libs/log" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - tmdb "github.com/tendermint/tm-db" -) - -func TestMigrateParamsv1Tov2(t *testing.T) { - // Setup raw store - db := tmdb.NewMemDB() - stateStore := store.NewCommitMultiStore(db) - storeKey := sdk.NewKVStoreKey(paramtypes.StoreKey) - memStoreKey := storetypes.NewMemoryStoreKey("mem_key") - stateStore.MountStoreWithDB(storeKey, sdk.StoreTypeIAVL, db) - stateStore.MountStoreWithDB(memStoreKey, sdk.StoreTypeMemory, nil) - require.NoError(t, stateStore.LoadLatestVersion()) - registry := codectypes.NewInterfaceRegistry() - cdc := codec.NewProtoCodec(registry) - ctx := sdk.NewContext(stateStore, tmproto.Header{}, false, log.NewNopLogger()) - require.NoError(t, stateStore.LoadLatestVersion()) - - // Create new empty subspace - subspace := paramtypes.NewSubspace(cdc, - codec.NewLegacyAmino(), - storeKey, - memStoreKey, - paramtypes.ModuleName, - ).WithKeyTable(v1KeyTable()) // Note that new param key table is set in keeper constructor - - // Set 9 params from v1.0.0 - subspace.Set(ctx, consumertypes.KeyEnabled, true) - subspace.Set(ctx, consumertypes.KeyBlocksPerDistributionTransmission, int64(10)) - subspace.Set(ctx, consumertypes.KeyDistributionTransmissionChannel, "channel-0") - subspace.Set(ctx, consumertypes.KeyProviderFeePoolAddrStr, "cosmos17p3erf5gv2436fd4vyjwmudakts563a497syuz") - subspace.Set(ctx, ccvtypes.KeyCCVTimeoutPeriod, time.Hour) - subspace.Set(ctx, consumertypes.KeyTransferTimeoutPeriod, time.Hour) - subspace.Set(ctx, consumertypes.KeyConsumerRedistributionFrac, "0.5") - subspace.Set(ctx, consumertypes.KeyHistoricalEntries, int64(10)) - subspace.Set(ctx, consumertypes.KeyConsumerUnbondingPeriod, time.Hour) - - // Confirm 3 new params cannot be set with old key table - require.Panics(t, func() { - subspace.Set(ctx, consumertypes.KeySoftOptOutThreshold, "0.05") - }) - require.Panics(t, func() { - subspace.Set(ctx, consumertypes.KeyRewardDenoms, []string{"untrn"}) - }) - require.Panics(t, func() { - subspace.Set(ctx, consumertypes.KeyProviderRewardDenoms, []string{"uatom"}) - }) - - // Now create new subspace, mocking an upgrade where app initialization happens again - subspace = paramtypes.NewSubspace(cdc, - codec.NewLegacyAmino(), - storeKey, - memStoreKey, - paramtypes.ModuleName, - ).WithKeyTable(consumertypes.ParamKeyTable()) // Use v2 key table, this would be set in keeper constructor upon app init - - // Run migration - consumerkeeper.MigrateParamsv1Tov2(ctx, subspace) - - // Use keeper to confirm params are set correctly - keeper := consumerkeeper.Keeper{} - keeper.SetParamSpace(ctx, subspace) - - params := keeper.GetParams(ctx) - require.Equal(t, true, params.Enabled) - require.Equal(t, int64(10), params.BlocksPerDistributionTransmission) - require.Equal(t, "channel-0", params.DistributionTransmissionChannel) - require.Equal(t, "cosmos17p3erf5gv2436fd4vyjwmudakts563a497syuz", params.ProviderFeePoolAddrStr) - require.Equal(t, time.Hour, params.CcvTimeoutPeriod) - require.Equal(t, time.Hour, params.TransferTimeoutPeriod) - require.Equal(t, "0.5", params.ConsumerRedistributionFraction) - require.Equal(t, int64(10), params.HistoricalEntries) - require.Equal(t, time.Hour, params.UnbondingPeriod) - // 3 new params are set to default values - require.Equal(t, "0.05", params.SoftOptOutThreshold) - require.Equal(t, []string(nil), params.RewardDenoms) - require.Equal(t, []string(nil), params.ProviderRewardDenoms) - - // Set new params to other values - params.SoftOptOutThreshold = "0.1" - params.RewardDenoms = []string{"untrn"} - params.ProviderRewardDenoms = []string{"uatom"} - keeper.SetParams(ctx, params) - - require.Equal(t, "0.1", keeper.GetSoftOptOutThreshold(ctx)) - require.Equal(t, []string{"untrn"}, keeper.GetRewardDenoms(ctx)) - require.Equal(t, []string{"uatom"}, keeper.GetProviderRewardDenoms(ctx)) -} - -// v1KeyTable is a copy of the ParamKeyTable method from v1.0.0 -func v1KeyTable() paramtypes.KeyTable { - return paramtypes.NewKeyTable().RegisterParamSet(&v1Params{}) -} - -// ParamSetPairs implements params.ParamSet for v1Params -func (p *v1Params) ParamSetPairs() paramtypes.ParamSetPairs { - return paramtypes.ParamSetPairs{ - paramtypes.NewParamSetPair(consumertypes.KeyEnabled, p.Enabled, ccvtypes.ValidateBool), - paramtypes.NewParamSetPair(consumertypes.KeyBlocksPerDistributionTransmission, - p.BlocksPerDistributionTransmission, ccvtypes.ValidatePositiveInt64), - paramtypes.NewParamSetPair(consumertypes.KeyDistributionTransmissionChannel, - p.DistributionTransmissionChannel, ccvtypes.ValidateDistributionTransmissionChannel), - paramtypes.NewParamSetPair(consumertypes.KeyProviderFeePoolAddrStr, - p.ProviderFeePoolAddrStr, consumertypes.ValidateProviderFeePoolAddrStr), - paramtypes.NewParamSetPair(ccvtypes.KeyCCVTimeoutPeriod, - p.CcvTimeoutPeriod, ccvtypes.ValidateDuration), - paramtypes.NewParamSetPair(consumertypes.KeyTransferTimeoutPeriod, - p.TransferTimeoutPeriod, ccvtypes.ValidateDuration), - paramtypes.NewParamSetPair(consumertypes.KeyConsumerRedistributionFrac, - p.ConsumerRedistributionFraction, ccvtypes.ValidateStringFraction), - paramtypes.NewParamSetPair(consumertypes.KeyHistoricalEntries, - p.HistoricalEntries, ccvtypes.ValidatePositiveInt64), - paramtypes.NewParamSetPair(consumertypes.KeyConsumerUnbondingPeriod, - p.UnbondingPeriod, ccvtypes.ValidateDuration), - } -} - -// v1Params is a copy of the pb generated Params struct from v1.0.0 -type v1Params struct { - Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` - BlocksPerDistributionTransmission int64 `protobuf:"varint,2,opt,name=blocks_per_distribution_transmission,json=blocksPerDistributionTransmission,proto3" json:"blocks_per_distribution_transmission,omitempty"` - DistributionTransmissionChannel string `protobuf:"bytes,3,opt,name=distribution_transmission_channel,json=distributionTransmissionChannel,proto3" json:"distribution_transmission_channel,omitempty"` - ProviderFeePoolAddrStr string `protobuf:"bytes,4,opt,name=provider_fee_pool_addr_str,json=providerFeePoolAddrStr,proto3" json:"provider_fee_pool_addr_str,omitempty"` - CcvTimeoutPeriod time.Duration `protobuf:"bytes,5,opt,name=ccv_timeout_period,json=ccvTimeoutPeriod,proto3,stdduration" json:"ccv_timeout_period"` - TransferTimeoutPeriod time.Duration `protobuf:"bytes,6,opt,name=transfer_timeout_period,json=transferTimeoutPeriod,proto3,stdduration" json:"transfer_timeout_period"` - ConsumerRedistributionFraction string `protobuf:"bytes,7,opt,name=consumer_redistribution_fraction,json=consumerRedistributionFraction,proto3" json:"consumer_redistribution_fraction,omitempty"` - HistoricalEntries int64 `protobuf:"varint,8,opt,name=historical_entries,json=historicalEntries,proto3" json:"historical_entries,omitempty"` - UnbondingPeriod time.Duration `protobuf:"bytes,9,opt,name=unbonding_period,json=unbondingPeriod,proto3,stdduration" json:"unbonding_period"` -} diff --git a/x/ccv/consumer/keeper/params.go b/x/ccv/consumer/keeper/params.go index 9f9d37e025..ad1a0f2cb5 100644 --- a/x/ccv/consumer/keeper/params.go +++ b/x/ccv/consumer/keeper/params.go @@ -4,13 +4,15 @@ import ( "time" sdk "github.com/cosmos/cosmos-sdk/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" ) // GetParams returns the params for the consumer ccv module -func (k Keeper) GetParams(ctx sdk.Context) types.Params { +// NOTE: it is different from the GetParams method which is required to implement StakingKeeper interface +func (k Keeper) GetConsumerParams(ctx sdk.Context) types.Params { return types.NewParams( k.GetEnabled(ctx), k.GetBlocksPerDistributionTransmission(ctx), @@ -32,6 +34,14 @@ func (k Keeper) SetParams(ctx sdk.Context, params types.Params) { k.paramStore.SetParamSet(ctx, ¶ms) } +// GetParams implements StakingKeeper GetParams interface method +// it returns an a empty stakingtypes.Params struct +// NOTE: this method must be implemented on the consumer keeper because the evidence module keeper +// in cosmos-sdk v0.47 requires this exact method with this exact signature to be available on the StakingKeepr +func (k Keeper) GetParams(ctx sdk.Context) stakingtypes.Params { + return stakingtypes.Params{} +} + // GetEnabled returns the enabled flag for the consumer module func (k Keeper) GetEnabled(ctx sdk.Context) bool { var enabled bool diff --git a/x/ccv/consumer/keeper/params_test.go b/x/ccv/consumer/keeper/params_test.go index d28c964e56..d8dd63a1cb 100644 --- a/x/ccv/consumer/keeper/params_test.go +++ b/x/ccv/consumer/keeper/params_test.go @@ -33,14 +33,14 @@ func TestParams(t *testing.T) { provideRewardDenoms, ) // these are the default params, IBC suite independently sets enabled=true - params := consumerKeeper.GetParams(ctx) + params := consumerKeeper.GetConsumerParams(ctx) require.Equal(t, expParams, params) newParams := types.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"}) consumerKeeper.SetParams(ctx, newParams) - params = consumerKeeper.GetParams(ctx) + params = consumerKeeper.GetConsumerParams(ctx) require.Equal(t, newParams, params) consumerKeeper.SetBlocksPerDistributionTransmission(ctx, 10) diff --git a/x/ccv/consumer/keeper/relay.go b/x/ccv/consumer/keeper/relay.go index 2bf1580830..f57891bf98 100644 --- a/x/ccv/consumer/keeper/relay.go +++ b/x/ccv/consumer/keeper/relay.go @@ -5,14 +5,15 @@ import ( "strconv" errorsmod "cosmossdk.io/errors" + abci "github.com/cometbft/cometbft/abci/types" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - "github.com/cosmos/ibc-go/v4/modules/core/exported" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + "github.com/cosmos/ibc-go/v7/modules/core/exported" + "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" - abci "github.com/tendermint/tendermint/abci/types" ) // OnRecvVSCPacket sets the pending validator set changes that will be flushed to ABCI on Endblock @@ -123,9 +124,9 @@ func (k Keeper) QueueVSCMaturedPackets(ctx sdk.Context) { } // QueueSlashPacket appends a slash packet containing the given validator data and slashing info to queue. -func (k Keeper) QueueSlashPacket(ctx sdk.Context, validator abci.Validator, valsetUpdateID uint64, infraction stakingtypes.InfractionType) { +func (k Keeper) QueueSlashPacket(ctx sdk.Context, validator abci.Validator, valsetUpdateID uint64, infraction stakingtypes.Infraction) { consAddr := sdk.ConsAddress(validator.Address) - downtime := infraction == stakingtypes.Downtime + downtime := infraction == stakingtypes.Infraction_INFRACTION_DOWNTIME // return if an outstanding downtime request is set for the validator if downtime && k.OutstandingDowntime(ctx, consAddr) { @@ -183,7 +184,6 @@ func (k Keeper) SendPackets(ctx sdk.Context) { pending := k.GetPendingPackets(ctx) for _, p := range pending.GetList() { - // send packet over IBC err := ccv.SendIBCPacket( ctx, diff --git a/x/ccv/consumer/keeper/relay_test.go b/x/ccv/consumer/keeper/relay_test.go index 60fbbfe719..23b3d99339 100644 --- a/x/ccv/consumer/keeper/relay_test.go +++ b/x/ccv/consumer/keeper/relay_test.go @@ -6,21 +6,24 @@ import ( "testing" "time" + abci "github.com/cometbft/cometbft/abci/types" + "github.com/cometbft/cometbft/libs/bytes" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - host "github.com/cosmos/ibc-go/v4/modules/core/24-host" + + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + host "github.com/cosmos/ibc-go/v7/modules/core/24-host" + "github.com/cosmos/interchain-security/v2/testutil/crypto" testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" "github.com/cosmos/interchain-security/v2/x/ccv/types" + "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/libs/bytes" ) // TestOnRecvVSCPacket tests the behavior of OnRecvVSCPacket over various packet scenarios @@ -232,7 +235,7 @@ func TestOnAcknowledgementPacket(t *testing.T) { consumerKeeper.SetProviderChannel(ctx, channelIDToProvider) packetData := types.NewSlashPacketData( - abci.Validator{Address: bytes.HexBytes{}, Power: int64(1)}, uint64(1), stakingtypes.Downtime, + abci.Validator{Address: bytes.HexBytes{}, Power: int64(1)}, uint64(1), stakingtypes.Infraction_INFRACTION_DOWNTIME, ) // AcknowledgePacket is in reference to a packet originally sent from this (consumer) module. diff --git a/x/ccv/consumer/keeper/soft_opt_out_test.go b/x/ccv/consumer/keeper/soft_opt_out_test.go index d1c9a813de..f243b917d7 100644 --- a/x/ccv/consumer/keeper/soft_opt_out_test.go +++ b/x/ccv/consumer/keeper/soft_opt_out_test.go @@ -3,11 +3,13 @@ package keeper_test import ( "testing" + tmtypes "github.com/cometbft/cometbft/types" + "github.com/cosmos/interchain-security/v2/testutil/crypto" testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + "github.com/stretchr/testify/require" - tmtypes "github.com/tendermint/tendermint/types" ) // Tests that UpdateSmallestNonOptOutPower updates the smallest validator power that cannot soft opt out. diff --git a/x/ccv/consumer/keeper/validators.go b/x/ccv/consumer/keeper/validators.go index 0c7880602e..0f0f246833 100644 --- a/x/ccv/consumer/keeper/validators.go +++ b/x/ccv/consumer/keeper/validators.go @@ -3,12 +3,13 @@ package keeper import ( "time" + "cosmossdk.io/math" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + abci "github.com/cometbft/cometbft/abci/types" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - abci "github.com/tendermint/tendermint/abci/types" ) // @@ -51,8 +52,11 @@ func (k Keeper) ApplyCCValidatorChanges(ctx sdk.Context, changes []abci.Validato } k.SetCCValidator(ctx, ccVal) - k.AfterValidatorBonded(ctx, consAddr, nil) - + err = k.AfterValidatorBonded(ctx, consAddr, nil) + if err != nil { + // AfterValidatorBonded is called by the Slashing module and should not return an error. + panic(err) + } } else { // edge case: we received an update for 0 power // but the validator is already deleted. Do not forward @@ -102,32 +106,40 @@ func (k Keeper) ValidatorByConsAddr(sdk.Context, sdk.ConsAddress) stakingtypes.V return stakingtypes.Validator{} } +// Calls SlashWithInfractionReason with Infraction_INFRACTION_UNSPECIFIED. +// ConsumerKeeper must implement StakingKeeper interface. +// This function should not be called anywhere +func (k Keeper) Slash(ctx sdk.Context, addr sdk.ConsAddress, infractionHeight, power int64, slashFactor sdk.Dec) math.Int { + return k.SlashWithInfractionReason(ctx, addr, infractionHeight, power, slashFactor, stakingtypes.Infraction_INFRACTION_UNSPECIFIED) +} + // Slash queues a slashing request for the the provider chain // All queued slashing requests will be cleared in EndBlock -func (k Keeper) Slash(ctx sdk.Context, addr sdk.ConsAddress, infractionHeight, power int64, slashFactor sdk.Dec, infraction stakingtypes.InfractionType) { - if infraction == stakingtypes.InfractionEmpty { - return +// Called by Slashing keeper in SlashWithInfractionReason +func (k Keeper) SlashWithInfractionReason(ctx sdk.Context, addr sdk.ConsAddress, infractionHeight, power int64, slashFactor sdk.Dec, infraction stakingtypes.Infraction) math.Int { + if infraction == stakingtypes.Infraction_INFRACTION_UNSPECIFIED { + return math.NewInt(0) } // If this is a previously standalone chain and infraction happened before the changeover was completed, // slash only on the standalone staking keeper. if k.IsPrevStandaloneChain(ctx) && infractionHeight < k.FirstConsumerHeight(ctx) { - k.standaloneStakingKeeper.Slash(ctx, addr, infractionHeight, power, slashFactor, stakingtypes.InfractionEmpty) - return + // Slash for a standalone chain does not require an infraction reason so we pass in Infraction_INFRACTION_UNSPECIFIED + return k.standaloneStakingKeeper.SlashWithInfractionReason(ctx, addr, infractionHeight, power, slashFactor, stakingtypes.Infraction_INFRACTION_UNSPECIFIED) } // Otherwise infraction happened after the changeover was completed. // if this is a downtime infraction and the validator is allowed to // soft opt out, do not queue a slash packet - if infraction == stakingtypes.Downtime { + if infraction == stakingtypes.Infraction_INFRACTION_DOWNTIME { if power < k.GetSmallestNonOptOutPower(ctx) { // soft opt out k.Logger(ctx).Debug("soft opt out", "validator", addr, "power", power, ) - return + return math.NewInt(0) } } // get VSC ID for infraction height @@ -138,6 +150,9 @@ func (k Keeper) Slash(ctx sdk.Context, addr sdk.ConsAddress, infractionHeight, p "vscID", vscID, ) + // this is the most important step in the function + // everything else is just here to implement StakingKeeper interface + // IBC packets are created from slash data and sent to the provider during EndBlock k.QueueSlashPacket( ctx, abci.Validator{ @@ -147,6 +162,9 @@ func (k Keeper) Slash(ctx sdk.Context, addr sdk.ConsAddress, infractionHeight, p vscID, infraction, ) + + // Only return to comply with the interface restriction + return math.ZeroInt() } // Jail - unimplemented on CCV keeper @@ -286,3 +304,9 @@ func (k Keeper) MustGetCurrentValidatorsAsABCIUpdates(ctx sdk.Context) []abci.Va } return valUpdates } + +// implement interface method needed for x/genutil in sdk v47 +// returns empty updates and err +func (k Keeper) ApplyAndReturnValidatorSetUpdates(sdk.Context) (updates []abci.ValidatorUpdate, err error) { + return +} diff --git a/x/ccv/consumer/keeper/validators_test.go b/x/ccv/consumer/keeper/validators_test.go index a5ad0898e2..c9ce541794 100644 --- a/x/ccv/consumer/keeper/validators_test.go +++ b/x/ccv/consumer/keeper/validators_test.go @@ -3,6 +3,10 @@ package keeper_test import ( "testing" + "cosmossdk.io/math" + abci "github.com/cometbft/cometbft/abci/types" + tmrand "github.com/cometbft/cometbft/libs/rand" + tmtypes "github.com/cometbft/cometbft/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -11,9 +15,6 @@ import ( "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" - tmrand "github.com/tendermint/tendermint/libs/rand" - tmtypes "github.com/tendermint/tendermint/types" ) // TestApplyCCValidatorChanges tests the ApplyCCValidatorChanges method for a consumer keeper @@ -147,7 +148,7 @@ func TestSlash(t *testing.T) { defer ctrl.Finish() // If we call slash with infraction type empty, no slash packet will be queued - consumerKeeper.Slash(ctx, []byte{0x01, 0x02, 0x03}, 5, 6, sdk.NewDec(9.0), stakingtypes.InfractionEmpty) + consumerKeeper.SlashWithInfractionReason(ctx, []byte{0x01, 0x02, 0x03}, 5, 6, sdk.NewDec(9.0), stakingtypes.Infraction_INFRACTION_UNSPECIFIED) pendingPackets := consumerKeeper.GetPendingPackets(ctx) require.Len(t, pendingPackets.List, 0) @@ -158,7 +159,7 @@ func TestSlash(t *testing.T) { consumerKeeper.SetHeightValsetUpdateID(ctx, 5, 6) // Call slash with valid infraction type and confirm 1 slash packet is queued - consumerKeeper.Slash(ctx, []byte{0x01, 0x02, 0x03}, 5, 6, sdk.NewDec(9.0), stakingtypes.Downtime) + consumerKeeper.SlashWithInfractionReason(ctx, []byte{0x01, 0x02, 0x03}, 5, 6, sdk.NewDec(9.0), stakingtypes.Infraction_INFRACTION_DOWNTIME) pendingPackets = consumerKeeper.GetPendingPackets(ctx) require.Len(t, pendingPackets.List, 1) @@ -173,21 +174,21 @@ func TestSlash(t *testing.T) { // If we call slash with infraction type empty, standalone staking keeper's slash will not be called // (if it was called, test would panic without mocking the call) - consumerKeeper.Slash(ctx, []byte{0x01, 0x02, 0x03}, 5, 6, sdk.NewDec(9.0), stakingtypes.InfractionEmpty) + consumerKeeper.SlashWithInfractionReason(ctx, []byte{0x01, 0x02, 0x03}, 5, 6, sdk.NewDec(9.0), stakingtypes.Infraction_INFRACTION_UNSPECIFIED) // Now setup a mock for Slash, and confirm that it is called against // standalone staking keeper with valid infraction type infractionHeight := int64(5) - mocks.MockStakingKeeper.EXPECT().Slash( + mocks.MockStakingKeeper.EXPECT().SlashWithInfractionReason( ctx, []byte{0x01, 0x02, 0x03}, infractionHeight, int64(6), - sdk.MustNewDecFromStr("0.05"), stakingtypes.InfractionEmpty).Times(1) // We pass empty infraction to standalone staking keeper since it's not used + sdk.MustNewDecFromStr("0.05"), stakingtypes.Infraction_INFRACTION_UNSPECIFIED).Times(1) // We pass empty infraction to standalone staking keeper since it's not used // Also setup init genesis height s.t. infraction height is before first consumer height consumerKeeper.SetInitGenesisHeight(ctx, 4) require.Equal(t, consumerKeeper.FirstConsumerHeight(ctx), int64(6)) - consumerKeeper.Slash(ctx, []byte{0x01, 0x02, 0x03}, infractionHeight, 6, - sdk.MustNewDecFromStr("0.05"), stakingtypes.Downtime) + consumerKeeper.SlashWithInfractionReason(ctx, []byte{0x01, 0x02, 0x03}, infractionHeight, 6, + sdk.MustNewDecFromStr("0.05"), stakingtypes.Infraction_INFRACTION_DOWNTIME) } // Tests the getter and setter behavior for historical info @@ -233,7 +234,7 @@ func TestHistoricalInfo(t *testing.T) { } // IsValSetSorted reports whether valset is sorted. -func IsValSetSorted(data []stakingtypes.Validator, powerReduction sdk.Int) bool { +func IsValSetSorted(data []stakingtypes.Validator, powerReduction math.Int) bool { n := len(data) for i := n - 1; i > 0; i-- { if stakingtypes.ValidatorsByVotingPower(data).Less(i, i-1, powerReduction) { diff --git a/x/ccv/consumer/module.go b/x/ccv/consumer/module.go index 61d62293f2..0e87463884 100644 --- a/x/ccv/consumer/module.go +++ b/x/ccv/consumer/module.go @@ -4,13 +4,12 @@ import ( "context" "encoding/json" "fmt" - "math/rand" + abci "github.com/cometbft/cometbft/abci/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/gorilla/mux" + "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" - abci "github.com/tendermint/tendermint/abci/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" @@ -18,7 +17,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" - porttypes "github.com/cosmos/ibc-go/v4/modules/core/05-port/types" + porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" "github.com/cosmos/interchain-security/v2/x/ccv/consumer/client/cli" "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" @@ -66,10 +65,6 @@ func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config client.TxEncod return data.Validate() } -// RegisterRESTRoutes implements AppModuleBasic interface -func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Router) { -} - // RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the ibc-consumer module. func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) { err := consumertypes.RegisterQueryHandlerClient(context.Background(), mux, consumertypes.NewQueryClient(clientCtx)) @@ -109,29 +104,9 @@ func (AppModule) RegisterInvariants(ir sdk.InvariantRegistry) { // TODO } -// Route implements the AppModule interface -func (am AppModule) Route() sdk.Route { - return sdk.Route{} -} - -// QuerierRoute implements the AppModule interface -func (AppModule) QuerierRoute() string { - return consumertypes.QuerierRoute -} - -// LegacyQuerierHandler implements the AppModule interface -func (am AppModule) LegacyQuerierHandler(*codec.LegacyAmino) sdk.Querier { - return nil -} - // RegisterServices registers module services. func (am AppModule) RegisterServices(cfg module.Configurator) { consumertypes.RegisterQueryServer(cfg.QueryServer(), am.keeper) - - m := keeper.NewMigrator(am.keeper, am.paramSpace) - if err := cfg.RegisterMigration(consumertypes.ModuleName, 1, m.Migratev1Tov2); err != nil { - panic(fmt.Sprintf("failed to register migrator: %s", err)) - } } // InitGenesis performs genesis initialization for the consumer module. It returns @@ -228,17 +203,6 @@ func (am AppModule) EndBlock(ctx sdk.Context, req abci.RequestEndBlock) []abci.V func (AppModule) GenerateGenesisState(simState *module.SimulationState) { } -// ProposalContents doesn't return any content functions for governance proposals. -func (AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalContent { - return nil -} - -// RandomizedParams creates randomized consumer param changes for the simulator. -// TODO -func (AppModule) RandomizedParams(r *rand.Rand) []simtypes.ParamChange { - return nil -} - // RegisterStoreDecoder registers a decoder for consumer module's types // TODO func (am AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) { diff --git a/x/ccv/consumer/types/consumer.pb.go b/x/ccv/consumer/types/consumer.pb.go index 1c457d2277..dd5d991666 100644 --- a/x/ccv/consumer/types/consumer.pb.go +++ b/x/ccv/consumer/types/consumer.pb.go @@ -5,12 +5,12 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/codec/types" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" + github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" _ "github.com/cosmos/interchain-security/v2/x/ccv/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - _ "github.com/regen-network/cosmos-proto" _ "google.golang.org/protobuf/types/known/durationpb" _ "google.golang.org/protobuf/types/known/timestamppb" io "io" @@ -64,13 +64,15 @@ type Params struct { // which should be smaller than that of the provider in general. UnbondingPeriod time.Duration `protobuf:"bytes,9,opt,name=unbonding_period,json=unbondingPeriod,proto3,stdduration" json:"unbonding_period"` // 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 + // 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 SoftOptOutThreshold string `protobuf:"bytes,10,opt,name=soft_opt_out_threshold,json=softOptOutThreshold,proto3" json:"soft_opt_out_threshold,omitempty"` - // Reward denoms. These are the denominations which are allowed to be sent to the provider as rewards. + // Reward denoms. These are the denominations which are allowed to be sent to + // the provider as rewards. RewardDenoms []string `protobuf:"bytes,11,rep,name=reward_denoms,json=rewardDenoms,proto3" json:"reward_denoms,omitempty"` - // Provider-originated reward denoms. These are denoms coming from the provider - // which are allowed to be used as rewards. e.g. "uatom" + // 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"` } @@ -462,7 +464,7 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x52 } - n1, err1 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.UnbondingPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.UnbondingPeriod):]) + 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 } @@ -482,7 +484,7 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x3a } - n2, err2 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.TransferTimeoutPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.TransferTimeoutPeriod):]) + 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 } @@ -490,7 +492,7 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintConsumer(dAtA, i, uint64(n2)) i-- dAtA[i] = 0x32 - n3, err3 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.CcvTimeoutPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.CcvTimeoutPeriod):]) + n3, err3 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.CcvTimeoutPeriod, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.CcvTimeoutPeriod):]) if err3 != nil { return 0, err3 } @@ -625,7 +627,7 @@ func (m *MaturingVSCPacket) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - n5, err5 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.MaturityTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.MaturityTime):]) + n5, err5 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.MaturityTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.MaturityTime):]) if err5 != nil { return 0, err5 } @@ -672,9 +674,9 @@ func (m *Params) Size() (n int) { if l > 0 { n += 1 + l + sovConsumer(uint64(l)) } - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.CcvTimeoutPeriod) + l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.CcvTimeoutPeriod) n += 1 + l + sovConsumer(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.TransferTimeoutPeriod) + l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.TransferTimeoutPeriod) n += 1 + l + sovConsumer(uint64(l)) l = len(m.ConsumerRedistributionFraction) if l > 0 { @@ -683,7 +685,7 @@ func (m *Params) Size() (n int) { if m.HistoricalEntries != 0 { n += 1 + sovConsumer(uint64(m.HistoricalEntries)) } - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.UnbondingPeriod) + l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.UnbondingPeriod) n += 1 + l + sovConsumer(uint64(l)) l = len(m.SoftOptOutThreshold) if l > 0 { @@ -745,7 +747,7 @@ func (m *MaturingVSCPacket) Size() (n int) { if m.VscId != 0 { n += 1 + sovConsumer(uint64(m.VscId)) } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.MaturityTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.MaturityTime) n += 1 + l + sovConsumer(uint64(l)) return n } @@ -917,7 +919,7 @@ func (m *Params) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.CcvTimeoutPeriod, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(&m.CcvTimeoutPeriod, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -950,7 +952,7 @@ func (m *Params) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.TransferTimeoutPeriod, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(&m.TransferTimeoutPeriod, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -1034,7 +1036,7 @@ func (m *Params) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.UnbondingPeriod, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(&m.UnbondingPeriod, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -1440,7 +1442,7 @@ func (m *MaturingVSCPacket) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.MaturityTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.MaturityTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/ccv/consumer/types/genesis.go b/x/ccv/consumer/types/genesis.go index a21e434de3..54f6fe9651 100644 --- a/x/ccv/consumer/types/genesis.go +++ b/x/ccv/consumer/types/genesis.go @@ -2,10 +2,10 @@ package types import ( errorsmod "cosmossdk.io/errors" - ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + abci "github.com/cometbft/cometbft/abci/types" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - abci "github.com/tendermint/tendermint/abci/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" ) // NewInitialGenesisState returns a consumer GenesisState for a completely new consumer chain. diff --git a/x/ccv/consumer/types/genesis.pb.go b/x/ccv/consumer/types/genesis.pb.go index 7e5da62359..cbf6675902 100644 --- a/x/ccv/consumer/types/genesis.pb.go +++ b/x/ccv/consumer/types/genesis.pb.go @@ -5,12 +5,12 @@ package types import ( fmt "fmt" - _ "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - types "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - types2 "github.com/cosmos/interchain-security/v2/x/ccv/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - types1 "github.com/tendermint/tendermint/abci/types" + types "github.com/cometbft/cometbft/abci/types" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" + _ "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + _07_tendermint "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + types1 "github.com/cosmos/interchain-security/v2/x/ccv/types" _ "google.golang.org/protobuf/types/known/durationpb" io "io" math "math" @@ -35,19 +35,19 @@ type GenesisState struct { ProviderChannelId string `protobuf:"bytes,3,opt,name=provider_channel_id,json=providerChannelId,proto3" json:"provider_channel_id,omitempty"` NewChain bool `protobuf:"varint,4,opt,name=new_chain,json=newChain,proto3" json:"new_chain,omitempty"` // ProviderClientState filled in on new chain, nil on restart. - ProviderClientState *types.ClientState `protobuf:"bytes,5,opt,name=provider_client_state,json=providerClientState,proto3" json:"provider_client_state,omitempty"` + ProviderClientState *_07_tendermint.ClientState `protobuf:"bytes,5,opt,name=provider_client_state,json=providerClientState,proto3" json:"provider_client_state,omitempty"` // ProviderConsensusState filled in on new chain, nil on restart. - ProviderConsensusState *types.ConsensusState `protobuf:"bytes,6,opt,name=provider_consensus_state,json=providerConsensusState,proto3" json:"provider_consensus_state,omitempty"` + ProviderConsensusState *_07_tendermint.ConsensusState `protobuf:"bytes,6,opt,name=provider_consensus_state,json=providerConsensusState,proto3" json:"provider_consensus_state,omitempty"` // MaturingPackets nil on new chain, filled in on restart. MaturingPackets []MaturingVSCPacket `protobuf:"bytes,7,rep,name=maturing_packets,json=maturingPackets,proto3" json:"maturing_packets"` // InitialValset filled in on new chain and on restart. - InitialValSet []types1.ValidatorUpdate `protobuf:"bytes,8,rep,name=initial_val_set,json=initialValSet,proto3" json:"initial_val_set"` + InitialValSet []types.ValidatorUpdate `protobuf:"bytes,8,rep,name=initial_val_set,json=initialValSet,proto3" json:"initial_val_set"` // HeightToValsetUpdateId nil on new chain, filled in on restart. HeightToValsetUpdateId []HeightToValsetUpdateID `protobuf:"bytes,9,rep,name=height_to_valset_update_id,json=heightToValsetUpdateId,proto3" json:"height_to_valset_update_id"` // OutstandingDowntimes nil on new chain, filled in on restart. OutstandingDowntimeSlashing []OutstandingDowntime `protobuf:"bytes,10,rep,name=outstanding_downtime_slashing,json=outstandingDowntimeSlashing,proto3" json:"outstanding_downtime_slashing"` // PendingConsumerPackets nil on new chain, filled in on restart. - PendingConsumerPackets types2.ConsumerPacketDataList `protobuf:"bytes,11,opt,name=pending_consumer_packets,json=pendingConsumerPackets,proto3" json:"pending_consumer_packets"` + PendingConsumerPackets types1.ConsumerPacketDataList `protobuf:"bytes,11,opt,name=pending_consumer_packets,json=pendingConsumerPackets,proto3" json:"pending_consumer_packets"` // LastTransmissionBlockHeight nil on new chain, filled in on restart. LastTransmissionBlockHeight LastTransmissionBlockHeight `protobuf:"bytes,12,opt,name=last_transmission_block_height,json=lastTransmissionBlockHeight,proto3" json:"last_transmission_block_height"` PreCCV bool `protobuf:"varint,13,opt,name=preCCV,proto3" json:"preCCV,omitempty"` @@ -114,14 +114,14 @@ func (m *GenesisState) GetNewChain() bool { return false } -func (m *GenesisState) GetProviderClientState() *types.ClientState { +func (m *GenesisState) GetProviderClientState() *_07_tendermint.ClientState { if m != nil { return m.ProviderClientState } return nil } -func (m *GenesisState) GetProviderConsensusState() *types.ConsensusState { +func (m *GenesisState) GetProviderConsensusState() *_07_tendermint.ConsensusState { if m != nil { return m.ProviderConsensusState } @@ -135,7 +135,7 @@ func (m *GenesisState) GetMaturingPackets() []MaturingVSCPacket { return nil } -func (m *GenesisState) GetInitialValSet() []types1.ValidatorUpdate { +func (m *GenesisState) GetInitialValSet() []types.ValidatorUpdate { if m != nil { return m.InitialValSet } @@ -156,11 +156,11 @@ func (m *GenesisState) GetOutstandingDowntimeSlashing() []OutstandingDowntime { return nil } -func (m *GenesisState) GetPendingConsumerPackets() types2.ConsumerPacketDataList { +func (m *GenesisState) GetPendingConsumerPackets() types1.ConsumerPacketDataList { if m != nil { return m.PendingConsumerPackets } - return types2.ConsumerPacketDataList{} + return types1.ConsumerPacketDataList{} } func (m *GenesisState) GetLastTransmissionBlockHeight() LastTransmissionBlockHeight { @@ -853,7 +853,7 @@ func (m *GenesisState) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.ProviderClientState == nil { - m.ProviderClientState = &types.ClientState{} + m.ProviderClientState = &_07_tendermint.ClientState{} } if err := m.ProviderClientState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -889,7 +889,7 @@ func (m *GenesisState) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.ProviderConsensusState == nil { - m.ProviderConsensusState = &types.ConsensusState{} + m.ProviderConsensusState = &_07_tendermint.ConsensusState{} } if err := m.ProviderConsensusState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -958,7 +958,7 @@ func (m *GenesisState) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.InitialValSet = append(m.InitialValSet, types1.ValidatorUpdate{}) + m.InitialValSet = append(m.InitialValSet, types.ValidatorUpdate{}) if err := m.InitialValSet[len(m.InitialValSet)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } diff --git a/x/ccv/consumer/types/genesis_test.go b/x/ccv/consumer/types/genesis_test.go index 0398b39f54..af1badb73b 100644 --- a/x/ccv/consumer/types/genesis_test.go +++ b/x/ccv/consumer/types/genesis_test.go @@ -7,14 +7,14 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - commitmenttypes "github.com/cosmos/ibc-go/v4/modules/core/23-commitment/types" - ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - abci "github.com/tendermint/tendermint/abci/types" + abci "github.com/cometbft/cometbft/abci/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - tmtypes "github.com/tendermint/tendermint/types" + tmtypes "github.com/cometbft/cometbft/types" "github.com/cosmos/interchain-security/v2/testutil/crypto" @@ -47,7 +47,7 @@ func TestValidateInitialGenesisState(t *testing.T) { valHash := valSet.Hash() valUpdates := tmtypes.TM2PB.ValidatorUpdates(valSet) - cs := ibctmtypes.NewClientState(chainID, ibctmtypes.DefaultTrustLevel, trustingPeriod, ubdPeriod, maxClockDrift, height, commitmenttypes.GetSDKSpecs(), upgradePath, false, false) + cs := ibctmtypes.NewClientState(chainID, ibctmtypes.DefaultTrustLevel, trustingPeriod, ubdPeriod, maxClockDrift, height, commitmenttypes.GetSDKSpecs(), upgradePath) consensusState := ibctmtypes.NewConsensusState(time.Now(), commitmenttypes.NewMerkleRoot([]byte("apphash")), valHash) params := types.DefaultParams() @@ -285,7 +285,7 @@ func TestValidateRestartGenesisState(t *testing.T) { SlashPacketData: ccv.NewSlashPacketData( abci.Validator{Address: pubKey.Address(), Power: int64(1)}, 1, - stakingtypes.Downtime), + stakingtypes.Infraction_INFRACTION_DOWNTIME), }, } @@ -294,7 +294,7 @@ func TestValidateRestartGenesisState(t *testing.T) { {Height: 0, ValsetUpdateId: 0}, } - cs := ibctmtypes.NewClientState(chainID, ibctmtypes.DefaultTrustLevel, trustingPeriod, ubdPeriod, maxClockDrift, height, commitmenttypes.GetSDKSpecs(), upgradePath, false, false) + cs := ibctmtypes.NewClientState(chainID, ibctmtypes.DefaultTrustLevel, trustingPeriod, ubdPeriod, maxClockDrift, height, commitmenttypes.GetSDKSpecs(), upgradePath) consensusState := ibctmtypes.NewConsensusState(time.Now(), commitmenttypes.NewMerkleRoot([]byte("apphash")), valHash) params := types.DefaultParams() diff --git a/x/ccv/consumer/types/query.pb.go b/x/ccv/consumer/types/query.pb.go index 53c84a1f47..a89562d8e1 100644 --- a/x/ccv/consumer/types/query.pb.go +++ b/x/ccv/consumer/types/query.pb.go @@ -6,9 +6,9 @@ package types import ( context "context" fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" diff --git a/x/ccv/democracy/distribution/module.go b/x/ccv/democracy/distribution/module.go index b0008e7082..3d5ca0ed74 100644 --- a/x/ccv/democracy/distribution/module.go +++ b/x/ccv/democracy/distribution/module.go @@ -9,13 +9,14 @@ import ( "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" distr "github.com/cosmos/cosmos-sdk/x/distribution" + "github.com/cosmos/cosmos-sdk/x/distribution/exported" "github.com/cosmos/cosmos-sdk/x/distribution/keeper" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + abci "github.com/cometbft/cometbft/abci/types" distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - abci "github.com/tendermint/tendermint/abci/types" ) var ( @@ -46,9 +47,9 @@ type AppModule struct { // AppModule constructor. func NewAppModule( cdc codec.Codec, keeper keeper.Keeper, ak distrtypes.AccountKeeper, - bk distrtypes.BankKeeper, sk stakingkeeper.Keeper, feeCollectorName string, + bk distrtypes.BankKeeper, sk stakingkeeper.Keeper, feeCollectorName string, subspace exported.Subspace, ) AppModule { - distrAppMod := distr.NewAppModule(cdc, keeper, ak, bk, sk) + distrAppMod := distr.NewAppModule(cdc, keeper, ak, bk, sk, subspace) return AppModule{ AppModule: distrAppMod, keeper: keeper, diff --git a/x/ccv/democracy/governance/module.go b/x/ccv/democracy/governance/module.go index f90e93d7a9..c293a9e3e3 100644 --- a/x/ccv/democracy/governance/module.go +++ b/x/ccv/democracy/governance/module.go @@ -7,10 +7,12 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" + abci "github.com/cometbft/cometbft/abci/types" gov "github.com/cosmos/cosmos-sdk/x/gov" - "github.com/cosmos/cosmos-sdk/x/gov/keeper" + govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - abci "github.com/tendermint/tendermint/abci/types" + govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" ) const ( @@ -27,22 +29,35 @@ type AppModule struct { // embed the Cosmos SDK's x/governance AppModule gov.AppModule - keeper keeper.Keeper - isProposalWhitelisted func(govtypes.Content) bool + keeper govkeeper.Keeper + isLegacyProposalWhitelisted func(govv1beta1.Content) bool + isModuleWhiteList func(string) bool +} + +type ParamChangeKey struct { + MsgType, Key string } // NewAppModule creates a new AppModule object using the native x/governance module AppModule constructor. -func NewAppModule(cdc codec.Codec, keeper keeper.Keeper, ak govtypes.AccountKeeper, bk govtypes.BankKeeper, isProposalWhitelisted func(govtypes.Content) bool) AppModule { - govAppModule := gov.NewAppModule(cdc, keeper, ak, bk) +func NewAppModule(cdc codec.Codec, + keeper govkeeper.Keeper, + ak govtypes.AccountKeeper, + bk govtypes.BankKeeper, + isProposalWhitelisted func(govv1beta1.Content) bool, + ss govtypes.ParamSubspace, + isModuleWhiteList func(string) bool, +) AppModule { + govAppModule := gov.NewAppModule(cdc, &keeper, ak, bk, ss) return AppModule{ - AppModule: govAppModule, - keeper: keeper, - isProposalWhitelisted: isProposalWhitelisted, + AppModule: govAppModule, + keeper: keeper, + isLegacyProposalWhitelisted: isProposalWhitelisted, + isModuleWhiteList: isModuleWhiteList, } } func (am AppModule) EndBlock(ctx sdk.Context, request abci.RequestEndBlock) []abci.ValidatorUpdate { - am.keeper.IterateActiveProposalsQueue(ctx, ctx.BlockHeader().Time, func(proposal govtypes.Proposal) bool { + am.keeper.IterateActiveProposalsQueue(ctx, ctx.BlockHeader().Time, func(proposal govv1.Proposal) bool { // if there are forbidden proposals in active proposals queue, refund deposit, delete votes for that proposal // and delete proposal from all storages deleteForbiddenProposal(ctx, am, proposal) @@ -52,8 +67,35 @@ func (am AppModule) EndBlock(ctx sdk.Context, request abci.RequestEndBlock) []ab return am.AppModule.EndBlock(ctx, request) } -func deleteForbiddenProposal(ctx sdk.Context, am AppModule, proposal govtypes.Proposal) { - if am.isProposalWhitelisted(proposal.GetContent()) { +// isProposalWhitelisted checks whether a proposal is whitelisted +func isProposalWhitelisted(ctx sdk.Context, am AppModule, proposal govv1.Proposal) bool { + messages := proposal.GetMessages() + + // iterate over all the proposal messages + for _, message := range messages { + sdkMsg, isLegacyProposal := message.GetCachedValue().(*govv1.MsgExecLegacyContent) + if isLegacyProposal { + // legacy gov proposal content + content, err := govv1.LegacyContentFromMessage(sdkMsg) + if err != nil { + continue + } + if !am.isLegacyProposalWhitelisted(content) { + // not whitelisted + return false + } + // not legacy gov proposal content + } else if !am.isModuleWhiteList(message.TypeUrl) { + // not whitelisted + return false + } + } + return true +} + +// deleteForbiddenProposal removes proposals that are not whitelisted +func deleteForbiddenProposal(ctx sdk.Context, am AppModule, proposal govv1.Proposal) { + if isProposalWhitelisted(ctx, am, proposal) { return } @@ -63,13 +105,13 @@ func deleteForbiddenProposal(ctx sdk.Context, am AppModule, proposal govtypes.Pr // private and cannot be called directly from the overridden app module am.keeper.Tally(ctx, proposal) - am.keeper.DeleteProposal(ctx, proposal.ProposalId) - am.keeper.RefundDeposits(ctx, proposal.ProposalId) + am.keeper.DeleteProposal(ctx, proposal.Id) + am.keeper.RefundAndDeleteDeposits(ctx, proposal.Id) ctx.EventManager().EmitEvent( sdk.NewEvent( govtypes.EventTypeActiveProposal, - sdk.NewAttribute(govtypes.AttributeKeyProposalID, fmt.Sprintf("%d", proposal.ProposalId)), + sdk.NewAttribute(govtypes.AttributeKeyProposalID, fmt.Sprintf("%d", proposal.Id)), sdk.NewAttribute(govtypes.AttributeKeyProposalResult, AttributeValueProposalForbidden), ), ) @@ -77,7 +119,7 @@ func deleteForbiddenProposal(ctx sdk.Context, am AppModule, proposal govtypes.Pr logger := am.keeper.Logger(ctx) logger.Info( "proposal is not whitelisted; deleted", - "proposal", proposal.ProposalId, + "proposal", proposal.Id, "title", proposal.GetTitle(), - "total_deposit", proposal.TotalDeposit.String()) + "total_deposit", proposal.TotalDeposit) } diff --git a/x/ccv/democracy/staking/module.go b/x/ccv/democracy/staking/module.go index d2eaf26adb..78489a0166 100644 --- a/x/ccv/democracy/staking/module.go +++ b/x/ccv/democracy/staking/module.go @@ -3,13 +3,14 @@ package staking import ( "encoding/json" + abci "github.com/cometbft/cometbft/abci/types" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/x/staking" + "github.com/cosmos/cosmos-sdk/x/staking/exported" "github.com/cosmos/cosmos-sdk/x/staking/keeper" "github.com/cosmos/cosmos-sdk/x/staking/types" - abci "github.com/tendermint/tendermint/abci/types" ) // Note: for a democracy consumer, this "democracy staking" keeper is only for governance capabilities, @@ -39,8 +40,8 @@ type AppModule struct { // NewAppModule creates a new AppModule object using the native x/staking module // AppModule constructor. -func NewAppModule(cdc codec.Codec, keeper keeper.Keeper, ak types.AccountKeeper, bk types.BankKeeper) AppModule { - stakingAppMod := staking.NewAppModule(cdc, keeper, ak, bk) +func NewAppModule(cdc codec.Codec, keeper keeper.Keeper, ak types.AccountKeeper, bk types.BankKeeper, subspace exported.Subspace) AppModule { + stakingAppMod := staking.NewAppModule(cdc, &keeper, ak, bk, subspace) return AppModule{ AppModule: stakingAppMod, keeper: keeper, @@ -61,7 +62,7 @@ func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, data json. var genesisState types.GenesisState cdc.MustUnmarshalJSON(data, &genesisState) - _ = staking.InitGenesis(ctx, am.keeper, am.accKeeper, am.bankKeeper, &genesisState) + _ = am.keeper.InitGenesis(ctx, &genesisState) return []abci.ValidatorUpdate{} } diff --git a/x/ccv/provider/client/cli/tx.go b/x/ccv/provider/client/cli/tx.go index 73b1df34c3..a0b9343d8a 100644 --- a/x/ccv/provider/client/cli/tx.go +++ b/x/ccv/provider/client/cli/tx.go @@ -42,8 +42,11 @@ func NewAssignConsumerKeyCmd() *cobra.Command { return err } - txf := tx.NewFactoryCLI(clientCtx, cmd.Flags()). - WithTxConfig(clientCtx.TxConfig).WithAccountRetriever(clientCtx.AccountRetriever) + txf, err := tx.NewFactoryCLI(clientCtx, cmd.Flags()) + if err != nil { + return err + } + txf = txf.WithTxConfig(clientCtx.TxConfig).WithAccountRetriever(clientCtx.AccountRetriever) providerValAddr := clientCtx.GetFromAddress() diff --git a/x/ccv/provider/client/proposal_handler.go b/x/ccv/provider/client/proposal_handler.go index 76491b86d2..6ccd855ef8 100644 --- a/x/ccv/provider/client/proposal_handler.go +++ b/x/ccv/provider/client/proposal_handler.go @@ -4,7 +4,6 @@ import ( "context" "encoding/json" "fmt" - "net/http" "os" "path/filepath" "time" @@ -12,20 +11,20 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/tx" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/rest" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govclient "github.com/cosmos/cosmos-sdk/x/gov/client" - govrest "github.com/cosmos/cosmos-sdk/x/gov/client/rest" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" "github.com/spf13/cobra" ) var ( - ConsumerAdditionProposalHandler = govclient.NewProposalHandler(SubmitConsumerAdditionPropTxCmd, ConsumerAdditionProposalRESTHandler) - ConsumerRemovalProposalHandler = govclient.NewProposalHandler(SubmitConsumerRemovalProposalTxCmd, ConsumerRemovalProposalRESTHandler) - EquivocationProposalHandler = govclient.NewProposalHandler(SubmitEquivocationProposalTxCmd, EquivocationProposalRESTHandler) + ConsumerAdditionProposalHandler = govclient.NewProposalHandler(SubmitConsumerAdditionPropTxCmd) + ConsumerRemovalProposalHandler = govclient.NewProposalHandler(SubmitConsumerRemovalProposalTxCmd) + EquivocationProposalHandler = govclient.NewProposalHandler(SubmitEquivocationProposalTxCmd) ) // SubmitConsumerAdditionPropTxCmd returns a CLI command handler for submitting @@ -41,13 +40,13 @@ The proposal details must be supplied via a JSON file. Unbonding period, transfer timeout period and ccv timeout period should be provided as nanosecond time periods. Example: -$ tx gov submit-proposal consumer-addition --from= +$ tx gov submit-legacy-proposal consumer-addition --from= Where proposal.json contains: { "title": "Create the FooChain", - "description": "Gonna be a great chain", + "summary": "Gonna be a great chain", "chain_id": "foochain", "initial_height": { "revision_number": 2, @@ -81,7 +80,7 @@ Where proposal.json contains: CheckPropUnbondingPeriod(clientCtx, proposal.UnbondingPeriod) content := types.NewConsumerAdditionProposal( - proposal.Title, proposal.Description, proposal.ChainId, proposal.InitialHeight, + proposal.Title, proposal.Summary, proposal.ChainId, proposal.InitialHeight, proposal.GenesisHash, proposal.BinaryHash, proposal.SpawnTime, proposal.ConsumerRedistributionFraction, proposal.BlocksPerDistributionTransmission, proposal.DistributionTransmissionChannel, proposal.HistoricalEntries, @@ -94,7 +93,12 @@ Where proposal.json contains: return err } - msg, err := govtypes.NewMsgSubmitProposal(content, deposit, from) + msgContent, err := govv1.NewLegacyContent(content, authtypes.NewModuleAddress(govtypes.ModuleName).String()) + if err != nil { + return err + } + + msg, err := govv1.NewMsgSubmitProposal([]sdk.Msg{msgContent}, deposit, from.String(), "", content.GetTitle(), proposal.Summary) if err != nil { return err } @@ -116,12 +120,12 @@ Submit a consumer chain removal proposal along with an initial deposit. The proposal details must be supplied via a JSON file. Example: -$ tx gov submit-proposal consumer-removal --from= +$ tx gov submit-legacy-proposal consumer-removal --from= Where proposal.json contains: { "title": "Stop the FooChain", - "description": "It was a great chain", + "summary": "It was a great chain", "chain_id": "foochain", "stop_time": "2022-01-27T15:59:50.121607-08:00", "deposit": "10000stake" @@ -137,17 +141,20 @@ Where proposal.json contains: return err } - content := types.NewConsumerRemovalProposal( - proposal.Title, proposal.Description, proposal.ChainId, proposal.StopTime) - + content := types.NewConsumerRemovalProposal(proposal.Title, proposal.Summary, proposal.ChainId, proposal.StopTime) from := clientCtx.GetFromAddress() + msgContent, err := govv1.NewLegacyContent(content, authtypes.NewModuleAddress(govtypes.ModuleName).String()) + if err != nil { + return err + } + deposit, err := sdk.ParseCoinsNormalized(proposal.Deposit) if err != nil { return err } - msg, err := govtypes.NewMsgSubmitProposal(content, deposit, from) + msg, err := govv1.NewMsgSubmitProposal([]sdk.Msg{msgContent}, deposit, from.String(), "", content.GetTitle(), proposal.Summary) if err != nil { return err } @@ -168,12 +175,12 @@ func SubmitEquivocationProposalTxCmd() *cobra.Command { The proposal details must be supplied via a JSON file. Example: -$ tx gov submit-proposal equivocation --from= +$ tx gov submit-legacy-proposal equivocation --from= Where proposal.json contains: { "title": "Equivoque Foo validator", - "description": "He double-signs on the Foobar consumer chain", + "summary": "He double-signs on the Foobar consumer chain", "equivocations": [ { "height": 10420042, @@ -196,16 +203,21 @@ Where proposal.json contains: return err } - content := types.NewEquivocationProposal(proposal.Title, proposal.Description, proposal.Equivocations) + content := types.NewEquivocationProposal(proposal.Title, proposal.Summary, proposal.Equivocations) from := clientCtx.GetFromAddress() + msgContent, err := govv1.NewLegacyContent(content, authtypes.NewModuleAddress(govtypes.ModuleName).String()) + if err != nil { + return err + } + deposit, err := sdk.ParseCoinsNormalized(proposal.Deposit) if err != nil { return err } - msg, err := govtypes.NewMsgSubmitProposal(content, deposit, from) + msg, err := govv1.NewMsgSubmitProposal([]sdk.Msg{msgContent}, deposit, from.String(), "", content.GetTitle(), proposal.Summary) if err != nil { return err } @@ -217,7 +229,7 @@ Where proposal.json contains: type ConsumerAdditionProposalJSON struct { Title string `json:"title"` - Description string `json:"description"` + Summary string `json:"summary"` ChainId string `json:"chain_id"` InitialHeight clienttypes.Height `json:"initial_height"` GenesisHash []byte `json:"genesis_hash"` @@ -236,7 +248,6 @@ type ConsumerAdditionProposalJSON struct { } type ConsumerAdditionProposalReq struct { - BaseReq rest.BaseReq `json:"base_req"` Proposer sdk.AccAddress `json:"proposer"` Title string `json:"title"` @@ -274,15 +285,14 @@ func ParseConsumerAdditionProposalJSON(proposalFile string) (ConsumerAdditionPro } type ConsumerRemovalProposalJSON struct { - Title string `json:"title"` - Description string `json:"description"` - ChainId string `json:"chain_id"` - StopTime time.Time `json:"stop_time"` - Deposit string `json:"deposit"` + Title string `json:"title"` + Summary string `json:"summary"` + ChainId string `json:"chain_id"` + StopTime time.Time `json:"stop_time"` + Deposit string `json:"deposit"` } type ConsumerRemovalProposalReq struct { - BaseReq rest.BaseReq `json:"base_req"` Proposer sdk.AccAddress `json:"proposer"` Title string `json:"title"` @@ -295,13 +305,13 @@ type ConsumerRemovalProposalReq struct { type EquivocationProposalJSON struct { // evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" + Summary string `json:"summary"` types.EquivocationProposal Deposit string `json:"deposit"` } type EquivocationProposalReq struct { - BaseReq rest.BaseReq `json:"base_req"` Proposer sdk.AccAddress `json:"proposer"` // evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" @@ -325,14 +335,6 @@ func ParseEquivocationProposalJSON(proposalFile string) (EquivocationProposalJSO return proposal, nil } -// EquivocationProposalRESTHandler returns a ProposalRESTHandler that exposes the equivocation rest handler. -func EquivocationProposalRESTHandler(clientCtx client.Context) govrest.ProposalRESTHandler { - return govrest.ProposalRESTHandler{ - SubRoute: "equivocation", - Handler: postEquivocationProposalHandlerFn(clientCtx), - } -} - func ParseConsumerRemovalProposalJSON(proposalFile string) (ConsumerRemovalProposalJSON, error) { proposal := ConsumerRemovalProposalJSON{} @@ -348,6 +350,30 @@ func ParseConsumerRemovalProposalJSON(proposalFile string) (ConsumerRemovalPropo return proposal, nil } +func CheckPropUnbondingPeriod(clientCtx client.Context, propUnbondingPeriod time.Duration) { + queryClient := stakingtypes.NewQueryClient(clientCtx) + + res, err := queryClient.Params(context.Background(), &stakingtypes.QueryParamsRequest{}) + if err != nil { + fmt.Println(err.Error()) + return + } + + providerUnbondingTime := res.Params.UnbondingTime + + if providerUnbondingTime < propUnbondingPeriod { + fmt.Printf( + `consumer unbonding period is advised to be smaller than provider unbonding period, but is longer. +This is not a security risk, but will effectively lengthen the unbonding period on the provider. +consumer unbonding: %s +provider unbonding: %s`, + propUnbondingPeriod, + providerUnbondingTime) + } +} + +/* Proposal REST handlers: NOT NEEDED POST 47, BUT PLEASE CHECK THAT ALL FUNCTIONALITY EXISTS IN THE 47 VERSION. + // ConsumerAdditionProposalRESTHandler returns a ProposalRESTHandler that exposes the consumer addition rest handler. func ConsumerAdditionProposalRESTHandler(clientCtx client.Context) govrest.ProposalRESTHandler { return govrest.ProposalRESTHandler{ @@ -452,24 +478,6 @@ func postEquivocationProposalHandlerFn(clientCtx client.Context) http.HandlerFun } } -func CheckPropUnbondingPeriod(clientCtx client.Context, propUnbondingPeriod time.Duration) { - queryClient := stakingtypes.NewQueryClient(clientCtx) - - res, err := queryClient.Params(context.Background(), &stakingtypes.QueryParamsRequest{}) - if err != nil { - fmt.Println(err.Error()) - return - } - providerUnbondingTime := res.Params.UnbondingTime - if providerUnbondingTime < propUnbondingPeriod { - fmt.Printf( - `consumer unbonding period is advised to be smaller than provider unbonding period, but is longer. -This is not a security risk, but will effectively lengthen the unbonding period on the provider. -consumer unbonding: %s -provider unbonding: %s`, - propUnbondingPeriod, - providerUnbondingTime) - } -} +*/ diff --git a/x/ccv/provider/handler_test.go b/x/ccv/provider/handler_test.go index 3b034eab2b..0176e13b71 100644 --- a/x/ccv/provider/handler_test.go +++ b/x/ccv/provider/handler_test.go @@ -5,9 +5,9 @@ import ( "strings" "testing" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/ccv/provider/ibc_module.go b/x/ccv/provider/ibc_module.go index a37f291340..21eee84f06 100644 --- a/x/ccv/provider/ibc_module.go +++ b/x/ccv/provider/ibc_module.go @@ -7,10 +7,12 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - porttypes "github.com/cosmos/ibc-go/v4/modules/core/05-port/types" - host "github.com/cosmos/ibc-go/v4/modules/core/24-host" - ibcexported "github.com/cosmos/ibc-go/v4/modules/core/exported" + + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" + host "github.com/cosmos/ibc-go/v7/modules/core/24-host" + ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" diff --git a/x/ccv/provider/ibc_module_test.go b/x/ccv/provider/ibc_module_test.go index c7027bf8e1..28a13dfeda 100644 --- a/x/ccv/provider/ibc_module_test.go +++ b/x/ccv/provider/ibc_module_test.go @@ -6,15 +6,18 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - conntypes "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - host "github.com/cosmos/ibc-go/v4/modules/core/24-host" - ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" + + conntypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + host "github.com/cosmos/ibc-go/v7/modules/core/24-host" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" "github.com/cosmos/interchain-security/v2/x/ccv/provider" providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" ) diff --git a/x/ccv/provider/keeper/genesis_test.go b/x/ccv/provider/keeper/genesis_test.go index 40df37e999..5c8ee5838f 100644 --- a/x/ccv/provider/keeper/genesis_test.go +++ b/x/ccv/provider/keeper/genesis_test.go @@ -5,7 +5,7 @@ import ( "time" sdk "github.com/cosmos/cosmos-sdk/types" - host "github.com/cosmos/ibc-go/v4/modules/core/24-host" + host "github.com/cosmos/ibc-go/v7/modules/core/24-host" "github.com/cosmos/interchain-security/v2/testutil/crypto" testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" diff --git a/x/ccv/provider/keeper/hooks.go b/x/ccv/provider/keeper/hooks.go index 3cf1e6cc30..a384edfc39 100644 --- a/x/ccv/provider/keeper/hooks.go +++ b/x/ccv/provider/keeper/hooks.go @@ -1,8 +1,6 @@ package keeper import ( - "fmt" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" sdk "github.com/cosmos/cosmos-sdk/types" @@ -34,6 +32,20 @@ func (h Hooks) AfterUnbondingInitiated(ctx sdk.Context, id uint64) error { // Do not put the unbonding op on hold if there are no consumer chains return nil } + // Call back into staking to tell it to stop this op from unbonding when the unbonding period is complete + if err := h.k.stakingKeeper.PutUnbondingOnHold(ctx, id); err != nil { + // Note: that in the case of a validator unbonding, AfterUnbondingInitiated is called + // from staking.EndBlock. + + // In this case PutUnbondingOnHold fails if either the unbonding operation was + // not found or the UnbondingOnHoldRefCount is negative. + + // This change should be updated for SDK v0.48 because it will include changes in handling + // check: https://github.com/cosmos/cosmos-sdk/pull/16043 + ctx.Logger().Error("unbonding could not be put on hold: %w", err) + return nil + } + valsetUpdateID := h.k.GetValidatorSetUpdateId(ctx) unbondingOp := providertypes.UnbondingOp{ Id: id, @@ -49,18 +61,22 @@ func (h Hooks) AfterUnbondingInitiated(ctx sdk.Context, id uint64) error { h.k.SetUnbondingOp(ctx, unbondingOp) + // NOTE: This is a temporary fix for v0.47 -> we should not panic in this edge case + // since the AfterUnbondInitiatedHook can be called with a non-existing UnbondingEntry.id + // check: https://github.com/cosmos/cosmos-sdk/pull/16043 + // // Call back into staking to tell it to stop this op from unbonding when the unbonding period is complete - if err := h.k.stakingKeeper.PutUnbondingOnHold(ctx, id); err != nil { - // If there was an error putting the unbonding on hold, panic to end execution for - // the current tx and prevent committal of this invalid state. - // - // Note: that in the case of a validator unbonding, AfterUnbondingInitiated is called - // form staking.EndBlock, thus the following panic would halt the chain. - // In this case PutUnbondingOnHold fails if either the unbonding operation was - // not found or the UnbondingOnHoldRefCount is negative. In either cases, - // the state of the x/staking module of cosmos-sdk is invalid. - panic(fmt.Errorf("unbonding could not be put on hold: %w", err)) - } + // if err := h.k.stakingKeeper.PutUnbondingOnHold(ctx, id); err != nil { + // // If there was an error putting the unbonding on hold, panic to end execution for + // // the current tx and prevent committal of this invalid state. + // // + // // Note: that in the case of a validator unbonding, AfterUnbondingInitiated is called + // // from staking.EndBlock, thus the following panic would halt the chain. + // // In this case PutUnbondingOnHold fails if either the unbonding operation was + // // not found or the UnbondingOnHoldRefCount is negative. In either cases, + // // the state of the x/staking module of cosmos-sdk is invalid. + // panic(fmt.Errorf("unbonding could not be put on hold: %w", err)) + // } return nil } @@ -94,14 +110,15 @@ func ValidatorConsensusKeyInUse(k *Keeper, ctx sdk.Context, valAddr sdk.ValAddre return inUse } -func (h Hooks) AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) { +func (h Hooks) AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) error { if ValidatorConsensusKeyInUse(h.k, ctx, valAddr) { // Abort TX, do NOT allow validator to be created panic("cannot create a validator with a consensus key that is already in use or was recently in use as an assigned consumer chain key") } + return nil } -func (h Hooks) AfterValidatorRemoved(ctx sdk.Context, valConsAddr sdk.ConsAddress, valAddr sdk.ValAddress) { +func (h Hooks) AfterValidatorRemoved(ctx sdk.Context, valConsAddr sdk.ConsAddress, valAddr sdk.ValAddress) error { for _, validatorConsumerPubKey := range h.k.GetAllValidatorConsumerPubKeys(ctx, nil) { if sdk.ConsAddress(validatorConsumerPubKey.ProviderAddr).Equals(valConsAddr) { consumerAddrTmp, err := ccvtypes.TMCryptoPublicKeyToConsAddr(*validatorConsumerPubKey.ConsumerKey) @@ -115,28 +132,38 @@ func (h Hooks) AfterValidatorRemoved(ctx sdk.Context, valConsAddr sdk.ConsAddres h.k.DeleteValidatorConsumerPubKey(ctx, validatorConsumerPubKey.ChainId, providerAddr) } } + + return nil } -func (h Hooks) BeforeDelegationCreated(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { +func (h Hooks) BeforeDelegationCreated(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error { + return nil } -func (h Hooks) BeforeDelegationSharesModified(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) { +func (h Hooks) BeforeDelegationSharesModified(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) error { + return nil } -func (h Hooks) AfterDelegationModified(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) { +func (h Hooks) AfterDelegationModified(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) error { + return nil } -func (h Hooks) BeforeValidatorSlashed(_ sdk.Context, _ sdk.ValAddress, _ sdk.Dec) { +func (h Hooks) BeforeValidatorSlashed(_ sdk.Context, _ sdk.ValAddress, _ sdk.Dec) error { + return nil } -func (h Hooks) BeforeValidatorModified(_ sdk.Context, _ sdk.ValAddress) { +func (h Hooks) BeforeValidatorModified(_ sdk.Context, _ sdk.ValAddress) error { + return nil } -func (h Hooks) AfterValidatorBonded(_ sdk.Context, _ sdk.ConsAddress, _ sdk.ValAddress) { +func (h Hooks) AfterValidatorBonded(_ sdk.Context, _ sdk.ConsAddress, _ sdk.ValAddress) error { + return nil } -func (h Hooks) AfterValidatorBeginUnbonding(_ sdk.Context, _ sdk.ConsAddress, _ sdk.ValAddress) { +func (h Hooks) AfterValidatorBeginUnbonding(_ sdk.Context, _ sdk.ConsAddress, _ sdk.ValAddress) error { + return nil } -func (h Hooks) BeforeDelegationRemoved(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) { +func (h Hooks) BeforeDelegationRemoved(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) error { + return nil } diff --git a/x/ccv/provider/keeper/keeper.go b/x/ccv/provider/keeper/keeper.go index 7494057643..ff14308a22 100644 --- a/x/ccv/provider/keeper/keeper.go +++ b/x/ccv/provider/keeper/keeper.go @@ -8,37 +8,38 @@ import ( errorsmod "cosmossdk.io/errors" "github.com/cosmos/cosmos-sdk/codec" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - conntypes "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - host "github.com/cosmos/ibc-go/v4/modules/core/24-host" - ibcexported "github.com/cosmos/ibc-go/v4/modules/core/exported" - ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + conntypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + host "github.com/cosmos/ibc-go/v7/modules/core/24-host" + ibchost "github.com/cosmos/ibc-go/v7/modules/core/exported" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" - "github.com/tendermint/tendermint/libs/log" + "github.com/cometbft/cometbft/libs/log" ) // Keeper defines the Cross-Chain Validation Provider Keeper type Keeper struct { - storeKey sdk.StoreKey + storeKey storetypes.StoreKey cdc codec.BinaryCodec paramSpace paramtypes.Subspace scopedKeeper ccv.ScopedKeeper channelKeeper ccv.ChannelKeeper portKeeper ccv.PortKeeper connectionKeeper ccv.ConnectionKeeper + accountKeeper ccv.AccountKeeper clientKeeper ccv.ClientKeeper stakingKeeper ccv.StakingKeeper slashingKeeper ccv.SlashingKeeper - accountKeeper ccv.AccountKeeper evidenceKeeper ccv.EvidenceKeeper distributionKeeper ccv.DistributionKeeper bankKeeper ccv.BankKeeper @@ -47,7 +48,7 @@ type Keeper struct { // NewKeeper creates a new provider Keeper instance func NewKeeper( - cdc codec.BinaryCodec, key sdk.StoreKey, paramSpace paramtypes.Subspace, scopedKeeper ccv.ScopedKeeper, + cdc codec.BinaryCodec, key storetypes.StoreKey, paramSpace paramtypes.Subspace, scopedKeeper ccv.ScopedKeeper, channelKeeper ccv.ChannelKeeper, portKeeper ccv.PortKeeper, connectionKeeper ccv.ConnectionKeeper, clientKeeper ccv.ClientKeeper, stakingKeeper ccv.StakingKeeper, slashingKeeper ccv.SlashingKeeper, @@ -115,7 +116,7 @@ func (k Keeper) mustValidateFields() { // Logger returns a module-specific logger. func (k Keeper) Logger(ctx sdk.Context) log.Logger { - return ctx.Logger().With("module", "x/"+host.ModuleName+"-"+types.ModuleName) + return ctx.Logger().With("module", "x/"+ibchost.ModuleName+"-"+types.ModuleName) } // IsBound checks if the CCV module is already bound to the desired port @@ -628,7 +629,7 @@ func (k Keeper) getUnderlyingClient(ctx sdk.Context, connectionID string) ( tmClient, ok = clientState.(*ibctmtypes.ClientState) if !ok { return "", nil, errorsmod.Wrapf(clienttypes.ErrInvalidClientType, - "invalid client type. expected %s, got %s", ibcexported.Tendermint, clientState.ClientType()) + "invalid client type. expected %s, got %s", ibchost.Tendermint, clientState.ClientType()) } return clientID, tmClient, nil } diff --git a/x/ccv/provider/keeper/keeper_test.go b/x/ccv/provider/keeper/keeper_test.go index 64cc268807..db5bf98ea4 100644 --- a/x/ccv/provider/keeper/keeper_test.go +++ b/x/ccv/provider/keeper/keeper_test.go @@ -6,16 +6,15 @@ import ( "testing" "time" + abci "github.com/cometbft/cometbft/abci/types" + tmprotocrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" ibcsimapp "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/simapp" - cryptotestutil "github.com/cosmos/interchain-security/v2/testutil/crypto" testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" - abci "github.com/tendermint/tendermint/abci/types" - tmprotocrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" "github.com/stretchr/testify/require" ) diff --git a/x/ccv/provider/keeper/key_assignment.go b/x/ccv/provider/keeper/key_assignment.go index 81ded10282..0321e089de 100644 --- a/x/ccv/provider/keeper/key_assignment.go +++ b/x/ccv/provider/keeper/key_assignment.go @@ -10,8 +10,8 @@ import ( "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" - abci "github.com/tendermint/tendermint/abci/types" - tmprotocrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" + abci "github.com/cometbft/cometbft/abci/types" + tmprotocrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" ) // GetValidatorConsumerPubKey returns a validator's public key assigned for a consumer chain diff --git a/x/ccv/provider/keeper/key_assignment_test.go b/x/ccv/provider/keeper/key_assignment_test.go index da0edb2575..06d2202954 100644 --- a/x/ccv/provider/keeper/key_assignment_test.go +++ b/x/ccv/provider/keeper/key_assignment_test.go @@ -7,13 +7,13 @@ import ( "testing" "time" + abci "github.com/cometbft/cometbft/abci/types" + tmprotocrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" cryptotestutil "github.com/cosmos/interchain-security/v2/testutil/crypto" testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" - tmprotocrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" diff --git a/x/ccv/provider/keeper/migration.go b/x/ccv/provider/keeper/migration.go deleted file mode 100644 index d33fcb7968..0000000000 --- a/x/ccv/provider/keeper/migration.go +++ /dev/null @@ -1,172 +0,0 @@ -package keeper - -import ( - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" -) - -// Migrator is a struct for handling in-place store migrations. -type Migrator struct { - ccvProviderKeeper Keeper - ccvProviderParamSpace paramtypes.Subspace -} - -// NewMigrator returns a new Migrator. -func NewMigrator(ccvProviderKeeper Keeper, ccvProviderParamSpace paramtypes.Subspace, -) Migrator { - return Migrator{ccvProviderKeeper: ccvProviderKeeper, ccvProviderParamSpace: ccvProviderParamSpace} -} - -// Migratev1Tov2 migrates a provider from v1.0.0 to v2.0.0, and/or consensus version 1 -> 2. -func (m Migrator) Migratev1Tov2(ctx sdk.Context) error { - // Migrate params - MigrateParamsv1Tov2(ctx, - m.ccvProviderParamSpace, - // See https://github.com/cosmos/interchain-security/blob/7861804cb311507ec6aebebbfad60ea42eb8ed4b/x/ccv/provider/keeper/params.go#L84 - // The v1.1.0-multiden version of ICS hardcodes this param as 10 of bond type: k.stakingKeeper.BondDenom(ctx). - // Here we use the same starting value, but the param can now be changed through governance. - sdk.NewCoin(m.ccvProviderKeeper.BondDenom(ctx), sdk.NewInt(10000000)), - ) - - // Consumer genesis states persisted on the provider do not need to be migrated, - // as protobuf serialization is able to gracefully handle unpopulated fields when deserializing. - // See https://github.com/smarshall-spitzbart/ics-migration-tests/commit/b589e3982c26783ed66e954051f7da1ead16de68 - // which passes, proving the addition of preCCV will not break things. - - // Migrate keys to accommodate fix from https://github.com/cosmos/interchain-security/pull/786 - MigrateKeysv1Tov2(ctx, m.ccvProviderKeeper) - - return nil -} - -// MigrateParamsv1Tov2 migrates the provider CCV module params from v1.0.0 to v2.0.0, -// setting default values for new params. -func MigrateParamsv1Tov2(ctx sdk.Context, paramsSubspace paramtypes.Subspace, consumerRewardDenomRegistrationFee sdk.Coin) { - // Get old params - var templateClient ibctmtypes.ClientState - paramsSubspace.Get(ctx, providertypes.KeyTemplateClient, &templateClient) - var trustingPeriodFraction string - paramsSubspace.Get(ctx, providertypes.KeyTrustingPeriodFraction, &trustingPeriodFraction) - var ccvTimeoutPeriod time.Duration - paramsSubspace.Get(ctx, ccvtypes.KeyCCVTimeoutPeriod, &ccvTimeoutPeriod) - var initTimeoutPeriod time.Duration - paramsSubspace.Get(ctx, providertypes.KeyInitTimeoutPeriod, &initTimeoutPeriod) - var vscTimeoutPeriod time.Duration - paramsSubspace.Get(ctx, providertypes.KeyVscTimeoutPeriod, &vscTimeoutPeriod) - var slashMeterReplenishPeriod time.Duration - paramsSubspace.Get(ctx, providertypes.KeySlashMeterReplenishPeriod, &slashMeterReplenishPeriod) - var slashMeterReplenishFraction string - paramsSubspace.Get(ctx, providertypes.KeySlashMeterReplenishFraction, &slashMeterReplenishFraction) - var maxThrottledPackets int64 - paramsSubspace.Get(ctx, providertypes.KeyMaxThrottledPackets, &maxThrottledPackets) - - // Recycle old params, set new param to input value - newParams := providertypes.NewParams( - &templateClient, - trustingPeriodFraction, - ccvTimeoutPeriod, - initTimeoutPeriod, - vscTimeoutPeriod, - slashMeterReplenishPeriod, - slashMeterReplenishFraction, - maxThrottledPackets, - consumerRewardDenomRegistrationFee, - ) - - // Persist new params - paramsSubspace.SetParamSet(ctx, &newParams) -} - -// Due to https://github.com/cosmos/interchain-security/pull/786, -// validators' slash logs are stored under the key prefix for slash acks. -// This method will extract "slash logs" from the slash acks part of the store, and put the slash logs -// in their appropriate store location. -func MigrateKeysv1Tov2(ctx sdk.Context, providerKeeper Keeper) { - keys := providerKeeper.getAllKeysUnderSlashAcksPrefix(ctx) - - // Get valid consumer chainIDs - consumers := providerKeeper.GetAllConsumerChains(ctx) - consumerChainIds := make(map[string]struct{}) - for _, consumer := range consumers { - consumerChainIds[consumer.ChainId] = struct{}{} - } - - keysToMigrate := [][]byte{} - - // iterate through all keys under slash acks prefix - for _, key := range keys { - bzAfterPrefix := key[1:] - // If bz after prefix is in consumerChainIds, - // then this key is a valid slash acks key, no migration needed - if _, ok := consumerChainIds[string(bzAfterPrefix)]; ok { - continue - } - // Otherwise this key is potentially/hopefully a slash log key to migrate - - // Validate that after the prefix, it's just a cons address stored in the key - if err := sdk.VerifyAddressFormat(bzAfterPrefix); err != nil { - // We could panic here, but prob best to log corrupted key and move on. - // This case should not happen! - ctx.Logger().Error("unexpected key under slash acks prefix", "key", key) - continue - } - keysToMigrate = append(keysToMigrate, key) - } - - // Migrate slash logs to their correct store location - store := ctx.KVStore(providerKeeper.storeKey) - for _, key := range keysToMigrate { - keyNoPrefix := key[1:] - keyCorrectPrefix := append([]byte{providertypes.SlashLogBytePrefix}, keyNoPrefix...) - valueBz := store.Get(key) - store.Set(keyCorrectPrefix, valueBz) - store.Delete(key) - } -} - -func (k Keeper) getAllKeysUnderSlashAcksPrefix(ctx sdk.Context) [][]byte { - store := ctx.KVStore(k.storeKey) - prefix := []byte{providertypes.SlashAcksBytePrefix} - iterator := sdk.KVStorePrefixIterator(store, prefix) - defer iterator.Close() - keys := [][]byte{} - for ; iterator.Valid(); iterator.Next() { - keys = append(keys, iterator.Key()) // Values are not used for migration, just keys - } - return keys -} - -// TODO: the following hackyness could be removed if we're able to reference older versions of ICS. -// This would likely require go.mod split, and a testing module that could depend on multiple ICS versions. - -// LEGACY METHOD USED FOR TESTING MIGRATION ONLY. DO NOT USE! -// This method is copy/pasted from ICS v1.0.0. -func SlashLogKeyOnlyForTesting(providerAddr sdk.ConsAddress) []byte { - return append([]byte{providertypes.SlashAcksBytePrefix}, providerAddr.Bytes()...) -} - -// LEGACY METHOD USED FOR TESTING MIGRATION ONLY. DO NOT USE! -// This method mimics SetSlashLog from ICS v1.0.0. -func (k Keeper) SetSlashLogOnlyForTesting( - ctx sdk.Context, - providerAddr sdk.ConsAddress, -) { - store := ctx.KVStore(k.storeKey) - store.Set(SlashLogKeyOnlyForTesting(providerAddr), []byte{}) -} - -// LEGACY METHOD USED FOR TESTING MIGRATION ONLY. DO NOT USE! -// This method mimics GetSlashLog from ICS v1.0.0. -func (k Keeper) GetSlashLogOnlyForTesting( - ctx sdk.Context, - providerAddr sdk.ConsAddress, -) (found bool) { - store := ctx.KVStore(k.storeKey) - bz := store.Get(SlashLogKeyOnlyForTesting(providerAddr)) - return bz != nil -} diff --git a/x/ccv/provider/keeper/migration_test.go b/x/ccv/provider/keeper/migration_test.go deleted file mode 100644 index e488dd2d36..0000000000 --- a/x/ccv/provider/keeper/migration_test.go +++ /dev/null @@ -1,171 +0,0 @@ -package keeper_test - -import ( - "testing" - "time" - - "github.com/cosmos/cosmos-sdk/codec" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/cosmos/cosmos-sdk/store" - storetypes "github.com/cosmos/cosmos-sdk/store/types" - sdk "github.com/cosmos/cosmos-sdk/types" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - types2 "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - "github.com/cosmos/interchain-security/v2/testutil/crypto" - testutil "github.com/cosmos/interchain-security/v2/testutil/keeper" - providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" - "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/libs/log" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - tmdb "github.com/tendermint/tm-db" -) - -func TestMigrateParamsv1Tov2(t *testing.T) { - // Setup raw store - db := tmdb.NewMemDB() - stateStore := store.NewCommitMultiStore(db) - storeKey := sdk.NewKVStoreKey(paramtypes.StoreKey) - memStoreKey := storetypes.NewMemoryStoreKey("mem_key") - stateStore.MountStoreWithDB(storeKey, sdk.StoreTypeIAVL, db) - stateStore.MountStoreWithDB(memStoreKey, sdk.StoreTypeMemory, nil) - require.NoError(t, stateStore.LoadLatestVersion()) - registry := codectypes.NewInterfaceRegistry() - cdc := codec.NewProtoCodec(registry) - ctx := sdk.NewContext(stateStore, tmproto.Header{}, false, log.NewNopLogger()) - require.NoError(t, stateStore.LoadLatestVersion()) - - // Create new empty subspace - subspace := paramtypes.NewSubspace(cdc, - codec.NewLegacyAmino(), - storeKey, - memStoreKey, - paramtypes.ModuleName, - ).WithKeyTable(v1KeyTable()) // Note that new param key table is set in keeper constructor - - // Set 8 params from v1.0.0 - subspace.Set(ctx, providertypes.KeyTemplateClient, providertypes.DefaultParams().TemplateClient) - subspace.Set(ctx, providertypes.KeyTrustingPeriodFraction, "0.75") - subspace.Set(ctx, ccvtypes.KeyCCVTimeoutPeriod, time.Hour) - subspace.Set(ctx, providertypes.KeyInitTimeoutPeriod, time.Hour) - subspace.Set(ctx, providertypes.KeyVscTimeoutPeriod, time.Hour) - subspace.Set(ctx, providertypes.KeySlashMeterReplenishPeriod, time.Hour) - subspace.Set(ctx, providertypes.KeySlashMeterReplenishFraction, "0.5") - subspace.Set(ctx, providertypes.KeyMaxThrottledPackets, int64(10)) - - // Confirm new param cannot be set with old key table - require.Panics(t, func() { - subspace.Set(ctx, providertypes.KeyConsumerRewardDenomRegistrationFee, sdk.NewInt64Coin("uatom", 100)) - }) - - // Now create new subspace, mocking an upgrade where app initialization happens again - subspace = paramtypes.NewSubspace(cdc, - codec.NewLegacyAmino(), - storeKey, - memStoreKey, - paramtypes.ModuleName, - ).WithKeyTable(providertypes.ParamKeyTable()) // Use v2 key table, this would be set in keeper constructor upon app init - - // Run migration - providerkeeper.MigrateParamsv1Tov2(ctx, subspace, sdk.NewCoin("uatom", sdk.NewInt(100000))) - - // Use keeper to confirm params are set correctly - keeper := providerkeeper.Keeper{} - keeper.SetParamSpace(ctx, subspace) - - params := keeper.GetParams(ctx) - require.Equal(t, providertypes.DefaultParams().TemplateClient, params.TemplateClient) - require.Equal(t, "0.75", params.TrustingPeriodFraction) - require.Equal(t, time.Hour, params.CcvTimeoutPeriod) - require.Equal(t, time.Hour, params.InitTimeoutPeriod) - require.Equal(t, time.Hour, params.VscTimeoutPeriod) - require.Equal(t, time.Hour, params.SlashMeterReplenishPeriod) - require.Equal(t, "0.5", params.SlashMeterReplenishFraction) - require.Equal(t, int64(10), params.MaxThrottledPackets) - // New param should be set - require.Equal(t, sdk.NewCoin("uatom", sdk.NewInt(100000)), params.ConsumerRewardDenomRegistrationFee) - - // Set new param to other values - params.ConsumerRewardDenomRegistrationFee = sdk.NewCoin("uatom", sdk.NewInt(1000000000)) - keeper.SetParams(ctx, params) - require.Equal(t, sdk.NewCoin("uatom", sdk.NewInt(1000000000)), keeper.GetParams(ctx).ConsumerRewardDenomRegistrationFee) -} - -// v1KeyTable is a copy of the ParamKeyTable method from v1.0.0 -func v1KeyTable() paramtypes.KeyTable { - return paramtypes.NewKeyTable().RegisterParamSet(&v1Params{}) -} - -// ParamSetPairs implements params.ParamSet for v1Params -func (p *v1Params) ParamSetPairs() paramtypes.ParamSetPairs { - return paramtypes.ParamSetPairs{ - paramtypes.NewParamSetPair(providertypes.KeyTemplateClient, p.TemplateClient, providertypes.ValidateTemplateClient), - paramtypes.NewParamSetPair(providertypes.KeyTrustingPeriodFraction, p.TrustingPeriodFraction, ccvtypes.ValidateStringFraction), - paramtypes.NewParamSetPair(ccvtypes.KeyCCVTimeoutPeriod, p.CcvTimeoutPeriod, ccvtypes.ValidateDuration), - paramtypes.NewParamSetPair(providertypes.KeyInitTimeoutPeriod, p.InitTimeoutPeriod, ccvtypes.ValidateDuration), - paramtypes.NewParamSetPair(providertypes.KeyVscTimeoutPeriod, p.VscTimeoutPeriod, ccvtypes.ValidateDuration), - paramtypes.NewParamSetPair(providertypes.KeySlashMeterReplenishPeriod, p.SlashMeterReplenishPeriod, ccvtypes.ValidateDuration), - paramtypes.NewParamSetPair(providertypes.KeySlashMeterReplenishFraction, p.SlashMeterReplenishFraction, ccvtypes.ValidateStringFraction), - paramtypes.NewParamSetPair(providertypes.KeyMaxThrottledPackets, p.MaxThrottledPackets, ccvtypes.ValidatePositiveInt64), - } -} - -// v1Params is a copy of the Params struct from v1.0.0 -type v1Params struct { - TemplateClient *types2.ClientState `protobuf:"bytes,1,opt,name=template_client,json=templateClient,proto3" json:"template_client,omitempty"` - TrustingPeriodFraction string `protobuf:"bytes,2,opt,name=trusting_period_fraction,json=trustingPeriodFraction,proto3" json:"trusting_period_fraction,omitempty"` - CcvTimeoutPeriod time.Duration `protobuf:"bytes,3,opt,name=ccv_timeout_period,json=ccvTimeoutPeriod,proto3,stdduration" json:"ccv_timeout_period"` - InitTimeoutPeriod time.Duration `protobuf:"bytes,4,opt,name=init_timeout_period,json=initTimeoutPeriod,proto3,stdduration" json:"init_timeout_period"` - VscTimeoutPeriod time.Duration `protobuf:"bytes,5,opt,name=vsc_timeout_period,json=vscTimeoutPeriod,proto3,stdduration" json:"vsc_timeout_period"` - SlashMeterReplenishPeriod time.Duration `protobuf:"bytes,6,opt,name=slash_meter_replenish_period,json=slashMeterReplenishPeriod,proto3,stdduration" json:"slash_meter_replenish_period"` - SlashMeterReplenishFraction string `protobuf:"bytes,7,opt,name=slash_meter_replenish_fraction,json=slashMeterReplenishFraction,proto3" json:"slash_meter_replenish_fraction,omitempty"` - MaxThrottledPackets int64 `protobuf:"varint,8,opt,name=max_throttled_packets,json=maxThrottledPackets,proto3" json:"max_throttled_packets,omitempty"` -} - -func TestMigrateKeysv1Tov2(t *testing.T) { - providerKeeper, ctx, ctrl, _ := testutil.GetProviderKeeperAndCtx(t, testutil.NewInMemKeeperParams(t)) - defer ctrl.Finish() - - // First we setup a scenario that may show up in prod for v1, - // where both slash logs and slash acks are persisted under the same key prefix - cIds := crypto.GenMultipleCryptoIds(3, 349823489230) - providerKeeper.SetSlashLogOnlyForTesting(ctx, cIds[0].SDKValConsAddress()) // This is the old (incorrect) method of storing slash logs - providerKeeper.SetSlashLogOnlyForTesting(ctx, cIds[1].SDKValConsAddress()) - providerKeeper.SetSlashLogOnlyForTesting(ctx, cIds[2].SDKValConsAddress()) - - // Setup slash acks - p := []string{"alice", "bob", "frank"} - providerKeeper.SetSlashAcks(ctx, "chain-1", p) - p = []string{"charlie", "mac", "dennis"} - providerKeeper.SetSlashAcks(ctx, "chain-2", p) - - // Mock two clients being established with chain-1 and chain-2, - // This is needed for migration logic. - providerKeeper.SetConsumerClientId(ctx, "chain-1", "client-1") - providerKeeper.SetConsumerClientId(ctx, "chain-2", "client-2") - - // Confirm slash logs and slash acks exist together - require.True(t, providerKeeper.GetSlashLogOnlyForTesting(ctx, cIds[0].SDKValConsAddress())) - require.True(t, providerKeeper.GetSlashLogOnlyForTesting(ctx, cIds[1].SDKValConsAddress())) - require.True(t, providerKeeper.GetSlashLogOnlyForTesting(ctx, cIds[2].SDKValConsAddress())) - require.Len(t, providerKeeper.GetSlashAcks(ctx, "chain-1"), 3) - require.Len(t, providerKeeper.GetSlashAcks(ctx, "chain-2"), 3) - - // Run migration - providerkeeper.MigrateKeysv1Tov2(ctx, providerKeeper) - - // Confirm slash logs cannot be found from legacy methods - require.False(t, providerKeeper.GetSlashLogOnlyForTesting(ctx, cIds[0].SDKValConsAddress())) - require.False(t, providerKeeper.GetSlashLogOnlyForTesting(ctx, cIds[1].SDKValConsAddress())) - require.False(t, providerKeeper.GetSlashLogOnlyForTesting(ctx, cIds[2].SDKValConsAddress())) - - // Slash acks remain unchanged - require.Len(t, providerKeeper.GetSlashAcks(ctx, "chain-1"), 3) - require.Len(t, providerKeeper.GetSlashAcks(ctx, "chain-2"), 3) - - // Confirm slash logs can be found from new/correct methods - require.True(t, providerKeeper.GetSlashLog(ctx, cIds[0].ProviderConsAddress())) - require.True(t, providerKeeper.GetSlashLog(ctx, cIds[1].ProviderConsAddress())) - require.True(t, providerKeeper.GetSlashLog(ctx, cIds[2].ProviderConsAddress())) -} diff --git a/x/ccv/provider/keeper/msg_server.go b/x/ccv/provider/keeper/msg_server.go index ea5ff66220..dcef272356 100644 --- a/x/ccv/provider/keeper/msg_server.go +++ b/x/ccv/provider/keeper/msg_server.go @@ -4,12 +4,13 @@ import ( "context" "encoding/base64" - errorsmod "cosmossdk.io/errors" + tmprotocrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + + errorsmod "cosmossdk.io/errors" "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" - tmprotocrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" ) type msgServer struct { diff --git a/x/ccv/provider/keeper/params.go b/x/ccv/provider/keeper/params.go index 98408bcede..56ed85fdd4 100644 --- a/x/ccv/provider/keeper/params.go +++ b/x/ccv/provider/keeper/params.go @@ -5,7 +5,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" - ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" diff --git a/x/ccv/provider/keeper/params_test.go b/x/ccv/provider/keeper/params_test.go index eeafe2696c..25c368ca82 100644 --- a/x/ccv/provider/keeper/params_test.go +++ b/x/ccv/provider/keeper/params_test.go @@ -5,9 +5,10 @@ import ( "time" sdk "github.com/cosmos/cosmos-sdk/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - commitmenttypes "github.com/cosmos/ibc-go/v4/modules/core/23-commitment/types" - ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" "github.com/stretchr/testify/require" @@ -35,8 +36,6 @@ func TestParams(t *testing.T) { clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}, - true, - false, ), "0.25", 7*24*time.Hour, diff --git a/x/ccv/provider/keeper/proposal.go b/x/ccv/provider/keeper/proposal.go index e50619c066..7c4a141ad8 100644 --- a/x/ccv/provider/keeper/proposal.go +++ b/x/ccv/provider/keeper/proposal.go @@ -5,21 +5,21 @@ import ( "strconv" "time" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" errorsmod "cosmossdk.io/errors" + abci "github.com/cometbft/cometbft/abci/types" + tmtypes "github.com/cometbft/cometbft/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - commitmenttypes "github.com/cosmos/ibc-go/v4/modules/core/23-commitment/types" - ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" - abci "github.com/tendermint/tendermint/abci/types" - tmtypes "github.com/tendermint/tendermint/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" ) // HandleConsumerAdditionProposal will receive the consumer chain's client state from the proposal. diff --git a/x/ccv/provider/keeper/proposal_test.go b/x/ccv/provider/keeper/proposal_test.go index 68ee7e9663..922573b17c 100644 --- a/x/ccv/provider/keeper/proposal_test.go +++ b/x/ccv/provider/keeper/proposal_test.go @@ -7,13 +7,13 @@ import ( "testing" "time" - _go "github.com/confio/ics23/go" + abci "github.com/cometbft/cometbft/abci/types" sdk "github.com/cosmos/cosmos-sdk/types" evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + _go "github.com/cosmos/ics23/go" "github.com/golang/mock/gomock" - abci "github.com/tendermint/tendermint/abci/types" "github.com/stretchr/testify/require" diff --git a/x/ccv/provider/keeper/relay.go b/x/ccv/provider/keeper/relay.go index ea07e0e9af..fed6f1f8ce 100644 --- a/x/ccv/provider/keeper/relay.go +++ b/x/ccv/provider/keeper/relay.go @@ -7,9 +7,10 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - "github.com/cosmos/ibc-go/v4/modules/core/exported" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + "github.com/cosmos/ibc-go/v7/modules/core/exported" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" ) @@ -114,8 +115,18 @@ func (k Keeper) completeMaturedUnbondingOps(ctx sdk.Context) { // Attempt to complete unbonding in staking module err := k.stakingKeeper.UnbondingCanComplete(ctx, id) if err != nil { - // UnbondingCanComplete fails if the unbonding operation was not found, - // which means that the state of the x/staking module of cosmos-sdk is invalid. + if stakingtypes.ErrUnbondingNotFound.Is(err) { + // The unbonding was not found. + unbondingType, found := k.stakingKeeper.GetUnbondingType(ctx, id) + if found && unbondingType == stakingtypes.UnbondingType_UnbondingDelegation { + // If this is an unbonding delegation, it may have been removed + // after through a CancelUnbondingDelegation message + k.Logger(ctx).Debug("unbonding delegation was already removed:", "unbondingID", id) + continue + } + } + // UnbondingCanComplete failing means that the state of the x/staking module + // of cosmos-sdk is invalid. An exception is the case handled above panic(fmt.Sprintf("could not complete unbonding op: %s", err.Error())) } k.Logger(ctx).Debug("unbonding operation matured on all consumers", "opID", id) @@ -327,7 +338,7 @@ func (k Keeper) OnRecvSlashPacket(ctx sdk.Context, packet channeltypes.Packet, d consumerConsAddr := providertypes.NewConsumerConsAddress(data.Validator.Address) providerConsAddr := k.GetProviderAddrFromConsumerAddr(ctx, chainID, consumerConsAddr) - if data.Infraction == stakingtypes.DoubleSign { + if data.Infraction == stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN { // getMappedInfractionHeight is already checked in ValidateSlashPacket infractionHeight, _ := k.getMappedInfractionHeight(ctx, chainID, data.ValsetUpdateId) @@ -382,7 +393,7 @@ func (k Keeper) ValidateSlashPacket(ctx sdk.Context, chainID string, "the validator update id %d for chain %s", data.ValsetUpdateId, chainID) } - if data.Infraction != stakingtypes.DoubleSign && data.Infraction != stakingtypes.Downtime { + if data.Infraction != stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN && data.Infraction != stakingtypes.Infraction_INFRACTION_DOWNTIME { return fmt.Errorf("invalid infraction type: %s", data.Infraction) } diff --git a/x/ccv/provider/keeper/relay_test.go b/x/ccv/provider/keeper/relay_test.go index 7e377db1b1..07e967ae41 100644 --- a/x/ccv/provider/keeper/relay_test.go +++ b/x/ccv/provider/keeper/relay_test.go @@ -4,12 +4,14 @@ import ( "testing" "time" + abci "github.com/cometbft/cometbft/abci/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - exported "github.com/cosmos/ibc-go/v4/modules/core/exported" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + exported "github.com/cosmos/ibc-go/v7/modules/core/exported" + ibcsimapp "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/simapp" cryptotestutil "github.com/cosmos/interchain-security/v2/testutil/crypto" testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" @@ -17,7 +19,6 @@ import ( providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" "github.com/golang/mock/gomock" - abci "github.com/tendermint/tendermint/abci/types" "github.com/stretchr/testify/require" ) @@ -239,7 +240,7 @@ func TestOnRecvDoubleSignSlashPacket(t *testing.T) { // Generate a new slash packet data instance with double sign infraction type packetData := testkeeper.GetNewSlashPacketData() - packetData.Infraction = stakingtypes.DoubleSign + packetData.Infraction = stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN // Set a block height for the valset update id in the generated packet data providerKeeper.SetValsetUpdateBlockHeight(ctx, packetData.ValsetUpdateId, uint64(15)) @@ -273,7 +274,7 @@ func TestOnRecvDowntimeSlashPacket(t *testing.T) { // Generate a new slash packet data instance with downtime infraction type packetData := testkeeper.GetNewSlashPacketData() - packetData.Infraction = stakingtypes.Downtime + 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)) @@ -291,7 +292,7 @@ func TestOnRecvDowntimeSlashPacket(t *testing.T) { // Generate a new downtime packet data instance with downtime infraction type packetData = testkeeper.GetNewSlashPacketData() - packetData.Infraction = stakingtypes.Downtime + 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)) @@ -367,22 +368,22 @@ func TestValidateSlashPacket(t *testing.T) { }, { "valid double sign packet with non-zero vscID", - ccv.SlashPacketData{ValsetUpdateId: validVscID, Infraction: stakingtypes.DoubleSign}, + ccv.SlashPacketData{ValsetUpdateId: validVscID, Infraction: stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN}, false, }, { "valid downtime packet with non-zero vscID", - ccv.SlashPacketData{ValsetUpdateId: validVscID, Infraction: stakingtypes.Downtime}, + ccv.SlashPacketData{ValsetUpdateId: validVscID, Infraction: stakingtypes.Infraction_INFRACTION_DOWNTIME}, false, }, { "valid double sign packet with zero vscID", - ccv.SlashPacketData{ValsetUpdateId: 0, Infraction: stakingtypes.DoubleSign}, + ccv.SlashPacketData{ValsetUpdateId: 0, Infraction: stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN}, false, }, { "valid downtime packet with zero vscID", - ccv.SlashPacketData{ValsetUpdateId: 0, Infraction: stakingtypes.Downtime}, + ccv.SlashPacketData{ValsetUpdateId: 0, Infraction: stakingtypes.Infraction_INFRACTION_DOWNTIME}, false, }, } @@ -433,7 +434,7 @@ func TestHandleSlashPacket(t *testing.T) { ccv.SlashPacketData{ Validator: abci.Validator{Address: consumerConsAddr.ToSdkConsAddr()}, ValsetUpdateId: validVscID, - Infraction: stakingtypes.Downtime, + Infraction: stakingtypes.Infraction_INFRACTION_DOWNTIME, }, func(ctx sdk.Context, mocks testkeeper.MockedKeepers, expectedPacketData ccv.SlashPacketData, @@ -454,7 +455,7 @@ func TestHandleSlashPacket(t *testing.T) { ccv.SlashPacketData{ Validator: abci.Validator{Address: consumerConsAddr.ToSdkConsAddr()}, ValsetUpdateId: validVscID, - Infraction: stakingtypes.Downtime, + Infraction: stakingtypes.Infraction_INFRACTION_DOWNTIME, }, func(ctx sdk.Context, mocks testkeeper.MockedKeepers, expectedPacketData ccv.SlashPacketData, @@ -476,7 +477,7 @@ func TestHandleSlashPacket(t *testing.T) { ccv.SlashPacketData{ Validator: abci.Validator{Address: consumerConsAddr.ToSdkConsAddr()}, ValsetUpdateId: 78, // Keeper doesn't have a height mapped to this vscID. - Infraction: stakingtypes.Downtime, + Infraction: stakingtypes.Infraction_INFRACTION_DOWNTIME, }, func(ctx sdk.Context, mocks testkeeper.MockedKeepers, @@ -499,7 +500,7 @@ func TestHandleSlashPacket(t *testing.T) { *ccv.NewSlashPacketData( abci.Validator{Address: consumerConsAddr.ToSdkConsAddr()}, 0, // ValsetUpdateId = 0 uses init chain height. - stakingtypes.Downtime), + stakingtypes.Infraction_INFRACTION_DOWNTIME), func(ctx sdk.Context, mocks testkeeper.MockedKeepers, expectedPacketData ccv.SlashPacketData, ) []*gomock.Call { @@ -516,7 +517,7 @@ func TestHandleSlashPacket(t *testing.T) { *ccv.NewSlashPacketData( abci.Validator{Address: consumerConsAddr.ToSdkConsAddr()}, validVscID, - stakingtypes.Downtime), + stakingtypes.Infraction_INFRACTION_DOWNTIME), func(ctx sdk.Context, mocks testkeeper.MockedKeepers, expectedPacketData ccv.SlashPacketData, ) []*gomock.Call { diff --git a/x/ccv/provider/keeper/throttle.go b/x/ccv/provider/keeper/throttle.go index d832125bfb..d08f7bf5e0 100644 --- a/x/ccv/provider/keeper/throttle.go +++ b/x/ccv/provider/keeper/throttle.go @@ -4,10 +4,12 @@ import ( "fmt" "time" + "cosmossdk.io/math" + tmtypes "github.com/cometbft/cometbft/types" sdktypes "github.com/cosmos/cosmos-sdk/types" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" - tmtypes "github.com/tendermint/tendermint/types" ) // This file contains functionality relevant to the throttling of slash and vsc matured packets, aka circuit breaker logic. @@ -68,7 +70,7 @@ func (k Keeper) HandleThrottleQueues(ctx sdktypes.Context, vscMaturedHandledThis // Obtains the effective validator power relevant to a validator consensus address. func (k Keeper) GetEffectiveValPower(ctx sdktypes.Context, valConsAddr providertypes.ProviderConsAddress, -) sdktypes.Int { +) math.Int { // Obtain staking module val object from the provider's consensus address. // Note: if validator is not found or unbonded, this will be handled appropriately in HandleSlashPacket val, found := k.stakingKeeper.GetValidatorByConsAddr(ctx, valConsAddr.ToSdkConsAddr()) @@ -181,7 +183,7 @@ func (k Keeper) ReplenishSlashMeter(ctx sdktypes.Context) { // Note: allowance can change between blocks, since it is directly correlated to total voting power. // The slash meter must be less than or equal to the allowance for this block, before any slash // packet handling logic can be executed. -func (k Keeper) GetSlashMeterAllowance(ctx sdktypes.Context) sdktypes.Int { +func (k Keeper) GetSlashMeterAllowance(ctx sdktypes.Context) math.Int { strFrac := k.GetSlashMeterReplenishFraction(ctx) // MustNewDecFromStr should not panic, since the (string representation) of the slash meter replenish fraction // is validated in ValidateGenesis and anytime the param is mutated. @@ -553,7 +555,7 @@ func (k Keeper) DeleteThrottledPacketData(ctx sdktypes.Context, consumerChainID // to an allowance of validators that can be jailed/tombstoned over time. // // Note: the value of this int should always be in the range of tendermint's [-MaxVotingPower, MaxVotingPower] -func (k Keeper) GetSlashMeter(ctx sdktypes.Context) sdktypes.Int { +func (k Keeper) GetSlashMeter(ctx sdktypes.Context) math.Int { store := ctx.KVStore(k.storeKey) bz := store.Get(providertypes.SlashMeterKey()) if bz == nil { @@ -574,7 +576,7 @@ func (k Keeper) GetSlashMeter(ctx sdktypes.Context) sdktypes.Int { // SetSlashMeter sets the slash meter to the given signed int value // // Note: the value of this int should always be in the range of tendermint's [-MaxTotalVotingPower, MaxTotalVotingPower] -func (k Keeper) SetSlashMeter(ctx sdktypes.Context, value sdktypes.Int) { +func (k Keeper) SetSlashMeter(ctx sdktypes.Context, value math.Int) { // TODO: remove these invariant panics once https://github.com/cosmos/interchain-security/issues/534 is solved. // The following panics are included since they are invariants for slash meter value. diff --git a/x/ccv/provider/keeper/throttle_test.go b/x/ccv/provider/keeper/throttle_test.go index 3b93523d4b..86a0ee1415 100644 --- a/x/ccv/provider/keeper/throttle_test.go +++ b/x/ccv/provider/keeper/throttle_test.go @@ -5,17 +5,20 @@ import ( "testing" "time" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" - "github.com/golang/mock/gomock" + "cosmossdk.io/math" + tmtypes "github.com/cometbft/cometbft/types" sdktypes "github.com/cosmos/cosmos-sdk/types" - cryptoutil "github.com/cosmos/interchain-security/v2/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" + + "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" - tmtypes "github.com/tendermint/tendermint/types" "golang.org/x/exp/slices" + + cryptoutil "github.com/cosmos/interchain-security/v2/testutil/crypto" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" + "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" + providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" ) // TestHandlePacketDataForChain tests the HandlePacketDataForChain function. Note: Only one consumer is tested here, @@ -179,9 +182,9 @@ func TestSlashMeterReplenishment(t *testing.T) { testCases := []struct { replenishPeriod time.Duration replenishFraction string - totalPower sdktypes.Int + totalPower math.Int // Replenish fraction * total power, also serves as max slash meter value - expectedAllowance sdktypes.Int + expectedAllowance math.Int }{ { replenishPeriod: time.Minute, @@ -451,11 +454,11 @@ func TestTotalVotingPowerChanges(t *testing.T) { // voting power becomes lower from slashing. func TestNegativeSlashMeter(t *testing.T) { testCases := []struct { - slashedPower sdktypes.Int - totalPower sdktypes.Int + slashedPower math.Int + totalPower math.Int replenishFraction string numReplenishesTillFull int - finalMeterValue sdktypes.Int + finalMeterValue math.Int }{ { // Meter is initialized to a value of: 0.01*1000 = 10. @@ -566,9 +569,9 @@ func TestNegativeSlashMeter(t *testing.T) { func TestGetSlashMeterAllowance(t *testing.T) { testCases := []struct { replenishFraction string - totalPower sdktypes.Int + totalPower math.Int // Replenish fraction * total power - expectedAllowance sdktypes.Int + expectedAllowance math.Int }{ { replenishFraction: "0.00", @@ -1246,7 +1249,7 @@ func TestThrottledPacketDataSize(t *testing.T) { // TestSlashMeter tests the getter and setter for the slash gas meter func TestSlashMeter(t *testing.T) { testCases := []struct { - meterValue sdktypes.Int + meterValue math.Int shouldPanic bool }{ {meterValue: sdktypes.NewInt(-7999999999999999999), shouldPanic: true}, diff --git a/x/ccv/provider/module.go b/x/ccv/provider/module.go index bb15b75ab1..ca83c9011b 100644 --- a/x/ccv/provider/module.go +++ b/x/ccv/provider/module.go @@ -4,23 +4,24 @@ import ( "context" "encoding/json" "fmt" - "math/rand" + abci "github.com/cometbft/cometbft/abci/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + + porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - porttypes "github.com/cosmos/ibc-go/v4/modules/core/05-port/types" "github.com/cosmos/interchain-security/v2/x/ccv/provider/client/cli" "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - "github.com/gorilla/mux" + "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" - abci "github.com/tendermint/tendermint/abci/types" ) var ( @@ -63,10 +64,6 @@ func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config client.TxEncod return data.Validate() } -// RegisterRESTRoutes implements AppModuleBasic interface -func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Router) { -} - // RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the ibc-provider module. func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) { err := providertypes.RegisterQueryHandlerClient(context.Background(), mux, providertypes.NewQueryClient(clientCtx)) @@ -106,30 +103,10 @@ func (AppModule) RegisterInvariants(ir sdk.InvariantRegistry) { // TODO } -// Route implements the AppModule interface -func (am AppModule) Route() sdk.Route { - return sdk.Route{} -} - -// QuerierRoute implements the AppModule interface -func (AppModule) QuerierRoute() string { - return providertypes.QuerierRoute -} - -// LegacyQuerierHandler implements the AppModule interface -func (am AppModule) LegacyQuerierHandler(*codec.LegacyAmino) sdk.Querier { - return nil -} - // RegisterServices registers module services. 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, 1, m.Migratev1Tov2); err != nil { - panic(fmt.Sprintf("failed to register migrator: %s", err)) - } } // InitGenesis performs genesis initialization for the provider module. It returns no validator updates. @@ -183,16 +160,6 @@ func (am AppModule) EndBlock(ctx sdk.Context, req abci.RequestEndBlock) []abci.V func (AppModule) GenerateGenesisState(simState *module.SimulationState) { } -// ProposalContents doesn't return any content functions for governance proposals. -func (AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalContent { - return nil -} - -// RandomizedParams creates randomized provider param changes for the simulator. -func (AppModule) RandomizedParams(r *rand.Rand) []simtypes.ParamChange { - return nil -} - // RegisterStoreDecoder registers a decoder for provider module's types func (am AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) { } diff --git a/x/ccv/provider/module_test.go b/x/ccv/provider/module_test.go index 3e2776c4e7..2cb08d0daf 100644 --- a/x/ccv/provider/module_test.go +++ b/x/ccv/provider/module_test.go @@ -5,7 +5,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - host "github.com/cosmos/ibc-go/v4/modules/core/24-host" + + host "github.com/cosmos/ibc-go/v7/modules/core/24-host" + testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" "github.com/cosmos/interchain-security/v2/x/ccv/provider" "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" diff --git a/x/ccv/provider/proposal_handler.go b/x/ccv/provider/proposal_handler.go index 8854b8e57c..2bfb71c73b 100644 --- a/x/ccv/provider/proposal_handler.go +++ b/x/ccv/provider/proposal_handler.go @@ -1,10 +1,11 @@ package provider import ( + govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" + errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ) @@ -12,8 +13,8 @@ import ( // NewProviderProposalHandler defines the handler for consumer addition, // consumer removal and equivocation proposals. // Passed proposals are executed during EndBlock. -func NewProviderProposalHandler(k keeper.Keeper) govtypes.Handler { - return func(ctx sdk.Context, content govtypes.Content) error { +func NewProviderProposalHandler(k keeper.Keeper) govv1beta1.Handler { + return func(ctx sdk.Context, content govv1beta1.Content) error { switch c := content.(type) { case *types.ConsumerAdditionProposal: return k.HandleConsumerAdditionProposal(ctx, c) diff --git a/x/ccv/provider/proposal_handler_test.go b/x/ccv/provider/proposal_handler_test.go index 1e8e9b34b5..35b7821dd7 100644 --- a/x/ccv/provider/proposal_handler_test.go +++ b/x/ccv/provider/proposal_handler_test.go @@ -10,9 +10,10 @@ import ( "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + + govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" "github.com/cosmos/interchain-security/v2/x/ccv/provider" providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" @@ -28,7 +29,7 @@ func TestProviderProposalHandler(t *testing.T) { testCases := []struct { name string - content govtypes.Content + content govv1beta1.Content blockTime time.Time expValidConsumerAddition bool expValidConsumerRemoval bool @@ -79,9 +80,13 @@ func TestProviderProposalHandler(t *testing.T) { }, { name: "unsupported proposal type", - content: distributiontypes.NewCommunityPoolSpendProposal( - "title", "desc", []byte{}, - sdk.NewCoins(sdk.NewCoin("communityfunds", sdk.NewInt(10)))), + // lint rule disabled because this is a test case for an unsupported proposal type + content: &distributiontypes.CommunityPoolSpendProposal{ // nolint:staticcheck + Title: "title", + Description: "desc", + Recipient: "", + Amount: sdk.NewCoins(sdk.NewCoin("communityfunds", sdk.NewInt(10))), + }, }, } diff --git a/x/ccv/provider/types/codec.go b/x/ccv/provider/types/codec.go index 3e4b34dd42..54c29442ae 100644 --- a/x/ccv/provider/types/codec.go +++ b/x/ccv/provider/types/codec.go @@ -5,7 +5,7 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/msgservice" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" ) // RegisterLegacyAminoCodec registers the necessary x/ibc transfer interfaces and concrete types @@ -16,11 +16,11 @@ func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { // RegisterInterfaces registers the provider proposal structs to the interface registry func RegisterInterfaces(registry codectypes.InterfaceRegistry) { registry.RegisterImplementations( - (*govtypes.Content)(nil), + (*govv1beta1.Content)(nil), &ConsumerAdditionProposal{}, ) registry.RegisterImplementations( - (*govtypes.Content)(nil), + (*govv1beta1.Content)(nil), &ConsumerRemovalProposal{}, ) registry.RegisterImplementations( @@ -32,7 +32,7 @@ func RegisterInterfaces(registry codectypes.InterfaceRegistry) { &MsgRegisterConsumerRewardDenom{}, ) registry.RegisterImplementations( - (*govtypes.Content)(nil), + (*govv1beta1.Content)(nil), &EquivocationProposal{}, ) diff --git a/x/ccv/provider/types/genesis.go b/x/ccv/provider/types/genesis.go index 9f7fdc3b11..4508fd6eb6 100644 --- a/x/ccv/provider/types/genesis.go +++ b/x/ccv/provider/types/genesis.go @@ -5,7 +5,8 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" - host "github.com/cosmos/ibc-go/v4/modules/core/24-host" + host "github.com/cosmos/ibc-go/v7/modules/core/24-host" + ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" ) diff --git a/x/ccv/provider/types/genesis.pb.go b/x/ccv/provider/types/genesis.pb.go index 6d4da633fd..84110c9b96 100644 --- a/x/ccv/provider/types/genesis.pb.go +++ b/x/ccv/provider/types/genesis.pb.go @@ -5,11 +5,11 @@ package types import ( fmt "fmt" + _ "github.com/cometbft/cometbft/proto/tendermint/crypto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" types1 "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" types "github.com/cosmos/interchain-security/v2/x/ccv/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - _ "github.com/tendermint/tendermint/proto/tendermint/crypto" io "io" math "math" math_bits "math/bits" @@ -173,10 +173,12 @@ type ConsumerState struct { InitialHeight uint64 `protobuf:"varint,4,opt,name=initial_height,json=initialHeight,proto3" json:"initial_height,omitempty"` // ConsumerGenesis defines the initial consumer chain genesis states ConsumerGenesis types1.GenesisState `protobuf:"bytes,5,opt,name=consumer_genesis,json=consumerGenesis,proto3" json:"consumer_genesis"` - // PendingValsetChanges defines the pending validator set changes for the consumer chain + // PendingValsetChanges defines the pending validator set changes for the + // consumer chain PendingValsetChanges []types.ValidatorSetChangePacketData `protobuf:"bytes,6,rep,name=pending_valset_changes,json=pendingValsetChanges,proto3" json:"pending_valset_changes"` SlashDowntimeAck []string `protobuf:"bytes,7,rep,name=slash_downtime_ack,json=slashDowntimeAck,proto3" json:"slash_downtime_ack,omitempty"` - // UnbondingOpsIndex defines the unbonding operations waiting on this consumer chain + // UnbondingOpsIndex defines the unbonding operations waiting on this consumer + // chain UnbondingOpsIndex []VscUnbondingOps `protobuf:"bytes,8,rep,name=unbonding_ops_index,json=unbondingOpsIndex,proto3" json:"unbonding_ops_index"` } diff --git a/x/ccv/provider/types/genesis_test.go b/x/ccv/provider/types/genesis_test.go index 0b85d9f6b3..0bf3b98a55 100644 --- a/x/ccv/provider/types/genesis_test.go +++ b/x/ccv/provider/types/genesis_test.go @@ -4,17 +4,19 @@ import ( "testing" "time" + abci "github.com/cometbft/cometbft/abci/types" + tmtypes "github.com/cometbft/cometbft/types" sdk "github.com/cosmos/cosmos-sdk/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - commitmenttypes "github.com/cosmos/ibc-go/v4/modules/core/23-commitment/types" - ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + "github.com/cosmos/interchain-security/v2/testutil/crypto" consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" - tmtypes "github.com/tendermint/tendermint/types" ) // Tests validation of consumer states and params within a provider genesis state @@ -74,7 +76,7 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, - time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}, true, false), + 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)}), nil, nil, @@ -93,7 +95,7 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, - time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}, true, false), + 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)}), nil, nil, @@ -112,7 +114,7 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, - time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}, true, false), + 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)}), nil, nil, @@ -131,7 +133,7 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, - time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}, true, false), + 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)}), nil, nil, @@ -150,7 +152,7 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, - 0, clienttypes.Height{}, nil, []string{"ibc", "upgradedIBCState"}, true, false), + 0, clienttypes.Height{}, nil, []string{"ibc", "upgradedIBCState"}), types.DefaultTrustingPeriodFraction, ccv.DefaultCCVTimeoutPeriod, types.DefaultInitTimeoutPeriod, @@ -175,7 +177,7 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, - time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}, true, false), + time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}), "0.0", // 0 trusting period fraction here ccv.DefaultCCVTimeoutPeriod, types.DefaultInitTimeoutPeriod, @@ -200,7 +202,7 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, - time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}, true, false), + time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}), types.DefaultTrustingPeriodFraction, 0, // 0 ccv timeout here types.DefaultInitTimeoutPeriod, @@ -225,7 +227,7 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, - time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}, true, false), + time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}), types.DefaultTrustingPeriodFraction, ccv.DefaultCCVTimeoutPeriod, 0, // 0 init timeout here @@ -250,7 +252,7 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, - time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}, true, false), + time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}), types.DefaultTrustingPeriodFraction, ccv.DefaultCCVTimeoutPeriod, types.DefaultInitTimeoutPeriod, @@ -275,7 +277,7 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, - time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}, true, false), + time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}), types.DefaultTrustingPeriodFraction, ccv.DefaultCCVTimeoutPeriod, types.DefaultInitTimeoutPeriod, @@ -300,7 +302,7 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, - time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}, true, false), + time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}), types.DefaultTrustingPeriodFraction, ccv.DefaultCCVTimeoutPeriod, types.DefaultInitTimeoutPeriod, @@ -325,7 +327,7 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, - time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}, true, false), + time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}), types.DefaultTrustingPeriodFraction, ccv.DefaultCCVTimeoutPeriod, types.DefaultInitTimeoutPeriod, @@ -655,7 +657,7 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, - time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}, true, false), + 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)}), nil, nil, @@ -674,7 +676,7 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, - time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}, true, false), + 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)}), nil, nil, @@ -717,10 +719,7 @@ func getInitialConsumerGenesis(t *testing.T, chainID string) consumertypes.Genes time.Duration(1), clienttypes.Height{RevisionNumber: clienttypes.ParseChainID(chainID), RevisionHeight: 1}, commitmenttypes.GetSDKSpecs(), - []string{"upgrade", "upgradedIBCState"}, - true, - true, - ) + []string{"upgrade", "upgradedIBCState"}) consensusState := ibctmtypes.NewConsensusState(time.Now(), commitmenttypes.NewMerkleRoot([]byte("apphash")), valHash) params := consumertypes.DefaultParams() diff --git a/x/ccv/provider/types/params.go b/x/ccv/provider/types/params.go index 3966232501..487fdda366 100644 --- a/x/ccv/provider/types/params.go +++ b/x/ccv/provider/types/params.go @@ -6,9 +6,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - commitmenttypes "github.com/cosmos/ibc-go/v4/modules/core/23-commitment/types" - ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" + + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" ) @@ -97,8 +99,6 @@ func DefaultParams() Params { clienttypes.Height{}, // latest(initial) height commitmenttypes.GetSDKSpecs(), []string{"upgrade", "upgradedIBCState"}, - true, - true, ), DefaultTrustingPeriodFraction, ccvtypes.DefaultCCVTimeoutPeriod, diff --git a/x/ccv/provider/types/params_test.go b/x/ccv/provider/types/params_test.go index 42e61f5ebd..bca99670a9 100644 --- a/x/ccv/provider/types/params_test.go +++ b/x/ccv/provider/types/params_test.go @@ -4,12 +4,12 @@ import ( "testing" "time" - sdk "github.com/cosmos/cosmos-sdk/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - commitmenttypes "github.com/cosmos/ibc-go/v4/modules/core/23-commitment/types" - ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" "github.com/stretchr/testify/require" + sdk "github.com/cosmos/cosmos-sdk/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ) @@ -20,42 +20,44 @@ func TestValidateParams(t *testing.T) { expPass bool }{ {"default params", types.DefaultParams(), true}, - {"custom valid params", types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, - time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}, true, false), + {"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}, - {"custom invalid params", types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, - 0, clienttypes.Height{}, nil, []string{"ibc", "upgradedIBCState"}, true, false), + {"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}, {"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}, // 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"}, true, false), + 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 ccv timeout period", types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, - time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}, true, false), + 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 init timeout period", types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, - time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}, true, false), + 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 vsc timeout period", types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, - time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}, true, false), + 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 slash meter replenish period", types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, - time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}, true, false), + 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}, {"slash meter replenish fraction over 1", types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, - time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}, true, false), + 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"}, true, false), + 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}, {"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"}, true, false), + 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}, {"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"}, true, false), + 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}, } diff --git a/x/ccv/provider/types/proposal.go b/x/ccv/provider/types/proposal.go index 913152e68c..43f5d027eb 100644 --- a/x/ccv/provider/types/proposal.go +++ b/x/ccv/provider/types/proposal.go @@ -8,8 +8,9 @@ import ( errorsmod "cosmossdk.io/errors" evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" + govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" ) @@ -20,15 +21,15 @@ const ( ) var ( - _ govtypes.Content = &ConsumerAdditionProposal{} - _ govtypes.Content = &ConsumerRemovalProposal{} - _ govtypes.Content = &EquivocationProposal{} + _ govv1beta1.Content = &ConsumerAdditionProposal{} + _ govv1beta1.Content = &ConsumerRemovalProposal{} + _ govv1beta1.Content = &EquivocationProposal{} ) func init() { - govtypes.RegisterProposalType(ProposalTypeConsumerAddition) - govtypes.RegisterProposalType(ProposalTypeConsumerRemoval) - govtypes.RegisterProposalType(ProposalTypeEquivocation) + govv1beta1.RegisterProposalType(ProposalTypeConsumerAddition) + govv1beta1.RegisterProposalType(ProposalTypeConsumerRemoval) + govv1beta1.RegisterProposalType(ProposalTypeEquivocation) } // NewConsumerAdditionProposal creates a new consumer addition proposal. @@ -42,7 +43,7 @@ func NewConsumerAdditionProposal(title, description, chainID string, ccvTimeoutPeriod time.Duration, transferTimeoutPeriod time.Duration, unbondingPeriod time.Duration, -) govtypes.Content { +) govv1beta1.Content { return &ConsumerAdditionProposal{ Title: title, Description: description, @@ -77,7 +78,7 @@ func (cccp *ConsumerAdditionProposal) ProposalType() string { // ValidateBasic runs basic stateless validity checks func (cccp *ConsumerAdditionProposal) ValidateBasic() error { - if err := govtypes.ValidateAbstract(cccp); err != nil { + if err := govv1beta1.ValidateAbstract(cccp); err != nil { return err } @@ -165,7 +166,7 @@ func (cccp *ConsumerAdditionProposal) String() string { } // NewConsumerRemovalProposal creates a new consumer removal proposal. -func NewConsumerRemovalProposal(title, description, chainID string, stopTime time.Time) govtypes.Content { +func NewConsumerRemovalProposal(title, description, chainID string, stopTime time.Time) govv1beta1.Content { return &ConsumerRemovalProposal{ Title: title, Description: description, @@ -182,7 +183,7 @@ func (sccp *ConsumerRemovalProposal) ProposalType() string { return ProposalType // ValidateBasic runs basic stateless validity checks func (sccp *ConsumerRemovalProposal) ValidateBasic() error { - if err := govtypes.ValidateAbstract(sccp); err != nil { + if err := govv1beta1.ValidateAbstract(sccp); err != nil { return err } @@ -197,7 +198,7 @@ func (sccp *ConsumerRemovalProposal) ValidateBasic() error { } // NewEquivocationProposal creates a new equivocation proposal. -func NewEquivocationProposal(title, description string, equivocations []*evidencetypes.Equivocation) govtypes.Content { +func NewEquivocationProposal(title, description string, equivocations []*evidencetypes.Equivocation) govv1beta1.Content { return &EquivocationProposal{ Title: title, Description: description, @@ -215,7 +216,7 @@ func (sp *EquivocationProposal) ProposalType() string { // ValidateBasic runs basic stateless validity checks func (sp *EquivocationProposal) ValidateBasic() error { - if err := govtypes.ValidateAbstract(sp); err != nil { + if err := govv1beta1.ValidateAbstract(sp); err != nil { return err } if len(sp.Equivocations) == 0 { diff --git a/x/ccv/provider/types/proposal_test.go b/x/ccv/provider/types/proposal_test.go index d1440eb9a0..4227654bd9 100644 --- a/x/ccv/provider/types/proposal_test.go +++ b/x/ccv/provider/types/proposal_test.go @@ -12,10 +12,12 @@ import ( "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" + + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - ibctmtypes "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" ) @@ -24,7 +26,7 @@ func TestConsumerAdditionProposalValidateBasic(t *testing.T) { testCases := []struct { name string - proposal govtypes.Content + proposal govv1beta1.Content expPass bool }{ { @@ -245,7 +247,7 @@ func TestMarshalConsumerAdditionProposal(t *testing.T) { // create codec ir := codectypes.NewInterfaceRegistry() types.RegisterInterfaces(ir) - govtypes.RegisterInterfaces(ir) + govv1.RegisterInterfaces(ir) clienttypes.RegisterInterfaces(ir) ibctmtypes.RegisterInterfaces(ir) cdc := codec.NewProtoCodec(ir) @@ -310,7 +312,7 @@ func TestConsumerAdditionProposalString(t *testing.T) { func TestEquivocationProposalValidateBasic(t *testing.T) { tests := []struct { name string - proposal govtypes.Content + proposal govv1beta1.Content expectedError string }{ { diff --git a/x/ccv/provider/types/provider.pb.go b/x/ccv/provider/types/provider.pb.go index acc95ca9af..49c2bb7cda 100644 --- a/x/ccv/provider/types/provider.pb.go +++ b/x/ccv/provider/types/provider.pb.go @@ -5,14 +5,14 @@ package types import ( fmt "fmt" - types3 "github.com/cosmos/cosmos-sdk/types" + crypto "github.com/cometbft/cometbft/proto/tendermint/crypto" + types2 "github.com/cosmos/cosmos-sdk/types" types1 "github.com/cosmos/cosmos-sdk/x/evidence/types" - types "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - types2 "github.com/cosmos/ibc-go/v4/modules/light-clients/07-tendermint/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - crypto "github.com/tendermint/tendermint/proto/tendermint/crypto" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" + github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" + types "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + _07_tendermint "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" _ "google.golang.org/protobuf/types/known/durationpb" _ "google.golang.org/protobuf/types/known/timestamppb" io "io" @@ -33,28 +33,34 @@ var _ = time.Kitchen // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -// ConsumerAdditionProposal is a governance proposal on the provider chain to spawn a new consumer chain. -// If it passes, then all validators on the provider chain are expected to validate the consumer chain at spawn time -// or get slashed. It is recommended that spawn time occurs after the proposal end time. +// ConsumerAdditionProposal is a governance proposal on the provider chain to +// spawn a new consumer chain. If it passes, then all validators on the provider +// chain are expected to validate the consumer chain at spawn time or get +// slashed. It is recommended that spawn time occurs after the proposal end +// time. type ConsumerAdditionProposal struct { // the title of the proposal Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` // the description of the proposal Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - // the proposed chain-id of the new consumer chain, must be different from all other consumer chain ids of the executing - // provider chain. + // the proposed chain-id of the new consumer chain, must be different from all + // other consumer chain ids of the executing provider chain. ChainId string `protobuf:"bytes,3,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` // the proposed initial height of new consumer chain. - // For a completely new chain, this will be {0,1}. However, it may be different if this is a chain that is converting to a consumer chain. + // For a completely new chain, this will be {0,1}. However, it may be + // different if this is a chain that is converting to a consumer chain. InitialHeight types.Height `protobuf:"bytes,4,opt,name=initial_height,json=initialHeight,proto3" json:"initial_height"` - // The hash of the consumer chain genesis state without the consumer CCV module genesis params. - // It is used for off-chain confirmation of genesis.json validity by validators and other parties. + // The hash of the consumer chain genesis state without the consumer CCV + // module genesis params. It is used for off-chain confirmation of + // genesis.json validity by validators and other parties. GenesisHash []byte `protobuf:"bytes,5,opt,name=genesis_hash,json=genesisHash,proto3" json:"genesis_hash,omitempty"` - // The hash of the consumer chain binary that should be run by validators on chain initialization. - // It is used for off-chain confirmation of binary validity by validators and other parties. + // The hash of the consumer chain binary that should be run by validators on + // chain initialization. It is used for off-chain confirmation of binary + // validity by validators and other parties. BinaryHash []byte `protobuf:"bytes,6,opt,name=binary_hash,json=binaryHash,proto3" json:"binary_hash,omitempty"` - // spawn time is the time on the provider chain at which the consumer chain genesis is finalized and all validators - // will be responsible for starting their consumer chain validator node. + // spawn time is the time on the provider chain at which the consumer chain + // genesis is finalized and all validators will be responsible for starting + // their consumer chain validator node. SpawnTime time.Time `protobuf:"bytes,7,opt,name=spawn_time,json=spawnTime,proto3,stdtime" json:"spawn_time"` // Unbonding period for the consumer, // which should be smaller than that of the provider in general. @@ -67,8 +73,10 @@ type ConsumerAdditionProposal struct { // during distribution events. The fraction is a string representing a // decimal number. For example "0.75" would represent 75%. ConsumerRedistributionFraction string `protobuf:"bytes,11,opt,name=consumer_redistribution_fraction,json=consumerRedistributionFraction,proto3" json:"consumer_redistribution_fraction,omitempty"` - // BlocksPerDistributionTransmission is the number of blocks between ibc-token-transfers from the consumer chain to the provider chain. - // On sending transmission event, `consumer_redistribution_fraction` of the accumulated tokens are sent to the consumer redistribution address. + // BlocksPerDistributionTransmission is the number of blocks between + // ibc-token-transfers from the consumer chain to the provider chain. On + // sending transmission event, `consumer_redistribution_fraction` of the + // accumulated tokens are sent to the consumer redistribution address. BlocksPerDistributionTransmission int64 `protobuf:"varint,12,opt,name=blocks_per_distribution_transmission,json=blocksPerDistributionTransmission,proto3" json:"blocks_per_distribution_transmission,omitempty"` // 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 @@ -77,9 +85,9 @@ type ConsumerAdditionProposal struct { // The ID of a token transfer channel used for the Reward Distribution // sub-protocol. If DistributionTransmissionChannel == "", a new transfer // channel is created on top of the same connection as the CCV channel. - // Note that transfer_channel_id is the ID of the channel end on the consumer chain. - // it is most relevant for chains performing a sovereign to consumer changeover - // in order to maintan the existing ibc transfer channel + // Note that transfer_channel_id is the ID of the channel end on the consumer + // chain. it is most relevant for chains performing a sovereign to consumer + // changeover in order to maintan the existing ibc transfer channel DistributionTransmissionChannel string `protobuf:"bytes,14,opt,name=distribution_transmission_channel,json=distributionTransmissionChannel,proto3" json:"distribution_transmission_channel,omitempty"` } @@ -115,9 +123,10 @@ func (m *ConsumerAdditionProposal) XXX_DiscardUnknown() { var xxx_messageInfo_ConsumerAdditionProposal proto.InternalMessageInfo -// ConsumerRemovalProposal is a governance proposal on the provider chain to remove (and stop) a consumer chain. -// If it passes, all the consumer chain's state is removed from the provider chain. The outstanding unbonding -// operation funds are released. +// ConsumerRemovalProposal is a governance proposal on the provider chain to +// remove (and stop) a consumer chain. If it passes, all the consumer chain's +// state is removed from the provider chain. The outstanding unbonding operation +// funds are released. type ConsumerRemovalProposal struct { // the title of the proposal Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` @@ -125,7 +134,8 @@ type ConsumerRemovalProposal struct { Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` // the chain-id of the consumer chain to be stopped ChainId string `protobuf:"bytes,3,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - // the time on the provider chain at which all validators are responsible to stop their consumer chain validator node + // the time on the provider chain at which all validators are responsible to + // stop their consumer chain validator node StopTime time.Time `protobuf:"bytes,4,opt,name=stop_time,json=stopTime,proto3,stdtime" json:"stop_time"` } @@ -253,8 +263,9 @@ func (m *EquivocationProposal) GetEquivocations() []*types1.Equivocation { return nil } -// A persisted queue entry indicating that a slash packet data instance needs to be handled. -// This type belongs in the "global" queue, to coordinate slash packet handling times between consumers. +// A persisted queue entry indicating that a slash packet data instance needs to +// be handled. This type belongs in the "global" queue, to coordinate slash +// packet handling times between consumers. type GlobalSlashEntry struct { // Block time that slash packet was received by provider chain. // This field is used for store key iteration ordering. @@ -267,7 +278,8 @@ type GlobalSlashEntry struct { // The provider's consensus address of the validator being slashed. // This field is used to obtain validator power in HandleThrottleQueues. // - // This field is not used in the store key, but is persisted in value bytes, see QueueGlobalSlashEntry. + // This field is not used in the store key, but is persisted in value bytes, + // see QueueGlobalSlashEntry. ProviderValConsAddr []byte `protobuf:"bytes,4,opt,name=provider_val_cons_addr,json=providerValConsAddr,proto3" json:"provider_val_cons_addr,omitempty"` } @@ -334,12 +346,14 @@ func (m *GlobalSlashEntry) GetProviderValConsAddr() []byte { // Params defines the parameters for CCV Provider module type Params struct { - TemplateClient *types2.ClientState `protobuf:"bytes,1,opt,name=template_client,json=templateClient,proto3" json:"template_client,omitempty"` - // TrustingPeriodFraction is used to compute the consumer and provider IBC client's TrustingPeriod from the chain defined UnbondingPeriod + TemplateClient *_07_tendermint.ClientState `protobuf:"bytes,1,opt,name=template_client,json=templateClient,proto3" json:"template_client,omitempty"` + // TrustingPeriodFraction is used to compute the consumer and provider IBC + // client's TrustingPeriod from the chain defined UnbondingPeriod TrustingPeriodFraction string `protobuf:"bytes,2,opt,name=trusting_period_fraction,json=trustingPeriodFraction,proto3" json:"trusting_period_fraction,omitempty"` // Sent IBC packets will timeout after this duration CcvTimeoutPeriod time.Duration `protobuf:"bytes,3,opt,name=ccv_timeout_period,json=ccvTimeoutPeriod,proto3,stdduration" json:"ccv_timeout_period"` - // The channel initialization (IBC channel opening handshake) will timeout after this duration + // The channel initialization (IBC channel opening handshake) will timeout + // after this duration InitTimeoutPeriod time.Duration `protobuf:"bytes,4,opt,name=init_timeout_period,json=initTimeoutPeriod,proto3,stdduration" json:"init_timeout_period"` // The VSC packets sent by the provider will timeout after this duration. // Note that unlike ccv_timeout_period which is an IBC param, @@ -348,14 +362,15 @@ type Params struct { VscTimeoutPeriod time.Duration `protobuf:"bytes,5,opt,name=vsc_timeout_period,json=vscTimeoutPeriod,proto3,stdduration" json:"vsc_timeout_period"` // The period for which the slash meter is replenished SlashMeterReplenishPeriod time.Duration `protobuf:"bytes,6,opt,name=slash_meter_replenish_period,json=slashMeterReplenishPeriod,proto3,stdduration" json:"slash_meter_replenish_period"` - // The fraction of total voting power 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. + // The fraction of total voting power 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. 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 types3.Coin `protobuf:"bytes,9,opt,name=consumer_reward_denom_registration_fee,json=consumerRewardDenomRegistrationFee,proto3" json:"consumer_reward_denom_registration_fee"` + ConsumerRewardDenomRegistrationFee types2.Coin `protobuf:"bytes,9,opt,name=consumer_reward_denom_registration_fee,json=consumerRewardDenomRegistrationFee,proto3" json:"consumer_reward_denom_registration_fee"` } func (m *Params) Reset() { *m = Params{} } @@ -391,7 +406,7 @@ func (m *Params) XXX_DiscardUnknown() { var xxx_messageInfo_Params proto.InternalMessageInfo -func (m *Params) GetTemplateClient() *types2.ClientState { +func (m *Params) GetTemplateClient() *_07_tendermint.ClientState { if m != nil { return m.TemplateClient } @@ -447,11 +462,11 @@ func (m *Params) GetMaxThrottledPackets() int64 { return 0 } -func (m *Params) GetConsumerRewardDenomRegistrationFee() types3.Coin { +func (m *Params) GetConsumerRewardDenomRegistrationFee() types2.Coin { if m != nil { return m.ConsumerRewardDenomRegistrationFee } - return types3.Coin{} + return types2.Coin{} } type HandshakeMetadata struct { @@ -552,7 +567,8 @@ func (m *SlashAcks) GetAddresses() []string { return nil } -// ConsumerAdditionProposals holds pending governance proposals on the provider chain to spawn a new chain. +// ConsumerAdditionProposals holds pending governance proposals on the provider +// chain to spawn a new chain. type ConsumerAdditionProposals struct { // proposals waiting for spawn_time to pass Pending []*ConsumerAdditionProposal `protobuf:"bytes,1,rep,name=pending,proto3" json:"pending,omitempty"` @@ -598,7 +614,8 @@ func (m *ConsumerAdditionProposals) GetPending() []*ConsumerAdditionProposal { return nil } -// ConsumerRemovalProposals holds pending governance proposals on the provider chain to remove (and stop) a consumer chain. +// ConsumerRemovalProposals holds pending governance proposals on the provider +// chain to remove (and stop) a consumer chain. type ConsumerRemovalProposals struct { // proposals waiting for stop_time to pass Pending []*ConsumerRemovalProposal `protobuf:"bytes,1,rep,name=pending,proto3" json:"pending,omitempty"` @@ -1015,7 +1032,8 @@ func (m *KeyAssignmentReplacement) GetPower() int64 { } // Used to serialize the ValidatorConsumerPubKey index from key assignment -// ValidatorConsumerPubKey: (chainID, providerAddr consAddr) -> consumerKey tmprotocrypto.PublicKey +// ValidatorConsumerPubKey: (chainID, providerAddr consAddr) -> consumerKey +// tmprotocrypto.PublicKey type ValidatorConsumerPubKey struct { ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` ProviderAddr []byte `protobuf:"bytes,2,opt,name=provider_addr,json=providerAddr,proto3" json:"provider_addr,omitempty"` @@ -1077,7 +1095,8 @@ func (m *ValidatorConsumerPubKey) GetConsumerKey() *crypto.PublicKey { } // Used to serialize the ValidatorConsumerAddr index from key assignment -// ValidatorByConsumerAddr: (chainID, consumerAddr consAddr) -> providerAddr consAddr +// ValidatorByConsumerAddr: (chainID, consumerAddr consAddr) -> providerAddr +// consAddr type ValidatorByConsumerAddr struct { ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` ConsumerAddr []byte `protobuf:"bytes,2,opt,name=consumer_addr,json=consumerAddr,proto3" json:"consumer_addr,omitempty"` @@ -1374,7 +1393,7 @@ func (m *ConsumerAdditionProposal) MarshalToSizedBuffer(dAtA []byte) (int, error i-- dAtA[i] = 0x5a } - n1, err1 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.TransferTimeoutPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.TransferTimeoutPeriod):]) + n1, err1 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.TransferTimeoutPeriod, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.TransferTimeoutPeriod):]) if err1 != nil { return 0, err1 } @@ -1382,7 +1401,7 @@ func (m *ConsumerAdditionProposal) MarshalToSizedBuffer(dAtA []byte) (int, error i = encodeVarintProvider(dAtA, i, uint64(n1)) i-- dAtA[i] = 0x52 - n2, err2 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.CcvTimeoutPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.CcvTimeoutPeriod):]) + n2, err2 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.CcvTimeoutPeriod, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.CcvTimeoutPeriod):]) if err2 != nil { return 0, err2 } @@ -1390,7 +1409,7 @@ func (m *ConsumerAdditionProposal) MarshalToSizedBuffer(dAtA []byte) (int, error i = encodeVarintProvider(dAtA, i, uint64(n2)) i-- dAtA[i] = 0x4a - n3, err3 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.UnbondingPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.UnbondingPeriod):]) + n3, err3 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.UnbondingPeriod, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.UnbondingPeriod):]) if err3 != nil { return 0, err3 } @@ -1398,7 +1417,7 @@ func (m *ConsumerAdditionProposal) MarshalToSizedBuffer(dAtA []byte) (int, error i = encodeVarintProvider(dAtA, i, uint64(n3)) i-- dAtA[i] = 0x42 - n4, err4 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.SpawnTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.SpawnTime):]) + n4, err4 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.SpawnTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.SpawnTime):]) if err4 != nil { return 0, err4 } @@ -1474,7 +1493,7 @@ func (m *ConsumerRemovalProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) _ = i var l int _ = l - n6, err6 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StopTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StopTime):]) + n6, err6 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.StopTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.StopTime):]) if err6 != nil { return 0, err6 } @@ -1596,7 +1615,7 @@ func (m *GlobalSlashEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x12 } - n7, err7 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.RecvTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.RecvTime):]) + n7, err7 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.RecvTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.RecvTime):]) if err7 != nil { return 0, err7 } @@ -1649,7 +1668,7 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x3a } - n9, err9 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.SlashMeterReplenishPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.SlashMeterReplenishPeriod):]) + n9, err9 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.SlashMeterReplenishPeriod, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.SlashMeterReplenishPeriod):]) if err9 != nil { return 0, err9 } @@ -1657,7 +1676,7 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintProvider(dAtA, i, uint64(n9)) i-- dAtA[i] = 0x32 - n10, err10 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.VscTimeoutPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.VscTimeoutPeriod):]) + n10, err10 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.VscTimeoutPeriod, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.VscTimeoutPeriod):]) if err10 != nil { return 0, err10 } @@ -1665,7 +1684,7 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintProvider(dAtA, i, uint64(n10)) i-- dAtA[i] = 0x2a - n11, err11 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.InitTimeoutPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.InitTimeoutPeriod):]) + n11, err11 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.InitTimeoutPeriod, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.InitTimeoutPeriod):]) if err11 != nil { return 0, err11 } @@ -1673,7 +1692,7 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintProvider(dAtA, i, uint64(n11)) i-- dAtA[i] = 0x22 - n12, err12 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.CcvTimeoutPeriod, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.CcvTimeoutPeriod):]) + n12, err12 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.CcvTimeoutPeriod, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.CcvTimeoutPeriod):]) if err12 != nil { return 0, err12 } @@ -2053,7 +2072,7 @@ func (m *VscSendTimestamp) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - n16, err16 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Timestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp):]) + n16, err16 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Timestamp, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Timestamp):]) if err16 != nil { return 0, err16 } @@ -2295,13 +2314,13 @@ func (m *ConsumerAdditionProposal) Size() (n int) { if l > 0 { n += 1 + l + sovProvider(uint64(l)) } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.SpawnTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.SpawnTime) n += 1 + l + sovProvider(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.UnbondingPeriod) + l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.UnbondingPeriod) n += 1 + l + sovProvider(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.CcvTimeoutPeriod) + l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.CcvTimeoutPeriod) n += 1 + l + sovProvider(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.TransferTimeoutPeriod) + l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.TransferTimeoutPeriod) n += 1 + l + sovProvider(uint64(l)) l = len(m.ConsumerRedistributionFraction) if l > 0 { @@ -2338,7 +2357,7 @@ func (m *ConsumerRemovalProposal) Size() (n int) { if l > 0 { n += 1 + l + sovProvider(uint64(l)) } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.StopTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.StopTime) n += 1 + l + sovProvider(uint64(l)) return n } @@ -2372,7 +2391,7 @@ func (m *GlobalSlashEntry) Size() (n int) { } var l int _ = l - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.RecvTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.RecvTime) n += 1 + l + sovProvider(uint64(l)) l = len(m.ConsumerChainID) if l > 0 { @@ -2402,13 +2421,13 @@ func (m *Params) Size() (n int) { if l > 0 { n += 1 + l + sovProvider(uint64(l)) } - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.CcvTimeoutPeriod) + l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.CcvTimeoutPeriod) n += 1 + l + sovProvider(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.InitTimeoutPeriod) + l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.InitTimeoutPeriod) n += 1 + l + sovProvider(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.VscTimeoutPeriod) + l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.VscTimeoutPeriod) n += 1 + l + sovProvider(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.SlashMeterReplenishPeriod) + l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.SlashMeterReplenishPeriod) n += 1 + l + sovProvider(uint64(l)) l = len(m.SlashMeterReplenishFraction) if l > 0 { @@ -2578,7 +2597,7 @@ func (m *VscSendTimestamp) Size() (n int) { if m.VscId != 0 { n += 1 + sovProvider(uint64(m.VscId)) } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Timestamp) n += 1 + l + sovProvider(uint64(l)) return n } @@ -2926,7 +2945,7 @@ func (m *ConsumerAdditionProposal) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.SpawnTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.SpawnTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -2959,7 +2978,7 @@ func (m *ConsumerAdditionProposal) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.UnbondingPeriod, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(&m.UnbondingPeriod, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -2992,7 +3011,7 @@ func (m *ConsumerAdditionProposal) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.CcvTimeoutPeriod, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(&m.CcvTimeoutPeriod, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -3025,7 +3044,7 @@ func (m *ConsumerAdditionProposal) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.TransferTimeoutPeriod, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(&m.TransferTimeoutPeriod, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -3306,7 +3325,7 @@ func (m *ConsumerRemovalProposal) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.StopTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.StopTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -3537,7 +3556,7 @@ func (m *GlobalSlashEntry) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.RecvTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.RecvTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -3706,7 +3725,7 @@ func (m *Params) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.TemplateClient == nil { - m.TemplateClient = &types2.ClientState{} + m.TemplateClient = &_07_tendermint.ClientState{} } if err := m.TemplateClient.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -3773,7 +3792,7 @@ func (m *Params) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.CcvTimeoutPeriod, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(&m.CcvTimeoutPeriod, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -3806,7 +3825,7 @@ func (m *Params) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.InitTimeoutPeriod, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(&m.InitTimeoutPeriod, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -3839,7 +3858,7 @@ func (m *Params) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.VscTimeoutPeriod, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(&m.VscTimeoutPeriod, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -3872,7 +3891,7 @@ func (m *Params) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.SlashMeterReplenishPeriod, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(&m.SlashMeterReplenishPeriod, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -4965,7 +4984,7 @@ func (m *VscSendTimestamp) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Timestamp, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.Timestamp, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/ccv/provider/types/query.pb.go b/x/ccv/provider/types/query.pb.go index b205b0a7ea..5d4fc19077 100644 --- a/x/ccv/provider/types/query.pb.go +++ b/x/ccv/provider/types/query.pb.go @@ -6,12 +6,12 @@ package types import ( context "context" fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" + github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" types "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" types1 "github.com/cosmos/interchain-security/v2/x/ccv/types" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -632,10 +632,11 @@ var xxx_messageInfo_QueryThrottleStateRequest proto.InternalMessageInfo type QueryThrottleStateResponse struct { // current slash_meter state SlashMeter int64 `protobuf:"varint,1,opt,name=slash_meter,json=slashMeter,proto3" json:"slash_meter,omitempty"` - // allowance of voting power units (int) that the slash meter is given per replenish period - // this also serves as the max value for the meter. + // allowance of voting power units (int) that the slash meter is given per + // replenish period this also serves as the max value for the meter. SlashMeterAllowance int64 `protobuf:"varint,2,opt,name=slash_meter_allowance,json=slashMeterAllowance,proto3" json:"slash_meter_allowance,omitempty"` - // next time the slash meter could potentially be replenished, iff it's not full + // 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"` @@ -810,7 +811,8 @@ func (m *QueryThrottledConsumerPacketDataResponse) GetPacketDataInstances() []Th return nil } -// A query wrapper type for the global entry and data relevant to a throttled slash packet. +// 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 types1.SlashPacketData `protobuf:"bytes,2,opt,name=data,proto3" json:"data"` @@ -863,7 +865,8 @@ func (m *ThrottledSlashPacket) GetData() types1.SlashPacketData { return types1.SlashPacketData{} } -// ThrottledPacketDataWrapper contains either SlashPacketData or VSCMaturedPacketData +// ThrottledPacketDataWrapper contains either SlashPacketData or +// VSCMaturedPacketData type ThrottledPacketDataWrapper struct { // Types that are valid to be assigned to Data: // *ThrottledPacketDataWrapper_SlashPacket @@ -1180,12 +1183,14 @@ type QueryClient interface { // QueryProviderAddr returns the provider chain validator // given a consumer chain validator address QueryValidatorProviderAddr(ctx context.Context, in *QueryValidatorProviderAddrRequest, opts ...grpc.CallOption) (*QueryValidatorProviderAddrResponse, error) - // QueryThrottleState returns the main on-chain state relevant to currently throttled slash packets + // 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 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 returns a list of consumer reward + // denoms that are registered QueryRegisteredConsumerRewardDenoms(ctx context.Context, in *QueryRegisteredConsumerRewardDenomsRequest, opts ...grpc.CallOption) (*QueryRegisteredConsumerRewardDenomsResponse, error) } @@ -1296,12 +1301,14 @@ type QueryServer interface { // QueryProviderAddr returns the provider chain validator // given a consumer chain validator address QueryValidatorProviderAddr(context.Context, *QueryValidatorProviderAddrRequest) (*QueryValidatorProviderAddrResponse, error) - // QueryThrottleState returns the main on-chain state relevant to currently throttled slash packets + // 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 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 returns a list of consumer reward + // denoms that are registered QueryRegisteredConsumerRewardDenoms(context.Context, *QueryRegisteredConsumerRewardDenomsRequest) (*QueryRegisteredConsumerRewardDenomsResponse, error) } @@ -2015,7 +2022,7 @@ func (m *QueryThrottleStateResponse) MarshalToSizedBuffer(dAtA []byte) (int, err dAtA[i] = 0x22 } } - n4, err4 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.NextReplenishCandidate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.NextReplenishCandidate):]) + 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 } @@ -2488,7 +2495,7 @@ func (m *QueryThrottleStateResponse) Size() (n int) { if m.SlashMeterAllowance != 0 { n += 1 + sovQuery(uint64(m.SlashMeterAllowance)) } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.NextReplenishCandidate) + 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 { @@ -3836,7 +3843,7 @@ func (m *QueryThrottleStateResponse) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.NextReplenishCandidate, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.NextReplenishCandidate, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/ccv/provider/types/tx.pb.go b/x/ccv/provider/types/tx.pb.go index 3603695359..746f92b417 100644 --- a/x/ccv/provider/types/tx.pb.go +++ b/x/ccv/provider/types/tx.pb.go @@ -6,11 +6,11 @@ package types import ( context "context" fmt "fmt" + _ "github.com/cosmos/cosmos-proto" _ "github.com/cosmos/cosmos-sdk/codec/types" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" - _ "github.com/regen-network/cosmos-proto" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -152,7 +152,8 @@ func (m *MsgRegisterConsumerRewardDenom) XXX_DiscardUnknown() { var xxx_messageInfo_MsgRegisterConsumerRewardDenom proto.InternalMessageInfo -// MsgRegisterConsumerRewardDenomResponse defines the Msg/RegisterConsumerRewardDenom response type. +// MsgRegisterConsumerRewardDenomResponse defines the +// Msg/RegisterConsumerRewardDenom response type. type MsgRegisterConsumerRewardDenomResponse struct { } diff --git a/x/ccv/types/ccv.go b/x/ccv/types/ccv.go index 6ec3a6c7c3..62111a7b65 100644 --- a/x/ccv/types/ccv.go +++ b/x/ccv/types/ccv.go @@ -4,8 +4,8 @@ import ( "fmt" errorsmod "cosmossdk.io/errors" + abci "github.com/cometbft/cometbft/abci/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - abci "github.com/tendermint/tendermint/abci/types" ) func NewValidatorSetChangePacketData(valUpdates []abci.ValidatorUpdate, valUpdateID uint64, slashAcks []string) ValidatorSetChangePacketData { @@ -51,7 +51,7 @@ func (mat VSCMaturedPacketData) GetBytes() []byte { return bytes } -func NewSlashPacketData(validator abci.Validator, valUpdateId uint64, infractionType stakingtypes.InfractionType) *SlashPacketData { +func NewSlashPacketData(validator abci.Validator, valUpdateId uint64, infractionType stakingtypes.Infraction) *SlashPacketData { return &SlashPacketData{ Validator: validator, ValsetUpdateId: valUpdateId, @@ -64,7 +64,7 @@ func (vdt SlashPacketData) ValidateBasic() error { return errorsmod.Wrap(ErrInvalidPacketData, "validator fields cannot be empty") } - if vdt.Infraction == stakingtypes.InfractionEmpty { + if vdt.Infraction == stakingtypes.Infraction_INFRACTION_UNSPECIFIED { return errorsmod.Wrap(ErrInvalidPacketData, "invalid infraction type") } diff --git a/x/ccv/types/ccv.pb.go b/x/ccv/types/ccv.pb.go index 510ee2022c..ea2d38dc84 100644 --- a/x/ccv/types/ccv.pb.go +++ b/x/ccv/types/ccv.pb.go @@ -5,10 +5,10 @@ package types import ( fmt "fmt" + types "github.com/cometbft/cometbft/abci/types" types1 "github.com/cosmos/cosmos-sdk/x/staking/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - types "github.com/tendermint/tendermint/abci/types" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" @@ -224,7 +224,7 @@ type SlashPacketData struct { // map to the infraction block height on the provider ValsetUpdateId uint64 `protobuf:"varint,2,opt,name=valset_update_id,json=valsetUpdateId,proto3" json:"valset_update_id,omitempty"` // tell if the slashing is for a downtime or a double-signing infraction - Infraction types1.InfractionType `protobuf:"varint,3,opt,name=infraction,proto3,enum=cosmos.staking.v1beta1.InfractionType" json:"infraction,omitempty"` + Infraction types1.Infraction `protobuf:"varint,3,opt,name=infraction,proto3,enum=cosmos.staking.v1beta1.Infraction" json:"infraction,omitempty"` } func (m *SlashPacketData) Reset() { *m = SlashPacketData{} } @@ -274,14 +274,15 @@ func (m *SlashPacketData) GetValsetUpdateId() uint64 { return 0 } -func (m *SlashPacketData) GetInfraction() types1.InfractionType { +func (m *SlashPacketData) GetInfraction() types1.Infraction { if m != nil { return m.Infraction } - return types1.InfractionEmpty + return types1.Infraction_INFRACTION_UNSPECIFIED } -// MaturedUnbondingOps defines a list of ids corresponding to ids of matured unbonding operations. +// MaturedUnbondingOps defines a list of ids corresponding to ids of matured +// unbonding operations. type MaturedUnbondingOps struct { Ids []uint64 `protobuf:"varint,1,rep,packed,name=ids,proto3" json:"ids,omitempty"` } @@ -481,51 +482,51 @@ func init() { } var fileDescriptor_68bd5f3242e6f29c = []byte{ - // 699 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x94, 0xcf, 0x6e, 0xda, 0x4a, - 0x14, 0xc6, 0xed, 0x60, 0x45, 0xca, 0x20, 0x25, 0x8e, 0x2f, 0xf7, 0x8a, 0xf8, 0xde, 0xeb, 0x58, - 0x56, 0xd4, 0xa2, 0x56, 0xb5, 0x8b, 0xd3, 0x45, 0xd5, 0x6e, 0x1a, 0x08, 0x11, 0xa8, 0xf9, 0x83, - 0xec, 0x90, 0xaa, 0xdd, 0x58, 0x83, 0x3d, 0x81, 0x11, 0x60, 0x23, 0xcf, 0x60, 0x95, 0x37, 0xa8, - 0xb2, 0xea, 0x0b, 0x64, 0x55, 0xf5, 0x41, 0xba, 0xcb, 0x32, 0xbb, 0x66, 0x15, 0x55, 0xc9, 0x1b, - 0xf4, 0x09, 0x2a, 0x0f, 0x86, 0x10, 0x70, 0x90, 0xb2, 0x62, 0x38, 0x73, 0xce, 0x07, 0xdf, 0x6f, - 0x3e, 0x1d, 0xb0, 0x85, 0x7d, 0x8a, 0x42, 0xb7, 0x0d, 0xb1, 0xef, 0x10, 0xe4, 0x0e, 0x42, 0x4c, - 0x87, 0x86, 0xeb, 0x46, 0x46, 0x54, 0x8c, 0x3f, 0xf4, 0x7e, 0x18, 0xd0, 0x40, 0x92, 0x53, 0xba, - 0xf4, 0xf8, 0x3a, 0x2a, 0xca, 0x5b, 0x6e, 0x40, 0x7a, 0x01, 0x31, 0x08, 0x85, 0x1d, 0xec, 0xb7, - 0x8c, 0xa8, 0xd8, 0x44, 0x14, 0x16, 0xc7, 0xdf, 0x47, 0x0a, 0x72, 0xae, 0x15, 0xb4, 0x02, 0x76, - 0x34, 0xe2, 0x53, 0x52, 0xfd, 0x97, 0x22, 0xdf, 0x43, 0x61, 0x0f, 0xfb, 0xd4, 0x80, 0x4d, 0x17, - 0x1b, 0x74, 0xd8, 0x47, 0x64, 0x74, 0xa9, 0x5d, 0xf1, 0xe0, 0xbf, 0x13, 0xd8, 0xc5, 0x1e, 0xa4, - 0x41, 0x68, 0x23, 0x5a, 0x6e, 0x43, 0xbf, 0x85, 0xea, 0xd0, 0xed, 0x20, 0xba, 0x0b, 0x29, 0x94, - 0x02, 0xb0, 0x1e, 0x8d, 0xef, 0x9d, 0x41, 0xdf, 0x83, 0x14, 0x91, 0x3c, 0xaf, 0x66, 0x0a, 0x59, - 0x53, 0xd5, 0xef, 0x94, 0xf5, 0x58, 0x59, 0x9f, 0x28, 0x35, 0x58, 0x63, 0x49, 0xbd, 0xb8, 0xde, - 0xe4, 0x7e, 0x5f, 0x6f, 0xe6, 0x87, 0xb0, 0xd7, 0x7d, 0xa3, 0xcd, 0x09, 0x69, 0x96, 0x18, 0xdd, - 0x1f, 0x21, 0x52, 0x01, 0xc4, 0x35, 0x82, 0x68, 0xd2, 0xe4, 0x60, 0x2f, 0xbf, 0xa4, 0xf2, 0x05, - 0xc1, 0x5a, 0x1d, 0xd5, 0x47, 0x8d, 0x35, 0x4f, 0xfa, 0x1f, 0x00, 0xd2, 0x85, 0xa4, 0xed, 0x40, - 0xb7, 0x43, 0xf2, 0x19, 0x35, 0x53, 0x58, 0xb1, 0x56, 0x58, 0x65, 0xc7, 0xed, 0x10, 0x2d, 0x00, - 0x1b, 0x0f, 0x39, 0x23, 0x92, 0x05, 0x84, 0x2e, 0x26, 0x34, 0x71, 0xf2, 0x5a, 0x7f, 0x98, 0xbd, - 0xbe, 0x08, 0x4f, 0x49, 0x88, 0x1d, 0x5a, 0x4c, 0x4b, 0x7b, 0x07, 0x72, 0x27, 0x76, 0xf9, 0x00, - 0xd2, 0x41, 0x88, 0xbc, 0x29, 0x84, 0x69, 0x8e, 0xf8, 0x34, 0x47, 0xda, 0x4f, 0x1e, 0xac, 0xd9, - 0xb1, 0x81, 0xa9, 0x69, 0x0b, 0xac, 0x4c, 0x18, 0xb1, 0xb1, 0xac, 0x29, 0x3f, 0x0c, 0xbe, 0x94, - 0x4f, 0x90, 0x8b, 0x33, 0xc8, 0x35, 0xeb, 0x4e, 0xe6, 0x11, 0x8c, 0xf7, 0x00, 0xc0, 0xfe, 0x69, - 0x08, 0x5d, 0x8a, 0x03, 0x3f, 0x9f, 0x51, 0xf9, 0xc2, 0xaa, 0xf9, 0x44, 0x1f, 0xa5, 0x51, 0x1f, - 0xa7, 0x2f, 0x49, 0xa3, 0x5e, 0x9b, 0x74, 0x1e, 0x0f, 0xfb, 0xc8, 0x9a, 0x9a, 0xd4, 0x9e, 0x82, - 0xbf, 0x12, 0x30, 0x0d, 0xbf, 0x19, 0xf8, 0x1e, 0xf6, 0x5b, 0x47, 0x7d, 0x22, 0x89, 0x20, 0x83, - 0xbd, 0x51, 0x9e, 0x04, 0x2b, 0x3e, 0x6a, 0xdf, 0x97, 0x80, 0x54, 0x0e, 0x7c, 0x32, 0xe8, 0xa1, - 0x70, 0x8a, 0xc2, 0x1e, 0x10, 0xe2, 0xd8, 0x32, 0x00, 0xab, 0xa6, 0xb9, 0xe8, 0xbd, 0xe6, 0xa7, - 0xd9, 0xbf, 0x61, 0xf3, 0xd2, 0x07, 0xb0, 0x46, 0xee, 0x03, 0x66, 0xc6, 0xb3, 0xe6, 0xf3, 0x45, - 0x92, 0x33, 0x6f, 0x52, 0xe5, 0xac, 0x59, 0x15, 0xe9, 0x14, 0xe4, 0x22, 0xe2, 0xce, 0x3d, 0x3e, - 0x43, 0x96, 0x35, 0x5f, 0x2e, 0x0c, 0x58, 0x4a, 0x68, 0xaa, 0x9c, 0x95, 0xaa, 0x57, 0x5a, 0x06, - 0x82, 0x07, 0x29, 0xd4, 0x9a, 0xe0, 0x9f, 0x79, 0xa3, 0xfb, 0x98, 0x50, 0xa9, 0x7a, 0x2f, 0xda, - 0xfa, 0xe3, 0x50, 0x4d, 0x07, 0xfa, 0xd9, 0x0f, 0x3e, 0xed, 0x47, 0x62, 0x9a, 0xd2, 0x5b, 0xa0, - 0x96, 0x8f, 0x0e, 0xed, 0xc6, 0x41, 0xc5, 0x72, 0xea, 0x3b, 0xe5, 0xf7, 0x95, 0x63, 0xe7, 0xf8, - 0x63, 0xbd, 0xe2, 0x34, 0x0e, 0xed, 0x7a, 0xa5, 0x5c, 0xdb, 0xab, 0x55, 0x76, 0x45, 0x4e, 0xfe, - 0xfb, 0xec, 0x5c, 0x5d, 0x6f, 0xf8, 0xa4, 0x8f, 0x5c, 0x7c, 0x8a, 0xc7, 0x3e, 0x24, 0x03, 0xc8, - 0xa9, 0xc3, 0xf6, 0xfe, 0x8e, 0x5d, 0x15, 0x79, 0x79, 0xed, 0xec, 0x5c, 0xcd, 0x4e, 0x31, 0x97, - 0xb6, 0xc1, 0x46, 0xea, 0x40, 0x4c, 0x4e, 0x5c, 0x92, 0x73, 0x67, 0xe7, 0xaa, 0x78, 0x32, 0x43, - 0x4b, 0x16, 0xbe, 0x7c, 0x53, 0xb8, 0xd2, 0xe1, 0xc5, 0x8d, 0xc2, 0x5f, 0xde, 0x28, 0xfc, 0xaf, - 0x1b, 0x85, 0xff, 0x7a, 0xab, 0x70, 0x97, 0xb7, 0x0a, 0x77, 0x75, 0xab, 0x70, 0x9f, 0x5e, 0xb5, - 0x30, 0x6d, 0x0f, 0x9a, 0xba, 0x1b, 0xf4, 0x8c, 0x64, 0xbd, 0xde, 0xa1, 0x7a, 0x31, 0xd9, 0xd3, - 0x91, 0x69, 0x7c, 0x66, 0xcb, 0x9a, 0xad, 0xcd, 0xe6, 0x32, 0xdb, 0x9b, 0xdb, 0x7f, 0x02, 0x00, - 0x00, 0xff, 0xff, 0xb7, 0xf6, 0x8f, 0xaa, 0xd4, 0x05, 0x00, 0x00, + // 697 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x94, 0xcf, 0x6a, 0xdb, 0x4a, + 0x14, 0xc6, 0xa5, 0x58, 0x04, 0x32, 0x86, 0x44, 0xd1, 0xf5, 0xbd, 0x38, 0xba, 0xad, 0x22, 0x44, + 0xa0, 0xa6, 0xa5, 0x52, 0xad, 0x74, 0x51, 0xda, 0x4d, 0x63, 0xc7, 0xc1, 0xa6, 0xf9, 0x63, 0xa4, + 0x38, 0xa5, 0xdd, 0x88, 0xb1, 0x34, 0xb1, 0x07, 0xdb, 0x1a, 0xa3, 0x19, 0x8b, 0xfa, 0x0d, 0x4a, + 0x56, 0x7d, 0x81, 0xac, 0x4a, 0x1f, 0xa4, 0xbb, 0x2c, 0x03, 0xdd, 0x64, 0x15, 0x4a, 0xf2, 0x06, + 0x7d, 0x82, 0x22, 0x59, 0x76, 0x1c, 0x5b, 0x31, 0x64, 0xe5, 0xf1, 0x99, 0x73, 0x3e, 0xf1, 0xfd, + 0xe6, 0xe3, 0x80, 0x2d, 0xec, 0x33, 0x14, 0xb8, 0x6d, 0x88, 0x7d, 0x87, 0x22, 0x77, 0x10, 0x60, + 0x36, 0x34, 0x5c, 0x37, 0x34, 0xc2, 0x62, 0xf4, 0xa3, 0xf7, 0x03, 0xc2, 0x88, 0x24, 0xa7, 0x74, + 0xe9, 0xd1, 0x75, 0x58, 0x94, 0xb7, 0x5c, 0x42, 0x7b, 0x84, 0x1a, 0x94, 0xc1, 0x0e, 0xf6, 0x5b, + 0x46, 0x58, 0x6c, 0x22, 0x06, 0x8b, 0xe3, 0xff, 0x23, 0x05, 0x39, 0xd7, 0x22, 0x2d, 0x12, 0x1f, + 0x8d, 0xe8, 0x94, 0x54, 0xff, 0x67, 0xc8, 0xf7, 0x50, 0xd0, 0xc3, 0x3e, 0x33, 0x60, 0xd3, 0xc5, + 0x06, 0x1b, 0xf6, 0x11, 0x1d, 0x5d, 0x6a, 0x57, 0x3c, 0x78, 0x72, 0x02, 0xbb, 0xd8, 0x83, 0x8c, + 0x04, 0x36, 0x62, 0xe5, 0x36, 0xf4, 0x5b, 0xa8, 0x0e, 0xdd, 0x0e, 0x62, 0xbb, 0x90, 0x41, 0x89, + 0x80, 0xf5, 0x70, 0x7c, 0xef, 0x0c, 0xfa, 0x1e, 0x64, 0x88, 0xe6, 0x79, 0x35, 0x53, 0xc8, 0x9a, + 0xaa, 0x7e, 0xa7, 0xac, 0x47, 0xca, 0xfa, 0x44, 0xa9, 0x11, 0x37, 0x96, 0xd4, 0x8b, 0xeb, 0x4d, + 0xee, 0xcf, 0xf5, 0x66, 0x7e, 0x08, 0x7b, 0xdd, 0xb7, 0xda, 0x9c, 0x90, 0x66, 0x89, 0xe1, 0xfd, + 0x11, 0x2a, 0x15, 0x40, 0x54, 0xa3, 0x88, 0x25, 0x4d, 0x0e, 0xf6, 0xf2, 0x4b, 0x2a, 0x5f, 0x10, + 0xac, 0xd5, 0x51, 0x7d, 0xd4, 0x58, 0xf3, 0xa4, 0xa7, 0x00, 0xd0, 0x2e, 0xa4, 0x6d, 0x07, 0xba, + 0x1d, 0x9a, 0xcf, 0xa8, 0x99, 0xc2, 0x8a, 0xb5, 0x12, 0x57, 0x76, 0xdc, 0x0e, 0xd5, 0x08, 0xd8, + 0x78, 0xc8, 0x19, 0x95, 0x2c, 0x20, 0x74, 0x31, 0x65, 0x89, 0x93, 0x37, 0xfa, 0xc3, 0xec, 0xf5, + 0x45, 0x78, 0x4a, 0x42, 0xe4, 0xd0, 0x8a, 0xb5, 0xb4, 0xf7, 0x20, 0x77, 0x62, 0x97, 0x0f, 0x20, + 0x1b, 0x04, 0xc8, 0x9b, 0x42, 0x98, 0xe6, 0x88, 0x4f, 0x73, 0xa4, 0xfd, 0xe2, 0xc1, 0x9a, 0x1d, + 0x19, 0x98, 0x9a, 0xb6, 0xc0, 0xca, 0x84, 0x51, 0x3c, 0x96, 0x35, 0xe5, 0x87, 0xc1, 0x97, 0xf2, + 0x09, 0x72, 0x71, 0x06, 0xb9, 0x66, 0xdd, 0xc9, 0x3c, 0x82, 0x71, 0x09, 0x00, 0xec, 0x9f, 0x06, + 0xd0, 0x65, 0x98, 0xf8, 0xf9, 0x8c, 0xca, 0x17, 0x56, 0x4d, 0x4d, 0x1f, 0xa5, 0x51, 0x1f, 0xa7, + 0x2f, 0x49, 0xa3, 0x5e, 0x9b, 0x74, 0x5a, 0x53, 0x53, 0xda, 0x33, 0xf0, 0x4f, 0x02, 0xa5, 0xe1, + 0x37, 0x89, 0xef, 0x61, 0xbf, 0x75, 0xd4, 0xa7, 0x92, 0x08, 0x32, 0xd8, 0x1b, 0x65, 0x49, 0xb0, + 0xa2, 0xa3, 0xf6, 0x63, 0x09, 0x48, 0x65, 0xe2, 0xd3, 0x41, 0x0f, 0x05, 0x53, 0x04, 0xf6, 0x80, + 0x10, 0x45, 0x36, 0x36, 0xbf, 0x6a, 0x9a, 0x8b, 0xde, 0x6a, 0x7e, 0xfa, 0x78, 0xd8, 0x47, 0x56, + 0x3c, 0x2f, 0x7d, 0x04, 0x6b, 0xf4, 0x3e, 0xdc, 0xd8, 0x74, 0xd6, 0x7c, 0xb1, 0x48, 0x72, 0xe6, + 0x3d, 0xaa, 0x9c, 0x35, 0xab, 0x22, 0x9d, 0x82, 0x5c, 0x48, 0xdd, 0xb9, 0x87, 0x8f, 0x71, 0x65, + 0xcd, 0x57, 0x0b, 0xc3, 0x95, 0x12, 0x98, 0x2a, 0x67, 0xa5, 0xea, 0x95, 0x96, 0x81, 0xe0, 0x41, + 0x06, 0xb5, 0x26, 0xf8, 0x6f, 0xde, 0xe8, 0x3e, 0xa6, 0x4c, 0xaa, 0xde, 0x8b, 0xb5, 0xfe, 0x38, + 0x54, 0xd3, 0x61, 0x7e, 0xfe, 0x93, 0x4f, 0xfb, 0x48, 0x44, 0x53, 0x7a, 0x07, 0xd4, 0xf2, 0xd1, + 0xa1, 0xdd, 0x38, 0xa8, 0x58, 0x4e, 0x7d, 0xa7, 0xfc, 0xa1, 0x72, 0xec, 0x1c, 0x7f, 0xaa, 0x57, + 0x9c, 0xc6, 0xa1, 0x5d, 0xaf, 0x94, 0x6b, 0x7b, 0xb5, 0xca, 0xae, 0xc8, 0xc9, 0xff, 0x9e, 0x9d, + 0xab, 0xeb, 0x0d, 0x9f, 0xf6, 0x91, 0x8b, 0x4f, 0xf1, 0xd8, 0x87, 0x64, 0x00, 0x39, 0x75, 0xd8, + 0xde, 0xdf, 0xb1, 0xab, 0x22, 0x2f, 0xaf, 0x9d, 0x9d, 0xab, 0xd9, 0x29, 0xe6, 0xd2, 0x36, 0xd8, + 0x48, 0x1d, 0x88, 0xc8, 0x89, 0x4b, 0x72, 0xee, 0xec, 0x5c, 0x15, 0x4f, 0x66, 0x68, 0xc9, 0xc2, + 0xd7, 0xef, 0x0a, 0x57, 0x3a, 0xbc, 0xb8, 0x51, 0xf8, 0xcb, 0x1b, 0x85, 0xff, 0x7d, 0xa3, 0xf0, + 0xdf, 0x6e, 0x15, 0xee, 0xf2, 0x56, 0xe1, 0xae, 0x6e, 0x15, 0xee, 0xf3, 0xeb, 0x16, 0x66, 0xed, + 0x41, 0x53, 0x77, 0x49, 0xcf, 0x48, 0x56, 0xeb, 0x1d, 0xaa, 0x97, 0x93, 0x1d, 0x1d, 0x9a, 0xc6, + 0x97, 0x78, 0x51, 0xc7, 0x2b, 0xb3, 0xb9, 0x1c, 0xef, 0xcc, 0xed, 0xbf, 0x01, 0x00, 0x00, 0xff, + 0xff, 0x5e, 0x61, 0xe5, 0xc6, 0xd0, 0x05, 0x00, 0x00, } func (m *ValidatorSetChangePacketData) Marshal() (dAtA []byte, err error) { @@ -1382,7 +1383,7 @@ func (m *SlashPacketData) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Infraction |= types1.InfractionType(b&0x7F) << shift + m.Infraction |= types1.Infraction(b&0x7F) << shift if b < 0x80 { break } diff --git a/x/ccv/types/ccv_test.go b/x/ccv/types/ccv_test.go index 5f8b6add34..51979fb4da 100644 --- a/x/ccv/types/ccv_test.go +++ b/x/ccv/types/ccv_test.go @@ -3,11 +3,11 @@ package types_test import ( "testing" + abci "github.com/cometbft/cometbft/abci/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/interchain-security/v2/x/ccv/types" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" ) func TestPacketDataValidateBasic(t *testing.T) { diff --git a/x/ccv/types/expected_keepers.go b/x/ccv/types/expected_keepers.go index 7f18324c8d..8176d193b2 100644 --- a/x/ccv/types/expected_keepers.go +++ b/x/ccv/types/expected_keepers.go @@ -4,18 +4,20 @@ import ( context "context" "time" + "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" auth "github.com/cosmos/cosmos-sdk/x/auth/types" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - conntypes "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - ibcexported "github.com/cosmos/ibc-go/v4/modules/core/exported" + transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + conntypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" - abci "github.com/tendermint/tendermint/abci/types" + abci "github.com/cometbft/cometbft/abci/types" ) // StakingKeeper defines the contract expected by provider-chain ccv module from a Staking Module that will keep track @@ -29,11 +31,12 @@ type StakingKeeper interface { GetLastValidatorPower(ctx sdk.Context, operator sdk.ValAddress) (power int64) // slash the validator and delegators of the validator, specifying offence height, offence power, and slash fraction Jail(sdk.Context, sdk.ConsAddress) // jail a validator - Slash(sdk.Context, sdk.ConsAddress, int64, int64, sdk.Dec, stakingtypes.InfractionType) + Slash(sdk.Context, sdk.ConsAddress, int64, int64, sdk.Dec) math.Int + SlashWithInfractionReason(sdk.Context, sdk.ConsAddress, int64, int64, sdk.Dec, stakingtypes.Infraction) math.Int Unjail(ctx sdk.Context, addr sdk.ConsAddress) GetValidator(ctx sdk.Context, addr sdk.ValAddress) (validator stakingtypes.Validator, found bool) IterateLastValidatorPowers(ctx sdk.Context, cb func(addr sdk.ValAddress, power int64) (stop bool)) - PowerReduction(ctx sdk.Context) sdk.Int + PowerReduction(ctx sdk.Context) math.Int PutUnbondingOnHold(ctx sdk.Context, id uint64) error IterateValidators(ctx sdk.Context, f func(index int64, validator stakingtypes.ValidatorI) (stop bool)) Validator(ctx sdk.Context, addr sdk.ValAddress) stakingtypes.ValidatorI @@ -41,8 +44,9 @@ type StakingKeeper interface { ValidatorByConsAddr(ctx sdk.Context, consAddr sdk.ConsAddress) stakingtypes.ValidatorI Delegation(ctx sdk.Context, addr sdk.AccAddress, valAddr sdk.ValAddress) stakingtypes.DelegationI MaxValidators(ctx sdk.Context) uint32 - GetLastTotalPower(ctx sdk.Context) sdk.Int + GetLastTotalPower(ctx sdk.Context) math.Int GetLastValidators(ctx sdk.Context) (validators []stakingtypes.Validator) + GetUnbondingType(ctx sdk.Context, id uint64) (unbondingType stakingtypes.UnbondingType, found bool) BondDenom(ctx sdk.Context) (res string) } @@ -65,7 +69,15 @@ type SlashingKeeper interface { type ChannelKeeper interface { GetChannel(ctx sdk.Context, srcPort, srcChan string) (channel channeltypes.Channel, found bool) GetNextSequenceSend(ctx sdk.Context, portID, channelID string) (uint64, bool) - SendPacket(ctx sdk.Context, channelCap *capabilitytypes.Capability, packet ibcexported.PacketI) error + SendPacket( + ctx sdk.Context, + chanCap *capabilitytypes.Capability, + sourcePort string, + sourceChannel string, + timeoutHeight clienttypes.Height, + timeoutTimestamp uint64, + data []byte, + ) (sequence uint64, err error) WriteAcknowledgement(ctx sdk.Context, chanCap *capabilitytypes.Capability, packet ibcexported.PacketI, acknowledgement ibcexported.Acknowledgement) error ChanCloseInit(ctx sdk.Context, portID, channelID string, chanCap *capabilitytypes.Capability) error } @@ -95,7 +107,7 @@ type DistributionKeeper interface { // ConsumerHooks event hooks for newly bonded cross-chain validators type ConsumerHooks interface { - AfterValidatorBonded(ctx sdk.Context, consAddr sdk.ConsAddress, _ sdk.ValAddress) + AfterValidatorBonded(ctx sdk.Context, consAddr sdk.ConsAddress, valAddresses sdk.ValAddress) error } // BankKeeper defines the expected interface needed to retrieve account balances. @@ -113,16 +125,7 @@ type AccountKeeper interface { // IBCTransferKeeper defines the expected interface needed for distribution transfer // of tokens from the consumer to the provider chain type IBCTransferKeeper interface { - SendTransfer( - ctx sdk.Context, - sourcePort, - sourceChannel string, - token sdk.Coin, - sender sdk.AccAddress, - receiver string, - timeoutHeight clienttypes.Height, - timeoutTimestamp uint64, - ) error + Transfer(context.Context, *transfertypes.MsgTransfer) (*transfertypes.MsgTransferResponse, error) } // IBCKeeper defines the expected interface needed for openning a diff --git a/x/ccv/types/shared_params.go b/x/ccv/types/shared_params.go index 04f1cf54e1..8ff676bded 100644 --- a/x/ccv/types/shared_params.go +++ b/x/ccv/types/shared_params.go @@ -5,7 +5,7 @@ import ( "time" sdktypes "github.com/cosmos/cosmos-sdk/types" - ibchost "github.com/cosmos/ibc-go/v4/modules/core/24-host" + ibchost "github.com/cosmos/ibc-go/v7/modules/core/24-host" ) const ( diff --git a/x/ccv/types/utils.go b/x/ccv/types/utils.go index 1d75152186..f27dab2b04 100644 --- a/x/ccv/types/utils.go +++ b/x/ccv/types/utils.go @@ -6,13 +6,13 @@ import ( "time" errorsmod "cosmossdk.io/errors" + abci "github.com/cometbft/cometbft/abci/types" + tmprotocrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" sdk "github.com/cosmos/cosmos-sdk/types" - clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - host "github.com/cosmos/ibc-go/v4/modules/core/24-host" - abci "github.com/tendermint/tendermint/abci/types" - tmprotocrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + host "github.com/cosmos/ibc-go/v7/modules/core/24-host" ) func AccumulateChanges(currentChanges, newChanges []abci.ValidatorUpdate) []abci.ValidatorUpdate { @@ -60,36 +60,29 @@ func SendIBCPacket( ctx sdk.Context, scopedKeeper ScopedKeeper, channelKeeper ChannelKeeper, - channelID string, - portID string, + sourceChannelID string, + sourcePortID string, packetData []byte, timeoutPeriod time.Duration, ) error { - channel, ok := channelKeeper.GetChannel(ctx, portID, channelID) + _, ok := channelKeeper.GetChannel(ctx, sourcePortID, sourceChannelID) if !ok { - return errorsmod.Wrapf(channeltypes.ErrChannelNotFound, "channel not found for channel ID: %s", channelID) + return errorsmod.Wrapf(channeltypes.ErrChannelNotFound, "channel not found for channel ID: %s", sourceChannelID) } - channelCap, ok := scopedKeeper.GetCapability(ctx, host.ChannelCapabilityPath(portID, channelID)) + channelCap, ok := scopedKeeper.GetCapability(ctx, host.ChannelCapabilityPath(sourcePortID, sourceChannelID)) if !ok { return errorsmod.Wrap(channeltypes.ErrChannelCapabilityNotFound, "module does not own channel capability") } - // get the next sequence - sequence, found := channelKeeper.GetNextSequenceSend(ctx, portID, channelID) - if !found { - return errorsmod.Wrapf( - channeltypes.ErrSequenceSendNotFound, - "source port: %s, source channel: %s", portID, channelID, - ) - } - packet := channeltypes.NewPacket( - packetData, sequence, - portID, channelID, - channel.Counterparty.PortId, channel.Counterparty.ChannelId, - clienttypes.Height{}, uint64(ctx.BlockTime().Add(timeoutPeriod).UnixNano()), + _, err := channelKeeper.SendPacket(ctx, + channelCap, + sourcePortID, + sourceChannelID, + clienttypes.Height{}, // timeout height disabled + uint64(ctx.BlockTime().Add(timeoutPeriod).UnixNano()), // timeout timestamp + packetData, ) - - return channelKeeper.SendPacket(ctx, channelCap, packet) + return err } // AppendMany appends a variable number of byte slices together diff --git a/x/ccv/types/utils_test.go b/x/ccv/types/utils_test.go index 7faad14757..1267daf119 100644 --- a/x/ccv/types/utils_test.go +++ b/x/ccv/types/utils_test.go @@ -3,11 +3,11 @@ package types_test import ( "testing" + abci "github.com/cometbft/cometbft/abci/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" ibcsimapp "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/simapp" "github.com/cosmos/interchain-security/v2/x/ccv/types" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" ) func TestAccumulateChanges(t *testing.T) { From df67cc2a2326c35b3b6fa32a08d4494763646eac Mon Sep 17 00:00:00 2001 From: MSalopek Date: Wed, 21 Jun 2023 11:32:35 +0200 Subject: [PATCH 052/108] chore: bump v2 to v3 (#1043) --- .../ante/forbidden_proposals_ante_test.go | 4 ++-- app/consumer-democracy/ante_handler.go | 6 +++--- app/consumer-democracy/app.go | 20 +++++++++---------- .../proposals_whitelisting_test.go | 6 +++--- .../ante/disabled_modules_ante_test.go | 4 ++-- app/consumer/ante/msg_filter_ante_test.go | 4 ++-- app/consumer/ante_handler.go | 4 ++-- app/consumer/app.go | 14 ++++++------- app/provider/app.go | 16 +++++++-------- app/sovereign/app.go | 8 ++++---- cmd/interchain-security-cd/cmd/root.go | 4 ++-- cmd/interchain-security-cd/main.go | 4 ++-- cmd/interchain-security-cdd/cmd/root.go | 4 ++-- cmd/interchain-security-cdd/main.go | 4 ++-- cmd/interchain-security-pd/cmd/root.go | 4 ++-- cmd/interchain-security-pd/main.go | 4 ++-- cmd/interchain-security-sd/cmd/root.go | 4 ++-- cmd/interchain-security-sd/main.go | 4 ++-- go.mod | 4 ++-- legacy_ibc_testing/simapp/test_helpers.go | 2 +- legacy_ibc_testing/testing/app.go | 6 +++--- legacy_ibc_testing/testing/chain.go | 4 ++-- tests/difference/core/driver/core_test.go | 12 +++++------ tests/difference/core/driver/setup.go | 20 +++++++++---------- tests/e2e/actions.go | 6 +++--- tests/integration/common.go | 10 +++++----- tests/integration/democracy.go | 8 ++++---- tests/integration/distribution.go | 6 +++--- tests/integration/expired_client.go | 4 ++-- tests/integration/instance_test.go | 10 +++++----- tests/integration/key_assignment.go | 4 ++-- tests/integration/normal_operations.go | 2 +- tests/integration/setup.go | 10 +++++----- tests/integration/slashing.go | 6 +++--- tests/integration/stop_consumer.go | 4 ++-- tests/integration/throttle.go | 6 +++--- tests/integration/unbonding.go | 4 ++-- tests/integration/valset_update.go | 2 +- testutil/crypto/crypto.go | 2 +- testutil/ibc_testing/generic_setup.go | 8 ++++---- testutil/ibc_testing/specific_setup.go | 8 ++++---- testutil/integration/debug_test.go | 10 +++++----- testutil/integration/interfaces.go | 8 ++++---- testutil/keeper/expectations.go | 4 ++-- testutil/keeper/unit_test_helpers.go | 10 +++++----- testutil/simibc/chain_util.go | 4 ++-- testutil/simibc/relay_util.go | 4 ++-- testutil/simibc/relayed_path.go | 2 +- x/ccv/consumer/client/cli/query.go | 2 +- x/ccv/consumer/ibc_module.go | 8 ++++---- x/ccv/consumer/ibc_module_test.go | 10 +++++----- x/ccv/consumer/keeper/changeover_test.go | 4 ++-- x/ccv/consumer/keeper/distribution.go | 4 ++-- x/ccv/consumer/keeper/distribution_test.go | 4 ++-- x/ccv/consumer/keeper/genesis.go | 4 ++-- x/ccv/consumer/keeper/genesis_test.go | 10 +++++----- x/ccv/consumer/keeper/grpc_query.go | 2 +- x/ccv/consumer/keeper/hooks.go | 2 +- x/ccv/consumer/keeper/keeper.go | 4 ++-- x/ccv/consumer/keeper/keeper_test.go | 8 ++++---- x/ccv/consumer/keeper/params.go | 4 ++-- x/ccv/consumer/keeper/params_test.go | 6 +++--- x/ccv/consumer/keeper/relay.go | 4 ++-- x/ccv/consumer/keeper/relay_test.go | 8 ++++---- x/ccv/consumer/keeper/soft_opt_out.go | 2 +- x/ccv/consumer/keeper/soft_opt_out_test.go | 6 +++--- x/ccv/consumer/keeper/validators.go | 2 +- x/ccv/consumer/keeper/validators_test.go | 8 ++++---- x/ccv/consumer/module.go | 6 +++--- x/ccv/consumer/types/consumer.pb.go | 2 +- x/ccv/consumer/types/genesis.go | 2 +- x/ccv/consumer/types/genesis.pb.go | 2 +- x/ccv/consumer/types/genesis_test.go | 6 +++--- x/ccv/consumer/types/keys.go | 2 +- x/ccv/consumer/types/params.go | 2 +- x/ccv/consumer/types/params_test.go | 2 +- x/ccv/democracy/distribution/module.go | 2 +- x/ccv/provider/client/cli/query.go | 2 +- x/ccv/provider/client/cli/tx.go | 2 +- x/ccv/provider/client/proposal_handler.go | 2 +- x/ccv/provider/handler.go | 4 ++-- x/ccv/provider/handler_test.go | 10 +++++----- x/ccv/provider/ibc_module.go | 6 +++--- x/ccv/provider/ibc_module_test.go | 10 +++++----- x/ccv/provider/keeper/distribution.go | 4 ++-- x/ccv/provider/keeper/distribution_test.go | 6 +++--- x/ccv/provider/keeper/genesis.go | 4 ++-- x/ccv/provider/keeper/genesis_test.go | 12 +++++------ x/ccv/provider/keeper/grpc_query.go | 4 ++-- x/ccv/provider/keeper/hooks.go | 4 ++-- x/ccv/provider/keeper/hooks_test.go | 6 +++--- x/ccv/provider/keeper/keeper.go | 6 +++--- x/ccv/provider/keeper/keeper_test.go | 10 +++++----- x/ccv/provider/keeper/key_assignment.go | 4 ++-- x/ccv/provider/keeper/key_assignment_test.go | 10 +++++----- x/ccv/provider/keeper/msg_server.go | 4 ++-- x/ccv/provider/keeper/params.go | 4 ++-- x/ccv/provider/keeper/params_test.go | 4 ++-- x/ccv/provider/keeper/proposal.go | 6 +++--- x/ccv/provider/keeper/proposal_test.go | 12 +++++------ x/ccv/provider/keeper/relay.go | 4 ++-- x/ccv/provider/keeper/relay_test.go | 12 +++++------ x/ccv/provider/keeper/throttle.go | 4 ++-- x/ccv/provider/keeper/throttle_test.go | 10 +++++----- x/ccv/provider/module.go | 6 +++--- x/ccv/provider/module_test.go | 8 ++++---- x/ccv/provider/proposal_handler.go | 4 ++-- x/ccv/provider/proposal_handler_test.go | 6 +++--- x/ccv/provider/types/consumer.go | 4 ++-- x/ccv/provider/types/genesis.go | 2 +- x/ccv/provider/types/genesis.pb.go | 4 ++-- x/ccv/provider/types/genesis_test.go | 8 ++++---- x/ccv/provider/types/key_assignment.go | 2 +- x/ccv/provider/types/keys.go | 2 +- x/ccv/provider/types/keys_test.go | 4 ++-- x/ccv/provider/types/params.go | 4 ++-- x/ccv/provider/types/params_test.go | 2 +- x/ccv/provider/types/proposal.go | 2 +- x/ccv/provider/types/proposal_test.go | 2 +- x/ccv/provider/types/query.pb.go | 4 ++-- x/ccv/types/ccv_test.go | 2 +- x/ccv/types/utils_test.go | 4 ++-- 122 files changed, 336 insertions(+), 336 deletions(-) diff --git a/app/consumer-democracy/ante/forbidden_proposals_ante_test.go b/app/consumer-democracy/ante/forbidden_proposals_ante_test.go index 5c67506e7c..bbe9f6a5dd 100644 --- a/app/consumer-democracy/ante/forbidden_proposals_ante_test.go +++ b/app/consumer-democracy/ante/forbidden_proposals_ante_test.go @@ -10,8 +10,8 @@ import ( govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" "github.com/cosmos/cosmos-sdk/x/params/types/proposal" - app "github.com/cosmos/interchain-security/v2/app/consumer-democracy" - "github.com/cosmos/interchain-security/v2/app/consumer-democracy/ante" + app "github.com/cosmos/interchain-security/v3/app/consumer-democracy" + "github.com/cosmos/interchain-security/v3/app/consumer-democracy/ante" "github.com/stretchr/testify/require" ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" diff --git a/app/consumer-democracy/ante_handler.go b/app/consumer-democracy/ante_handler.go index b031c9fadc..e27986a482 100644 --- a/app/consumer-democracy/ante_handler.go +++ b/app/consumer-democracy/ante_handler.go @@ -7,9 +7,9 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/ante" ibcante "github.com/cosmos/ibc-go/v7/modules/core/ante" ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" - democracyante "github.com/cosmos/interchain-security/v2/app/consumer-democracy/ante" - consumerante "github.com/cosmos/interchain-security/v2/app/consumer/ante" - ibcconsumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" + democracyante "github.com/cosmos/interchain-security/v3/app/consumer-democracy/ante" + consumerante "github.com/cosmos/interchain-security/v3/app/consumer/ante" + ibcconsumerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" ) // HandlerOptions extend the SDK's AnteHandler options by requiring the IBC diff --git a/app/consumer-democracy/app.go b/app/consumer-democracy/app.go index e72b62c9e5..298087262d 100644 --- a/app/consumer-democracy/app.go +++ b/app/consumer-democracy/app.go @@ -15,7 +15,7 @@ import ( consensusparamtypes "github.com/cosmos/cosmos-sdk/x/consensus/types" "github.com/cosmos/cosmos-sdk/x/genutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - appparams "github.com/cosmos/interchain-security/v2/app/params" + appparams "github.com/cosmos/interchain-security/v3/app/params" autocliv1 "cosmossdk.io/api/cosmos/autocli/v1" reflectionv1 "cosmossdk.io/api/cosmos/reflection/v1" @@ -86,25 +86,25 @@ import ( porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" ibchost "github.com/cosmos/ibc-go/v7/modules/core/exported" ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" - ibctestingcore "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/core" - ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" + ibctestingcore "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/core" + ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" "github.com/spf13/cast" distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - testutil "github.com/cosmos/interchain-security/v2/testutil/integration" - ccvdistr "github.com/cosmos/interchain-security/v2/x/ccv/democracy/distribution" + testutil "github.com/cosmos/interchain-security/v3/testutil/integration" + ccvdistr "github.com/cosmos/interchain-security/v3/x/ccv/democracy/distribution" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - ccvstaking "github.com/cosmos/interchain-security/v2/x/ccv/democracy/staking" + ccvstaking "github.com/cosmos/interchain-security/v3/x/ccv/democracy/staking" gov "github.com/cosmos/cosmos-sdk/x/gov" govclient "github.com/cosmos/cosmos-sdk/x/gov/client" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - ccvgov "github.com/cosmos/interchain-security/v2/x/ccv/democracy/governance" + ccvgov "github.com/cosmos/interchain-security/v3/x/ccv/democracy/governance" // add mint mint "github.com/cosmos/cosmos-sdk/x/mint" @@ -113,9 +113,9 @@ import ( paramproposal "github.com/cosmos/cosmos-sdk/x/params/types/proposal" tendermint "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - consumer "github.com/cosmos/interchain-security/v2/x/ccv/consumer" - consumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + consumer "github.com/cosmos/interchain-security/v3/x/ccv/consumer" + consumerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" // unnamed import of statik for swagger UI support _ "github.com/cosmos/cosmos-sdk/client/docs/statik" diff --git a/app/consumer-democracy/proposals_whitelisting_test.go b/app/consumer-democracy/proposals_whitelisting_test.go index 3b8bbdb855..a51709ae4a 100644 --- a/app/consumer-democracy/proposals_whitelisting_test.go +++ b/app/consumer-democracy/proposals_whitelisting_test.go @@ -3,9 +3,9 @@ package app_test import ( "testing" - appConsumer "github.com/cosmos/interchain-security/v2/app/consumer-democracy" - ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" - icstestingutils "github.com/cosmos/interchain-security/v2/testutil/ibc_testing" + appConsumer "github.com/cosmos/interchain-security/v3/app/consumer-democracy" + ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" + icstestingutils "github.com/cosmos/interchain-security/v3/testutil/ibc_testing" "github.com/stretchr/testify/require" ) diff --git a/app/consumer/ante/disabled_modules_ante_test.go b/app/consumer/ante/disabled_modules_ante_test.go index 2eb95e1ddb..dd58e8b79e 100644 --- a/app/consumer/ante/disabled_modules_ante_test.go +++ b/app/consumer/ante/disabled_modules_ante_test.go @@ -8,8 +8,8 @@ import ( evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" ibcclienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" - "github.com/cosmos/interchain-security/v2/app/consumer/ante" - "github.com/cosmos/interchain-security/v2/app/params" + "github.com/cosmos/interchain-security/v3/app/consumer/ante" + "github.com/cosmos/interchain-security/v3/app/params" "github.com/stretchr/testify/require" ) diff --git a/app/consumer/ante/msg_filter_ante_test.go b/app/consumer/ante/msg_filter_ante_test.go index 7ff11dc10f..76b3dec604 100644 --- a/app/consumer/ante/msg_filter_ante_test.go +++ b/app/consumer/ante/msg_filter_ante_test.go @@ -6,8 +6,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" ibcclienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" - "github.com/cosmos/interchain-security/v2/app/consumer/ante" - "github.com/cosmos/interchain-security/v2/app/params" + "github.com/cosmos/interchain-security/v3/app/consumer/ante" + "github.com/cosmos/interchain-security/v3/app/params" "github.com/stretchr/testify/require" ) diff --git a/app/consumer/ante_handler.go b/app/consumer/ante_handler.go index be33266f8d..f963150626 100644 --- a/app/consumer/ante_handler.go +++ b/app/consumer/ante_handler.go @@ -8,8 +8,8 @@ import ( ibcante "github.com/cosmos/ibc-go/v7/modules/core/ante" ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" - consumerante "github.com/cosmos/interchain-security/v2/app/consumer/ante" - ibcconsumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" + consumerante "github.com/cosmos/interchain-security/v3/app/consumer/ante" + ibcconsumerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" ) // HandlerOptions extend the SDK's AnteHandler options by requiring the IBC diff --git a/app/consumer/app.go b/app/consumer/app.go index 34c18bb249..20b6695dfa 100644 --- a/app/consumer/app.go +++ b/app/consumer/app.go @@ -81,19 +81,19 @@ import ( porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" ibchost "github.com/cosmos/ibc-go/v7/modules/core/exported" ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" - appparams "github.com/cosmos/interchain-security/v2/app/params" - ibctestingcore "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/core" - ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" + appparams "github.com/cosmos/interchain-security/v3/app/params" + ibctestingcore "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/core" + ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" "github.com/spf13/cast" tendermint "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - ibcconsumer "github.com/cosmos/interchain-security/v2/x/ccv/consumer" - ibcconsumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" - ibcconsumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + ibcconsumer "github.com/cosmos/interchain-security/v3/x/ccv/consumer" + ibcconsumerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" + ibcconsumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" // unnamed import of statik for swagger UI support _ "github.com/cosmos/cosmos-sdk/client/docs/statik" - testutil "github.com/cosmos/interchain-security/v2/testutil/integration" + testutil "github.com/cosmos/interchain-security/v3/testutil/integration" ) const ( diff --git a/app/provider/app.go b/app/provider/app.go index 1c73131b63..3fefd34daa 100644 --- a/app/provider/app.go +++ b/app/provider/app.go @@ -14,7 +14,7 @@ import ( autocliv1 "cosmossdk.io/api/cosmos/autocli/v1" reflectionv1 "cosmossdk.io/api/cosmos/reflection/v1" - appparams "github.com/cosmos/interchain-security/v2/app/params" + appparams "github.com/cosmos/interchain-security/v3/app/params" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" @@ -93,8 +93,8 @@ import ( ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" tendermint "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - ibctestingcore "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/core" - ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" + ibctestingcore "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/core" + ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" dbm "github.com/cometbft/cometbft-db" abci "github.com/cometbft/cometbft/abci/types" @@ -103,12 +103,12 @@ import ( tmos "github.com/cometbft/cometbft/libs/os" "github.com/spf13/cast" - ibcprovider "github.com/cosmos/interchain-security/v2/x/ccv/provider" - ibcproviderclient "github.com/cosmos/interchain-security/v2/x/ccv/provider/client" - ibcproviderkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + ibcprovider "github.com/cosmos/interchain-security/v3/x/ccv/provider" + ibcproviderclient "github.com/cosmos/interchain-security/v3/x/ccv/provider/client" + ibcproviderkeeper "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" + providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" - testutil "github.com/cosmos/interchain-security/v2/testutil/integration" + testutil "github.com/cosmos/interchain-security/v3/testutil/integration" // unnamed import of statik for swagger UI support _ "github.com/cosmos/cosmos-sdk/client/docs/statik" diff --git a/app/sovereign/app.go b/app/sovereign/app.go index 9c729885f4..e616b92514 100644 --- a/app/sovereign/app.go +++ b/app/sovereign/app.go @@ -7,7 +7,7 @@ import ( "os" "path/filepath" - appparams "github.com/cosmos/interchain-security/v2/app/params" + appparams "github.com/cosmos/interchain-security/v3/app/params" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" @@ -82,14 +82,14 @@ import ( porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" ibchost "github.com/cosmos/ibc-go/v7/modules/core/exported" ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" - ibctestingcore "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/core" - ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" + ibctestingcore "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/core" + ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" "github.com/spf13/cast" sdkdistr "github.com/cosmos/cosmos-sdk/x/distribution" distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - testutil "github.com/cosmos/interchain-security/v2/testutil/integration" + testutil "github.com/cosmos/interchain-security/v3/testutil/integration" sdkstaking "github.com/cosmos/cosmos-sdk/x/staking" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" diff --git a/cmd/interchain-security-cd/cmd/root.go b/cmd/interchain-security-cd/cmd/root.go index 10af60f25f..5fac172a96 100644 --- a/cmd/interchain-security-cd/cmd/root.go +++ b/cmd/interchain-security-cd/cmd/root.go @@ -28,8 +28,8 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/cosmos/cosmos-sdk/x/crisis" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" - consumer "github.com/cosmos/interchain-security/v2/app/consumer" - "github.com/cosmos/interchain-security/v2/app/params" + consumer "github.com/cosmos/interchain-security/v3/app/consumer" + "github.com/cosmos/interchain-security/v3/app/params" ) // NewRootCmd creates a new root command for simd. It is called once in the diff --git a/cmd/interchain-security-cd/main.go b/cmd/interchain-security-cd/main.go index 589869cd43..012e5c6d44 100644 --- a/cmd/interchain-security-cd/main.go +++ b/cmd/interchain-security-cd/main.go @@ -5,8 +5,8 @@ import ( "github.com/cosmos/cosmos-sdk/server" svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" - app "github.com/cosmos/interchain-security/v2/app/consumer" - "github.com/cosmos/interchain-security/v2/cmd/interchain-security-cd/cmd" + app "github.com/cosmos/interchain-security/v3/app/consumer" + "github.com/cosmos/interchain-security/v3/cmd/interchain-security-cd/cmd" ) func main() { diff --git a/cmd/interchain-security-cdd/cmd/root.go b/cmd/interchain-security-cdd/cmd/root.go index 615bdf499c..1e3f038717 100644 --- a/cmd/interchain-security-cdd/cmd/root.go +++ b/cmd/interchain-security-cdd/cmd/root.go @@ -29,8 +29,8 @@ import ( "github.com/cosmos/cosmos-sdk/x/crisis" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" - cdd "github.com/cosmos/interchain-security/v2/app/consumer-democracy" - "github.com/cosmos/interchain-security/v2/app/params" + cdd "github.com/cosmos/interchain-security/v3/app/consumer-democracy" + "github.com/cosmos/interchain-security/v3/app/params" ) // NewRootCmd creates a new root command for simd. It is called once in the diff --git a/cmd/interchain-security-cdd/main.go b/cmd/interchain-security-cdd/main.go index f209f0046a..5d04ea379b 100644 --- a/cmd/interchain-security-cdd/main.go +++ b/cmd/interchain-security-cdd/main.go @@ -5,8 +5,8 @@ import ( "github.com/cosmos/cosmos-sdk/server" svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" - app "github.com/cosmos/interchain-security/v2/app/consumer-democracy" - "github.com/cosmos/interchain-security/v2/cmd/interchain-security-cdd/cmd" + app "github.com/cosmos/interchain-security/v3/app/consumer-democracy" + "github.com/cosmos/interchain-security/v3/cmd/interchain-security-cdd/cmd" ) func main() { diff --git a/cmd/interchain-security-pd/cmd/root.go b/cmd/interchain-security-pd/cmd/root.go index e480acfc34..246e1c182b 100644 --- a/cmd/interchain-security-pd/cmd/root.go +++ b/cmd/interchain-security-pd/cmd/root.go @@ -28,8 +28,8 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/cosmos/cosmos-sdk/x/crisis" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" - "github.com/cosmos/interchain-security/v2/app/params" - providerApp "github.com/cosmos/interchain-security/v2/app/provider" + "github.com/cosmos/interchain-security/v3/app/params" + providerApp "github.com/cosmos/interchain-security/v3/app/provider" ) // NewRootCmd creates a new root command for simd. It is called once in the diff --git a/cmd/interchain-security-pd/main.go b/cmd/interchain-security-pd/main.go index d39371adc1..9ad1cd67cc 100644 --- a/cmd/interchain-security-pd/main.go +++ b/cmd/interchain-security-pd/main.go @@ -5,8 +5,8 @@ import ( "github.com/cosmos/cosmos-sdk/server" svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" - app "github.com/cosmos/interchain-security/v2/app/provider" - "github.com/cosmos/interchain-security/v2/cmd/interchain-security-pd/cmd" + app "github.com/cosmos/interchain-security/v3/app/provider" + "github.com/cosmos/interchain-security/v3/cmd/interchain-security-pd/cmd" ) func main() { diff --git a/cmd/interchain-security-sd/cmd/root.go b/cmd/interchain-security-sd/cmd/root.go index 955da62464..a93c841474 100644 --- a/cmd/interchain-security-sd/cmd/root.go +++ b/cmd/interchain-security-sd/cmd/root.go @@ -28,8 +28,8 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/cosmos/cosmos-sdk/x/crisis" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" - "github.com/cosmos/interchain-security/v2/app/params" - sovereignApp "github.com/cosmos/interchain-security/v2/app/sovereign" + "github.com/cosmos/interchain-security/v3/app/params" + sovereignApp "github.com/cosmos/interchain-security/v3/app/sovereign" ) // NewRootCmd creates a new root command for simd. It is called once in the diff --git a/cmd/interchain-security-sd/main.go b/cmd/interchain-security-sd/main.go index 42675b10d2..7c4dc35493 100644 --- a/cmd/interchain-security-sd/main.go +++ b/cmd/interchain-security-sd/main.go @@ -5,8 +5,8 @@ import ( "github.com/cosmos/cosmos-sdk/server" svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" - app "github.com/cosmos/interchain-security/v2/app/sovereign" - "github.com/cosmos/interchain-security/v2/cmd/interchain-security-sd/cmd" + app "github.com/cosmos/interchain-security/v3/app/sovereign" + "github.com/cosmos/interchain-security/v3/cmd/interchain-security-sd/cmd" ) func main() { diff --git a/go.mod b/go.mod index b199160aa2..dd821f8c98 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ -module github.com/cosmos/interchain-security/v2 +module github.com/cosmos/interchain-security/v3 -go 1.19 +go 1.20 require ( cosmossdk.io/errors v1.0.0-beta.7 diff --git a/legacy_ibc_testing/simapp/test_helpers.go b/legacy_ibc_testing/simapp/test_helpers.go index 2d11af5790..249fffb903 100644 --- a/legacy_ibc_testing/simapp/test_helpers.go +++ b/legacy_ibc_testing/simapp/test_helpers.go @@ -18,7 +18,7 @@ import ( "github.com/cosmos/cosmos-sdk/types/errors" "github.com/stretchr/testify/require" - "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/simapp/helpers" + "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/simapp/helpers" ) /* diff --git a/legacy_ibc_testing/testing/app.go b/legacy_ibc_testing/testing/app.go index ce4e32c90f..8a1fef452c 100644 --- a/legacy_ibc_testing/testing/app.go +++ b/legacy_ibc_testing/testing/app.go @@ -6,7 +6,7 @@ import ( "time" "cosmossdk.io/math" - "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/core" + "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/core" abci "github.com/cometbft/cometbft/abci/types" tmproto "github.com/cometbft/cometbft/proto/tendermint/types" @@ -26,8 +26,8 @@ import ( "github.com/cosmos/ibc-go/v7/modules/core/keeper" - "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/simapp" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/simapp" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" ) /* diff --git a/legacy_ibc_testing/testing/chain.go b/legacy_ibc_testing/testing/chain.go index c037ca43c8..945c5b94d0 100644 --- a/legacy_ibc_testing/testing/chain.go +++ b/legacy_ibc_testing/testing/chain.go @@ -35,8 +35,8 @@ import ( ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" "github.com/cosmos/ibc-go/v7/testing/mock" - ibctestingcore "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/core" - "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/simapp" + ibctestingcore "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/core" + "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/simapp" ) /* diff --git a/tests/difference/core/driver/core_test.go b/tests/difference/core/driver/core_test.go index df20aef074..648955f66d 100644 --- a/tests/difference/core/driver/core_test.go +++ b/tests/difference/core/driver/core_test.go @@ -9,18 +9,18 @@ import ( "github.com/stretchr/testify/suite" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" - ibctestingcore "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/core" - ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" + ibctestingcore "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/core" + ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - appConsumer "github.com/cosmos/interchain-security/v2/app/consumer" - appProvider "github.com/cosmos/interchain-security/v2/app/provider" + appConsumer "github.com/cosmos/interchain-security/v3/app/consumer" + appProvider "github.com/cosmos/interchain-security/v3/app/provider" - simibc "github.com/cosmos/interchain-security/v2/testutil/simibc" + simibc "github.com/cosmos/interchain-security/v3/testutil/simibc" slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" - consumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" + consumerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" ) type CoreSuite struct { diff --git a/tests/difference/core/driver/setup.go b/tests/difference/core/driver/setup.go index 1e77588c64..ff42784bc5 100644 --- a/tests/difference/core/driver/setup.go +++ b/tests/difference/core/driver/setup.go @@ -19,7 +19,7 @@ import ( "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" - ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" + ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -33,15 +33,15 @@ import ( slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - appConsumer "github.com/cosmos/interchain-security/v2/app/consumer" - appProvider "github.com/cosmos/interchain-security/v2/app/provider" - icstestingutils "github.com/cosmos/interchain-security/v2/testutil/ibc_testing" - simibc "github.com/cosmos/interchain-security/v2/testutil/simibc" - consumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" - - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + appConsumer "github.com/cosmos/interchain-security/v3/app/consumer" + appProvider "github.com/cosmos/interchain-security/v3/app/provider" + icstestingutils "github.com/cosmos/interchain-security/v3/testutil/ibc_testing" + simibc "github.com/cosmos/interchain-security/v3/testutil/simibc" + consumerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + providerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" + + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) type Builder struct { diff --git a/tests/e2e/actions.go b/tests/e2e/actions.go index a16f6b3bd4..2e8cd38a9b 100644 --- a/tests/e2e/actions.go +++ b/tests/e2e/actions.go @@ -15,9 +15,9 @@ import ( evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/client" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/client" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" "github.com/tidwall/gjson" ) diff --git a/tests/integration/common.go b/tests/integration/common.go index 8f32193206..d387760724 100644 --- a/tests/integration/common.go +++ b/tests/integration/common.go @@ -16,11 +16,11 @@ import ( commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" "github.com/cosmos/ibc-go/v7/modules/core/exported" ibctm "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" - icstestingutils "github.com/cosmos/interchain-security/v2/testutil/ibc_testing" - testutil "github.com/cosmos/interchain-security/v2/testutil/integration" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" + icstestingutils "github.com/cosmos/interchain-security/v3/testutil/ibc_testing" + testutil "github.com/cosmos/interchain-security/v3/testutil/integration" + providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" "github.com/stretchr/testify/require" ) diff --git a/tests/integration/democracy.go b/tests/integration/democracy.go index c1262b31c1..f914d581d7 100644 --- a/tests/integration/democracy.go +++ b/tests/integration/democracy.go @@ -6,15 +6,15 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" - icstestingutils "github.com/cosmos/interchain-security/v2/testutil/ibc_testing" + ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" + icstestingutils "github.com/cosmos/interchain-security/v3/testutil/ibc_testing" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" - testutil "github.com/cosmos/interchain-security/v2/testutil/integration" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + testutil "github.com/cosmos/interchain-security/v3/testutil/integration" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" "github.com/stretchr/testify/suite" ) diff --git a/tests/integration/distribution.go b/tests/integration/distribution.go index 58132fcc62..8ba2a8756b 100644 --- a/tests/integration/distribution.go +++ b/tests/integration/distribution.go @@ -8,9 +8,9 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) // This test is valid for minimal viable consumer chain diff --git a/tests/integration/expired_client.go b/tests/integration/expired_client.go index ae7570a57f..89c8280b33 100644 --- a/tests/integration/expired_client.go +++ b/tests/integration/expired_client.go @@ -11,8 +11,8 @@ import ( ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" ibctm "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) // TestVSCPacketSendWithExpiredClient tests queueing of VSCPackets when the consumer client is expired. diff --git a/tests/integration/instance_test.go b/tests/integration/instance_test.go index 7e1e8dd608..7602f02c5e 100644 --- a/tests/integration/instance_test.go +++ b/tests/integration/instance_test.go @@ -3,11 +3,11 @@ package integration_test import ( "testing" - appConsumer "github.com/cosmos/interchain-security/v2/app/consumer" - appConsumerDemocracy "github.com/cosmos/interchain-security/v2/app/consumer-democracy" - appProvider "github.com/cosmos/interchain-security/v2/app/provider" - intg "github.com/cosmos/interchain-security/v2/tests/integration" - icstestingutils "github.com/cosmos/interchain-security/v2/testutil/ibc_testing" + appConsumer "github.com/cosmos/interchain-security/v3/app/consumer" + appConsumerDemocracy "github.com/cosmos/interchain-security/v3/app/consumer-democracy" + appProvider "github.com/cosmos/interchain-security/v3/app/provider" + intg "github.com/cosmos/interchain-security/v3/tests/integration" + icstestingutils "github.com/cosmos/interchain-security/v3/testutil/ibc_testing" "github.com/stretchr/testify/suite" ) diff --git a/tests/integration/key_assignment.go b/tests/integration/key_assignment.go index e6a794fedf..5ffabbeab4 100644 --- a/tests/integration/key_assignment.go +++ b/tests/integration/key_assignment.go @@ -7,8 +7,8 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/cosmos/ibc-go/v7/testing/mock" - providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + providerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) func (s *CCVTestSuite) TestKeyAssignment() { diff --git a/tests/integration/normal_operations.go b/tests/integration/normal_operations.go index 3318e29940..af2137e5dc 100644 --- a/tests/integration/normal_operations.go +++ b/tests/integration/normal_operations.go @@ -3,7 +3,7 @@ package integration import ( tmproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" ) // Tests the tracking of historical info in the context of new blocks being committed diff --git a/tests/integration/setup.go b/tests/integration/setup.go index 86084545c6..07987ce0d7 100644 --- a/tests/integration/setup.go +++ b/tests/integration/setup.go @@ -7,15 +7,15 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" "github.com/cosmos/ibc-go/v7/testing/mock" - testutil "github.com/cosmos/interchain-security/v2/testutil/integration" + testutil "github.com/cosmos/interchain-security/v3/testutil/integration" - icstestingutils "github.com/cosmos/interchain-security/v2/testutil/ibc_testing" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + icstestingutils "github.com/cosmos/interchain-security/v3/testutil/ibc_testing" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" - ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" + ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" "github.com/stretchr/testify/suite" ) diff --git a/tests/integration/slashing.go b/tests/integration/slashing.go index 8b4cb80547..d4e960a9cd 100644 --- a/tests/integration/slashing.go +++ b/tests/integration/slashing.go @@ -11,13 +11,13 @@ import ( evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" tmtypes "github.com/cometbft/cometbft/types" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" - keepertestutil "github.com/cosmos/interchain-security/v2/testutil/keeper" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + keepertestutil "github.com/cosmos/interchain-security/v3/testutil/keeper" + providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ) // TestRelayAndApplyDowntimePacket tests that downtime slash packets can be properly relayed diff --git a/tests/integration/stop_consumer.go b/tests/integration/stop_consumer.go index fda0aeb441..f6e0d77d59 100644 --- a/tests/integration/stop_consumer.go +++ b/tests/integration/stop_consumer.go @@ -6,8 +6,8 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) // Tests the functionality of stopping a consumer chain at a higher level than unit tests diff --git a/tests/integration/throttle.go b/tests/integration/throttle.go index 289c57e9d0..92800cd1bb 100644 --- a/tests/integration/throttle.go +++ b/tests/integration/throttle.go @@ -8,9 +8,9 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" - icstestingutils "github.com/cosmos/interchain-security/v2/testutil/ibc_testing" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" + icstestingutils "github.com/cosmos/interchain-security/v3/testutil/ibc_testing" + providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) const fullSlashMeterString = "1.0" diff --git a/tests/integration/unbonding.go b/tests/integration/unbonding.go index 6b14099d45..87454be324 100644 --- a/tests/integration/unbonding.go +++ b/tests/integration/unbonding.go @@ -6,8 +6,8 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + providerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) // TestUndelegationNormalOperation tests that undelegations complete after diff --git a/tests/integration/valset_update.go b/tests/integration/valset_update.go index 6e231976c4..e1c0d920ea 100644 --- a/tests/integration/valset_update.go +++ b/tests/integration/valset_update.go @@ -8,7 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) // TestPacketRoundtrip tests a CCV packet roundtrip when tokens are bonded on provider diff --git a/testutil/crypto/crypto.go b/testutil/crypto/crypto.go index 1becc4248e..dd733f0ab3 100644 --- a/testutil/crypto/crypto.go +++ b/testutil/crypto/crypto.go @@ -11,7 +11,7 @@ import ( sdkcryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdktypes "github.com/cosmos/cosmos-sdk/types" sdkstakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" tmcrypto "github.com/cometbft/cometbft/crypto" tmprotocrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" diff --git a/testutil/ibc_testing/generic_setup.go b/testutil/ibc_testing/generic_setup.go index 67e169af98..e784ee23b7 100644 --- a/testutil/ibc_testing/generic_setup.go +++ b/testutil/ibc_testing/generic_setup.go @@ -6,10 +6,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" - ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" - testutil "github.com/cosmos/interchain-security/v2/testutil/integration" - testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" - consumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" + ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" + testutil "github.com/cosmos/interchain-security/v3/testutil/integration" + testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" + consumerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" "github.com/stretchr/testify/suite" diff --git a/testutil/ibc_testing/specific_setup.go b/testutil/ibc_testing/specific_setup.go index ab9715ebd9..01c8315de8 100644 --- a/testutil/ibc_testing/specific_setup.go +++ b/testutil/ibc_testing/specific_setup.go @@ -8,14 +8,14 @@ import ( "encoding/json" simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" - ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" + ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" tmdb "github.com/cometbft/cometbft-db" "github.com/cometbft/cometbft/libs/log" - appConsumer "github.com/cosmos/interchain-security/v2/app/consumer" - appConsumerDemocracy "github.com/cosmos/interchain-security/v2/app/consumer-democracy" - appProvider "github.com/cosmos/interchain-security/v2/app/provider" + appConsumer "github.com/cosmos/interchain-security/v3/app/consumer" + appConsumerDemocracy "github.com/cosmos/interchain-security/v3/app/consumer-democracy" + appProvider "github.com/cosmos/interchain-security/v3/app/provider" ) // ProviderAppIniter implements ibctesting.AppIniter for a provider app diff --git a/testutil/integration/debug_test.go b/testutil/integration/debug_test.go index b6456663a9..3d04c540ee 100644 --- a/testutil/integration/debug_test.go +++ b/testutil/integration/debug_test.go @@ -6,11 +6,11 @@ import ( "reflect" "testing" - appConsumer "github.com/cosmos/interchain-security/v2/app/consumer" - appConsumerDemocracy "github.com/cosmos/interchain-security/v2/app/consumer-democracy" - appProvider "github.com/cosmos/interchain-security/v2/app/provider" - integr "github.com/cosmos/interchain-security/v2/tests/integration" - icstestingutils "github.com/cosmos/interchain-security/v2/testutil/ibc_testing" + appConsumer "github.com/cosmos/interchain-security/v3/app/consumer" + appConsumerDemocracy "github.com/cosmos/interchain-security/v3/app/consumer-democracy" + appProvider "github.com/cosmos/interchain-security/v3/app/provider" + integr "github.com/cosmos/interchain-security/v3/tests/integration" + icstestingutils "github.com/cosmos/interchain-security/v3/testutil/ibc_testing" ) // runCCVTestByName runs a single CCV integration test by name, using a CCVTestSuite diff --git a/testutil/integration/interfaces.go b/testutil/integration/interfaces.go index 6fe667c2fa..41e6fd70c3 100644 --- a/testutil/integration/interfaces.go +++ b/testutil/integration/interfaces.go @@ -16,10 +16,10 @@ import ( slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" "github.com/cosmos/cosmos-sdk/x/staking/types" - ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" - consumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" - providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" - ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" + ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" + consumerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" + providerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" + ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) // The interface that any provider app must implement to be compatible with ccv integration tests. diff --git a/testutil/keeper/expectations.go b/testutil/keeper/expectations.go index 06b5008750..1e59085d23 100644 --- a/testutil/keeper/expectations.go +++ b/testutil/keeper/expectations.go @@ -13,10 +13,10 @@ import ( conntypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" host "github.com/cosmos/ibc-go/v7/modules/core/24-host" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" extra "github.com/oxyno-zeta/gomock-extra-matcher" ) diff --git a/testutil/keeper/unit_test_helpers.go b/testutil/keeper/unit_test_helpers.go index d13ab17a63..b8e69a4045 100644 --- a/testutil/keeper/unit_test_helpers.go +++ b/testutil/keeper/unit_test_helpers.go @@ -19,11 +19,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - consumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - "github.com/cosmos/interchain-security/v2/x/ccv/types" + consumerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + providerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" + providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + "github.com/cosmos/interchain-security/v3/x/ccv/types" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" diff --git a/testutil/simibc/chain_util.go b/testutil/simibc/chain_util.go index 50015834e3..0e6d14cd38 100644 --- a/testutil/simibc/chain_util.go +++ b/testutil/simibc/chain_util.go @@ -7,8 +7,8 @@ import ( tmproto "github.com/cometbft/cometbft/proto/tendermint/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - ibctestingcore "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/core" - ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" + ibctestingcore "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/core" + ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" ) // BeginBlock updates the current header and calls the app.BeginBlock method. diff --git a/testutil/simibc/relay_util.go b/testutil/simibc/relay_util.go index 48e127aa60..7015dc72c1 100644 --- a/testutil/simibc/relay_util.go +++ b/testutil/simibc/relay_util.go @@ -8,8 +8,8 @@ import ( channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" host "github.com/cosmos/ibc-go/v7/modules/core/24-host" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - simapp "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/simapp" - ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" + simapp "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/simapp" + ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" "github.com/stretchr/testify/require" ) diff --git a/testutil/simibc/relayed_path.go b/testutil/simibc/relayed_path.go index b5339b2923..dfc5febe9c 100644 --- a/testutil/simibc/relayed_path.go +++ b/testutil/simibc/relayed_path.go @@ -5,7 +5,7 @@ import ( "time" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - ibctesting "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/testing" + ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" ) // RelayedPath is a wrapper around ibctesting.Path gives fine-grained diff --git a/x/ccv/consumer/client/cli/query.go b/x/ccv/consumer/client/cli/query.go index 3c42a8a33c..dc88aaf9d9 100644 --- a/x/ccv/consumer/client/cli/query.go +++ b/x/ccv/consumer/client/cli/query.go @@ -5,7 +5,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" ) // NewQueryCmd returns a root CLI command handler for all x/ccv/provider query commands. diff --git a/x/ccv/consumer/ibc_module.go b/x/ccv/consumer/ibc_module.go index 410ca0d0fa..d55a1998af 100644 --- a/x/ccv/consumer/ibc_module.go +++ b/x/ccv/consumer/ibc_module.go @@ -16,10 +16,10 @@ import ( host "github.com/cosmos/ibc-go/v7/modules/core/24-host" ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" - "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - "github.com/cosmos/interchain-security/v2/x/ccv/types" + "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + "github.com/cosmos/interchain-security/v3/x/ccv/types" ) // OnChanOpenInit implements the IBCModule interface diff --git a/x/ccv/consumer/ibc_module_test.go b/x/ccv/consumer/ibc_module_test.go index 18bbba83cf..9e326bcbe6 100644 --- a/x/ccv/consumer/ibc_module_test.go +++ b/x/ccv/consumer/ibc_module_test.go @@ -9,11 +9,11 @@ import ( conntypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" host "github.com/cosmos/ibc-go/v7/modules/core/24-host" - testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" - "github.com/cosmos/interchain-security/v2/x/ccv/consumer" - consumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" + "github.com/cosmos/interchain-security/v3/x/ccv/consumer" + consumerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" + providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" diff --git a/x/ccv/consumer/keeper/changeover_test.go b/x/ccv/consumer/keeper/changeover_test.go index 9296dcb951..4009890b52 100644 --- a/x/ccv/consumer/keeper/changeover_test.go +++ b/x/ccv/consumer/keeper/changeover_test.go @@ -6,8 +6,8 @@ import ( abci "github.com/cometbft/cometbft/abci/types" sdkcryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/cosmos/interchain-security/v2/testutil/crypto" - uthelpers "github.com/cosmos/interchain-security/v2/testutil/keeper" + "github.com/cosmos/interchain-security/v3/testutil/crypto" + uthelpers "github.com/cosmos/interchain-security/v3/testutil/keeper" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" ) diff --git a/x/ccv/consumer/keeper/distribution.go b/x/ccv/consumer/keeper/distribution.go index fac98c3cfc..e2c8d2a403 100644 --- a/x/ccv/consumer/keeper/distribution.go +++ b/x/ccv/consumer/keeper/distribution.go @@ -11,8 +11,8 @@ import ( clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" - "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) // EndBlockRD executes EndBlock logic for the Reward Distribution sub-protocol. diff --git a/x/ccv/consumer/keeper/distribution_test.go b/x/ccv/consumer/keeper/distribution_test.go index bb09c7e26b..07f49b5b8c 100644 --- a/x/ccv/consumer/keeper/distribution_test.go +++ b/x/ccv/consumer/keeper/distribution_test.go @@ -8,8 +8,8 @@ import ( "github.com/stretchr/testify/require" authTypes "github.com/cosmos/cosmos-sdk/x/auth/types" - testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" - "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" + "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" "github.com/golang/mock/gomock" ) diff --git a/x/ccv/consumer/keeper/genesis.go b/x/ccv/consumer/keeper/genesis.go index 04c97dd4e3..d9e905bbd8 100644 --- a/x/ccv/consumer/keeper/genesis.go +++ b/x/ccv/consumer/keeper/genesis.go @@ -4,8 +4,8 @@ import ( "fmt" sdk "github.com/cosmos/cosmos-sdk/types" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" abci "github.com/cometbft/cometbft/abci/types" ) diff --git a/x/ccv/consumer/keeper/genesis_test.go b/x/ccv/consumer/keeper/genesis_test.go index f05d8c960f..a2c0f6a88b 100644 --- a/x/ccv/consumer/keeper/genesis_test.go +++ b/x/ccv/consumer/keeper/genesis_test.go @@ -12,17 +12,17 @@ import ( clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - "github.com/cosmos/interchain-security/v2/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" - consumerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + "github.com/cosmos/interchain-security/v3/testutil/crypto" + testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" + consumerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" ) // TestInitGenesis tests that a consumer chain is correctly initialised from genesis. diff --git a/x/ccv/consumer/keeper/grpc_query.go b/x/ccv/consumer/keeper/grpc_query.go index 9658edf64c..299e485faf 100644 --- a/x/ccv/consumer/keeper/grpc_query.go +++ b/x/ccv/consumer/keeper/grpc_query.go @@ -4,7 +4,7 @@ import ( "context" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) diff --git a/x/ccv/consumer/keeper/hooks.go b/x/ccv/consumer/keeper/hooks.go index 33a756d525..da3058555b 100644 --- a/x/ccv/consumer/keeper/hooks.go +++ b/x/ccv/consumer/keeper/hooks.go @@ -2,7 +2,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) var _ ccv.ConsumerHooks = Keeper{} diff --git a/x/ccv/consumer/keeper/keeper.go b/x/ccv/consumer/keeper/keeper.go index b50b330efa..24a1234065 100644 --- a/x/ccv/consumer/keeper/keeper.go +++ b/x/ccv/consumer/keeper/keeper.go @@ -22,8 +22,8 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) // Keeper defines the Cross-Chain Validation Consumer Keeper diff --git a/x/ccv/consumer/keeper/keeper_test.go b/x/ccv/consumer/keeper/keeper_test.go index c6443958b6..7b23c777c5 100644 --- a/x/ccv/consumer/keeper/keeper_test.go +++ b/x/ccv/consumer/keeper/keeper_test.go @@ -12,10 +12,10 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" conntypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" - "github.com/cosmos/interchain-security/v2/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" - "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + "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/consumer/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" diff --git a/x/ccv/consumer/keeper/params.go b/x/ccv/consumer/keeper/params.go index ad1a0f2cb5..ccffd96ee5 100644 --- a/x/ccv/consumer/keeper/params.go +++ b/x/ccv/consumer/keeper/params.go @@ -6,8 +6,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" + "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) // GetParams returns the params for the consumer ccv module diff --git a/x/ccv/consumer/keeper/params_test.go b/x/ccv/consumer/keeper/params_test.go index d8dd63a1cb..7573613199 100644 --- a/x/ccv/consumer/keeper/params_test.go +++ b/x/ccv/consumer/keeper/params_test.go @@ -4,9 +4,9 @@ import ( "testing" "time" - testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" - "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" + "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" "github.com/stretchr/testify/require" ) diff --git a/x/ccv/consumer/keeper/relay.go b/x/ccv/consumer/keeper/relay.go index f57891bf98..d9e922ed3d 100644 --- a/x/ccv/consumer/keeper/relay.go +++ b/x/ccv/consumer/keeper/relay.go @@ -12,8 +12,8 @@ import ( channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" "github.com/cosmos/ibc-go/v7/modules/core/exported" - "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) // OnRecvVSCPacket sets the pending validator set changes that will be flushed to ABCI on Endblock diff --git a/x/ccv/consumer/keeper/relay_test.go b/x/ccv/consumer/keeper/relay_test.go index 23b3d99339..299d316d21 100644 --- a/x/ccv/consumer/keeper/relay_test.go +++ b/x/ccv/consumer/keeper/relay_test.go @@ -17,10 +17,10 @@ import ( channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" host "github.com/cosmos/ibc-go/v7/modules/core/24-host" - "github.com/cosmos/interchain-security/v2/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - "github.com/cosmos/interchain-security/v2/x/ccv/types" + "github.com/cosmos/interchain-security/v3/testutil/crypto" + testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v3/x/ccv/types" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" diff --git a/x/ccv/consumer/keeper/soft_opt_out.go b/x/ccv/consumer/keeper/soft_opt_out.go index 26b490633d..23a27d4b96 100644 --- a/x/ccv/consumer/keeper/soft_opt_out.go +++ b/x/ccv/consumer/keeper/soft_opt_out.go @@ -5,7 +5,7 @@ import ( "sort" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" ) // SetSmallestNonOptOutPower sets the smallest validator power that cannot soft opt out. diff --git a/x/ccv/consumer/keeper/soft_opt_out_test.go b/x/ccv/consumer/keeper/soft_opt_out_test.go index f243b917d7..34e5570674 100644 --- a/x/ccv/consumer/keeper/soft_opt_out_test.go +++ b/x/ccv/consumer/keeper/soft_opt_out_test.go @@ -5,9 +5,9 @@ import ( tmtypes "github.com/cometbft/cometbft/types" - "github.com/cosmos/interchain-security/v2/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" - "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + "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/consumer/types" "github.com/stretchr/testify/require" ) diff --git a/x/ccv/consumer/keeper/validators.go b/x/ccv/consumer/keeper/validators.go index 0f0f246833..068767546b 100644 --- a/x/ccv/consumer/keeper/validators.go +++ b/x/ccv/consumer/keeper/validators.go @@ -9,7 +9,7 @@ import ( abci "github.com/cometbft/cometbft/abci/types" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" ) // diff --git a/x/ccv/consumer/keeper/validators_test.go b/x/ccv/consumer/keeper/validators_test.go index c9ce541794..724ce787d0 100644 --- a/x/ccv/consumer/keeper/validators_test.go +++ b/x/ccv/consumer/keeper/validators_test.go @@ -10,10 +10,10 @@ import ( cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/cosmos/interchain-security/v2/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" - "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" - "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + "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/consumer/keeper" + "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" "github.com/stretchr/testify/require" ) diff --git a/x/ccv/consumer/module.go b/x/ccv/consumer/module.go index 0e87463884..3d80fb1df1 100644 --- a/x/ccv/consumer/module.go +++ b/x/ccv/consumer/module.go @@ -19,10 +19,10 @@ import ( simtypes "github.com/cosmos/cosmos-sdk/types/simulation" porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" - "github.com/cosmos/interchain-security/v2/x/ccv/consumer/client/cli" - "github.com/cosmos/interchain-security/v2/x/ccv/consumer/keeper" + "github.com/cosmos/interchain-security/v3/x/ccv/consumer/client/cli" + "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" ) var ( diff --git a/x/ccv/consumer/types/consumer.pb.go b/x/ccv/consumer/types/consumer.pb.go index dd5d991666..6ab018cf26 100644 --- a/x/ccv/consumer/types/consumer.pb.go +++ b/x/ccv/consumer/types/consumer.pb.go @@ -10,7 +10,7 @@ import ( _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" - _ "github.com/cosmos/interchain-security/v2/x/ccv/types" + _ "github.com/cosmos/interchain-security/v3/x/ccv/types" _ "google.golang.org/protobuf/types/known/durationpb" _ "google.golang.org/protobuf/types/known/timestamppb" io "io" diff --git a/x/ccv/consumer/types/genesis.go b/x/ccv/consumer/types/genesis.go index 54f6fe9651..82b6e2c1fa 100644 --- a/x/ccv/consumer/types/genesis.go +++ b/x/ccv/consumer/types/genesis.go @@ -5,7 +5,7 @@ import ( abci "github.com/cometbft/cometbft/abci/types" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) // NewInitialGenesisState returns a consumer GenesisState for a completely new consumer chain. diff --git a/x/ccv/consumer/types/genesis.pb.go b/x/ccv/consumer/types/genesis.pb.go index cbf6675902..1511df9ccd 100644 --- a/x/ccv/consumer/types/genesis.pb.go +++ b/x/ccv/consumer/types/genesis.pb.go @@ -10,7 +10,7 @@ import ( proto "github.com/cosmos/gogoproto/proto" _ "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" _07_tendermint "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - types1 "github.com/cosmos/interchain-security/v2/x/ccv/types" + types1 "github.com/cosmos/interchain-security/v3/x/ccv/types" _ "google.golang.org/protobuf/types/known/durationpb" io "io" math "math" diff --git a/x/ccv/consumer/types/genesis_test.go b/x/ccv/consumer/types/genesis_test.go index af1badb73b..9ce1c4927a 100644 --- a/x/ccv/consumer/types/genesis_test.go +++ b/x/ccv/consumer/types/genesis_test.go @@ -12,13 +12,13 @@ import ( commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" tmtypes "github.com/cometbft/cometbft/types" - "github.com/cosmos/interchain-security/v2/testutil/crypto" + "github.com/cosmos/interchain-security/v3/testutil/crypto" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" "github.com/stretchr/testify/require" ) diff --git a/x/ccv/consumer/types/keys.go b/x/ccv/consumer/types/keys.go index 093f78b450..24be1819c6 100644 --- a/x/ccv/consumer/types/keys.go +++ b/x/ccv/consumer/types/keys.go @@ -5,7 +5,7 @@ import ( time "time" sdk "github.com/cosmos/cosmos-sdk/types" - ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" + ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) const ( diff --git a/x/ccv/consumer/types/params.go b/x/ccv/consumer/types/params.go index 7ab51fbad8..485bb8fda5 100644 --- a/x/ccv/consumer/types/params.go +++ b/x/ccv/consumer/types/params.go @@ -7,7 +7,7 @@ import ( sdktypes "github.com/cosmos/cosmos-sdk/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" + ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) const ( diff --git a/x/ccv/consumer/types/params_test.go b/x/ccv/consumer/types/params_test.go index 98233505d7..531f7e39f2 100644 --- a/x/ccv/consumer/types/params_test.go +++ b/x/ccv/consumer/types/params_test.go @@ -6,7 +6,7 @@ import ( "github.com/stretchr/testify/require" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" ) // Tests the validation of consumer params that happens at genesis diff --git a/x/ccv/democracy/distribution/module.go b/x/ccv/democracy/distribution/module.go index 3d5ca0ed74..7f4842314e 100644 --- a/x/ccv/democracy/distribution/module.go +++ b/x/ccv/democracy/distribution/module.go @@ -13,7 +13,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/distribution/keeper" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" abci "github.com/cometbft/cometbft/abci/types" distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" diff --git a/x/ccv/provider/client/cli/query.go b/x/ccv/provider/client/cli/query.go index aa1a996f12..1240e242f0 100644 --- a/x/ccv/provider/client/cli/query.go +++ b/x/ccv/provider/client/cli/query.go @@ -11,7 +11,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/version" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ) // NewQueryCmd returns a root CLI command handler for all x/ccv/provider query commands. diff --git a/x/ccv/provider/client/cli/tx.go b/x/ccv/provider/client/cli/tx.go index a0b9343d8a..ca167dbb60 100644 --- a/x/ccv/provider/client/cli/tx.go +++ b/x/ccv/provider/client/cli/tx.go @@ -12,7 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/version" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ) // GetTxCmd returns the transaction commands for this module diff --git a/x/ccv/provider/client/proposal_handler.go b/x/ccv/provider/client/proposal_handler.go index 6ccd855ef8..9c02dd3c23 100644 --- a/x/ccv/provider/client/proposal_handler.go +++ b/x/ccv/provider/client/proposal_handler.go @@ -17,7 +17,7 @@ import ( govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" "github.com/spf13/cobra" ) diff --git a/x/ccv/provider/handler.go b/x/ccv/provider/handler.go index dc0c8cbc4f..6f3bb29092 100644 --- a/x/ccv/provider/handler.go +++ b/x/ccv/provider/handler.go @@ -4,8 +4,8 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ) func NewHandler(k *keeper.Keeper) sdk.Handler { diff --git a/x/ccv/provider/handler_test.go b/x/ccv/provider/handler_test.go index 0176e13b71..8871d15669 100644 --- a/x/ccv/provider/handler_test.go +++ b/x/ccv/provider/handler_test.go @@ -12,11 +12,11 @@ import ( "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - testcrypto "github.com/cosmos/interchain-security/v2/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" - "github.com/cosmos/interchain-security/v2/x/ccv/provider" - keeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + testcrypto "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 "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" + providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ) func TestInvalidMsg(t *testing.T) { diff --git a/x/ccv/provider/ibc_module.go b/x/ccv/provider/ibc_module.go index 21eee84f06..b543c8927e 100644 --- a/x/ccv/provider/ibc_module.go +++ b/x/ccv/provider/ibc_module.go @@ -13,9 +13,9 @@ import ( host "github.com/cosmos/ibc-go/v7/modules/core/24-host" ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" + providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) // OnChanOpenInit implements the IBCModule interface diff --git a/x/ccv/provider/ibc_module_test.go b/x/ccv/provider/ibc_module_test.go index 28a13dfeda..42279fbb73 100644 --- a/x/ccv/provider/ibc_module_test.go +++ b/x/ccv/provider/ibc_module_test.go @@ -12,11 +12,11 @@ import ( host "github.com/cosmos/ibc-go/v7/modules/core/24-host" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" - "github.com/cosmos/interchain-security/v2/x/ccv/provider" - providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" + "github.com/cosmos/interchain-security/v3/x/ccv/provider" + providerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" + providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" diff --git a/x/ccv/provider/keeper/distribution.go b/x/ccv/provider/keeper/distribution.go index 759de65147..ee6070e27b 100644 --- a/x/ccv/provider/keeper/distribution.go +++ b/x/ccv/provider/keeper/distribution.go @@ -2,8 +2,8 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ) // EndBlockRD executes EndBlock logic for the Reward Distribution sub-protocol. diff --git a/x/ccv/provider/keeper/distribution_test.go b/x/ccv/provider/keeper/distribution_test.go index a9aa6d88fb..4188eedaef 100644 --- a/x/ccv/provider/keeper/distribution_test.go +++ b/x/ccv/provider/keeper/distribution_test.go @@ -4,9 +4,9 @@ import ( "testing" sdk "github.com/cosmos/cosmos-sdk/types" - testutil "github.com/cosmos/interchain-security/v2/testutil/keeper" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + testutil "github.com/cosmos/interchain-security/v3/testutil/keeper" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" ) diff --git a/x/ccv/provider/keeper/genesis.go b/x/ccv/provider/keeper/genesis.go index 89845304d8..996b73d4a5 100644 --- a/x/ccv/provider/keeper/genesis.go +++ b/x/ccv/provider/keeper/genesis.go @@ -4,8 +4,8 @@ import ( "fmt" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) // InitGenesis initializes the CCV provider state and binds to PortID. diff --git a/x/ccv/provider/keeper/genesis_test.go b/x/ccv/provider/keeper/genesis_test.go index 5c8ee5838f..fe666dcc2c 100644 --- a/x/ccv/provider/keeper/genesis_test.go +++ b/x/ccv/provider/keeper/genesis_test.go @@ -6,13 +6,13 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" host "github.com/cosmos/ibc-go/v7/modules/core/24-host" - "github.com/cosmos/interchain-security/v2/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" + "github.com/cosmos/interchain-security/v3/testutil/crypto" + testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" + providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" ) diff --git a/x/ccv/provider/keeper/grpc_query.go b/x/ccv/provider/keeper/grpc_query.go index df7c28f758..f43761fd0e 100644 --- a/x/ccv/provider/keeper/grpc_query.go +++ b/x/ccv/provider/keeper/grpc_query.go @@ -6,8 +6,8 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) diff --git a/x/ccv/provider/keeper/hooks.go b/x/ccv/provider/keeper/hooks.go index a384edfc39..2f2cb8ee0b 100644 --- a/x/ccv/provider/keeper/hooks.go +++ b/x/ccv/provider/keeper/hooks.go @@ -4,8 +4,8 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" sdk "github.com/cosmos/cosmos-sdk/types" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" + providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) // Wrapper struct diff --git a/x/ccv/provider/keeper/hooks_test.go b/x/ccv/provider/keeper/hooks_test.go index e364f61d13..463ed5fff5 100644 --- a/x/ccv/provider/keeper/hooks_test.go +++ b/x/ccv/provider/keeper/hooks_test.go @@ -4,9 +4,9 @@ import ( "testing" sdk "github.com/cosmos/cosmos-sdk/types" - cryptotestutil "github.com/cosmos/interchain-security/v2/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" - providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" + cryptotestutil "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" "github.com/golang/mock/gomock" ) diff --git a/x/ccv/provider/keeper/keeper.go b/x/ccv/provider/keeper/keeper.go index ff14308a22..03caf0aba5 100644 --- a/x/ccv/provider/keeper/keeper.go +++ b/x/ccv/provider/keeper/keeper.go @@ -20,9 +20,9 @@ import ( ibchost "github.com/cosmos/ibc-go/v7/modules/core/exported" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" "github.com/cometbft/cometbft/libs/log" ) diff --git a/x/ccv/provider/keeper/keeper_test.go b/x/ccv/provider/keeper/keeper_test.go index db5bf98ea4..f34bf262a5 100644 --- a/x/ccv/provider/keeper/keeper_test.go +++ b/x/ccv/provider/keeper/keeper_test.go @@ -10,11 +10,11 @@ import ( tmprotocrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - ibcsimapp "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/simapp" - cryptotestutil "github.com/cosmos/interchain-security/v2/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + ibcsimapp "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/simapp" + cryptotestutil "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/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" "github.com/stretchr/testify/require" ) diff --git a/x/ccv/provider/keeper/key_assignment.go b/x/ccv/provider/keeper/key_assignment.go index 0321e089de..eb4fecd64f 100644 --- a/x/ccv/provider/keeper/key_assignment.go +++ b/x/ccv/provider/keeper/key_assignment.go @@ -7,8 +7,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" abci "github.com/cometbft/cometbft/abci/types" tmprotocrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" diff --git a/x/ccv/provider/keeper/key_assignment_test.go b/x/ccv/provider/keeper/key_assignment_test.go index 06d2202954..c06099ca60 100644 --- a/x/ccv/provider/keeper/key_assignment_test.go +++ b/x/ccv/provider/keeper/key_assignment_test.go @@ -11,13 +11,13 @@ import ( tmprotocrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - cryptotestutil "github.com/cosmos/interchain-security/v2/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" + cryptotestutil "github.com/cosmos/interchain-security/v3/testutil/crypto" + testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" "github.com/stretchr/testify/require" - providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" + providerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" "github.com/golang/mock/gomock" ) diff --git a/x/ccv/provider/keeper/msg_server.go b/x/ccv/provider/keeper/msg_server.go index dcef272356..d7051cc392 100644 --- a/x/ccv/provider/keeper/msg_server.go +++ b/x/ccv/provider/keeper/msg_server.go @@ -9,8 +9,8 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" errorsmod "cosmossdk.io/errors" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) type msgServer struct { diff --git a/x/ccv/provider/keeper/params.go b/x/ccv/provider/keeper/params.go index 56ed85fdd4..adfc574ba9 100644 --- a/x/ccv/provider/keeper/params.go +++ b/x/ccv/provider/keeper/params.go @@ -7,8 +7,8 @@ import ( ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) // GetTemplateClient returns the template client for provider proposals diff --git a/x/ccv/provider/keeper/params_test.go b/x/ccv/provider/keeper/params_test.go index 25c368ca82..cfaec35dc7 100644 --- a/x/ccv/provider/keeper/params_test.go +++ b/x/ccv/provider/keeper/params_test.go @@ -9,8 +9,8 @@ import ( commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" + providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" "github.com/stretchr/testify/require" ) diff --git a/x/ccv/provider/keeper/proposal.go b/x/ccv/provider/keeper/proposal.go index 7c4a141ad8..0ce71d6efc 100644 --- a/x/ccv/provider/keeper/proposal.go +++ b/x/ccv/provider/keeper/proposal.go @@ -17,9 +17,9 @@ import ( commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) // HandleConsumerAdditionProposal will receive the consumer chain's client state from the proposal. diff --git a/x/ccv/provider/keeper/proposal_test.go b/x/ccv/provider/keeper/proposal_test.go index 922573b17c..1170a0f368 100644 --- a/x/ccv/provider/keeper/proposal_test.go +++ b/x/ccv/provider/keeper/proposal_test.go @@ -17,12 +17,12 @@ import ( "github.com/stretchr/testify/require" - cryptoutil "github.com/cosmos/interchain-security/v2/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - providerkeeper "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" + cryptoutil "github.com/cosmos/interchain-security/v3/testutil/crypto" + testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + providerkeeper "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" ) // diff --git a/x/ccv/provider/keeper/relay.go b/x/ccv/provider/keeper/relay.go index fed6f1f8ce..1aa0858da6 100644 --- a/x/ccv/provider/keeper/relay.go +++ b/x/ccv/provider/keeper/relay.go @@ -11,8 +11,8 @@ import ( channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" "github.com/cosmos/ibc-go/v7/modules/core/exported" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) // OnRecvVSCMaturedPacket handles a VSCMatured packet diff --git a/x/ccv/provider/keeper/relay_test.go b/x/ccv/provider/keeper/relay_test.go index 07e967ae41..15305d8eea 100644 --- a/x/ccv/provider/keeper/relay_test.go +++ b/x/ccv/provider/keeper/relay_test.go @@ -12,12 +12,12 @@ import ( channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" exported "github.com/cosmos/ibc-go/v7/modules/core/exported" - ibcsimapp "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/simapp" - cryptotestutil "github.com/cosmos/interchain-security/v2/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + ibcsimapp "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/simapp" + cryptotestutil "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" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" diff --git a/x/ccv/provider/keeper/throttle.go b/x/ccv/provider/keeper/throttle.go index d08f7bf5e0..ddfe1b1763 100644 --- a/x/ccv/provider/keeper/throttle.go +++ b/x/ccv/provider/keeper/throttle.go @@ -8,8 +8,8 @@ import ( tmtypes "github.com/cometbft/cometbft/types" sdktypes "github.com/cosmos/cosmos-sdk/types" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/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. diff --git a/x/ccv/provider/keeper/throttle_test.go b/x/ccv/provider/keeper/throttle_test.go index 86a0ee1415..7cd39a8382 100644 --- a/x/ccv/provider/keeper/throttle_test.go +++ b/x/ccv/provider/keeper/throttle_test.go @@ -14,11 +14,11 @@ import ( "github.com/stretchr/testify/require" "golang.org/x/exp/slices" - cryptoutil "github.com/cosmos/interchain-security/v2/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/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, diff --git a/x/ccv/provider/module.go b/x/ccv/provider/module.go index ca83c9011b..556cbcfefa 100644 --- a/x/ccv/provider/module.go +++ b/x/ccv/provider/module.go @@ -16,9 +16,9 @@ import ( porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/client/cli" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/client/cli" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" + providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" diff --git a/x/ccv/provider/module_test.go b/x/ccv/provider/module_test.go index 2cb08d0daf..0eee81cc1f 100644 --- a/x/ccv/provider/module_test.go +++ b/x/ccv/provider/module_test.go @@ -8,10 +8,10 @@ import ( host "github.com/cosmos/ibc-go/v7/modules/core/24-host" - testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" - "github.com/cosmos/interchain-security/v2/x/ccv/provider" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" + "github.com/cosmos/interchain-security/v3/x/ccv/provider" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/x/ccv/provider/proposal_handler.go b/x/ccv/provider/proposal_handler.go index 2bfb71c73b..ebebb9c967 100644 --- a/x/ccv/provider/proposal_handler.go +++ b/x/ccv/provider/proposal_handler.go @@ -6,8 +6,8 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/keeper" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ) // NewProviderProposalHandler defines the handler for consumer addition, diff --git a/x/ccv/provider/proposal_handler_test.go b/x/ccv/provider/proposal_handler_test.go index 35b7821dd7..4f78695935 100644 --- a/x/ccv/provider/proposal_handler_test.go +++ b/x/ccv/provider/proposal_handler_test.go @@ -14,9 +14,9 @@ import ( govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - testkeeper "github.com/cosmos/interchain-security/v2/testutil/keeper" - "github.com/cosmos/interchain-security/v2/x/ccv/provider" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" + "github.com/cosmos/interchain-security/v3/x/ccv/provider" + providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ) // TestProviderProposalHandler tests the highest level handler for proposals diff --git a/x/ccv/provider/types/consumer.go b/x/ccv/provider/types/consumer.go index 29098b4521..1a13123e88 100644 --- a/x/ccv/provider/types/consumer.go +++ b/x/ccv/provider/types/consumer.go @@ -1,8 +1,8 @@ package types import ( - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) func NewConsumerStates( diff --git a/x/ccv/provider/types/genesis.go b/x/ccv/provider/types/genesis.go index 4508fd6eb6..5a9358e736 100644 --- a/x/ccv/provider/types/genesis.go +++ b/x/ccv/provider/types/genesis.go @@ -7,7 +7,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" host "github.com/cosmos/ibc-go/v7/modules/core/24-host" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) func NewGenesisState( diff --git a/x/ccv/provider/types/genesis.pb.go b/x/ccv/provider/types/genesis.pb.go index 84110c9b96..4737530390 100644 --- a/x/ccv/provider/types/genesis.pb.go +++ b/x/ccv/provider/types/genesis.pb.go @@ -8,8 +8,8 @@ import ( _ "github.com/cometbft/cometbft/proto/tendermint/crypto" _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - types1 "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - types "github.com/cosmos/interchain-security/v2/x/ccv/types" + types1 "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + types "github.com/cosmos/interchain-security/v3/x/ccv/types" io "io" math "math" math_bits "math/bits" diff --git a/x/ccv/provider/types/genesis_test.go b/x/ccv/provider/types/genesis_test.go index 0bf3b98a55..de5c77a803 100644 --- a/x/ccv/provider/types/genesis_test.go +++ b/x/ccv/provider/types/genesis_test.go @@ -11,10 +11,10 @@ import ( commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - "github.com/cosmos/interchain-security/v2/testutil/crypto" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" - ccv "github.com/cosmos/interchain-security/v2/x/ccv/types" + "github.com/cosmos/interchain-security/v3/testutil/crypto" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" "github.com/stretchr/testify/require" ) diff --git a/x/ccv/provider/types/key_assignment.go b/x/ccv/provider/types/key_assignment.go index 3ecee9379a..659ca91e83 100644 --- a/x/ccv/provider/types/key_assignment.go +++ b/x/ccv/provider/types/key_assignment.go @@ -6,7 +6,7 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" - ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" + ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) // A validator's consensus address on the provider chain. diff --git a/x/ccv/provider/types/keys.go b/x/ccv/provider/types/keys.go index 4e15f566ef..ee4c11015b 100644 --- a/x/ccv/provider/types/keys.go +++ b/x/ccv/provider/types/keys.go @@ -8,7 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" - ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" + ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) type Status int diff --git a/x/ccv/provider/types/keys_test.go b/x/ccv/provider/types/keys_test.go index 03493c1138..3bb891ddce 100644 --- a/x/ccv/provider/types/keys_test.go +++ b/x/ccv/provider/types/keys_test.go @@ -5,8 +5,8 @@ import ( "time" sdk "github.com/cosmos/cosmos-sdk/types" - cryptoutil "github.com/cosmos/interchain-security/v2/testutil/crypto" - providertypes "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + cryptoutil "github.com/cosmos/interchain-security/v3/testutil/crypto" + providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" "github.com/stretchr/testify/require" ) diff --git a/x/ccv/provider/types/params.go b/x/ccv/provider/types/params.go index 487fdda366..0495d1a89e 100644 --- a/x/ccv/provider/types/params.go +++ b/x/ccv/provider/types/params.go @@ -11,8 +11,8 @@ import ( commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - consumertypes "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) const ( diff --git a/x/ccv/provider/types/params_test.go b/x/ccv/provider/types/params_test.go index bca99670a9..7a4b9aabf2 100644 --- a/x/ccv/provider/types/params_test.go +++ b/x/ccv/provider/types/params_test.go @@ -10,7 +10,7 @@ import ( clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ) func TestValidateParams(t *testing.T) { diff --git a/x/ccv/provider/types/proposal.go b/x/ccv/provider/types/proposal.go index 43f5d027eb..89e8cb9822 100644 --- a/x/ccv/provider/types/proposal.go +++ b/x/ccv/provider/types/proposal.go @@ -11,7 +11,7 @@ import ( govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" - ccvtypes "github.com/cosmos/interchain-security/v2/x/ccv/types" + ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) const ( diff --git a/x/ccv/provider/types/proposal_test.go b/x/ccv/provider/types/proposal_test.go index 4227654bd9..b3f27e1415 100644 --- a/x/ccv/provider/types/proposal_test.go +++ b/x/ccv/provider/types/proposal_test.go @@ -18,7 +18,7 @@ import ( clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - "github.com/cosmos/interchain-security/v2/x/ccv/provider/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ) func TestConsumerAdditionProposalValidateBasic(t *testing.T) { diff --git a/x/ccv/provider/types/query.pb.go b/x/ccv/provider/types/query.pb.go index 5d4fc19077..f8a4f04d23 100644 --- a/x/ccv/provider/types/query.pb.go +++ b/x/ccv/provider/types/query.pb.go @@ -10,8 +10,8 @@ import ( grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" - types "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types" - types1 "github.com/cosmos/interchain-security/v2/x/ccv/types" + types "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + types1 "github.com/cosmos/interchain-security/v3/x/ccv/types" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" diff --git a/x/ccv/types/ccv_test.go b/x/ccv/types/ccv_test.go index 51979fb4da..5aadafe6ec 100644 --- a/x/ccv/types/ccv_test.go +++ b/x/ccv/types/ccv_test.go @@ -6,7 +6,7 @@ import ( abci "github.com/cometbft/cometbft/abci/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" - "github.com/cosmos/interchain-security/v2/x/ccv/types" + "github.com/cosmos/interchain-security/v3/x/ccv/types" "github.com/stretchr/testify/require" ) diff --git a/x/ccv/types/utils_test.go b/x/ccv/types/utils_test.go index 1267daf119..0182b68306 100644 --- a/x/ccv/types/utils_test.go +++ b/x/ccv/types/utils_test.go @@ -5,8 +5,8 @@ import ( abci "github.com/cometbft/cometbft/abci/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - ibcsimapp "github.com/cosmos/interchain-security/v2/legacy_ibc_testing/simapp" - "github.com/cosmos/interchain-security/v2/x/ccv/types" + ibcsimapp "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/simapp" + "github.com/cosmos/interchain-security/v3/x/ccv/types" "github.com/stretchr/testify/require" ) From 3d15f77e19e9aa70527af85b3d89b04c033190fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Jun 2023 11:42:11 +0200 Subject: [PATCH 053/108] build(deps): bump github.com/spf13/cast from 1.5.0 to 1.5.1 (#1053) Bumps [github.com/spf13/cast](https://github.com/spf13/cast) from 1.5.0 to 1.5.1. - [Release notes](https://github.com/spf13/cast/releases) - [Commits](https://github.com/spf13/cast/compare/v1.5.0...v1.5.1) --- updated-dependencies: - dependency-name: github.com/spf13/cast dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index dd821f8c98..49e0fd4dee 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/kylelemons/godebug v1.1.0 github.com/oxyno-zeta/gomock-extra-matcher v1.1.0 github.com/rakyll/statik v0.1.7 // indirect - github.com/spf13/cast v1.5.0 + github.com/spf13/cast v1.5.1 github.com/spf13/cobra v1.6.1 github.com/stretchr/testify v1.8.2 github.com/tidwall/gjson v1.14.4 diff --git a/go.sum b/go.sum index d175ed9849..f6403f86a5 100644 --- a/go.sum +++ b/go.sum @@ -482,7 +482,7 @@ github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/ github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= @@ -1071,8 +1071,8 @@ github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= From 223e83cba320a82b7a17fc949169a84311a7d756 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Jun 2023 11:43:38 +0200 Subject: [PATCH 054/108] build(deps): bump github.com/stretchr/testify from 1.8.2 to 1.8.4 (#1051) Bumps [github.com/stretchr/testify](https://github.com/stretchr/testify) from 1.8.2 to 1.8.4. - [Release notes](https://github.com/stretchr/testify/releases) - [Commits](https://github.com/stretchr/testify/compare/v1.8.2...v1.8.4) --- updated-dependencies: - dependency-name: github.com/stretchr/testify dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Marius Poke --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 49e0fd4dee..e9c505b920 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/rakyll/statik v0.1.7 // indirect github.com/spf13/cast v1.5.1 github.com/spf13/cobra v1.6.1 - github.com/stretchr/testify v1.8.2 + github.com/stretchr/testify v1.8.4 github.com/tidwall/gjson v1.14.4 golang.org/x/crypto v0.7.0 // indirect golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc diff --git a/go.sum b/go.sum index f6403f86a5..281a319404 100644 --- a/go.sum +++ b/go.sum @@ -1106,8 +1106,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= From 7c306e2cf2ca91259099aa733c1b56cf3a8a96b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Jun 2023 11:45:32 +0200 Subject: [PATCH 055/108] build(deps): bump github.com/cosmos/ibc-go/v7 from 7.0.0 to 7.1.0 (#1050) Bumps [github.com/cosmos/ibc-go/v7](https://github.com/cosmos/ibc-go) from 7.0.0 to 7.1.0. - [Release notes](https://github.com/cosmos/ibc-go/releases) - [Changelog](https://github.com/cosmos/ibc-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/cosmos/ibc-go/compare/v7.0.0...v7.1.0) --- updated-dependencies: - dependency-name: github.com/cosmos/ibc-go/v7 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 8 +++----- go.sum | 17 ++++++----------- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/go.mod b/go.mod index e9c505b920..ee1c62d762 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/cometbft/cometbft-db v0.8.0 github.com/cosmos/cosmos-sdk v0.47.3 github.com/cosmos/gogoproto v1.4.10 - github.com/cosmos/ibc-go/v7 v7.0.0 + github.com/cosmos/ibc-go/v7 v7.1.0 github.com/cosmos/ics23/go v0.10.0 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.3 @@ -22,7 +22,7 @@ require ( github.com/spf13/cobra v1.6.1 github.com/stretchr/testify v1.8.4 github.com/tidwall/gjson v1.14.4 - golang.org/x/crypto v0.7.0 // indirect + golang.org/x/crypto v0.8.0 // indirect golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc golang.org/x/net v0.9.0 // indirect golang.org/x/sys v0.7.0 // indirect @@ -81,7 +81,6 @@ require ( github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-playground/universal-translator v0.18.0 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect @@ -115,7 +114,6 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect github.com/klauspost/compress v1.16.3 // indirect - github.com/leodido/go-urn v1.2.1 // indirect github.com/lib/pq v1.10.7 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/linxGnu/grocksdb v1.7.16 // indirect @@ -149,7 +147,6 @@ require ( github.com/tidwall/btree v1.6.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect - github.com/ugorji/go/codec v1.2.7 // indirect github.com/ulikunitz/xz v0.5.11 // indirect github.com/zondax/hid v0.9.1 // indirect github.com/zondax/ledger-go v0.14.1 // indirect @@ -172,6 +169,7 @@ require github.com/spf13/viper v1.15.0 require ( cosmossdk.io/log v1.1.0 // indirect + github.com/go-playground/locales v0.14.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/rs/zerolog v1.29.1 // indirect ) diff --git a/go.sum b/go.sum index 281a319404..b79f6784cb 100644 --- a/go.sum +++ b/go.sum @@ -393,8 +393,8 @@ github.com/cosmos/gogoproto v1.4.10 h1:QH/yT8X+c0F4ZDacDv3z+xE3WU1P1Z3wQoLMBRJoK github.com/cosmos/gogoproto v1.4.10/go.mod h1:3aAZzeRWpAwr+SS/LLkICX2/kDFyaYVzckBDzygIxek= github.com/cosmos/iavl v0.20.0 h1:fTVznVlepH0KK8NyKq8w+U7c2L6jofa27aFX6YGlm38= github.com/cosmos/iavl v0.20.0/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XHcl7A= -github.com/cosmos/ibc-go/v7 v7.0.0 h1:j4kyywlG0hhDmT9FmSaR5iCIka7Pz7kJTxGWY1nlV9Q= -github.com/cosmos/ibc-go/v7 v7.0.0/go.mod h1:BFh8nKWjr5zeR2OZfhkzdgDzj1+KjRn3aJLpwapStj8= +github.com/cosmos/ibc-go/v7 v7.1.0 h1:SCLgs7tqVnzdIDO5MRLgovAnc696vTTKl+8qsTu8IMM= +github.com/cosmos/ibc-go/v7 v7.1.0/go.mod h1:7MptlWeIyqmDiuJeRAFqBvXKY8Hybd+rF8vMSmGd2zg= github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= github.com/cosmos/ledger-cosmos-go v0.12.2 h1:/XYaBlE2BJxtvpkHiBm97gFGSGmYGKunKyF3nNqAXZA= @@ -493,8 +493,8 @@ github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= @@ -522,9 +522,8 @@ github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= -github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= @@ -535,7 +534,6 @@ github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -834,7 +832,6 @@ github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= @@ -1133,11 +1130,9 @@ github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqri github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= @@ -1212,8 +1207,8 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ= +golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= From e910efeef30b941b853121e30a2d222af9721fd4 Mon Sep 17 00:00:00 2001 From: MSalopek Date: Wed, 21 Jun 2023 12:45:28 +0200 Subject: [PATCH 056/108] chore: add release/v3.0.x targets for bots (#1046) Co-authored-by: Marius Poke --- .github/dependabot.yml | 12 +++++++++++- .mergify.yml | 8 ++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 42241f2b1d..ec9119084e 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -26,4 +26,14 @@ updates: # Only allow automated security-related dependency updates on release branches. open-pull-requests-limit: 0 labels: - - dependencies \ No newline at end of file + - dependencies + + - package-ecosystem: gomod + directory: "/" + schedule: + interval: daily + target-branch: "release/v3.0.x" + # Only allow automated security-related dependency updates on release branches. + open-pull-requests-limit: 0 + labels: + - dependencies diff --git a/.mergify.yml b/.mergify.yml index 7eae0395e1..63b8b61550 100644 --- a/.mergify.yml +++ b/.mergify.yml @@ -18,3 +18,11 @@ pull_request_rules: backport: branches: - release/v2.0.x + - name: Backport patches to the release/v3.0.x branch + conditions: + - base=main + - label=A:backport/v3.0.x + actions: + backport: + branches: + - release/v3.0.x From 44ec75f9d1a71508bb6a15edc9b85af3f837b396 Mon Sep 17 00:00:00 2001 From: Marius Poke Date: Wed, 21 Jun 2023 12:46:41 +0200 Subject: [PATCH 057/108] docs: add v3.0.0 changelog (#1056) add v3 changelog --- CHANGELOG.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5960c76238..c7cb03404c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,21 @@ Add an entry to the unreleased section whenever merging a PR to main that is not targeted at a specific release. These entries will eventually be included in a release. -## v.2.0.0 +## v3.0.0 + +Date: June 21st, 2023 + +Interchain Security v3 uses SDK 0.47 and IBC 7. + +* (deps) [#1019](https://github.com/cosmos/interchain-security/pull/1019) Bump multiple dependencies. + * Bump [cosmos-sdk](https://github.com/cosmos/cosmos-sdk) to [v0.47.3](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.47.3). + * Bump [ibc-go](https://github.com/cosmos/ibc-go) to [v7.1.0](https://github.com/cosmos/ibc-go/releases/tag/v7.1.0). + * Bump [CometBFT](https://github.com/cometbft/cometbft) to [v0.37.1](https://github.com/cometbft/cometbft/releases/tag/v0.37.1). +* `[x/ccv/provider]` (fix) [#945](https://github.com/cosmos/interchain-security/issues/945) Refactor `AfterUnbondingInitiated` to not panic when `PutUnbondingOnHold` returns error. +* `[x/ccv/provider]` (fix) [#977](https://github.com/cosmos/interchain-security/pull/977) Avoids panicking the provider when an unbonding delegation was removed through a `CancelUnbondingDelegation` message. +* `[x/ccv/democracy]` (feat) [#1019](https://github.com/cosmos/interchain-security/pull/1019) Whitelisting non-legacy params in the "democracy module" require the entire module to be whitelisted. + +## v2.0.0 Date: June 1st, 2023 From ed04399147a0c3847645f3e68f41ea16db4c0f48 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Thu, 22 Jun 2023 00:41:30 -0700 Subject: [PATCH 058/108] chore: finish go1.20 bump (#1058) * more * fix rands --- .github/workflows/automated-tests.yml | 2 +- .github/workflows/build.yml | 2 +- .github/workflows/golangci-lint.yml | 2 +- .github/workflows/manual-e2e.yml | 4 +- .github/workflows/nightly-e2e.yml | 2 +- README.md | 4 +- x/ccv/provider/keeper/key_assignment_test.go | 41 +++++++++++++------- x/ccv/provider/keeper/throttle_test.go | 10 +++-- 8 files changed, 40 insertions(+), 27 deletions(-) diff --git a/.github/workflows/automated-tests.yml b/.github/workflows/automated-tests.yml index 175bec9545..13b4d5cbc4 100644 --- a/.github/workflows/automated-tests.yml +++ b/.github/workflows/automated-tests.yml @@ -23,7 +23,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v4 with: - go-version: "1.19" # The Go version to download (if necessary) and use. + go-version: "1.20" # The Go version to download (if necessary) and use. # - name: Proto Check # run: make proto-check - name: Unit, integration and difference tests diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ab15d52ae0..ec188dd429 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,7 +21,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v4 with: - go-version: "1.19" # The Go version to download (if necessary) and use. + go-version: "1.20" # The Go version to download (if necessary) and use. - name: Test with coverage run: go test -coverpkg=./x/... -coverprofile=coverage.out ./... - name: SonarCloud Scan diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml index 28eba10b41..11e422b923 100644 --- a/.github/workflows/golangci-lint.yml +++ b/.github/workflows/golangci-lint.yml @@ -19,7 +19,7 @@ jobs: steps: - uses: actions/setup-go@v4 with: - go-version: "1.19" + go-version: "1.20" - uses: actions/checkout@v3 - name: golangci-lint uses: golangci/golangci-lint-action@v3 diff --git a/.github/workflows/manual-e2e.yml b/.github/workflows/manual-e2e.yml index 400e2a81ab..899e4ba230 100644 --- a/.github/workflows/manual-e2e.yml +++ b/.github/workflows/manual-e2e.yml @@ -11,7 +11,7 @@ jobs: steps: - uses: actions/setup-go@v4 with: - go-version: "1.19" + go-version: "1.20" - uses: actions/checkout@v3 - name: Checkout LFS objects @@ -20,7 +20,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v4 with: - go-version: "1.19" # The Go version to download (if necessary) and use. + go-version: "1.20" # The Go version to download (if necessary) and use. - name: E2E tests run: make test-e2e diff --git a/.github/workflows/nightly-e2e.yml b/.github/workflows/nightly-e2e.yml index 0fe0e48d81..f69125e6b8 100644 --- a/.github/workflows/nightly-e2e.yml +++ b/.github/workflows/nightly-e2e.yml @@ -24,7 +24,7 @@ jobs: steps: - uses: actions/setup-go@v4 with: - go-version: "1.19" + go-version: "1.20" - uses: actions/checkout@v3 diff --git a/README.md b/README.md index df86648ea4..bb6da8be76 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,8 @@ For more details on the Replicated Security protocol, take a look at the [docs]( ```bash ## For OSX or Linux -# go 1.18 (https://formulae.brew.sh/formula/go) -brew install go@1.19 +# go 1.20 (https://formulae.brew.sh/formula/go) +brew install go@1.20 # jq (optional, for testnet) (https://formulae.brew.sh/formula/jq) brew install jq # docker (optional, for integration tests, testnet) (https://docs.docker.com/get-docker/) diff --git a/x/ccv/provider/keeper/key_assignment_test.go b/x/ccv/provider/keeper/key_assignment_test.go index c06099ca60..49ef8698cb 100644 --- a/x/ccv/provider/keeper/key_assignment_test.go +++ b/x/ccv/provider/keeper/key_assignment_test.go @@ -47,7 +47,9 @@ func TestGetAllValidatorConsumerPubKey(t *testing.T) { pk, ctx, ctrl, _ := testkeeper.GetProviderKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) defer ctrl.Finish() - rand.Seed(time.Now().Unix()) + seed := time.Now().UnixNano() + rng := rand.New(rand.NewSource(seed)) + chainIDs := []string{"consumer-1", "consumer-2", "consumer-3"} numAssignments := 10 testAssignments := []types.ValidatorConsumerPubKey{} @@ -56,7 +58,7 @@ func TestGetAllValidatorConsumerPubKey(t *testing.T) { providerAddr := cryptotestutil.NewCryptoIdentityFromIntSeed(numAssignments + i).ProviderConsAddress() testAssignments = append(testAssignments, types.ValidatorConsumerPubKey{ - ChainId: chainIDs[rand.Intn(len(chainIDs))], + ChainId: chainIDs[rng.Intn(len(chainIDs))], ProviderAddr: providerAddr.ToSdkConsAddr(), ConsumerKey: &consumerKey, }, @@ -125,7 +127,9 @@ func TestGetAllValidatorsByConsumerAddr(t *testing.T) { pk, ctx, ctrl, _ := testkeeper.GetProviderKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) defer ctrl.Finish() - rand.Seed(time.Now().Unix()) + seed := time.Now().UnixNano() + rng := rand.New(rand.NewSource(seed)) + chainIDs := []string{"consumer-1", "consumer-2", "consumer-3"} numAssignments := 10 testAssignments := []types.ValidatorByConsumerAddr{} @@ -134,7 +138,7 @@ func TestGetAllValidatorsByConsumerAddr(t *testing.T) { providerAddr := cryptotestutil.NewCryptoIdentityFromIntSeed(numAssignments + i).ProviderConsAddress() testAssignments = append(testAssignments, types.ValidatorByConsumerAddr{ - ChainId: chainIDs[rand.Intn(len(chainIDs))], + ChainId: chainIDs[rng.Intn(len(chainIDs))], ConsumerAddr: consumerAddr.ToSdkConsAddr(), ProviderAddr: providerAddr.ToSdkConsAddr(), }, @@ -205,7 +209,9 @@ func TestGetAllKeyAssignmentReplacements(t *testing.T) { chainID := "consumer-1" - rand.Seed(time.Now().Unix()) + seed := time.Now().UnixNano() + rng := rand.New(rand.NewSource(seed)) + numAssignments := 10 testAssignments := []types.KeyAssignmentReplacement{} for i := 0; i < numAssignments; i++ { @@ -215,7 +221,7 @@ func TestGetAllKeyAssignmentReplacements(t *testing.T) { types.KeyAssignmentReplacement{ ProviderAddr: providerAddr.ToSdkConsAddr(), PrevCKey: &consumerKey, - Power: rand.Int63(), + Power: rng.Int63(), }, ) } @@ -264,7 +270,9 @@ func TestGetAllConsumerAddrsToPrune(t *testing.T) { pk, ctx, ctrl, _ := testkeeper.GetProviderKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) defer ctrl.Finish() - rand.Seed(time.Now().Unix()) + seed := time.Now().UnixNano() + rng := rand.New(rand.NewSource(seed)) + chainIDs := []string{"consumer-1", "consumer-2", "consumer-3"} numAssignments := 10 testAssignments := []types.ConsumerAddrsToPrune{} @@ -276,8 +284,8 @@ func TestGetAllConsumerAddrsToPrune(t *testing.T) { } testAssignments = append(testAssignments, types.ConsumerAddrsToPrune{ - ChainId: chainIDs[rand.Intn(len(chainIDs))], - VscId: rand.Uint64(), + ChainId: chainIDs[rng.Intn(len(chainIDs))], + VscId: rng.Uint64(), ConsumerAddrs: &consumerAddresses, }, ) @@ -705,14 +713,17 @@ func TestSimulatedAssignmentsAndUpdateApplication(t *testing.T) { assignableIDS = append(assignableIDS, cryptotestutil.NewCryptoIdentityFromIntSeed(i)) } + seed := time.Now().UnixNano() + rng := rand.New(rand.NewSource(seed)) + // Helper: simulates creation of staking module EndBlock updates. getStakingUpdates := func() (ret []abci.ValidatorUpdate) { // Get a random set of validators to update. It is important to test subsets of all validators. - validators := rand.Perm(len(providerIDS))[0:rand.Intn(len(providerIDS)+1)] + validators := rng.Perm(len(providerIDS))[0:rng.Intn(len(providerIDS)+1)] for _, i := range validators { // Power 0, 1, or 2 represents // deletion, update (from 0 or 2), update (from 0 or 1) - power := rand.Intn(3) + power := rng.Intn(3) ret = append(ret, abci.ValidatorUpdate{ PubKey: providerIDS[i].TMProtoCryptoPublicKey(), Power: int64(power), @@ -723,9 +734,9 @@ func TestSimulatedAssignmentsAndUpdateApplication(t *testing.T) { // Helper: simulates creation of assignment tx's to be done. getAssignments := func() (ret []Assignment) { - for i, numAssignments := 0, rand.Intn(NUM_ASSIGNMENTS_PER_BLOCK_MAX); i < numAssignments; i++ { - randomIxP := rand.Intn(len(providerIDS)) - randomIxC := rand.Intn(len(assignableIDS)) + for i, numAssignments := 0, rng.Intn(NUM_ASSIGNMENTS_PER_BLOCK_MAX); i < numAssignments; i++ { + randomIxP := rng.Intn(len(providerIDS)) + randomIxC := rng.Intn(len(assignableIDS)) ret = append(ret, Assignment{ val: providerIDS[randomIxP].SDKStakingValidator(), ck: assignableIDS[randomIxC].TMProtoCryptoPublicKey(), @@ -832,7 +843,7 @@ func TestSimulatedAssignmentsAndUpdateApplication(t *testing.T) { // delivery of maturity packets from the consumer chain. prunedVscid := greatestPrunedVSCID + // +1 and -1 because id was incremented (-1), (+1) to make upper bound inclusive - rand.Intn(int(k.GetValidatorSetUpdateId(ctx))+1-1-greatestPrunedVSCID) + rng.Intn(int(k.GetValidatorSetUpdateId(ctx))+1-1-greatestPrunedVSCID) k.PruneKeyAssignments(ctx, CHAINID, uint64(prunedVscid)) greatestPrunedVSCID = prunedVscid diff --git a/x/ccv/provider/keeper/throttle_test.go b/x/ccv/provider/keeper/throttle_test.go index 7cd39a8382..f923c53e98 100644 --- a/x/ccv/provider/keeper/throttle_test.go +++ b/x/ccv/provider/keeper/throttle_test.go @@ -784,8 +784,9 @@ func TestGlobalSlashEntryDeletion(t *testing.T) { // Instantiate shuffled copy of above slice shuffledEntries := append([]providertypes.GlobalSlashEntry{}, entries...) - rand.Seed(now.UnixNano()) - rand.Shuffle(len(shuffledEntries), func(i, j int) { + 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] }) @@ -1192,7 +1193,8 @@ func TestPanicIfTooMuchThrottledPacketData(t *testing.T) { defaultParams.MaxThrottledPackets = tc.max providerKeeper.SetParams(ctx, defaultParams) - rand.Seed(time.Now().UnixNano()) + 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()) @@ -1203,7 +1205,7 @@ func TestPanicIfTooMuchThrottledPacketData(t *testing.T) { // 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 := rand.Intn(2) == 0 + randBool := rng.Intn(2) == 0 var data interface{} if randBool { data = testkeeper.GetNewSlashPacketData() From acc494ffea097bfcd31900f7a37044da46700636 Mon Sep 17 00:00:00 2001 From: MSalopek Date: Thu, 22 Jun 2023 13:23:17 +0200 Subject: [PATCH 059/108] fix: re-enable make proto-check and update proto options (#1060) * fix: update proto build tooling * fix: re-enable make proto-check in CI * chore: proto check that works (#1063) * wip * works * comments --------- Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> --- .github/workflows/automated-tests.yml | 4 +- Makefile | 32 ++-- .../ccv/consumer/v1/consumer.proto | 2 +- .../ccv/consumer/v1/genesis.proto | 2 +- .../ccv/consumer/v1/query.proto | 2 +- .../ccv/provider/v1/genesis.proto | 2 +- .../ccv/provider/v1/provider.proto | 2 +- .../ccv/provider/v1/query.proto | 2 +- .../ccv/provider/v1/tx.proto | 2 +- proto/interchain_security/ccv/v1/ccv.proto | 2 +- scripts/protocgen.sh | 2 +- x/ccv/consumer/types/consumer.pb.go | 70 ++++----- x/ccv/consumer/types/genesis.pb.go | 94 +++++------ x/ccv/consumer/types/query.pb.go | 66 ++++---- x/ccv/provider/types/genesis.pb.go | 90 +++++------ x/ccv/provider/types/provider.pb.go | 148 +++++++++--------- x/ccv/provider/types/query.pb.go | 6 +- x/ccv/provider/types/tx.pb.go | 18 +-- x/ccv/types/ccv.pb.go | 6 +- 19 files changed, 280 insertions(+), 272 deletions(-) diff --git a/.github/workflows/automated-tests.yml b/.github/workflows/automated-tests.yml index 13b4d5cbc4..d48b8ef817 100644 --- a/.github/workflows/automated-tests.yml +++ b/.github/workflows/automated-tests.yml @@ -24,8 +24,8 @@ jobs: uses: actions/setup-go@v4 with: go-version: "1.20" # The Go version to download (if necessary) and use. - # - name: Proto Check - # run: make proto-check + - name: Proto Check + run: make proto-check - name: Unit, integration and difference tests run: go test ./... - name: E2E tests diff --git a/Makefile b/Makefile index 69cdfa74be..28c02f7c85 100644 --- a/Makefile +++ b/Makefile @@ -122,19 +122,27 @@ proto-gen: @$(protoImage) sh ./scripts/protocgen.sh; proto-check: - @if git diff --quiet; then \ - echo "No files were modified before running 'make proto-gen'."; \ + @if git diff --quiet --exit-code main...HEAD -- proto; then \ + echo "Pass! No committed changes found in /proto directory between the currently checked out branch and main."; \ else \ - echo "Error: Uncommitted changes exist before running 'make proto-gen'. Please commit or stash your changes."; \ - exit 1; \ - fi - @$(MAKE) proto-gen - @if git diff --quiet; then \ - echo "No files were modified after running 'make proto-gen'. Pass!"; \ - else \ - echo "Error: Files were modified after running 'make proto-gen'. Please commit changes to .pb files"; \ - exit 1; \ - fi + echo "Committed changes found in /proto directory between the currently checked out branch and main."; \ + modified_protos=$$(git diff --name-only main...HEAD proto); \ + modified_pb_files= ; \ + for proto_file in $${modified_protos}; do \ + proto_name=$$(basename "$${proto_file}" .proto); \ + pb_files=$$(find x/ccv -name "$${proto_name}.pb.go"); \ + for pb_file in $${pb_files}; do \ + if git diff --quiet --exit-code main...HEAD -- "$${pb_file}"; then \ + echo "Missing committed changes in $${pb_file}"; \ + exit 1; \ + else \ + modified_pb_files+="$${pb_file} "; \ + fi \ + done \ + done; \ + echo "Pass! Correctly modified pb files: "; \ + echo $${modified_pb_files}; \ + fi proto-format: @echo "Formatting Protobuf files" diff --git a/proto/interchain_security/ccv/consumer/v1/consumer.proto b/proto/interchain_security/ccv/consumer/v1/consumer.proto index 1487e579a8..97ba14f6da 100644 --- a/proto/interchain_security/ccv/consumer/v1/consumer.proto +++ b/proto/interchain_security/ccv/consumer/v1/consumer.proto @@ -3,7 +3,7 @@ package interchain_security.ccv.consumer.v1; import "interchain_security/ccv/v1/ccv.proto"; -option go_package = "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types"; +option go_package = "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types"; import "google/protobuf/any.proto"; import "gogoproto/gogo.proto"; diff --git a/proto/interchain_security/ccv/consumer/v1/genesis.proto b/proto/interchain_security/ccv/consumer/v1/genesis.proto index 739ac2798e..9c9418ef3c 100644 --- a/proto/interchain_security/ccv/consumer/v1/genesis.proto +++ b/proto/interchain_security/ccv/consumer/v1/genesis.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package interchain_security.ccv.consumer.v1; -option go_package = "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types"; +option go_package = "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types"; import "interchain_security/ccv/v1/ccv.proto"; import "interchain_security/ccv/consumer/v1/consumer.proto"; diff --git a/proto/interchain_security/ccv/consumer/v1/query.proto b/proto/interchain_security/ccv/consumer/v1/query.proto index b5576b57fe..df90b1d0aa 100644 --- a/proto/interchain_security/ccv/consumer/v1/query.proto +++ b/proto/interchain_security/ccv/consumer/v1/query.proto @@ -1,7 +1,7 @@ syntax = "proto3"; package interchain_security.ccv.consumer.v1; -option go_package = "github.com/cosmos/interchain-security/v2/x/ccv/consumer/types"; +option go_package = "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types"; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; diff --git a/proto/interchain_security/ccv/provider/v1/genesis.proto b/proto/interchain_security/ccv/provider/v1/genesis.proto index e1c241413b..e1f6ab2e1a 100644 --- a/proto/interchain_security/ccv/provider/v1/genesis.proto +++ b/proto/interchain_security/ccv/provider/v1/genesis.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package interchain_security.ccv.provider.v1; -option go_package = "github.com/cosmos/interchain-security/v2/x/ccv/provider/types"; +option go_package = "github.com/cosmos/interchain-security/v3/x/ccv/provider/types"; import "gogoproto/gogo.proto"; import "interchain_security/ccv/v1/ccv.proto"; diff --git a/proto/interchain_security/ccv/provider/v1/provider.proto b/proto/interchain_security/ccv/provider/v1/provider.proto index f235f0831a..b986255ce5 100644 --- a/proto/interchain_security/ccv/provider/v1/provider.proto +++ b/proto/interchain_security/ccv/provider/v1/provider.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package interchain_security.ccv.provider.v1; -option go_package = "github.com/cosmos/interchain-security/v2/x/ccv/provider/types"; +option go_package = "github.com/cosmos/interchain-security/v3/x/ccv/provider/types"; import "gogoproto/gogo.proto"; import "google/protobuf/timestamp.proto"; diff --git a/proto/interchain_security/ccv/provider/v1/query.proto b/proto/interchain_security/ccv/provider/v1/query.proto index 4709b287dd..431099be79 100644 --- a/proto/interchain_security/ccv/provider/v1/query.proto +++ b/proto/interchain_security/ccv/provider/v1/query.proto @@ -1,7 +1,7 @@ syntax = "proto3"; package interchain_security.ccv.provider.v1; -option go_package = "github.com/cosmos/interchain-security/v2/x/ccv/provider/types"; +option go_package = "github.com/cosmos/interchain-security/v3/x/ccv/provider/types"; import "google/api/annotations.proto"; import "gogoproto/gogo.proto"; diff --git a/proto/interchain_security/ccv/provider/v1/tx.proto b/proto/interchain_security/ccv/provider/v1/tx.proto index 3093132727..257ab6e4e4 100644 --- a/proto/interchain_security/ccv/provider/v1/tx.proto +++ b/proto/interchain_security/ccv/provider/v1/tx.proto @@ -1,7 +1,7 @@ syntax = "proto3"; package interchain_security.ccv.provider.v1; -option go_package = "github.com/cosmos/interchain-security/v2/x/ccv/provider/types"; +option go_package = "github.com/cosmos/interchain-security/v3/x/ccv/provider/types"; import "google/api/annotations.proto"; import "gogoproto/gogo.proto"; diff --git a/proto/interchain_security/ccv/v1/ccv.proto b/proto/interchain_security/ccv/v1/ccv.proto index 730366ea7f..ffae373aa6 100644 --- a/proto/interchain_security/ccv/v1/ccv.proto +++ b/proto/interchain_security/ccv/v1/ccv.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package interchain_security.ccv.v1; -option go_package = "github.com/cosmos/interchain-security/v2/x/ccv/types"; +option go_package = "github.com/cosmos/interchain-security/v3/x/ccv/types"; import "cosmos/staking/v1beta1/staking.proto"; diff --git a/scripts/protocgen.sh b/scripts/protocgen.sh index a6ca6098e4..7332a554f2 100644 --- a/scripts/protocgen.sh +++ b/scripts/protocgen.sh @@ -16,6 +16,6 @@ done cd .. # move proto files to the right places -cp -r github.com/cosmos/interchain-security/v2/* ./ +cp -r github.com/cosmos/interchain-security/v3/* ./ rm -rf github.com diff --git a/x/ccv/consumer/types/consumer.pb.go b/x/ccv/consumer/types/consumer.pb.go index 6ab018cf26..90d5d6e12b 100644 --- a/x/ccv/consumer/types/consumer.pb.go +++ b/x/ccv/consumer/types/consumer.pb.go @@ -369,53 +369,53 @@ var fileDescriptor_5b27a82b276e7f93 = []byte{ // 786 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0xcf, 0x6e, 0xdb, 0x36, 0x18, 0x8f, 0x96, 0xd6, 0x4d, 0x98, 0x14, 0x6b, 0x59, 0x2f, 0x55, 0x33, 0x40, 0x76, 0xdd, 0x1e, - 0x7c, 0x89, 0x84, 0x3a, 0xdb, 0xa5, 0xc0, 0x0e, 0x8d, 0xb3, 0xa2, 0xdd, 0xbf, 0x78, 0xaa, 0xd1, + 0x7c, 0x89, 0x84, 0x26, 0xdb, 0xa5, 0xc0, 0x0e, 0xb5, 0xb3, 0xa2, 0xdd, 0xbf, 0x78, 0xaa, 0xd1, 0x01, 0xdb, 0x81, 0xa0, 0x28, 0x5a, 0x22, 0x22, 0x91, 0x02, 0x49, 0xa9, 0xd3, 0x7d, 0x0f, 0xd0, 0xe3, 0x1e, 0x61, 0x0f, 0xb0, 0x87, 0x28, 0x76, 0xea, 0x71, 0xa7, 0x6e, 0x48, 0xde, 0x60, 0x4f, 0x30, 0x90, 0x92, 0x5c, 0x3b, 0x6d, 0x80, 0xdc, 0xf8, 0xe9, 0xf7, 0xfb, 0x7e, 0xfa, 0xfe, 0x83, - 0x09, 0xe3, 0x9a, 0x4a, 0x92, 0x62, 0xc6, 0x91, 0xa2, 0xa4, 0x94, 0x4c, 0xd7, 0x01, 0x21, 0x55, - 0x40, 0x04, 0x57, 0x65, 0x4e, 0x65, 0x50, 0x3d, 0x5a, 0xbe, 0xfd, 0x42, 0x0a, 0x2d, 0xe0, 0x83, - 0x8f, 0xf8, 0xf8, 0x84, 0x54, 0xfe, 0x92, 0x57, 0x3d, 0xda, 0x7f, 0x78, 0x99, 0xb0, 0xd1, 0x23, - 0x55, 0x23, 0xb5, 0x7f, 0x2f, 0x11, 0x22, 0xc9, 0x68, 0x60, 0xad, 0xa8, 0x5c, 0x04, 0x98, 0xd7, - 0x2d, 0xd4, 0x4f, 0x44, 0x22, 0xec, 0x33, 0x30, 0xaf, 0xce, 0x81, 0x08, 0x95, 0x0b, 0x85, 0x1a, - 0xa0, 0x31, 0x5a, 0xc8, 0xbb, 0xa8, 0x15, 0x97, 0x12, 0x6b, 0x26, 0x78, 0x8b, 0x0f, 0x2e, 0xe2, - 0x9a, 0xe5, 0x54, 0x69, 0x9c, 0x17, 0x0d, 0x61, 0xf4, 0x5b, 0x0f, 0xf4, 0x66, 0x58, 0xe2, 0x5c, - 0x41, 0x17, 0xdc, 0xa0, 0x1c, 0x47, 0x19, 0x8d, 0x5d, 0x67, 0xe8, 0x8c, 0xb7, 0xc2, 0xce, 0x84, - 0x27, 0xe0, 0x61, 0x94, 0x09, 0x72, 0xaa, 0x50, 0x41, 0x25, 0x8a, 0x99, 0xd2, 0x92, 0x45, 0xa5, - 0xf9, 0x0d, 0xd2, 0x12, 0x73, 0x95, 0x33, 0xa5, 0x98, 0xe0, 0xee, 0x27, 0x43, 0x67, 0xbc, 0x19, - 0xde, 0x6f, 0xb8, 0x33, 0x2a, 0x8f, 0x57, 0x98, 0xf3, 0x15, 0x22, 0xfc, 0x06, 0xdc, 0xbf, 0x54, - 0x05, 0x91, 0x14, 0x73, 0x4e, 0x33, 0x77, 0x73, 0xe8, 0x8c, 0xb7, 0xc3, 0x41, 0x7c, 0x89, 0xc8, - 0xb4, 0xa1, 0xc1, 0xc7, 0x60, 0xbf, 0x90, 0xa2, 0x62, 0x31, 0x95, 0x68, 0x41, 0x29, 0x2a, 0x84, - 0xc8, 0x10, 0x8e, 0x63, 0x89, 0x94, 0x96, 0xee, 0x35, 0x2b, 0xb2, 0xd7, 0x31, 0x9e, 0x52, 0x3a, - 0x13, 0x22, 0x7b, 0x12, 0xc7, 0xf2, 0x85, 0x96, 0xf0, 0x47, 0x00, 0x09, 0xa9, 0x90, 0x29, 0x8a, - 0x28, 0xb5, 0xc9, 0x8e, 0x89, 0xd8, 0xbd, 0x3e, 0x74, 0xc6, 0x3b, 0x93, 0x7b, 0x7e, 0x53, 0x3b, - 0xbf, 0xab, 0x9d, 0x7f, 0xdc, 0xd6, 0xf6, 0x68, 0xeb, 0xcd, 0xbb, 0xc1, 0xc6, 0xef, 0xff, 0x0c, - 0x9c, 0xf0, 0x16, 0x21, 0xd5, 0xbc, 0xf1, 0x9e, 0x59, 0x67, 0xf8, 0x0b, 0xb8, 0x6b, 0xb3, 0x59, - 0x50, 0x79, 0x51, 0xb7, 0x77, 0x75, 0xdd, 0xcf, 0x3a, 0x8d, 0x75, 0xf1, 0x67, 0x60, 0xd8, 0xcd, - 0x1b, 0x92, 0x74, 0xad, 0x84, 0x0b, 0x89, 0x89, 0x79, 0xb8, 0x37, 0x6c, 0xc6, 0x5e, 0xc7, 0x0b, - 0xd7, 0x68, 0x4f, 0x5b, 0x16, 0x3c, 0x00, 0x30, 0x65, 0x4a, 0x0b, 0xc9, 0x08, 0xce, 0x10, 0xe5, - 0x5a, 0x32, 0xaa, 0xdc, 0x2d, 0xdb, 0xc0, 0xdb, 0xef, 0x91, 0xaf, 0x1b, 0x00, 0xfe, 0x00, 0x6e, - 0x95, 0x3c, 0x12, 0x3c, 0x66, 0x3c, 0xe9, 0xd2, 0xd9, 0xbe, 0x7a, 0x3a, 0x9f, 0x2e, 0x9d, 0xdb, - 0x44, 0x0e, 0xc1, 0x9e, 0x12, 0x0b, 0x8d, 0x44, 0xa1, 0x91, 0xa9, 0x90, 0x4e, 0x25, 0x55, 0xa9, - 0xc8, 0x62, 0x17, 0xd8, 0xf0, 0xef, 0x18, 0xf4, 0xa4, 0xd0, 0x27, 0xa5, 0x9e, 0x77, 0x10, 0x7c, - 0x00, 0x6e, 0x4a, 0xfa, 0x0a, 0xcb, 0x18, 0xc5, 0x94, 0x8b, 0x5c, 0xb9, 0x3b, 0xc3, 0xcd, 0xf1, - 0x76, 0xb8, 0xdb, 0x7c, 0x3c, 0xb6, 0xdf, 0xe0, 0x17, 0x60, 0xd9, 0x6c, 0xb4, 0xce, 0xde, 0xb5, - 0xec, 0x7e, 0x87, 0x86, 0x2b, 0x5e, 0xa3, 0x2f, 0xc1, 0xe7, 0xdf, 0x61, 0xa5, 0x57, 0xe7, 0xeb, - 0xc8, 0x4c, 0xf1, 0x33, 0xca, 0x92, 0x54, 0xc3, 0x3d, 0xd0, 0x4b, 0xed, 0xcb, 0x6e, 0xc6, 0x66, + 0x43, 0xc6, 0x35, 0x95, 0x24, 0xc5, 0x8c, 0x23, 0x45, 0x49, 0x29, 0x99, 0xae, 0x03, 0x42, 0xaa, + 0x80, 0x08, 0xae, 0xca, 0x9c, 0xca, 0xa0, 0x7a, 0xb4, 0x7c, 0xfb, 0x85, 0x14, 0x5a, 0xc0, 0x07, + 0x1f, 0xf1, 0xf1, 0x09, 0xa9, 0xfc, 0x25, 0xaf, 0x7a, 0xb4, 0xff, 0xf0, 0x32, 0x61, 0xa3, 0x47, + 0xaa, 0x46, 0x6a, 0xff, 0x5e, 0x22, 0x44, 0x92, 0xd1, 0xc0, 0x5a, 0x51, 0xb9, 0x08, 0x30, 0xaf, + 0x5b, 0xa8, 0x9f, 0x88, 0x44, 0xd8, 0x67, 0x60, 0x5e, 0x9d, 0x03, 0x11, 0x2a, 0x17, 0x0a, 0x35, + 0x40, 0x63, 0xb4, 0x90, 0x77, 0x51, 0x2b, 0x2e, 0x25, 0xd6, 0x4c, 0xf0, 0x16, 0x1f, 0x5c, 0xc4, + 0x35, 0xcb, 0xa9, 0xd2, 0x38, 0x2f, 0x1a, 0xc2, 0xe8, 0xb7, 0x1e, 0xe8, 0xcd, 0xb0, 0xc4, 0xb9, + 0x82, 0x2e, 0xb8, 0x41, 0x39, 0x8e, 0x32, 0x1a, 0xbb, 0xce, 0xd0, 0x19, 0x6f, 0x85, 0x9d, 0x09, + 0x4f, 0xc0, 0xc3, 0x28, 0x13, 0xe4, 0x54, 0xa1, 0x82, 0x4a, 0x14, 0x33, 0xa5, 0x25, 0x8b, 0x4a, + 0xf3, 0x1b, 0xa4, 0x25, 0xe6, 0x2a, 0x67, 0x4a, 0x31, 0xc1, 0xdd, 0x4f, 0x86, 0xce, 0x78, 0x33, + 0xbc, 0xdf, 0x70, 0x67, 0x54, 0x1e, 0xaf, 0x30, 0xe7, 0x2b, 0x44, 0xf8, 0x0d, 0xb8, 0x7f, 0xa9, + 0x0a, 0x22, 0x29, 0xe6, 0x9c, 0x66, 0xee, 0xe6, 0xd0, 0x19, 0x6f, 0x87, 0x83, 0xf8, 0x12, 0x91, + 0x69, 0x43, 0x83, 0x8f, 0xc1, 0x7e, 0x21, 0x45, 0xc5, 0x62, 0x2a, 0xd1, 0x82, 0x52, 0x54, 0x08, + 0x91, 0x21, 0x1c, 0xc7, 0x12, 0x29, 0x2d, 0xdd, 0x6b, 0x56, 0x64, 0xaf, 0x63, 0x3c, 0xa5, 0x74, + 0x26, 0x44, 0xf6, 0x24, 0x8e, 0xe5, 0x0b, 0x2d, 0xe1, 0x8f, 0x00, 0x12, 0x52, 0x21, 0x53, 0x14, + 0x51, 0x6a, 0x93, 0x1d, 0x13, 0xb1, 0x7b, 0x7d, 0xe8, 0x8c, 0x77, 0x0e, 0xef, 0xf9, 0x4d, 0xed, + 0xfc, 0xae, 0x76, 0xfe, 0x71, 0x5b, 0xdb, 0xc9, 0xd6, 0x9b, 0x77, 0x83, 0x8d, 0xdf, 0xff, 0x19, + 0x38, 0xe1, 0x2d, 0x42, 0xaa, 0x79, 0xe3, 0x3d, 0xb3, 0xce, 0xf0, 0x17, 0x70, 0xd7, 0x66, 0xb3, + 0xa0, 0xf2, 0xa2, 0x6e, 0xef, 0xea, 0xba, 0x9f, 0x75, 0x1a, 0xeb, 0xe2, 0xcf, 0xc0, 0xb0, 0x9b, + 0x37, 0x24, 0xe9, 0x5a, 0x09, 0x17, 0x12, 0x13, 0xf3, 0x70, 0x6f, 0xd8, 0x8c, 0xbd, 0x8e, 0x17, + 0xae, 0xd1, 0x9e, 0xb6, 0x2c, 0x78, 0x00, 0x60, 0xca, 0x94, 0x16, 0x92, 0x11, 0x9c, 0x21, 0xca, + 0xb5, 0x64, 0x54, 0xb9, 0x5b, 0xb6, 0x81, 0xb7, 0xdf, 0x23, 0x5f, 0x37, 0x00, 0xfc, 0x01, 0xdc, + 0x2a, 0x79, 0x24, 0x78, 0xcc, 0x78, 0xd2, 0xa5, 0xb3, 0x7d, 0xf5, 0x74, 0x3e, 0x5d, 0x3a, 0xb7, + 0x89, 0x1c, 0x81, 0x3d, 0x25, 0x16, 0x1a, 0x89, 0x42, 0x23, 0x53, 0x21, 0x9d, 0x4a, 0xaa, 0x52, + 0x91, 0xc5, 0x2e, 0xb0, 0xe1, 0xdf, 0x31, 0xe8, 0x49, 0xa1, 0x4f, 0x4a, 0x3d, 0xef, 0x20, 0xf8, + 0x00, 0xdc, 0x94, 0xf4, 0x15, 0x96, 0x31, 0x8a, 0x29, 0x17, 0xb9, 0x72, 0x77, 0x86, 0x9b, 0xe3, + 0xed, 0x70, 0xb7, 0xf9, 0x78, 0x6c, 0xbf, 0xc1, 0x2f, 0xc0, 0xb2, 0xd9, 0x68, 0x9d, 0xbd, 0x6b, + 0xd9, 0xfd, 0x0e, 0x0d, 0x57, 0xbc, 0x46, 0x5f, 0x82, 0xcf, 0xbf, 0xc3, 0x4a, 0xaf, 0xce, 0xd7, + 0xc4, 0x4c, 0xf1, 0x33, 0xca, 0x92, 0x54, 0xc3, 0x3d, 0xd0, 0x4b, 0xed, 0xcb, 0x6e, 0xc6, 0x66, 0xd8, 0x5a, 0xa3, 0x3f, 0x1c, 0x70, 0x67, 0x2a, 0x85, 0x52, 0x53, 0xb3, 0xf3, 0x2f, 0x71, 0xc6, 0x62, 0xac, 0x85, 0x34, 0xab, 0x64, 0x26, 0x90, 0x2a, 0x65, 0x1d, 0x76, 0xc3, 0xce, 0x84, 0x7d, 0x70, 0xbd, 0x10, 0xaf, 0xa8, 0x6c, 0x77, 0xa5, 0x31, 0x20, 0x06, 0xbd, 0xa2, 0x8c, 0x4e, 0x69, - 0x6d, 0x87, 0x7e, 0x67, 0xd2, 0xff, 0xa0, 0xa8, 0x4f, 0x78, 0x7d, 0x74, 0xf8, 0xdf, 0xbb, 0xc1, + 0x6d, 0x87, 0x7e, 0xe7, 0xb0, 0xff, 0x41, 0x51, 0x9f, 0xf0, 0x7a, 0x72, 0xf4, 0xdf, 0xbb, 0xc1, 0xdd, 0x1a, 0xe7, 0xd9, 0xe3, 0x91, 0xe9, 0x2e, 0xe5, 0xaa, 0x54, 0xa8, 0xf1, 0x1b, 0xfd, 0xf5, 0xe7, 0x41, 0xbf, 0xbd, 0x0c, 0x44, 0xd6, 0x85, 0x16, 0xfe, 0xac, 0x8c, 0xbe, 0xa5, 0x75, 0xd8, 0x0a, 0x8f, 0x34, 0xb8, 0xfd, 0x3d, 0xd6, 0xa5, 0x64, 0x3c, 0x79, 0xf9, 0x62, 0x3a, 0xc3, 0xe4, 0x94, 0x6a, 0x13, 0x4d, 0xa5, 0xc8, 0xf3, 0x66, 0xe1, 0xaf, 0x85, 0x8d, 0x01, 0x9f, 0x83, 0x9b, - 0xb9, 0xa5, 0xea, 0xda, 0x8e, 0xb0, 0x8d, 0x75, 0x67, 0xb2, 0xff, 0x41, 0x50, 0xf3, 0xee, 0x98, - 0x34, 0xad, 0x7e, 0x6d, 0x5a, 0xbd, 0xdb, 0xb9, 0x1a, 0xf0, 0xe8, 0xa7, 0x37, 0x67, 0x9e, 0xf3, + 0xb9, 0xa5, 0xea, 0xda, 0x8e, 0xb0, 0x8d, 0x75, 0xe7, 0x70, 0xff, 0x83, 0xa0, 0xe6, 0xdd, 0x31, + 0x69, 0x5a, 0xfd, 0xda, 0xb4, 0x7a, 0xb7, 0x73, 0x35, 0xe0, 0xe4, 0xa7, 0x37, 0x67, 0x9e, 0xf3, 0xf6, 0xcc, 0x73, 0xfe, 0x3d, 0xf3, 0x9c, 0xd7, 0xe7, 0xde, 0xc6, 0xdb, 0x73, 0x6f, 0xe3, 0xef, 0x73, 0x6f, 0xe3, 0xe7, 0xaf, 0x12, 0xa6, 0xd3, 0x32, 0xf2, 0x89, 0xc8, 0xdb, 0x93, 0x16, 0xbc, - 0xbf, 0x9e, 0x07, 0xcb, 0xeb, 0x59, 0x4d, 0x82, 0x5f, 0xd7, 0x6f, 0xb3, 0xae, 0x0b, 0xaa, 0xa2, - 0x9e, 0x0d, 0xe2, 0xf0, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x2e, 0x03, 0xd8, 0xe3, 0xcc, 0x05, + 0xbf, 0x9e, 0x07, 0xcb, 0xeb, 0x59, 0x1d, 0x05, 0xbf, 0xae, 0xdf, 0x66, 0x5d, 0x17, 0x54, 0x45, + 0x3d, 0x1b, 0xc4, 0xd1, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x26, 0xe0, 0xb8, 0xdf, 0xcc, 0x05, 0x00, 0x00, } diff --git a/x/ccv/consumer/types/genesis.pb.go b/x/ccv/consumer/types/genesis.pb.go index 1511df9ccd..7a503f0e77 100644 --- a/x/ccv/consumer/types/genesis.pb.go +++ b/x/ccv/consumer/types/genesis.pb.go @@ -291,53 +291,53 @@ var fileDescriptor_2db73a6057a27482 = []byte{ // 786 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x55, 0x4b, 0x8f, 0xe3, 0x34, 0x1c, 0x6f, 0x76, 0x87, 0xd2, 0x7a, 0x76, 0xd9, 0xc1, 0x03, 0x55, 0x68, 0x45, 0x28, 0x03, 0x87, - 0x4a, 0x40, 0xac, 0x16, 0x09, 0x21, 0x21, 0x10, 0x4c, 0x47, 0x82, 0x4a, 0x0b, 0xac, 0xda, 0xdd, - 0x22, 0xed, 0x25, 0x72, 0x1d, 0x93, 0x58, 0x9b, 0xd8, 0x91, 0xed, 0x64, 0xd8, 0x03, 0x17, 0xae, - 0x5c, 0xf8, 0x58, 0x7b, 0x9c, 0x23, 0x27, 0x84, 0x66, 0xbe, 0x03, 0x67, 0x14, 0xdb, 0xe9, 0x83, - 0xe9, 0x88, 0x9e, 0x12, 0xe7, 0xff, 0x7b, 0xfc, 0x1f, 0x8e, 0x0d, 0xc6, 0x8c, 0x6b, 0x2a, 0x49, - 0x8a, 0x19, 0x8f, 0x14, 0x25, 0xa5, 0x64, 0xfa, 0x25, 0x22, 0xa4, 0x42, 0x44, 0x70, 0x55, 0xe6, - 0x54, 0xa2, 0x6a, 0x8c, 0x12, 0xca, 0xa9, 0x62, 0x2a, 0x2c, 0xa4, 0xd0, 0x02, 0x7e, 0xb0, 0x87, - 0x12, 0x12, 0x52, 0x85, 0x0d, 0x25, 0xac, 0xc6, 0xfd, 0x0f, 0xef, 0xd2, 0xad, 0xc6, 0xf5, 0xc3, - 0x4a, 0xf5, 0x27, 0x87, 0xb8, 0xaf, 0x65, 0x2d, 0x67, 0xa0, 0x29, 0x8f, 0xa9, 0xcc, 0x19, 0xd7, - 0x08, 0xaf, 0x08, 0x43, 0xfa, 0x65, 0x41, 0x5d, 0x6e, 0x7d, 0xc4, 0x56, 0x04, 0x65, 0x2c, 0x49, - 0x35, 0xc9, 0x18, 0xe5, 0x5a, 0xa1, 0x2d, 0x74, 0x35, 0xde, 0x5a, 0x39, 0xc2, 0xfb, 0x35, 0x81, - 0x08, 0x49, 0x11, 0x49, 0x31, 0xe7, 0x34, 0x33, 0x8e, 0xf6, 0xd5, 0x41, 0x82, 0x44, 0x88, 0x24, - 0xa3, 0xc8, 0xac, 0x56, 0xe5, 0xcf, 0x28, 0x2e, 0x25, 0xd6, 0x4c, 0x70, 0x17, 0x7f, 0x2b, 0x11, - 0x89, 0x30, 0xaf, 0xa8, 0x7e, 0xb3, 0x5f, 0xcf, 0xfe, 0xe9, 0x80, 0x07, 0xdf, 0xda, 0xbe, 0x2d, - 0x34, 0xd6, 0x14, 0xce, 0x40, 0xbb, 0xc0, 0x12, 0xe7, 0xca, 0xf7, 0x86, 0xde, 0xe8, 0x78, 0xf2, - 0x51, 0x78, 0x40, 0x1f, 0xc3, 0x27, 0x86, 0x72, 0x7e, 0xf4, 0xea, 0xaf, 0xf7, 0x5a, 0x73, 0x27, - 0x00, 0x3f, 0x06, 0xb0, 0x90, 0xa2, 0x62, 0x31, 0x95, 0x91, 0xad, 0x33, 0x62, 0xb1, 0x7f, 0x6f, - 0xe8, 0x8d, 0xba, 0xf3, 0x93, 0x26, 0x32, 0x35, 0x81, 0x59, 0x0c, 0x43, 0x70, 0xba, 0x41, 0xdb, - 0xca, 0x6a, 0xf8, 0x7d, 0x03, 0x7f, 0x73, 0x0d, 0xb7, 0x91, 0x59, 0x0c, 0x07, 0xa0, 0xcb, 0xe9, - 0x65, 0x64, 0x12, 0xf3, 0x8f, 0x86, 0xde, 0xa8, 0x33, 0xef, 0x70, 0x7a, 0x39, 0xad, 0xd7, 0x30, - 0x02, 0x6f, 0xff, 0xd7, 0x5a, 0xd5, 0xe5, 0xf9, 0xaf, 0x35, 0x45, 0xad, 0x48, 0xb8, 0x3d, 0x80, - 0x70, 0xab, 0xe5, 0xd5, 0x38, 0xb4, 0x59, 0x99, 0x8e, 0xcc, 0x4f, 0x77, 0x53, 0xb5, 0x6d, 0x4a, - 0x81, 0xbf, 0x31, 0x10, 0x5c, 0x51, 0xae, 0x4a, 0xe5, 0x3c, 0xda, 0xc6, 0x23, 0xfc, 0x5f, 0x8f, - 0x86, 0x66, 0x6d, 0x7a, 0x6b, 0x9b, 0x9d, 0xef, 0x30, 0x01, 0x27, 0x39, 0xd6, 0xa5, 0x64, 0x3c, - 0x89, 0x0a, 0x4c, 0x5e, 0x50, 0xad, 0xfc, 0xd7, 0x87, 0xf7, 0x47, 0xc7, 0x93, 0xcf, 0x0e, 0x1a, - 0xcd, 0xf7, 0x8e, 0xbc, 0x5c, 0x4c, 0x9f, 0x18, 0xba, 0x9b, 0xd2, 0xa3, 0x46, 0xd5, 0x7e, 0x55, - 0xf0, 0x07, 0xf0, 0x88, 0x71, 0xa6, 0x19, 0xce, 0xa2, 0x0a, 0x67, 0x91, 0xa2, 0xda, 0xef, 0x18, - 0x9f, 0xe1, 0x76, 0xe2, 0xf5, 0x5e, 0x0e, 0x97, 0x38, 0x63, 0x31, 0xd6, 0x42, 0x3e, 0x2b, 0x62, - 0xac, 0xa9, 0x53, 0x7c, 0xe8, 0xe8, 0x4b, 0x9c, 0x2d, 0xa8, 0x86, 0xbf, 0x82, 0x7e, 0x4a, 0xeb, - 0xf2, 0x23, 0x2d, 0x6a, 0x45, 0x45, 0x75, 0x54, 0x1a, 0x7c, 0x3d, 0xd7, 0xae, 0x91, 0xfe, 0xe2, - 0xa0, 0x12, 0xbe, 0x33, 0x32, 0x4f, 0xc5, 0xd2, 0x88, 0x58, 0xcf, 0xd9, 0x85, 0x73, 0xed, 0xa5, - 0xfb, 0xa2, 0x31, 0xfc, 0xcd, 0x03, 0xef, 0x8a, 0x52, 0x2b, 0x8d, 0x79, 0x5c, 0xf7, 0x2e, 0x16, - 0x97, 0x5c, 0xb3, 0x9c, 0x46, 0x2a, 0xc3, 0x2a, 0x65, 0x3c, 0xf1, 0x81, 0x49, 0xe1, 0xf3, 0x83, - 0x52, 0xf8, 0x71, 0xa3, 0x74, 0xe1, 0x84, 0x9c, 0xff, 0x40, 0xdc, 0x0e, 0x2d, 0x9c, 0x05, 0x94, - 0xc0, 0x2f, 0xa8, 0xf5, 0x6f, 0xd4, 0xd6, 0x43, 0x3c, 0x36, 0xdb, 0x64, 0x72, 0xa7, 0xbd, 0xdb, - 0x22, 0x35, 0xc7, 0x8e, 0xe8, 0x02, 0x6b, 0xfc, 0x98, 0xa9, 0x66, 0x80, 0x3d, 0xa7, 0xbc, 0x0b, - 0x52, 0xf0, 0x77, 0x0f, 0x04, 0x19, 0x56, 0x3a, 0xd2, 0x12, 0x73, 0x95, 0x33, 0xa5, 0x98, 0xe0, - 0xd1, 0x2a, 0x13, 0xe4, 0x45, 0x64, 0x7b, 0xe5, 0x3f, 0x30, 0xd6, 0x5f, 0x1f, 0x54, 0xf9, 0x63, - 0xac, 0xf4, 0xd3, 0x2d, 0xa5, 0xf3, 0x5a, 0xc8, 0x4e, 0xa4, 0xe9, 0x40, 0x76, 0x37, 0x04, 0xf6, - 0x40, 0xbb, 0x90, 0x74, 0x3a, 0x5d, 0xfa, 0x0f, 0xcd, 0x3f, 0xea, 0x56, 0x67, 0xcf, 0x41, 0x6f, - 0xff, 0x58, 0x6b, 0x86, 0x4b, 0xb3, 0x3e, 0x81, 0x8e, 0xe6, 0x6e, 0x05, 0x47, 0xe0, 0xe4, 0xd6, - 0x2e, 0xba, 0x67, 0x10, 0x6f, 0x54, 0x3b, 0xa3, 0x3f, 0x7b, 0x06, 0x4e, 0xf7, 0xcc, 0x0b, 0x7e, - 0x05, 0x06, 0x55, 0xb3, 0x71, 0xb7, 0x7e, 0x5a, 0x1c, 0xc7, 0x92, 0x2a, 0x7b, 0xde, 0x75, 0xe7, - 0xef, 0xac, 0x21, 0xeb, 0xff, 0xf0, 0x1b, 0x0b, 0x38, 0xff, 0xe9, 0xd5, 0x75, 0xe0, 0x5d, 0x5d, - 0x07, 0xde, 0xdf, 0xd7, 0x81, 0xf7, 0xc7, 0x4d, 0xd0, 0xba, 0xba, 0x09, 0x5a, 0x7f, 0xde, 0x04, - 0xad, 0xe7, 0x5f, 0x26, 0x4c, 0xa7, 0xe5, 0x2a, 0x24, 0x22, 0x47, 0x44, 0xa8, 0x5c, 0x28, 0xb4, - 0x69, 0xed, 0x27, 0xeb, 0x2b, 0xa3, 0x9a, 0xa0, 0x5f, 0x76, 0xef, 0x0d, 0x73, 0x29, 0xac, 0xda, - 0xe6, 0x2c, 0xfe, 0xf4, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x86, 0x37, 0xab, 0xfd, 0xe6, 0x06, + 0x4a, 0x40, 0xac, 0x76, 0x25, 0x84, 0x84, 0x40, 0x30, 0x1d, 0x09, 0x2a, 0x2d, 0xb0, 0x6a, 0x77, + 0x8b, 0xb4, 0x97, 0xc8, 0x75, 0x4c, 0x62, 0x6d, 0x62, 0x47, 0xb6, 0x93, 0x61, 0x0f, 0x5c, 0xb8, + 0x72, 0xe1, 0x63, 0xed, 0x71, 0x8f, 0x9c, 0x10, 0x9a, 0xf9, 0x0e, 0x9c, 0x51, 0x6c, 0xa7, 0x0f, + 0xa6, 0xa3, 0xed, 0x29, 0x71, 0xfe, 0xbf, 0xc7, 0xff, 0xe1, 0xd8, 0x60, 0xcc, 0xb8, 0xa6, 0x92, + 0xa4, 0x98, 0xf1, 0x48, 0x51, 0x52, 0x4a, 0xa6, 0x5f, 0x20, 0x42, 0x2a, 0x44, 0x04, 0x57, 0x65, + 0x4e, 0x25, 0xaa, 0xc6, 0x28, 0xa1, 0x9c, 0x2a, 0xa6, 0xc2, 0x42, 0x0a, 0x2d, 0xe0, 0x47, 0x7b, + 0x28, 0x21, 0x21, 0x55, 0xd8, 0x50, 0xc2, 0x6a, 0xdc, 0xff, 0xf8, 0x36, 0xdd, 0x6a, 0x5c, 0x3f, + 0xac, 0x54, 0x7f, 0x72, 0x88, 0xfb, 0x5a, 0xd6, 0x72, 0x06, 0x9a, 0xf2, 0x98, 0xca, 0x9c, 0x71, + 0x8d, 0xf0, 0x8a, 0x30, 0xa4, 0x5f, 0x14, 0xd4, 0xe5, 0xd6, 0x47, 0x6c, 0x45, 0x50, 0xc6, 0x92, + 0x54, 0x93, 0x8c, 0x51, 0xae, 0x15, 0xda, 0x42, 0x57, 0xe3, 0xad, 0x95, 0x23, 0x7c, 0x58, 0x13, + 0x88, 0x90, 0x14, 0x91, 0x14, 0x73, 0x4e, 0x33, 0xe3, 0x68, 0x5f, 0x1d, 0x24, 0x48, 0x84, 0x48, + 0x32, 0x8a, 0xcc, 0x6a, 0x55, 0xfe, 0x82, 0xe2, 0x52, 0x62, 0xcd, 0x04, 0x77, 0xf1, 0x77, 0x12, + 0x91, 0x08, 0xf3, 0x8a, 0xea, 0x37, 0xfb, 0xf5, 0xec, 0xdf, 0x0e, 0xb8, 0xf7, 0x9d, 0xed, 0xdb, + 0x42, 0x63, 0x4d, 0xe1, 0x0c, 0xb4, 0x0b, 0x2c, 0x71, 0xae, 0x7c, 0x6f, 0xe8, 0x8d, 0x8e, 0x27, + 0x9f, 0x84, 0x07, 0xf4, 0x31, 0x7c, 0x6c, 0x28, 0xe7, 0x47, 0x2f, 0xff, 0xfe, 0xa0, 0x35, 0x77, + 0x02, 0xf0, 0x53, 0x00, 0x0b, 0x29, 0x2a, 0x16, 0x53, 0x19, 0xd9, 0x3a, 0x23, 0x16, 0xfb, 0x77, + 0x86, 0xde, 0xa8, 0x3b, 0x3f, 0x69, 0x22, 0x53, 0x13, 0x98, 0xc5, 0x30, 0x04, 0xa7, 0x1b, 0xb4, + 0xad, 0xac, 0x86, 0xdf, 0x35, 0xf0, 0xb7, 0xd7, 0x70, 0x1b, 0x99, 0xc5, 0x70, 0x00, 0xba, 0x9c, + 0x5e, 0x46, 0x26, 0x31, 0xff, 0x68, 0xe8, 0x8d, 0x3a, 0xf3, 0x0e, 0xa7, 0x97, 0xd3, 0x7a, 0x0d, + 0x23, 0xf0, 0xee, 0xff, 0xad, 0x55, 0x5d, 0x9e, 0xff, 0x46, 0x53, 0xd4, 0x8a, 0x84, 0xdb, 0x03, + 0x08, 0xb7, 0x5a, 0x5e, 0x8d, 0x43, 0x9b, 0x95, 0xe9, 0xc8, 0xfc, 0x74, 0x37, 0x55, 0xdb, 0xa6, + 0x14, 0xf8, 0x1b, 0x03, 0xc1, 0x15, 0xe5, 0xaa, 0x54, 0xce, 0xa3, 0x6d, 0x3c, 0xc2, 0xd7, 0x7a, + 0x34, 0x34, 0x6b, 0xd3, 0x5b, 0xdb, 0xec, 0x7c, 0x87, 0x09, 0x38, 0xc9, 0xb1, 0x2e, 0x25, 0xe3, + 0x49, 0x54, 0x60, 0xf2, 0x9c, 0x6a, 0xe5, 0xbf, 0x39, 0xbc, 0x3b, 0x3a, 0x9e, 0x7c, 0x7e, 0xd0, + 0x68, 0x7e, 0x70, 0xe4, 0xe5, 0x62, 0xfa, 0xd8, 0xd0, 0xdd, 0x94, 0x1e, 0x34, 0xaa, 0xf6, 0xab, + 0x82, 0x3f, 0x82, 0x07, 0x8c, 0x33, 0xcd, 0x70, 0x16, 0x55, 0x38, 0x8b, 0x14, 0xd5, 0x7e, 0xc7, + 0xf8, 0x0c, 0xb7, 0x13, 0xaf, 0xf7, 0x72, 0xb8, 0xc4, 0x19, 0x8b, 0xb1, 0x16, 0xf2, 0x69, 0x11, + 0x63, 0x4d, 0x9d, 0xe2, 0x7d, 0x47, 0x5f, 0xe2, 0x6c, 0x41, 0x35, 0xfc, 0x0d, 0xf4, 0x53, 0x5a, + 0x97, 0x1f, 0x69, 0x51, 0x2b, 0x2a, 0xaa, 0xa3, 0xd2, 0xe0, 0xeb, 0xb9, 0x76, 0x8d, 0xf4, 0x97, + 0x07, 0x95, 0xf0, 0xbd, 0x91, 0x79, 0x22, 0x96, 0x46, 0xc4, 0x7a, 0xce, 0x2e, 0x9c, 0x6b, 0x2f, + 0xdd, 0x17, 0x8d, 0xe1, 0xef, 0x1e, 0x78, 0x5f, 0x94, 0x5a, 0x69, 0xcc, 0xe3, 0xba, 0x77, 0xb1, + 0xb8, 0xe4, 0x9a, 0xe5, 0x34, 0x52, 0x19, 0x56, 0x29, 0xe3, 0x89, 0x0f, 0x4c, 0x0a, 0x5f, 0x1c, + 0x94, 0xc2, 0x4f, 0x1b, 0xa5, 0x0b, 0x27, 0xe4, 0xfc, 0x07, 0xe2, 0x66, 0x68, 0xe1, 0x2c, 0xa0, + 0x04, 0x7e, 0x41, 0xad, 0x7f, 0xa3, 0xb6, 0x1e, 0xe2, 0xb1, 0xd9, 0x26, 0x93, 0x5b, 0xed, 0xdd, + 0x16, 0xa9, 0x39, 0x76, 0x44, 0x17, 0x58, 0xe3, 0x47, 0x4c, 0x35, 0x03, 0xec, 0x39, 0xe5, 0x5d, + 0x90, 0x82, 0x7f, 0x78, 0x20, 0xc8, 0xb0, 0xd2, 0x91, 0x96, 0x98, 0xab, 0x9c, 0x29, 0xc5, 0x04, + 0x8f, 0x56, 0x99, 0x20, 0xcf, 0x23, 0xdb, 0x2b, 0xff, 0x9e, 0xb1, 0xfe, 0xe6, 0xa0, 0xca, 0x1f, + 0x61, 0xa5, 0x9f, 0x6c, 0x29, 0x9d, 0xd7, 0x42, 0x76, 0x22, 0x4d, 0x07, 0xb2, 0xdb, 0x21, 0xb0, + 0x07, 0xda, 0x85, 0xa4, 0xd3, 0xe9, 0xd2, 0xbf, 0x6f, 0xfe, 0x51, 0xb7, 0x3a, 0x7b, 0x06, 0x7a, + 0xfb, 0xc7, 0x5a, 0x33, 0x5c, 0x9a, 0xf5, 0x09, 0x74, 0x34, 0x77, 0x2b, 0x38, 0x02, 0x27, 0x37, + 0x76, 0xd1, 0x1d, 0x83, 0x78, 0xab, 0xda, 0x19, 0xfd, 0xd9, 0x53, 0x70, 0xba, 0x67, 0x5e, 0xf0, + 0x6b, 0x30, 0xa8, 0x9a, 0x8d, 0xbb, 0xf5, 0xd3, 0xe2, 0x38, 0x96, 0x54, 0xd9, 0xf3, 0xae, 0x3b, + 0x7f, 0x6f, 0x0d, 0x59, 0xff, 0x87, 0xdf, 0x5a, 0xc0, 0xf9, 0xcf, 0x2f, 0xaf, 0x02, 0xef, 0xd5, + 0x55, 0xe0, 0xfd, 0x73, 0x15, 0x78, 0x7f, 0x5e, 0x07, 0xad, 0x57, 0xd7, 0x41, 0xeb, 0xaf, 0xeb, + 0xa0, 0xf5, 0xec, 0xab, 0x84, 0xe9, 0xb4, 0x5c, 0x85, 0x44, 0xe4, 0x88, 0x08, 0x95, 0x0b, 0x85, + 0x36, 0xad, 0xfd, 0x6c, 0x7d, 0x65, 0x54, 0x0f, 0xd1, 0xaf, 0xbb, 0xf7, 0x86, 0xb9, 0x14, 0x56, + 0x6d, 0x73, 0x16, 0x3f, 0xfc, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x8e, 0xd4, 0xcb, 0xc1, 0xe6, 0x06, 0x00, 0x00, } diff --git a/x/ccv/consumer/types/query.pb.go b/x/ccv/consumer/types/query.pb.go index a89562d8e1..5b9c52d962 100644 --- a/x/ccv/consumer/types/query.pb.go +++ b/x/ccv/consumer/types/query.pb.go @@ -308,40 +308,40 @@ func init() { } var fileDescriptor_f627751d3cc10225 = []byte{ - // 522 bytes of a gzipped FileDescriptorProto + // 521 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0xcf, 0x8b, 0xd3, 0x40, - 0x14, 0x6e, 0xb6, 0x3f, 0xc4, 0x59, 0xbc, 0x8c, 0x15, 0x42, 0x95, 0xb8, 0x44, 0xc1, 0xaa, 0x34, - 0xe3, 0x76, 0x0f, 0xab, 0x07, 0x51, 0x56, 0x5d, 0x14, 0x54, 0xd6, 0x22, 0x08, 0x5e, 0xd6, 0xe9, - 0xf4, 0x6d, 0x3a, 0xd0, 0x64, 0xb2, 0x33, 0x93, 0xd0, 0xde, 0xc4, 0x3f, 0x40, 0x04, 0xff, 0x13, - 0x2f, 0xfe, 0x0b, 0x7b, 0x5c, 0xf0, 0xe2, 0x49, 0xa4, 0xf5, 0x8f, 0xf0, 0x28, 0x99, 0x24, 0x6b, - 0x0a, 0xba, 0x8d, 0xe0, 0x6d, 0xfa, 0x7d, 0xef, 0x7d, 0xef, 0x9b, 0x6f, 0x5e, 0x83, 0x08, 0x0f, - 0x35, 0x48, 0x36, 0xa6, 0x3c, 0xdc, 0x57, 0xc0, 0x62, 0xc9, 0xf5, 0x8c, 0x30, 0x96, 0x10, 0x26, - 0x42, 0x15, 0x07, 0x20, 0x49, 0xb2, 0x49, 0x0e, 0x63, 0x90, 0x33, 0x2f, 0x92, 0x42, 0x0b, 0x7c, - 0xe5, 0x0f, 0x0d, 0x1e, 0x63, 0x89, 0x57, 0x34, 0x78, 0xc9, 0x66, 0xa7, 0xed, 0x0b, 0x5f, 0x98, - 0x7a, 0x92, 0x9e, 0xb2, 0xd6, 0xce, 0x25, 0x5f, 0x08, 0x7f, 0x02, 0x84, 0x46, 0x9c, 0xd0, 0x30, - 0x14, 0x9a, 0x6a, 0x2e, 0x42, 0x95, 0xb3, 0xfd, 0x2a, 0x4e, 0x4e, 0x86, 0x98, 0x1e, 0xf7, 0xfd, - 0x1a, 0xba, 0xf8, 0x1c, 0xa6, 0x7a, 0x17, 0xe0, 0x21, 0x57, 0x5a, 0xf2, 0x61, 0x9c, 0x4a, 0x3e, - 0x52, 0x9a, 0x07, 0x54, 0x03, 0xbe, 0x8a, 0xce, 0xb1, 0x58, 0x4a, 0x08, 0xf5, 0x63, 0xe0, 0xfe, - 0x58, 0xdb, 0xd6, 0x86, 0xd5, 0xad, 0x0f, 0x96, 0x41, 0xec, 0x20, 0x34, 0xa1, 0xaa, 0x28, 0x59, - 0x33, 0x25, 0x25, 0x24, 0xe5, 0x43, 0x98, 0x16, 0x7c, 0x3d, 0xe3, 0x7f, 0x23, 0x78, 0x0b, 0x5d, - 0x18, 0x95, 0xa6, 0xef, 0x1f, 0x48, 0xca, 0xd2, 0x83, 0xdd, 0xd8, 0xb0, 0xba, 0x67, 0x07, 0xed, - 0x32, 0xb9, 0x9b, 0x73, 0xb8, 0x8d, 0x9a, 0x5a, 0x68, 0x3a, 0xb1, 0x9b, 0xa6, 0x28, 0xfb, 0x91, - 0x8e, 0xd2, 0x62, 0x4f, 0x8a, 0x84, 0x8f, 0x40, 0xda, 0x2d, 0x43, 0x95, 0x90, 0x8c, 0x7f, 0x90, - 0x87, 0x60, 0x9f, 0x29, 0xf8, 0x02, 0x71, 0xaf, 0xa3, 0x6b, 0x2f, 0xd2, 0xc7, 0x3a, 0x25, 0x94, - 0x01, 0x1c, 0xc6, 0xa0, 0xb4, 0xfb, 0xd6, 0x42, 0xdd, 0xd5, 0xb5, 0x2a, 0x12, 0xa1, 0x02, 0xfc, - 0x12, 0x35, 0x46, 0x54, 0x53, 0x93, 0xdf, 0x7a, 0xff, 0xbe, 0x57, 0x61, 0x09, 0xbc, 0xd3, 0x74, - 0x8d, 0x9a, 0xdb, 0x46, 0xd8, 0x38, 0xd8, 0xa3, 0x92, 0x06, 0xaa, 0x30, 0xf6, 0x06, 0x9d, 0x5f, - 0x42, 0x73, 0x0b, 0x4f, 0x50, 0x2b, 0x32, 0x48, 0x6e, 0xe2, 0x66, 0x25, 0x13, 0x99, 0xc8, 0x4e, - 0xe3, 0xe8, 0xdb, 0xe5, 0xda, 0x20, 0x17, 0xe8, 0x7f, 0xae, 0xa3, 0xa6, 0x19, 0x81, 0x7f, 0x5a, - 0xc8, 0xfe, 0x5b, 0x08, 0xf8, 0x69, 0xa5, 0x09, 0x15, 0xf3, 0xee, 0x3c, 0xfb, 0x4f, 0x6a, 0x59, - 0x1c, 0xee, 0xbd, 0x77, 0x5f, 0x7e, 0x7c, 0x5c, 0xbb, 0x83, 0xb7, 0x57, 0xff, 0x83, 0xd3, 0x55, - 0xed, 0x1d, 0x00, 0xf4, 0xca, 0x8b, 0x88, 0x3f, 0x59, 0x68, 0xbd, 0x94, 0x33, 0xde, 0xae, 0xee, - 0x6f, 0xe9, 0xbd, 0x3a, 0xb7, 0xff, 0xbd, 0x31, 0xbf, 0xc3, 0x2d, 0x73, 0x87, 0x1b, 0xb8, 0xbb, - 0xfa, 0x0e, 0xd9, 0xcb, 0xed, 0xbc, 0x3a, 0x9a, 0x3b, 0xd6, 0xf1, 0xdc, 0xb1, 0xbe, 0xcf, 0x1d, - 0xeb, 0xc3, 0xc2, 0xa9, 0x1d, 0x2f, 0x9c, 0xda, 0xd7, 0x85, 0x53, 0x7b, 0x7d, 0xd7, 0xe7, 0x7a, - 0x1c, 0x0f, 0x3d, 0x26, 0x02, 0xc2, 0x84, 0x0a, 0x84, 0x2a, 0x89, 0xf6, 0x4e, 0x44, 0x93, 0x3e, - 0x99, 0x2e, 0x2b, 0xeb, 0x59, 0x04, 0x6a, 0xd8, 0x32, 0x1f, 0x94, 0xad, 0x5f, 0x01, 0x00, 0x00, - 0xff, 0xff, 0xc4, 0xb4, 0x4e, 0xea, 0x10, 0x05, 0x00, 0x00, + 0x14, 0x6e, 0xfa, 0x4b, 0x9c, 0xc5, 0xcb, 0x58, 0x21, 0x54, 0x89, 0x4b, 0x15, 0xac, 0x4a, 0x33, + 0x6e, 0x7b, 0x58, 0x3d, 0x88, 0xb2, 0xea, 0xa2, 0xa0, 0xb2, 0x16, 0x41, 0xf0, 0xb2, 0x4e, 0xa7, + 0x6f, 0xd3, 0x81, 0x26, 0x93, 0x9d, 0x99, 0x84, 0xf6, 0x26, 0xfe, 0x01, 0x22, 0xf8, 0x9f, 0x78, + 0xf1, 0x5f, 0xd8, 0xe3, 0x82, 0x17, 0x4f, 0x22, 0xad, 0x7f, 0x84, 0x47, 0xc9, 0x24, 0x59, 0x53, + 0xd0, 0x6d, 0x04, 0x6f, 0xd3, 0xef, 0x7b, 0xef, 0x7b, 0xdf, 0x7c, 0xf3, 0x1a, 0x44, 0x78, 0xa0, + 0x41, 0xb2, 0x09, 0xe5, 0xc1, 0xbe, 0x02, 0x16, 0x49, 0xae, 0xe7, 0x84, 0xb1, 0x98, 0x30, 0x11, + 0xa8, 0xc8, 0x07, 0x49, 0xe2, 0x2d, 0x72, 0x18, 0x81, 0x9c, 0xbb, 0xa1, 0x14, 0x5a, 0xe0, 0x2b, + 0x7f, 0x68, 0x70, 0x19, 0x8b, 0xdd, 0xbc, 0xc1, 0x8d, 0xb7, 0xda, 0x2d, 0x4f, 0x78, 0xc2, 0xd4, + 0x93, 0xe4, 0x94, 0xb6, 0xb6, 0x2f, 0x79, 0x42, 0x78, 0x53, 0x20, 0x34, 0xe4, 0x84, 0x06, 0x81, + 0xd0, 0x54, 0x73, 0x11, 0xa8, 0x8c, 0xed, 0x97, 0x71, 0x72, 0x32, 0xc4, 0xf4, 0x74, 0xde, 0x57, + 0xd1, 0xc5, 0xe7, 0x30, 0xd3, 0xbb, 0x00, 0x0f, 0xb9, 0xd2, 0x92, 0x8f, 0xa2, 0x44, 0xf2, 0x91, + 0xd2, 0xdc, 0xa7, 0x1a, 0xf0, 0x55, 0x74, 0x8e, 0x45, 0x52, 0x42, 0xa0, 0x1f, 0x03, 0xf7, 0x26, + 0xda, 0xb6, 0x36, 0xad, 0x6e, 0x6d, 0xb8, 0x0a, 0x62, 0x07, 0xa1, 0x29, 0x55, 0x79, 0x49, 0xd5, + 0x94, 0x14, 0x90, 0x84, 0x0f, 0x60, 0x96, 0xf3, 0xb5, 0x94, 0xff, 0x8d, 0xe0, 0x01, 0xba, 0x30, + 0x2e, 0x4c, 0xdf, 0x3f, 0x90, 0x94, 0x25, 0x07, 0xbb, 0xbe, 0x69, 0x75, 0xcf, 0x0e, 0x5b, 0x45, + 0x72, 0x37, 0xe3, 0x70, 0x0b, 0x35, 0xb4, 0xd0, 0x74, 0x6a, 0x37, 0x4c, 0x51, 0xfa, 0x23, 0x19, + 0xa5, 0xc5, 0x9e, 0x14, 0x31, 0x1f, 0x83, 0xb4, 0x9b, 0x86, 0x2a, 0x20, 0x29, 0xff, 0x20, 0x0b, + 0xc1, 0x3e, 0x93, 0xf3, 0x39, 0xd2, 0xb9, 0x8e, 0xae, 0xbd, 0x48, 0x1e, 0xeb, 0x94, 0x50, 0x86, + 0x70, 0x18, 0x81, 0xd2, 0x9d, 0xb7, 0x16, 0xea, 0xae, 0xaf, 0x55, 0xa1, 0x08, 0x14, 0xe0, 0x97, + 0xa8, 0x3e, 0xa6, 0x9a, 0x9a, 0xfc, 0x36, 0xfa, 0xf7, 0xdd, 0x12, 0x4b, 0xe0, 0x9e, 0xa6, 0x6b, + 0xd4, 0x3a, 0x2d, 0x84, 0x8d, 0x83, 0x3d, 0x2a, 0xa9, 0xaf, 0x72, 0x63, 0x6f, 0xd0, 0xf9, 0x15, + 0x34, 0xb3, 0xf0, 0x04, 0x35, 0x43, 0x83, 0x64, 0x26, 0x6e, 0x96, 0x32, 0x91, 0x8a, 0xec, 0xd4, + 0x8f, 0xbe, 0x5d, 0xae, 0x0c, 0x33, 0x81, 0xfe, 0xe7, 0x1a, 0x6a, 0x98, 0x11, 0xf8, 0xa7, 0x85, + 0xec, 0xbf, 0x85, 0x80, 0x9f, 0x96, 0x9a, 0x50, 0x32, 0xef, 0xf6, 0xb3, 0xff, 0xa4, 0x96, 0xc6, + 0xd1, 0xb9, 0xf7, 0xee, 0xcb, 0x8f, 0x8f, 0xd5, 0x3b, 0x78, 0x7b, 0xfd, 0x3f, 0x38, 0x59, 0xd5, + 0xde, 0x01, 0x40, 0xaf, 0xb8, 0x88, 0xf8, 0x93, 0x85, 0x36, 0x0a, 0x39, 0xe3, 0xed, 0xf2, 0xfe, + 0x56, 0xde, 0xab, 0x7d, 0xfb, 0xdf, 0x1b, 0xb3, 0x3b, 0xdc, 0x32, 0x77, 0xb8, 0x81, 0xbb, 0xeb, + 0xef, 0x90, 0xbe, 0xdc, 0xce, 0xab, 0xa3, 0x85, 0x63, 0x1d, 0x2f, 0x1c, 0xeb, 0xfb, 0xc2, 0xb1, + 0x3e, 0x2c, 0x9d, 0xca, 0xf1, 0xd2, 0xa9, 0x7c, 0x5d, 0x3a, 0x95, 0xd7, 0x77, 0x3d, 0xae, 0x27, + 0xd1, 0xc8, 0x65, 0xc2, 0x27, 0x4c, 0x28, 0x5f, 0xa8, 0x82, 0x68, 0xef, 0x44, 0x34, 0x1e, 0x90, + 0xd9, 0xaa, 0xb2, 0x9e, 0x87, 0xa0, 0x46, 0x4d, 0xf3, 0x41, 0x19, 0xfc, 0x0a, 0x00, 0x00, 0xff, + 0xff, 0xcc, 0x57, 0x2e, 0xd6, 0x10, 0x05, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/ccv/provider/types/genesis.pb.go b/x/ccv/provider/types/genesis.pb.go index 4737530390..0e4e4f2cf3 100644 --- a/x/ccv/provider/types/genesis.pb.go +++ b/x/ccv/provider/types/genesis.pb.go @@ -339,58 +339,58 @@ var fileDescriptor_48411d9c7900d48e = []byte{ // 856 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xdd, 0x8e, 0xdb, 0x44, 0x14, 0x5e, 0xef, 0xa6, 0xdb, 0xcd, 0x6c, 0x77, 0x59, 0x86, 0x55, 0x70, 0xb3, 0x90, 0xae, 0x02, - 0x48, 0x91, 0x00, 0x1b, 0x07, 0x2e, 0xf8, 0xeb, 0x45, 0xd3, 0x4a, 0x10, 0x21, 0x44, 0x94, 0xfe, - 0x20, 0x95, 0x0b, 0x6b, 0x32, 0x1e, 0x25, 0x43, 0xec, 0x19, 0x6b, 0x66, 0x6c, 0x6a, 0x21, 0x24, - 0x2a, 0x5e, 0x80, 0xb7, 0xa2, 0x97, 0xbd, 0xe4, 0xaa, 0x42, 0xbb, 0x6f, 0xc0, 0x13, 0x20, 0x8f, - 0xc7, 0xae, 0xbd, 0x24, 0x90, 0xf4, 0x2e, 0x3e, 0xdf, 0x9c, 0xef, 0x3b, 0x67, 0xce, 0xcc, 0x37, + 0x48, 0x91, 0x00, 0x1b, 0xa7, 0x5c, 0xf0, 0xd7, 0x8b, 0xa6, 0x95, 0x20, 0x42, 0x88, 0x28, 0xfd, + 0x41, 0x2a, 0x17, 0xd6, 0x64, 0x3c, 0x4a, 0x86, 0xd8, 0x33, 0xd6, 0xcc, 0xd8, 0xd4, 0x42, 0x48, + 0x54, 0xbc, 0x00, 0x6f, 0x45, 0x2f, 0x7b, 0xc9, 0x55, 0x85, 0x76, 0xdf, 0x80, 0x27, 0x40, 0x1e, + 0x8f, 0x5d, 0x7b, 0x49, 0x20, 0xe1, 0x2e, 0x3e, 0xdf, 0x9c, 0xef, 0x3b, 0x67, 0xce, 0xcc, 0x37, 0x01, 0x1e, 0x65, 0x8a, 0x08, 0xbc, 0x40, 0x94, 0xf9, 0x92, 0xe0, 0x44, 0x50, 0x95, 0xb9, 0x18, 0xa7, 0x6e, 0x2c, 0x78, 0x4a, 0x03, 0x22, 0xdc, 0xd4, 0x73, 0xe7, 0x84, 0x11, 0x49, 0xa5, 0x13, 0x0b, 0xae, 0x38, 0x7c, 0x67, 0x45, 0x8a, 0x83, 0x71, 0xea, 0x94, 0x29, 0x4e, 0xea, 0x75, 0x4f, 0xe7, 0x7c, 0xce, 0xf5, 0x7a, 0x37, 0xff, 0x55, 0xa4, 0x76, 0xdf, 0x5d, 0xa7, 0x96, 0x7a, 0xae, - 0x61, 0x50, 0xbc, 0x3b, 0xdc, 0xa4, 0xa6, 0x4a, 0xec, 0x7f, 0x72, 0x30, 0x67, 0x32, 0x89, 0x8a, + 0x61, 0x50, 0xbc, 0x3b, 0xdc, 0xa4, 0xa6, 0x4a, 0xec, 0x3f, 0x72, 0x30, 0x67, 0x32, 0x89, 0x8a, 0x9c, 0xf2, 0xb7, 0xc9, 0xf1, 0x36, 0xc9, 0x69, 0xf4, 0xde, 0x7d, 0x4b, 0x11, 0x16, 0x10, 0x11, - 0x51, 0xa6, 0x5c, 0x2c, 0xb2, 0x58, 0x71, 0x77, 0x49, 0x32, 0x83, 0xf6, 0xff, 0x68, 0x83, 0x1b, - 0x5f, 0x15, 0xeb, 0xef, 0x2b, 0xa4, 0x08, 0x1c, 0x80, 0x93, 0x14, 0x85, 0x92, 0x28, 0x3f, 0x89, - 0x03, 0xa4, 0x88, 0x4f, 0x03, 0xdb, 0x3a, 0xb7, 0x06, 0xad, 0xe9, 0x71, 0x11, 0x7f, 0xa8, 0xc3, - 0xe3, 0x00, 0xfe, 0x0c, 0x5e, 0x2b, 0x55, 0x7d, 0x99, 0xe7, 0x4a, 0x7b, 0xf7, 0x7c, 0x6f, 0x70, - 0x38, 0x1c, 0x3a, 0x1b, 0x6c, 0xb7, 0x73, 0xd7, 0xe4, 0x6a, 0xd9, 0x51, 0xef, 0xd9, 0x8b, 0x5b, - 0x3b, 0x7f, 0xbf, 0xb8, 0xd5, 0xc9, 0x50, 0x14, 0x7e, 0xde, 0xbf, 0x42, 0xdc, 0x9f, 0x1e, 0xe3, - 0xfa, 0x72, 0x09, 0x7f, 0x00, 0x47, 0x09, 0x9b, 0x71, 0x16, 0x50, 0x36, 0xf7, 0x79, 0x2c, 0xed, - 0x3d, 0x2d, 0xfd, 0xd1, 0x46, 0xd2, 0x0f, 0xcb, 0xcc, 0xef, 0xe2, 0x51, 0x2b, 0x17, 0x9e, 0xde, - 0x48, 0x5e, 0x86, 0x24, 0x44, 0xe0, 0x34, 0x42, 0x2a, 0x11, 0xc4, 0x6f, 0x6a, 0xb4, 0xce, 0xad, - 0xc1, 0xe1, 0xd0, 0x5d, 0xab, 0x91, 0x7a, 0xce, 0xb7, 0x3a, 0x2f, 0xa8, 0x29, 0xc8, 0x29, 0x2c, - 0xc8, 0xea, 0x31, 0xf8, 0x0b, 0xe8, 0x5e, 0xdd, 0x66, 0x5f, 0x71, 0x7f, 0x41, 0xe8, 0x7c, 0xa1, - 0xec, 0x6b, 0xba, 0x99, 0x2f, 0x36, 0x6a, 0xe6, 0x51, 0x63, 0x2a, 0x0f, 0xf8, 0xd7, 0x9a, 0xc2, - 0xf4, 0xd5, 0x49, 0x57, 0xa2, 0xf0, 0x37, 0x0b, 0x9c, 0x55, 0x7b, 0x8c, 0x82, 0x80, 0x2a, 0xca, - 0x99, 0x1f, 0x0b, 0x1e, 0x73, 0x89, 0x42, 0x69, 0xef, 0xeb, 0x02, 0x6e, 0x6f, 0x35, 0xc8, 0x3b, - 0x86, 0x66, 0x62, 0x58, 0x4c, 0x09, 0x37, 0xf1, 0x1a, 0x5c, 0xc2, 0x5f, 0x2d, 0xd0, 0xad, 0xaa, - 0x10, 0x24, 0xe2, 0x29, 0x0a, 0x6b, 0x45, 0x5c, 0xd7, 0x45, 0x7c, 0xb9, 0x55, 0x11, 0xd3, 0x82, + 0x51, 0xa6, 0x5c, 0x2c, 0xb2, 0x58, 0x71, 0x77, 0x49, 0x32, 0x83, 0xf6, 0x7f, 0x6f, 0x83, 0x1b, + 0x5f, 0x16, 0xeb, 0x1f, 0x28, 0xa4, 0x08, 0x1c, 0x80, 0x93, 0x14, 0x85, 0x92, 0x28, 0x3f, 0x89, + 0x03, 0xa4, 0x88, 0x4f, 0x03, 0xdb, 0x3a, 0xb7, 0x06, 0xad, 0xe9, 0x71, 0x11, 0x7f, 0xa4, 0xc3, + 0xe3, 0x00, 0xfe, 0x04, 0x5e, 0x2b, 0x55, 0x7d, 0x99, 0xe7, 0x4a, 0x7b, 0xf7, 0x7c, 0x6f, 0x70, + 0x38, 0x1c, 0x3a, 0x1b, 0x6c, 0xb7, 0x73, 0xcf, 0xe4, 0x6a, 0xd9, 0x51, 0xef, 0xf9, 0xcb, 0x5b, + 0x3b, 0x7f, 0xbd, 0xbc, 0xd5, 0xc9, 0x50, 0x14, 0x7e, 0xd6, 0xbf, 0x42, 0xdc, 0x9f, 0x1e, 0xe3, + 0xfa, 0x72, 0x09, 0xbf, 0x07, 0x47, 0x09, 0x9b, 0x71, 0x16, 0x50, 0x36, 0xf7, 0x79, 0x2c, 0xed, + 0x3d, 0x2d, 0xfd, 0xd1, 0x46, 0xd2, 0x8f, 0xca, 0xcc, 0x6f, 0xe3, 0x51, 0x2b, 0x17, 0x9e, 0xde, + 0x48, 0x5e, 0x85, 0x24, 0x44, 0xe0, 0x34, 0x42, 0x2a, 0x11, 0xc4, 0x6f, 0x6a, 0xb4, 0xce, 0xad, + 0xc1, 0xe1, 0xd0, 0x5d, 0xab, 0x91, 0x7a, 0xce, 0x37, 0x3a, 0x2f, 0xa8, 0x29, 0xc8, 0x29, 0x2c, + 0xc8, 0xea, 0x31, 0xf8, 0x33, 0xe8, 0x5e, 0xdd, 0x66, 0x5f, 0x71, 0x7f, 0x41, 0xe8, 0x7c, 0xa1, + 0xec, 0x6b, 0xba, 0x99, 0xcf, 0x37, 0x6a, 0xe6, 0x71, 0x63, 0x2a, 0x0f, 0xf9, 0x57, 0x9a, 0xc2, + 0xf4, 0xd5, 0x49, 0x57, 0xa2, 0xf0, 0x57, 0x0b, 0x9c, 0x55, 0x7b, 0x8c, 0x82, 0x80, 0x2a, 0xca, + 0x99, 0x1f, 0x0b, 0x1e, 0x73, 0x89, 0x42, 0x69, 0xef, 0xeb, 0x02, 0xee, 0x6c, 0x35, 0xc8, 0xbb, + 0x86, 0x66, 0x62, 0x58, 0x4c, 0x09, 0x37, 0xf1, 0x1a, 0x5c, 0xc2, 0x5f, 0x2c, 0xd0, 0xad, 0xaa, + 0x10, 0x24, 0xe2, 0x29, 0x0a, 0x6b, 0x45, 0x5c, 0xd7, 0x45, 0x7c, 0xb1, 0x55, 0x11, 0xd3, 0x82, 0xe5, 0x4a, 0x0d, 0x36, 0x5e, 0x0d, 0x4b, 0x38, 0x06, 0xfb, 0x31, 0x12, 0x28, 0x92, 0xf6, 0x81, 0x1e, 0xee, 0xfb, 0x1b, 0xa9, 0x4d, 0x74, 0x8a, 0x21, 0x37, 0x04, 0xba, 0x9b, 0x14, 0x85, 0x34, - 0x40, 0x8a, 0x0b, 0xbf, 0xea, 0x2b, 0x4e, 0x66, 0xf9, 0x7d, 0xb3, 0xdb, 0x5b, 0x74, 0xf3, 0xa8, - 0xa4, 0x29, 0xdb, 0x9a, 0x24, 0xb3, 0x6f, 0x48, 0x56, 0x76, 0x93, 0xae, 0x80, 0x73, 0x0d, 0xf8, - 0xd4, 0x02, 0x67, 0x15, 0x28, 0xfd, 0x59, 0xe6, 0xd7, 0x87, 0x2c, 0x6c, 0xf0, 0x2a, 0x35, 0x8c, - 0xb2, 0xda, 0x84, 0xc5, 0xbf, 0x6a, 0x90, 0x4d, 0x1c, 0xa6, 0xe0, 0xcd, 0x86, 0xa8, 0xcc, 0xcf, - 0x75, 0x2c, 0x12, 0x46, 0xec, 0x43, 0x2d, 0xff, 0xd9, 0xb6, 0xa7, 0x4a, 0xc8, 0x07, 0x7c, 0x92, - 0x13, 0x18, 0xed, 0x53, 0xbc, 0x02, 0xeb, 0x3f, 0x6d, 0x81, 0xa3, 0x86, 0xa7, 0xc0, 0x9b, 0xe0, - 0xa0, 0x10, 0x31, 0x16, 0xd6, 0x9e, 0x5e, 0xd7, 0xdf, 0xe3, 0x00, 0xbe, 0x0d, 0x00, 0x5e, 0x20, - 0xc6, 0x48, 0x98, 0x83, 0xbb, 0x1a, 0x6c, 0x9b, 0xc8, 0x38, 0x80, 0x67, 0xa0, 0x8d, 0x43, 0x4a, - 0x98, 0xca, 0xd1, 0x3d, 0x8d, 0x1e, 0x14, 0x81, 0x71, 0x00, 0xdf, 0x03, 0xc7, 0x94, 0x51, 0x45, - 0x51, 0x58, 0x5e, 0xd7, 0x96, 0xf6, 0xc7, 0x23, 0x13, 0x35, 0x57, 0x6c, 0x06, 0x4e, 0xaa, 0x7d, - 0x30, 0x8e, 0x6c, 0x5f, 0xd3, 0x67, 0xcc, 0x5b, 0xbb, 0x01, 0x95, 0xdb, 0xa7, 0x9e, 0x53, 0x77, - 0x65, 0xd3, 0x78, 0xe5, 0xb7, 0x06, 0x83, 0x0a, 0x74, 0x62, 0x52, 0xf8, 0x93, 0x71, 0x93, 0xbc, - 0x87, 0x39, 0x29, 0x2f, 0xf0, 0xa7, 0xff, 0x65, 0x55, 0xd5, 0x80, 0xef, 0x13, 0x75, 0x57, 0xa7, - 0x4d, 0x10, 0x5e, 0x12, 0x75, 0x0f, 0x29, 0x54, 0xee, 0xb4, 0x61, 0x2f, 0x3c, 0xa6, 0x58, 0x24, - 0xe1, 0x07, 0x00, 0xca, 0x10, 0xc9, 0x85, 0x1f, 0xf0, 0x9f, 0x98, 0xa2, 0x11, 0xf1, 0x11, 0x5e, - 0xea, 0xdb, 0xda, 0x9e, 0x9e, 0x68, 0xe4, 0x9e, 0x01, 0xee, 0xe0, 0x25, 0xfc, 0x11, 0xbc, 0xd1, - 0x70, 0x51, 0x9f, 0xb2, 0x80, 0x3c, 0xb1, 0x0f, 0x74, 0x81, 0x9f, 0x6c, 0x76, 0x14, 0x25, 0xae, - 0x9b, 0xa7, 0x29, 0xee, 0xf5, 0xba, 0x67, 0x8f, 0x73, 0xd2, 0xfe, 0x63, 0xd0, 0x59, 0x6d, 0x87, - 0x5b, 0x3c, 0x6b, 0x1d, 0xb0, 0x6f, 0xc6, 0xba, 0xab, 0x71, 0xf3, 0x35, 0xfa, 0xfe, 0xd9, 0x45, - 0xcf, 0x7a, 0x7e, 0xd1, 0xb3, 0xfe, 0xba, 0xe8, 0x59, 0xbf, 0x5f, 0xf6, 0x76, 0x9e, 0x5f, 0xf6, - 0x76, 0xfe, 0xbc, 0xec, 0xed, 0x3c, 0xbe, 0x3d, 0xa7, 0x6a, 0x91, 0xcc, 0x1c, 0xcc, 0x23, 0x17, - 0x73, 0x19, 0x71, 0xe9, 0xbe, 0xec, 0xea, 0xc3, 0xea, 0x99, 0x4e, 0x87, 0xee, 0x93, 0xe6, 0x7f, - 0x02, 0x95, 0xc5, 0x44, 0xce, 0xf6, 0xf5, 0x4b, 0xfc, 0xf1, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, - 0xae, 0x7b, 0x97, 0x91, 0xd8, 0x08, 0x00, 0x00, + 0x40, 0x8a, 0x0b, 0xbf, 0xea, 0x2b, 0x4e, 0x66, 0xf9, 0x7d, 0xb3, 0xdb, 0x5b, 0x74, 0xf3, 0xb8, + 0xa4, 0x29, 0xdb, 0x9a, 0x24, 0xb3, 0xaf, 0x49, 0x56, 0x76, 0x93, 0xae, 0x80, 0x73, 0x0d, 0xf8, + 0xcc, 0x02, 0x67, 0x15, 0x28, 0xfd, 0x59, 0xe6, 0xd7, 0x87, 0x2c, 0x6c, 0xf0, 0x7f, 0x6a, 0x18, + 0x65, 0xb5, 0x09, 0x8b, 0x7f, 0xd4, 0x20, 0x9b, 0x38, 0x4c, 0xc1, 0x9b, 0x0d, 0x51, 0x99, 0x9f, + 0xeb, 0x58, 0x24, 0x8c, 0xd8, 0x87, 0x5a, 0xfe, 0xd3, 0x6d, 0x4f, 0x95, 0x90, 0x0f, 0xf9, 0x24, + 0x27, 0x30, 0xda, 0xa7, 0x78, 0x05, 0xd6, 0x7f, 0xd6, 0x02, 0x47, 0x0d, 0x4f, 0x81, 0x37, 0xc1, + 0x41, 0x21, 0x62, 0x2c, 0xac, 0x3d, 0xbd, 0xae, 0xbf, 0xc7, 0x01, 0x7c, 0x1b, 0x00, 0xbc, 0x40, + 0x8c, 0x91, 0x30, 0x07, 0x77, 0x35, 0xd8, 0x36, 0x91, 0x71, 0x00, 0xcf, 0x40, 0x1b, 0x87, 0x94, + 0x30, 0x95, 0xa3, 0x7b, 0x1a, 0x3d, 0x28, 0x02, 0xe3, 0x00, 0xbe, 0x07, 0x8e, 0x29, 0xa3, 0x8a, + 0xa2, 0xb0, 0xbc, 0xae, 0x2d, 0xed, 0x8f, 0x47, 0x26, 0x6a, 0xae, 0xd8, 0x0c, 0x9c, 0x54, 0xfb, + 0x60, 0x1c, 0xd9, 0xbe, 0xa6, 0xcf, 0x98, 0xb7, 0x76, 0x03, 0x2a, 0xb7, 0x4f, 0x3d, 0xa7, 0xee, + 0xca, 0xa6, 0xf1, 0xca, 0x6f, 0x0d, 0x06, 0x15, 0xe8, 0xc4, 0xa4, 0xf0, 0x27, 0xe3, 0x26, 0x79, + 0x0f, 0x73, 0x52, 0x5e, 0xe0, 0x4f, 0xfe, 0xcd, 0xaa, 0xaa, 0x01, 0x3f, 0x20, 0xea, 0x9e, 0x4e, + 0x9b, 0x20, 0xbc, 0x24, 0xea, 0x3e, 0x52, 0xa8, 0xdc, 0x69, 0xc3, 0x5e, 0x78, 0x4c, 0xb1, 0x48, + 0xc2, 0x0f, 0x00, 0x94, 0x21, 0x92, 0x0b, 0x3f, 0xe0, 0x3f, 0x32, 0x45, 0x23, 0xe2, 0x23, 0xbc, + 0xd4, 0xb7, 0xb5, 0x3d, 0x3d, 0xd1, 0xc8, 0x7d, 0x03, 0xdc, 0xc5, 0x4b, 0xf8, 0x03, 0x78, 0xa3, + 0xe1, 0xa2, 0x3e, 0x65, 0x01, 0x79, 0x6a, 0x1f, 0xe8, 0x02, 0x3f, 0xde, 0xec, 0x28, 0x4a, 0x5c, + 0x37, 0x4f, 0x53, 0xdc, 0xeb, 0x75, 0xcf, 0x1e, 0xe7, 0xa4, 0xfd, 0x27, 0xa0, 0xb3, 0xda, 0x0e, + 0xb7, 0x78, 0xd6, 0x3a, 0x60, 0xdf, 0x8c, 0x75, 0x57, 0xe3, 0xe6, 0x6b, 0xf4, 0xdd, 0xf3, 0x8b, + 0x9e, 0xf5, 0xe2, 0xa2, 0x67, 0xfd, 0x79, 0xd1, 0xb3, 0x7e, 0xbb, 0xec, 0xed, 0xbc, 0xb8, 0xec, + 0xed, 0xfc, 0x71, 0xd9, 0xdb, 0x79, 0x72, 0x67, 0x4e, 0xd5, 0x22, 0x99, 0x39, 0x98, 0x47, 0x2e, + 0xe6, 0x32, 0xe2, 0xd2, 0x7d, 0xd5, 0xd5, 0x87, 0xd5, 0x33, 0x9d, 0xde, 0x76, 0x9f, 0x36, 0xff, + 0x13, 0xa8, 0x2c, 0x26, 0x72, 0xb6, 0xaf, 0x5f, 0xe2, 0xdb, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, + 0xa6, 0x98, 0xf7, 0xad, 0xd8, 0x08, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/ccv/provider/types/provider.pb.go b/x/ccv/provider/types/provider.pb.go index 49c2bb7cda..e651a5415c 100644 --- a/x/ccv/provider/types/provider.pb.go +++ b/x/ccv/provider/types/provider.pb.go @@ -1249,104 +1249,104 @@ var fileDescriptor_f22ec409a72b7b72 = []byte{ // 1598 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x57, 0x4b, 0x73, 0xdc, 0xc6, 0x11, 0x26, 0xb8, 0x7c, 0xed, 0x2c, 0x1f, 0x12, 0x44, 0x59, 0x4b, 0x85, 0x59, 0xae, 0xe0, 0xc4, - 0xc5, 0x94, 0xcb, 0xd8, 0x90, 0xbe, 0xa4, 0x54, 0x71, 0xb9, 0xc8, 0x95, 0x65, 0xd1, 0x8c, 0xad, + 0xc5, 0x94, 0xcb, 0xd8, 0x90, 0xba, 0xa4, 0x54, 0x71, 0xb9, 0xc8, 0x95, 0x65, 0xd1, 0x8c, 0xad, 0x35, 0xc8, 0x50, 0x95, 0xe4, 0x80, 0x1a, 0x0c, 0x5a, 0xbb, 0x53, 0x04, 0x30, 0xd0, 0xcc, 0x00, 0xd2, 0x5e, 0x72, 0xce, 0xd1, 0xb9, 0xb9, 0x92, 0x8b, 0xf3, 0x0b, 0xf2, 0x37, 0x7c, 0xf4, 0x31, - 0x27, 0x3b, 0x45, 0x1d, 0x72, 0xc8, 0x9f, 0x48, 0xcd, 0xe0, 0xcd, 0x87, 0xb2, 0xaa, 0xc4, 0x37, + 0x27, 0x3b, 0x45, 0x1d, 0x72, 0xc8, 0x9f, 0x48, 0xcd, 0xe0, 0xcd, 0x87, 0xb3, 0xaa, 0xc4, 0x37, 0xcc, 0x4c, 0xf7, 0xd7, 0xdd, 0xd3, 0xdd, 0x5f, 0x0f, 0xd0, 0x3e, 0x8d, 0x24, 0x70, 0x32, 0xc1, 0x34, 0x72, 0x05, 0x90, 0x84, 0x53, 0x39, 0x1d, 0x10, 0x92, 0x0e, 0x62, 0xce, 0x52, 0xea, 0x03, 0x1f, 0xa4, 0x7b, 0xe5, 0xb7, 0x1d, 0x73, 0x26, 0x99, 0xf9, 0xee, 0x35, 0x3a, 0x36, 0x21, 0xa9, 0x5d, 0xca, 0xa5, 0x7b, 0xf7, 0x37, 0xc7, 0x6c, 0xcc, 0xb4, 0xfc, 0x40, 0x7d, 0x65, 0xaa, 0xf7, - 0x77, 0xc6, 0x8c, 0x8d, 0x03, 0x18, 0xe8, 0x95, 0x97, 0x3c, 0x1f, 0x48, 0x1a, 0x82, 0x90, 0x38, + 0x77, 0xc6, 0x8c, 0x8d, 0x03, 0x18, 0xe8, 0x95, 0x97, 0xbc, 0x18, 0x48, 0x1a, 0x82, 0x90, 0x38, 0x8c, 0x73, 0x81, 0xde, 0x65, 0x01, 0x3f, 0xe1, 0x58, 0x52, 0x16, 0x15, 0x00, 0xd4, 0x23, 0x03, 0xc2, 0x38, 0x0c, 0x48, 0x40, 0x21, 0x92, 0xca, 0xbd, 0xec, 0x2b, 0x17, 0x18, 0x28, 0x81, 0x80, 0x8e, 0x27, 0x32, 0xdb, 0x16, 0x03, 0x09, 0x91, 0x0f, 0x3c, 0xa4, 0x99, 0x70, 0xb5, 0xca, 0x15, 0xb6, 0x6b, 0xe7, 0x84, 0x4f, 0x63, 0xc9, 0x06, 0xe7, 0x30, 0x15, 0xf9, 0xe9, 0x7b, 0x84, 0x89, 0x90, 0x89, 0x01, 0xa8, 0xc0, 0x22, 0x02, 0x83, 0x74, 0xcf, 0x03, 0x89, 0xf7, 0xca, 0x8d, 0xc2, - 0xef, 0x5c, 0xce, 0xc3, 0xa2, 0x92, 0x21, 0x8c, 0xe6, 0x7e, 0x5b, 0x3f, 0x2c, 0xa1, 0xee, 0x90, + 0xef, 0x5c, 0xce, 0xc3, 0xa2, 0x92, 0x21, 0x8c, 0xe6, 0x7e, 0x5b, 0xdf, 0x2f, 0xa1, 0xee, 0x90, 0x45, 0x22, 0x09, 0x81, 0x1f, 0xf8, 0x3e, 0x55, 0x21, 0x8d, 0x38, 0x8b, 0x99, 0xc0, 0x81, 0xb9, 0x89, 0x16, 0x25, 0x95, 0x01, 0x74, 0x8d, 0xbe, 0xb1, 0xdb, 0x76, 0xb2, 0x85, 0xd9, 0x47, 0x1d, 0x1f, 0x04, 0xe1, 0x34, 0x56, 0xc2, 0xdd, 0x79, 0x7d, 0x56, 0xdf, 0x32, 0xb7, 0xd0, 0x4a, 0x96, - 0x05, 0xea, 0x77, 0x5b, 0xfa, 0x78, 0x59, 0xaf, 0x8f, 0x7c, 0xf3, 0x53, 0xb4, 0x4e, 0x23, 0x2a, + 0x05, 0xea, 0x77, 0x5b, 0xfa, 0x78, 0x59, 0xaf, 0x8f, 0x7c, 0xf3, 0x13, 0xb4, 0x4e, 0x23, 0x2a, 0x29, 0x0e, 0xdc, 0x09, 0xa8, 0xdb, 0xe8, 0x2e, 0xf4, 0x8d, 0xdd, 0xce, 0xfe, 0x7d, 0x9b, 0x7a, - 0xc4, 0x56, 0x17, 0x68, 0xe7, 0xd7, 0x96, 0xee, 0xd9, 0x4f, 0xb4, 0xc4, 0xe1, 0xc2, 0xb7, 0xdf, - 0xef, 0xcc, 0x39, 0x6b, 0xb9, 0x5e, 0xb6, 0x69, 0x3e, 0x40, 0xab, 0x63, 0x88, 0x40, 0x50, 0xe1, - 0x4e, 0xb0, 0x98, 0x74, 0x17, 0xfb, 0xc6, 0xee, 0xaa, 0xd3, 0xc9, 0xf7, 0x9e, 0x60, 0x31, 0x31, + 0xc4, 0x56, 0x17, 0x68, 0xe7, 0xd7, 0x96, 0xee, 0xd9, 0x4f, 0xb5, 0xc4, 0xe1, 0xc2, 0x37, 0xdf, + 0xed, 0xcc, 0x39, 0x6b, 0xb9, 0x5e, 0xb6, 0x69, 0x3e, 0x40, 0xab, 0x63, 0x88, 0x40, 0x50, 0xe1, + 0x4e, 0xb0, 0x98, 0x74, 0x17, 0xfb, 0xc6, 0xee, 0xaa, 0xd3, 0xc9, 0xf7, 0x9e, 0x62, 0x31, 0x31, 0x77, 0x50, 0xc7, 0xa3, 0x11, 0xe6, 0xd3, 0x4c, 0x62, 0x49, 0x4b, 0xa0, 0x6c, 0x4b, 0x0b, 0x0c, - 0x11, 0x12, 0x31, 0x7e, 0x19, 0xb9, 0x2a, 0xdb, 0xdd, 0xe5, 0xdc, 0x91, 0x2c, 0xd3, 0x76, 0x91, - 0x69, 0xfb, 0xb4, 0x28, 0x85, 0xc3, 0x15, 0xe5, 0xc8, 0x57, 0x3f, 0xec, 0x18, 0x4e, 0x5b, 0xeb, - 0xa9, 0x13, 0xf3, 0x0b, 0x74, 0x2b, 0x89, 0x3c, 0x16, 0xf9, 0x34, 0x1a, 0xbb, 0x31, 0x70, 0xca, - 0xfc, 0xee, 0x8a, 0x86, 0xda, 0xba, 0x02, 0xf5, 0x28, 0x2f, 0x9a, 0x0c, 0xe9, 0x6b, 0x85, 0xb4, - 0x51, 0x2a, 0x8f, 0xb4, 0xae, 0xf9, 0x25, 0x32, 0x09, 0x49, 0xb5, 0x4b, 0x2c, 0x91, 0x05, 0x62, + 0x11, 0x12, 0x31, 0x7e, 0x15, 0xb9, 0x2a, 0xdb, 0xdd, 0xe5, 0xdc, 0x91, 0x2c, 0xd3, 0x76, 0x91, + 0x69, 0xfb, 0xb4, 0x28, 0x85, 0xc3, 0x15, 0xe5, 0xc8, 0x97, 0xdf, 0xef, 0x18, 0x4e, 0x5b, 0xeb, + 0xa9, 0x13, 0xf3, 0x73, 0x74, 0x2b, 0x89, 0x3c, 0x16, 0xf9, 0x34, 0x1a, 0xbb, 0x31, 0x70, 0xca, + 0xfc, 0xee, 0x8a, 0x86, 0xda, 0xba, 0x02, 0xf5, 0x38, 0x2f, 0x9a, 0x0c, 0xe9, 0x2b, 0x85, 0xb4, + 0x51, 0x2a, 0x8f, 0xb4, 0xae, 0xf9, 0x05, 0x32, 0x09, 0x49, 0xb5, 0x4b, 0x2c, 0x91, 0x05, 0x62, 0x7b, 0x76, 0xc4, 0x5b, 0x84, 0xa4, 0xa7, 0x99, 0x76, 0x0e, 0xf9, 0x07, 0x74, 0x4f, 0x72, 0x1c, - 0x89, 0xe7, 0xc0, 0x2f, 0xe3, 0xa2, 0xd9, 0x71, 0xef, 0x16, 0x18, 0x4d, 0xf0, 0x27, 0xa8, 0x4f, - 0xf2, 0x02, 0x72, 0x39, 0xf8, 0x54, 0x48, 0x4e, 0xbd, 0x44, 0xe9, 0xba, 0xcf, 0x39, 0x26, 0xba, - 0x46, 0x3a, 0xba, 0x08, 0x7a, 0x85, 0x9c, 0xd3, 0x10, 0x7b, 0x9c, 0x4b, 0x99, 0x4f, 0xd1, 0xcf, + 0x89, 0x17, 0xc0, 0x2f, 0xe3, 0xa2, 0xd9, 0x71, 0xef, 0x16, 0x18, 0x4d, 0xf0, 0xa7, 0xa8, 0x4f, + 0xf2, 0x02, 0x72, 0x39, 0xf8, 0x54, 0x48, 0x4e, 0xbd, 0x44, 0xe9, 0xba, 0x2f, 0x38, 0x26, 0xba, + 0x46, 0x3a, 0xba, 0x08, 0x7a, 0x85, 0x9c, 0xd3, 0x10, 0x7b, 0x92, 0x4b, 0x99, 0xcf, 0xd0, 0xcf, 0xbc, 0x80, 0x91, 0x73, 0xa1, 0x9c, 0x73, 0x1b, 0x48, 0xda, 0x74, 0x48, 0x85, 0x50, 0x68, 0xab, - 0x7d, 0x63, 0xb7, 0xe5, 0x3c, 0xc8, 0x64, 0x47, 0xc0, 0x1f, 0xd5, 0x24, 0x4f, 0x6b, 0x82, 0xe6, + 0x7d, 0x63, 0xb7, 0xe5, 0x3c, 0xc8, 0x64, 0x47, 0xc0, 0x1f, 0xd7, 0x24, 0x4f, 0x6b, 0x82, 0xe6, 0x07, 0xc8, 0x9c, 0x50, 0x21, 0x19, 0xa7, 0x04, 0x07, 0x2e, 0x44, 0x92, 0x53, 0x10, 0xdd, 0x35, - 0xad, 0x7e, 0xbb, 0x3a, 0xf9, 0x24, 0x3b, 0x30, 0x3f, 0x43, 0x0f, 0x6e, 0x34, 0xea, 0x92, 0x09, - 0x8e, 0x22, 0x08, 0xba, 0xeb, 0x3a, 0x94, 0x1d, 0xff, 0x06, 0x9b, 0xc3, 0x4c, 0xec, 0xe1, 0xca, - 0x9f, 0xbe, 0xd9, 0x99, 0xfb, 0xfa, 0x9b, 0x9d, 0x39, 0xeb, 0xef, 0x06, 0xba, 0x37, 0x2c, 0x03, + 0xad, 0x7e, 0xbb, 0x3a, 0xf9, 0x38, 0x3b, 0x30, 0x3f, 0x45, 0x0f, 0x6e, 0x34, 0xea, 0x92, 0x09, + 0x8e, 0x22, 0x08, 0xba, 0xeb, 0x3a, 0x94, 0x1d, 0xff, 0x06, 0x9b, 0xc3, 0x4c, 0xec, 0xd1, 0xca, + 0x9f, 0xbe, 0xde, 0x99, 0xfb, 0xea, 0xeb, 0x9d, 0x39, 0xeb, 0xef, 0x06, 0xba, 0x37, 0x2c, 0x03, 0x0f, 0x59, 0x8a, 0x83, 0x1f, 0xb3, 0xc1, 0x0e, 0x50, 0x5b, 0x48, 0x16, 0x67, 0x25, 0xbd, 0xf0, - 0x16, 0x25, 0xbd, 0xa2, 0xd4, 0xd4, 0x81, 0xf5, 0x57, 0x03, 0x6d, 0x7e, 0xf2, 0x22, 0xa1, 0x29, + 0x16, 0x25, 0xbd, 0xa2, 0xd4, 0xd4, 0x81, 0xf5, 0x57, 0x03, 0x6d, 0x7e, 0xfc, 0x32, 0xa1, 0x29, 0x23, 0xf8, 0xff, 0xc2, 0x07, 0xc7, 0x68, 0x0d, 0x6a, 0x78, 0xa2, 0xdb, 0xea, 0xb7, 0x76, 0x3b, 0xfb, 0x3f, 0xb7, 0x33, 0x72, 0xb2, 0x4b, 0xce, 0xca, 0x09, 0xca, 0xae, 0x5b, 0x77, 0x9a, 0xba, - 0xd6, 0xbf, 0x0d, 0x74, 0xeb, 0xd3, 0x80, 0x79, 0x38, 0x38, 0x09, 0xb0, 0x98, 0xa8, 0xe4, 0x4d, - 0x55, 0xd4, 0x1c, 0xf2, 0xae, 0xd1, 0xde, 0xcd, 0x1c, 0xb5, 0x52, 0xd3, 0x7d, 0xfc, 0x31, 0xba, - 0x5d, 0xd6, 0x71, 0x79, 0xb9, 0x3a, 0x98, 0xc3, 0x3b, 0x17, 0xdf, 0xef, 0x6c, 0x14, 0x39, 0x1c, - 0xea, 0x8b, 0x7e, 0xe4, 0x6c, 0x90, 0xc6, 0x86, 0x6f, 0xf6, 0x50, 0x87, 0x7a, 0xc4, 0x15, 0xf0, - 0xc2, 0x8d, 0x92, 0x50, 0xe7, 0x65, 0xc1, 0x69, 0x53, 0x8f, 0x9c, 0xc0, 0x8b, 0x2f, 0x92, 0xd0, - 0xfc, 0x10, 0xbd, 0x53, 0x0c, 0x22, 0x37, 0xc5, 0x81, 0xab, 0xf4, 0x5d, 0xec, 0xfb, 0x5c, 0xa7, - 0x69, 0xd5, 0xb9, 0x53, 0x9c, 0x9e, 0xe1, 0x40, 0x19, 0x3b, 0xf0, 0x7d, 0x6e, 0xfd, 0x6b, 0x11, - 0x2d, 0x8d, 0x30, 0xc7, 0xa1, 0x30, 0x4f, 0xd1, 0x86, 0x84, 0x30, 0x0e, 0xb0, 0x04, 0x37, 0xe3, - 0xc8, 0x3c, 0xd2, 0xf7, 0x35, 0x77, 0xd6, 0x67, 0x8b, 0x5d, 0x9b, 0x26, 0xe9, 0x9e, 0x3d, 0xd4, - 0xbb, 0x27, 0x12, 0x4b, 0x70, 0xd6, 0x0b, 0x8c, 0x6c, 0xd3, 0xfc, 0x15, 0xea, 0x4a, 0x9e, 0x08, - 0x59, 0xb1, 0x57, 0xd5, 0xb6, 0x59, 0x2a, 0xdf, 0x29, 0xce, 0xb3, 0x86, 0x2f, 0xdb, 0xf5, 0x7a, - 0xa2, 0x6a, 0xfd, 0x2f, 0x44, 0x75, 0x82, 0xee, 0x28, 0x96, 0xbf, 0x8c, 0xb9, 0x30, 0x3b, 0xe6, - 0x6d, 0xa5, 0xdf, 0x04, 0xfd, 0x12, 0x99, 0xa9, 0x20, 0x97, 0x31, 0x17, 0xdf, 0xc2, 0xcf, 0x54, - 0x90, 0x26, 0xa4, 0x8f, 0xb6, 0x85, 0x2a, 0x3e, 0x37, 0x04, 0xa9, 0x69, 0x2f, 0x0e, 0x20, 0xa2, - 0x62, 0x52, 0x80, 0x2f, 0xcd, 0x0e, 0xbe, 0xa5, 0x81, 0x3e, 0x57, 0x38, 0x4e, 0x01, 0x93, 0x5b, - 0x19, 0xa2, 0xde, 0xf5, 0x56, 0xca, 0x04, 0x2d, 0xeb, 0x04, 0xfd, 0xe4, 0x1a, 0x88, 0x32, 0x4b, - 0xfb, 0xe8, 0x6e, 0x88, 0x5f, 0xb9, 0x72, 0xc2, 0x99, 0x94, 0x01, 0xf8, 0x6e, 0x8c, 0xc9, 0x39, - 0x48, 0xa1, 0x67, 0x54, 0xcb, 0xb9, 0x13, 0xe2, 0x57, 0xa7, 0xc5, 0xd9, 0x28, 0x3b, 0x32, 0x05, - 0x7a, 0xaf, 0x46, 0xe9, 0x2f, 0x31, 0xf7, 0x5d, 0x1f, 0x22, 0x16, 0xba, 0x1c, 0xc6, 0x8a, 0xf7, - 0x70, 0xc6, 0xee, 0x00, 0xe5, 0x58, 0xca, 0x1b, 0x59, 0xbd, 0x32, 0xca, 0x26, 0x1e, 0x32, 0x1a, - 0xe5, 0xb3, 0xdb, 0xaa, 0x98, 0x5f, 0xa1, 0x3d, 0x52, 0x60, 0x4e, 0x0d, 0xeb, 0x31, 0x80, 0xe5, - 0xa1, 0xdb, 0x4f, 0x70, 0xe4, 0x8b, 0x09, 0x3e, 0x87, 0xcf, 0x41, 0x62, 0x1f, 0x4b, 0xdc, 0xe8, - 0x99, 0xe7, 0x00, 0x6e, 0xcc, 0x58, 0x90, 0xf5, 0x4c, 0x46, 0x41, 0x65, 0xcf, 0x3c, 0x06, 0x18, - 0x31, 0x16, 0xa8, 0x9e, 0x31, 0xbb, 0x68, 0x39, 0x05, 0x2e, 0xaa, 0x0a, 0x2e, 0x96, 0xd6, 0x2f, - 0x50, 0x5b, 0x93, 0xc6, 0x01, 0x39, 0x17, 0xe6, 0x36, 0x6a, 0x2b, 0x24, 0x10, 0x02, 0x44, 0xd7, - 0xe8, 0xb7, 0x76, 0xdb, 0x4e, 0xb5, 0x61, 0x49, 0xb4, 0x75, 0xd3, 0xbb, 0x48, 0x98, 0xcf, 0xd0, - 0x72, 0x0c, 0x7a, 0x68, 0x6b, 0xc5, 0xce, 0xfe, 0x47, 0xf6, 0x0c, 0x6f, 0x4f, 0xfb, 0x26, 0x40, - 0xa7, 0x40, 0xb3, 0x78, 0xf5, 0x1a, 0xbb, 0x34, 0x2b, 0x84, 0x79, 0x76, 0xd9, 0xe8, 0xaf, 0xdf, - 0xca, 0xe8, 0x25, 0xbc, 0xca, 0xe6, 0xfb, 0xa8, 0x73, 0x90, 0x85, 0xfd, 0x1b, 0x2a, 0xe4, 0xd5, - 0x6b, 0x59, 0xad, 0x5f, 0xcb, 0x67, 0x68, 0x3d, 0x1f, 0x71, 0xa7, 0x4c, 0x13, 0x9f, 0xf9, 0x53, - 0x84, 0xf2, 0xd9, 0xa8, 0x08, 0x33, 0x4b, 0x4b, 0x3b, 0xdf, 0x39, 0xf2, 0x1b, 0xa3, 0x6a, 0xbe, - 0x31, 0xaa, 0x2c, 0x07, 0x6d, 0x9c, 0x09, 0xf2, 0xdb, 0xe2, 0xfd, 0xf3, 0x34, 0x16, 0xe6, 0x5d, - 0xb4, 0xa4, 0x7a, 0x35, 0x07, 0x5a, 0x70, 0x16, 0x53, 0x41, 0x8e, 0x7c, 0x73, 0xb7, 0xfe, 0xc6, - 0x62, 0xb1, 0x4b, 0x7d, 0xd1, 0x9d, 0xef, 0xb7, 0x76, 0x17, 0x9c, 0xf5, 0xa4, 0x52, 0x3f, 0xf2, - 0x85, 0xf5, 0x3b, 0xd4, 0xa9, 0x01, 0x9a, 0xeb, 0x68, 0xbe, 0xc4, 0x9a, 0xa7, 0xbe, 0xf9, 0x10, - 0x6d, 0x55, 0x40, 0x4d, 0xba, 0xcf, 0x10, 0xdb, 0xce, 0xbd, 0x52, 0xa0, 0xc1, 0xf8, 0xc2, 0x7a, - 0x8a, 0x36, 0x8f, 0x2a, 0x72, 0x29, 0x87, 0x49, 0x23, 0x42, 0xa3, 0x39, 0x8c, 0xb7, 0x51, 0xbb, - 0xfc, 0x91, 0xd0, 0xd1, 0x2f, 0x38, 0xd5, 0x86, 0x15, 0xa2, 0x5b, 0x67, 0x82, 0x9c, 0x40, 0xe4, - 0x57, 0x60, 0x37, 0x5c, 0xc0, 0xe1, 0x65, 0xa0, 0x99, 0x1f, 0xaa, 0x95, 0xb9, 0x3f, 0x1b, 0xa8, - 0x7b, 0x0c, 0xd3, 0x03, 0x21, 0xe8, 0x38, 0x0a, 0x21, 0x92, 0x8a, 0x2c, 0x30, 0x01, 0xf5, 0x69, - 0xbe, 0x8b, 0xd6, 0xca, 0x46, 0x2b, 0xfb, 0x6b, 0xd5, 0x59, 0x2d, 0x36, 0x75, 0x63, 0x3d, 0x44, - 0x28, 0xe6, 0x90, 0xba, 0xc4, 0x3d, 0x87, 0x69, 0xee, 0xc6, 0x76, 0x7d, 0xd6, 0x64, 0xff, 0x29, - 0xf6, 0x28, 0xf1, 0x02, 0x4a, 0x8e, 0x61, 0xea, 0xac, 0x28, 0xf9, 0xe1, 0x31, 0x4c, 0xd5, 0xdb, - 0x21, 0x66, 0x2f, 0x81, 0xeb, 0x01, 0xd1, 0x72, 0xb2, 0x85, 0xf5, 0x17, 0x03, 0xdd, 0x3b, 0xc3, - 0x01, 0xf5, 0xb1, 0x64, 0xbc, 0xb8, 0xef, 0x51, 0xe2, 0x29, 0x8d, 0x37, 0xdc, 0xeb, 0x15, 0x6f, - 0xe7, 0xaf, 0xf1, 0xf6, 0x63, 0xb4, 0x5a, 0x66, 0x58, 0xf9, 0xdb, 0x9a, 0xc1, 0xdf, 0x4e, 0xa1, + 0xd6, 0xbf, 0x0d, 0x74, 0xeb, 0x93, 0x80, 0x79, 0x38, 0x38, 0x09, 0xb0, 0x98, 0xa8, 0xe4, 0x4d, + 0x55, 0xd4, 0x1c, 0xf2, 0xae, 0xd1, 0xde, 0xcd, 0x1c, 0xb5, 0x52, 0xd3, 0x7d, 0xfc, 0x11, 0xba, + 0x5d, 0xd6, 0x71, 0x79, 0xb9, 0x3a, 0x98, 0xc3, 0x3b, 0x17, 0xdf, 0xed, 0x6c, 0x14, 0x39, 0x1c, + 0xea, 0x8b, 0x7e, 0xec, 0x6c, 0x90, 0xc6, 0x86, 0x6f, 0xf6, 0x50, 0x87, 0x7a, 0xc4, 0x15, 0xf0, + 0xd2, 0x8d, 0x92, 0x50, 0xe7, 0x65, 0xc1, 0x69, 0x53, 0x8f, 0x9c, 0xc0, 0xcb, 0xcf, 0x93, 0xd0, + 0x7c, 0x88, 0xde, 0x29, 0x06, 0x91, 0x9b, 0xe2, 0xc0, 0x55, 0xfa, 0x2e, 0xf6, 0x7d, 0xae, 0xd3, + 0xb4, 0xea, 0xdc, 0x29, 0x4e, 0xcf, 0x70, 0xa0, 0x8c, 0x1d, 0xf8, 0x3e, 0xb7, 0xfe, 0xb5, 0x88, + 0x96, 0x46, 0x98, 0xe3, 0x50, 0x98, 0xa7, 0x68, 0x43, 0x42, 0x18, 0x07, 0x58, 0x82, 0x9b, 0x71, + 0x64, 0x1e, 0xe9, 0xfb, 0x9a, 0x3b, 0xeb, 0xb3, 0xc5, 0xae, 0x4d, 0x93, 0x74, 0xcf, 0x1e, 0xea, + 0xdd, 0x13, 0x89, 0x25, 0x38, 0xeb, 0x05, 0x46, 0xb6, 0x69, 0xfe, 0x0a, 0x75, 0x25, 0x4f, 0x84, + 0xac, 0xd8, 0xab, 0x6a, 0xdb, 0x2c, 0x95, 0xef, 0x14, 0xe7, 0x59, 0xc3, 0x97, 0xed, 0x7a, 0x3d, + 0x51, 0xb5, 0xfe, 0x17, 0xa2, 0x3a, 0x41, 0x77, 0x14, 0xcb, 0x5f, 0xc6, 0x5c, 0x98, 0x1d, 0xf3, + 0xb6, 0xd2, 0x6f, 0x82, 0x7e, 0x81, 0xcc, 0x54, 0x90, 0xcb, 0x98, 0x8b, 0x6f, 0xe1, 0x67, 0x2a, + 0x48, 0x13, 0xd2, 0x47, 0xdb, 0x42, 0x15, 0x9f, 0x1b, 0x82, 0xd4, 0xb4, 0x17, 0x07, 0x10, 0x51, + 0x31, 0x29, 0xc0, 0x97, 0x66, 0x07, 0xdf, 0xd2, 0x40, 0x9f, 0x29, 0x1c, 0xa7, 0x80, 0xc9, 0xad, + 0x0c, 0x51, 0xef, 0x7a, 0x2b, 0x65, 0x82, 0x96, 0x75, 0x82, 0x7e, 0x72, 0x0d, 0x44, 0x99, 0xa5, + 0x7d, 0x74, 0x37, 0xc4, 0xaf, 0x5d, 0x39, 0xe1, 0x4c, 0xca, 0x00, 0x7c, 0x37, 0xc6, 0xe4, 0x1c, + 0xa4, 0xd0, 0x33, 0xaa, 0xe5, 0xdc, 0x09, 0xf1, 0xeb, 0xd3, 0xe2, 0x6c, 0x94, 0x1d, 0x99, 0x02, + 0xbd, 0x57, 0xa3, 0xf4, 0x57, 0x98, 0xfb, 0xae, 0x0f, 0x11, 0x0b, 0x5d, 0x0e, 0x63, 0xc5, 0x7b, + 0x38, 0x63, 0x77, 0x80, 0x72, 0x2c, 0xe5, 0x8d, 0xac, 0x5e, 0x19, 0x65, 0x13, 0x0f, 0x19, 0x8d, + 0xf2, 0xd9, 0x6d, 0x55, 0xcc, 0xaf, 0xd0, 0x1e, 0x2b, 0x30, 0xa7, 0x86, 0xf5, 0x04, 0xc0, 0xf2, + 0xd0, 0xed, 0xa7, 0x38, 0xf2, 0xc5, 0x04, 0x9f, 0xc3, 0x67, 0x20, 0xb1, 0x8f, 0x25, 0x6e, 0xf4, + 0xcc, 0x0b, 0x00, 0x37, 0x66, 0x2c, 0xc8, 0x7a, 0x26, 0xa3, 0xa0, 0xb2, 0x67, 0x9e, 0x00, 0x8c, + 0x18, 0x0b, 0x54, 0xcf, 0x98, 0x5d, 0xb4, 0x9c, 0x02, 0x17, 0x55, 0x05, 0x17, 0x4b, 0xeb, 0x17, + 0xa8, 0xad, 0x49, 0xe3, 0x80, 0x9c, 0x0b, 0x73, 0x1b, 0xb5, 0x15, 0x12, 0x08, 0x01, 0xa2, 0x6b, + 0xf4, 0x5b, 0xbb, 0x6d, 0xa7, 0xda, 0xb0, 0x24, 0xda, 0xba, 0xe9, 0x5d, 0x24, 0xcc, 0xe7, 0x68, + 0x39, 0x06, 0x3d, 0xb4, 0xb5, 0x62, 0x67, 0xff, 0x43, 0x7b, 0x86, 0xb7, 0xa7, 0x7d, 0x13, 0xa0, + 0x53, 0xa0, 0x59, 0xbc, 0x7a, 0x8d, 0x5d, 0x9a, 0x15, 0xc2, 0x3c, 0xbb, 0x6c, 0xf4, 0xd7, 0x6f, + 0x65, 0xf4, 0x12, 0x5e, 0x65, 0xf3, 0x7d, 0xd4, 0x39, 0xc8, 0xc2, 0xfe, 0x0d, 0x15, 0xf2, 0xea, + 0xb5, 0xac, 0xd6, 0xaf, 0xe5, 0x53, 0xb4, 0x9e, 0x8f, 0xb8, 0x53, 0xa6, 0x89, 0xcf, 0xfc, 0x29, + 0x42, 0xf9, 0x6c, 0x54, 0x84, 0x99, 0xa5, 0xa5, 0x9d, 0xef, 0x1c, 0xf9, 0x8d, 0x51, 0x35, 0xdf, + 0x18, 0x55, 0x96, 0x83, 0x36, 0xce, 0x04, 0xf9, 0x6d, 0xf1, 0xfe, 0x79, 0x16, 0x0b, 0xf3, 0x2e, + 0x5a, 0x52, 0xbd, 0x9a, 0x03, 0x2d, 0x38, 0x8b, 0xa9, 0x20, 0x47, 0xbe, 0xb9, 0x5b, 0x7f, 0x63, + 0xb1, 0xd8, 0xa5, 0xbe, 0xe8, 0xce, 0xf7, 0x5b, 0xbb, 0x0b, 0xce, 0x7a, 0x52, 0xa9, 0x1f, 0xf9, + 0xc2, 0xfa, 0x1d, 0xea, 0xd4, 0x00, 0xcd, 0x75, 0x34, 0x5f, 0x62, 0xcd, 0x53, 0xdf, 0x7c, 0x84, + 0xb6, 0x2a, 0xa0, 0x26, 0xdd, 0x67, 0x88, 0x6d, 0xe7, 0x5e, 0x29, 0xd0, 0x60, 0x7c, 0x61, 0x3d, + 0x43, 0x9b, 0x47, 0x15, 0xb9, 0x94, 0xc3, 0xa4, 0x11, 0xa1, 0xd1, 0x1c, 0xc6, 0xdb, 0xa8, 0x5d, + 0xfe, 0x48, 0xe8, 0xe8, 0x17, 0x9c, 0x6a, 0xc3, 0x0a, 0xd1, 0xad, 0x33, 0x41, 0x4e, 0x20, 0xf2, + 0x2b, 0xb0, 0x1b, 0x2e, 0xe0, 0xf0, 0x32, 0xd0, 0xcc, 0x0f, 0xd5, 0xca, 0xdc, 0x9f, 0x0d, 0xd4, + 0x3d, 0x86, 0xe9, 0x81, 0x10, 0x74, 0x1c, 0x85, 0x10, 0x49, 0x45, 0x16, 0x98, 0x80, 0xfa, 0x34, + 0xdf, 0x45, 0x6b, 0x65, 0xa3, 0x95, 0xfd, 0xb5, 0xea, 0xac, 0x16, 0x9b, 0xba, 0xb1, 0x1e, 0x21, + 0x14, 0x73, 0x48, 0x5d, 0xe2, 0x9e, 0xc3, 0x34, 0x77, 0x63, 0xbb, 0x3e, 0x6b, 0xb2, 0xff, 0x14, + 0x7b, 0x94, 0x78, 0x01, 0x25, 0xc7, 0x30, 0x75, 0x56, 0x94, 0xfc, 0xf0, 0x18, 0xa6, 0xea, 0xed, + 0x10, 0xb3, 0x57, 0xc0, 0xf5, 0x80, 0x68, 0x39, 0xd9, 0xc2, 0xfa, 0x8b, 0x81, 0xee, 0x9d, 0xe1, + 0x80, 0xfa, 0x58, 0x32, 0x5e, 0xdc, 0xf7, 0x28, 0xf1, 0x94, 0xc6, 0x0f, 0xdc, 0xeb, 0x15, 0x6f, + 0xe7, 0xaf, 0xf1, 0xf6, 0x23, 0xb4, 0x5a, 0x66, 0x58, 0xf9, 0xdb, 0x9a, 0xc1, 0xdf, 0x4e, 0xa1, 0x71, 0x0c, 0x53, 0xeb, 0x8f, 0x35, 0xdf, 0x0e, 0xa7, 0xb5, 0xe6, 0xe5, 0xff, 0xc5, 0xb7, 0xd2, 0x6c, 0xdd, 0x37, 0x52, 0xd7, 0xbf, 0x12, 0x40, 0xeb, 0x6a, 0x00, 0xd6, 0xdf, 0x0c, 0xb4, 0x59, - 0xb7, 0x2a, 0x4e, 0xd9, 0x88, 0x27, 0x11, 0xbc, 0xc9, 0x7a, 0x55, 0x3f, 0xf3, 0xf5, 0xfa, 0x79, - 0x86, 0xd6, 0x1b, 0x4e, 0x89, 0xfc, 0x36, 0x7e, 0x39, 0x13, 0x85, 0xd4, 0xe8, 0xc1, 0x59, 0xab, - 0xc7, 0x21, 0x0e, 0x9f, 0x7d, 0x7b, 0xd1, 0x33, 0xbe, 0xbb, 0xe8, 0x19, 0xff, 0xbc, 0xe8, 0x19, - 0x5f, 0xbd, 0xee, 0xcd, 0x7d, 0xf7, 0xba, 0x37, 0xf7, 0x8f, 0xd7, 0xbd, 0xb9, 0xdf, 0x7f, 0x34, - 0xa6, 0x72, 0x92, 0x78, 0x36, 0x61, 0xe1, 0x20, 0xff, 0x09, 0xad, 0x6c, 0x7d, 0x50, 0xfe, 0xd3, - 0xa7, 0xfb, 0x83, 0x57, 0xcd, 0x1f, 0x7b, 0x39, 0x8d, 0x41, 0x78, 0x4b, 0xba, 0xac, 0x3f, 0xfc, - 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7b, 0x4c, 0xb0, 0x24, 0x09, 0x10, 0x00, 0x00, + 0xb7, 0x2a, 0x4e, 0xd9, 0x88, 0x27, 0x11, 0xfc, 0x90, 0xf5, 0xaa, 0x7e, 0xe6, 0xeb, 0xf5, 0xf3, + 0x1c, 0xad, 0x37, 0x9c, 0x12, 0xf9, 0x6d, 0xfc, 0x72, 0x26, 0x0a, 0xa9, 0xd1, 0x83, 0xb3, 0x56, + 0x8f, 0x43, 0x1c, 0x3e, 0xff, 0xe6, 0xa2, 0x67, 0x7c, 0x7b, 0xd1, 0x33, 0xfe, 0x79, 0xd1, 0x33, + 0xbe, 0x7c, 0xd3, 0x9b, 0xfb, 0xf6, 0x4d, 0x6f, 0xee, 0x1f, 0x6f, 0x7a, 0x73, 0xbf, 0xff, 0x70, + 0x4c, 0xe5, 0x24, 0xf1, 0x6c, 0xc2, 0xc2, 0x41, 0xfe, 0x13, 0x5a, 0xd9, 0xfa, 0xa0, 0xfc, 0xa7, + 0x4f, 0x1f, 0x0e, 0x5e, 0x37, 0x7f, 0xec, 0xe5, 0x34, 0x06, 0xe1, 0x2d, 0xe9, 0xb2, 0x7e, 0xf8, + 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x73, 0xaf, 0xd0, 0x18, 0x09, 0x10, 0x00, 0x00, } func (m *ConsumerAdditionProposal) Marshal() (dAtA []byte, err error) { diff --git a/x/ccv/provider/types/query.pb.go b/x/ccv/provider/types/query.pb.go index f8a4f04d23..f82376da05 100644 --- a/x/ccv/provider/types/query.pb.go +++ b/x/ccv/provider/types/query.pb.go @@ -1150,9 +1150,9 @@ var fileDescriptor_422512d7b7586cd7 = []byte{ 0x2c, 0xc3, 0xc5, 0xc1, 0x76, 0xf8, 0x4d, 0xc4, 0x96, 0x23, 0x3e, 0xc7, 0x34, 0xa2, 0x78, 0x52, 0xbd, 0xf3, 0x78, 0x37, 0x2f, 0x3d, 0xd9, 0xcd, 0x4b, 0x7f, 0xee, 0xe6, 0xa5, 0x87, 0x7b, 0xf9, 0xcc, 0x93, 0xbd, 0x7c, 0xe6, 0xd9, 0x5e, 0x3e, 0xf3, 0xd1, 0x7c, 0xcd, 0x66, 0x5b, 0x8d, 0x4d, - 0xd5, 0x24, 0x75, 0xcd, 0x24, 0xb4, 0x4e, 0x68, 0x5b, 0xbf, 0x77, 0x9a, 0xfd, 0x82, 0x92, 0x76, - 0x7f, 0xdf, 0xfc, 0xed, 0x78, 0x98, 0x6e, 0x4e, 0xf0, 0xaf, 0x95, 0xcb, 0xff, 0x07, 0x00, 0x00, - 0xff, 0xff, 0xb7, 0x37, 0x44, 0xeb, 0x42, 0x13, 0x00, 0x00, + 0xd5, 0x24, 0x75, 0xcd, 0x24, 0xb4, 0x4e, 0x68, 0x5b, 0xbf, 0x77, 0x9a, 0xfd, 0x82, 0xcb, 0xda, + 0xfd, 0x7d, 0xf3, 0xb7, 0xe3, 0x61, 0xba, 0x39, 0xc1, 0xbf, 0x56, 0x2e, 0xff, 0x1f, 0x00, 0x00, + 0xff, 0xff, 0xbf, 0xd4, 0x24, 0xd7, 0x42, 0x13, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/ccv/provider/types/tx.pb.go b/x/ccv/provider/types/tx.pb.go index 746f92b417..32bca37998 100644 --- a/x/ccv/provider/types/tx.pb.go +++ b/x/ccv/provider/types/tx.pb.go @@ -207,7 +207,7 @@ var fileDescriptor_43221a4391e9fbf4 = []byte{ // 453 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x93, 0x3d, 0x6b, 0x14, 0x41, 0x18, 0xc7, 0x77, 0x13, 0xd4, 0x64, 0x8c, 0x82, 0xc3, 0x15, 0x97, 0xf3, 0xd8, 0xd3, 0x15, 0x24, - 0x85, 0xee, 0x90, 0x58, 0x88, 0x01, 0x8b, 0x4b, 0x6c, 0x24, 0x5c, 0xb3, 0x8d, 0x60, 0xe1, 0xb1, + 0x85, 0xee, 0x10, 0x53, 0x88, 0x01, 0x8b, 0x4b, 0x6c, 0x24, 0x5c, 0xb3, 0x8d, 0x60, 0xe1, 0xb1, 0x37, 0x33, 0x4e, 0x06, 0xb3, 0xf3, 0x2c, 0xf3, 0xcc, 0xad, 0xd9, 0x6f, 0x60, 0xa9, 0x95, 0x6d, 0xbe, 0x81, 0x5f, 0x43, 0xb0, 0x49, 0x69, 0x25, 0x72, 0xd7, 0x58, 0xfb, 0x09, 0x64, 0xdf, 0x3c, 0xc5, 0xe3, 0x08, 0x92, 0xee, 0x79, 0xdb, 0xff, 0xff, 0xb7, 0x33, 0xf3, 0x90, 0x07, 0xda, 0x38, @@ -226,14 +226,14 @@ var fileDescriptor_43221a4391e9fbf4 = []byte{ 0x91, 0x60, 0x84, 0x2a, 0x96, 0x4a, 0xa3, 0x93, 0xb6, 0x9d, 0x88, 0xe5, 0xdb, 0xc4, 0x8a, 0x67, 0xd2, 0x40, 0x4a, 0x3b, 0xe4, 0x8a, 0x28, 0x83, 0x86, 0xbf, 0x4e, 0x68, 0x9f, 0x6c, 0x0a, 0x99, 0x01, 0x6a, 0x07, 0x0d, 0x79, 0xbc, 0x28, 0xfc, 0xe1, 0xbf, 0x43, 0xee, 0xaf, 0xd6, 0x6f, 0x49, - 0xf6, 0xbe, 0xac, 0x91, 0xf5, 0x11, 0x2a, 0xfa, 0xc1, 0x27, 0xb7, 0xfe, 0x3d, 0xc8, 0x27, 0xd1, - 0x05, 0x6e, 0x3c, 0x5a, 0xf6, 0xab, 0xbd, 0xe1, 0x7f, 0x7f, 0xda, 0xb2, 0xd1, 0x4f, 0x3e, 0xb9, - 0xbd, 0xea, 0x8c, 0x0e, 0x2f, 0x6a, 0xb1, 0x42, 0xa4, 0x77, 0x74, 0x09, 0x22, 0x2d, 0xf1, 0xc1, - 0x8b, 0xcf, 0xb3, 0xc0, 0x3f, 0x9f, 0x05, 0xfe, 0xf7, 0x59, 0xe0, 0xbf, 0x9f, 0x07, 0xde, 0xf9, - 0x3c, 0xf0, 0xbe, 0xce, 0x03, 0xef, 0xe5, 0x53, 0xa5, 0xdd, 0xf1, 0x74, 0x12, 0x71, 0x48, 0x9b, - 0xf7, 0xcd, 0x16, 0xbe, 0x0f, 0x7f, 0xaf, 0x5e, 0xbe, 0xc7, 0x4e, 0xff, 0xde, 0x3f, 0x57, 0x64, - 0x12, 0x27, 0x57, 0xab, 0x17, 0xff, 0xe8, 0x57, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7a, 0x53, 0xb5, - 0xb8, 0xb0, 0x03, 0x00, 0x00, + 0x1e, 0x7d, 0x59, 0x23, 0xeb, 0x23, 0x54, 0xf4, 0x83, 0x4f, 0x6e, 0xfd, 0x7b, 0x90, 0x4f, 0xa2, + 0x0b, 0xdc, 0x78, 0xb4, 0xec, 0x57, 0x7b, 0xc3, 0xff, 0xfe, 0xb4, 0x65, 0xa3, 0x9f, 0x7c, 0x72, + 0x7b, 0xd5, 0x19, 0x1d, 0x5e, 0xd4, 0x62, 0x85, 0x48, 0xef, 0xe8, 0x12, 0x44, 0x5a, 0xe2, 0x83, + 0x17, 0x9f, 0x67, 0x81, 0x7f, 0x3e, 0x0b, 0xfc, 0xef, 0xb3, 0xc0, 0x7f, 0x3f, 0x0f, 0xbc, 0xf3, + 0x79, 0xe0, 0x7d, 0x9d, 0x07, 0xde, 0xcb, 0xa7, 0x4a, 0xbb, 0xe3, 0xe9, 0x24, 0xe2, 0x90, 0x36, + 0xef, 0x9b, 0x2d, 0x7c, 0x1f, 0xfe, 0x5e, 0xbd, 0x7c, 0x8f, 0x9d, 0xfe, 0xbd, 0x7f, 0xae, 0xc8, + 0x24, 0x4e, 0xae, 0x56, 0x2f, 0x7e, 0xef, 0x57, 0x00, 0x00, 0x00, 0xff, 0xff, 0x72, 0xb0, 0xd5, + 0x84, 0xb0, 0x03, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/ccv/types/ccv.pb.go b/x/ccv/types/ccv.pb.go index ea2d38dc84..21d0b32f0b 100644 --- a/x/ccv/types/ccv.pb.go +++ b/x/ccv/types/ccv.pb.go @@ -524,9 +524,9 @@ var fileDescriptor_68bd5f3242e6f29c = []byte{ 0x48, 0x1d, 0x88, 0xc8, 0x89, 0x4b, 0x72, 0xee, 0xec, 0x5c, 0x15, 0x4f, 0x66, 0x68, 0xc9, 0xc2, 0xd7, 0xef, 0x0a, 0x57, 0x3a, 0xbc, 0xb8, 0x51, 0xf8, 0xcb, 0x1b, 0x85, 0xff, 0x7d, 0xa3, 0xf0, 0xdf, 0x6e, 0x15, 0xee, 0xf2, 0x56, 0xe1, 0xae, 0x6e, 0x15, 0xee, 0xf3, 0xeb, 0x16, 0x66, 0xed, - 0x41, 0x53, 0x77, 0x49, 0xcf, 0x48, 0x56, 0xeb, 0x1d, 0xaa, 0x97, 0x93, 0x1d, 0x1d, 0x9a, 0xc6, - 0x97, 0x78, 0x51, 0xc7, 0x2b, 0xb3, 0xb9, 0x1c, 0xef, 0xcc, 0xed, 0xbf, 0x01, 0x00, 0x00, 0xff, - 0xff, 0x5e, 0x61, 0xe5, 0xc6, 0xd0, 0x05, 0x00, 0x00, + 0x41, 0x53, 0x77, 0x49, 0xcf, 0x48, 0x56, 0xeb, 0x1d, 0xaa, 0x97, 0x93, 0x1d, 0x1d, 0x6e, 0x1b, + 0x5f, 0xe2, 0x45, 0x1d, 0xaf, 0xcc, 0xe6, 0x72, 0xbc, 0x33, 0xb7, 0xff, 0x06, 0x00, 0x00, 0xff, + 0xff, 0xc0, 0xe2, 0x3f, 0x59, 0xd0, 0x05, 0x00, 0x00, } func (m *ValidatorSetChangePacketData) Marshal() (dAtA []byte, err error) { From 0339832b68b8e66d7edcc947bf7aeff920a69804 Mon Sep 17 00:00:00 2001 From: MSalopek Date: Fri, 23 Jun 2023 10:06:52 +0200 Subject: [PATCH 060/108] tests: fix broken sovereign app.go (#1068) * fix: fix broken sovereign app.go * chore: fix upgrade proposals for sovereign * chore: fix sovereign app.go * chore: re-enable all tests * fix: update democ and throttle tests --- app/consumer-democracy/app.go | 3 -- app/consumer/app.go | 2 -- app/provider/app.go | 3 -- app/sovereign/app.go | 28 +++++++++++++++---- go.sum | 1 + tests/e2e/actions.go | 5 ++-- tests/e2e/actions_sovereign_chain.go | 10 ++++--- tests/e2e/config.go | 8 +++--- tests/e2e/main.go | 4 +-- tests/e2e/state.go | 4 +-- tests/e2e/steps_democracy.go | 2 +- tests/e2e/steps_reward_denom.go | 4 +-- tests/e2e/steps_sovereign_changeover.go | 2 +- .../testnet-scripts/sovereign-genesis.json | 24 ++++++++++++---- 14 files changed, 64 insertions(+), 36 deletions(-) diff --git a/app/consumer-democracy/app.go b/app/consumer-democracy/app.go index 298087262d..6b3078212b 100644 --- a/app/consumer-democracy/app.go +++ b/app/consumer-democracy/app.go @@ -116,9 +116,6 @@ import ( consumer "github.com/cosmos/interchain-security/v3/x/ccv/consumer" consumerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" - - // unnamed import of statik for swagger UI support - _ "github.com/cosmos/cosmos-sdk/client/docs/statik" ) const ( diff --git a/app/consumer/app.go b/app/consumer/app.go index 20b6695dfa..17c15c2c86 100644 --- a/app/consumer/app.go +++ b/app/consumer/app.go @@ -91,8 +91,6 @@ import ( ibcconsumerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" ibcconsumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" - // unnamed import of statik for swagger UI support - _ "github.com/cosmos/cosmos-sdk/client/docs/statik" testutil "github.com/cosmos/interchain-security/v3/testutil/integration" ) diff --git a/app/provider/app.go b/app/provider/app.go index 3fefd34daa..d810ff360f 100644 --- a/app/provider/app.go +++ b/app/provider/app.go @@ -109,9 +109,6 @@ import ( providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" testutil "github.com/cosmos/interchain-security/v3/testutil/integration" - - // unnamed import of statik for swagger UI support - _ "github.com/cosmos/cosmos-sdk/client/docs/statik" ) const ( diff --git a/app/sovereign/app.go b/app/sovereign/app.go index e616b92514..b1049255f9 100644 --- a/app/sovereign/app.go +++ b/app/sovereign/app.go @@ -7,6 +7,9 @@ import ( "os" "path/filepath" + autocliv1 "cosmossdk.io/api/cosmos/autocli/v1" + reflectionv1 "cosmossdk.io/api/cosmos/reflection/v1" + runtimeservices "github.com/cosmos/cosmos-sdk/runtime/services" appparams "github.com/cosmos/interchain-security/v3/app/params" "github.com/cosmos/cosmos-sdk/baseapp" @@ -27,8 +30,12 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/version" - "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/consensus" + consensusparamkeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" + consensusparamtypes "github.com/cosmos/cosmos-sdk/x/consensus/types" + + "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/auth/ante" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" @@ -44,7 +51,6 @@ import ( "github.com/cosmos/cosmos-sdk/x/capability" capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - consensusparamkeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" "github.com/cosmos/cosmos-sdk/x/crisis" crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper" crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types" @@ -108,6 +114,7 @@ import ( minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" paramproposal "github.com/cosmos/cosmos-sdk/x/params/types/proposal" + tendermint "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" ) const ( @@ -125,7 +132,7 @@ var ( // and genesis verification. ModuleBasics = module.NewBasicManager( auth.AppModuleBasic{}, - genutil.AppModuleBasic{}, + genutil.NewAppModuleBasic(genutiltypes.DefaultMessageValidator), bank.AppModuleBasic{}, capability.AppModuleBasic{}, sdkstaking.AppModuleBasic{}, @@ -148,6 +155,8 @@ var ( evidence.AppModuleBasic{}, transfer.AppModuleBasic{}, vesting.AppModuleBasic{}, + tendermint.AppModuleBasic{}, + consensus.AppModuleBasic{}, ) // module account permissions @@ -246,11 +255,11 @@ func New( bApp.SetInterfaceRegistry(interfaceRegistry) keys := sdk.NewKVStoreKeys( - authtypes.StoreKey, banktypes.StoreKey, stakingtypes.StoreKey, + authtypes.StoreKey, banktypes.StoreKey, stakingtypes.StoreKey, crisistypes.StoreKey, minttypes.StoreKey, distrtypes.StoreKey, slashingtypes.StoreKey, govtypes.StoreKey, paramstypes.StoreKey, ibchost.StoreKey, upgradetypes.StoreKey, feegrant.StoreKey, evidencetypes.StoreKey, ibctransfertypes.StoreKey, - capabilitytypes.StoreKey, authzkeeper.StoreKey, + capabilitytypes.StoreKey, authzkeeper.StoreKey, consensusparamtypes.StoreKey, ) tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey) memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey) @@ -263,6 +272,7 @@ func New( keys: keys, tkeys: tkeys, memKeys: memKeys, + txConfig: encodingConfig.TxConfig, } app.ParamsKeeper = initParamsKeeper( @@ -623,6 +633,14 @@ func New( app.ScopedIBCKeeper = scopedIBCKeeper app.ScopedTransferKeeper = scopedTransferKeeper + autocliv1.RegisterQueryServer(app.GRPCQueryRouter(), runtimeservices.NewAutoCLIQueryService(app.MM.Modules)) + + reflectionSvc, err := runtimeservices.NewReflectionService() + if err != nil { + panic(err) + } + reflectionv1.RegisterReflectionServiceServer(app.GRPCQueryRouter(), reflectionSvc) + return app } diff --git a/go.sum b/go.sum index b79f6784cb..cafdd80e8c 100644 --- a/go.sum +++ b/go.sum @@ -1129,6 +1129,7 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1 github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= diff --git a/tests/e2e/actions.go b/tests/e2e/actions.go index 2e8cd38a9b..719e5d7517 100644 --- a/tests/e2e/actions.go +++ b/tests/e2e/actions.go @@ -1395,7 +1395,7 @@ func (tr TestRun) delegateTokens( } // wait for inclusion in a block -> '--broadcast-mode block' is deprecated - tr.waitBlocks(action.chain, 1, 10*time.Second) + tr.waitBlocks(action.chain, 2, 10*time.Second) } type unbondTokensAction struct { @@ -1760,7 +1760,6 @@ func (tr TestRun) registerConsumerRewardDenom(action registerConsumerRewardDenom `--node`, tr.getValidatorNode(action.chain, action.from), `--gas`, "9000000", `--keyring-backend`, `test`, - `-b`, `block`, `-y`, ).CombinedOutput() @@ -1771,6 +1770,8 @@ func (tr TestRun) registerConsumerRewardDenom(action registerConsumerRewardDenom if err != nil { log.Fatal(err, "\n", string(bz)) } + + tr.waitBlocks(action.chain, 2, 10*time.Second) } // Creates an additional node on selected chain diff --git a/tests/e2e/actions_sovereign_chain.go b/tests/e2e/actions_sovereign_chain.go index c61a2a9a38..cf2d6288e8 100644 --- a/tests/e2e/actions_sovereign_chain.go +++ b/tests/e2e/actions_sovereign_chain.go @@ -105,16 +105,16 @@ func (tr TestRun) startSovereignChain( }, verbose) } -type UpgradeProposalAction struct { +type LegacyUpgradeProposalAction struct { chainID chainID upgradeTitle string proposer validatorID upgradeHeight uint64 } -func (tr *TestRun) submitUpgradeProposal(action UpgradeProposalAction, verbose bool) { +func (tr *TestRun) submitLegacyUpgradeProposal(action LegacyUpgradeProposalAction, verbose bool) { submit := fmt.Sprintf( - `%s tx gov submit-proposal software-upgrade %s \ + `%s tx gov submit-legacy-proposal software-upgrade %s \ --title %s \ --deposit 10000000stake \ --upgrade-height %s \ @@ -126,7 +126,7 @@ func (tr *TestRun) submitUpgradeProposal(action UpgradeProposalAction, verbose b --chain-id %s \ --home %s \ --node %s \ - -b block \ + --no-validate \ -y`, tr.chainConfigs[chainID("sover")].binaryName, action.upgradeTitle, @@ -152,6 +152,8 @@ func (tr *TestRun) submitUpgradeProposal(action UpgradeProposalAction, verbose b if err != nil { log.Fatal(err, "\n", string(bz)) } + + tr.waitBlocks(action.chainID, 1, 15*time.Second) } type waitUntilBlockAction struct { diff --git a/tests/e2e/config.go b/tests/e2e/config.go index df54cbd4f4..373281162d 100644 --- a/tests/e2e/config.go +++ b/tests/e2e/config.go @@ -364,12 +364,12 @@ func ChangeoverTestRun() TestRun { binaryName: "interchain-security-pd", ipPrefix: "7.7.7", votingWaitTime: 20, - genesisChanges: ".app_state.gov.voting_params.voting_period = \"20s\" | " + + genesisChanges: ".app_state.gov.params.voting_period = \"20s\" | " + // Custom slashing parameters for testing validator downtime functionality // See https://docs.cosmos.network/main/modules/slashing/04_begin_block.html#uptime-tracking ".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 = \"2s\" | " + + ".app_state.slashing.params.downtime_jail_duration = \"60s\" | " + ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\" | " + ".app_state.provider.params.slash_meter_replenish_fraction = \"1.0\" | " + // This disables slash packet throttling ".app_state.provider.params.slash_meter_replenish_period = \"3s\"", @@ -380,10 +380,10 @@ func ChangeoverTestRun() TestRun { upgradeBinary: "interchain-security-cdd", ipPrefix: "7.7.8", votingWaitTime: 20, - genesisChanges: ".app_state.gov.voting_params.voting_period = \"20s\" | " + + genesisChanges: ".app_state.gov.params.voting_period = \"20s\" | " + ".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 = \"2s\" | " + + ".app_state.slashing.params.downtime_jail_duration = \"60s\" | " + ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\" | " + ".app_state.staking.params.unbonding_time = \"1728000s\"", // making the genesis unbonding time equal to unbonding time in the consumer addition proposal }, diff --git a/tests/e2e/main.go b/tests/e2e/main.go index 00967dfcac..9943d6f9bd 100644 --- a/tests/e2e/main.go +++ b/tests/e2e/main.go @@ -115,8 +115,8 @@ func (tr *TestRun) runStep(step Step, verbose bool) { tr.startChain(action, verbose) case StartSovereignChainAction: tr.startSovereignChain(action, verbose) - case UpgradeProposalAction: - tr.submitUpgradeProposal(action, verbose) + case LegacyUpgradeProposalAction: + tr.submitLegacyUpgradeProposal(action, verbose) case waitUntilBlockAction: tr.waitUntilBlockOnChain(action) case ChangeoverChainAction: diff --git a/tests/e2e/state.go b/tests/e2e/state.go index 0c2573574f..5464b291ac 100644 --- a/tests/e2e/state.go +++ b/tests/e2e/state.go @@ -426,8 +426,8 @@ func (tr TestRun) getProposal(chain chainID, proposal uint) Proposal { }, } case "/cosmos.upgrade.v1beta1.SoftwareUpgradeProposal": - height := gjson.Get(string(bz), `content.plan.height`).Uint() - title := gjson.Get(string(bz), `content.plan.name`).String() + height := gjson.Get(string(bz), `messages.0.content.plan.height`).Uint() + title := gjson.Get(string(bz), `messages.0.content.plan.name`).String() return UpgradeProposal{ Deposit: uint(deposit), Status: status, diff --git a/tests/e2e/steps_democracy.go b/tests/e2e/steps_democracy.go index 3c80818a24..7264c44341 100644 --- a/tests/e2e/steps_democracy.go +++ b/tests/e2e/steps_democracy.go @@ -100,7 +100,7 @@ func stepsDemocracy(consumerName string) []Step { state: State{ chainID(consumerName): ChainState{ ValBalances: &map[validatorID]uint{ - validatorID("alice"): 9899999999, + validatorID("alice"): 9889999998, validatorID("bob"): 9960000001, }, // Check that the parameter is changed on gov-consumer chain diff --git a/tests/e2e/steps_reward_denom.go b/tests/e2e/steps_reward_denom.go index cb557f0471..9aad8ec7a8 100644 --- a/tests/e2e/steps_reward_denom.go +++ b/tests/e2e/steps_reward_denom.go @@ -98,11 +98,11 @@ func stepsRewardDenomConsumer(consumerName string) []Step { state: State{ chainID(consumerName): ChainState{ ValBalances: &map[validatorID]uint{ - validatorID("alice"): 9899999999, + validatorID("alice"): 9889999998, validatorID("bob"): 9960000001, }, // Check that the parameter is changed on gov-consumer chain - Params: &([]Param{{Subspace: "staking", Key: "MaxValidators", Value: "105"}}), + Params: &([]Param{{Subspace: "transfer", Key: "SendEnabled", Value: "true"}}), }, }, }, diff --git a/tests/e2e/steps_sovereign_changeover.go b/tests/e2e/steps_sovereign_changeover.go index 71daad684b..c02b2c4d43 100644 --- a/tests/e2e/steps_sovereign_changeover.go +++ b/tests/e2e/steps_sovereign_changeover.go @@ -192,7 +192,7 @@ func stepRunSovereignChain() []Step { func stepsUpgradeChain() []Step { return []Step{ { - action: UpgradeProposalAction{ + action: LegacyUpgradeProposalAction{ chainID: chainID("sover"), upgradeTitle: "sovereign-changeover", proposer: validatorID("alice"), diff --git a/tests/e2e/testnet-scripts/sovereign-genesis.json b/tests/e2e/testnet-scripts/sovereign-genesis.json index 6c34a0ec1c..c3ae9da36c 100644 --- a/tests/e2e/testnet-scripts/sovereign-genesis.json +++ b/tests/e2e/testnet-scripts/sovereign-genesis.json @@ -1,5 +1,5 @@ { - "genesis_time": "2023-06-19T21:06:09.696739416Z", + "genesis_time": "2023-06-22T15:55:00.982713586Z", "chain_id": "sover", "initial_height": "1", "consensus_params": { @@ -35,13 +35,16 @@ "accounts": [ { "@type": "/cosmos.auth.v1beta1.BaseAccount", - "address": "cosmos1dkas8mu4kyhl5jrh4nzvm65qz588hy9qcz08la", + "address": "cosmos19pe9pg5dv9k5fzgzmsrgnw9rl9asf7ddwhu7lm", "pub_key": null, "account_number": "0", "sequence": "0" } ] }, + "authz": { + "authorization": [] + }, "bank": { "params": { "send_enabled": [], @@ -99,6 +102,9 @@ "evidence": { "evidence": [] }, + "feegrant": { + "allowances": [] + }, "genutil": { "gen_txs": [ { @@ -160,7 +166,7 @@ "tip": null }, "signatures": [ - "D06i2qqq2HathlT7cy+PDLTDuYKAmzw5Ne+Ehvzr9bVy3jpm2h8deDGeSXTSrhdP04UpFXerSn+zIPth5TKNrg==" + "c7aD9dWzb85fn+Aq0ijMdhyJNJSOsOcFLvJt8ctvdxAAbwdrzKPVFbq9IYf1qCwKmfmQUrlFy40qiuQeXaZ8pg==" ] } ] @@ -199,7 +205,8 @@ "params": { "allowed_clients": [ "06-solomachine", - "07-tendermint" + "07-tendermint", + "09-localhost" ] }, "create_localhost": false, @@ -239,6 +246,12 @@ } }, "params": null, + "provider": { + "params": { + "slash_meter_replenish_fraction": "1.0", + "slash_meter_replenish_period": "3s" + } + }, "slashing": { "params": { "signed_blocks_window": "10", @@ -273,7 +286,8 @@ "params": { "send_enabled": true, "receive_enabled": true - } + }, + "total_escrowed": [] }, "upgrade": {}, "vesting": {} From 6e3164cb695de004207b54fa36878f0b2f8412aa Mon Sep 17 00:00:00 2001 From: Marius Poke Date: Fri, 23 Jun 2023 22:32:59 +0200 Subject: [PATCH 061/108] ci: add lint and check-breakage to gh actions (#1066) add lint and check-breakage to gh actions Co-authored-by: MSalopek Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> --- .github/workflows/proto.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .github/workflows/proto.yml diff --git a/.github/workflows/proto.yml b/.github/workflows/proto.yml new file mode 100644 index 0000000000..601310a793 --- /dev/null +++ b/.github/workflows/proto.yml @@ -0,0 +1,31 @@ +name: Protobuf +# Protobuf runs buf (https://buf.build/) lint and check-breakage +# This workflow is only run when a .proto file has been changed +on: + pull_request: + paths: + - "proto/**" + +permissions: + contents: read + +jobs: + lint: + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - uses: actions/checkout@v3 + - uses: bufbuild/buf-setup-action@v1.9.0 + - uses: bufbuild/buf-lint-action@v1 + with: + input: "proto" + + break-check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: bufbuild/buf-setup-action@v1.9.0 + - uses: bufbuild/buf-breaking-action@v1 + with: + input: "proto" + against: "https://github.com/${{ github.repository }}.git#branch=${{ github.event.pull_request.base.ref }},ref=HEAD~1,subdir=proto" From fcb1ff43a83b55d29ebd47c758d26cdba6b0b992 Mon Sep 17 00:00:00 2001 From: Marius Poke Date: Tue, 27 Jun 2023 11:03:06 +0200 Subject: [PATCH 062/108] docs: release notes template (#1064) * add release notes template * add upgrading info * add gh action to push proto files to buf.build --------- Co-authored-by: MSalopek Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> --- .github/workflows/proto-registry.yml | 20 ++++++++ RELEASE_NOTES.md | 27 ++++++++++ UPGRADING.md | 73 ++++++++++++++++++++++++++++ 3 files changed, 120 insertions(+) create mode 100644 .github/workflows/proto-registry.yml create mode 100644 RELEASE_NOTES.md create mode 100644 UPGRADING.md diff --git a/.github/workflows/proto-registry.yml b/.github/workflows/proto-registry.yml new file mode 100644 index 0000000000..bc620edbdc --- /dev/null +++ b/.github/workflows/proto-registry.yml @@ -0,0 +1,20 @@ +name: Buf-Push +# Protobuf runs buf (https://buf.build/) push updated proto files to https://buf.build/cosmos/interchain-security +# This workflow is only run when a .proto file has been changed +on: + push: + branches: + - main + paths: + - "proto/**" + +jobs: + push: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: bufbuild/buf-setup-action@v1.9.0 + - uses: bufbuild/buf-push-action@v1 + with: + input: "proto" + buf_token: ${{ secrets.BUF_TOKEN }} diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md new file mode 100644 index 0000000000..62704ea9c6 --- /dev/null +++ b/RELEASE_NOTES.md @@ -0,0 +1,27 @@ + + +# Replicated Security Release Notes + +## 📝 Changelog + +Check out the [changelog](https://github.com/cosmos/interchain-security/blob//CHANGELOG.md) for a list of relevant changes or [compare all changes](https://github.com/cosmos/interchain-security/compare/release/...) from last release. + + +Refer to the [upgrading guide](https://github.com/cosmos/interchain-security/blob/release//UPGRADING.md) when migrating from `` to ``. + +## 🚀 Highlights + + + +## ❤️ Contributors + +* Informal Systems ([@informalinc](https://twitter.com/informalinc)) + +This list is non-exhaustive and ordered alphabetically. +Thank you to everyone who contributed to this release! \ No newline at end of file diff --git a/UPGRADING.md b/UPGRADING.md new file mode 100644 index 0000000000..588a135bdb --- /dev/null +++ b/UPGRADING.md @@ -0,0 +1,73 @@ +# Upgrading Replicated Security + +This guide provides instructions for upgrading to specific versions of Replicated Security. + +## [v3.0.x](https://github.com/cosmos/interchain-security/releases/tag/v3.0.0-rc0) + +### Upgrading to Cosmos SDK 0.47 + +The following should be considered as complementary to [Cosmos SDK v0.47 UPGRADING.md](https://github.com/cosmos/cosmos-sdk/blob/v0.47.0-rc2/UPGRADING.md). + +#### Protobuf + +Protobuf code generation, linting and formatting have been updated to leverage the `ghcr.io/cosmos/proto-builder:0.11.5` docker container. Replicated Security protobuf definitions are now packaged and published to [buf.build/cosmos/interchain-security](buf.build/cosmos/interchain-security) via CI workflows. The `third_party/proto` directory has been removed in favour of dependency management using [buf.build](https://docs.buf.build/introduction). + +#### App modules + +Legacy APIs of the `AppModule` interface have been removed from ccv modules. For example, for + +```diff +- // Route implements the AppModule interface +- func (am AppModule) Route() sdk.Route { +- return sdk.Route{} +- } +- +- // QuerierRoute implements the AppModule interface +- func (AppModule) QuerierRoute() string { +- return types.QuerierRoute +- } +- +- // LegacyQuerierHandler implements the AppModule interface +- func (am AppModule) LegacyQuerierHandler(*codec.LegacyAmino) sdk.Querier { +- return nil +- } +- +- // ProposalContents doesn't return any content functions for governance proposals. +- func (AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalContent { +- return nil +- } +``` + +#### Imports + +Imports for ics23 have been updated as the repository have been migrated from confio to cosmos. + +```diff +import ( + // ... +- ics23 "github.com/confio/ics23/go" ++ ics23 "github.com/cosmos/ics23/go" + // ... +) +``` + +Imports for gogoproto have been updated. + +```diff +import ( + // ... +- "github.com/gogo/protobuf/proto" ++ "github.com/cosmos/gogoproto/proto" + // ... +) +``` + +## [v2.0.x](https://github.com/cosmos/interchain-security/releases/tag/v2.0.0) + +### Provider + +Upgrading a provider from `v1.1.0-multiden` to `v2.0.0` will require state migrations. See [migration.go](./x/ccv/provider/keeper/migration.go). See the provider module's `ConsensusVersion` in [module](./x/ccv/provider/module.go). + +### Consumer + +Upgrading a consumer from `v1.2.0-multiden` to `v2.0.0` will NOT require state migrations. See the consumer module's `ConsensusVersion` in [module](./x/ccv/consumer/module.go). \ No newline at end of file From 1c9652038b47baa6c32fbde0aee06fcc153bb06f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Jun 2023 15:20:07 -0700 Subject: [PATCH 063/108] build(deps): bump bufbuild/buf-setup-action from 1.9.0 to 1.22.0 (#1082) Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.9.0 to 1.22.0. - [Release notes](https://github.com/bufbuild/buf-setup-action/releases) - [Commits](https://github.com/bufbuild/buf-setup-action/compare/v1.9.0...v1.22.0) --- updated-dependencies: - dependency-name: bufbuild/buf-setup-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/proto-registry.yml | 2 +- .github/workflows/proto.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/proto-registry.yml b/.github/workflows/proto-registry.yml index bc620edbdc..483fab06c1 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@v3 - - uses: bufbuild/buf-setup-action@v1.9.0 + - uses: bufbuild/buf-setup-action@v1.22.0 - uses: bufbuild/buf-push-action@v1 with: input: "proto" diff --git a/.github/workflows/proto.yml b/.github/workflows/proto.yml index 601310a793..c1c302a60f 100644 --- a/.github/workflows/proto.yml +++ b/.github/workflows/proto.yml @@ -15,7 +15,7 @@ jobs: timeout-minutes: 5 steps: - uses: actions/checkout@v3 - - uses: bufbuild/buf-setup-action@v1.9.0 + - uses: bufbuild/buf-setup-action@v1.22.0 - uses: bufbuild/buf-lint-action@v1 with: input: "proto" @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: bufbuild/buf-setup-action@v1.9.0 + - uses: bufbuild/buf-setup-action@v1.22.0 - uses: bufbuild/buf-breaking-action@v1 with: input: "proto" From e88e2b2a770aca3d2fbe9b624413b9abeaf2282a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Jun 2023 15:41:49 -0700 Subject: [PATCH 064/108] build(deps): bump google.golang.org/grpc from 1.55.0 to 1.56.1 (#1083) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.55.0 to 1.56.1. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.55.0...v1.56.1) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> --- go.mod | 14 +++++++------- go.sum | 28 ++++++++++++++-------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index ee1c62d762..4513716d93 100644 --- a/go.mod +++ b/go.mod @@ -26,17 +26,17 @@ require ( golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc golang.org/x/net v0.9.0 // indirect golang.org/x/sys v0.7.0 // indirect - google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 - google.golang.org/grpc v1.55.0 + google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 + google.golang.org/grpc v1.56.1 google.golang.org/protobuf v1.30.0 gopkg.in/yaml.v2 v2.4.0 ) require ( cloud.google.com/go v0.110.0 // indirect - cloud.google.com/go/compute v1.18.0 // indirect + cloud.google.com/go/compute v1.19.1 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v0.12.0 // indirect + cloud.google.com/go/iam v0.13.0 // indirect cloud.google.com/go/storage v1.29.0 // indirect cosmossdk.io/api v0.3.1 cosmossdk.io/core v0.5.1 // indirect @@ -92,7 +92,7 @@ require ( github.com/google/orderedcode v0.0.1 // indirect github.com/google/uuid v1.3.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.7.0 // indirect + github.com/googleapis/gax-go/v2 v2.7.1 // indirect github.com/gorilla/handlers v1.5.1 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect @@ -152,11 +152,11 @@ require ( github.com/zondax/ledger-go v0.14.1 // indirect go.etcd.io/bbolt v1.3.7 // indirect go.opencensus.io v0.24.0 // indirect - golang.org/x/oauth2 v0.6.0 // indirect + golang.org/x/oauth2 v0.7.0 // indirect golang.org/x/term v0.7.0 // indirect golang.org/x/text v0.9.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.110.0 // indirect + google.golang.org/api v0.114.0 // indirect google.golang.org/appengine v1.6.7 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index cafdd80e8c..d58b95ebb4 100644 --- a/go.sum +++ b/go.sum @@ -73,8 +73,8 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.18.0 h1:FEigFqoDbys2cvFkZ9Fjq4gnHBP55anJ0yQyau2f9oY= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= +cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= @@ -114,8 +114,8 @@ cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y97 cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v0.12.0 h1:DRtTY29b75ciH6Ov1PHb4/iat2CLCvrOm40Q0a6DFpE= -cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iam v0.13.0 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= @@ -665,8 +665,8 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99 github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -1346,8 +1346,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1626,8 +1626,8 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.110.0 h1:l+rh0KYUooe9JGbGVx71tbFo4SMbMTXK3I3ia2QSEeU= -google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1747,8 +1747,8 @@ google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqw google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 h1:DdoeryqhaXp1LtT/emMP1BRJPHHKFi5akj/nbx/zNTA= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1790,8 +1790,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= -google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +google.golang.org/grpc v1.56.1 h1:z0dNfjIl0VpaZ9iSVjA6daGatAYwPGstTjt5vkRMFkQ= +google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= From ce7bedbd0230954e66d61d8ecc61ede42bf8a2fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 28 Jun 2023 07:18:42 -0700 Subject: [PATCH 065/108] build(deps): bump google.golang.org/protobuf from 1.30.0 to 1.31.0 (#1084) Bumps google.golang.org/protobuf from 1.30.0 to 1.31.0. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4513716d93..b487f32ab9 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( golang.org/x/sys v0.7.0 // indirect google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 google.golang.org/grpc v1.56.1 - google.golang.org/protobuf v1.30.0 + google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v2 v2.4.0 ) diff --git a/go.sum b/go.sum index d58b95ebb4..6e22b529cf 100644 --- a/go.sum +++ b/go.sum @@ -1808,8 +1808,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 07302ffb6692fe849f5f5d393de5db6395e74a53 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Wed, 28 Jun 2023 08:17:04 -0700 Subject: [PATCH 066/108] refactor: log when constructing IBC err ack (#1090) * log with err ack * linter --- tests/integration/slashing.go | 7 +++---- x/ccv/consumer/ibc_module.go | 2 +- x/ccv/consumer/keeper/relay_test.go | 2 +- x/ccv/provider/ibc_module.go | 4 ++-- x/ccv/provider/keeper/relay.go | 6 +++--- x/ccv/types/utils.go | 5 +++++ 6 files changed, 15 insertions(+), 11 deletions(-) diff --git a/tests/integration/slashing.go b/tests/integration/slashing.go index d4e960a9cd..68b632efe1 100644 --- a/tests/integration/slashing.go +++ b/tests/integration/slashing.go @@ -255,7 +255,7 @@ func (s *CCVTestSuite) TestSlashPacketAcknowledgement() { err := consumerKeeper.OnAcknowledgementPacket(s.consumerCtx(), packet, channeltypes.NewResultAcknowledgement(ack.Acknowledgement())) s.Require().NoError(err) - err = consumerKeeper.OnAcknowledgementPacket(s.consumerCtx(), packet, channeltypes.NewErrorAcknowledgement(fmt.Errorf("another error"))) + err = consumerKeeper.OnAcknowledgementPacket(s.consumerCtx(), packet, ccv.NewErrorAcknowledgementWithLog(s.consumerCtx(), fmt.Errorf("another error"))) s.Require().Error(err) } @@ -330,7 +330,8 @@ func (suite *CCVTestSuite) TestOnRecvSlashPacketErrors() { errAck := providerKeeper.OnRecvSlashPacket(ctx, packet, packetData) suite.Require().False(errAck.Success()) errAckCast := errAck.(channeltypes.Acknowledgement) - // TODO: see if there's a way to get error reason like before + // Error strings in err acks are now thrown out by IBC core to prevent app hash. + // Hence a generic error string is expected. suite.Require().Equal("ABCI code: 1: error handling packet: see events for details", errAckCast.GetError()) // Restore init chain height @@ -341,7 +342,6 @@ func (suite *CCVTestSuite) TestOnRecvSlashPacketErrors() { errAck = providerKeeper.OnRecvSlashPacket(ctx, packet, packetData) suite.Require().False(errAck.Success()) errAckCast = errAck.(channeltypes.Acknowledgement) - // TODO: see if there's a way to get error reason like before suite.Require().Equal("ABCI code: 1: error handling packet: see events for details", errAckCast.GetError()) // save current VSC ID @@ -357,7 +357,6 @@ func (suite *CCVTestSuite) TestOnRecvSlashPacketErrors() { errAck = providerKeeper.OnRecvSlashPacket(ctx, packet, packetData) suite.Require().False(errAck.Success()) errAckCast = errAck.(channeltypes.Acknowledgement) - // TODO: see if there's a way to get error reason like before suite.Require().Equal("ABCI code: 1: error handling packet: see events for details", errAckCast.GetError()) // construct slashing packet with non existing validator diff --git a/x/ccv/consumer/ibc_module.go b/x/ccv/consumer/ibc_module.go index d55a1998af..0ca0b29370 100644 --- a/x/ccv/consumer/ibc_module.go +++ b/x/ccv/consumer/ibc_module.go @@ -231,7 +231,7 @@ func (am AppModule) OnRecvPacket( data types.ValidatorSetChangePacketData ) if err := types.ModuleCdc.UnmarshalJSON(packet.GetData(), &data); err != nil { - errAck := channeltypes.NewErrorAcknowledgement(fmt.Errorf("cannot unmarshal CCV packet data")) + errAck := types.NewErrorAcknowledgementWithLog(ctx, fmt.Errorf("cannot unmarshal CCV packet data")) ack = &errAck } else { ack = am.keeper.OnRecvVSCPacket(ctx, packet, data) diff --git a/x/ccv/consumer/keeper/relay_test.go b/x/ccv/consumer/keeper/relay_test.go index 299d316d21..1c2ba5152f 100644 --- a/x/ccv/consumer/keeper/relay_test.go +++ b/x/ccv/consumer/keeper/relay_test.go @@ -279,7 +279,7 @@ func TestOnAcknowledgementPacket(t *testing.T) { ).Return(nil).Times(1), ) - ack = channeltypes.NewErrorAcknowledgement(fmt.Errorf("error")) + ack = types.NewErrorAcknowledgementWithLog(ctx, fmt.Errorf("error")) err = consumerKeeper.OnAcknowledgementPacket(ctx, packet, ack) require.Nil(t, err) } diff --git a/x/ccv/provider/ibc_module.go b/x/ccv/provider/ibc_module.go index b543c8927e..df0f6066a3 100644 --- a/x/ccv/provider/ibc_module.go +++ b/x/ccv/provider/ibc_module.go @@ -180,7 +180,7 @@ func (am AppModule) OnRecvPacket( ) // unmarshall consumer packet if err := ccv.ModuleCdc.UnmarshalJSON(packet.GetData(), &consumerPacket); err != nil { - errAck := channeltypes.NewErrorAcknowledgement(fmt.Errorf("cannot unmarshal CCV packet data")) + errAck := ccv.NewErrorAcknowledgementWithLog(ctx, fmt.Errorf("cannot unmarshal CCV packet data")) ack = &errAck } else { // TODO: call ValidateBasic method on consumer packet data @@ -194,7 +194,7 @@ func (am AppModule) OnRecvPacket( // handle SlashPacket ack = am.keeper.OnRecvSlashPacket(ctx, packet, *consumerPacket.GetSlashPacketData()) default: - errAck := channeltypes.NewErrorAcknowledgement(fmt.Errorf("invalid consumer packet type: %q", consumerPacket.Type)) + errAck := ccv.NewErrorAcknowledgementWithLog(ctx, fmt.Errorf("invalid consumer packet type: %q", consumerPacket.Type)) ack = &errAck } } diff --git a/x/ccv/provider/keeper/relay.go b/x/ccv/provider/keeper/relay.go index 1aa0858da6..350bc968d4 100644 --- a/x/ccv/provider/keeper/relay.go +++ b/x/ccv/provider/keeper/relay.go @@ -33,7 +33,7 @@ func (k Keeper) OnRecvVSCMaturedPacket( } if err := k.QueueThrottledVSCMaturedPacketData(ctx, chainID, packet.Sequence, data); err != nil { - return channeltypes.NewErrorAcknowledgement(fmt.Errorf( + return ccv.NewErrorAcknowledgementWithLog(ctx, fmt.Errorf( "failed to queue VSCMatured packet data: %s", err.Error())) } @@ -330,7 +330,7 @@ func (k Keeper) OnRecvSlashPacket(ctx sdk.Context, packet channeltypes.Packet, d "vscID", data.ValsetUpdateId, "infractionType", data.Infraction, ) - return channeltypes.NewErrorAcknowledgement(err) + return ccv.NewErrorAcknowledgementWithLog(ctx, err) } // The slash packet validator address may be known only on the consumer chain, @@ -366,7 +366,7 @@ func (k Keeper) OnRecvSlashPacket(ctx sdk.Context, packet channeltypes.Packet, d // 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 channeltypes.NewErrorAcknowledgement(fmt.Errorf("failed to queue slash packet data: %s", err.Error())) + return ccv.NewErrorAcknowledgementWithLog(ctx, fmt.Errorf("failed to queue slash packet data: %s", err.Error())) } k.Logger(ctx).Info("slash packet received and enqueued", diff --git a/x/ccv/types/utils.go b/x/ccv/types/utils.go index f27dab2b04..524725a532 100644 --- a/x/ccv/types/utils.go +++ b/x/ccv/types/utils.go @@ -85,6 +85,11 @@ func SendIBCPacket( return err } +func NewErrorAcknowledgementWithLog(ctx sdk.Context, err error) channeltypes.Acknowledgement { + ctx.Logger().Error("IBC ErrorAcknowledgement constructed", "error", err) + return channeltypes.NewErrorAcknowledgement(err) +} + // AppendMany appends a variable number of byte slices together func AppendMany(byteses ...[]byte) (out []byte) { for _, bytes := range byteses { From 4add79c928e6ee58588e39ea6acbac489d0797e2 Mon Sep 17 00:00:00 2001 From: MSalopek Date: Wed, 28 Jun 2023 19:21:32 +0200 Subject: [PATCH 067/108] chore: remove noisy proto linter (#1100) --- .github/workflows/proto.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/.github/workflows/proto.yml b/.github/workflows/proto.yml index c1c302a60f..4f2b512e97 100644 --- a/.github/workflows/proto.yml +++ b/.github/workflows/proto.yml @@ -10,16 +10,6 @@ permissions: contents: read jobs: - lint: - runs-on: ubuntu-latest - timeout-minutes: 5 - steps: - - uses: actions/checkout@v3 - - uses: bufbuild/buf-setup-action@v1.22.0 - - uses: bufbuild/buf-lint-action@v1 - with: - input: "proto" - break-check: runs-on: ubuntu-latest steps: From 7a33cb0ae9ddfc58bd819dba8656dfd0cc423402 Mon Sep 17 00:00:00 2001 From: MSalopek Date: Fri, 30 Jun 2023 11:05:29 +0200 Subject: [PATCH 068/108] fix: make SlashPacketData backward compatible when sending data over the wire (#1093) * fix: use v1 slash types on consumer side * fix: update provider ibc_module to also handle v1 slash packets * chore: update linter * fix problematic packet handling on provider * rm unused function * refactor/test: 1093 continued (#1104) * UnmarshalConsumerPacket func, use it in tests * added test * format --------- Co-authored-by: Marius Poke Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> --- proto/interchain_security/ccv/v1/ccv.proto | 40 +- tests/integration/throttle.go | 37 +- x/ccv/provider/ibc_module.go | 68 +- x/ccv/provider/ibc_module_test.go | 60 ++ x/ccv/provider/proposal_handler_test.go | 3 +- x/ccv/types/ccv.go | 61 +- x/ccv/types/ccv.pb.go | 743 +++++++++++++++++++-- 7 files changed, 919 insertions(+), 93 deletions(-) diff --git a/proto/interchain_security/ccv/v1/ccv.proto b/proto/interchain_security/ccv/v1/ccv.proto index ffae373aa6..1f3722a234 100644 --- a/proto/interchain_security/ccv/v1/ccv.proto +++ b/proto/interchain_security/ccv/v1/ccv.proto @@ -84,4 +84,42 @@ enum ConsumerPacketDataType { // VSCMatured packet CONSUMER_PACKET_TYPE_VSCM = 2 [ (gogoproto.enumvalue_customname) = "VscMaturedPacket" ]; -} \ No newline at end of file +} + +// ConsumerPacketData contains a consumer packet data and a type tag +// that is compatible with ICS v1 and v2 over the wire. It is not used for internal storage. +message ConsumerPacketDataV1 { + ConsumerPacketDataType type = 1; + + oneof data { + SlashPacketDataV1 slashPacketData = 2; + VSCMaturedPacketData vscMaturedPacketData = 3; + } +} + +// This packet is sent from the consumer chain to the provider chain +// It is backward compatible with the ICS v1 and v2 version of the packet. +message SlashPacketDataV1 { + tendermint.abci.Validator validator = 1 [ + (gogoproto.nullable) = false, + (gogoproto.moretags) = "yaml:\"validator\"" + ]; + // map to the infraction block height on the provider + uint64 valset_update_id = 2; + // tell if the slashing is for a downtime or a double-signing infraction + InfractionType infraction = 3; +} + +// InfractionType indicates the infraction type a validator commited. +// NOTE: ccv.InfractionType to maintain compatibility between ICS versions +// using different versions of the cosmos-sdk and ibc-go modules. +enum InfractionType { + option (gogoproto.goproto_enum_prefix) = false; + + // UNSPECIFIED defines an empty infraction type. + INFRACTION_TYPE_UNSPECIFIED = 0 [(gogoproto.enumvalue_customname) = "InfractionEmpty"]; + // DOUBLE_SIGN defines a validator that double-signs a block. + INFRACTION_TYPE_DOUBLE_SIGN = 1 [(gogoproto.enumvalue_customname) = "DoubleSign"]; + // DOWNTIME defines a validator that missed signing too many blocks. + INFRACTION_TYPE_DOWNTIME = 2 [(gogoproto.enumvalue_customname) = "Downtime"]; +} diff --git a/tests/integration/throttle.go b/tests/integration/throttle.go index 92800cd1bb..0620bdd6b6 100644 --- a/tests/integration/throttle.go +++ b/tests/integration/throttle.go @@ -9,6 +9,7 @@ import ( channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" icstestingutils "github.com/cosmos/interchain-security/v3/testutil/ibc_testing" + "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" ) @@ -314,8 +315,8 @@ func (s *CCVTestSuite) TestPacketSpam() { // Recv 500 packets from consumer to provider in same block for _, packet := range packets { - consumerPacketData := ccvtypes.ConsumerPacketData{} - ccvtypes.ModuleCdc.MustUnmarshalJSON(packet.GetData(), &consumerPacketData) + consumerPacketData, err := provider.UnmarshalConsumerPacket(packet) // Same func used by provider's OnRecvPacket + s.Require().NoError(err) providerKeeper.OnRecvSlashPacket(s.providerCtx(), packet, *consumerPacketData.GetSlashPacketData()) } @@ -368,8 +369,8 @@ func (s *CCVTestSuite) TestDoubleSignDoesNotAffectThrottling() { // Recv 500 packets from consumer to provider in same block for _, packet := range packets { - consumerPacketData := ccvtypes.ConsumerPacketData{} - ccvtypes.ModuleCdc.MustUnmarshalJSON(packet.GetData(), &consumerPacketData) + consumerPacketData, err := provider.UnmarshalConsumerPacket(packet) // Same func used by provider's OnRecvPacket + s.Require().NoError(err) providerKeeper.OnRecvSlashPacket(s.providerCtx(), packet, *consumerPacketData.GetSlashPacketData()) } @@ -464,8 +465,10 @@ func (s *CCVTestSuite) TestQueueOrdering() { // Recv 500 packets from consumer to provider in same block for i, packet := range packets { - consumerPacketData := ccvtypes.ConsumerPacketData{} - ccvtypes.ModuleCdc.MustUnmarshalJSON(packet.GetData(), &consumerPacketData) + + consumerPacketData, err := provider.UnmarshalConsumerPacket(packet) // Same func used by provider's OnRecvPacket + s.Require().NoError(err) + // Type depends on index packets were appended from above if (i+5)%10 == 0 { vscMaturedPacketData := consumerPacketData.GetVscMaturedPacketData() @@ -678,8 +681,8 @@ func (s *CCVTestSuite) TestSlashSameValidator() { // Recv and queue all slash packets. for _, packet := range packets { - consumerPacketData := ccvtypes.ConsumerPacketData{} - ccvtypes.ModuleCdc.MustUnmarshalJSON(packet.GetData(), &consumerPacketData) + consumerPacketData, err := provider.UnmarshalConsumerPacket(packet) // Same func used by provider's OnRecvPacket + s.Require().NoError(err) providerKeeper.OnRecvSlashPacket(s.providerCtx(), packet, *consumerPacketData.GetSlashPacketData()) } @@ -739,8 +742,8 @@ func (s CCVTestSuite) TestSlashAllValidators() { //nolint:govet // this is a tes // Recv and queue all slash packets. for _, packet := range packets { - consumerPacketData := ccvtypes.ConsumerPacketData{} - ccvtypes.ModuleCdc.MustUnmarshalJSON(packet.GetData(), &consumerPacketData) + consumerPacketData, err := provider.UnmarshalConsumerPacket(packet) // Same func used by provider's OnRecvPacket + s.Require().NoError(err) providerKeeper.OnRecvSlashPacket(s.providerCtx(), packet, *consumerPacketData.GetSlashPacketData()) } @@ -786,10 +789,9 @@ func (s *CCVTestSuite) TestLeadingVSCMaturedAreDequeued() { ibcSeqNum := uint64(i) packet := s.constructSlashPacketFromConsumer(*bundle, *s.providerChain.Vals.Validators[0], stakingtypes.Infraction_INFRACTION_DOWNTIME, ibcSeqNum) - packetData := ccvtypes.ConsumerPacketData{} - ccvtypes.ModuleCdc.MustUnmarshalJSON(packet.GetData(), &packetData) - providerKeeper.OnRecvSlashPacket(s.providerCtx(), - packet, *packetData.GetSlashPacketData()) + consumerPacketData, err := provider.UnmarshalConsumerPacket(packet) // Same func used by provider's OnRecvPacket + s.Require().NoError(err) + providerKeeper.OnRecvSlashPacket(s.providerCtx(), packet, *consumerPacketData.GetSlashPacketData()) } } @@ -877,10 +879,9 @@ func (s *CCVTestSuite) TestVscMaturedHandledPerBlockLimit() { ibcSeqNum := uint64(i) packet := s.constructSlashPacketFromConsumer(*bundle, *s.providerChain.Vals.Validators[0], stakingtypes.Infraction_INFRACTION_DOWNTIME, ibcSeqNum) - packetData := ccvtypes.ConsumerPacketData{} - ccvtypes.ModuleCdc.MustUnmarshalJSON(packet.GetData(), &packetData) - providerKeeper.OnRecvSlashPacket(s.providerCtx(), - packet, *packetData.GetSlashPacketData()) + consumerPacketData, err := provider.UnmarshalConsumerPacket(packet) // Same func used by provider's OnRecvPacket + s.Require().NoError(err) + providerKeeper.OnRecvSlashPacket(s.providerCtx(), packet, *consumerPacketData.GetSlashPacketData()) } } diff --git a/x/ccv/provider/ibc_module.go b/x/ccv/provider/ibc_module.go index df0f6066a3..698d37385b 100644 --- a/x/ccv/provider/ibc_module.go +++ b/x/ccv/provider/ibc_module.go @@ -174,29 +174,26 @@ func (am AppModule) OnRecvPacket( packet channeltypes.Packet, _ sdk.AccAddress, ) ibcexported.Acknowledgement { - var ( - ack ibcexported.Acknowledgement - consumerPacket ccv.ConsumerPacketData - ) - // unmarshall consumer packet - if err := ccv.ModuleCdc.UnmarshalJSON(packet.GetData(), &consumerPacket); err != nil { - errAck := ccv.NewErrorAcknowledgementWithLog(ctx, fmt.Errorf("cannot unmarshal CCV packet data")) + consumerPacket, err := UnmarshalConsumerPacket(packet) + if err != nil { + errAck := ccv.NewErrorAcknowledgementWithLog(ctx, err) + return &errAck + } + + // TODO: call ValidateBasic method on consumer packet data + // See: https://github.com/cosmos/interchain-security/issues/634 + + var ack ibcexported.Acknowledgement + switch consumerPacket.Type { + case ccv.VscMaturedPacket: + // handle VSCMaturedPacket + ack = am.keeper.OnRecvVSCMaturedPacket(ctx, packet, *consumerPacket.GetVscMaturedPacketData()) + case ccv.SlashPacket: + // handle SlashPacket + ack = am.keeper.OnRecvSlashPacket(ctx, packet, *consumerPacket.GetSlashPacketData()) + default: + errAck := ccv.NewErrorAcknowledgementWithLog(ctx, fmt.Errorf("invalid consumer packet type: %q", consumerPacket.Type)) ack = &errAck - } else { - // TODO: call ValidateBasic method on consumer packet data - // See: https://github.com/cosmos/interchain-security/issues/634 - - switch consumerPacket.Type { - case ccv.VscMaturedPacket: - // handle VSCMaturedPacket - ack = am.keeper.OnRecvVSCMaturedPacket(ctx, packet, *consumerPacket.GetVscMaturedPacketData()) - case ccv.SlashPacket: - // handle SlashPacket - ack = am.keeper.OnRecvSlashPacket(ctx, packet, *consumerPacket.GetSlashPacketData()) - default: - errAck := ccv.NewErrorAcknowledgementWithLog(ctx, fmt.Errorf("invalid consumer packet type: %q", consumerPacket.Type)) - ack = &errAck - } } ctx.EventManager().EmitEvent( @@ -210,6 +207,33 @@ func (am AppModule) OnRecvPacket( return ack } +func UnmarshalConsumerPacket(packet channeltypes.Packet) (consumerPacket ccv.ConsumerPacketData, err error) { + // First try unmarshaling into ccv.ConsumerPacketData type + if err := ccv.ModuleCdc.UnmarshalJSON(packet.GetData(), &consumerPacket); err != nil { + // If failed, packet should be a v1 slash packet, retry for ConsumerPacketDataV1 packet type + var v1Packet ccv.ConsumerPacketDataV1 + errV1 := ccv.ModuleCdc.UnmarshalJSON(packet.GetData(), &v1Packet) + if errV1 != nil { + // If neither worked, return error + return ccv.ConsumerPacketData{}, errV1 + } + + // VSC matured packets should not be unmarshaled as v1 packets + if v1Packet.Type == ccv.VscMaturedPacket { + return ccv.ConsumerPacketData{}, fmt.Errorf("VSC matured packets should be correctly unmarshaled") + } + + // Convert from v1 packet type + consumerPacket = ccv.ConsumerPacketData{ + Type: v1Packet.Type, + Data: &ccv.ConsumerPacketData_SlashPacketData{ + SlashPacketData: v1Packet.GetSlashPacketData().FromV1(), + }, + } + } + return consumerPacket, nil +} + // OnAcknowledgementPacket implements the IBCModule interface func (am AppModule) OnAcknowledgementPacket( ctx sdk.Context, diff --git a/x/ccv/provider/ibc_module_test.go b/x/ccv/provider/ibc_module_test.go index 42279fbb73..96e0eb97d1 100644 --- a/x/ccv/provider/ibc_module_test.go +++ b/x/ccv/provider/ibc_module_test.go @@ -7,6 +7,7 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" + "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" conntypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" host "github.com/cosmos/ibc-go/v7/modules/core/24-host" @@ -338,3 +339,62 @@ func TestOnChanOpenConfirm(t *testing.T) { ctrl.Finish() } } + +func TestUnmarshalConsumerPacket(t *testing.T) { + testCases := []struct { + name string + packet channeltypes.Packet + expectedPacketData ccv.ConsumerPacketData + }{ + { + name: "vsc matured", + packet: channeltypes.NewPacket( + ccv.ConsumerPacketData{ + Type: ccv.VscMaturedPacket, + Data: &ccv.ConsumerPacketData_VscMaturedPacketData{ + VscMaturedPacketData: &ccv.VSCMaturedPacketData{ + ValsetUpdateId: 420, + }, + }, + }.GetBytes(), + 342, "sourcePort", "sourceChannel", "destinationPort", "destinationChannel", types.Height{}, 0, + ), + expectedPacketData: ccv.ConsumerPacketData{ + Type: ccv.VscMaturedPacket, + Data: &ccv.ConsumerPacketData_VscMaturedPacketData{ + VscMaturedPacketData: &ccv.VSCMaturedPacketData{ + ValsetUpdateId: 420, + }, + }, + }, + }, + { + name: "slash packet", + packet: channeltypes.NewPacket( + ccv.ConsumerPacketData{ + Type: ccv.SlashPacket, + Data: &ccv.ConsumerPacketData_SlashPacketData{ + SlashPacketData: &ccv.SlashPacketData{ + ValsetUpdateId: 789, + }, + }, + }.GetBytes(), // Note packet data is converted to v1 bytes here + 342, "sourcePort", "sourceChannel", "destinationPort", "destinationChannel", types.Height{}, 0, + ), + expectedPacketData: ccv.ConsumerPacketData{ + Type: ccv.SlashPacket, + Data: &ccv.ConsumerPacketData_SlashPacketData{ + SlashPacketData: &ccv.SlashPacketData{ + ValsetUpdateId: 789, + }, + }, + }, + }, + } + + for _, tc := range testCases { + actualConsumerPacketData, err := provider.UnmarshalConsumerPacket(tc.packet) + require.NoError(t, err) + require.Equal(t, tc.expectedPacketData, actualConsumerPacketData) + } +} diff --git a/x/ccv/provider/proposal_handler_test.go b/x/ccv/provider/proposal_handler_test.go index 4f78695935..a85853a246 100644 --- a/x/ccv/provider/proposal_handler_test.go +++ b/x/ccv/provider/proposal_handler_test.go @@ -81,7 +81,8 @@ func TestProviderProposalHandler(t *testing.T) { { name: "unsupported proposal type", // lint rule disabled because this is a test case for an unsupported proposal type - content: &distributiontypes.CommunityPoolSpendProposal{ // nolint:staticcheck + // nolint:staticcheck + content: &distributiontypes.CommunityPoolSpendProposal{ Title: "title", Description: "desc", Recipient: "", diff --git a/x/ccv/types/ccv.go b/x/ccv/types/ccv.go index 62111a7b65..e7739b4c2f 100644 --- a/x/ccv/types/ccv.go +++ b/x/ccv/types/ccv.go @@ -59,6 +59,23 @@ func NewSlashPacketData(validator abci.Validator, valUpdateId uint64, infraction } } +// NewSlashPacketDataV1 creates a new SlashPacketDataV1 that uses ccv.InfractionTypes to maintain backward compatibility. +func NewSlashPacketDataV1(validator abci.Validator, valUpdateId uint64, infractionType stakingtypes.Infraction) *SlashPacketDataV1 { + v1Type := InfractionEmpty + switch infractionType { + case stakingtypes.Infraction_INFRACTION_DOWNTIME: + v1Type = Downtime + case stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN: + v1Type = DoubleSign + } + + return &SlashPacketDataV1{ + Validator: validator, + ValsetUpdateId: valUpdateId, + Infraction: v1Type, + } +} + func (vdt SlashPacketData) ValidateBasic() error { if len(vdt.Validator.Address) == 0 || vdt.Validator.Power == 0 { return errorsmod.Wrap(ErrInvalidPacketData, "validator fields cannot be empty") @@ -76,6 +93,10 @@ func (vdt SlashPacketData) GetBytes() []byte { return valDowntimeBytes } +func (vdt SlashPacketData) ToV1() *SlashPacketDataV1 { + return NewSlashPacketDataV1(vdt.Validator, vdt.ValsetUpdateId, vdt.Infraction) +} + func (cp ConsumerPacketData) ValidateBasic() (err error) { switch cp.Type { case VscMaturedPacket: @@ -99,7 +120,45 @@ func (cp ConsumerPacketData) ValidateBasic() (err error) { return } +// Convert to bytes while maintaining over the wire compatibility with previous versions. func (cp ConsumerPacketData) GetBytes() []byte { - bytes := ModuleCdc.MustMarshalJSON(&cp) + return cp.ToV1Bytes() +} + +// ToV1Bytes converts the ConsumerPacketData to JSON byte array compatible +// with the format used by ICS versions using cosmos-sdk v45 (ICS v1 and ICS v2). +func (cp ConsumerPacketData) ToV1Bytes() []byte { + if cp.Type != SlashPacket { + bytes := ModuleCdc.MustMarshalJSON(&cp) + return bytes + } + + sp := cp.GetSlashPacketData() + spdv1 := NewSlashPacketDataV1(sp.Validator, sp.ValsetUpdateId, sp.Infraction) + cpv1 := ConsumerPacketDataV1{ + Type: cp.Type, + Data: &ConsumerPacketDataV1_SlashPacketData{ + SlashPacketData: spdv1, + }, + } + bytes := ModuleCdc.MustMarshalJSON(&cpv1) return bytes } + +// FromV1 converts SlashPacketDataV1 to SlashPacketData. +// Provider must handle both V1 and later versions of the SlashPacketData. +func (vdt1 SlashPacketDataV1) FromV1() *SlashPacketData { + newType := stakingtypes.Infraction_INFRACTION_UNSPECIFIED + switch vdt1.Infraction { + case Downtime: + newType = stakingtypes.Infraction_INFRACTION_DOWNTIME + case DoubleSign: + newType = stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN + } + + return &SlashPacketData{ + Validator: vdt1.Validator, + ValsetUpdateId: vdt1.ValsetUpdateId, + Infraction: newType, + } +} diff --git a/x/ccv/types/ccv.pb.go b/x/ccv/types/ccv.pb.go index 21d0b32f0b..c2f0bd3ecc 100644 --- a/x/ccv/types/ccv.pb.go +++ b/x/ccv/types/ccv.pb.go @@ -57,6 +57,40 @@ func (ConsumerPacketDataType) EnumDescriptor() ([]byte, []int) { return fileDescriptor_68bd5f3242e6f29c, []int{0} } +// InfractionType indicates the infraction type a validator commited. +// NOTE: ccv.InfractionType to maintain compatibility between ICS versions +// using different versions of the cosmos-sdk and ibc-go modules. +type InfractionType int32 + +const ( + // UNSPECIFIED defines an empty infraction type. + InfractionEmpty InfractionType = 0 + // DOUBLE_SIGN defines a validator that double-signs a block. + DoubleSign InfractionType = 1 + // DOWNTIME defines a validator that missed signing too many blocks. + Downtime InfractionType = 2 +) + +var InfractionType_name = map[int32]string{ + 0: "INFRACTION_TYPE_UNSPECIFIED", + 1: "INFRACTION_TYPE_DOUBLE_SIGN", + 2: "INFRACTION_TYPE_DOWNTIME", +} + +var InfractionType_value = map[string]int32{ + "INFRACTION_TYPE_UNSPECIFIED": 0, + "INFRACTION_TYPE_DOUBLE_SIGN": 1, + "INFRACTION_TYPE_DOWNTIME": 2, +} + +func (x InfractionType) String() string { + return proto.EnumName(InfractionType_name, int32(x)) +} + +func (InfractionType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_68bd5f3242e6f29c, []int{1} +} + // This packet is sent from provider chain to consumer chain if the validator // set for consumer chain changes (due to new bonding/unbonding messages or // slashing events) A VSCMatured packet from consumer chain will be sent @@ -466,8 +500,168 @@ func (m *ConsumerPacketDataList) GetList() []ConsumerPacketData { return nil } +// ConsumerPacketData contains a consumer packet data and a type tag +// that is compatible with ICS v1 and v2 over the wire. It is not used for internal storage. +type ConsumerPacketDataV1 struct { + Type ConsumerPacketDataType `protobuf:"varint,1,opt,name=type,proto3,enum=interchain_security.ccv.v1.ConsumerPacketDataType" json:"type,omitempty"` + // Types that are valid to be assigned to Data: + // *ConsumerPacketDataV1_SlashPacketData + // *ConsumerPacketDataV1_VscMaturedPacketData + Data isConsumerPacketDataV1_Data `protobuf_oneof:"data"` +} + +func (m *ConsumerPacketDataV1) Reset() { *m = ConsumerPacketDataV1{} } +func (m *ConsumerPacketDataV1) String() string { return proto.CompactTextString(m) } +func (*ConsumerPacketDataV1) ProtoMessage() {} +func (*ConsumerPacketDataV1) Descriptor() ([]byte, []int) { + return fileDescriptor_68bd5f3242e6f29c, []int{7} +} +func (m *ConsumerPacketDataV1) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ConsumerPacketDataV1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ConsumerPacketDataV1.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 *ConsumerPacketDataV1) XXX_Merge(src proto.Message) { + xxx_messageInfo_ConsumerPacketDataV1.Merge(m, src) +} +func (m *ConsumerPacketDataV1) XXX_Size() int { + return m.Size() +} +func (m *ConsumerPacketDataV1) XXX_DiscardUnknown() { + xxx_messageInfo_ConsumerPacketDataV1.DiscardUnknown(m) +} + +var xxx_messageInfo_ConsumerPacketDataV1 proto.InternalMessageInfo + +type isConsumerPacketDataV1_Data interface { + isConsumerPacketDataV1_Data() + MarshalTo([]byte) (int, error) + Size() int +} + +type ConsumerPacketDataV1_SlashPacketData struct { + SlashPacketData *SlashPacketDataV1 `protobuf:"bytes,2,opt,name=slashPacketData,proto3,oneof" json:"slashPacketData,omitempty"` +} +type ConsumerPacketDataV1_VscMaturedPacketData struct { + VscMaturedPacketData *VSCMaturedPacketData `protobuf:"bytes,3,opt,name=vscMaturedPacketData,proto3,oneof" json:"vscMaturedPacketData,omitempty"` +} + +func (*ConsumerPacketDataV1_SlashPacketData) isConsumerPacketDataV1_Data() {} +func (*ConsumerPacketDataV1_VscMaturedPacketData) isConsumerPacketDataV1_Data() {} + +func (m *ConsumerPacketDataV1) GetData() isConsumerPacketDataV1_Data { + if m != nil { + return m.Data + } + return nil +} + +func (m *ConsumerPacketDataV1) GetType() ConsumerPacketDataType { + if m != nil { + return m.Type + } + return UnspecifiedPacket +} + +func (m *ConsumerPacketDataV1) GetSlashPacketData() *SlashPacketDataV1 { + if x, ok := m.GetData().(*ConsumerPacketDataV1_SlashPacketData); ok { + return x.SlashPacketData + } + return nil +} + +func (m *ConsumerPacketDataV1) GetVscMaturedPacketData() *VSCMaturedPacketData { + if x, ok := m.GetData().(*ConsumerPacketDataV1_VscMaturedPacketData); ok { + return x.VscMaturedPacketData + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*ConsumerPacketDataV1) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*ConsumerPacketDataV1_SlashPacketData)(nil), + (*ConsumerPacketDataV1_VscMaturedPacketData)(nil), + } +} + +// This packet is sent from the consumer chain to the provider chain +// It is backward compatible with the ICS v1 and v2 version of the packet. +type SlashPacketDataV1 struct { + Validator types.Validator `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator" yaml:"validator"` + // map to the infraction block height on the provider + ValsetUpdateId uint64 `protobuf:"varint,2,opt,name=valset_update_id,json=valsetUpdateId,proto3" json:"valset_update_id,omitempty"` + // tell if the slashing is for a downtime or a double-signing infraction + Infraction InfractionType `protobuf:"varint,3,opt,name=infraction,proto3,enum=interchain_security.ccv.v1.InfractionType" json:"infraction,omitempty"` +} + +func (m *SlashPacketDataV1) Reset() { *m = SlashPacketDataV1{} } +func (m *SlashPacketDataV1) String() string { return proto.CompactTextString(m) } +func (*SlashPacketDataV1) ProtoMessage() {} +func (*SlashPacketDataV1) Descriptor() ([]byte, []int) { + return fileDescriptor_68bd5f3242e6f29c, []int{8} +} +func (m *SlashPacketDataV1) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SlashPacketDataV1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SlashPacketDataV1.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 *SlashPacketDataV1) XXX_Merge(src proto.Message) { + xxx_messageInfo_SlashPacketDataV1.Merge(m, src) +} +func (m *SlashPacketDataV1) XXX_Size() int { + return m.Size() +} +func (m *SlashPacketDataV1) XXX_DiscardUnknown() { + xxx_messageInfo_SlashPacketDataV1.DiscardUnknown(m) +} + +var xxx_messageInfo_SlashPacketDataV1 proto.InternalMessageInfo + +func (m *SlashPacketDataV1) GetValidator() types.Validator { + if m != nil { + return m.Validator + } + return types.Validator{} +} + +func (m *SlashPacketDataV1) GetValsetUpdateId() uint64 { + if m != nil { + return m.ValsetUpdateId + } + return 0 +} + +func (m *SlashPacketDataV1) GetInfraction() InfractionType { + if m != nil { + return m.Infraction + } + return InfractionEmpty +} + func init() { proto.RegisterEnum("interchain_security.ccv.v1.ConsumerPacketDataType", ConsumerPacketDataType_name, ConsumerPacketDataType_value) + proto.RegisterEnum("interchain_security.ccv.v1.InfractionType", InfractionType_name, InfractionType_value) proto.RegisterType((*ValidatorSetChangePacketData)(nil), "interchain_security.ccv.v1.ValidatorSetChangePacketData") proto.RegisterType((*ValidatorSetChangePackets)(nil), "interchain_security.ccv.v1.ValidatorSetChangePackets") proto.RegisterType((*VSCMaturedPacketData)(nil), "interchain_security.ccv.v1.VSCMaturedPacketData") @@ -475,6 +669,8 @@ func init() { proto.RegisterType((*MaturedUnbondingOps)(nil), "interchain_security.ccv.v1.MaturedUnbondingOps") proto.RegisterType((*ConsumerPacketData)(nil), "interchain_security.ccv.v1.ConsumerPacketData") proto.RegisterType((*ConsumerPacketDataList)(nil), "interchain_security.ccv.v1.ConsumerPacketDataList") + proto.RegisterType((*ConsumerPacketDataV1)(nil), "interchain_security.ccv.v1.ConsumerPacketDataV1") + proto.RegisterType((*SlashPacketDataV1)(nil), "interchain_security.ccv.v1.SlashPacketDataV1") } func init() { @@ -482,51 +678,60 @@ func init() { } var fileDescriptor_68bd5f3242e6f29c = []byte{ - // 697 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x94, 0xcf, 0x6a, 0xdb, 0x4a, - 0x14, 0xc6, 0xa5, 0x58, 0x04, 0x32, 0x86, 0x44, 0xd1, 0xf5, 0xbd, 0x38, 0xba, 0xad, 0x22, 0x44, - 0xa0, 0xa6, 0xa5, 0x52, 0xad, 0x74, 0x51, 0xda, 0x4d, 0x63, 0xc7, 0xc1, 0xa6, 0xf9, 0x63, 0xa4, - 0x38, 0xa5, 0xdd, 0x88, 0xb1, 0x34, 0xb1, 0x07, 0xdb, 0x1a, 0xa3, 0x19, 0x8b, 0xfa, 0x0d, 0x4a, - 0x56, 0x7d, 0x81, 0xac, 0x4a, 0x1f, 0xa4, 0xbb, 0x2c, 0x03, 0xdd, 0x64, 0x15, 0x4a, 0xf2, 0x06, - 0x7d, 0x82, 0x22, 0x59, 0x76, 0x1c, 0x5b, 0x31, 0x64, 0xe5, 0xf1, 0x99, 0x73, 0x3e, 0xf1, 0xfd, - 0xe6, 0xe3, 0x80, 0x2d, 0xec, 0x33, 0x14, 0xb8, 0x6d, 0x88, 0x7d, 0x87, 0x22, 0x77, 0x10, 0x60, - 0x36, 0x34, 0x5c, 0x37, 0x34, 0xc2, 0x62, 0xf4, 0xa3, 0xf7, 0x03, 0xc2, 0x88, 0x24, 0xa7, 0x74, - 0xe9, 0xd1, 0x75, 0x58, 0x94, 0xb7, 0x5c, 0x42, 0x7b, 0x84, 0x1a, 0x94, 0xc1, 0x0e, 0xf6, 0x5b, - 0x46, 0x58, 0x6c, 0x22, 0x06, 0x8b, 0xe3, 0xff, 0x23, 0x05, 0x39, 0xd7, 0x22, 0x2d, 0x12, 0x1f, - 0x8d, 0xe8, 0x94, 0x54, 0xff, 0x67, 0xc8, 0xf7, 0x50, 0xd0, 0xc3, 0x3e, 0x33, 0x60, 0xd3, 0xc5, - 0x06, 0x1b, 0xf6, 0x11, 0x1d, 0x5d, 0x6a, 0x57, 0x3c, 0x78, 0x72, 0x02, 0xbb, 0xd8, 0x83, 0x8c, - 0x04, 0x36, 0x62, 0xe5, 0x36, 0xf4, 0x5b, 0xa8, 0x0e, 0xdd, 0x0e, 0x62, 0xbb, 0x90, 0x41, 0x89, - 0x80, 0xf5, 0x70, 0x7c, 0xef, 0x0c, 0xfa, 0x1e, 0x64, 0x88, 0xe6, 0x79, 0x35, 0x53, 0xc8, 0x9a, - 0xaa, 0x7e, 0xa7, 0xac, 0x47, 0xca, 0xfa, 0x44, 0xa9, 0x11, 0x37, 0x96, 0xd4, 0x8b, 0xeb, 0x4d, - 0xee, 0xcf, 0xf5, 0x66, 0x7e, 0x08, 0x7b, 0xdd, 0xb7, 0xda, 0x9c, 0x90, 0x66, 0x89, 0xe1, 0xfd, - 0x11, 0x2a, 0x15, 0x40, 0x54, 0xa3, 0x88, 0x25, 0x4d, 0x0e, 0xf6, 0xf2, 0x4b, 0x2a, 0x5f, 0x10, - 0xac, 0xd5, 0x51, 0x7d, 0xd4, 0x58, 0xf3, 0xa4, 0xa7, 0x00, 0xd0, 0x2e, 0xa4, 0x6d, 0x07, 0xba, - 0x1d, 0x9a, 0xcf, 0xa8, 0x99, 0xc2, 0x8a, 0xb5, 0x12, 0x57, 0x76, 0xdc, 0x0e, 0xd5, 0x08, 0xd8, - 0x78, 0xc8, 0x19, 0x95, 0x2c, 0x20, 0x74, 0x31, 0x65, 0x89, 0x93, 0x37, 0xfa, 0xc3, 0xec, 0xf5, - 0x45, 0x78, 0x4a, 0x42, 0xe4, 0xd0, 0x8a, 0xb5, 0xb4, 0xf7, 0x20, 0x77, 0x62, 0x97, 0x0f, 0x20, - 0x1b, 0x04, 0xc8, 0x9b, 0x42, 0x98, 0xe6, 0x88, 0x4f, 0x73, 0xa4, 0xfd, 0xe2, 0xc1, 0x9a, 0x1d, - 0x19, 0x98, 0x9a, 0xb6, 0xc0, 0xca, 0x84, 0x51, 0x3c, 0x96, 0x35, 0xe5, 0x87, 0xc1, 0x97, 0xf2, - 0x09, 0x72, 0x71, 0x06, 0xb9, 0x66, 0xdd, 0xc9, 0x3c, 0x82, 0x71, 0x09, 0x00, 0xec, 0x9f, 0x06, - 0xd0, 0x65, 0x98, 0xf8, 0xf9, 0x8c, 0xca, 0x17, 0x56, 0x4d, 0x4d, 0x1f, 0xa5, 0x51, 0x1f, 0xa7, - 0x2f, 0x49, 0xa3, 0x5e, 0x9b, 0x74, 0x5a, 0x53, 0x53, 0xda, 0x33, 0xf0, 0x4f, 0x02, 0xa5, 0xe1, - 0x37, 0x89, 0xef, 0x61, 0xbf, 0x75, 0xd4, 0xa7, 0x92, 0x08, 0x32, 0xd8, 0x1b, 0x65, 0x49, 0xb0, - 0xa2, 0xa3, 0xf6, 0x63, 0x09, 0x48, 0x65, 0xe2, 0xd3, 0x41, 0x0f, 0x05, 0x53, 0x04, 0xf6, 0x80, - 0x10, 0x45, 0x36, 0x36, 0xbf, 0x6a, 0x9a, 0x8b, 0xde, 0x6a, 0x7e, 0xfa, 0x78, 0xd8, 0x47, 0x56, - 0x3c, 0x2f, 0x7d, 0x04, 0x6b, 0xf4, 0x3e, 0xdc, 0xd8, 0x74, 0xd6, 0x7c, 0xb1, 0x48, 0x72, 0xe6, - 0x3d, 0xaa, 0x9c, 0x35, 0xab, 0x22, 0x9d, 0x82, 0x5c, 0x48, 0xdd, 0xb9, 0x87, 0x8f, 0x71, 0x65, - 0xcd, 0x57, 0x0b, 0xc3, 0x95, 0x12, 0x98, 0x2a, 0x67, 0xa5, 0xea, 0x95, 0x96, 0x81, 0xe0, 0x41, - 0x06, 0xb5, 0x26, 0xf8, 0x6f, 0xde, 0xe8, 0x3e, 0xa6, 0x4c, 0xaa, 0xde, 0x8b, 0xb5, 0xfe, 0x38, - 0x54, 0xd3, 0x61, 0x7e, 0xfe, 0x93, 0x4f, 0xfb, 0x48, 0x44, 0x53, 0x7a, 0x07, 0xd4, 0xf2, 0xd1, - 0xa1, 0xdd, 0x38, 0xa8, 0x58, 0x4e, 0x7d, 0xa7, 0xfc, 0xa1, 0x72, 0xec, 0x1c, 0x7f, 0xaa, 0x57, - 0x9c, 0xc6, 0xa1, 0x5d, 0xaf, 0x94, 0x6b, 0x7b, 0xb5, 0xca, 0xae, 0xc8, 0xc9, 0xff, 0x9e, 0x9d, - 0xab, 0xeb, 0x0d, 0x9f, 0xf6, 0x91, 0x8b, 0x4f, 0xf1, 0xd8, 0x87, 0x64, 0x00, 0x39, 0x75, 0xd8, - 0xde, 0xdf, 0xb1, 0xab, 0x22, 0x2f, 0xaf, 0x9d, 0x9d, 0xab, 0xd9, 0x29, 0xe6, 0xd2, 0x36, 0xd8, - 0x48, 0x1d, 0x88, 0xc8, 0x89, 0x4b, 0x72, 0xee, 0xec, 0x5c, 0x15, 0x4f, 0x66, 0x68, 0xc9, 0xc2, - 0xd7, 0xef, 0x0a, 0x57, 0x3a, 0xbc, 0xb8, 0x51, 0xf8, 0xcb, 0x1b, 0x85, 0xff, 0x7d, 0xa3, 0xf0, - 0xdf, 0x6e, 0x15, 0xee, 0xf2, 0x56, 0xe1, 0xae, 0x6e, 0x15, 0xee, 0xf3, 0xeb, 0x16, 0x66, 0xed, - 0x41, 0x53, 0x77, 0x49, 0xcf, 0x48, 0x56, 0xeb, 0x1d, 0xaa, 0x97, 0x93, 0x1d, 0x1d, 0x6e, 0x1b, - 0x5f, 0xe2, 0x45, 0x1d, 0xaf, 0xcc, 0xe6, 0x72, 0xbc, 0x33, 0xb7, 0xff, 0x06, 0x00, 0x00, 0xff, - 0xff, 0xc0, 0xe2, 0x3f, 0x59, 0xd0, 0x05, 0x00, 0x00, + // 836 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x56, 0xcf, 0x6e, 0xe2, 0x46, + 0x1c, 0xb6, 0x01, 0xad, 0x9a, 0xa1, 0x22, 0xce, 0x2c, 0xad, 0x58, 0x6f, 0xcb, 0x5a, 0xd6, 0x4a, + 0x45, 0xa9, 0xd6, 0x2e, 0x64, 0x0f, 0x55, 0x7b, 0x69, 0x00, 0xa7, 0x71, 0x9b, 0x90, 0xc8, 0x06, + 0x56, 0xdb, 0x8b, 0x35, 0xd8, 0x13, 0x32, 0x0a, 0xd8, 0xc8, 0x33, 0xb8, 0xe5, 0x0d, 0x2a, 0x4e, + 0x7d, 0x01, 0x4e, 0x55, 0x0f, 0xfb, 0x18, 0xbd, 0xed, 0x71, 0xa5, 0x5e, 0xf6, 0xd2, 0xa8, 0x4a, + 0xde, 0xa0, 0x4f, 0x50, 0xd9, 0xfc, 0xc7, 0x06, 0x29, 0x52, 0xa5, 0xf6, 0x84, 0x19, 0xff, 0xbe, + 0x4f, 0xf3, 0xfd, 0x19, 0x79, 0xc0, 0x73, 0xe2, 0x32, 0xec, 0xdb, 0xd7, 0x88, 0xb8, 0x16, 0xc5, + 0xf6, 0xd0, 0x27, 0x6c, 0xa4, 0xda, 0x76, 0xa0, 0x06, 0xe5, 0xf0, 0x47, 0x19, 0xf8, 0x1e, 0xf3, + 0xa0, 0x98, 0x30, 0xa5, 0x84, 0xaf, 0x83, 0xb2, 0xf8, 0xdc, 0xf6, 0x68, 0xdf, 0xa3, 0x2a, 0x65, + 0xe8, 0x86, 0xb8, 0x5d, 0x35, 0x28, 0x77, 0x30, 0x43, 0xe5, 0xf9, 0xff, 0x29, 0x83, 0x98, 0xef, + 0x7a, 0x5d, 0x2f, 0x7a, 0x54, 0xc3, 0xa7, 0xd9, 0xea, 0x53, 0x86, 0x5d, 0x07, 0xfb, 0x7d, 0xe2, + 0x32, 0x15, 0x75, 0x6c, 0xa2, 0xb2, 0xd1, 0x00, 0xd3, 0xe9, 0x4b, 0xf9, 0x3d, 0x0f, 0x3e, 0x69, + 0xa3, 0x1e, 0x71, 0x10, 0xf3, 0x7c, 0x13, 0xb3, 0xda, 0x35, 0x72, 0xbb, 0xf8, 0x12, 0xd9, 0x37, + 0x98, 0xd5, 0x11, 0x43, 0xd0, 0x03, 0x07, 0xc1, 0xfc, 0xbd, 0x35, 0x1c, 0x38, 0x88, 0x61, 0x5a, + 0xe0, 0xa5, 0x74, 0x29, 0x5b, 0x91, 0x94, 0x25, 0xb3, 0x12, 0x32, 0x2b, 0x0b, 0xa6, 0x56, 0x34, + 0x58, 0x95, 0xde, 0xde, 0x3e, 0xe3, 0xfe, 0xbe, 0x7d, 0x56, 0x18, 0xa1, 0x7e, 0xef, 0x2b, 0x39, + 0x46, 0x24, 0x1b, 0x42, 0xb0, 0x0e, 0xa1, 0xb0, 0x04, 0xc2, 0x35, 0x8a, 0xd9, 0x6c, 0xc8, 0x22, + 0x4e, 0x21, 0x25, 0xf1, 0xa5, 0x8c, 0x91, 0x9b, 0xae, 0x4f, 0x07, 0x75, 0x07, 0x7e, 0x0a, 0x00, + 0xed, 0x21, 0x7a, 0x6d, 0x21, 0xfb, 0x86, 0x16, 0xd2, 0x52, 0xba, 0xb4, 0x67, 0xec, 0x45, 0x2b, + 0xc7, 0xf6, 0x0d, 0x95, 0x3d, 0xf0, 0x64, 0x9b, 0x32, 0x0a, 0x0d, 0x90, 0xe9, 0x11, 0xca, 0x66, + 0x4a, 0xbe, 0x54, 0xb6, 0x7b, 0xaf, 0xec, 0xb2, 0xa7, 0x9a, 0x09, 0x15, 0x1a, 0x11, 0x97, 0xfc, + 0x0d, 0xc8, 0xb7, 0xcd, 0xda, 0x39, 0x62, 0x43, 0x1f, 0x3b, 0x2b, 0x16, 0x26, 0x29, 0xe2, 0x93, + 0x14, 0xc9, 0x7f, 0xf0, 0x60, 0xdf, 0x0c, 0x05, 0xac, 0xa0, 0x0d, 0xb0, 0xb7, 0xf0, 0x28, 0x82, + 0x65, 0x2b, 0xe2, 0x76, 0xe3, 0xab, 0x85, 0x99, 0xe5, 0xc2, 0x86, 0xe5, 0xb2, 0xb1, 0xa4, 0x79, + 0x80, 0xc7, 0x55, 0x00, 0x88, 0x7b, 0xe5, 0x23, 0x9b, 0x11, 0xcf, 0x2d, 0xa4, 0x25, 0xbe, 0x94, + 0xab, 0xc8, 0xca, 0xb4, 0x8d, 0xca, 0xbc, 0x7d, 0xb3, 0x36, 0x2a, 0xfa, 0x62, 0xd2, 0x58, 0x41, + 0xc9, 0x9f, 0x81, 0xc7, 0x33, 0x53, 0x5a, 0x6e, 0xc7, 0x73, 0x1d, 0xe2, 0x76, 0x2f, 0x06, 0x14, + 0x0a, 0x20, 0x4d, 0x9c, 0x69, 0x97, 0x32, 0x46, 0xf8, 0x28, 0xff, 0x96, 0x02, 0xb0, 0xe6, 0xb9, + 0x74, 0xd8, 0xc7, 0xfe, 0x8a, 0x03, 0x27, 0x20, 0x13, 0x56, 0x36, 0x12, 0x9f, 0xab, 0x54, 0x76, + 0x65, 0x15, 0x47, 0x37, 0x47, 0x03, 0x6c, 0x44, 0x78, 0xf8, 0x0a, 0xec, 0xd3, 0x75, 0x73, 0x23, + 0xd1, 0xd9, 0xca, 0xe7, 0xbb, 0x28, 0x37, 0xf2, 0x38, 0xe5, 0x8c, 0x4d, 0x16, 0x78, 0x05, 0xf2, + 0x01, 0xb5, 0x63, 0xc1, 0x47, 0x76, 0x65, 0x2b, 0x5f, 0xec, 0x2c, 0x57, 0x42, 0x61, 0x4e, 0x39, + 0x23, 0x91, 0xaf, 0xfa, 0x08, 0x64, 0x1c, 0xc4, 0x90, 0xdc, 0x01, 0x1f, 0xc7, 0x85, 0x9e, 0x11, + 0xca, 0xe0, 0xe9, 0x5a, 0xad, 0x95, 0x87, 0x59, 0xb5, 0x56, 0xe6, 0x37, 0x29, 0x90, 0x8f, 0x8f, + 0xb4, 0xcb, 0xff, 0x5a, 0x1a, 0xaf, 0xb7, 0xa5, 0xf1, 0xe2, 0x01, 0x69, 0xb4, 0xcb, 0xff, 0x87, + 0x3c, 0xfe, 0xe4, 0xc1, 0x41, 0x6c, 0x63, 0xff, 0xf1, 0xc1, 0xfd, 0x2e, 0xe1, 0xe0, 0x1e, 0xee, + 0x52, 0xbe, 0x3c, 0xbc, 0x51, 0x48, 0x2b, 0xe8, 0xc3, 0xdf, 0xf9, 0xa4, 0xc2, 0x85, 0x63, 0xf0, + 0x6b, 0x20, 0xd5, 0x2e, 0x1a, 0x66, 0xeb, 0x5c, 0x33, 0xac, 0xcb, 0xe3, 0xda, 0xf7, 0x5a, 0xd3, + 0x6a, 0xbe, 0xbe, 0xd4, 0xac, 0x56, 0xc3, 0xbc, 0xd4, 0x6a, 0xfa, 0x89, 0xae, 0xd5, 0x05, 0x4e, + 0xfc, 0x68, 0x3c, 0x91, 0x0e, 0x5a, 0x2e, 0x1d, 0x60, 0x9b, 0x5c, 0x91, 0xb9, 0x87, 0x50, 0x05, + 0x62, 0x22, 0xd8, 0x3c, 0x3b, 0x36, 0x4f, 0x05, 0x5e, 0xdc, 0x1f, 0x4f, 0xa4, 0xec, 0x8a, 0xb1, + 0xf0, 0x08, 0x3c, 0x49, 0x04, 0x84, 0xa9, 0x09, 0x29, 0x31, 0x3f, 0x9e, 0x48, 0x42, 0x7b, 0x23, + 0x29, 0x31, 0xf3, 0xf3, 0xaf, 0x45, 0xee, 0xf0, 0x0d, 0x0f, 0x72, 0xeb, 0x12, 0xe1, 0x4b, 0xf0, + 0x54, 0x6f, 0x9c, 0x18, 0xc7, 0xb5, 0xa6, 0x7e, 0xd1, 0x48, 0xda, 0xf6, 0xe3, 0xf1, 0x44, 0xda, + 0x5f, 0x82, 0xb4, 0xfe, 0x80, 0x8d, 0xa0, 0x1a, 0x47, 0xd5, 0x2f, 0x5a, 0xd5, 0x33, 0xcd, 0x32, + 0xf5, 0x6f, 0x1b, 0x02, 0x2f, 0xe6, 0xc6, 0x13, 0x09, 0xd4, 0xbd, 0x61, 0xa7, 0x87, 0x4d, 0xd2, + 0x75, 0xe1, 0x21, 0x28, 0xc4, 0x01, 0xaf, 0x1a, 0x4d, 0xfd, 0x5c, 0x13, 0x52, 0xe2, 0x87, 0xe3, + 0x89, 0xf4, 0x41, 0xdd, 0xfb, 0xd1, 0x65, 0xa4, 0x8f, 0xa7, 0x7b, 0xad, 0x36, 0xde, 0xde, 0x15, + 0xf9, 0x77, 0x77, 0x45, 0xfe, 0xaf, 0xbb, 0x22, 0xff, 0xcb, 0x7d, 0x91, 0x7b, 0x77, 0x5f, 0xe4, + 0xde, 0xdf, 0x17, 0xb9, 0x1f, 0x5e, 0x76, 0x09, 0xbb, 0x1e, 0x76, 0x14, 0xdb, 0xeb, 0xab, 0xb3, + 0x2b, 0xc1, 0x32, 0xd2, 0x17, 0x8b, 0xbb, 0x45, 0x70, 0xa4, 0xfe, 0x14, 0x5d, 0x30, 0xa2, 0x4f, + 0x7d, 0xe7, 0x51, 0xf4, 0xad, 0x3f, 0xfa, 0x27, 0x00, 0x00, 0xff, 0xff, 0x8f, 0xbf, 0xfc, 0xd2, + 0x88, 0x08, 0x00, 0x00, } func (m *ValidatorSetChangePacketData) Marshal() (dAtA []byte, err error) { @@ -845,6 +1050,128 @@ func (m *ConsumerPacketDataList) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *ConsumerPacketDataV1) 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 *ConsumerPacketDataV1) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ConsumerPacketDataV1) 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 + } + } + } + if m.Type != 0 { + i = encodeVarintCcv(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *ConsumerPacketDataV1_SlashPacketData) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ConsumerPacketDataV1_SlashPacketData) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.SlashPacketData != nil { + { + size, err := m.SlashPacketData.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCcv(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} +func (m *ConsumerPacketDataV1_VscMaturedPacketData) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ConsumerPacketDataV1_VscMaturedPacketData) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.VscMaturedPacketData != nil { + { + size, err := m.VscMaturedPacketData.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCcv(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + return len(dAtA) - i, nil +} +func (m *SlashPacketDataV1) 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 *SlashPacketDataV1) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SlashPacketDataV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Infraction != 0 { + i = encodeVarintCcv(dAtA, i, uint64(m.Infraction)) + i-- + dAtA[i] = 0x18 + } + if m.ValsetUpdateId != 0 { + i = encodeVarintCcv(dAtA, i, uint64(m.ValsetUpdateId)) + i-- + dAtA[i] = 0x10 + } + { + size, err := m.Validator.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCcv(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func encodeVarintCcv(dAtA []byte, offset int, v uint64) int { offset -= sovCcv(v) base := offset @@ -994,13 +1321,69 @@ func (m *ConsumerPacketDataList) Size() (n int) { return n } -func sovCcv(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 +func (m *ConsumerPacketDataV1) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Type != 0 { + n += 1 + sovCcv(uint64(m.Type)) + } + if m.Data != nil { + n += m.Data.Size() + } + return n } -func sozCcv(x uint64) (n int) { - return sovCcv(uint64((x << 1) ^ uint64((int64(x) >> 63)))) + +func (m *ConsumerPacketDataV1_SlashPacketData) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SlashPacketData != nil { + l = m.SlashPacketData.Size() + n += 1 + l + sovCcv(uint64(l)) + } + return n } -func (m *ValidatorSetChangePacketData) Unmarshal(dAtA []byte) error { +func (m *ConsumerPacketDataV1_VscMaturedPacketData) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.VscMaturedPacketData != nil { + l = m.VscMaturedPacketData.Size() + n += 1 + l + sovCcv(uint64(l)) + } + return n +} +func (m *SlashPacketDataV1) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Validator.Size() + n += 1 + l + sovCcv(uint64(l)) + if m.ValsetUpdateId != 0 { + n += 1 + sovCcv(uint64(m.ValsetUpdateId)) + } + if m.Infraction != 0 { + n += 1 + sovCcv(uint64(m.Infraction)) + } + return n +} + +func sovCcv(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozCcv(x uint64) (n int) { + return sovCcv(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *ValidatorSetChangePacketData) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1758,6 +2141,266 @@ func (m *ConsumerPacketDataList) Unmarshal(dAtA []byte) error { } return nil } +func (m *ConsumerPacketDataV1) 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 ErrIntOverflowCcv + } + 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: ConsumerPacketDataV1: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ConsumerPacketDataV1: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCcv + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= ConsumerPacketDataType(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SlashPacketData", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCcv + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCcv + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCcv + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &SlashPacketDataV1{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Data = &ConsumerPacketDataV1_SlashPacketData{v} + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VscMaturedPacketData", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCcv + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCcv + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCcv + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &VSCMaturedPacketData{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Data = &ConsumerPacketDataV1_VscMaturedPacketData{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCcv(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCcv + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SlashPacketDataV1) 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 ErrIntOverflowCcv + } + 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: SlashPacketDataV1: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SlashPacketDataV1: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCcv + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCcv + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCcv + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Validator.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ValsetUpdateId", wireType) + } + m.ValsetUpdateId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCcv + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ValsetUpdateId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Infraction", wireType) + } + m.Infraction = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCcv + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Infraction |= InfractionType(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipCcv(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCcv + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipCcv(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 From bcb2b27e8085cdd129a846fd76ef3217ec1bc8ee Mon Sep 17 00:00:00 2001 From: MSalopek Date: Fri, 30 Jun 2023 13:26:08 +0200 Subject: [PATCH 069/108] chore: update CHANGELOG.md for v3 (#1108) * chore: update CHANGELOG.md for v3 Update changelog to include note about fixing SlashPacket compatibility over the Wire * Update CHANGELOG.md --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c7cb03404c..c07c612136 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,8 +8,9 @@ Add an entry to the unreleased section whenever merging a PR to main that is not Date: June 21st, 2023 -Interchain Security v3 uses SDK 0.47 and IBC 7. +Interchain Security v3 uses SDK 0.47 and IBC 7. +* (fix) [#1093](https://github.com/cosmos/interchain-security/pull/1093) Make SlashPacketData backward compatible when sending data over the wire * (deps) [#1019](https://github.com/cosmos/interchain-security/pull/1019) Bump multiple dependencies. * Bump [cosmos-sdk](https://github.com/cosmos/cosmos-sdk) to [v0.47.3](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.47.3). * Bump [ibc-go](https://github.com/cosmos/ibc-go) to [v7.1.0](https://github.com/cosmos/ibc-go/releases/tag/v7.1.0). From d16c7669b4f23380a50c8dedfaf6d25f50ca0edd Mon Sep 17 00:00:00 2001 From: yaruwangway <69694322+yaruwangway@users.noreply.github.com> Date: Wed, 5 Jul 2023 14:33:34 +0200 Subject: [PATCH 070/108] fix: `AttributeDistributionTotal` in event emit (#1097) * fix: emitted distribution events * docs: update changelog * fix: lint --------- Co-authored-by: MSalopek --- CHANGELOG.md | 2 ++ x/ccv/consumer/keeper/distribution.go | 9 ++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c07c612136..7f6893544e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ Add an entry to the unreleased section whenever merging a PR to main that is not targeted at a specific release. These entries will eventually be included in a release. +* (fix) [#720](https://github.com/cosmos/interchain-security/issues/720) Fix the attribute `AttributeDistributionTotal` value in `FeeDistribution` event emit. + ## v3.0.0 Date: June 21st, 2023 diff --git a/x/ccv/consumer/keeper/distribution.go b/x/ccv/consumer/keeper/distribution.go index e2c8d2a403..9d59be2f89 100644 --- a/x/ccv/consumer/keeper/distribution.go +++ b/x/ccv/consumer/keeper/distribution.go @@ -113,10 +113,12 @@ func (k Keeper) SendRewardsToProvider(ctx sdk.Context) error { timeoutTimestamp := uint64(ctx.BlockTime().Add(transferTimeoutPeriod).UnixNano()) sentCoins := sdk.NewCoins() + var allBalances sdk.Coins // iterate over all whitelisted reward denoms for _, denom := range k.AllowedRewardDenoms(ctx) { // get the balance of the denom in the toSendToProviderTokens address balance := k.bankKeeper.GetBalance(ctx, tstProviderAddr, denom) + allBalances = allBalances.Add(balance) // if the balance is not zero, if !balance.IsZero() { @@ -138,11 +140,8 @@ func (k Keeper) SendRewardsToProvider(ctx sdk.Context) error { } } - consumerFeePoolAddr := k.authKeeper.GetModuleAccount(ctx, k.feeCollectorName).GetAddress() - fpTokens := k.bankKeeper.GetAllBalances(ctx, consumerFeePoolAddr) - k.Logger(ctx).Info("sent block rewards to provider", - "total fee pool", fpTokens.String(), + "total fee pool", allBalances.String(), "sent", sentCoins.String(), ) currentHeight := ctx.BlockHeight() @@ -153,7 +152,7 @@ func (k Keeper) SendRewardsToProvider(ctx sdk.Context) error { 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, fpTokens.String()), + sdk.NewAttribute(ccv.AttributeDistributionTotal, allBalances.String()), sdk.NewAttribute(ccv.AttributeDistributionToProvider, sentCoins.String()), ), ) From 21b2650741c7d9310d88a5ec82dacc2b47415a3e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Jul 2023 07:05:51 -0700 Subject: [PATCH 071/108] build(deps): bump github.com/cometbft/cometbft from 0.37.1 to 0.37.2 (#1116) Bumps [github.com/cometbft/cometbft](https://github.com/cometbft/cometbft) from 0.37.1 to 0.37.2. - [Release notes](https://github.com/cometbft/cometbft/releases) - [Changelog](https://github.com/cometbft/cometbft/blob/main/CHANGELOG.md) - [Commits](https://github.com/cometbft/cometbft/compare/v0.37.1...v0.37.2) --- updated-dependencies: - dependency-name: github.com/cometbft/cometbft dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b487f32ab9..036c4d4c46 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.20 require ( cosmossdk.io/errors v1.0.0-beta.7 cosmossdk.io/math v1.0.1 - github.com/cometbft/cometbft v0.37.1 + github.com/cometbft/cometbft v0.37.2 github.com/cometbft/cometbft-db v0.8.0 github.com/cosmos/cosmos-sdk v0.47.3 github.com/cosmos/gogoproto v1.4.10 diff --git a/go.sum b/go.sum index 6e22b529cf..6ef711918b 100644 --- a/go.sum +++ b/go.sum @@ -360,8 +360,8 @@ github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE github.com/coinbase/kryptology v1.8.0/go.mod h1:RYXOAPdzOGUe3qlSFkMGn58i3xUA8hmxYHksuq+8ciI= github.com/coinbase/rosetta-sdk-go v0.7.9 h1:lqllBjMnazTjIqYrOGv8h8jxjg9+hJazIGZr9ZvoCcA= github.com/coinbase/rosetta-sdk-go v0.7.9/go.mod h1:0/knutI7XGVqXmmH4OQD8OckFrbQ8yMsUZTG7FXCR2M= -github.com/cometbft/cometbft v0.37.1 h1:KLxkQTK2hICXYq21U2hn1W5hOVYUdQgDQ1uB+90xPIg= -github.com/cometbft/cometbft v0.37.1/go.mod h1:Y2MMMN//O5K4YKd8ze4r9jmk4Y7h0ajqILXbH5JQFVs= +github.com/cometbft/cometbft v0.37.2 h1:XB0yyHGT0lwmJlFmM4+rsRnczPlHoAKFX6K8Zgc2/Jc= +github.com/cometbft/cometbft v0.37.2/go.mod h1:Y2MMMN//O5K4YKd8ze4r9jmk4Y7h0ajqILXbH5JQFVs= github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= From 7fcdf7ea6ae5048b4cd3dec7b7852871983bcc3d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Jul 2023 07:38:23 -0700 Subject: [PATCH 072/108] build(deps): bump bufbuild/buf-setup-action from 1.22.0 to 1.23.1 (#1112) Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.22.0 to 1.23.1. - [Release notes](https://github.com/bufbuild/buf-setup-action/releases) - [Commits](https://github.com/bufbuild/buf-setup-action/compare/v1.22.0...v1.23.1) --- updated-dependencies: - dependency-name: bufbuild/buf-setup-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> --- .github/workflows/proto-registry.yml | 2 +- .github/workflows/proto.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/proto-registry.yml b/.github/workflows/proto-registry.yml index 483fab06c1..08748fe079 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@v3 - - uses: bufbuild/buf-setup-action@v1.22.0 + - uses: bufbuild/buf-setup-action@v1.23.1 - uses: bufbuild/buf-push-action@v1 with: input: "proto" diff --git a/.github/workflows/proto.yml b/.github/workflows/proto.yml index 4f2b512e97..0049c05d20 100644 --- a/.github/workflows/proto.yml +++ b/.github/workflows/proto.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: bufbuild/buf-setup-action@v1.22.0 + - uses: bufbuild/buf-setup-action@v1.23.1 - uses: bufbuild/buf-breaking-action@v1 with: input: "proto" From 30f37f7de67a03df8cab95798584646eda53a626 Mon Sep 17 00:00:00 2001 From: Jacob Gadikian Date: Mon, 10 Jul 2023 16:46:00 +0800 Subject: [PATCH 073/108] refactor: sort imports with gci (#1034) apply gci linter --- .golangci.yml | 13 ++- .../ante/forbidden_proposals_ante.go | 1 - .../ante/forbidden_proposals_ante_test.go | 7 +- app/consumer-democracy/ante_handler.go | 7 +- app/consumer-democracy/app.go | 94 +++++++++---------- app/consumer-democracy/export.go | 6 +- .../proposals_whitelisting.go | 3 +- .../proposals_whitelisting_test.go | 3 +- .../ante/disabled_modules_ante_test.go | 6 +- app/consumer/ante/msg_filter_ante_test.go | 6 +- app/consumer/ante_handler.go | 6 +- app/consumer/app.go | 42 ++++----- app/consumer/export.go | 6 +- app/provider/ante_handler.go | 6 +- app/provider/app.go | 47 +++++----- app/provider/export.go | 4 +- app/sovereign/ante_handler.go | 6 +- app/sovereign/app.go | 86 ++++++++--------- app/sovereign/export.go | 4 +- cmd/interchain-security-cd/cmd/root.go | 13 ++- cmd/interchain-security-cd/main.go | 1 + cmd/interchain-security-cdd/cmd/root.go | 10 +- cmd/interchain-security-cdd/main.go | 1 + cmd/interchain-security-pd/cmd/root.go | 11 ++- cmd/interchain-security-pd/main.go | 1 + cmd/interchain-security-sd/cmd/root.go | 11 ++- cmd/interchain-security-sd/main.go | 1 + tests/difference/core/driver/common.go | 5 +- tests/difference/core/driver/core_test.go | 14 ++- .../core/driver/seed_gen_fuzzy_test.go | 7 +- tests/difference/core/driver/setup.go | 34 ++++--- tests/e2e/actions.go | 5 +- tests/integration/common.go | 20 ++-- tests/integration/democracy.go | 10 +- tests/integration/distribution.go | 3 +- tests/integration/expired_client.go | 10 +- tests/integration/instance_test.go | 3 +- tests/integration/key_assignment.go | 8 +- tests/integration/normal_operations.go | 4 +- tests/integration/setup.go | 18 ++-- tests/integration/slashing.go | 12 ++- tests/integration/stop_consumer.go | 6 +- tests/integration/throttle.go | 6 +- tests/integration/unbonding.go | 1 + tests/integration/valset_update.go | 9 +- x/ccv/consumer/client/cli/query.go | 1 + x/ccv/consumer/ibc_module.go | 12 +-- x/ccv/consumer/ibc_module_test.go | 11 ++- x/ccv/consumer/keeper/changeover.go | 3 +- x/ccv/consumer/keeper/changeover_test.go | 9 +- x/ccv/consumer/keeper/distribution.go | 7 +- x/ccv/consumer/keeper/distribution_test.go | 5 +- x/ccv/consumer/keeper/genesis.go | 5 +- x/ccv/consumer/keeper/genesis_test.go | 20 ++-- x/ccv/consumer/keeper/grpc_query.go | 6 +- x/ccv/consumer/keeper/hooks.go | 1 + x/ccv/consumer/keeper/keeper.go | 15 +-- x/ccv/consumer/keeper/keeper_test.go | 14 +-- x/ccv/consumer/keeper/params_test.go | 3 +- x/ccv/consumer/keeper/relay.go | 11 ++- x/ccv/consumer/keeper/relay_test.go | 16 ++-- x/ccv/consumer/keeper/soft_opt_out.go | 1 + x/ccv/consumer/keeper/soft_opt_out_test.go | 4 +- x/ccv/consumer/keeper/validators.go | 6 +- x/ccv/consumer/keeper/validators_test.go | 12 ++- x/ccv/consumer/module.go | 9 +- x/ccv/consumer/types/genesis.go | 4 +- x/ccv/consumer/types/genesis_test.go | 12 +-- x/ccv/consumer/types/keys.go | 1 + x/ccv/consumer/types/params.go | 1 + x/ccv/consumer/types/validator.go | 1 + x/ccv/democracy/distribution/module.go | 8 +- x/ccv/democracy/governance/module.go | 4 +- x/ccv/democracy/staking/module.go | 3 +- x/ccv/provider/client/cli/tx.go | 2 +- x/ccv/provider/client/proposal_handler.go | 6 +- x/ccv/provider/handler.go | 2 + x/ccv/provider/handler_test.go | 4 +- x/ccv/provider/ibc_module.go | 11 ++- x/ccv/provider/ibc_module_test.go | 13 ++- x/ccv/provider/keeper/distribution.go | 1 + x/ccv/provider/keeper/distribution_test.go | 6 +- x/ccv/provider/keeper/genesis.go | 1 + x/ccv/provider/keeper/genesis_test.go | 9 +- x/ccv/provider/keeper/grpc_query.go | 7 +- x/ccv/provider/keeper/hooks.go | 2 +- x/ccv/provider/keeper/hooks_test.go | 4 +- x/ccv/provider/keeper/keeper.go | 17 ++-- x/ccv/provider/keeper/keeper_test.go | 7 +- x/ccv/provider/keeper/key_assignment.go | 7 +- x/ccv/provider/keeper/key_assignment_test.go | 12 ++- x/ccv/provider/keeper/msg_server.go | 6 +- x/ccv/provider/keeper/params.go | 4 +- x/ccv/provider/keeper/params_test.go | 5 +- x/ccv/provider/keeper/proposal.go | 12 ++- x/ccv/provider/keeper/proposal_test.go | 9 +- x/ccv/provider/keeper/relay.go | 8 +- x/ccv/provider/keeper/relay_test.go | 15 +-- x/ccv/provider/keeper/throttle.go | 4 +- x/ccv/provider/keeper/throttle_test.go | 9 +- x/ccv/provider/module.go | 12 +-- x/ccv/provider/module_test.go | 11 +-- x/ccv/provider/proposal_handler.go | 5 +- x/ccv/provider/proposal_handler_test.go | 9 +- x/ccv/provider/types/genesis.go | 4 +- x/ccv/provider/types/genesis_test.go | 11 ++- x/ccv/provider/types/key_assignment.go | 2 + x/ccv/provider/types/keys_test.go | 4 +- x/ccv/provider/types/params.go | 6 +- x/ccv/provider/types/params_test.go | 7 +- x/ccv/provider/types/proposal.go | 4 +- x/ccv/provider/types/proposal_test.go | 8 +- x/ccv/types/ccv.go | 4 +- x/ccv/types/ccv_test.go | 7 +- x/ccv/types/expected_keepers.go | 12 ++- x/ccv/types/shared_params.go | 3 +- x/ccv/types/utils.go | 13 ++- x/ccv/types/utils_test.go | 7 +- 118 files changed, 612 insertions(+), 482 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 430440a76f..5a3b555a6d 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -10,9 +10,9 @@ run: linters: disable-all: true enable: - - depguard - dogsled - exportloopref + - gci - goconst - gocritic - gofumpt @@ -60,6 +60,17 @@ issues: max-same-issues: 10000 linters-settings: + gci: + sections: + - standard # Standard section: captures all standard packages. + - default # Default section: contains all imports that could not be matched to another section type. + - blank # blank imports + - dot # dot imports + - prefix(cosmossdk.io) + - prefix(github.com/cosmos/cosmos-sdk) + - prefix(github.com/cometbft/cometbft) + - prefix(github.com/cosmos/interchain-security) + custom-order: true gofumpt: # Choose whether to use the extra rules. # Default: false diff --git a/app/consumer-democracy/ante/forbidden_proposals_ante.go b/app/consumer-democracy/ante/forbidden_proposals_ante.go index f8acfd8bc5..2856aa4e5b 100644 --- a/app/consumer-democracy/ante/forbidden_proposals_ante.go +++ b/app/consumer-democracy/ante/forbidden_proposals_ante.go @@ -4,7 +4,6 @@ import ( "fmt" sdk "github.com/cosmos/cosmos-sdk/types" - govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" ) diff --git a/app/consumer-democracy/ante/forbidden_proposals_ante_test.go b/app/consumer-democracy/ante/forbidden_proposals_ante_test.go index bbe9f6a5dd..0b17e1a0b7 100644 --- a/app/consumer-democracy/ante/forbidden_proposals_ante_test.go +++ b/app/consumer-democracy/ante/forbidden_proposals_ante_test.go @@ -3,6 +3,9 @@ package ante_test import ( "testing" + ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + "github.com/stretchr/testify/require" + sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" @@ -10,11 +13,9 @@ import ( govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" "github.com/cosmos/cosmos-sdk/x/params/types/proposal" + app "github.com/cosmos/interchain-security/v3/app/consumer-democracy" "github.com/cosmos/interchain-security/v3/app/consumer-democracy/ante" - "github.com/stretchr/testify/require" - - ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" ) // in SDKv47 parameter updates full params object is required diff --git a/app/consumer-democracy/ante_handler.go b/app/consumer-democracy/ante_handler.go index e27986a482..eff1a5b1c7 100644 --- a/app/consumer-democracy/ante_handler.go +++ b/app/consumer-democracy/ante_handler.go @@ -1,12 +1,15 @@ package app import ( + ibcante "github.com/cosmos/ibc-go/v7/modules/core/ante" + ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" + errorsmod "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/x/auth/ante" - ibcante "github.com/cosmos/ibc-go/v7/modules/core/ante" - ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" + democracyante "github.com/cosmos/interchain-security/v3/app/consumer-democracy/ante" consumerante "github.com/cosmos/interchain-security/v3/app/consumer/ante" ibcconsumerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" diff --git a/app/consumer-democracy/app.go b/app/consumer-democracy/app.go index 6b3078212b..063c5bf427 100644 --- a/app/consumer-democracy/app.go +++ b/app/consumer-democracy/app.go @@ -7,23 +7,29 @@ import ( "os" "path/filepath" - "github.com/cosmos/cosmos-sdk/client/flags" - nodeservice "github.com/cosmos/cosmos-sdk/client/grpc/node" - "github.com/cosmos/cosmos-sdk/runtime" - "github.com/cosmos/cosmos-sdk/x/consensus" - consensusparamkeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" - consensusparamtypes "github.com/cosmos/cosmos-sdk/x/consensus/types" - "github.com/cosmos/cosmos-sdk/x/genutil" - genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - appparams "github.com/cosmos/interchain-security/v3/app/params" + "github.com/cosmos/ibc-go/v7/modules/apps/transfer" + ibctransferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper" + ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + ibc "github.com/cosmos/ibc-go/v7/modules/core" + ibcconnectiontypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" + ibchost "github.com/cosmos/ibc-go/v7/modules/core/exported" + ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" + tendermint "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + "github.com/spf13/cast" autocliv1 "cosmossdk.io/api/cosmos/autocli/v1" reflectionv1 "cosmossdk.io/api/cosmos/reflection/v1" + "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + nodeservice "github.com/cosmos/cosmos-sdk/client/grpc/node" "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/runtime" + runtimeservices "github.com/cosmos/cosmos-sdk/runtime/services" "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/server/api" "github.com/cosmos/cosmos-sdk/server/config" @@ -45,77 +51,67 @@ import ( authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" authzmodule "github.com/cosmos/cosmos-sdk/x/authz/module" "github.com/cosmos/cosmos-sdk/x/bank" - - runtimeservices "github.com/cosmos/cosmos-sdk/runtime/services" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/capability" capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" + "github.com/cosmos/cosmos-sdk/x/consensus" + consensusparamkeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" + consensusparamtypes "github.com/cosmos/cosmos-sdk/x/consensus/types" "github.com/cosmos/cosmos-sdk/x/crisis" crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper" crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types" + distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" + distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" "github.com/cosmos/cosmos-sdk/x/evidence" evidencekeeper "github.com/cosmos/cosmos-sdk/x/evidence/keeper" evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" "github.com/cosmos/cosmos-sdk/x/feegrant" feegrantkeeper "github.com/cosmos/cosmos-sdk/x/feegrant/keeper" feegrantmodule "github.com/cosmos/cosmos-sdk/x/feegrant/module" + "github.com/cosmos/cosmos-sdk/x/genutil" + genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" + gov "github.com/cosmos/cosmos-sdk/x/gov" + govclient "github.com/cosmos/cosmos-sdk/x/gov/client" + govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" + // add mint + mint "github.com/cosmos/cosmos-sdk/x/mint" + mintkeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper" + minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" "github.com/cosmos/cosmos-sdk/x/params" paramsclient "github.com/cosmos/cosmos-sdk/x/params/client" paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper" paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" + paramproposal "github.com/cosmos/cosmos-sdk/x/params/types/proposal" + "github.com/cosmos/cosmos-sdk/x/slashing" + slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" + slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" + stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/cosmos/cosmos-sdk/x/upgrade" upgradeclient "github.com/cosmos/cosmos-sdk/x/upgrade/client" + upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" dbm "github.com/cometbft/cometbft-db" abci "github.com/cometbft/cometbft/abci/types" tmjson "github.com/cometbft/cometbft/libs/json" "github.com/cometbft/cometbft/libs/log" tmos "github.com/cometbft/cometbft/libs/os" - "github.com/cosmos/cosmos-sdk/x/slashing" - slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" - slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" - "github.com/cosmos/cosmos-sdk/x/upgrade" - upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" - upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - "github.com/cosmos/ibc-go/v7/modules/apps/transfer" - ibctransferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper" - ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - ibc "github.com/cosmos/ibc-go/v7/modules/core" - ibcconnectiontypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" - porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" - ibchost "github.com/cosmos/ibc-go/v7/modules/core/exported" - ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" + + appparams "github.com/cosmos/interchain-security/v3/app/params" ibctestingcore "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/core" ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" - "github.com/spf13/cast" - - distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" - distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" testutil "github.com/cosmos/interchain-security/v3/testutil/integration" - ccvdistr "github.com/cosmos/interchain-security/v3/x/ccv/democracy/distribution" - - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - ccvstaking "github.com/cosmos/interchain-security/v3/x/ccv/democracy/staking" - - gov "github.com/cosmos/cosmos-sdk/x/gov" - govclient "github.com/cosmos/cosmos-sdk/x/gov/client" - govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - ccvgov "github.com/cosmos/interchain-security/v3/x/ccv/democracy/governance" - - // add mint - mint "github.com/cosmos/cosmos-sdk/x/mint" - mintkeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper" - minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" - - paramproposal "github.com/cosmos/cosmos-sdk/x/params/types/proposal" - tendermint "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" consumer "github.com/cosmos/interchain-security/v3/x/ccv/consumer" consumerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + ccvdistr "github.com/cosmos/interchain-security/v3/x/ccv/democracy/distribution" + ccvgov "github.com/cosmos/interchain-security/v3/x/ccv/democracy/governance" + ccvstaking "github.com/cosmos/interchain-security/v3/x/ccv/democracy/staking" ) const ( diff --git a/app/consumer-democracy/export.go b/app/consumer-democracy/export.go index 6c511d6871..bb710da1c4 100644 --- a/app/consumer-democracy/export.go +++ b/app/consumer-democracy/export.go @@ -4,12 +4,12 @@ import ( "encoding/json" "fmt" - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" - - tmtypes "github.com/cometbft/cometbft/types" servertypes "github.com/cosmos/cosmos-sdk/server/types" sdk "github.com/cosmos/cosmos-sdk/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" + + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + tmtypes "github.com/cometbft/cometbft/types" ) // ExportAppStateAndValidators exports the state of the application for a genesis diff --git a/app/consumer-democracy/proposals_whitelisting.go b/app/consumer-democracy/proposals_whitelisting.go index ab9114343f..1e9141895c 100644 --- a/app/consumer-democracy/proposals_whitelisting.go +++ b/app/consumer-democracy/proposals_whitelisting.go @@ -1,9 +1,10 @@ package app import ( + ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" "github.com/cosmos/cosmos-sdk/x/params/types/proposal" - ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" ) func IsProposalWhitelisted(content v1beta1.Content) bool { diff --git a/app/consumer-democracy/proposals_whitelisting_test.go b/app/consumer-democracy/proposals_whitelisting_test.go index a51709ae4a..127ec82ec5 100644 --- a/app/consumer-democracy/proposals_whitelisting_test.go +++ b/app/consumer-democracy/proposals_whitelisting_test.go @@ -3,10 +3,11 @@ package app_test import ( "testing" + "github.com/stretchr/testify/require" + appConsumer "github.com/cosmos/interchain-security/v3/app/consumer-democracy" ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" icstestingutils "github.com/cosmos/interchain-security/v3/testutil/ibc_testing" - "github.com/stretchr/testify/require" ) func TestDemocracyGovernanceWhitelistingKeys(t *testing.T) { diff --git a/app/consumer/ante/disabled_modules_ante_test.go b/app/consumer/ante/disabled_modules_ante_test.go index dd58e8b79e..1fa114f00c 100644 --- a/app/consumer/ante/disabled_modules_ante_test.go +++ b/app/consumer/ante/disabled_modules_ante_test.go @@ -3,14 +3,16 @@ package ante_test import ( "testing" + ibcclienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + "github.com/stretchr/testify/require" + sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" - ibcclienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + "github.com/cosmos/interchain-security/v3/app/consumer/ante" "github.com/cosmos/interchain-security/v3/app/params" - "github.com/stretchr/testify/require" ) func TestDisabledModulesDecorator(t *testing.T) { diff --git a/app/consumer/ante/msg_filter_ante_test.go b/app/consumer/ante/msg_filter_ante_test.go index 76b3dec604..04bc838a8a 100644 --- a/app/consumer/ante/msg_filter_ante_test.go +++ b/app/consumer/ante/msg_filter_ante_test.go @@ -3,12 +3,14 @@ package ante_test import ( "testing" + ibcclienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + "github.com/stretchr/testify/require" + sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - ibcclienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + "github.com/cosmos/interchain-security/v3/app/consumer/ante" "github.com/cosmos/interchain-security/v3/app/params" - "github.com/stretchr/testify/require" ) type consumerKeeper struct { diff --git a/app/consumer/ante_handler.go b/app/consumer/ante_handler.go index f963150626..d251966685 100644 --- a/app/consumer/ante_handler.go +++ b/app/consumer/ante_handler.go @@ -1,12 +1,14 @@ package app import ( + ibcante "github.com/cosmos/ibc-go/v7/modules/core/ante" + ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" + errorsmod "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/x/auth/ante" - ibcante "github.com/cosmos/ibc-go/v7/modules/core/ante" - ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" consumerante "github.com/cosmos/interchain-security/v3/app/consumer/ante" ibcconsumerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" diff --git a/app/consumer/app.go b/app/consumer/app.go index 17c15c2c86..c65447e244 100644 --- a/app/consumer/app.go +++ b/app/consumer/app.go @@ -7,14 +7,20 @@ import ( "os" "path/filepath" + "github.com/cosmos/ibc-go/v7/modules/apps/transfer" + ibctransferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper" + ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + ibc "github.com/cosmos/ibc-go/v7/modules/core" + ibcconnectiontypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" + ibchost "github.com/cosmos/ibc-go/v7/modules/core/exported" + ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" + tendermint "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + "github.com/spf13/cast" + autocliv1 "cosmossdk.io/api/cosmos/autocli/v1" reflectionv1 "cosmossdk.io/api/cosmos/reflection/v1" - dbm "github.com/cometbft/cometbft-db" - abci "github.com/cometbft/cometbft/abci/types" - tmjson "github.com/cometbft/cometbft/libs/json" - "github.com/cometbft/cometbft/libs/log" - tmos "github.com/cometbft/cometbft/libs/os" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" @@ -35,9 +41,6 @@ import ( "github.com/cosmos/cosmos-sdk/version" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/auth/ante" - "github.com/cosmos/cosmos-sdk/x/genutil" - genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" authsims "github.com/cosmos/cosmos-sdk/x/auth/simulation" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" @@ -63,6 +66,8 @@ import ( "github.com/cosmos/cosmos-sdk/x/feegrant" feegrantkeeper "github.com/cosmos/cosmos-sdk/x/feegrant/keeper" feegrantmodule "github.com/cosmos/cosmos-sdk/x/feegrant/module" + "github.com/cosmos/cosmos-sdk/x/genutil" + genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/cosmos/cosmos-sdk/x/params" paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper" @@ -73,25 +78,20 @@ import ( "github.com/cosmos/cosmos-sdk/x/upgrade" upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - "github.com/cosmos/ibc-go/v7/modules/apps/transfer" - ibctransferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper" - ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - ibc "github.com/cosmos/ibc-go/v7/modules/core" - ibcconnectiontypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" - porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" - ibchost "github.com/cosmos/ibc-go/v7/modules/core/exported" - ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" + + dbm "github.com/cometbft/cometbft-db" + abci "github.com/cometbft/cometbft/abci/types" + tmjson "github.com/cometbft/cometbft/libs/json" + "github.com/cometbft/cometbft/libs/log" + tmos "github.com/cometbft/cometbft/libs/os" + appparams "github.com/cosmos/interchain-security/v3/app/params" ibctestingcore "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/core" ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" - "github.com/spf13/cast" - - tendermint "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + testutil "github.com/cosmos/interchain-security/v3/testutil/integration" ibcconsumer "github.com/cosmos/interchain-security/v3/x/ccv/consumer" ibcconsumerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" ibcconsumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" - - testutil "github.com/cosmos/interchain-security/v3/testutil/integration" ) const ( diff --git a/app/consumer/export.go b/app/consumer/export.go index 168e5385a1..4260efda92 100644 --- a/app/consumer/export.go +++ b/app/consumer/export.go @@ -4,12 +4,12 @@ import ( "encoding/json" "fmt" - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" - - tmtypes "github.com/cometbft/cometbft/types" servertypes "github.com/cosmos/cosmos-sdk/server/types" sdk "github.com/cosmos/cosmos-sdk/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" + + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + tmtypes "github.com/cometbft/cometbft/types" ) // ExportAppStateAndValidators implements the simapp app interface diff --git a/app/provider/ante_handler.go b/app/provider/ante_handler.go index 0a71573b07..9ba33d3264 100644 --- a/app/provider/ante_handler.go +++ b/app/provider/ante_handler.go @@ -1,12 +1,14 @@ package app import ( + ibcante "github.com/cosmos/ibc-go/v7/modules/core/ante" + ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" + errorsmod "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/x/auth/ante" - ibcante "github.com/cosmos/ibc-go/v7/modules/core/ante" - ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" ) // HandlerOptions extend the SDK's AnteHandler options by requiring the IBC diff --git a/app/provider/app.go b/app/provider/app.go index d810ff360f..a25e3f4ab6 100644 --- a/app/provider/app.go +++ b/app/provider/app.go @@ -7,22 +7,33 @@ import ( "os" "path/filepath" - "github.com/cosmos/cosmos-sdk/client/flags" - nodeservice "github.com/cosmos/cosmos-sdk/client/grpc/node" - "github.com/cosmos/cosmos-sdk/runtime" - "github.com/cosmos/cosmos-sdk/server" + "github.com/cosmos/ibc-go/v7/modules/apps/transfer" + ibctransferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper" + ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + ibc "github.com/cosmos/ibc-go/v7/modules/core" + ibcclient "github.com/cosmos/ibc-go/v7/modules/core/02-client" + ibcclientclient "github.com/cosmos/ibc-go/v7/modules/core/02-client/client" + ibcclienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + ibcconnectiontypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" + ibchost "github.com/cosmos/ibc-go/v7/modules/core/exported" + ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" + tendermint "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + "github.com/spf13/cast" autocliv1 "cosmossdk.io/api/cosmos/autocli/v1" reflectionv1 "cosmossdk.io/api/cosmos/reflection/v1" - appparams "github.com/cosmos/interchain-security/v3/app/params" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + nodeservice "github.com/cosmos/cosmos-sdk/client/grpc/node" "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" "github.com/cosmos/cosmos-sdk/codec" - runtimeservices "github.com/cosmos/cosmos-sdk/runtime/services" - "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/runtime" + runtimeservices "github.com/cosmos/cosmos-sdk/runtime/services" + "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/server/api" "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" @@ -80,35 +91,21 @@ import ( upgradeclient "github.com/cosmos/cosmos-sdk/x/upgrade/client" upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - "github.com/cosmos/ibc-go/v7/modules/apps/transfer" - ibctransferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper" - ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - ibc "github.com/cosmos/ibc-go/v7/modules/core" - ibcclient "github.com/cosmos/ibc-go/v7/modules/core/02-client" - ibcclientclient "github.com/cosmos/ibc-go/v7/modules/core/02-client/client" - ibcclienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" - ibcconnectiontypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" - porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" - ibchost "github.com/cosmos/ibc-go/v7/modules/core/exported" - ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" - tendermint "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - - ibctestingcore "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/core" - ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" dbm "github.com/cometbft/cometbft-db" abci "github.com/cometbft/cometbft/abci/types" tmjson "github.com/cometbft/cometbft/libs/json" "github.com/cometbft/cometbft/libs/log" tmos "github.com/cometbft/cometbft/libs/os" - "github.com/spf13/cast" + appparams "github.com/cosmos/interchain-security/v3/app/params" + ibctestingcore "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/core" + ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" + testutil "github.com/cosmos/interchain-security/v3/testutil/integration" ibcprovider "github.com/cosmos/interchain-security/v3/x/ccv/provider" ibcproviderclient "github.com/cosmos/interchain-security/v3/x/ccv/provider/client" ibcproviderkeeper "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" - - testutil "github.com/cosmos/interchain-security/v3/testutil/integration" ) const ( diff --git a/app/provider/export.go b/app/provider/export.go index 3865026b01..74faed0657 100644 --- a/app/provider/export.go +++ b/app/provider/export.go @@ -4,13 +4,13 @@ import ( "encoding/json" "log" - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" - servertypes "github.com/cosmos/cosmos-sdk/server/types" sdk "github.com/cosmos/cosmos-sdk/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" "github.com/cosmos/cosmos-sdk/x/staking" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" ) // ExportAppStateAndValidators exports the state of the application for a genesis diff --git a/app/sovereign/ante_handler.go b/app/sovereign/ante_handler.go index 0a71573b07..9ba33d3264 100644 --- a/app/sovereign/ante_handler.go +++ b/app/sovereign/ante_handler.go @@ -1,12 +1,14 @@ package app import ( + ibcante "github.com/cosmos/ibc-go/v7/modules/core/ante" + ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" + errorsmod "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/x/auth/ante" - ibcante "github.com/cosmos/ibc-go/v7/modules/core/ante" - ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" ) // HandlerOptions extend the SDK's AnteHandler options by requiring the IBC diff --git a/app/sovereign/app.go b/app/sovereign/app.go index b1049255f9..1693cb1b60 100644 --- a/app/sovereign/app.go +++ b/app/sovereign/app.go @@ -7,10 +7,19 @@ import ( "os" "path/filepath" + "github.com/cosmos/ibc-go/v7/modules/apps/transfer" + ibctransferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper" + ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + ibc "github.com/cosmos/ibc-go/v7/modules/core" + ibcconnectiontypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" + ibchost "github.com/cosmos/ibc-go/v7/modules/core/exported" + ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" + tendermint "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + "github.com/spf13/cast" + autocliv1 "cosmossdk.io/api/cosmos/autocli/v1" reflectionv1 "cosmossdk.io/api/cosmos/reflection/v1" - runtimeservices "github.com/cosmos/cosmos-sdk/runtime/services" - appparams "github.com/cosmos/interchain-security/v3/app/params" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" @@ -20,8 +29,8 @@ import ( "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/runtime" + runtimeservices "github.com/cosmos/cosmos-sdk/runtime/services" "github.com/cosmos/cosmos-sdk/server" - "github.com/cosmos/cosmos-sdk/server/api" "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" @@ -30,11 +39,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/version" - - "github.com/cosmos/cosmos-sdk/x/consensus" - consensusparamkeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" - consensusparamtypes "github.com/cosmos/cosmos-sdk/x/consensus/types" - "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/auth/ante" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" @@ -51,70 +55,58 @@ import ( "github.com/cosmos/cosmos-sdk/x/capability" capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" + "github.com/cosmos/cosmos-sdk/x/consensus" + consensusparamkeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" + consensusparamtypes "github.com/cosmos/cosmos-sdk/x/consensus/types" "github.com/cosmos/cosmos-sdk/x/crisis" crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper" crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types" + sdkdistr "github.com/cosmos/cosmos-sdk/x/distribution" + distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" + distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" "github.com/cosmos/cosmos-sdk/x/evidence" evidencekeeper "github.com/cosmos/cosmos-sdk/x/evidence/keeper" evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" "github.com/cosmos/cosmos-sdk/x/feegrant" feegrantkeeper "github.com/cosmos/cosmos-sdk/x/feegrant/keeper" feegrantmodule "github.com/cosmos/cosmos-sdk/x/feegrant/module" + "github.com/cosmos/cosmos-sdk/x/genutil" + genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" + sdkgov "github.com/cosmos/cosmos-sdk/x/gov" govclient "github.com/cosmos/cosmos-sdk/x/gov/client" + govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - + // add mint + mint "github.com/cosmos/cosmos-sdk/x/mint" + mintkeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper" + minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" "github.com/cosmos/cosmos-sdk/x/params" paramsclient "github.com/cosmos/cosmos-sdk/x/params/client" paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper" paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" + paramproposal "github.com/cosmos/cosmos-sdk/x/params/types/proposal" + "github.com/cosmos/cosmos-sdk/x/slashing" + slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" + slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" + sdkstaking "github.com/cosmos/cosmos-sdk/x/staking" + stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/cosmos/cosmos-sdk/x/upgrade" upgradeclient "github.com/cosmos/cosmos-sdk/x/upgrade/client" + upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" dbm "github.com/cometbft/cometbft-db" abci "github.com/cometbft/cometbft/abci/types" tmjson "github.com/cometbft/cometbft/libs/json" "github.com/cometbft/cometbft/libs/log" tmos "github.com/cometbft/cometbft/libs/os" - "github.com/cosmos/cosmos-sdk/x/slashing" - slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" - slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" - "github.com/cosmos/cosmos-sdk/x/upgrade" - upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" - upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - "github.com/cosmos/ibc-go/v7/modules/apps/transfer" - ibctransferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper" - ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - ibc "github.com/cosmos/ibc-go/v7/modules/core" - ibcconnectiontypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" - porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" - ibchost "github.com/cosmos/ibc-go/v7/modules/core/exported" - ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" + + appparams "github.com/cosmos/interchain-security/v3/app/params" ibctestingcore "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/core" ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" - "github.com/spf13/cast" - - sdkdistr "github.com/cosmos/cosmos-sdk/x/distribution" - distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" - distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" testutil "github.com/cosmos/interchain-security/v3/testutil/integration" - - sdkstaking "github.com/cosmos/cosmos-sdk/x/staking" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - - "github.com/cosmos/cosmos-sdk/x/genutil" - genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - - sdkgov "github.com/cosmos/cosmos-sdk/x/gov" - govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - - // add mint - mint "github.com/cosmos/cosmos-sdk/x/mint" - mintkeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper" - minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" - - paramproposal "github.com/cosmos/cosmos-sdk/x/params/types/proposal" - tendermint "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" ) const ( diff --git a/app/sovereign/export.go b/app/sovereign/export.go index 770d9b540f..93d46bf973 100644 --- a/app/sovereign/export.go +++ b/app/sovereign/export.go @@ -4,13 +4,13 @@ import ( "encoding/json" "log" - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" - servertypes "github.com/cosmos/cosmos-sdk/server/types" sdk "github.com/cosmos/cosmos-sdk/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" "github.com/cosmos/cosmos-sdk/x/staking" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" ) // ExportAppStateAndValidators exports the state of the application for a genesis diff --git a/cmd/interchain-security-cd/cmd/root.go b/cmd/interchain-security-cd/cmd/root.go index 5fac172a96..30c032bbea 100644 --- a/cmd/interchain-security-cd/cmd/root.go +++ b/cmd/interchain-security-cd/cmd/root.go @@ -5,15 +5,11 @@ import ( "io" "os" - dbm "github.com/cometbft/cometbft-db" - tmcfg "github.com/cometbft/cometbft/config" - "github.com/cometbft/cometbft/libs/log" - serverconfig "github.com/cosmos/cosmos-sdk/server/config" - simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" "github.com/spf13/cobra" "github.com/spf13/viper" rosettaCmd "cosmossdk.io/tools/rosetta/cmd" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/config" "github.com/cosmos/cosmos-sdk/client/debug" @@ -22,12 +18,19 @@ import ( "github.com/cosmos/cosmos-sdk/client/pruning" "github.com/cosmos/cosmos-sdk/client/rpc" "github.com/cosmos/cosmos-sdk/server" + serverconfig "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" + simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/cosmos/cosmos-sdk/x/crisis" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" + + dbm "github.com/cometbft/cometbft-db" + tmcfg "github.com/cometbft/cometbft/config" + "github.com/cometbft/cometbft/libs/log" + consumer "github.com/cosmos/interchain-security/v3/app/consumer" "github.com/cosmos/interchain-security/v3/app/params" ) diff --git a/cmd/interchain-security-cd/main.go b/cmd/interchain-security-cd/main.go index 012e5c6d44..12afc46e65 100644 --- a/cmd/interchain-security-cd/main.go +++ b/cmd/interchain-security-cd/main.go @@ -5,6 +5,7 @@ import ( "github.com/cosmos/cosmos-sdk/server" svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" + app "github.com/cosmos/interchain-security/v3/app/consumer" "github.com/cosmos/interchain-security/v3/cmd/interchain-security-cd/cmd" ) diff --git a/cmd/interchain-security-cdd/cmd/root.go b/cmd/interchain-security-cdd/cmd/root.go index 1e3f038717..989bb5a462 100644 --- a/cmd/interchain-security-cdd/cmd/root.go +++ b/cmd/interchain-security-cdd/cmd/root.go @@ -5,14 +5,11 @@ import ( "io" "os" - dbm "github.com/cometbft/cometbft-db" - "github.com/cometbft/cometbft/libs/log" - serverconfig "github.com/cosmos/cosmos-sdk/server/config" "github.com/spf13/cobra" "github.com/spf13/viper" rosettaCmd "cosmossdk.io/tools/rosetta/cmd" - tmcfg "github.com/cometbft/cometbft/config" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/config" "github.com/cosmos/cosmos-sdk/client/debug" @@ -21,6 +18,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/pruning" "github.com/cosmos/cosmos-sdk/client/rpc" "github.com/cosmos/cosmos-sdk/server" + serverconfig "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" @@ -29,6 +27,10 @@ import ( "github.com/cosmos/cosmos-sdk/x/crisis" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" + dbm "github.com/cometbft/cometbft-db" + tmcfg "github.com/cometbft/cometbft/config" + "github.com/cometbft/cometbft/libs/log" + cdd "github.com/cosmos/interchain-security/v3/app/consumer-democracy" "github.com/cosmos/interchain-security/v3/app/params" ) diff --git a/cmd/interchain-security-cdd/main.go b/cmd/interchain-security-cdd/main.go index 5d04ea379b..085903425e 100644 --- a/cmd/interchain-security-cdd/main.go +++ b/cmd/interchain-security-cdd/main.go @@ -5,6 +5,7 @@ import ( "github.com/cosmos/cosmos-sdk/server" svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" + app "github.com/cosmos/interchain-security/v3/app/consumer-democracy" "github.com/cosmos/interchain-security/v3/cmd/interchain-security-cdd/cmd" ) diff --git a/cmd/interchain-security-pd/cmd/root.go b/cmd/interchain-security-pd/cmd/root.go index 246e1c182b..745d81127c 100644 --- a/cmd/interchain-security-pd/cmd/root.go +++ b/cmd/interchain-security-pd/cmd/root.go @@ -5,14 +5,11 @@ import ( "io" "os" - dbm "github.com/cometbft/cometbft-db" - "github.com/cometbft/cometbft/libs/log" - serverconfig "github.com/cosmos/cosmos-sdk/server/config" "github.com/spf13/cobra" "github.com/spf13/viper" rosettaCmd "cosmossdk.io/tools/rosetta/cmd" - tmcfg "github.com/cometbft/cometbft/config" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/config" "github.com/cosmos/cosmos-sdk/client/debug" @@ -21,6 +18,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/pruning" "github.com/cosmos/cosmos-sdk/client/rpc" "github.com/cosmos/cosmos-sdk/server" + serverconfig "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" @@ -28,6 +26,11 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/cosmos/cosmos-sdk/x/crisis" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" + + dbm "github.com/cometbft/cometbft-db" + tmcfg "github.com/cometbft/cometbft/config" + "github.com/cometbft/cometbft/libs/log" + "github.com/cosmos/interchain-security/v3/app/params" providerApp "github.com/cosmos/interchain-security/v3/app/provider" ) diff --git a/cmd/interchain-security-pd/main.go b/cmd/interchain-security-pd/main.go index 9ad1cd67cc..361c0fb8e1 100644 --- a/cmd/interchain-security-pd/main.go +++ b/cmd/interchain-security-pd/main.go @@ -5,6 +5,7 @@ import ( "github.com/cosmos/cosmos-sdk/server" svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" + app "github.com/cosmos/interchain-security/v3/app/provider" "github.com/cosmos/interchain-security/v3/cmd/interchain-security-pd/cmd" ) diff --git a/cmd/interchain-security-sd/cmd/root.go b/cmd/interchain-security-sd/cmd/root.go index a93c841474..e5264b8735 100644 --- a/cmd/interchain-security-sd/cmd/root.go +++ b/cmd/interchain-security-sd/cmd/root.go @@ -5,14 +5,11 @@ import ( "io" "os" - dbm "github.com/cometbft/cometbft-db" - "github.com/cometbft/cometbft/libs/log" - serverconfig "github.com/cosmos/cosmos-sdk/server/config" "github.com/spf13/cobra" "github.com/spf13/viper" rosettaCmd "cosmossdk.io/tools/rosetta/cmd" - tmcfg "github.com/cometbft/cometbft/config" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/config" "github.com/cosmos/cosmos-sdk/client/debug" @@ -21,6 +18,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/pruning" "github.com/cosmos/cosmos-sdk/client/rpc" "github.com/cosmos/cosmos-sdk/server" + serverconfig "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" @@ -28,6 +26,11 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/cosmos/cosmos-sdk/x/crisis" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" + + dbm "github.com/cometbft/cometbft-db" + tmcfg "github.com/cometbft/cometbft/config" + "github.com/cometbft/cometbft/libs/log" + "github.com/cosmos/interchain-security/v3/app/params" sovereignApp "github.com/cosmos/interchain-security/v3/app/sovereign" ) diff --git a/cmd/interchain-security-sd/main.go b/cmd/interchain-security-sd/main.go index 7c4dc35493..9b59188ea5 100644 --- a/cmd/interchain-security-sd/main.go +++ b/cmd/interchain-security-sd/main.go @@ -5,6 +5,7 @@ import ( "github.com/cosmos/cosmos-sdk/server" svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" + app "github.com/cosmos/interchain-security/v3/app/sovereign" "github.com/cosmos/interchain-security/v3/cmd/interchain-security-sd/cmd" ) diff --git a/tests/difference/core/driver/common.go b/tests/difference/core/driver/common.go index bff271e235..8ea1a4cc36 100644 --- a/tests/difference/core/driver/common.go +++ b/tests/difference/core/driver/common.go @@ -3,10 +3,11 @@ package core import ( "time" - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" - tmtypes "github.com/cometbft/cometbft/types" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + tmtypes "github.com/cometbft/cometbft/types" ) const ( diff --git a/tests/difference/core/driver/core_test.go b/tests/difference/core/driver/core_test.go index 648955f66d..12192eb8e4 100644 --- a/tests/difference/core/driver/core_test.go +++ b/tests/difference/core/driver/core_test.go @@ -5,21 +5,19 @@ import ( "testing" "time" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/suite" - channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" - ibctestingcore "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/core" - ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" + "github.com/stretchr/testify/suite" + sdk "github.com/cosmos/cosmos-sdk/types" + slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + appConsumer "github.com/cosmos/interchain-security/v3/app/consumer" appProvider "github.com/cosmos/interchain-security/v3/app/provider" - + ibctestingcore "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/core" + ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" simibc "github.com/cosmos/interchain-security/v3/testutil/simibc" - - slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" consumerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" ) diff --git a/tests/difference/core/driver/seed_gen_fuzzy_test.go b/tests/difference/core/driver/seed_gen_fuzzy_test.go index 0ea051c63b..610d31e40e 100644 --- a/tests/difference/core/driver/seed_gen_fuzzy_test.go +++ b/tests/difference/core/driver/seed_gen_fuzzy_test.go @@ -2,15 +2,16 @@ package core_test import ( "bytes" + cryptoEd25519 "crypto/ed25519" "testing" - cryptoEd25519 "crypto/ed25519" + mock "github.com/cosmos/ibc-go/v7/testing/mock" - tmtypes "github.com/cometbft/cometbft/types" cosmosEd25519 "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - mock "github.com/cosmos/ibc-go/v7/testing/mock" + + tmtypes "github.com/cometbft/cometbft/types" ) func GetPV(seed []byte) mock.PV { diff --git a/tests/difference/core/driver/setup.go b/tests/difference/core/driver/setup.go index ff42784bc5..fb5bf6a611 100644 --- a/tests/difference/core/driver/setup.go +++ b/tests/difference/core/driver/setup.go @@ -6,41 +6,39 @@ import ( "encoding/json" "time" - abci "github.com/cometbft/cometbft/abci/types" - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" - tmtypes "github.com/cometbft/cometbft/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + "github.com/cosmos/ibc-go/v7/testing/mock" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" + "github.com/cosmos/cosmos-sdk/baseapp" codectypes "github.com/cosmos/cosmos-sdk/codec/types" + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" cosmosEd25519 "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/stretchr/testify/require" - "github.com/stretchr/testify/suite" - - ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" - - cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - - clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" - commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" - ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - "github.com/cosmos/ibc-go/v7/testing/mock" - slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + + abci "github.com/cometbft/cometbft/abci/types" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + tmtypes "github.com/cometbft/cometbft/types" + appConsumer "github.com/cosmos/interchain-security/v3/app/consumer" appProvider "github.com/cosmos/interchain-security/v3/app/provider" + ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" icstestingutils "github.com/cosmos/interchain-security/v3/testutil/ibc_testing" simibc "github.com/cosmos/interchain-security/v3/testutil/simibc" consumerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" providerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" - ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) diff --git a/tests/e2e/actions.go b/tests/e2e/actions.go index 719e5d7517..3dd8fb704e 100644 --- a/tests/e2e/actions.go +++ b/tests/e2e/actions.go @@ -12,13 +12,14 @@ import ( "sync" "time" - evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + "github.com/tidwall/gjson" + + evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" "github.com/cosmos/interchain-security/v3/x/ccv/provider/client" "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" - "github.com/tidwall/gjson" ) type SendTokensAction struct { diff --git a/tests/integration/common.go b/tests/integration/common.go index d387760724..7d5175d5d7 100644 --- a/tests/integration/common.go +++ b/tests/integration/common.go @@ -4,24 +4,28 @@ import ( "fmt" "time" - "cosmossdk.io/math" - abci "github.com/cometbft/cometbft/abci/types" - tmtypes "github.com/cometbft/cometbft/types" - cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" "github.com/cosmos/ibc-go/v7/modules/core/exported" ibctm "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + "github.com/stretchr/testify/require" + + "cosmossdk.io/math" + + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + + abci "github.com/cometbft/cometbft/abci/types" + tmtypes "github.com/cometbft/cometbft/types" + ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" icstestingutils "github.com/cosmos/interchain-security/v3/testutil/ibc_testing" testutil "github.com/cosmos/interchain-security/v3/testutil/integration" providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" - "github.com/stretchr/testify/require" ) // ChainType defines the type of chain (either provider or consumer) diff --git a/tests/integration/democracy.go b/tests/integration/democracy.go index f914d581d7..461cfec3b3 100644 --- a/tests/integration/democracy.go +++ b/tests/integration/democracy.go @@ -4,18 +4,20 @@ import ( "testing" "time" + "github.com/stretchr/testify/suite" + "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" - icstestingutils "github.com/cosmos/interchain-security/v3/testutil/ibc_testing" + sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" + + ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" + icstestingutils "github.com/cosmos/interchain-security/v3/testutil/ibc_testing" testutil "github.com/cosmos/interchain-security/v3/testutil/integration" consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" - "github.com/stretchr/testify/suite" ) type ConsumerDemocracyTestSuite struct { diff --git a/tests/integration/distribution.go b/tests/integration/distribution.go index 8ba2a8756b..a896a6f22b 100644 --- a/tests/integration/distribution.go +++ b/tests/integration/distribution.go @@ -3,10 +3,11 @@ package integration import ( "strings" + transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" diff --git a/tests/integration/expired_client.go b/tests/integration/expired_client.go index 89c8280b33..38d2a3ab5e 100644 --- a/tests/integration/expired_client.go +++ b/tests/integration/expired_client.go @@ -3,14 +3,16 @@ package integration import ( "time" - abci "github.com/cometbft/cometbft/abci/types" - "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" - sdk "github.com/cosmos/cosmos-sdk/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" ibctm "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + sdk "github.com/cosmos/cosmos-sdk/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + + abci "github.com/cometbft/cometbft/abci/types" + ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) diff --git a/tests/integration/instance_test.go b/tests/integration/instance_test.go index 7602f02c5e..3c2f018807 100644 --- a/tests/integration/instance_test.go +++ b/tests/integration/instance_test.go @@ -3,12 +3,13 @@ package integration_test import ( "testing" + "github.com/stretchr/testify/suite" + appConsumer "github.com/cosmos/interchain-security/v3/app/consumer" appConsumerDemocracy "github.com/cosmos/interchain-security/v3/app/consumer-democracy" appProvider "github.com/cosmos/interchain-security/v3/app/provider" intg "github.com/cosmos/interchain-security/v3/tests/integration" icstestingutils "github.com/cosmos/interchain-security/v3/testutil/ibc_testing" - "github.com/stretchr/testify/suite" ) // This file can be used as an example integration testing instance for any provider/consumer applications. diff --git a/tests/integration/key_assignment.go b/tests/integration/key_assignment.go index 5ffabbeab4..fbe6430c67 100644 --- a/tests/integration/key_assignment.go +++ b/tests/integration/key_assignment.go @@ -1,11 +1,13 @@ package integration import ( - tmencoding "github.com/cometbft/cometbft/crypto/encoding" - tmprotocrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" + "github.com/cosmos/ibc-go/v7/testing/mock" + sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/cosmos/ibc-go/v7/testing/mock" + + tmencoding "github.com/cometbft/cometbft/crypto/encoding" + tmprotocrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" providerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" diff --git a/tests/integration/normal_operations.go b/tests/integration/normal_operations.go index af2137e5dc..b676689e89 100644 --- a/tests/integration/normal_operations.go +++ b/tests/integration/normal_operations.go @@ -1,8 +1,10 @@ package integration import ( - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" ) diff --git a/tests/integration/setup.go b/tests/integration/setup.go index 07987ce0d7..a18ff551e4 100644 --- a/tests/integration/setup.go +++ b/tests/integration/setup.go @@ -3,21 +3,21 @@ package integration import ( "testing" - tmencoding "github.com/cometbft/cometbft/crypto/encoding" - sdk "github.com/cosmos/cosmos-sdk/types" + transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" "github.com/cosmos/ibc-go/v7/testing/mock" - testutil "github.com/cosmos/interchain-security/v3/testutil/integration" + "github.com/stretchr/testify/suite" + + sdk "github.com/cosmos/cosmos-sdk/types" + + tmencoding "github.com/cometbft/cometbft/crypto/encoding" + ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" icstestingutils "github.com/cosmos/interchain-security/v3/testutil/ibc_testing" + testutil "github.com/cosmos/interchain-security/v3/testutil/integration" consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" - - transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" - ibctesting "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/testing" - - "github.com/stretchr/testify/suite" ) // Callback for instantiating a new coordinator with a provider test chains diff --git a/tests/integration/slashing.go b/tests/integration/slashing.go index 68b632efe1..28ae9da958 100644 --- a/tests/integration/slashing.go +++ b/tests/integration/slashing.go @@ -4,20 +4,22 @@ import ( "fmt" "time" - abci "github.com/cometbft/cometbft/abci/types" - "github.com/cometbft/cometbft/crypto/ed25519" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" sdk "github.com/cosmos/cosmos-sdk/types" evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" + abci "github.com/cometbft/cometbft/abci/types" + "github.com/cometbft/cometbft/crypto/ed25519" tmtypes "github.com/cometbft/cometbft/types" - clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + keepertestutil "github.com/cosmos/interchain-security/v3/testutil/keeper" providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) // TestRelayAndApplyDowntimePacket tests that downtime slash packets can be properly relayed diff --git a/tests/integration/stop_consumer.go b/tests/integration/stop_consumer.go index f6e0d77d59..43ecaf9e33 100644 --- a/tests/integration/stop_consumer.go +++ b/tests/integration/stop_consumer.go @@ -1,10 +1,12 @@ package integration import ( - abci "github.com/cometbft/cometbft/abci/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + + abci "github.com/cometbft/cometbft/abci/types" "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" diff --git a/tests/integration/throttle.go b/tests/integration/throttle.go index 0620bdd6b6..0505d6257a 100644 --- a/tests/integration/throttle.go +++ b/tests/integration/throttle.go @@ -3,10 +3,12 @@ package integration import ( "time" - tmtypes "github.com/cometbft/cometbft/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + + tmtypes "github.com/cometbft/cometbft/types" icstestingutils "github.com/cosmos/interchain-security/v3/testutil/ibc_testing" "github.com/cosmos/interchain-security/v3/x/ccv/provider" diff --git a/tests/integration/unbonding.go b/tests/integration/unbonding.go index 87454be324..7693c782e5 100644 --- a/tests/integration/unbonding.go +++ b/tests/integration/unbonding.go @@ -4,6 +4,7 @@ import ( "time" "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" providerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" diff --git a/tests/integration/valset_update.go b/tests/integration/valset_update.go index e1c0d920ea..955261aa79 100644 --- a/tests/integration/valset_update.go +++ b/tests/integration/valset_update.go @@ -3,11 +3,14 @@ package integration import ( "time" - abci "github.com/cometbft/cometbft/abci/types" - cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - sdk "github.com/cosmos/cosmos-sdk/types" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + + abci "github.com/cometbft/cometbft/abci/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) diff --git a/x/ccv/consumer/client/cli/query.go b/x/ccv/consumer/client/cli/query.go index dc88aaf9d9..a961b9642c 100644 --- a/x/ccv/consumer/client/cli/query.go +++ b/x/ccv/consumer/client/cli/query.go @@ -5,6 +5,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" ) diff --git a/x/ccv/consumer/ibc_module.go b/x/ccv/consumer/ibc_module.go index 0ca0b29370..74c4cff27c 100644 --- a/x/ccv/consumer/ibc_module.go +++ b/x/ccv/consumer/ibc_module.go @@ -4,18 +4,18 @@ import ( "fmt" "strings" - errorsmod "cosmossdk.io/errors" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - - sdk "github.com/cosmos/cosmos-sdk/types" - capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" host "github.com/cosmos/ibc-go/v7/modules/core/24-host" ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" + errorsmod "cosmossdk.io/errors" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" + "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" diff --git a/x/ccv/consumer/ibc_module_test.go b/x/ccv/consumer/ibc_module_test.go index 9e326bcbe6..a451625230 100644 --- a/x/ccv/consumer/ibc_module_test.go +++ b/x/ccv/consumer/ibc_module_test.go @@ -3,20 +3,21 @@ package consumer_test import ( "testing" - sdk "github.com/cosmos/cosmos-sdk/types" - capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" conntypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" host "github.com/cosmos/ibc-go/v7/modules/core/24-host" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/require" + + sdk "github.com/cosmos/cosmos-sdk/types" + capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" + testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" "github.com/cosmos/interchain-security/v3/x/ccv/consumer" consumerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" - - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/require" ) // TestOnChanOpenInit validates the consumer's OnChanOpenInit implementation against the spec. diff --git a/x/ccv/consumer/keeper/changeover.go b/x/ccv/consumer/keeper/changeover.go index 1221792d3c..74276d1253 100644 --- a/x/ccv/consumer/keeper/changeover.go +++ b/x/ccv/consumer/keeper/changeover.go @@ -1,8 +1,9 @@ package keeper import ( - abci "github.com/cometbft/cometbft/abci/types" sdk "github.com/cosmos/cosmos-sdk/types" + + abci "github.com/cometbft/cometbft/abci/types" ) // ChangeoverIsComplete returns whether the standalone to consumer changeover process is complete. diff --git a/x/ccv/consumer/keeper/changeover_test.go b/x/ccv/consumer/keeper/changeover_test.go index 4009890b52..fcd9a70459 100644 --- a/x/ccv/consumer/keeper/changeover_test.go +++ b/x/ccv/consumer/keeper/changeover_test.go @@ -3,13 +3,16 @@ package keeper_test import ( "testing" - abci "github.com/cometbft/cometbft/abci/types" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/require" + sdkcryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + + abci "github.com/cometbft/cometbft/abci/types" + "github.com/cosmos/interchain-security/v3/testutil/crypto" uthelpers "github.com/cosmos/interchain-security/v3/testutil/keeper" - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/require" ) func TestChangeoverToConsumer(t *testing.T) { diff --git a/x/ccv/consumer/keeper/distribution.go b/x/ccv/consumer/keeper/distribution.go index 9d59be2f89..48f1c5a1eb 100644 --- a/x/ccv/consumer/keeper/distribution.go +++ b/x/ccv/consumer/keeper/distribution.go @@ -4,13 +4,14 @@ import ( "fmt" "strconv" - errorsmod "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" - transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + errorsmod "cosmossdk.io/errors" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) diff --git a/x/ccv/consumer/keeper/distribution_test.go b/x/ccv/consumer/keeper/distribution_test.go index 07f49b5b8c..71df5fd93d 100644 --- a/x/ccv/consumer/keeper/distribution_test.go +++ b/x/ccv/consumer/keeper/distribution_test.go @@ -4,13 +4,14 @@ import ( "strings" "testing" - sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" + sdk "github.com/cosmos/cosmos-sdk/types" authTypes "github.com/cosmos/cosmos-sdk/x/auth/types" + testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" - "github.com/golang/mock/gomock" ) // TestGetEstimatedNextFeeDistribution tests next fee distribution parameters. diff --git a/x/ccv/consumer/keeper/genesis.go b/x/ccv/consumer/keeper/genesis.go index d9e905bbd8..45ea54f49c 100644 --- a/x/ccv/consumer/keeper/genesis.go +++ b/x/ccv/consumer/keeper/genesis.go @@ -4,10 +4,11 @@ import ( "fmt" sdk "github.com/cosmos/cosmos-sdk/types" - consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" - ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" abci "github.com/cometbft/cometbft/abci/types" + + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) // InitGenesis initializes the CCV consumer state and binds to PortID. diff --git a/x/ccv/consumer/keeper/genesis_test.go b/x/ccv/consumer/keeper/genesis_test.go index a2c0f6a88b..47d834f8a8 100644 --- a/x/ccv/consumer/keeper/genesis_test.go +++ b/x/ccv/consumer/keeper/genesis_test.go @@ -4,25 +4,25 @@ import ( "testing" "time" - abci "github.com/cometbft/cometbft/abci/types" - tmtypes "github.com/cometbft/cometbft/types" - sdk "github.com/cosmos/cosmos-sdk/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - "github.com/cosmos/interchain-security/v3/testutil/crypto" - testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" - consumerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" - ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" - "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + sdk "github.com/cosmos/cosmos-sdk/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + + abci "github.com/cometbft/cometbft/abci/types" + tmtypes "github.com/cometbft/cometbft/types" + + "github.com/cosmos/interchain-security/v3/testutil/crypto" + testkeeper "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" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) // TestInitGenesis tests that a consumer chain is correctly initialised from genesis. diff --git a/x/ccv/consumer/keeper/grpc_query.go b/x/ccv/consumer/keeper/grpc_query.go index 299e485faf..174f591497 100644 --- a/x/ccv/consumer/keeper/grpc_query.go +++ b/x/ccv/consumer/keeper/grpc_query.go @@ -3,10 +3,12 @@ package keeper import ( "context" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" ) var _ types.QueryServer = Keeper{} diff --git a/x/ccv/consumer/keeper/hooks.go b/x/ccv/consumer/keeper/hooks.go index da3058555b..7f03896e55 100644 --- a/x/ccv/consumer/keeper/hooks.go +++ b/x/ccv/consumer/keeper/hooks.go @@ -2,6 +2,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" + ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) diff --git a/x/ccv/consumer/keeper/keeper.go b/x/ccv/consumer/keeper/keeper.go index 24a1234065..7da13ab433 100644 --- a/x/ccv/consumer/keeper/keeper.go +++ b/x/ccv/consumer/keeper/keeper.go @@ -6,21 +6,22 @@ import ( "reflect" "time" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + conntypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + host "github.com/cosmos/ibc-go/v7/modules/core/24-host" + errorsmod "cosmossdk.io/errors" + "github.com/cosmos/cosmos-sdk/codec" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" - conntypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" - channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" - host "github.com/cosmos/ibc-go/v7/modules/core/24-host" - tmtypes "github.com/cometbft/cometbft/abci/types" "github.com/cometbft/cometbft/libs/log" - storetypes "github.com/cosmos/cosmos-sdk/store/types" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" diff --git a/x/ccv/consumer/keeper/keeper_test.go b/x/ccv/consumer/keeper/keeper_test.go index 7b23c777c5..662a776cef 100644 --- a/x/ccv/consumer/keeper/keeper_test.go +++ b/x/ccv/consumer/keeper/keeper_test.go @@ -6,21 +6,21 @@ import ( "testing" "time" - abci "github.com/cometbft/cometbft/abci/types" + conntypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/require" + + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - conntypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + abci "github.com/cometbft/cometbft/abci/types" + "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/consumer/types" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" - - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/require" - - cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" ) // TestProviderClientID tests getter and setter functionality for the client ID stored on consumer keeper diff --git a/x/ccv/consumer/keeper/params_test.go b/x/ccv/consumer/keeper/params_test.go index 7573613199..ac6b112aa8 100644 --- a/x/ccv/consumer/keeper/params_test.go +++ b/x/ccv/consumer/keeper/params_test.go @@ -4,10 +4,11 @@ import ( "testing" "time" + "github.com/stretchr/testify/require" + testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" - "github.com/stretchr/testify/require" ) // TestParams tests getters/setters for consumer params diff --git a/x/ccv/consumer/keeper/relay.go b/x/ccv/consumer/keeper/relay.go index d9e922ed3d..cd5105421e 100644 --- a/x/ccv/consumer/keeper/relay.go +++ b/x/ccv/consumer/keeper/relay.go @@ -4,14 +4,17 @@ import ( "fmt" "strconv" - errorsmod "cosmossdk.io/errors" - abci "github.com/cometbft/cometbft/abci/types" - sdk "github.com/cosmos/cosmos-sdk/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" "github.com/cosmos/ibc-go/v7/modules/core/exported" + errorsmod "cosmossdk.io/errors" + + sdk "github.com/cosmos/cosmos-sdk/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + + abci "github.com/cometbft/cometbft/abci/types" + "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) diff --git a/x/ccv/consumer/keeper/relay_test.go b/x/ccv/consumer/keeper/relay_test.go index 1c2ba5152f..962fc943bd 100644 --- a/x/ccv/consumer/keeper/relay_test.go +++ b/x/ccv/consumer/keeper/relay_test.go @@ -6,24 +6,24 @@ import ( "testing" "time" - abci "github.com/cometbft/cometbft/abci/types" - "github.com/cometbft/cometbft/libs/bytes" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + host "github.com/cosmos/ibc-go/v7/modules/core/24-host" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/require" + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" - host "github.com/cosmos/ibc-go/v7/modules/core/24-host" + abci "github.com/cometbft/cometbft/abci/types" + "github.com/cometbft/cometbft/libs/bytes" "github.com/cosmos/interchain-security/v3/testutil/crypto" testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" "github.com/cosmos/interchain-security/v3/x/ccv/types" - - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/require" ) // TestOnRecvVSCPacket tests the behavior of OnRecvVSCPacket over various packet scenarios diff --git a/x/ccv/consumer/keeper/soft_opt_out.go b/x/ccv/consumer/keeper/soft_opt_out.go index 23a27d4b96..09b8a9be79 100644 --- a/x/ccv/consumer/keeper/soft_opt_out.go +++ b/x/ccv/consumer/keeper/soft_opt_out.go @@ -5,6 +5,7 @@ import ( "sort" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" ) diff --git a/x/ccv/consumer/keeper/soft_opt_out_test.go b/x/ccv/consumer/keeper/soft_opt_out_test.go index 34e5570674..c99d418ca6 100644 --- a/x/ccv/consumer/keeper/soft_opt_out_test.go +++ b/x/ccv/consumer/keeper/soft_opt_out_test.go @@ -3,13 +3,13 @@ package keeper_test import ( "testing" + "github.com/stretchr/testify/require" + tmtypes "github.com/cometbft/cometbft/types" "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/consumer/types" - - "github.com/stretchr/testify/require" ) // Tests that UpdateSmallestNonOptOutPower updates the smallest validator power that cannot soft opt out. diff --git a/x/ccv/consumer/keeper/validators.go b/x/ccv/consumer/keeper/validators.go index 068767546b..2233b22d28 100644 --- a/x/ccv/consumer/keeper/validators.go +++ b/x/ccv/consumer/keeper/validators.go @@ -4,11 +4,13 @@ import ( "time" "cosmossdk.io/math" - cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - abci "github.com/cometbft/cometbft/abci/types" + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + + abci "github.com/cometbft/cometbft/abci/types" + "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" ) diff --git a/x/ccv/consumer/keeper/validators_test.go b/x/ccv/consumer/keeper/validators_test.go index 724ce787d0..67ab91f531 100644 --- a/x/ccv/consumer/keeper/validators_test.go +++ b/x/ccv/consumer/keeper/validators_test.go @@ -3,18 +3,22 @@ package keeper_test import ( "testing" + "github.com/stretchr/testify/require" + "cosmossdk.io/math" - abci "github.com/cometbft/cometbft/abci/types" - tmrand "github.com/cometbft/cometbft/libs/rand" - tmtypes "github.com/cometbft/cometbft/types" + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + + abci "github.com/cometbft/cometbft/abci/types" + tmrand "github.com/cometbft/cometbft/libs/rand" + tmtypes "github.com/cometbft/cometbft/types" + "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/consumer/keeper" "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" - "github.com/stretchr/testify/require" ) // TestApplyCCValidatorChanges tests the ApplyCCValidatorChanges method for a consumer keeper diff --git a/x/ccv/consumer/module.go b/x/ccv/consumer/module.go index 3d80fb1df1..6c05273451 100644 --- a/x/ccv/consumer/module.go +++ b/x/ccv/consumer/module.go @@ -5,9 +5,7 @@ import ( "encoding/json" "fmt" - abci "github.com/cometbft/cometbft/abci/types" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - + porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" @@ -17,11 +15,12 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" - porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" + + abci "github.com/cometbft/cometbft/abci/types" "github.com/cosmos/interchain-security/v3/x/ccv/consumer/client/cli" "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" - consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" ) diff --git a/x/ccv/consumer/types/genesis.go b/x/ccv/consumer/types/genesis.go index 82b6e2c1fa..3a8769939b 100644 --- a/x/ccv/consumer/types/genesis.go +++ b/x/ccv/consumer/types/genesis.go @@ -1,9 +1,11 @@ package types import ( + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + errorsmod "cosmossdk.io/errors" + abci "github.com/cometbft/cometbft/abci/types" - ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) diff --git a/x/ccv/consumer/types/genesis_test.go b/x/ccv/consumer/types/genesis_test.go index 9ce1c4927a..2f4b2fa504 100644 --- a/x/ccv/consumer/types/genesis_test.go +++ b/x/ccv/consumer/types/genesis_test.go @@ -4,22 +4,20 @@ import ( "testing" "time" - sdk "github.com/cosmos/cosmos-sdk/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - - abci "github.com/cometbft/cometbft/abci/types" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + "github.com/stretchr/testify/require" - "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + sdk "github.com/cosmos/cosmos-sdk/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + abci "github.com/cometbft/cometbft/abci/types" tmtypes "github.com/cometbft/cometbft/types" "github.com/cosmos/interchain-security/v3/testutil/crypto" - + "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" - "github.com/stretchr/testify/require" ) const ( diff --git a/x/ccv/consumer/types/keys.go b/x/ccv/consumer/types/keys.go index 24be1819c6..0ceed2814e 100644 --- a/x/ccv/consumer/types/keys.go +++ b/x/ccv/consumer/types/keys.go @@ -5,6 +5,7 @@ import ( time "time" sdk "github.com/cosmos/cosmos-sdk/types" + ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) diff --git a/x/ccv/consumer/types/params.go b/x/ccv/consumer/types/params.go index 485bb8fda5..a9b4e61285 100644 --- a/x/ccv/consumer/types/params.go +++ b/x/ccv/consumer/types/params.go @@ -7,6 +7,7 @@ import ( sdktypes "github.com/cosmos/cosmos-sdk/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) diff --git a/x/ccv/consumer/types/validator.go b/x/ccv/consumer/types/validator.go index c546a68440..b134dde078 100644 --- a/x/ccv/consumer/types/validator.go +++ b/x/ccv/consumer/types/validator.go @@ -2,6 +2,7 @@ package types import ( errorsmod "cosmossdk.io/errors" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" diff --git a/x/ccv/democracy/distribution/module.go b/x/ccv/democracy/distribution/module.go index 7f4842314e..60532dde48 100644 --- a/x/ccv/democracy/distribution/module.go +++ b/x/ccv/democracy/distribution/module.go @@ -4,19 +4,19 @@ import ( "time" "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/types/module" - "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" distr "github.com/cosmos/cosmos-sdk/x/distribution" "github.com/cosmos/cosmos-sdk/x/distribution/exported" "github.com/cosmos/cosmos-sdk/x/distribution/keeper" + distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" abci "github.com/cometbft/cometbft/abci/types" - distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" + + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" ) var ( diff --git a/x/ccv/democracy/governance/module.go b/x/ccv/democracy/governance/module.go index c293a9e3e3..3922607766 100644 --- a/x/ccv/democracy/governance/module.go +++ b/x/ccv/democracy/governance/module.go @@ -6,13 +6,13 @@ import ( "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" - - abci "github.com/cometbft/cometbft/abci/types" gov "github.com/cosmos/cosmos-sdk/x/gov" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" + + abci "github.com/cometbft/cometbft/abci/types" ) const ( diff --git a/x/ccv/democracy/staking/module.go b/x/ccv/democracy/staking/module.go index 78489a0166..3e176aaa2c 100644 --- a/x/ccv/democracy/staking/module.go +++ b/x/ccv/democracy/staking/module.go @@ -3,7 +3,6 @@ package staking import ( "encoding/json" - abci "github.com/cometbft/cometbft/abci/types" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" @@ -11,6 +10,8 @@ import ( "github.com/cosmos/cosmos-sdk/x/staking/exported" "github.com/cosmos/cosmos-sdk/x/staking/keeper" "github.com/cosmos/cosmos-sdk/x/staking/types" + + abci "github.com/cometbft/cometbft/abci/types" ) // Note: for a democracy consumer, this "democracy staking" keeper is only for governance capabilities, diff --git a/x/ccv/provider/client/cli/tx.go b/x/ccv/provider/client/cli/tx.go index ca167dbb60..7e0609d74c 100644 --- a/x/ccv/provider/client/cli/tx.go +++ b/x/ccv/provider/client/cli/tx.go @@ -9,9 +9,9 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/client/tx" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/version" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ) diff --git a/x/ccv/provider/client/proposal_handler.go b/x/ccv/provider/client/proposal_handler.go index 9c02dd3c23..8ec6e89bfd 100644 --- a/x/ccv/provider/client/proposal_handler.go +++ b/x/ccv/provider/client/proposal_handler.go @@ -8,6 +8,9 @@ import ( "path/filepath" "time" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + "github.com/spf13/cobra" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/tx" sdk "github.com/cosmos/cosmos-sdk/types" @@ -16,9 +19,8 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" - "github.com/spf13/cobra" ) var ( diff --git a/x/ccv/provider/handler.go b/x/ccv/provider/handler.go index 6f3bb29092..71da622fce 100644 --- a/x/ccv/provider/handler.go +++ b/x/ccv/provider/handler.go @@ -2,8 +2,10 @@ package provider import ( errorsmod "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ) diff --git a/x/ccv/provider/handler_test.go b/x/ccv/provider/handler_test.go index 8871d15669..e4835cf14a 100644 --- a/x/ccv/provider/handler_test.go +++ b/x/ccv/provider/handler_test.go @@ -5,13 +5,15 @@ import ( "strings" "testing" - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + testcrypto "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" diff --git a/x/ccv/provider/ibc_module.go b/x/ccv/provider/ibc_module.go index 698d37385b..efe113f895 100644 --- a/x/ccv/provider/ibc_module.go +++ b/x/ccv/provider/ibc_module.go @@ -3,16 +3,17 @@ package provider import ( "fmt" - errorsmod "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" host "github.com/cosmos/ibc-go/v7/modules/core/24-host" ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" + errorsmod "cosmossdk.io/errors" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" diff --git a/x/ccv/provider/ibc_module_test.go b/x/ccv/provider/ibc_module_test.go index 96e0eb97d1..8b7c3f985c 100644 --- a/x/ccv/provider/ibc_module_test.go +++ b/x/ccv/provider/ibc_module_test.go @@ -3,24 +3,23 @@ package provider_test import ( "testing" - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" conntypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" host "github.com/cosmos/ibc-go/v7/modules/core/24-host" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/require" + + sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" "github.com/cosmos/interchain-security/v3/x/ccv/provider" providerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" - - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/require" ) // TestOnChanOpenInit tests the provider's OnChanOpenInit method against spec. diff --git a/x/ccv/provider/keeper/distribution.go b/x/ccv/provider/keeper/distribution.go index ee6070e27b..a1dff6faf4 100644 --- a/x/ccv/provider/keeper/distribution.go +++ b/x/ccv/provider/keeper/distribution.go @@ -2,6 +2,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ) diff --git a/x/ccv/provider/keeper/distribution_test.go b/x/ccv/provider/keeper/distribution_test.go index 4188eedaef..a470feea74 100644 --- a/x/ccv/provider/keeper/distribution_test.go +++ b/x/ccv/provider/keeper/distribution_test.go @@ -3,12 +3,14 @@ package keeper_test import ( "testing" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/require" + sdk "github.com/cosmos/cosmos-sdk/types" + testutil "github.com/cosmos/interchain-security/v3/testutil/keeper" consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/require" ) // TestRegisterConsumerRewardDenom tests the RegisterConsumerRewardDenom method. diff --git a/x/ccv/provider/keeper/genesis.go b/x/ccv/provider/keeper/genesis.go index 996b73d4a5..b3a0a1ef04 100644 --- a/x/ccv/provider/keeper/genesis.go +++ b/x/ccv/provider/keeper/genesis.go @@ -4,6 +4,7 @@ import ( "fmt" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) diff --git a/x/ccv/provider/keeper/genesis_test.go b/x/ccv/provider/keeper/genesis_test.go index fe666dcc2c..d9147ce98f 100644 --- a/x/ccv/provider/keeper/genesis_test.go +++ b/x/ccv/provider/keeper/genesis_test.go @@ -4,17 +4,18 @@ import ( "testing" "time" - sdk "github.com/cosmos/cosmos-sdk/types" host "github.com/cosmos/ibc-go/v7/modules/core/24-host" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/require" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/interchain-security/v3/testutil/crypto" testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" - consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/require" ) // TestInitAndExportGenesis tests the export and the initialisation of a provider chain genesis diff --git a/x/ccv/provider/keeper/grpc_query.go b/x/ccv/provider/keeper/grpc_query.go index f43761fd0e..2b522ea9ef 100644 --- a/x/ccv/provider/keeper/grpc_query.go +++ b/x/ccv/provider/keeper/grpc_query.go @@ -4,12 +4,15 @@ import ( "context" "fmt" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + errorsmod "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" ) var _ types.QueryServer = Keeper{} diff --git a/x/ccv/provider/keeper/hooks.go b/x/ccv/provider/keeper/hooks.go index 2f2cb8ee0b..35c9b96301 100644 --- a/x/ccv/provider/keeper/hooks.go +++ b/x/ccv/provider/keeper/hooks.go @@ -1,9 +1,9 @@ package keeper import ( + sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - sdk "github.com/cosmos/cosmos-sdk/types" providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) diff --git a/x/ccv/provider/keeper/hooks_test.go b/x/ccv/provider/keeper/hooks_test.go index 463ed5fff5..83dbfe9622 100644 --- a/x/ccv/provider/keeper/hooks_test.go +++ b/x/ccv/provider/keeper/hooks_test.go @@ -3,11 +3,13 @@ package keeper_test import ( "testing" + "github.com/golang/mock/gomock" + sdk "github.com/cosmos/cosmos-sdk/types" + cryptotestutil "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" - "github.com/golang/mock/gomock" ) func TestValidatorConsensusKeyInUse(t *testing.T) { diff --git a/x/ccv/provider/keeper/keeper.go b/x/ccv/provider/keeper/keeper.go index 03caf0aba5..73785f1c17 100644 --- a/x/ccv/provider/keeper/keeper.go +++ b/x/ccv/provider/keeper/keeper.go @@ -6,25 +6,26 @@ import ( "reflect" "time" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + conntypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + host "github.com/cosmos/ibc-go/v7/modules/core/24-host" + ibchost "github.com/cosmos/ibc-go/v7/modules/core/exported" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + errorsmod "cosmossdk.io/errors" + "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" - conntypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" - channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" - host "github.com/cosmos/ibc-go/v7/modules/core/24-host" - ibchost "github.com/cosmos/ibc-go/v7/modules/core/exported" - ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + "github.com/cometbft/cometbft/libs/log" consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" - - "github.com/cometbft/cometbft/libs/log" ) // Keeper defines the Cross-Chain Validation Provider Keeper diff --git a/x/ccv/provider/keeper/keeper_test.go b/x/ccv/provider/keeper/keeper_test.go index f34bf262a5..364aac5669 100644 --- a/x/ccv/provider/keeper/keeper_test.go +++ b/x/ccv/provider/keeper/keeper_test.go @@ -6,17 +6,18 @@ import ( "testing" "time" + "github.com/stretchr/testify/require" + + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + abci "github.com/cometbft/cometbft/abci/types" tmprotocrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" - cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" ibcsimapp "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/simapp" cryptotestutil "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/types" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" - - "github.com/stretchr/testify/require" ) const consumer = "consumer" diff --git a/x/ccv/provider/keeper/key_assignment.go b/x/ccv/provider/keeper/key_assignment.go index eb4fecd64f..d440848bbf 100644 --- a/x/ccv/provider/keeper/key_assignment.go +++ b/x/ccv/provider/keeper/key_assignment.go @@ -4,14 +4,15 @@ import ( "fmt" errorsmod "cosmossdk.io/errors" + 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" - ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" - abci "github.com/cometbft/cometbft/abci/types" 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" ) // GetValidatorConsumerPubKey returns a validator's public key assigned for a consumer chain diff --git a/x/ccv/provider/keeper/key_assignment_test.go b/x/ccv/provider/keeper/key_assignment_test.go index 49ef8698cb..8da633a5c9 100644 --- a/x/ccv/provider/keeper/key_assignment_test.go +++ b/x/ccv/provider/keeper/key_assignment_test.go @@ -7,18 +7,20 @@ import ( "testing" "time" - abci "github.com/cometbft/cometbft/abci/types" - tmprotocrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/require" + sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + + abci "github.com/cometbft/cometbft/abci/types" + tmprotocrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" + cryptotestutil "github.com/cosmos/interchain-security/v3/testutil/crypto" testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" - "github.com/stretchr/testify/require" - providerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" - "github.com/golang/mock/gomock" ) func TestValidatorConsumerPubKeyCRUD(t *testing.T) { diff --git a/x/ccv/provider/keeper/msg_server.go b/x/ccv/provider/keeper/msg_server.go index d7051cc392..195e2a7215 100644 --- a/x/ccv/provider/keeper/msg_server.go +++ b/x/ccv/provider/keeper/msg_server.go @@ -4,11 +4,13 @@ import ( "context" "encoding/base64" - tmprotocrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" + errorsmod "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - errorsmod "cosmossdk.io/errors" + 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" ) diff --git a/x/ccv/provider/keeper/params.go b/x/ccv/provider/keeper/params.go index adfc574ba9..b7b53b245b 100644 --- a/x/ccv/provider/keeper/params.go +++ b/x/ccv/provider/keeper/params.go @@ -3,10 +3,10 @@ package keeper import ( "time" - sdk "github.com/cosmos/cosmos-sdk/types" - ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) diff --git a/x/ccv/provider/keeper/params_test.go b/x/ccv/provider/keeper/params_test.go index cfaec35dc7..05b3964bb7 100644 --- a/x/ccv/provider/keeper/params_test.go +++ b/x/ccv/provider/keeper/params_test.go @@ -4,14 +4,15 @@ import ( "testing" "time" - sdk "github.com/cosmos/cosmos-sdk/types" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + "github.com/stretchr/testify/require" + + sdk "github.com/cosmos/cosmos-sdk/types" testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" - "github.com/stretchr/testify/require" ) // TestParams tests the getting/setting of provider ccv module params. diff --git a/x/ccv/provider/keeper/proposal.go b/x/ccv/provider/keeper/proposal.go index 0ce71d6efc..11909ad685 100644 --- a/x/ccv/provider/keeper/proposal.go +++ b/x/ccv/provider/keeper/proposal.go @@ -5,17 +5,19 @@ import ( "strconv" "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" + commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" errorsmod "cosmossdk.io/errors" - abci "github.com/cometbft/cometbft/abci/types" - tmtypes "github.com/cometbft/cometbft/types" + sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" - commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" - ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + + abci "github.com/cometbft/cometbft/abci/types" + tmtypes "github.com/cometbft/cometbft/types" consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" diff --git a/x/ccv/provider/keeper/proposal_test.go b/x/ccv/provider/keeper/proposal_test.go index 1170a0f368..4e9ee3f4ea 100644 --- a/x/ccv/provider/keeper/proposal_test.go +++ b/x/ccv/provider/keeper/proposal_test.go @@ -7,16 +7,17 @@ import ( "testing" "time" - abci "github.com/cometbft/cometbft/abci/types" - sdk "github.com/cosmos/cosmos-sdk/types" - evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" _go "github.com/cosmos/ics23/go" "github.com/golang/mock/gomock" - "github.com/stretchr/testify/require" + sdk "github.com/cosmos/cosmos-sdk/types" + evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" + + 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" consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" diff --git a/x/ccv/provider/keeper/relay.go b/x/ccv/provider/keeper/relay.go index 350bc968d4..df4fdb98ce 100644 --- a/x/ccv/provider/keeper/relay.go +++ b/x/ccv/provider/keeper/relay.go @@ -4,13 +4,15 @@ import ( "fmt" "strconv" - errorsmod "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" "github.com/cosmos/ibc-go/v7/modules/core/exported" + errorsmod "cosmossdk.io/errors" + + sdk "github.com/cosmos/cosmos-sdk/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) diff --git a/x/ccv/provider/keeper/relay_test.go b/x/ccv/provider/keeper/relay_test.go index 15305d8eea..b266211a42 100644 --- a/x/ccv/provider/keeper/relay_test.go +++ b/x/ccv/provider/keeper/relay_test.go @@ -4,13 +4,17 @@ import ( "testing" "time" - abci "github.com/cometbft/cometbft/abci/types" - cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" exported "github.com/cosmos/ibc-go/v7/modules/core/exported" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/require" + + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + + abci "github.com/cometbft/cometbft/abci/types" ibcsimapp "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/simapp" cryptotestutil "github.com/cosmos/interchain-security/v3/testutil/crypto" @@ -18,9 +22,6 @@ import ( "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" - "github.com/golang/mock/gomock" - - "github.com/stretchr/testify/require" ) // TestQueueVSCPackets tests queueing validator set updates. diff --git a/x/ccv/provider/keeper/throttle.go b/x/ccv/provider/keeper/throttle.go index ddfe1b1763..d8be629ee7 100644 --- a/x/ccv/provider/keeper/throttle.go +++ b/x/ccv/provider/keeper/throttle.go @@ -5,9 +5,11 @@ import ( "time" "cosmossdk.io/math" - tmtypes "github.com/cometbft/cometbft/types" + sdktypes "github.com/cosmos/cosmos-sdk/types" + 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" ) diff --git a/x/ccv/provider/keeper/throttle_test.go b/x/ccv/provider/keeper/throttle_test.go index f923c53e98..a5356b0dc0 100644 --- a/x/ccv/provider/keeper/throttle_test.go +++ b/x/ccv/provider/keeper/throttle_test.go @@ -5,14 +5,15 @@ import ( "testing" "time" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/require" + "golang.org/x/exp/slices" + "cosmossdk.io/math" - tmtypes "github.com/cometbft/cometbft/types" sdktypes "github.com/cosmos/cosmos-sdk/types" - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/require" - "golang.org/x/exp/slices" + tmtypes "github.com/cometbft/cometbft/types" cryptoutil "github.com/cosmos/interchain-security/v3/testutil/crypto" testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" diff --git a/x/ccv/provider/module.go b/x/ccv/provider/module.go index 556cbcfefa..82891c27c7 100644 --- a/x/ccv/provider/module.go +++ b/x/ccv/provider/module.go @@ -5,23 +5,23 @@ import ( "encoding/json" "fmt" - abci "github.com/cometbft/cometbft/abci/types" + porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/spf13/cobra" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" + abci "github.com/cometbft/cometbft/abci/types" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/cosmos/interchain-security/v3/x/ccv/provider/client/cli" "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" - - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/spf13/cobra" ) var ( diff --git a/x/ccv/provider/module_test.go b/x/ccv/provider/module_test.go index 0eee81cc1f..f32cb8cc4d 100644 --- a/x/ccv/provider/module_test.go +++ b/x/ccv/provider/module_test.go @@ -3,19 +3,18 @@ package provider_test import ( "testing" + host "github.com/cosmos/ibc-go/v7/modules/core/24-host" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + sdk "github.com/cosmos/cosmos-sdk/types" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - host "github.com/cosmos/ibc-go/v7/modules/core/24-host" - testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" "github.com/cosmos/interchain-security/v3/x/ccv/provider" "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/golang/mock/gomock" ) // Tests the provider's InitGenesis implementation against the spec. diff --git a/x/ccv/provider/proposal_handler.go b/x/ccv/provider/proposal_handler.go index ebebb9c967..137cbecec7 100644 --- a/x/ccv/provider/proposal_handler.go +++ b/x/ccv/provider/proposal_handler.go @@ -1,11 +1,12 @@ package provider import ( - govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - errorsmod "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ) diff --git a/x/ccv/provider/proposal_handler_test.go b/x/ccv/provider/proposal_handler_test.go index a85853a246..d3707d8c28 100644 --- a/x/ccv/provider/proposal_handler_test.go +++ b/x/ccv/provider/proposal_handler_test.go @@ -4,14 +4,13 @@ import ( "testing" "time" - sdk "github.com/cosmos/cosmos-sdk/types" - distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" - clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" - + sdk "github.com/cosmos/cosmos-sdk/types" + distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" + evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" diff --git a/x/ccv/provider/types/genesis.go b/x/ccv/provider/types/genesis.go index 5a9358e736..07c135ebfc 100644 --- a/x/ccv/provider/types/genesis.go +++ b/x/ccv/provider/types/genesis.go @@ -3,9 +3,11 @@ package types import ( "fmt" + host "github.com/cosmos/ibc-go/v7/modules/core/24-host" + errorsmod "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" - host "github.com/cosmos/ibc-go/v7/modules/core/24-host" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) diff --git a/x/ccv/provider/types/genesis_test.go b/x/ccv/provider/types/genesis_test.go index de5c77a803..dbff6a1c2f 100644 --- a/x/ccv/provider/types/genesis_test.go +++ b/x/ccv/provider/types/genesis_test.go @@ -4,19 +4,20 @@ import ( "testing" "time" - abci "github.com/cometbft/cometbft/abci/types" - tmtypes "github.com/cometbft/cometbft/types" - sdk "github.com/cosmos/cosmos-sdk/types" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + "github.com/stretchr/testify/require" + + sdk "github.com/cosmos/cosmos-sdk/types" + + abci "github.com/cometbft/cometbft/abci/types" + tmtypes "github.com/cometbft/cometbft/types" "github.com/cosmos/interchain-security/v3/testutil/crypto" consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" - - "github.com/stretchr/testify/require" ) // Tests validation of consumer states and params within a provider genesis state diff --git a/x/ccv/provider/types/key_assignment.go b/x/ccv/provider/types/key_assignment.go index 659ca91e83..78e5161a55 100644 --- a/x/ccv/provider/types/key_assignment.go +++ b/x/ccv/provider/types/key_assignment.go @@ -5,7 +5,9 @@ import ( "strings" errorsmod "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" + ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) diff --git a/x/ccv/provider/types/keys_test.go b/x/ccv/provider/types/keys_test.go index 3bb891ddce..9f470f4a82 100644 --- a/x/ccv/provider/types/keys_test.go +++ b/x/ccv/provider/types/keys_test.go @@ -4,10 +4,12 @@ import ( "testing" "time" + "github.com/stretchr/testify/require" + sdk "github.com/cosmos/cosmos-sdk/types" + cryptoutil "github.com/cosmos/interchain-security/v3/testutil/crypto" providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" - "github.com/stretchr/testify/require" ) // Tests that all singular keys, or prefixes to fully resolves keys are non duplicate byte values. diff --git a/x/ccv/provider/types/params.go b/x/ccv/provider/types/params.go index 0495d1a89e..515d8954ec 100644 --- a/x/ccv/provider/types/params.go +++ b/x/ccv/provider/types/params.go @@ -4,13 +4,13 @@ import ( "fmt" "time" - sdk "github.com/cosmos/cosmos-sdk/types" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + sdk "github.com/cosmos/cosmos-sdk/types" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) diff --git a/x/ccv/provider/types/params_test.go b/x/ccv/provider/types/params_test.go index 7a4b9aabf2..0676a15986 100644 --- a/x/ccv/provider/types/params_test.go +++ b/x/ccv/provider/types/params_test.go @@ -4,12 +4,13 @@ import ( "testing" "time" - "github.com/stretchr/testify/require" - - sdk "github.com/cosmos/cosmos-sdk/types" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + "github.com/stretchr/testify/require" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ) diff --git a/x/ccv/provider/types/proposal.go b/x/ccv/provider/types/proposal.go index 89e8cb9822..c369ec95f1 100644 --- a/x/ccv/provider/types/proposal.go +++ b/x/ccv/provider/types/proposal.go @@ -6,10 +6,12 @@ import ( "strings" time "time" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + errorsmod "cosmossdk.io/errors" + evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) diff --git a/x/ccv/provider/types/proposal_test.go b/x/ccv/provider/types/proposal_test.go index b3f27e1415..fac4c7fc4b 100644 --- a/x/ccv/provider/types/proposal_test.go +++ b/x/ccv/provider/types/proposal_test.go @@ -5,19 +5,17 @@ import ( "testing" "time" - evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" - + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" "github.com/golang/protobuf/proto" //nolint:staticcheck // see: https://github.com/cosmos/interchain-security/issues/236 "github.com/stretchr/testify/require" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" + evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" - ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" - "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ) diff --git a/x/ccv/types/ccv.go b/x/ccv/types/ccv.go index e7739b4c2f..f02ed1c450 100644 --- a/x/ccv/types/ccv.go +++ b/x/ccv/types/ccv.go @@ -4,8 +4,10 @@ import ( "fmt" errorsmod "cosmossdk.io/errors" - abci "github.com/cometbft/cometbft/abci/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + + abci "github.com/cometbft/cometbft/abci/types" ) func NewValidatorSetChangePacketData(valUpdates []abci.ValidatorUpdate, valUpdateID uint64, slashAcks []string) ValidatorSetChangePacketData { diff --git a/x/ccv/types/ccv_test.go b/x/ccv/types/ccv_test.go index 5aadafe6ec..596967b199 100644 --- a/x/ccv/types/ccv_test.go +++ b/x/ccv/types/ccv_test.go @@ -3,11 +3,14 @@ package types_test import ( "testing" - abci "github.com/cometbft/cometbft/abci/types" + "github.com/stretchr/testify/require" + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + + abci "github.com/cometbft/cometbft/abci/types" + "github.com/cosmos/interchain-security/v3/x/ccv/types" - "github.com/stretchr/testify/require" ) func TestPacketDataValidateBasic(t *testing.T) { diff --git a/x/ccv/types/expected_keepers.go b/x/ccv/types/expected_keepers.go index 8176d193b2..2a82561cf0 100644 --- a/x/ccv/types/expected_keepers.go +++ b/x/ccv/types/expected_keepers.go @@ -4,18 +4,20 @@ import ( context "context" "time" + transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + conntypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" + "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" auth "github.com/cosmos/cosmos-sdk/x/auth/types" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" - conntypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" - channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" - ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" abci "github.com/cometbft/cometbft/abci/types" ) diff --git a/x/ccv/types/shared_params.go b/x/ccv/types/shared_params.go index 8ff676bded..566737c0b9 100644 --- a/x/ccv/types/shared_params.go +++ b/x/ccv/types/shared_params.go @@ -4,8 +4,9 @@ import ( fmt "fmt" "time" - sdktypes "github.com/cosmos/cosmos-sdk/types" ibchost "github.com/cosmos/ibc-go/v7/modules/core/24-host" + + sdktypes "github.com/cosmos/cosmos-sdk/types" ) const ( diff --git a/x/ccv/types/utils.go b/x/ccv/types/utils.go index 524725a532..f6e7ffc3aa 100644 --- a/x/ccv/types/utils.go +++ b/x/ccv/types/utils.go @@ -5,14 +5,17 @@ import ( "sort" "time" - errorsmod "cosmossdk.io/errors" - abci "github.com/cometbft/cometbft/abci/types" - tmprotocrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" - cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - sdk "github.com/cosmos/cosmos-sdk/types" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" host "github.com/cosmos/ibc-go/v7/modules/core/24-host" + + errorsmod "cosmossdk.io/errors" + + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + + abci "github.com/cometbft/cometbft/abci/types" + tmprotocrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" ) func AccumulateChanges(currentChanges, newChanges []abci.ValidatorUpdate) []abci.ValidatorUpdate { diff --git a/x/ccv/types/utils_test.go b/x/ccv/types/utils_test.go index 0182b68306..f43e5449f1 100644 --- a/x/ccv/types/utils_test.go +++ b/x/ccv/types/utils_test.go @@ -3,11 +3,14 @@ package types_test import ( "testing" - abci "github.com/cometbft/cometbft/abci/types" + "github.com/stretchr/testify/require" + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + + abci "github.com/cometbft/cometbft/abci/types" + ibcsimapp "github.com/cosmos/interchain-security/v3/legacy_ibc_testing/simapp" "github.com/cosmos/interchain-security/v3/x/ccv/types" - "github.com/stretchr/testify/require" ) func TestAccumulateChanges(t *testing.T) { From a72735bbb96598985541ba80b4b4d9e14acddbe8 Mon Sep 17 00:00:00 2001 From: MSalopek Date: Mon, 10 Jul 2023 12:36:14 +0200 Subject: [PATCH 074/108] chore: add cometbft bump PR info to changelog (#1121) * chore: add cometbft bump PR info to changelog * chore: change styling in changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f6893544e..92dc3b5efb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ Add an entry to the unreleased section whenever merging a PR to main that is not targeted at a specific release. These entries will eventually be included in a release. * (fix) [#720](https://github.com/cosmos/interchain-security/issues/720) Fix the attribute `AttributeDistributionTotal` value in `FeeDistribution` event emit. +* (deps) [#1119](https://github.com/cosmos/interchain-security/pull/1119) bump cometbft from `v0.37.1` to `0.37.2`. ## v3.0.0 From 14129233594bd72e57fa5ac286c79d6c420cce2a Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Wed, 12 Jul 2023 07:59:13 -0700 Subject: [PATCH 075/108] feat: remove consumer panic when ccv channel is closed (#1127) * rm panic * rm tests * Update CHANGELOG.md * update comment --- CHANGELOG.md | 8 ++++++++ tests/integration/stop_consumer.go | 29 ----------------------------- testutil/integration/debug_test.go | 4 ---- x/ccv/consumer/module.go | 5 +---- 4 files changed, 9 insertions(+), 37 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92dc3b5efb..b984d03c08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,14 @@ Add an entry to the unreleased section whenever merging a PR to main that is not * (fix) [#720](https://github.com/cosmos/interchain-security/issues/720) Fix the attribute `AttributeDistributionTotal` value in `FeeDistribution` event emit. * (deps) [#1119](https://github.com/cosmos/interchain-security/pull/1119) bump cometbft from `v0.37.1` to `0.37.2`. +## v3.1.0 + +Date July 11th, 2023 + +A minor upgrade to v3.0.0, which removes the panic in the consumer ccv module which would occur in an emergency scenario where the ccv channel is closed. + +* (feat) [#1127](https://github.com/cosmos/interchain-security/pull/1127) Remove consumer panic when ccv channel is closed + ## v3.0.0 Date: June 21st, 2023 diff --git a/tests/integration/stop_consumer.go b/tests/integration/stop_consumer.go index 43ecaf9e33..b3d32ee6a4 100644 --- a/tests/integration/stop_consumer.go +++ b/tests/integration/stop_consumer.go @@ -6,8 +6,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - abci "github.com/cometbft/cometbft/abci/types" - "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) @@ -213,30 +211,3 @@ func (s *CCVTestSuite) checkConsumerChainIsRemoved(chainID string, checkChannel s.Require().Empty(slashData) s.Require().Empty(vscMaturedData) } - -// TestProviderChannelClosed checks that a consumer chain panics -// when the provider channel was established and then closed -func (suite *CCVTestSuite) TestProviderChannelClosed() { - suite.SetupCCVChannel(suite.path) - // establish provider channel with a first VSC packet - suite.SendEmptyVSCPacket() - - consumerKeeper := suite.consumerApp.GetConsumerKeeper() - - channelID, found := consumerKeeper.GetProviderChannel(suite.consumerChain.GetContext()) - suite.Require().True(found) - - // close provider channel - err := consumerKeeper.ChanCloseInit(suite.consumerChain.GetContext(), ccv.ConsumerPortID, channelID) - suite.Require().NoError(err) - suite.Require().True(consumerKeeper.IsChannelClosed(suite.consumerChain.GetContext(), channelID)) - - // assert begin blocker did panics - defer func() { - if r := recover(); r != nil { - return - } - suite.Require().Fail("Begin blocker did not panic with a closed channel") - }() - suite.consumerApp.BeginBlocker(suite.consumerChain.GetContext(), abci.RequestBeginBlock{}) -} diff --git a/testutil/integration/debug_test.go b/testutil/integration/debug_test.go index 3d04c540ee..077f33cde3 100644 --- a/testutil/integration/debug_test.go +++ b/testutil/integration/debug_test.go @@ -157,10 +157,6 @@ func TestStopConsumerOnChannelClosed(t *testing.T) { runCCVTestByName(t, "TestStopConsumerOnChannelClosed") } -func TestProviderChannelClosed(t *testing.T) { - runCCVTestByName(t, "TestProviderChannelClosed") -} - // // Throttle tests // diff --git a/x/ccv/consumer/module.go b/x/ccv/consumer/module.go index 6c05273451..fe9b18a945 100644 --- a/x/ccv/consumer/module.go +++ b/x/ccv/consumer/module.go @@ -143,12 +143,9 @@ func (am AppModule) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) { channelID, found := am.keeper.GetProviderChannel(ctx) if found && am.keeper.IsChannelClosed(ctx, channelID) { // The CCV channel was established, but it was then closed; - // the consumer chain is no longer safe, thus it MUST shut down. - // This is achieved by panicking, similar as it's done in the - // x/upgrade module of cosmos-sdk. + // the consumer chain is not secured anymore, but we allow it to run as a POA chain and log an error. channelClosedMsg := fmt.Sprintf("CCV channel %q was closed - shutdown consumer chain since it is not secured anymore", channelID) am.keeper.Logger(ctx).Error(channelClosedMsg) - panic(channelClosedMsg) } // map next block height to the vscID of the current block height From 08e59a85c958ad5020bc241d93d0c4ec7a712970 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Wed, 12 Jul 2023 10:37:24 -0700 Subject: [PATCH 076/108] docs: clean changelog for v3.1.0 (#1138) Update CHANGELOG.md --- CHANGELOG.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b984d03c08..276edd4d12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,16 +4,15 @@ Add an entry to the unreleased section whenever merging a PR to main that is not targeted at a specific release. These entries will eventually be included in a release. -* (fix) [#720](https://github.com/cosmos/interchain-security/issues/720) Fix the attribute `AttributeDistributionTotal` value in `FeeDistribution` event emit. -* (deps) [#1119](https://github.com/cosmos/interchain-security/pull/1119) bump cometbft from `v0.37.1` to `0.37.2`. - ## v3.1.0 Date July 11th, 2023 -A minor upgrade to v3.0.0, which removes the panic in the consumer ccv module which would occur in an emergency scenario where the ccv channel is closed. +A minor upgrade to v3.0.0, which removes the panic in the consumer ccv module which would occur in an emergency scenario where the ccv channel is closed. This release also fixes how a distribution related event is emitted, and bumps cometbft. * (feat) [#1127](https://github.com/cosmos/interchain-security/pull/1127) Remove consumer panic when ccv channel is closed +* (fix) [#720](https://github.com/cosmos/interchain-security/issues/720) Fix the attribute `AttributeDistributionTotal` value in `FeeDistribution` event emit. +* (deps) [#1119](https://github.com/cosmos/interchain-security/pull/1119) bump cometbft from `v0.37.1` to `0.37.2`. ## v3.0.0 From fd76f45b726f4ef65f817e8032c4f87f986f2d71 Mon Sep 17 00:00:00 2001 From: MSalopek Date: Thu, 13 Jul 2023 15:09:29 +0200 Subject: [PATCH 077/108] docs: update broken md links (#1130) --- docs/docs/features/proposals.md | 2 +- docs/docs/validators/joining-testnet.md | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/docs/features/proposals.md b/docs/docs/features/proposals.md index a34160ecf4..b68fd343d6 100644 --- a/docs/docs/features/proposals.md +++ b/docs/docs/features/proposals.md @@ -48,7 +48,7 @@ Minimal example: "distribution_transmission_channel": "channel-123" } ``` -More examples can be found in the replicated security testnet repository [here](https://github.com/cosmos/testnets/blob/master/replicated-security/baryon-1/proposal-baryon-1.json) and [here](https://github.com/cosmos/testnets/blob/master/replicated-security/noble-1/start-proposal-noble-1.json). +More examples can be found in the replicated security testnet repository [here](https://github.com/cosmos/testnets/blob/master/replicated-security/stopped/baryon-1/proposal-baryon-1.json) and [here](https://github.com/cosmos/testnets/blob/master/replicated-security/stopped/noble-1/start-proposal-noble-1.json). ## `ConsumerRemovalProposal` Proposal type used to suggest removing an existing consumer chain. diff --git a/docs/docs/validators/joining-testnet.md b/docs/docs/validators/joining-testnet.md index 0e99c3710b..5ae9007416 100644 --- a/docs/docs/validators/joining-testnet.md +++ b/docs/docs/validators/joining-testnet.md @@ -180,9 +180,7 @@ gaiad tx provider assign-consensus-key consumer-1 '' --from Date: Thu, 13 Jul 2023 11:18:53 -0700 Subject: [PATCH 078/108] feat!: optimize pending packets storage on consumer + migration (#1037) * wip * tests * tests * update genesis tests * comments * migration and changelog * migration test * lints * merge fixes * clean * Update ccv.pb.go * add to ADR * address some PR comments * comment * Update ccv.pb.go * lint * Update x/ccv/consumer/keeper/keeper.go Co-authored-by: Simon Noetzlin * byte wise --------- Co-authored-by: Simon Noetzlin --- CHANGELOG.md | 2 + docs/docs/adrs/adr-008-throttle-retries.md | 16 +++ proto/interchain_security/ccv/v1/ccv.proto | 5 +- tests/integration/expired_client.go | 5 +- tests/integration/slashing.go | 24 ++-- x/ccv/consumer/keeper/genesis.go | 16 ++- x/ccv/consumer/keeper/genesis_test.go | 27 +++- x/ccv/consumer/keeper/keeper.go | 88 ++++++++----- x/ccv/consumer/keeper/keeper_test.go | 84 +++++++----- x/ccv/consumer/keeper/migration.go | 70 ++++++++++ x/ccv/consumer/keeper/migration_test.go | 68 ++++++++++ x/ccv/consumer/keeper/relay.go | 22 ++-- x/ccv/consumer/keeper/relay_test.go | 8 +- x/ccv/consumer/keeper/validators_test.go | 4 +- x/ccv/consumer/types/keys.go | 22 +++- x/ccv/consumer/types/keys_test.go | 4 +- x/ccv/types/ccv.go | 14 ++ x/ccv/types/ccv.pb.go | 145 +++++++++++++-------- 18 files changed, 465 insertions(+), 159 deletions(-) create mode 100644 x/ccv/consumer/keeper/migration.go create mode 100644 x/ccv/consumer/keeper/migration_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 276edd4d12..1c017fc5b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ Add an entry to the unreleased section whenever merging a PR to main that is not targeted at a specific release. These entries will eventually be included in a release. +* (feat!) optimize pending packets storage on consumer, with migration! [#1037](https://github.com/cosmos/interchain-security/pull/1037) + ## v3.1.0 Date July 11th, 2023 diff --git a/docs/docs/adrs/adr-008-throttle-retries.md b/docs/docs/adrs/adr-008-throttle-retries.md index a8f0d250ce..134214fffb 100644 --- a/docs/docs/adrs/adr-008-throttle-retries.md +++ b/docs/docs/adrs/adr-008-throttle-retries.md @@ -8,6 +8,7 @@ title: Throttle with retries ## Changelog * 6/9/23: Initial draft +* 6/22/23: added note on consumer pending packets storage optimization ## Status @@ -46,6 +47,21 @@ With the behavior described, we maintain very similar behavior to the current th In the normal case, when no or a few slash packets are being sent, the VSCMaturedPackets will not be delayed, and hence unbonding will not be delayed. +### Consumer pending packets storage optimization + +In addition to the mentioned consumer changes above. An optimization will need to be made to the consumer's pending packets storage to properly implement the feature from this ADR. + +The consumer ccv module previously queued "pending packets" to be sent on each endblocker in [SendPackets](https://github.com/cosmos/interchain-security/blob/3bc4e7135066d848aac60b0787364c07157fd36d/x/ccv/consumer/keeper/relay.go#L178). These packets are queued in state with a protobuf list of `ConsumerPacketData`. For a single append operation, the entire list is deserialized, then a packet is appended to that list, and the list is serialized again. See older version of [AppendPendingPacket](https://github.com/cosmos/interchain-security/blob/05c2dae7c6372b1252b9e97215d07c6aa7618f33/x/ccv/consumer/keeper/keeper.go#L606). That is, a single append operation has O(N) complexity, where N is the size of the list. + +This poor append performance isn't a problem when the pending packets list is small. But with this ADR being implemented, the pending packets list could potentially grow to the order of thousands of entries, in the scenario that a slash packet is bouncing. + +We can improve the append time for this queue by converting it from a protobuf-esq list, to a queue implemented with sdk-esq code. The idea is to persist an uint64 index that will be incremented each time you queue up a packet. You can think of this as storing the tail of the queue. Then, packet data will be keyed by that index, making the data naturally ordered byte-wise for sdk's iterator. The index will also be stored in the packet data value bytes, so that the index can later be used to delete certain packets from the queue. + +Two things are achieved with this approach: + +* More efficient packet append/enqueue times +* The ability to delete select packets from the queue (previously all packets were deleted at once) + ### Provider changes The main change needed for the provider is the removal of queuing logic for slash and vsc matured packets upon being received. diff --git a/proto/interchain_security/ccv/v1/ccv.proto b/proto/interchain_security/ccv/v1/ccv.proto index 1f3722a234..b8ad8ee6d0 100644 --- a/proto/interchain_security/ccv/v1/ccv.proto +++ b/proto/interchain_security/ccv/v1/ccv.proto @@ -56,7 +56,7 @@ message SlashPacketData { // unbonding operations. message MaturedUnbondingOps { repeated uint64 ids = 1; } -// ConsumerPacketData contains a consumer packet data and a type tag +// ConsumerPacketData contains a consumer packet data, type tag, and index for storage. message ConsumerPacketData { ConsumerPacketDataType type = 1; @@ -64,9 +64,12 @@ message ConsumerPacketData { SlashPacketData slashPacketData = 2; VSCMaturedPacketData vscMaturedPacketData = 3; } + uint64 idx = 4; } + // ConsumerPacketDataList is a list of consumer packet data packets. +// NOTE: It is only used for exporting / importing state in InitGenesis and ExportGenesis. message ConsumerPacketDataList { repeated ConsumerPacketData list = 1 [ (gogoproto.nullable) = false ]; } diff --git a/tests/integration/expired_client.go b/tests/integration/expired_client.go index 38d2a3ab5e..53863d2881 100644 --- a/tests/integration/expired_client.go +++ b/tests/integration/expired_client.go @@ -125,7 +125,7 @@ func (s *CCVTestSuite) TestConsumerPacketSendExpiredClient() { // check that the packets were added to the list of pending data packets consumerPackets := consumerKeeper.GetPendingPackets(s.consumerCtx()) s.Require().NotEmpty(consumerPackets) - s.Require().Equal(2, len(consumerPackets.GetList()), "unexpected number of pending data packets") + s.Require().Len(consumerPackets, 2, "unexpected number of pending data packets") // try to send slash packet for downtime infraction addr := ed25519.GenPrivKey().PubKey().Address() @@ -139,7 +139,7 @@ func (s *CCVTestSuite) TestConsumerPacketSendExpiredClient() { // check that the packets were added to the list of pending data packets consumerPackets = consumerKeeper.GetPendingPackets(s.consumerCtx()) s.Require().NotEmpty(consumerPackets) - s.Require().Equal(4, len(consumerPackets.GetList()), "unexpected number of pending data packets") + s.Require().Len(consumerPackets, 4, "unexpected number of pending data packets") // upgrade expired client to the consumer upgradeExpiredClient(s, Provider) @@ -150,7 +150,6 @@ func (s *CCVTestSuite) TestConsumerPacketSendExpiredClient() { // check that the list of pending data packets is emptied consumerPackets = consumerKeeper.GetPendingPackets(s.consumerCtx()) s.Require().Empty(consumerPackets) - s.Require().Equal(0, len(consumerPackets.GetList()), "unexpected number of pending data packets") // relay all packet from consumer to provider relayAllCommittedPackets(s, s.consumerChain, s.path, ccv.ConsumerPortID, s.path.EndpointA.ChannelID, 4) diff --git a/tests/integration/slashing.go b/tests/integration/slashing.go index 28ae9da958..2bc960fd03 100644 --- a/tests/integration/slashing.go +++ b/tests/integration/slashing.go @@ -486,15 +486,15 @@ func (suite *CCVTestSuite) TestValidatorDowntime() { // check that slash packet is queued pendingPackets := consumerKeeper.GetPendingPackets(ctx) - suite.Require().NotEmpty(pendingPackets.List, "pending packets empty") - suite.Require().Len(pendingPackets.List, 1, "pending packets len should be 1 is %d", len(pendingPackets.List)) + suite.Require().NotEmpty(pendingPackets, "pending packets empty") + suite.Require().Len(pendingPackets, 1, "pending packets len should be 1 is %d", len(pendingPackets)) // clear queue, commit packets suite.consumerApp.GetConsumerKeeper().SendPackets(ctx) // check queue was cleared pendingPackets = suite.consumerApp.GetConsumerKeeper().GetPendingPackets(ctx) - suite.Require().Empty(pendingPackets.List, "pending packets NOT empty") + suite.Require().Empty(pendingPackets, "pending packets NOT empty") // verify that the slash packet was sent gotCommit := consumerIBCKeeper.ChannelKeeper.GetPacketCommitment(ctx, ccv.ConsumerPortID, channelID, seq) @@ -573,15 +573,15 @@ func (suite *CCVTestSuite) TestValidatorDoubleSigning() { // check slash packet is queued pendingPackets := suite.consumerApp.GetConsumerKeeper().GetPendingPackets(ctx) - suite.Require().NotEmpty(pendingPackets.List, "pending packets empty") - suite.Require().Len(pendingPackets.List, 1, "pending packets len should be 1 is %d", len(pendingPackets.List)) + suite.Require().NotEmpty(pendingPackets, "pending packets empty") + suite.Require().Len(pendingPackets, 1, "pending packets len should be 1 is %d", len(pendingPackets)) // clear queue, commit packets suite.consumerApp.GetConsumerKeeper().SendPackets(ctx) // check queue was cleared pendingPackets = suite.consumerApp.GetConsumerKeeper().GetPendingPackets(ctx) - suite.Require().Empty(pendingPackets.List, "pending packets NOT empty") + suite.Require().Empty(pendingPackets, "pending packets NOT empty") // check slash packet is sent gotCommit := suite.consumerApp.GetIBCKeeper().ChannelKeeper.GetPacketCommitment(ctx, ccv.ConsumerPortID, channelID, seq) @@ -636,7 +636,7 @@ func (suite *CCVTestSuite) TestQueueAndSendSlashPacket() { // the downtime slash request duplicates dataPackets := consumerKeeper.GetPendingPackets(ctx) suite.Require().NotEmpty(dataPackets) - suite.Require().Len(dataPackets.GetList(), 12) + suite.Require().Len(dataPackets, 12) // save consumer next sequence seq, _ := consumerIBCKeeper.ChannelKeeper.GetNextSequenceSend(ctx, ccv.ConsumerPortID, channelID) @@ -663,7 +663,7 @@ func (suite *CCVTestSuite) TestQueueAndSendSlashPacket() { // check that pending data packets got cleared dataPackets = consumerKeeper.GetPendingPackets(ctx) suite.Require().Empty(dataPackets) - suite.Require().Len(dataPackets.GetList(), 0) + suite.Require().Len(dataPackets, 0) } // TestCISBeforeCCVEstablished tests that the consumer chain doesn't panic or @@ -674,14 +674,14 @@ func (suite *CCVTestSuite) TestCISBeforeCCVEstablished() { // Check pending packets is empty pendingPackets := consumerKeeper.GetPendingPackets(suite.consumerCtx()) - suite.Require().Len(pendingPackets.List, 0) + suite.Require().Len(pendingPackets, 0) consumerKeeper.SlashWithInfractionReason(suite.consumerCtx(), []byte{0x01, 0x02, 0x3}, 66, 4324, sdk.MustNewDecFromStr("0.05"), stakingtypes.Infraction_INFRACTION_DOWNTIME) // Check slash packet was queued pendingPackets = consumerKeeper.GetPendingPackets(suite.consumerCtx()) - suite.Require().Len(pendingPackets.List, 1) + suite.Require().Len(pendingPackets, 1) // Pass 5 blocks, confirming the consumer doesn't panic for i := 0; i < 5; i++ { @@ -690,7 +690,7 @@ func (suite *CCVTestSuite) TestCISBeforeCCVEstablished() { // Check packet is still queued pendingPackets = consumerKeeper.GetPendingPackets(suite.consumerCtx()) - suite.Require().Len(pendingPackets.List, 1) + suite.Require().Len(pendingPackets, 1) // establish ccv channel suite.SetupCCVChannel(suite.path) @@ -699,5 +699,5 @@ func (suite *CCVTestSuite) TestCISBeforeCCVEstablished() { // Pass one more block, and confirm the packet is sent now that ccv channel is established suite.consumerChain.NextBlock() pendingPackets = consumerKeeper.GetPendingPackets(suite.consumerCtx()) - suite.Require().Len(pendingPackets.List, 0) + suite.Require().Len(pendingPackets, 0) } diff --git a/x/ccv/consumer/keeper/genesis.go b/x/ccv/consumer/keeper/genesis.go index 45ea54f49c..a55184fd27 100644 --- a/x/ccv/consumer/keeper/genesis.go +++ b/x/ccv/consumer/keeper/genesis.go @@ -90,9 +90,12 @@ func (k Keeper) InitGenesis(ctx sdk.Context, state *consumertypes.GenesisState) k.SetLastTransmissionBlockHeight(ctx, state.LastTransmissionBlockHeight) } - // set pending consumer pending packets + // Set pending consumer packets, using the depreciated ConsumerPacketDataList type + // that exists for genesis. // note that the list includes pending mature VSC packet only if the handshake is completed - k.AppendPendingPacket(ctx, state.PendingConsumerPackets.List...) + for _, packet := range state.PendingConsumerPackets.List { + k.AppendPendingPacket(ctx, packet.Type, packet.Data) + } // set height to valset update id mapping for _, h2v := range state.HeightToValsetUpdateId { @@ -122,6 +125,11 @@ func (k Keeper) ExportGenesis(ctx sdk.Context) (genesis *consumertypes.GenesisSt // export the current validator set valset := k.MustGetCurrentValidatorsAsABCIUpdates(ctx) + // export pending packets using the depreciated ConsumerPacketDataList type + pendingPackets := k.GetPendingPackets(ctx) + pendingPacketsDepreciated := ccv.ConsumerPacketDataList{} + pendingPacketsDepreciated.List = append(pendingPacketsDepreciated.List, pendingPackets...) + // export all the states created after a provider channel got established if channelID, ok := k.GetProviderChannel(ctx); ok { clientID, found := k.GetProviderClientID(ctx) @@ -136,7 +144,7 @@ func (k Keeper) ExportGenesis(ctx sdk.Context) (genesis *consumertypes.GenesisSt k.GetAllPacketMaturityTimes(ctx), valset, k.GetAllHeightToValsetUpdateIDs(ctx), - k.GetPendingPackets(ctx), + pendingPacketsDepreciated, k.GetAllOutstandingDowntimes(ctx), k.GetLastTransmissionBlockHeight(ctx), params, @@ -156,7 +164,7 @@ func (k Keeper) ExportGenesis(ctx sdk.Context) (genesis *consumertypes.GenesisSt nil, valset, k.GetAllHeightToValsetUpdateIDs(ctx), - k.GetPendingPackets(ctx), + pendingPacketsDepreciated, nil, consumertypes.LastTransmissionBlockHeight{}, params, diff --git a/x/ccv/consumer/keeper/genesis_test.go b/x/ccv/consumer/keeper/genesis_test.go index 47d834f8a8..5058f6ff5c 100644 --- a/x/ccv/consumer/keeper/genesis_test.go +++ b/x/ccv/consumer/keeper/genesis_test.go @@ -148,7 +148,12 @@ func TestInitGenesis(t *testing.T) { func(ctx sdk.Context, ck consumerkeeper.Keeper, gs *consumertypes.GenesisState) { assertConsumerPortIsBound(t, ctx, &ck) - require.Equal(t, pendingDataPackets, ck.GetPendingPackets(ctx)) + obtainedPendingPackets := ck.GetPendingPackets(ctx) + for idx, expectedPacketData := range pendingDataPackets.List { + require.Equal(t, expectedPacketData.Type, obtainedPendingPackets[idx].Type) + require.Equal(t, expectedPacketData.Data, obtainedPendingPackets[idx].Data) + } + assertHeightValsetUpdateIDs(t, ctx, &ck, defaultHeightValsetUpdateIDs) assertProviderClientID(t, ctx, &ck, provClientID) require.Equal(t, validator.Address.Bytes(), ck.GetAllCCValidator(ctx)[0].Address) @@ -186,7 +191,12 @@ func TestInitGenesis(t *testing.T) { require.Equal(t, provChannelID, gotChannelID) require.True(t, ck.PacketMaturityTimeExists(ctx, matPackets[0].VscId, matPackets[0].MaturityTime)) - require.Equal(t, pendingDataPackets, ck.GetPendingPackets(ctx)) + + obtainedPendingPackets := ck.GetPendingPackets(ctx) + for idx, expectedPacketData := range pendingDataPackets.List { + require.Equal(t, expectedPacketData.Type, obtainedPendingPackets[idx].Type) + require.Equal(t, expectedPacketData.Data, obtainedPendingPackets[idx].Data) + } require.Equal(t, gs.OutstandingDowntimeSlashing, ck.GetAllOutstandingDowntimes(ctx)) @@ -252,12 +262,16 @@ func TestExportGenesis(t *testing.T) { Data: &ccv.ConsumerPacketData_SlashPacketData{ SlashPacketData: ccv.NewSlashPacketData(abciValidator, vscID, stakingtypes.Infraction_INFRACTION_DOWNTIME), }, + Idx: 0, }, { Type: ccv.VscMaturedPacket, Data: &ccv.ConsumerPacketData_VscMaturedPacketData{ VscMaturedPacketData: ccv.NewVSCMaturedPacketData(vscID), }, + // This idx is a part of the expected genesis state. + // If the keeper is correctly storing consumer packet data, indexes should be populated. + Idx: 1, }, }, } @@ -291,7 +305,10 @@ func TestExportGenesis(t *testing.T) { ck.SetCCValidator(ctx, cVal) ck.SetParams(ctx, params) - ck.AppendPendingPacket(ctx, consPackets.List...) + for _, packet := range consPackets.List { + ck.AppendPendingPacket(ctx, packet.Type, packet.Data) + } + ck.SetHeightValsetUpdateID(ctx, defaultHeightValsetUpdateIDs[0].Height, defaultHeightValsetUpdateIDs[0].ValsetUpdateId) }, consumertypes.NewRestartGenesisState( @@ -321,7 +338,9 @@ func TestExportGenesis(t *testing.T) { ck.SetHeightValsetUpdateID(ctx, updatedHeightValsetUpdateIDs[0].Height, updatedHeightValsetUpdateIDs[0].ValsetUpdateId) ck.SetHeightValsetUpdateID(ctx, updatedHeightValsetUpdateIDs[1].Height, updatedHeightValsetUpdateIDs[1].ValsetUpdateId) - ck.AppendPendingPacket(ctx, consPackets.List...) + for _, packet := range consPackets.List { + ck.AppendPendingPacket(ctx, packet.Type, packet.Data) + } // populate the required states for an established CCV channel ck.SetPacketMaturityTime(ctx, matPackets[0].VscId, matPackets[0].MaturityTime) diff --git a/x/ccv/consumer/keeper/keeper.go b/x/ccv/consumer/keeper/keeper.go index 7da13ab433..cfff31b367 100644 --- a/x/ccv/consumer/keeper/keeper.go +++ b/x/ccv/consumer/keeper/keeper.go @@ -593,48 +593,78 @@ func (k Keeper) GetAllValidators(ctx sdk.Context) (validators []stakingtypes.Val return validators } -// SetPendingPackets sets the pending CCV packets -func (k Keeper) SetPendingPackets(ctx sdk.Context, packets ccv.ConsumerPacketDataList) { +// getAndIncrementPendingPacketsIdx returns the current pending packets index and increments it. +// This index is used for implementing a FIFO queue of pending packets in the KV store. +func (k Keeper) getAndIncrementPendingPacketsIdx(ctx sdk.Context) (toReturn uint64) { store := ctx.KVStore(k.storeKey) - bz, err := packets.Marshal() - if err != nil { - // This should never happen - panic(fmt.Errorf("failed to marshal ConsumerPacketDataList: %w", err)) + bz := store.Get(types.PendingPacketsIndexKey()) + if bz != nil { + toReturn = sdk.BigEndianToUint64(bz) } - store.Set(types.PendingDataPacketsKey(), bz) + toStore := toReturn + 1 + store.Set(types.PendingPacketsIndexKey(), sdk.Uint64ToBigEndian(toStore)) + return toReturn } -// GetPendingPackets returns the pending CCV packets from the store -func (k Keeper) GetPendingPackets(ctx sdk.Context) ccv.ConsumerPacketDataList { - var packets ccv.ConsumerPacketDataList - +// GetPendingPackets returns ALL the pending CCV packets from the store +func (k Keeper) GetPendingPackets(ctx sdk.Context) []ccv.ConsumerPacketData { + var packets []ccv.ConsumerPacketData store := ctx.KVStore(k.storeKey) - bz := store.Get(types.PendingDataPacketsKey()) - if bz == nil { - return packets + // Note: PendingDataPacketsBytePrefix is the correct prefix, NOT PendingDataPacketsByteKey. + // See consistency with PendingDataPacketsKey(). + iterator := sdk.KVStorePrefixIterator(store, []byte{types.PendingDataPacketsBytePrefix}) + defer iterator.Close() + for ; iterator.Valid(); iterator.Next() { + var packet ccv.ConsumerPacketData + bz := iterator.Value() + err := packet.Unmarshal(bz) + if err != nil { + // An error here would indicate something is very wrong, + panic(fmt.Errorf("failed to unmarshal pending data packet: %w", err)) + } + packets = append(packets, packet) } + return packets +} - err := packets.Unmarshal(bz) - if err != nil { - // An error here would indicate something is very wrong, - // the PendingPackets are assumed to be correctly serialized in SetPendingPackets. - panic(fmt.Errorf("failed to unmarshal pending data packets: %w", err)) +// DeletePendingDataPackets deletes pending data packets with given indexes +func (k Keeper) DeletePendingDataPackets(ctx sdk.Context, idxs ...uint64) { + store := ctx.KVStore(k.storeKey) + for _, idx := range idxs { + store.Delete(types.PendingDataPacketsKey(idx)) } - - return packets } -// DeletePendingDataPackets clears the pending data packets in store -func (k Keeper) DeletePendingDataPackets(ctx sdk.Context) { +func (k Keeper) DeleteAllPendingDataPackets(ctx sdk.Context) { store := ctx.KVStore(k.storeKey) - store.Delete(types.PendingDataPacketsKey()) + // Note: PendingDataPacketsBytePrefix is the correct prefix, NOT PendingDataPacketsByteKey. + // See consistency with PendingDataPacketsKey(). + iterator := sdk.KVStorePrefixIterator(store, []byte{types.PendingDataPacketsBytePrefix}) + keysToDel := [][]byte{} + defer iterator.Close() + for ; iterator.Valid(); iterator.Next() { + keysToDel = append(keysToDel, iterator.Key()) + } + for _, key := range keysToDel { + store.Delete(key) + } } -// AppendPendingDataPacket appends the given data packet to the pending data packets in store -func (k Keeper) AppendPendingPacket(ctx sdk.Context, packet ...ccv.ConsumerPacketData) { - pending := k.GetPendingPackets(ctx) - list := append(pending.GetList(), packet...) - k.SetPendingPackets(ctx, ccv.ConsumerPacketDataList{List: list}) +// AppendPendingPacket enqueues the given data packet to the end of the pending data packets queue +func (k Keeper) AppendPendingPacket(ctx sdk.Context, packetType ccv.ConsumerPacketDataType, data ccv.ExportedIsConsumerPacketData_Data) { + cpd := ccv.NewConsumerPacketData( + packetType, + data, + k.getAndIncrementPendingPacketsIdx(ctx), + ) + key := types.PendingDataPacketsKey(cpd.Idx) + store := ctx.KVStore(k.storeKey) + bz, err := cpd.Marshal() + if err != nil { + // This should never happen + panic(fmt.Errorf("failed to marshal ConsumerPacketData: %w", err)) + } + store.Set(key, bz) } func (k Keeper) MarkAsPrevStandaloneChain(ctx sdk.Context) { diff --git a/x/ccv/consumer/keeper/keeper_test.go b/x/ccv/consumer/keeper/keeper_test.go index 662a776cef..5802c9d590 100644 --- a/x/ccv/consumer/keeper/keeper_test.go +++ b/x/ccv/consumer/keeper/keeper_test.go @@ -314,23 +314,25 @@ func TestGetAllCCValidator(t *testing.T) { require.Equal(t, result, expectedGetAllOrder) } -func TestSetPendingPackets(t *testing.T) { +func TestPendingPackets(t *testing.T) { consumerKeeper, ctx, ctrl, _ := testkeeper.GetConsumerKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) defer ctrl.Finish() - // prepare test setup - dataPackets := []ccv.ConsumerPacketData{ + // Instantiate some expected packet data + packetData := []ccv.ConsumerPacketData{ { Type: ccv.VscMaturedPacket, Data: &ccv.ConsumerPacketData_VscMaturedPacketData{ VscMaturedPacketData: ccv.NewVSCMaturedPacketData(1), }, + Idx: 0, // Note these are expected idxs, we don't pass this data to the keeper }, { Type: ccv.VscMaturedPacket, Data: &ccv.ConsumerPacketData_VscMaturedPacketData{ VscMaturedPacketData: ccv.NewVSCMaturedPacketData(2), }, + Idx: 1, }, { Type: ccv.SlashPacket, @@ -341,19 +343,24 @@ func TestSetPendingPackets(t *testing.T) { stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN, ), }, + Idx: 2, }, { Type: ccv.VscMaturedPacket, Data: &ccv.ConsumerPacketData_VscMaturedPacketData{ VscMaturedPacketData: ccv.NewVSCMaturedPacketData(3), }, + Idx: 3, }, } - consumerKeeper.SetPendingPackets(ctx, ccv.ConsumerPacketDataList{List: dataPackets}) - storedDataPackets := consumerKeeper.GetPendingPackets(ctx) - require.NotEmpty(t, storedDataPackets) - require.Equal(t, dataPackets, storedDataPackets.List) + // Append all packets to the queue + for _, data := range packetData { + consumerKeeper.AppendPendingPacket(ctx, data.Type, data.Data) + } + storedPacketData := consumerKeeper.GetPendingPackets(ctx) + require.NotEmpty(t, storedPacketData) + require.Equal(t, packetData, storedPacketData) slashPacket := ccv.NewSlashPacketData( abci.Validator{ @@ -363,31 +370,50 @@ func TestSetPendingPackets(t *testing.T) { uint64(4), stakingtypes.Infraction_INFRACTION_DOWNTIME, ) - dataPackets = append(dataPackets, ccv.ConsumerPacketData{ + // Append slash packet to expected packet data + packetData = append(packetData, ccv.ConsumerPacketData{ Type: ccv.SlashPacket, - Data: &ccv.ConsumerPacketData_SlashPacketData{SlashPacketData: slashPacket}, - }, - ) - consumerKeeper.AppendPendingPacket(ctx, dataPackets[len(dataPackets)-1]) - storedDataPackets = consumerKeeper.GetPendingPackets(ctx) - require.NotEmpty(t, storedDataPackets) - require.Equal(t, dataPackets, storedDataPackets.List) + Data: &ccv.ConsumerPacketData_SlashPacketData{ + SlashPacketData: slashPacket, + }, + Idx: 4, + }) - vscMaturedPakcet := ccv.NewVSCMaturedPacketData(4) - dataPackets = append(dataPackets, ccv.ConsumerPacketData{ + toAppend := packetData[len(packetData)-1] + consumerKeeper.AppendPendingPacket(ctx, toAppend.Type, toAppend.Data) + storedPacketData = consumerKeeper.GetPendingPackets(ctx) + require.NotEmpty(t, storedPacketData) + require.Equal(t, packetData, storedPacketData) + + vscMaturedPacket := ccv.NewVSCMaturedPacketData(4) + packetData = append(packetData, ccv.ConsumerPacketData{ Type: ccv.VscMaturedPacket, - Data: &ccv.ConsumerPacketData_VscMaturedPacketData{VscMaturedPacketData: vscMaturedPakcet}, - }, - ) - consumerKeeper.AppendPendingPacket(ctx, dataPackets[len(dataPackets)-1]) - storedDataPackets = consumerKeeper.GetPendingPackets(ctx) - require.NotEmpty(t, storedDataPackets) - require.Equal(t, dataPackets, storedDataPackets.List) - - consumerKeeper.DeletePendingDataPackets(ctx) - storedDataPackets = consumerKeeper.GetPendingPackets(ctx) - require.Empty(t, storedDataPackets) - require.Len(t, storedDataPackets.List, 0) + Data: &ccv.ConsumerPacketData_VscMaturedPacketData{ + VscMaturedPacketData: vscMaturedPacket, + }, + Idx: 5, + }) + toAppend = packetData[len(packetData)-1] + consumerKeeper.AppendPendingPacket(ctx, toAppend.Type, toAppend.Data) + + storedPacketData = consumerKeeper.GetPendingPackets(ctx) + require.NotEmpty(t, storedPacketData) + require.Equal(t, packetData, storedPacketData) + + // Delete packet with idx 5 (final index) + consumerKeeper.DeletePendingDataPackets(ctx, 5) + storedPacketData = consumerKeeper.GetPendingPackets(ctx) + require.Equal(t, packetData[:len(packetData)-1], storedPacketData) + + // Delete packet with idx 0 (first index) + consumerKeeper.DeletePendingDataPackets(ctx, 0) + storedPacketData = consumerKeeper.GetPendingPackets(ctx) + require.Equal(t, packetData[1:len(packetData)-1], storedPacketData) + + // Delete all packets + consumerKeeper.DeleteAllPendingDataPackets(ctx) + storedPacketData = consumerKeeper.GetPendingPackets(ctx) + require.Empty(t, storedPacketData) } // TestVerifyProviderChain tests the VerifyProviderChain method for the consumer keeper diff --git a/x/ccv/consumer/keeper/migration.go b/x/ccv/consumer/keeper/migration.go new file mode 100644 index 0000000000..361bb2a62f --- /dev/null +++ b/x/ccv/consumer/keeper/migration.go @@ -0,0 +1,70 @@ +package keeper + +import ( + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" + + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" +) + +// Migrator is a struct for handling in-place store migrations. +type Migrator struct { + ccvConsumerKeeper Keeper + ccvConsumerParamSpace paramtypes.Subspace +} + +// NewMigrator returns a new Migrator. +func NewMigrator(ccvConsumerKeeper Keeper, ccvConsumerParamSpace paramtypes.Subspace) Migrator { + return Migrator{ccvConsumerKeeper: ccvConsumerKeeper, ccvConsumerParamSpace: ccvConsumerParamSpace} +} + +// MigrateConsumerPacketData migrates consumer packet data according to +// https://github.com/cosmos/interchain-security/pull/1037 +// +// Note an equivalent migration is not required for providers. +func (k Keeper) MigrateConsumerPacketData(ctx sdk.Context) { + // deserialize packet data from old format + var depreciatedType ccvtypes.ConsumerPacketDataList + store := ctx.KVStore(k.storeKey) + bz := store.Get([]byte{consumertypes.PendingDataPacketsBytePrefix}) + if bz == nil { + ctx.Logger().Info("no pending data packets to migrate") + return + } + err := depreciatedType.Unmarshal(bz) + if err != nil { + // An error here would indicate something is very wrong + panic(fmt.Errorf("failed to unmarshal pending data packets: %w", err)) + } + + // Delete old data + store.Delete([]byte{consumertypes.PendingDataPacketsBytePrefix}) + + // re-serialize packet data in new format, with the same key prefix, + // where indexes are added internally to AppendPendingPacket. + for _, data := range depreciatedType.List { + k.AppendPendingPacket(ctx, data.Type, data.Data) + } +} + +// TODO: the following hackyness could be removed if we're able to reference older versions of ICS. +// This would likely require go.mod split, and a testing module that could depend on multiple ICS versions. + +func PendingDataPacketsKeyOnlyForTesting() []byte { + return []byte{consumertypes.PendingDataPacketsBytePrefix} // Assumes keys haven't been shuffled +} + +// Note: a better test of the old functionality would be to directly reference the old ICS version, +// including the version of ccv.ConsumerPacketDataList has a list of ccv.ConsumerPacketData without indexes. +func (k Keeper) SetPendingPacketsOnlyForTesting(ctx sdk.Context, packets ccvtypes.ConsumerPacketDataList) { + store := ctx.KVStore(k.storeKey) + bz, err := packets.Marshal() + if err != nil { + // This should never happen + panic(fmt.Errorf("failed to marshal ConsumerPacketDataList: %w", err)) + } + store.Set(PendingDataPacketsKeyOnlyForTesting(), bz) +} diff --git a/x/ccv/consumer/keeper/migration_test.go b/x/ccv/consumer/keeper/migration_test.go new file mode 100644 index 0000000000..1e7bc54bdf --- /dev/null +++ b/x/ccv/consumer/keeper/migration_test.go @@ -0,0 +1,68 @@ +package keeper_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + testutil "github.com/cosmos/interchain-security/v3/testutil/keeper" + ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" +) + +func TestMigrateConsumerPacketData(t *testing.T) { + consumerKeeper, ctx, ctrl, _ := testutil.GetConsumerKeeperAndCtx(t, testutil.NewInMemKeeperParams(t)) + defer ctrl.Finish() + + // Set some pending data packets in the old format + packets := ccvtypes.ConsumerPacketDataList{ + List: []ccvtypes.ConsumerPacketData{ + { + Type: ccvtypes.SlashPacket, + Data: &ccvtypes.ConsumerPacketData_SlashPacketData{ + SlashPacketData: &ccvtypes.SlashPacketData{ + ValsetUpdateId: 77, + }, + }, + }, + { + Type: ccvtypes.VscMaturedPacket, + Data: &ccvtypes.ConsumerPacketData_VscMaturedPacketData{ + VscMaturedPacketData: &ccvtypes.VSCMaturedPacketData{ + ValsetUpdateId: 88, + }, + }, + }, + { + Type: ccvtypes.VscMaturedPacket, + Data: &ccvtypes.ConsumerPacketData_VscMaturedPacketData{ + VscMaturedPacketData: &ccvtypes.VSCMaturedPacketData{ + ValsetUpdateId: 99, + }, + }, + }, + }, + } + + // Set old data + consumerKeeper.SetPendingPacketsOnlyForTesting(ctx, packets) + + // Migrate + consumerKeeper.MigrateConsumerPacketData(ctx) + + // Check that the data is migrated properly + obtainedPackets := consumerKeeper.GetPendingPackets(ctx) + require.Len(t, packets.List, 3) + + require.Equal(t, ccvtypes.SlashPacket, obtainedPackets[0].Type) + require.Equal(t, ccvtypes.VscMaturedPacket, obtainedPackets[1].Type) + require.Equal(t, ccvtypes.VscMaturedPacket, obtainedPackets[2].Type) + + require.Equal(t, uint64(77), obtainedPackets[0].GetSlashPacketData().ValsetUpdateId) + require.Equal(t, uint64(88), obtainedPackets[1].GetVscMaturedPacketData().ValsetUpdateId) + require.Equal(t, uint64(99), obtainedPackets[2].GetVscMaturedPacketData().ValsetUpdateId) + + // Check that indexes are populated + require.Equal(t, uint64(0), obtainedPackets[0].Idx) + require.Equal(t, uint64(1), obtainedPackets[1].Idx) + require.Equal(t, uint64(2), obtainedPackets[2].Idx) +} diff --git a/x/ccv/consumer/keeper/relay.go b/x/ccv/consumer/keeper/relay.go index cd5105421e..073a1d3996 100644 --- a/x/ccv/consumer/keeper/relay.go +++ b/x/ccv/consumer/keeper/relay.go @@ -104,10 +104,10 @@ func (k Keeper) QueueVSCMaturedPackets(ctx sdk.Context) { // Append VSCMatured packet to pending packets. // Sending packets is attempted each EndBlock. // Unsent packets remain in the queue until sent. - k.AppendPendingPacket(ctx, ccv.ConsumerPacketData{ - Type: ccv.VscMaturedPacket, - Data: &ccv.ConsumerPacketData_VscMaturedPacketData{VscMaturedPacketData: vscPacket}, - }) + k.AppendPendingPacket(ctx, + ccv.VscMaturedPacket, + &ccv.ConsumerPacketData_VscMaturedPacketData{VscMaturedPacketData: vscPacket}, + ) k.DeletePacketMaturityTimes(ctx, maturityTime.VscId, maturityTime.MaturityTime) @@ -147,12 +147,12 @@ func (k Keeper) QueueSlashPacket(ctx sdk.Context, validator abci.Validator, vals // append the Slash packet data to pending data packets // to be sent once the CCV channel is established - k.AppendPendingPacket(ctx, ccv.ConsumerPacketData{ - Type: ccv.SlashPacket, - Data: &ccv.ConsumerPacketData_SlashPacketData{ + k.AppendPendingPacket(ctx, + ccv.SlashPacket, + &ccv.ConsumerPacketData_SlashPacketData{ SlashPacketData: slashPacket, }, - }) + ) k.Logger(ctx).Info("SlashPacket enqueued", "vscID", slashPacket.ValsetUpdateId, @@ -186,7 +186,8 @@ func (k Keeper) SendPackets(ctx sdk.Context) { } pending := k.GetPendingPackets(ctx) - for _, p := range pending.GetList() { + for _, p := range pending { + // send packet over IBC err := ccv.SendIBCPacket( ctx, @@ -213,8 +214,7 @@ func (k Keeper) SendPackets(ctx sdk.Context) { } } - // clear pending data packets - k.DeletePendingDataPackets(ctx) + k.DeleteAllPendingDataPackets(ctx) } // OnAcknowledgementPacket executes application logic for acknowledgments of sent VSCMatured and Slash packets diff --git a/x/ccv/consumer/keeper/relay_test.go b/x/ccv/consumer/keeper/relay_test.go index 962fc943bd..48ad7f5ab9 100644 --- a/x/ccv/consumer/keeper/relay_test.go +++ b/x/ccv/consumer/keeper/relay_test.go @@ -293,9 +293,9 @@ func TestSendPacketsFailure(t *testing.T) { consumerKeeper.SetParams(ctx, consumertypes.DefaultParams()) // Set some pending packets - consumerKeeper.SetPendingPackets(ctx, types.ConsumerPacketDataList{List: []types.ConsumerPacketData{ - {}, {}, {}, - }}) + consumerKeeper.AppendPendingPacket(ctx, types.VscMaturedPacket, &types.ConsumerPacketData_VscMaturedPacketData{}) + consumerKeeper.AppendPendingPacket(ctx, types.SlashPacket, &types.ConsumerPacketData_SlashPacketData{}) + consumerKeeper.AppendPendingPacket(ctx, types.VscMaturedPacket, &types.ConsumerPacketData_VscMaturedPacketData{}) // Mock the channel keeper to return an error gomock.InOrder( @@ -305,5 +305,5 @@ func TestSendPacketsFailure(t *testing.T) { // No panic should occur, pending packets should not be cleared consumerKeeper.SendPackets(ctx) - require.Equal(t, 3, len(consumerKeeper.GetPendingPackets(ctx).List)) + require.Equal(t, 3, len(consumerKeeper.GetPendingPackets(ctx))) } diff --git a/x/ccv/consumer/keeper/validators_test.go b/x/ccv/consumer/keeper/validators_test.go index 67ab91f531..dda1ebab19 100644 --- a/x/ccv/consumer/keeper/validators_test.go +++ b/x/ccv/consumer/keeper/validators_test.go @@ -154,7 +154,7 @@ func TestSlash(t *testing.T) { // If we call slash with infraction type empty, no slash packet will be queued consumerKeeper.SlashWithInfractionReason(ctx, []byte{0x01, 0x02, 0x03}, 5, 6, sdk.NewDec(9.0), stakingtypes.Infraction_INFRACTION_UNSPECIFIED) pendingPackets := consumerKeeper.GetPendingPackets(ctx) - require.Len(t, pendingPackets.List, 0) + require.Len(t, pendingPackets, 0) // Consumer keeper from test setup should return false for IsPrevStandaloneChain() require.False(t, consumerKeeper.IsPrevStandaloneChain(ctx)) @@ -165,7 +165,7 @@ func TestSlash(t *testing.T) { // Call slash with valid infraction type and confirm 1 slash packet is queued consumerKeeper.SlashWithInfractionReason(ctx, []byte{0x01, 0x02, 0x03}, 5, 6, sdk.NewDec(9.0), stakingtypes.Infraction_INFRACTION_DOWNTIME) pendingPackets = consumerKeeper.GetPendingPackets(ctx) - require.Len(t, pendingPackets.List, 1) + require.Len(t, pendingPackets, 1) // Next, we set a value for the standalone staking keeper, // and mark the consumer keeper as being from a previous standalone chain diff --git a/x/ccv/consumer/types/keys.go b/x/ccv/consumer/types/keys.go index 0ceed2814e..8b792419ef 100644 --- a/x/ccv/consumer/types/keys.go +++ b/x/ccv/consumer/types/keys.go @@ -98,6 +98,10 @@ const ( // PrevStandaloneChainByteKey is the byte storing the flag marking whether this chain was previously standalone PrevStandaloneChainByteKey + // PendingPacketsIndexBytePrefix is the single byte key to the pending packets index. + // This index is used for implementing a FIFO queue of pending packets in the KV store. + PendingPacketsIndexByteKey + // NOTE: DO NOT ADD NEW BYTE PREFIXES HERE WITHOUT ADDING THEM TO getAllKeyPrefixes() IN keys_test.go ) @@ -172,11 +176,13 @@ func CrossChainValidatorKey(addr []byte) []byte { return append([]byte{CrossChainValidatorBytePrefix}, addr...) } -// PendingDataPacketsKey returns the key for storing a list of data packets -// that cannot be sent yet to the provider chain either because the CCV channel -// is not established or because the client is expired. -func PendingDataPacketsKey() []byte { - return []byte{PendingDataPacketsBytePrefix} +// PendingDataPacketsKey returns the key for storing a queue of data packets to be sent to the provider. +// Packets in this queue will not be sent on the next endblocker if: +// - the CCV channel is not yet established +// - the client is expired +// - A slash packet is being bounced between consumer and provider (not yet implemented) +func PendingDataPacketsKey(idx uint64) []byte { + return append([]byte{PendingDataPacketsBytePrefix}, sdk.Uint64ToBigEndian(idx)...) } func PreCCVKey() []byte { @@ -206,6 +212,12 @@ func PrevStandaloneChainKey() []byte { return []byte{PrevStandaloneChainByteKey} } +// PendingPacketsIndexKey returns the key to the pending packets index. +// This index is used for implementing a FIFO queue of pending packets in the KV store. +func PendingPacketsIndexKey() []byte { + return []byte{PendingPacketsIndexByteKey} +} + // NOTE: DO NOT ADD FULLY DEFINED KEY FUNCTIONS WITHOUT ADDING THEM TO getAllFullyDefinedKeys() IN keys_test.go // diff --git a/x/ccv/consumer/types/keys_test.go b/x/ccv/consumer/types/keys_test.go index a63da6f326..5290dd3599 100644 --- a/x/ccv/consumer/types/keys_test.go +++ b/x/ccv/consumer/types/keys_test.go @@ -41,6 +41,7 @@ func getAllKeyPrefixes() []byte { InitGenesisHeightByteKey, StandaloneTransferChannelIDByteKey, PrevStandaloneChainByteKey, + PendingPacketsIndexByteKey, } } @@ -72,10 +73,11 @@ func getAllFullyDefinedKeys() [][]byte { PacketMaturityTimeKey(0, time.Time{}), HeightValsetUpdateIDKey(0), OutstandingDowntimeKey([]byte{}), - PendingDataPacketsKey(), + PendingDataPacketsKey(473289), CrossChainValidatorKey([]byte{}), InitGenesisHeightKey(), StandaloneTransferChannelIDKey(), PrevStandaloneChainKey(), + PendingPacketsIndexKey(), } } diff --git a/x/ccv/types/ccv.go b/x/ccv/types/ccv.go index f02ed1c450..453c55d252 100644 --- a/x/ccv/types/ccv.go +++ b/x/ccv/types/ccv.go @@ -164,3 +164,17 @@ func (vdt1 SlashPacketDataV1) FromV1() *SlashPacketData { Infraction: newType, } } + +// An exported wrapper around the auto generated isConsumerPacketData_Data interface, only for +// AppendPendingPacket to accept the interface as an argument. +type ExportedIsConsumerPacketData_Data interface { + isConsumerPacketData_Data +} + +func NewConsumerPacketData(cpdType ConsumerPacketDataType, data isConsumerPacketData_Data, idx uint64) ConsumerPacketData { + return ConsumerPacketData{ + Type: cpdType, + Data: data, + Idx: idx, + } +} diff --git a/x/ccv/types/ccv.pb.go b/x/ccv/types/ccv.pb.go index c2f0bd3ecc..c5eacc2288 100644 --- a/x/ccv/types/ccv.pb.go +++ b/x/ccv/types/ccv.pb.go @@ -361,13 +361,14 @@ func (m *MaturedUnbondingOps) GetIds() []uint64 { return nil } -// ConsumerPacketData contains a consumer packet data and a type tag +// ConsumerPacketData contains a consumer packet data, type tag, and index for storage. type ConsumerPacketData struct { Type ConsumerPacketDataType `protobuf:"varint,1,opt,name=type,proto3,enum=interchain_security.ccv.v1.ConsumerPacketDataType" json:"type,omitempty"` // Types that are valid to be assigned to Data: // *ConsumerPacketData_SlashPacketData // *ConsumerPacketData_VscMaturedPacketData Data isConsumerPacketData_Data `protobuf_oneof:"data"` + Idx uint64 `protobuf:"varint,4,opt,name=idx,proto3" json:"idx,omitempty"` } func (m *ConsumerPacketData) Reset() { *m = ConsumerPacketData{} } @@ -447,6 +448,13 @@ func (m *ConsumerPacketData) GetVscMaturedPacketData() *VSCMaturedPacketData { return nil } +func (m *ConsumerPacketData) GetIdx() uint64 { + if m != nil { + return m.Idx + } + return 0 +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*ConsumerPacketData) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -456,6 +464,7 @@ func (*ConsumerPacketData) XXX_OneofWrappers() []interface{} { } // ConsumerPacketDataList is a list of consumer packet data packets. +// NOTE: It is only used for exporting / importing state in InitGenesis and ExportGenesis. type ConsumerPacketDataList struct { List []ConsumerPacketData `protobuf:"bytes,1,rep,name=list,proto3" json:"list"` } @@ -678,60 +687,61 @@ func init() { } var fileDescriptor_68bd5f3242e6f29c = []byte{ - // 836 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x56, 0xcf, 0x6e, 0xe2, 0x46, - 0x1c, 0xb6, 0x01, 0xad, 0x9a, 0xa1, 0x22, 0xce, 0x2c, 0xad, 0x58, 0x6f, 0xcb, 0x5a, 0xd6, 0x4a, + // 849 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x56, 0xcf, 0x6e, 0xe2, 0x46, + 0x1c, 0xc6, 0x80, 0x56, 0xcd, 0x50, 0x11, 0x67, 0x96, 0x56, 0x5e, 0x6f, 0xcb, 0x5a, 0xd6, 0x4a, 0x45, 0xa9, 0xd6, 0x2e, 0x64, 0x0f, 0x55, 0x7b, 0x69, 0x00, 0xa7, 0x71, 0x9b, 0x90, 0xc8, 0x06, - 0x56, 0xdb, 0x8b, 0x35, 0xd8, 0x13, 0x32, 0x0a, 0xd8, 0xc8, 0x33, 0xb8, 0xe5, 0x0d, 0x2a, 0x4e, - 0x7d, 0x01, 0x4e, 0x55, 0x0f, 0xfb, 0x18, 0xbd, 0xed, 0x71, 0xa5, 0x5e, 0xf6, 0xd2, 0xa8, 0x4a, - 0xde, 0xa0, 0x4f, 0x50, 0xd9, 0xfc, 0xc7, 0x06, 0x29, 0x52, 0xa5, 0xf6, 0x84, 0x19, 0xff, 0xbe, - 0x4f, 0xf3, 0xfd, 0x19, 0x79, 0xc0, 0x73, 0xe2, 0x32, 0xec, 0xdb, 0xd7, 0x88, 0xb8, 0x16, 0xc5, - 0xf6, 0xd0, 0x27, 0x6c, 0xa4, 0xda, 0x76, 0xa0, 0x06, 0xe5, 0xf0, 0x47, 0x19, 0xf8, 0x1e, 0xf3, - 0xa0, 0x98, 0x30, 0xa5, 0x84, 0xaf, 0x83, 0xb2, 0xf8, 0xdc, 0xf6, 0x68, 0xdf, 0xa3, 0x2a, 0x65, - 0xe8, 0x86, 0xb8, 0x5d, 0x35, 0x28, 0x77, 0x30, 0x43, 0xe5, 0xf9, 0xff, 0x29, 0x83, 0x98, 0xef, - 0x7a, 0x5d, 0x2f, 0x7a, 0x54, 0xc3, 0xa7, 0xd9, 0xea, 0x53, 0x86, 0x5d, 0x07, 0xfb, 0x7d, 0xe2, - 0x32, 0x15, 0x75, 0x6c, 0xa2, 0xb2, 0xd1, 0x00, 0xd3, 0xe9, 0x4b, 0xf9, 0x3d, 0x0f, 0x3e, 0x69, - 0xa3, 0x1e, 0x71, 0x10, 0xf3, 0x7c, 0x13, 0xb3, 0xda, 0x35, 0x72, 0xbb, 0xf8, 0x12, 0xd9, 0x37, - 0x98, 0xd5, 0x11, 0x43, 0xd0, 0x03, 0x07, 0xc1, 0xfc, 0xbd, 0x35, 0x1c, 0x38, 0x88, 0x61, 0x5a, - 0xe0, 0xa5, 0x74, 0x29, 0x5b, 0x91, 0x94, 0x25, 0xb3, 0x12, 0x32, 0x2b, 0x0b, 0xa6, 0x56, 0x34, - 0x58, 0x95, 0xde, 0xde, 0x3e, 0xe3, 0xfe, 0xbe, 0x7d, 0x56, 0x18, 0xa1, 0x7e, 0xef, 0x2b, 0x39, - 0x46, 0x24, 0x1b, 0x42, 0xb0, 0x0e, 0xa1, 0xb0, 0x04, 0xc2, 0x35, 0x8a, 0xd9, 0x6c, 0xc8, 0x22, - 0x4e, 0x21, 0x25, 0xf1, 0xa5, 0x8c, 0x91, 0x9b, 0xae, 0x4f, 0x07, 0x75, 0x07, 0x7e, 0x0a, 0x00, - 0xed, 0x21, 0x7a, 0x6d, 0x21, 0xfb, 0x86, 0x16, 0xd2, 0x52, 0xba, 0xb4, 0x67, 0xec, 0x45, 0x2b, - 0xc7, 0xf6, 0x0d, 0x95, 0x3d, 0xf0, 0x64, 0x9b, 0x32, 0x0a, 0x0d, 0x90, 0xe9, 0x11, 0xca, 0x66, - 0x4a, 0xbe, 0x54, 0xb6, 0x7b, 0xaf, 0xec, 0xb2, 0xa7, 0x9a, 0x09, 0x15, 0x1a, 0x11, 0x97, 0xfc, - 0x0d, 0xc8, 0xb7, 0xcd, 0xda, 0x39, 0x62, 0x43, 0x1f, 0x3b, 0x2b, 0x16, 0x26, 0x29, 0xe2, 0x93, - 0x14, 0xc9, 0x7f, 0xf0, 0x60, 0xdf, 0x0c, 0x05, 0xac, 0xa0, 0x0d, 0xb0, 0xb7, 0xf0, 0x28, 0x82, - 0x65, 0x2b, 0xe2, 0x76, 0xe3, 0xab, 0x85, 0x99, 0xe5, 0xc2, 0x86, 0xe5, 0xb2, 0xb1, 0xa4, 0x79, - 0x80, 0xc7, 0x55, 0x00, 0x88, 0x7b, 0xe5, 0x23, 0x9b, 0x11, 0xcf, 0x2d, 0xa4, 0x25, 0xbe, 0x94, - 0xab, 0xc8, 0xca, 0xb4, 0x8d, 0xca, 0xbc, 0x7d, 0xb3, 0x36, 0x2a, 0xfa, 0x62, 0xd2, 0x58, 0x41, - 0xc9, 0x9f, 0x81, 0xc7, 0x33, 0x53, 0x5a, 0x6e, 0xc7, 0x73, 0x1d, 0xe2, 0x76, 0x2f, 0x06, 0x14, - 0x0a, 0x20, 0x4d, 0x9c, 0x69, 0x97, 0x32, 0x46, 0xf8, 0x28, 0xff, 0x96, 0x02, 0xb0, 0xe6, 0xb9, - 0x74, 0xd8, 0xc7, 0xfe, 0x8a, 0x03, 0x27, 0x20, 0x13, 0x56, 0x36, 0x12, 0x9f, 0xab, 0x54, 0x76, - 0x65, 0x15, 0x47, 0x37, 0x47, 0x03, 0x6c, 0x44, 0x78, 0xf8, 0x0a, 0xec, 0xd3, 0x75, 0x73, 0x23, - 0xd1, 0xd9, 0xca, 0xe7, 0xbb, 0x28, 0x37, 0xf2, 0x38, 0xe5, 0x8c, 0x4d, 0x16, 0x78, 0x05, 0xf2, - 0x01, 0xb5, 0x63, 0xc1, 0x47, 0x76, 0x65, 0x2b, 0x5f, 0xec, 0x2c, 0x57, 0x42, 0x61, 0x4e, 0x39, - 0x23, 0x91, 0xaf, 0xfa, 0x08, 0x64, 0x1c, 0xc4, 0x90, 0xdc, 0x01, 0x1f, 0xc7, 0x85, 0x9e, 0x11, - 0xca, 0xe0, 0xe9, 0x5a, 0xad, 0x95, 0x87, 0x59, 0xb5, 0x56, 0xe6, 0x37, 0x29, 0x90, 0x8f, 0x8f, - 0xb4, 0xcb, 0xff, 0x5a, 0x1a, 0xaf, 0xb7, 0xa5, 0xf1, 0xe2, 0x01, 0x69, 0xb4, 0xcb, 0xff, 0x87, - 0x3c, 0xfe, 0xe4, 0xc1, 0x41, 0x6c, 0x63, 0xff, 0xf1, 0xc1, 0xfd, 0x2e, 0xe1, 0xe0, 0x1e, 0xee, - 0x52, 0xbe, 0x3c, 0xbc, 0x51, 0x48, 0x2b, 0xe8, 0xc3, 0xdf, 0xf9, 0xa4, 0xc2, 0x85, 0x63, 0xf0, - 0x6b, 0x20, 0xd5, 0x2e, 0x1a, 0x66, 0xeb, 0x5c, 0x33, 0xac, 0xcb, 0xe3, 0xda, 0xf7, 0x5a, 0xd3, - 0x6a, 0xbe, 0xbe, 0xd4, 0xac, 0x56, 0xc3, 0xbc, 0xd4, 0x6a, 0xfa, 0x89, 0xae, 0xd5, 0x05, 0x4e, - 0xfc, 0x68, 0x3c, 0x91, 0x0e, 0x5a, 0x2e, 0x1d, 0x60, 0x9b, 0x5c, 0x91, 0xb9, 0x87, 0x50, 0x05, - 0x62, 0x22, 0xd8, 0x3c, 0x3b, 0x36, 0x4f, 0x05, 0x5e, 0xdc, 0x1f, 0x4f, 0xa4, 0xec, 0x8a, 0xb1, - 0xf0, 0x08, 0x3c, 0x49, 0x04, 0x84, 0xa9, 0x09, 0x29, 0x31, 0x3f, 0x9e, 0x48, 0x42, 0x7b, 0x23, - 0x29, 0x31, 0xf3, 0xf3, 0xaf, 0x45, 0xee, 0xf0, 0x0d, 0x0f, 0x72, 0xeb, 0x12, 0xe1, 0x4b, 0xf0, - 0x54, 0x6f, 0x9c, 0x18, 0xc7, 0xb5, 0xa6, 0x7e, 0xd1, 0x48, 0xda, 0xf6, 0xe3, 0xf1, 0x44, 0xda, - 0x5f, 0x82, 0xb4, 0xfe, 0x80, 0x8d, 0xa0, 0x1a, 0x47, 0xd5, 0x2f, 0x5a, 0xd5, 0x33, 0xcd, 0x32, - 0xf5, 0x6f, 0x1b, 0x02, 0x2f, 0xe6, 0xc6, 0x13, 0x09, 0xd4, 0xbd, 0x61, 0xa7, 0x87, 0x4d, 0xd2, - 0x75, 0xe1, 0x21, 0x28, 0xc4, 0x01, 0xaf, 0x1a, 0x4d, 0xfd, 0x5c, 0x13, 0x52, 0xe2, 0x87, 0xe3, - 0x89, 0xf4, 0x41, 0xdd, 0xfb, 0xd1, 0x65, 0xa4, 0x8f, 0xa7, 0x7b, 0xad, 0x36, 0xde, 0xde, 0x15, - 0xf9, 0x77, 0x77, 0x45, 0xfe, 0xaf, 0xbb, 0x22, 0xff, 0xcb, 0x7d, 0x91, 0x7b, 0x77, 0x5f, 0xe4, - 0xde, 0xdf, 0x17, 0xb9, 0x1f, 0x5e, 0x76, 0x09, 0xbb, 0x1e, 0x76, 0x14, 0xdb, 0xeb, 0xab, 0xb3, - 0x2b, 0xc1, 0x32, 0xd2, 0x17, 0x8b, 0xbb, 0x45, 0x70, 0xa4, 0xfe, 0x14, 0x5d, 0x30, 0xa2, 0x4f, - 0x7d, 0xe7, 0x51, 0xf4, 0xad, 0x3f, 0xfa, 0x27, 0x00, 0x00, 0xff, 0xff, 0x8f, 0xbf, 0xfc, 0xd2, - 0x88, 0x08, 0x00, 0x00, + 0x56, 0xdb, 0x8b, 0x35, 0xd8, 0x13, 0x32, 0x0a, 0xd8, 0xc8, 0x33, 0xb8, 0xcb, 0x1b, 0x54, 0x9c, + 0xfa, 0x02, 0x9c, 0x7a, 0xda, 0x27, 0xe8, 0xb9, 0xb7, 0x3d, 0xae, 0xd4, 0xcb, 0x5e, 0xba, 0xaa, + 0x92, 0x37, 0xe8, 0x13, 0x54, 0xb6, 0x09, 0x7f, 0x62, 0x83, 0x14, 0x69, 0xa5, 0x3d, 0x31, 0x8c, + 0x7f, 0xdf, 0x27, 0x7f, 0x7f, 0x46, 0x1e, 0xf0, 0x94, 0xb8, 0x0c, 0xfb, 0xf6, 0x25, 0x22, 0xae, + 0x45, 0xb1, 0x3d, 0xf6, 0x09, 0x9b, 0xa8, 0xb6, 0x1d, 0xa8, 0x41, 0x35, 0xfc, 0x51, 0x46, 0xbe, + 0xc7, 0x3c, 0x28, 0xa6, 0x4c, 0x29, 0xe1, 0xe3, 0xa0, 0x2a, 0x3e, 0xb5, 0x3d, 0x3a, 0xf4, 0xa8, + 0x4a, 0x19, 0xba, 0x22, 0x6e, 0x5f, 0x0d, 0xaa, 0x3d, 0xcc, 0x50, 0xf5, 0xf6, 0x7f, 0xcc, 0x20, + 0x96, 0xfa, 0x5e, 0xdf, 0x8b, 0x96, 0x6a, 0xb8, 0x9a, 0xef, 0x3e, 0x66, 0xd8, 0x75, 0xb0, 0x3f, + 0x24, 0x2e, 0x53, 0x51, 0xcf, 0x26, 0x2a, 0x9b, 0x8c, 0x30, 0x8d, 0x1f, 0xca, 0xef, 0x38, 0xf0, + 0x45, 0x17, 0x0d, 0x88, 0x83, 0x98, 0xe7, 0x9b, 0x98, 0x35, 0x2e, 0x91, 0xdb, 0xc7, 0xe7, 0xc8, + 0xbe, 0xc2, 0xac, 0x89, 0x18, 0x82, 0x1e, 0xd8, 0x0b, 0x6e, 0x9f, 0x5b, 0xe3, 0x91, 0x83, 0x18, + 0xa6, 0x02, 0x27, 0xe5, 0x2a, 0x85, 0x9a, 0xa4, 0x2c, 0x99, 0x95, 0x90, 0x59, 0x59, 0x30, 0x75, + 0xa2, 0xc1, 0xba, 0xf4, 0xe6, 0xfd, 0x93, 0xcc, 0x7f, 0xef, 0x9f, 0x08, 0x13, 0x34, 0x1c, 0x7c, + 0x27, 0x27, 0x88, 0x64, 0x83, 0x0f, 0xd6, 0x21, 0x14, 0x56, 0x40, 0xb8, 0x47, 0x31, 0x9b, 0x0f, + 0x59, 0xc4, 0x11, 0xb2, 0x12, 0x57, 0xc9, 0x1b, 0xc5, 0x78, 0x3f, 0x1e, 0xd4, 0x1d, 0xf8, 0x25, + 0x00, 0x74, 0x80, 0xe8, 0xa5, 0x85, 0xec, 0x2b, 0x2a, 0xe4, 0xa4, 0x5c, 0x65, 0xc7, 0xd8, 0x89, + 0x76, 0x0e, 0xed, 0x2b, 0x2a, 0x7b, 0xe0, 0xd1, 0x26, 0x65, 0x14, 0x1a, 0x20, 0x3f, 0x20, 0x94, + 0xcd, 0x95, 0x7c, 0xab, 0x6c, 0xf6, 0x5e, 0xd9, 0x66, 0x4f, 0x3d, 0x1f, 0x2a, 0x34, 0x22, 0x2e, + 0xf9, 0x07, 0x50, 0xea, 0x9a, 0x8d, 0x53, 0xc4, 0xc6, 0x3e, 0x76, 0x56, 0x2c, 0x4c, 0x53, 0xc4, + 0xa5, 0x29, 0x92, 0xff, 0xe6, 0xc0, 0xae, 0x19, 0x0a, 0x58, 0x41, 0x1b, 0x60, 0x67, 0xe1, 0x51, + 0x04, 0x2b, 0xd4, 0xc4, 0xcd, 0xc6, 0xd7, 0x85, 0xb9, 0xe5, 0xfc, 0x1d, 0xcb, 0x65, 0x63, 0x49, + 0x73, 0x0f, 0x8f, 0xeb, 0x00, 0x10, 0xf7, 0xc2, 0x47, 0x36, 0x23, 0x9e, 0x2b, 0xe4, 0x24, 0xae, + 0x52, 0xac, 0xc9, 0x4a, 0xdc, 0x46, 0xe5, 0xb6, 0x7d, 0xf3, 0x36, 0x2a, 0xfa, 0x62, 0xd2, 0x58, + 0x41, 0xc9, 0x5f, 0x81, 0x87, 0x73, 0x53, 0x3a, 0x6e, 0xcf, 0x73, 0x1d, 0xe2, 0xf6, 0xcf, 0x46, + 0x14, 0xf2, 0x20, 0x47, 0x9c, 0xb8, 0x4b, 0x79, 0x23, 0x5c, 0xca, 0x7f, 0x66, 0x01, 0x6c, 0x78, + 0x2e, 0x1d, 0x0f, 0xb1, 0xbf, 0xe2, 0xc0, 0x11, 0xc8, 0x87, 0x95, 0x8d, 0xc4, 0x17, 0x6b, 0xb5, + 0x6d, 0x59, 0x25, 0xd1, 0xed, 0xc9, 0x08, 0x1b, 0x11, 0x1e, 0xbe, 0x00, 0xbb, 0x74, 0xdd, 0xdc, + 0x48, 0x74, 0xa1, 0xf6, 0xf5, 0x36, 0xca, 0x3b, 0x79, 0x1c, 0x67, 0x8c, 0xbb, 0x2c, 0xf0, 0x02, + 0x94, 0x02, 0x6a, 0x27, 0x82, 0x8f, 0xec, 0x2a, 0xd4, 0xbe, 0xd9, 0x5a, 0xae, 0x94, 0xc2, 0x1c, + 0x67, 0x8c, 0x54, 0xbe, 0xd8, 0xb1, 0x57, 0x42, 0x3e, 0x4a, 0x2a, 0x5c, 0xd6, 0x1f, 0x80, 0xbc, + 0x83, 0x18, 0x92, 0x7b, 0xe0, 0xf3, 0xa4, 0xf4, 0x13, 0x42, 0x19, 0x3c, 0x5e, 0x2b, 0xba, 0x72, + 0x3f, 0xf3, 0xd6, 0xea, 0xfd, 0x3a, 0x0b, 0x4a, 0xc9, 0x91, 0x6e, 0xf5, 0x83, 0xe5, 0xf3, 0x72, + 0x53, 0x3e, 0xcf, 0xee, 0x91, 0x4f, 0xb7, 0xfa, 0x11, 0x13, 0x5a, 0xe4, 0xf1, 0x0f, 0x07, 0xf6, + 0x12, 0x2f, 0xf6, 0x91, 0x8f, 0xf2, 0x4f, 0x29, 0x47, 0x79, 0x7f, 0x9b, 0xf2, 0xe5, 0x71, 0x8e, + 0x42, 0x5a, 0x41, 0xef, 0xff, 0xc5, 0xa5, 0x15, 0x2e, 0x1c, 0x83, 0xdf, 0x03, 0xa9, 0x71, 0xd6, + 0x32, 0x3b, 0xa7, 0x9a, 0x61, 0x9d, 0x1f, 0x36, 0x7e, 0xd6, 0xda, 0x56, 0xfb, 0xe5, 0xb9, 0x66, + 0x75, 0x5a, 0xe6, 0xb9, 0xd6, 0xd0, 0x8f, 0x74, 0xad, 0xc9, 0x67, 0xc4, 0xcf, 0xa6, 0x33, 0x69, + 0xaf, 0xe3, 0xd2, 0x11, 0xb6, 0xc9, 0x05, 0xb9, 0xf5, 0x10, 0xaa, 0x40, 0x4c, 0x05, 0x9b, 0x27, + 0x87, 0xe6, 0x31, 0xcf, 0x89, 0xbb, 0xd3, 0x99, 0x54, 0x58, 0x31, 0x16, 0x1e, 0x80, 0x47, 0xa9, + 0x80, 0x30, 0x35, 0x3e, 0x2b, 0x96, 0xa6, 0x33, 0x89, 0xef, 0xde, 0x49, 0x4a, 0xcc, 0xff, 0xf6, + 0x47, 0x39, 0xb3, 0xff, 0x9a, 0x03, 0xc5, 0x75, 0x89, 0xf0, 0x39, 0x78, 0xac, 0xb7, 0x8e, 0x8c, + 0xc3, 0x46, 0x5b, 0x3f, 0x6b, 0xa5, 0xbd, 0xf6, 0xc3, 0xe9, 0x4c, 0xda, 0x5d, 0x82, 0xb4, 0xe1, + 0x88, 0x4d, 0xa0, 0x9a, 0x44, 0x35, 0xcf, 0x3a, 0xf5, 0x13, 0xcd, 0x32, 0xf5, 0x1f, 0x5b, 0x3c, + 0x27, 0x16, 0xa7, 0x33, 0x09, 0x34, 0xbd, 0x71, 0x6f, 0x80, 0x4d, 0xd2, 0x77, 0xe1, 0x3e, 0x10, + 0x92, 0x80, 0x17, 0xad, 0xb6, 0x7e, 0xaa, 0xf1, 0x59, 0xf1, 0xd3, 0xe9, 0x4c, 0xfa, 0xa4, 0xe9, + 0xfd, 0xea, 0x32, 0x32, 0xc4, 0xf1, 0xbb, 0xd6, 0x5b, 0x6f, 0xae, 0xcb, 0xdc, 0xdb, 0xeb, 0x32, + 0xf7, 0xef, 0x75, 0x99, 0xfb, 0xfd, 0xa6, 0x9c, 0x79, 0x7b, 0x53, 0xce, 0xbc, 0xbb, 0x29, 0x67, + 0x7e, 0x79, 0xde, 0x27, 0xec, 0x72, 0xdc, 0x53, 0x6c, 0x6f, 0xa8, 0xce, 0x2f, 0x09, 0xcb, 0x48, + 0x9f, 0x2d, 0x6e, 0x1b, 0xc1, 0x81, 0xfa, 0x2a, 0xba, 0x72, 0x44, 0x1f, 0xff, 0xde, 0x83, 0xe8, + 0xeb, 0x7f, 0xf0, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x69, 0x5d, 0x6d, 0x1f, 0x9a, 0x08, 0x00, + 0x00, } func (m *ValidatorSetChangePacketData) Marshal() (dAtA []byte, err error) { @@ -954,6 +964,11 @@ func (m *ConsumerPacketData) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.Idx != 0 { + i = encodeVarintCcv(dAtA, i, uint64(m.Idx)) + i-- + dAtA[i] = 0x20 + } if m.Data != nil { { size := m.Data.Size() @@ -1279,6 +1294,9 @@ func (m *ConsumerPacketData) Size() (n int) { if m.Data != nil { n += m.Data.Size() } + if m.Idx != 0 { + n += 1 + sovCcv(uint64(m.Idx)) + } return n } @@ -2036,6 +2054,25 @@ func (m *ConsumerPacketData) Unmarshal(dAtA []byte) error { } m.Data = &ConsumerPacketData_VscMaturedPacketData{v} iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Idx", wireType) + } + m.Idx = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCcv + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Idx |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipCcv(dAtA[iNdEx:]) From b7a0d1d4806d65265342f21cc23fc73495c055e2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jul 2023 12:30:31 -0700 Subject: [PATCH 079/108] build(deps): bump google.golang.org/grpc from 1.56.1 to 1.56.2 (#1126) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.56.1 to 1.56.2. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.56.1...v1.56.2) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 036c4d4c46..d639ef5dca 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,7 @@ require ( golang.org/x/net v0.9.0 // indirect golang.org/x/sys v0.7.0 // indirect google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 - google.golang.org/grpc v1.56.1 + google.golang.org/grpc v1.56.2 google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v2 v2.4.0 ) diff --git a/go.sum b/go.sum index 6ef711918b..5bf7c2d676 100644 --- a/go.sum +++ b/go.sum @@ -1790,8 +1790,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.56.1 h1:z0dNfjIl0VpaZ9iSVjA6daGatAYwPGstTjt5vkRMFkQ= -google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.56.2 h1:fVRFRnXvU+x6C4IlHZewvJOVHoOv1TUuQyoRsYnB4bI= +google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= From efd69b0ff11a15cd5108e27d1f575badefea59a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jul 2023 12:59:07 -0700 Subject: [PATCH 080/108] build(deps): bump semver from 6.3.0 to 6.3.1 in /tests/difference/core/model (#1129) build(deps): bump semver in /tests/difference/core/model Bumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 6.3.1. - [Release notes](https://github.com/npm/node-semver/releases) - [Changelog](https://github.com/npm/node-semver/blob/v6.3.1/CHANGELOG.md) - [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v6.3.1) --- updated-dependencies: - dependency-name: semver dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> --- tests/difference/core/model/yarn.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/difference/core/model/yarn.lock b/tests/difference/core/model/yarn.lock index 2f35241e52..a708e2fa11 100644 --- a/tests/difference/core/model/yarn.lock +++ b/tests/difference/core/model/yarn.lock @@ -2498,16 +2498,16 @@ safe-buffer@~5.1.1: integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== semver@7.x, semver@^7.3.5, semver@^7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== shallow-clone@^3.0.0: version "3.0.1" From 3f3ba9c21fec75c349e0b4f2cfaf652e5966a904 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jul 2023 13:23:19 -0700 Subject: [PATCH 081/108] build(deps): bump semver from 5.7.1 to 5.7.2 in /docs (#1141) Bumps [semver](https://github.com/npm/node-semver) from 5.7.1 to 5.7.2. - [Release notes](https://github.com/npm/node-semver/releases) - [Changelog](https://github.com/npm/node-semver/blob/v5.7.2/CHANGELOG.md) - [Commits](https://github.com/npm/node-semver/compare/v5.7.1...v5.7.2) --- updated-dependencies: - dependency-name: semver dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> --- docs/package-lock.json | 144 ++++++++++++++++++++--------------------- 1 file changed, 72 insertions(+), 72 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 7d86ce0b2e..385c2a96d6 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -236,9 +236,9 @@ } }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -312,9 +312,9 @@ } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -372,9 +372,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -1624,9 +1624,9 @@ } }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -1836,9 +1836,9 @@ } }, "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -2799,9 +2799,9 @@ } }, "node_modules/@mdx-js/mdx/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { "semver": "bin/semver" } @@ -4045,9 +4045,9 @@ } }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -7770,9 +7770,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -8395,9 +8395,9 @@ } }, "node_modules/package-json/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -10060,9 +10060,9 @@ } }, "node_modules/remark-mdx/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { "semver": "bin/semver" } @@ -10511,9 +10511,9 @@ } }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -10536,9 +10536,9 @@ } }, "node_modules/semver-diff/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -12934,9 +12934,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -12993,9 +12993,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -13037,9 +13037,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -13849,9 +13849,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -14006,9 +14006,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -14733,9 +14733,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" }, "source-map": { "version": "0.5.7", @@ -15706,9 +15706,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -18383,9 +18383,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -18813,9 +18813,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -19957,9 +19957,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" }, "source-map": { "version": "0.5.7", @@ -20272,9 +20272,9 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" }, @@ -20303,9 +20303,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, From d77fbf4f49c99b102b072fdf95d35e00ebbf0825 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Mon, 17 Jul 2023 09:18:24 -0700 Subject: [PATCH 082/108] fix!: proper deletion of pending packets (#1146) * Update relay.go * expectation func * reg test * Update CHANGELOG.md --- CHANGELOG.md | 1 + testutil/keeper/expectations.go | 19 +++++++++++++++ x/ccv/consumer/keeper/relay.go | 10 ++++---- x/ccv/consumer/keeper/relay_test.go | 36 +++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c017fc5b1..7109f43bbf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Add an entry to the unreleased section whenever merging a PR to main that is not targeted at a specific release. These entries will eventually be included in a release. +* (fix!) proper deletion of pending packets [#1146](https://github.com/cosmos/interchain-security/pull/1146) * (feat!) optimize pending packets storage on consumer, with migration! [#1037](https://github.com/cosmos/interchain-security/pull/1037) ## v3.1.0 diff --git a/testutil/keeper/expectations.go b/testutil/keeper/expectations.go index 1e59085d23..8a231f4760 100644 --- a/testutil/keeper/expectations.go +++ b/testutil/keeper/expectations.go @@ -14,6 +14,7 @@ import ( channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" ibctmtypes "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + "github.com/cosmos/interchain-security/v3/x/ccv/types" host "github.com/cosmos/ibc-go/v7/modules/core/24-host" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" @@ -139,3 +140,21 @@ func ExpectGetCapabilityMock(ctx sdk.Context, mocks MockedKeepers, times int) *g ctx, host.PortPath(ccv.ConsumerPortID), ).Return(nil, true).Times(times) } + +func GetMocksForSendIBCPacket(ctx sdk.Context, mocks MockedKeepers, channelID string, times int) []*gomock.Call { + return []*gomock.Call{ + mocks.MockChannelKeeper.EXPECT().GetChannel(ctx, types.ConsumerPortID, + "consumerCCVChannelID").Return(channeltypes.Channel{}, true).Times(times), + mocks.MockScopedKeeper.EXPECT().GetCapability(ctx, + host.ChannelCapabilityPath(types.ConsumerPortID, "consumerCCVChannelID")).Return( + capabilitytypes.NewCapability(1), true).Times(times), + mocks.MockChannelKeeper.EXPECT().SendPacket(ctx, + capabilitytypes.NewCapability(1), + types.ConsumerPortID, + "consumerCCVChannelID", + gomock.Any(), + gomock.Any(), + gomock.Any(), + ).Return(uint64(888), nil).Times(times), + } +} diff --git a/x/ccv/consumer/keeper/relay.go b/x/ccv/consumer/keeper/relay.go index 073a1d3996..120c0218c2 100644 --- a/x/ccv/consumer/keeper/relay.go +++ b/x/ccv/consumer/keeper/relay.go @@ -186,6 +186,7 @@ func (k Keeper) SendPackets(ctx sdk.Context) { } pending := k.GetPendingPackets(ctx) + idxsForDeletion := []uint64{} for _, p := range pending { // send packet over IBC @@ -203,18 +204,19 @@ func (k Keeper) SendPackets(ctx sdk.Context) { // IBC client is expired! // leave the packet data stored to be sent once the client is upgraded k.Logger(ctx).Info("IBC client is expired, cannot send IBC packet; leaving packet data stored:", "type", p.Type.String()) - return + break } // Not able to send packet over IBC! // Leave the packet data stored for the sent to be retried in the next block. // Note that if VSCMaturedPackets are not sent for long enough, the provider // will remove the consumer anyway. k.Logger(ctx).Error("cannot send IBC packet; leaving packet data stored:", "type", p.Type.String(), "err", err.Error()) - return + break } + idxsForDeletion = append(idxsForDeletion, p.Idx) } - - k.DeleteAllPendingDataPackets(ctx) + // Delete pending packets that were successfully sent and did not return an error from SendIBCPacket + k.DeletePendingDataPackets(ctx, idxsForDeletion...) } // OnAcknowledgementPacket executes application logic for acknowledgments of sent VSCMatured and Slash packets diff --git a/x/ccv/consumer/keeper/relay_test.go b/x/ccv/consumer/keeper/relay_test.go index 48ad7f5ab9..6dbebe273f 100644 --- a/x/ccv/consumer/keeper/relay_test.go +++ b/x/ccv/consumer/keeper/relay_test.go @@ -307,3 +307,39 @@ func TestSendPacketsFailure(t *testing.T) { consumerKeeper.SendPackets(ctx) require.Equal(t, 3, len(consumerKeeper.GetPendingPackets(ctx))) } + +// Regression test for https://github.com/cosmos/interchain-security/issues/1145 +func TestSendPacketsDeletion(t *testing.T) { + // Keeper setup + consumerKeeper, ctx, ctrl, mocks := testkeeper.GetConsumerKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) + defer ctrl.Finish() + consumerKeeper.SetProviderChannel(ctx, "consumerCCVChannelID") + consumerKeeper.SetParams(ctx, consumertypes.DefaultParams()) + + // Queue two pending packets + consumerKeeper.AppendPendingPacket(ctx, types.SlashPacket, &types.ConsumerPacketData_SlashPacketData{ // Slash appears first + SlashPacketData: &types.SlashPacketData{ + Validator: abci.Validator{}, + ValsetUpdateId: 88, + Infraction: stakingtypes.Infraction_INFRACTION_DOWNTIME, + }, + }) + consumerKeeper.AppendPendingPacket(ctx, types.VscMaturedPacket, &types.ConsumerPacketData_VscMaturedPacketData{ + VscMaturedPacketData: &types.VSCMaturedPacketData{ + ValsetUpdateId: 90, + }, + }) + + // Get mocks for a successful SendPacket call that does NOT return an error + expectations := testkeeper.GetMocksForSendIBCPacket(ctx, mocks, "consumerCCVChannelID", 1) + // Append mocks for a failed SendPacket call, which returns an error + expectations = append(expectations, mocks.MockChannelKeeper.EXPECT().GetChannel(ctx, types.ConsumerPortID, + "consumerCCVChannelID").Return(channeltypes.Channel{}, false).Times(1)) + gomock.InOrder(expectations...) + + consumerKeeper.SendPackets(ctx) + + // Expect the first successfully sent packet to be popped from queue + require.Equal(t, 1, len(consumerKeeper.GetPendingPackets(ctx))) + require.Equal(t, types.VscMaturedPacket, consumerKeeper.GetPendingPackets(ctx)[0].Type) +} From d8373547507384e3479fc12ccd2de77ddc74383e Mon Sep 17 00:00:00 2001 From: omahs <73983677+omahs@users.noreply.github.com> Date: Mon, 17 Jul 2023 20:38:25 +0200 Subject: [PATCH 083/108] docs: fix typos (#1144) * Fix: typo * Fix: typo * Fix: typo * Fix: typos * Fix: typo * Fix: typos * Fix: typos --------- Co-authored-by: MSalopek Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> --- docs/docs/adrs/adr-template.md | 2 +- docs/docs/consumer-development/consumer-chain-governance.md | 2 +- docs/docs/consumer-development/onboarding.md | 6 +++--- docs/docs/features/key-assignment.md | 2 +- docs/docs/features/proposals.md | 4 ++-- docs/docs/features/slashing.md | 4 ++-- docs/docs/introduction/terminology.md | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/docs/adrs/adr-template.md b/docs/docs/adrs/adr-template.md index 2e085330df..b9e3af1678 100644 --- a/docs/docs/adrs/adr-template.md +++ b/docs/docs/adrs/adr-template.md @@ -36,6 +36,6 @@ If the proposed change will be large, please also indicate a way to do the chang ## References -> Are there any relevant PR comments, issues that led up to this, or articles referrenced for why we made the given design choice? If so link them here! +> Are there any relevant PR comments, issues that led up to this, or articles referenced for why we made the given design choice? If so link them here! * {reference link} diff --git a/docs/docs/consumer-development/consumer-chain-governance.md b/docs/docs/consumer-development/consumer-chain-governance.md index ca99286d93..c8586efe3a 100644 --- a/docs/docs/consumer-development/consumer-chain-governance.md +++ b/docs/docs/consumer-development/consumer-chain-governance.md @@ -16,7 +16,7 @@ For an example, see the [Democracy Consumer](https://github.com/cosmos/interchai ## CosmWasm -There several great DAO and governance frameworks written as CosmWasm contracts. These can be used as the main governance system for a consumer chain. Actions triggered by the CosmWasm governance contracts are able to affect parameters and trigger actions on the consumer chain. +There are several great DAO and governance frameworks written as CosmWasm contracts. These can be used as the main governance system for a consumer chain. Actions triggered by the CosmWasm governance contracts are able to affect parameters and trigger actions on the consumer chain. For an example, see [Neutron](https://github.com/neutron-org/neutron/). diff --git a/docs/docs/consumer-development/onboarding.md b/docs/docs/consumer-development/onboarding.md index 89c5f32dc5..dc870b76de 100644 --- a/docs/docs/consumer-development/onboarding.md +++ b/docs/docs/consumer-development/onboarding.md @@ -20,7 +20,7 @@ To help validators and other node runners onboard onto your chain, please prepar This should include (at minimum): -- [ ] genesis.json witout CCV data (before the propsal passes) +- [ ] genesis.json without CCV data (before the proposal passes) - [ ] genesis.json with CCV data (after spawn time passes) - [ ] information about relevant seed/peer nodes you are running - [ ] relayer information (compatible versions) @@ -73,7 +73,7 @@ Example of a consumer chain addition proposal. // will be responsible for starting their consumer chain validator node. "spawn_time": "2023-02-28T20:40:00.000000Z", // Unbonding period for the consumer chain. - // It should should be smaller than that of the provider. + // It should be smaller than that of the provider. "unbonding_period": 86400000000000, // Timeout period for CCV related IBC packets. // Packets are considered timed-out after this interval elapses. @@ -96,7 +96,7 @@ Example of a consumer chain addition proposal. // channel is created on top of the same connection as the CCV channel. // Note that transfer_channel_id is the ID of the channel end on the consumer chain. // it is most relevant for chains performing a sovereign to consumer changeover - // in order to maintan the existing ibc transfer channel + // in order to maintain the existing ibc transfer channel "distribution_transmission_channel": "channel-123" } ``` diff --git a/docs/docs/features/key-assignment.md b/docs/docs/features/key-assignment.md index c68343255c..a44ed8a32a 100644 --- a/docs/docs/features/key-assignment.md +++ b/docs/docs/features/key-assignment.md @@ -49,7 +49,7 @@ gaiad tx provider assign-consensus-key '' --from "}` -Check that the key was assigned correcly by querying the provider: +Check that the key was assigned correctly by querying the provider: ```bash gaiad query provider validator-consumer-key cosmosvalcons1e....3xsj3ayzf4uv6 diff --git a/docs/docs/features/proposals.md b/docs/docs/features/proposals.md index b68fd343d6..25664bfc1e 100644 --- a/docs/docs/features/proposals.md +++ b/docs/docs/features/proposals.md @@ -32,7 +32,7 @@ Minimal example: "revision_number": 1, }, // Unbonding period for the consumer chain. - // It should should be smaller than that of the provider. + // It should be smaller than that of the provider. "unbonding_period": 86400000000000, // Timeout period for CCV related IBC packets. // Packets are considered timed-out after this interval elapses. @@ -44,7 +44,7 @@ Minimal example: "genesis_hash": "d86d756e10118e66e6805e9cc476949da2e750098fcc7634fd0cc77f57a0b2b0", "binary_hash": "376cdbd3a222a3d5c730c9637454cd4dd925e2f9e2e0d0f3702fc922928583f1" // relevant for chains performing a sovereign to consumer changeover - // in order to maintan the existing ibc transfer channel + // in order to maintain the existing ibc transfer channel "distribution_transmission_channel": "channel-123" } ``` diff --git a/docs/docs/features/slashing.md b/docs/docs/features/slashing.md index a28b16e8c2..4c74153b15 100644 --- a/docs/docs/features/slashing.md +++ b/docs/docs/features/slashing.md @@ -3,7 +3,7 @@ sidebar_position: 4 --- # Consumer Initiated Slashing -A consumer chain is essentially a regular Cosmos-SDK based chain that uses the interchain security module to achieve economic security by stake deposited on the provider chain, instead of it's own chain. +A consumer chain is essentially a regular Cosmos-SDK based chain that uses the interchain security module to achieve economic security by stake deposited on the provider chain, instead of its own chain. In essence, provider chain and consumer chains are different networks (different infrastructures) that are bound together by the provider's validator set. By being bound to the provider's validator set, a consumer chain inherits the economic security guarantees of the provider chain (in terms of total stake). To maintain the proof of stake model, the consumer chain is able to send evidence of infractions (double signing and downtime) to the provider chain so the offending validators can be penalized. @@ -17,7 +17,7 @@ reported by consumer chains are acted upon on the provider as soon as the provid Instead of slashing, the provider will only jail offending validator for the duration of time established in the chain parameters. :::info -Slash throttling (sometimes called jail throttling) mechanism insures that only a fraction of the validator set can be jailed at any one time to prevent malicious consumer chains from harming the provider. +Slash throttling (sometimes called jail throttling) mechanism ensures that only a fraction of the validator set can be jailed at any one time to prevent malicious consumer chains from harming the provider. ::: ## Double-signing (equivocation) diff --git a/docs/docs/introduction/terminology.md b/docs/docs/introduction/terminology.md index 5f6722fbd9..59994353cf 100644 --- a/docs/docs/introduction/terminology.md +++ b/docs/docs/introduction/terminology.md @@ -8,7 +8,7 @@ You may have heard of one or multiple buzzwords thrown around in the cosmos and ## Shared Security -Shared security is a family of technologies that include optimistic rollups, zk-rollups, sharding and Interchain Security. Ie. any protocol or technology that can allow one blockchain to lend/share it's proof-of-stake security with another blockchain or off-chain process. +Shared security is a family of technologies that include optimistic rollups, zk-rollups, sharding and Interchain Security. Ie. any protocol or technology that can allow one blockchain to lend/share its proof-of-stake security with another blockchain or off-chain process. ## Interchain Security From d67d1bca18440733982bd0680193f31eac2bd59d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 14:33:45 -0700 Subject: [PATCH 084/108] build(deps): bump bufbuild/buf-setup-action from 1.23.1 to 1.24.0 (#1151) Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.23.1 to 1.24.0. - [Release notes](https://github.com/bufbuild/buf-setup-action/releases) - [Commits](https://github.com/bufbuild/buf-setup-action/compare/v1.23.1...v1.24.0) --- updated-dependencies: - dependency-name: bufbuild/buf-setup-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> --- .github/workflows/proto-registry.yml | 2 +- .github/workflows/proto.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/proto-registry.yml b/.github/workflows/proto-registry.yml index 08748fe079..d79db5af70 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@v3 - - uses: bufbuild/buf-setup-action@v1.23.1 + - uses: bufbuild/buf-setup-action@v1.24.0 - uses: bufbuild/buf-push-action@v1 with: input: "proto" diff --git a/.github/workflows/proto.yml b/.github/workflows/proto.yml index 0049c05d20..9791a871c0 100644 --- a/.github/workflows/proto.yml +++ b/.github/workflows/proto.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: bufbuild/buf-setup-action@v1.23.1 + - uses: bufbuild/buf-setup-action@v1.24.0 - uses: bufbuild/buf-breaking-action@v1 with: input: "proto" From 781eefb267882e70574be86d2f7f4d6f5abcf75f Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Mon, 17 Jul 2023 14:57:28 -0700 Subject: [PATCH 085/108] chore: add release/v3.1.x targets for bots (#1140) update Co-authored-by: MSalopek --- .github/dependabot.yml | 10 ++++++++++ .mergify.yml | 8 ++++++++ 2 files changed, 18 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ec9119084e..65ff156753 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -37,3 +37,13 @@ updates: open-pull-requests-limit: 0 labels: - dependencies + + - package-ecosystem: gomod + directory: "/" + schedule: + interval: daily + target-branch: "release/v3.1.x" + # Only allow automated security-related dependency updates on release branches. + open-pull-requests-limit: 0 + labels: + - dependencies diff --git a/.mergify.yml b/.mergify.yml index 63b8b61550..e08625bf28 100644 --- a/.mergify.yml +++ b/.mergify.yml @@ -26,3 +26,11 @@ pull_request_rules: backport: branches: - release/v3.0.x + - name: Backport patches to the release/v3.1.x branch + conditions: + - base=main + - label=A:backport/v3.1.x + actions: + backport: + branches: + - release/v3.1.x From 13468a94ae53d310d1620ecfa79076710af24e34 Mon Sep 17 00:00:00 2001 From: MSalopek Date: Tue, 18 Jul 2023 15:40:55 +0200 Subject: [PATCH 086/108] fix: update broken .dependabot.yml (#1156) --- .github/dependabot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 65ff156753..647408015a 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -38,7 +38,7 @@ updates: labels: - dependencies - - package-ecosystem: gomod + - package-ecosystem: gomod directory: "/" schedule: interval: daily From 82cdd910d92dd9b09a597b484e83e6a7f033e743 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue, 18 Jul 2023 08:05:01 -0700 Subject: [PATCH 087/108] docs: ADR for standalone to consumer changeover (#1111) * Create adr-010-standalone-changeover.md * Update adr-010-standalone-changeover.md * Update adr-010-standalone-changeover.md * change order * permalinks --------- Co-authored-by: MSalopek --- .../adrs/adr-010-standalone-changeover.md | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 docs/docs/adrs/adr-010-standalone-changeover.md diff --git a/docs/docs/adrs/adr-010-standalone-changeover.md b/docs/docs/adrs/adr-010-standalone-changeover.md new file mode 100644 index 0000000000..17c192d1fe --- /dev/null +++ b/docs/docs/adrs/adr-010-standalone-changeover.md @@ -0,0 +1,55 @@ +--- +sidebar_position: 11 +title: Standalone to Consumer Changeover +--- +## ADR 010: Standalone to Consumer Changeover + +## Changelog + +* 6/30/23: Feature completed, first draft of ADR. + +## Status + +Implemented + +## Context + +[Stride](https://github.com/Stride-Labs/stride) will be the first consumer to "changeover" from a standalone cosmos blockchain, to a consumer chain secured by the Cosmos Hub. This document will outline the changes made to the replicated security protocol to support this changeover process. + +## Decision + +### Process + +Prior to the changeover, the consumer chain will have an existing staking keeper and validator set, these may be referred to as the "standalone staking keeper" and "standalone validator set" respectively. + +The first step in the changeover process is to submit a ConsumerAdditionProposal. If the proposal passes, the provider will create a new IBC client for the consumer at spawn time, with the provider's validator set. A consumer genesis will also be constructed by the provider for validators to query. Within this consumer genesis contains the initial validator set for the consumer to apply after the changeover. + +Next, the standalone consumer chain runs an upgrade which adds the CCV module, and is properly setup to execute changeover logic. + +The consumer upgrade height must be reached after the provider has created the new IBC client. Any replicated security validators who will run the consumer, but are not a part of the sovereign validator set, must sync up a full node before the consumer upgrade height is reached. The disc state of said full node will be used to run the consumer chain after the changeover has completed. + +The meat of the changeover logic is that the consumer chain validator set is updated to that which was specified by the provider via the queried consumer genesis. Validators which were a part of the old set, but not the new set, are given zero voting power. Once these validator updates are given to Comet, the set is committed, and in effect 2 blocks later (see [FirstConsumerHeight](https://github.com/cosmos/interchain-security/blob/f10e780df182158d95a30f7cf94588b2d0479309/x/ccv/consumer/keeper/changeover.go#L19)). + +A relayer then establishes the new IBC connection between the provider and consumer. The CCV channel handshake is started on top of this connection. Once the CCV channel is established and VSC packets are being relayed, the consumer chain is secured by the provider. + +### Changes to CCV Protocol + +* Consumer Genesis state is updated to include a `PreCCV` boolean. When this boolean is set true in the consumer genesis JSON, [special logic](https://github.com/cosmos/interchain-security/blob/f10e780df182158d95a30f7cf94588b2d0479309/x/ccv/consumer/keeper/changeover.go) is executed on InitGenesis to trigger the changeover process on the consumer's first endblocker after the upgrade which adds the CCV module. Note that InitGenesis is not automatically called during chain upgrades, so the consumer must manually call the consumer's InitGenesis method in an upgrade handler. +* The `ConsumerAdditionProposal` type is updated to include a `DistributionTransmissionChannel` field. This field allows the consumer to use an existing IBC transfer channel to send rewards as a part of the CCV protocol. Consumers that're not changing over from a standalone chain will leave this field blank, indicating that a new transfer channel should be created on top of the same connection as the CCV channel. +* The CCV consumer keeper is updated to contain an optional reference to the standalone staking keeper. The standalone staking keeper is used to slash for infractions that happened before the changeover was completed. Ie. any infraction from a block height before the changeover, that is submitted after the changeover, will call the standalone staking keeper's slash method. Note that a changeover consumer's standalone staking keeper becomes a democracy module keeper, so it is possible for a governance token to be slashed. + +## Consequences + +### Positive + +* Existing cosmos chains are now able to onboard over to a consumer chain secured by a provider. +* The previous staking keepers for such chains can be transitioned to democracy staking module keepers. + +### Negative + +* The delineation between different types of consumers in this repo becomes less clear. Ie. there is code in the [democracy consumer's app.go](https://github.com/cosmos/interchain-security/blob/f10e780df182158d95a30f7cf94588b2d0479309/app/consumer-democracy/app.go) that only applies to a previously standalone chain, but that file also serves as the base for a normal democracy consumer launched with RS from genesis. + +## References + +* EPIC: Standalone to Consumer Changeover [#756](https://github.com/cosmos/interchain-security/issues/756) +* [Changeover diagram from Stride](https://app.excalidraw.com/l/9UFOCMAZLAI/5EVLj0WJcwt) From 3bb50053673ddfbd1a72be0ade92ac2069534312 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jul 2023 08:32:51 -0700 Subject: [PATCH 088/108] build(deps): bump cosmossdk.io/errors from 1.0.0-beta.7 to 1.0.0 (#1154) Bumps [cosmossdk.io/errors](https://github.com/cosmos/cosmos-sdk) from 1.0.0-beta.7 to 1.0.0. - [Release notes](https://github.com/cosmos/cosmos-sdk/releases) - [Changelog](https://github.com/cosmos/cosmos-sdk/blob/main/CHANGELOG.md) - [Commits](https://github.com/cosmos/cosmos-sdk/compare/errors/v1.0.0-beta.7...log/v1.0.0) --- updated-dependencies: - dependency-name: cosmossdk.io/errors dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Co-authored-by: Marius Poke --- go.mod | 12 ++++++------ go.sum | 24 ++++++++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index d639ef5dca..7947a36e66 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/cosmos/interchain-security/v3 go 1.20 require ( - cosmossdk.io/errors v1.0.0-beta.7 + cosmossdk.io/errors v1.0.0 cosmossdk.io/math v1.0.1 github.com/cometbft/cometbft v0.37.2 github.com/cometbft/cometbft-db v0.8.0 @@ -22,10 +22,10 @@ require ( github.com/spf13/cobra v1.6.1 github.com/stretchr/testify v1.8.4 github.com/tidwall/gjson v1.14.4 - golang.org/x/crypto v0.8.0 // indirect + golang.org/x/crypto v0.11.0 // indirect golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc - golang.org/x/net v0.9.0 // indirect - golang.org/x/sys v0.7.0 // indirect + golang.org/x/net v0.12.0 // indirect + golang.org/x/sys v0.10.0 // indirect google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 google.golang.org/grpc v1.56.2 google.golang.org/protobuf v1.31.0 @@ -153,8 +153,8 @@ require ( go.etcd.io/bbolt v1.3.7 // indirect go.opencensus.io v0.24.0 // indirect golang.org/x/oauth2 v0.7.0 // indirect - golang.org/x/term v0.7.0 // indirect - golang.org/x/text v0.9.0 // indirect + golang.org/x/term v0.10.0 // indirect + golang.org/x/text v0.11.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/api v0.114.0 // indirect google.golang.org/appengine v1.6.7 // indirect diff --git a/go.sum b/go.sum index 5bf7c2d676..26ceadb4ea 100644 --- a/go.sum +++ b/go.sum @@ -198,8 +198,8 @@ cosmossdk.io/core v0.5.1 h1:vQVtFrIYOQJDV3f7rw4pjjVqc1id4+mE0L9hHP66pyI= cosmossdk.io/core v0.5.1/go.mod h1:KZtwHCLjcFuo0nmDc24Xy6CRNEL9Vl/MeimQ2aC7NLE= cosmossdk.io/depinject v1.0.0-alpha.3 h1:6evFIgj//Y3w09bqOUOzEpFj5tsxBqdc5CfkO7z+zfw= cosmossdk.io/depinject v1.0.0-alpha.3/go.mod h1:eRbcdQ7MRpIPEM5YUJh8k97nxHpYbc3sMUnEtt8HPWU= -cosmossdk.io/errors v1.0.0-beta.7 h1:gypHW76pTQGVnHKo6QBkb4yFOJjC+sUGRc5Al3Odj1w= -cosmossdk.io/errors v1.0.0-beta.7/go.mod h1:mz6FQMJRku4bY7aqS/Gwfcmr/ue91roMEKAmDUDpBfE= +cosmossdk.io/errors v1.0.0 h1:nxF07lmlBbB8NKQhtJ+sJm6ef5uV1XkvPXG2bUntb04= +cosmossdk.io/errors v1.0.0/go.mod h1:+hJZLuhdDE0pYN8HkOrVNwrIOYvUGnn6+4fjnJs/oV0= cosmossdk.io/log v1.1.0 h1:v0ogPHYeTzPcBTcPR1A3j1hkei4pZama8kz8LKlCMv0= cosmossdk.io/log v1.1.0/go.mod h1:6zjroETlcDs+mm62gd8Ig7mZ+N+fVOZS91V17H+M4N4= cosmossdk.io/math v1.0.1 h1:Qx3ifyOPaMLNH/89WeZFH268yCvU4xEcnPLu3sJqPPg= @@ -1208,8 +1208,8 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ= -golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= +golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1319,8 +1319,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1470,14 +1470,14 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1488,8 +1488,8 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 9cac44e9caec97fa04b2ee1526aeec3e5c54b93b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jul 2023 09:49:16 -0700 Subject: [PATCH 089/108] build(deps): bump JamesIves/github-pages-deploy-action from 4.4.2 to 4.4.3 (#1152) build(deps): bump JamesIves/github-pages-deploy-action Bumps [JamesIves/github-pages-deploy-action](https://github.com/jamesives/github-pages-deploy-action) from 4.4.2 to 4.4.3. - [Release notes](https://github.com/jamesives/github-pages-deploy-action/releases) - [Commits](https://github.com/jamesives/github-pages-deploy-action/compare/v4.4.2...v4.4.3) --- updated-dependencies: - dependency-name: JamesIves/github-pages-deploy-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Co-authored-by: Marius Poke --- .github/workflows/deploy-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 87b4ced180..0c7dff60c5 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -40,7 +40,7 @@ jobs: make build-docs - name: Deploy 🚀 - uses: JamesIves/github-pages-deploy-action@v4.4.2 + uses: JamesIves/github-pages-deploy-action@v4.4.3 with: branch: gh-pages folder: ~/output From 2f62e7d914ffafad2070cc8774c2e19269b57f97 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Tue, 18 Jul 2023 10:10:58 -0700 Subject: [PATCH 090/108] fix!: revert recent consumer packet data changes (#1150) * revert changes * lint * Update CHANGELOG.md * wrapper type --- CHANGELOG.md | 1 + proto/interchain_security/ccv/v1/ccv.proto | 1 - x/ccv/consumer/keeper/genesis_test.go | 4 - x/ccv/consumer/keeper/keeper.go | 40 ++++-- x/ccv/consumer/keeper/keeper_test.go | 11 +- x/ccv/consumer/keeper/migration_test.go | 5 - x/ccv/consumer/keeper/relay.go | 2 +- x/ccv/types/ccv.go | 3 +- x/ccv/types/ccv.pb.go | 142 ++++++++------------- 9 files changed, 92 insertions(+), 117 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7109f43bbf..2a5c14c6e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Add an entry to the unreleased section whenever merging a PR to main that is not targeted at a specific release. These entries will eventually be included in a release. +* (fix!) revert consumer packet data changes from #1037 [#1150](https://github.com/cosmos/interchain-security/pull/1150) * (fix!) proper deletion of pending packets [#1146](https://github.com/cosmos/interchain-security/pull/1146) * (feat!) optimize pending packets storage on consumer, with migration! [#1037](https://github.com/cosmos/interchain-security/pull/1037) diff --git a/proto/interchain_security/ccv/v1/ccv.proto b/proto/interchain_security/ccv/v1/ccv.proto index b8ad8ee6d0..adf8f418de 100644 --- a/proto/interchain_security/ccv/v1/ccv.proto +++ b/proto/interchain_security/ccv/v1/ccv.proto @@ -64,7 +64,6 @@ message ConsumerPacketData { SlashPacketData slashPacketData = 2; VSCMaturedPacketData vscMaturedPacketData = 3; } - uint64 idx = 4; } diff --git a/x/ccv/consumer/keeper/genesis_test.go b/x/ccv/consumer/keeper/genesis_test.go index 5058f6ff5c..649505da0c 100644 --- a/x/ccv/consumer/keeper/genesis_test.go +++ b/x/ccv/consumer/keeper/genesis_test.go @@ -262,16 +262,12 @@ func TestExportGenesis(t *testing.T) { Data: &ccv.ConsumerPacketData_SlashPacketData{ SlashPacketData: ccv.NewSlashPacketData(abciValidator, vscID, stakingtypes.Infraction_INFRACTION_DOWNTIME), }, - Idx: 0, }, { Type: ccv.VscMaturedPacket, Data: &ccv.ConsumerPacketData_VscMaturedPacketData{ VscMaturedPacketData: ccv.NewVSCMaturedPacketData(vscID), }, - // This idx is a part of the expected genesis state. - // If the keeper is correctly storing consumer packet data, indexes should be populated. - Idx: 1, }, }, } diff --git a/x/ccv/consumer/keeper/keeper.go b/x/ccv/consumer/keeper/keeper.go index cfff31b367..e8b1cb793e 100644 --- a/x/ccv/consumer/keeper/keeper.go +++ b/x/ccv/consumer/keeper/keeper.go @@ -606,9 +606,29 @@ func (k Keeper) getAndIncrementPendingPacketsIdx(ctx sdk.Context) (toReturn uint return toReturn } -// GetPendingPackets returns ALL the pending CCV packets from the store +// GetPendingPackets returns ALL the pending CCV packets from the store without indexes. func (k Keeper) GetPendingPackets(ctx sdk.Context) []ccv.ConsumerPacketData { - var packets []ccv.ConsumerPacketData + ppWithIndexes := k.GetAllPendingPacketsWithIdx(ctx) + var ppList []ccv.ConsumerPacketData + for _, ppWithIndex := range ppWithIndexes { + ppList = append(ppList, ppWithIndex.ConsumerPacketData) + } + return ppList +} + +// ConsumerPacketDataWithIdx is a wrapper around ConsumerPacketData +// that also stores the index of the packet in the pending packets queue. +// +// Note this type is a shim to avoid changing the schema of ConsumerPacketData and breaking the wire. +type ConsumerPacketDataWithIdx struct { + ccv.ConsumerPacketData // Struct embedding + Idx uint64 +} + +// GetAllPendingPacketsWithIdx returns ALL pending consumer packet data from the store +// with indexes relevant to the pending packets queue. +func (k Keeper) GetAllPendingPacketsWithIdx(ctx sdk.Context) []ConsumerPacketDataWithIdx { + packets := []ConsumerPacketDataWithIdx{} store := ctx.KVStore(k.storeKey) // Note: PendingDataPacketsBytePrefix is the correct prefix, NOT PendingDataPacketsByteKey. // See consistency with PendingDataPacketsKey(). @@ -622,7 +642,12 @@ func (k Keeper) GetPendingPackets(ctx sdk.Context) []ccv.ConsumerPacketData { // An error here would indicate something is very wrong, panic(fmt.Errorf("failed to unmarshal pending data packet: %w", err)) } - packets = append(packets, packet) + packetWithIdx := ConsumerPacketDataWithIdx{ + ConsumerPacketData: packet, + // index stored in key after prefix, see PendingDataPacketsKey() + Idx: sdk.BigEndianToUint64(iterator.Key()[1:]), + } + packets = append(packets, packetWithIdx) } return packets } @@ -652,13 +677,10 @@ func (k Keeper) DeleteAllPendingDataPackets(ctx sdk.Context) { // AppendPendingPacket enqueues the given data packet to the end of the pending data packets queue func (k Keeper) AppendPendingPacket(ctx sdk.Context, packetType ccv.ConsumerPacketDataType, data ccv.ExportedIsConsumerPacketData_Data) { - cpd := ccv.NewConsumerPacketData( - packetType, - data, - k.getAndIncrementPendingPacketsIdx(ctx), - ) - key := types.PendingDataPacketsKey(cpd.Idx) + idx := k.getAndIncrementPendingPacketsIdx(ctx) // for FIFO queue + key := types.PendingDataPacketsKey(idx) store := ctx.KVStore(k.storeKey) + cpd := ccv.NewConsumerPacketData(packetType, data) bz, err := cpd.Marshal() if err != nil { // This should never happen diff --git a/x/ccv/consumer/keeper/keeper_test.go b/x/ccv/consumer/keeper/keeper_test.go index 5802c9d590..269c60d9c5 100644 --- a/x/ccv/consumer/keeper/keeper_test.go +++ b/x/ccv/consumer/keeper/keeper_test.go @@ -325,14 +325,12 @@ func TestPendingPackets(t *testing.T) { Data: &ccv.ConsumerPacketData_VscMaturedPacketData{ VscMaturedPacketData: ccv.NewVSCMaturedPacketData(1), }, - Idx: 0, // Note these are expected idxs, we don't pass this data to the keeper }, { Type: ccv.VscMaturedPacket, Data: &ccv.ConsumerPacketData_VscMaturedPacketData{ VscMaturedPacketData: ccv.NewVSCMaturedPacketData(2), }, - Idx: 1, }, { Type: ccv.SlashPacket, @@ -343,14 +341,12 @@ func TestPendingPackets(t *testing.T) { stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN, ), }, - Idx: 2, }, { Type: ccv.VscMaturedPacket, Data: &ccv.ConsumerPacketData_VscMaturedPacketData{ VscMaturedPacketData: ccv.NewVSCMaturedPacketData(3), }, - Idx: 3, }, } @@ -376,7 +372,6 @@ func TestPendingPackets(t *testing.T) { Data: &ccv.ConsumerPacketData_SlashPacketData{ SlashPacketData: slashPacket, }, - Idx: 4, }) toAppend := packetData[len(packetData)-1] @@ -391,7 +386,6 @@ func TestPendingPackets(t *testing.T) { Data: &ccv.ConsumerPacketData_VscMaturedPacketData{ VscMaturedPacketData: vscMaturedPacket, }, - Idx: 5, }) toAppend = packetData[len(packetData)-1] consumerKeeper.AppendPendingPacket(ctx, toAppend.Type, toAppend.Data) @@ -404,16 +398,21 @@ func TestPendingPackets(t *testing.T) { consumerKeeper.DeletePendingDataPackets(ctx, 5) storedPacketData = consumerKeeper.GetPendingPackets(ctx) require.Equal(t, packetData[:len(packetData)-1], storedPacketData) + pendingPacketsWithIdx := consumerKeeper.GetAllPendingPacketsWithIdx(ctx) + require.Equal(t, uint64(4), pendingPacketsWithIdx[len(pendingPacketsWithIdx)-1].Idx) // final element should have idx 4 // Delete packet with idx 0 (first index) consumerKeeper.DeletePendingDataPackets(ctx, 0) storedPacketData = consumerKeeper.GetPendingPackets(ctx) require.Equal(t, packetData[1:len(packetData)-1], storedPacketData) + pendingPacketsWithIdx = consumerKeeper.GetAllPendingPacketsWithIdx(ctx) + require.Equal(t, uint64(1), pendingPacketsWithIdx[0].Idx) // first element should have idx 1 // Delete all packets consumerKeeper.DeleteAllPendingDataPackets(ctx) storedPacketData = consumerKeeper.GetPendingPackets(ctx) require.Empty(t, storedPacketData) + require.Empty(t, consumerKeeper.GetAllPendingPacketsWithIdx(ctx)) } // TestVerifyProviderChain tests the VerifyProviderChain method for the consumer keeper diff --git a/x/ccv/consumer/keeper/migration_test.go b/x/ccv/consumer/keeper/migration_test.go index 1e7bc54bdf..7cb87665f0 100644 --- a/x/ccv/consumer/keeper/migration_test.go +++ b/x/ccv/consumer/keeper/migration_test.go @@ -60,9 +60,4 @@ func TestMigrateConsumerPacketData(t *testing.T) { require.Equal(t, uint64(77), obtainedPackets[0].GetSlashPacketData().ValsetUpdateId) require.Equal(t, uint64(88), obtainedPackets[1].GetVscMaturedPacketData().ValsetUpdateId) require.Equal(t, uint64(99), obtainedPackets[2].GetVscMaturedPacketData().ValsetUpdateId) - - // Check that indexes are populated - require.Equal(t, uint64(0), obtainedPackets[0].Idx) - require.Equal(t, uint64(1), obtainedPackets[1].Idx) - require.Equal(t, uint64(2), obtainedPackets[2].Idx) } diff --git a/x/ccv/consumer/keeper/relay.go b/x/ccv/consumer/keeper/relay.go index 120c0218c2..376110f26d 100644 --- a/x/ccv/consumer/keeper/relay.go +++ b/x/ccv/consumer/keeper/relay.go @@ -185,7 +185,7 @@ func (k Keeper) SendPackets(ctx sdk.Context) { return } - pending := k.GetPendingPackets(ctx) + pending := k.GetAllPendingPacketsWithIdx(ctx) idxsForDeletion := []uint64{} for _, p := range pending { diff --git a/x/ccv/types/ccv.go b/x/ccv/types/ccv.go index 453c55d252..91175eab5d 100644 --- a/x/ccv/types/ccv.go +++ b/x/ccv/types/ccv.go @@ -171,10 +171,9 @@ type ExportedIsConsumerPacketData_Data interface { isConsumerPacketData_Data } -func NewConsumerPacketData(cpdType ConsumerPacketDataType, data isConsumerPacketData_Data, idx uint64) ConsumerPacketData { +func NewConsumerPacketData(cpdType ConsumerPacketDataType, data isConsumerPacketData_Data) ConsumerPacketData { return ConsumerPacketData{ Type: cpdType, Data: data, - Idx: idx, } } diff --git a/x/ccv/types/ccv.pb.go b/x/ccv/types/ccv.pb.go index c5eacc2288..aa0f7da10e 100644 --- a/x/ccv/types/ccv.pb.go +++ b/x/ccv/types/ccv.pb.go @@ -368,7 +368,6 @@ type ConsumerPacketData struct { // *ConsumerPacketData_SlashPacketData // *ConsumerPacketData_VscMaturedPacketData Data isConsumerPacketData_Data `protobuf_oneof:"data"` - Idx uint64 `protobuf:"varint,4,opt,name=idx,proto3" json:"idx,omitempty"` } func (m *ConsumerPacketData) Reset() { *m = ConsumerPacketData{} } @@ -448,13 +447,6 @@ func (m *ConsumerPacketData) GetVscMaturedPacketData() *VSCMaturedPacketData { return nil } -func (m *ConsumerPacketData) GetIdx() uint64 { - if m != nil { - return m.Idx - } - return 0 -} - // XXX_OneofWrappers is for the internal use of the proto package. func (*ConsumerPacketData) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -687,61 +679,60 @@ func init() { } var fileDescriptor_68bd5f3242e6f29c = []byte{ - // 849 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x56, 0xcf, 0x6e, 0xe2, 0x46, - 0x1c, 0xc6, 0x80, 0x56, 0xcd, 0x50, 0x11, 0x67, 0x96, 0x56, 0x5e, 0x6f, 0xcb, 0x5a, 0xd6, 0x4a, + // 836 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x56, 0xcf, 0x6e, 0xe2, 0x46, + 0x1c, 0xb6, 0x01, 0xad, 0x9a, 0xa1, 0x22, 0xce, 0x2c, 0xad, 0x58, 0x6f, 0xcb, 0x5a, 0xd6, 0x4a, 0x45, 0xa9, 0xd6, 0x2e, 0x64, 0x0f, 0x55, 0x7b, 0x69, 0x00, 0xa7, 0x71, 0x9b, 0x90, 0xc8, 0x06, - 0x56, 0xdb, 0x8b, 0x35, 0xd8, 0x13, 0x32, 0x0a, 0xd8, 0xc8, 0x33, 0xb8, 0xcb, 0x1b, 0x54, 0x9c, - 0xfa, 0x02, 0x9c, 0x7a, 0xda, 0x27, 0xe8, 0xb9, 0xb7, 0x3d, 0xae, 0xd4, 0xcb, 0x5e, 0xba, 0xaa, - 0x92, 0x37, 0xe8, 0x13, 0x54, 0xb6, 0x09, 0x7f, 0x62, 0x83, 0x14, 0x69, 0xa5, 0x3d, 0x31, 0x8c, - 0x7f, 0xdf, 0x27, 0x7f, 0x7f, 0x46, 0x1e, 0xf0, 0x94, 0xb8, 0x0c, 0xfb, 0xf6, 0x25, 0x22, 0xae, - 0x45, 0xb1, 0x3d, 0xf6, 0x09, 0x9b, 0xa8, 0xb6, 0x1d, 0xa8, 0x41, 0x35, 0xfc, 0x51, 0x46, 0xbe, - 0xc7, 0x3c, 0x28, 0xa6, 0x4c, 0x29, 0xe1, 0xe3, 0xa0, 0x2a, 0x3e, 0xb5, 0x3d, 0x3a, 0xf4, 0xa8, - 0x4a, 0x19, 0xba, 0x22, 0x6e, 0x5f, 0x0d, 0xaa, 0x3d, 0xcc, 0x50, 0xf5, 0xf6, 0x7f, 0xcc, 0x20, - 0x96, 0xfa, 0x5e, 0xdf, 0x8b, 0x96, 0x6a, 0xb8, 0x9a, 0xef, 0x3e, 0x66, 0xd8, 0x75, 0xb0, 0x3f, - 0x24, 0x2e, 0x53, 0x51, 0xcf, 0x26, 0x2a, 0x9b, 0x8c, 0x30, 0x8d, 0x1f, 0xca, 0xef, 0x38, 0xf0, - 0x45, 0x17, 0x0d, 0x88, 0x83, 0x98, 0xe7, 0x9b, 0x98, 0x35, 0x2e, 0x91, 0xdb, 0xc7, 0xe7, 0xc8, - 0xbe, 0xc2, 0xac, 0x89, 0x18, 0x82, 0x1e, 0xd8, 0x0b, 0x6e, 0x9f, 0x5b, 0xe3, 0x91, 0x83, 0x18, - 0xa6, 0x02, 0x27, 0xe5, 0x2a, 0x85, 0x9a, 0xa4, 0x2c, 0x99, 0x95, 0x90, 0x59, 0x59, 0x30, 0x75, - 0xa2, 0xc1, 0xba, 0xf4, 0xe6, 0xfd, 0x93, 0xcc, 0x7f, 0xef, 0x9f, 0x08, 0x13, 0x34, 0x1c, 0x7c, - 0x27, 0x27, 0x88, 0x64, 0x83, 0x0f, 0xd6, 0x21, 0x14, 0x56, 0x40, 0xb8, 0x47, 0x31, 0x9b, 0x0f, - 0x59, 0xc4, 0x11, 0xb2, 0x12, 0x57, 0xc9, 0x1b, 0xc5, 0x78, 0x3f, 0x1e, 0xd4, 0x1d, 0xf8, 0x25, - 0x00, 0x74, 0x80, 0xe8, 0xa5, 0x85, 0xec, 0x2b, 0x2a, 0xe4, 0xa4, 0x5c, 0x65, 0xc7, 0xd8, 0x89, - 0x76, 0x0e, 0xed, 0x2b, 0x2a, 0x7b, 0xe0, 0xd1, 0x26, 0x65, 0x14, 0x1a, 0x20, 0x3f, 0x20, 0x94, - 0xcd, 0x95, 0x7c, 0xab, 0x6c, 0xf6, 0x5e, 0xd9, 0x66, 0x4f, 0x3d, 0x1f, 0x2a, 0x34, 0x22, 0x2e, - 0xf9, 0x07, 0x50, 0xea, 0x9a, 0x8d, 0x53, 0xc4, 0xc6, 0x3e, 0x76, 0x56, 0x2c, 0x4c, 0x53, 0xc4, - 0xa5, 0x29, 0x92, 0xff, 0xe6, 0xc0, 0xae, 0x19, 0x0a, 0x58, 0x41, 0x1b, 0x60, 0x67, 0xe1, 0x51, - 0x04, 0x2b, 0xd4, 0xc4, 0xcd, 0xc6, 0xd7, 0x85, 0xb9, 0xe5, 0xfc, 0x1d, 0xcb, 0x65, 0x63, 0x49, - 0x73, 0x0f, 0x8f, 0xeb, 0x00, 0x10, 0xf7, 0xc2, 0x47, 0x36, 0x23, 0x9e, 0x2b, 0xe4, 0x24, 0xae, - 0x52, 0xac, 0xc9, 0x4a, 0xdc, 0x46, 0xe5, 0xb6, 0x7d, 0xf3, 0x36, 0x2a, 0xfa, 0x62, 0xd2, 0x58, - 0x41, 0xc9, 0x5f, 0x81, 0x87, 0x73, 0x53, 0x3a, 0x6e, 0xcf, 0x73, 0x1d, 0xe2, 0xf6, 0xcf, 0x46, - 0x14, 0xf2, 0x20, 0x47, 0x9c, 0xb8, 0x4b, 0x79, 0x23, 0x5c, 0xca, 0x7f, 0x66, 0x01, 0x6c, 0x78, - 0x2e, 0x1d, 0x0f, 0xb1, 0xbf, 0xe2, 0xc0, 0x11, 0xc8, 0x87, 0x95, 0x8d, 0xc4, 0x17, 0x6b, 0xb5, - 0x6d, 0x59, 0x25, 0xd1, 0xed, 0xc9, 0x08, 0x1b, 0x11, 0x1e, 0xbe, 0x00, 0xbb, 0x74, 0xdd, 0xdc, - 0x48, 0x74, 0xa1, 0xf6, 0xf5, 0x36, 0xca, 0x3b, 0x79, 0x1c, 0x67, 0x8c, 0xbb, 0x2c, 0xf0, 0x02, - 0x94, 0x02, 0x6a, 0x27, 0x82, 0x8f, 0xec, 0x2a, 0xd4, 0xbe, 0xd9, 0x5a, 0xae, 0x94, 0xc2, 0x1c, - 0x67, 0x8c, 0x54, 0xbe, 0xd8, 0xb1, 0x57, 0x42, 0x3e, 0x4a, 0x2a, 0x5c, 0xd6, 0x1f, 0x80, 0xbc, - 0x83, 0x18, 0x92, 0x7b, 0xe0, 0xf3, 0xa4, 0xf4, 0x13, 0x42, 0x19, 0x3c, 0x5e, 0x2b, 0xba, 0x72, - 0x3f, 0xf3, 0xd6, 0xea, 0xfd, 0x3a, 0x0b, 0x4a, 0xc9, 0x91, 0x6e, 0xf5, 0x83, 0xe5, 0xf3, 0x72, - 0x53, 0x3e, 0xcf, 0xee, 0x91, 0x4f, 0xb7, 0xfa, 0x11, 0x13, 0x5a, 0xe4, 0xf1, 0x0f, 0x07, 0xf6, - 0x12, 0x2f, 0xf6, 0x91, 0x8f, 0xf2, 0x4f, 0x29, 0x47, 0x79, 0x7f, 0x9b, 0xf2, 0xe5, 0x71, 0x8e, - 0x42, 0x5a, 0x41, 0xef, 0xff, 0xc5, 0xa5, 0x15, 0x2e, 0x1c, 0x83, 0xdf, 0x03, 0xa9, 0x71, 0xd6, - 0x32, 0x3b, 0xa7, 0x9a, 0x61, 0x9d, 0x1f, 0x36, 0x7e, 0xd6, 0xda, 0x56, 0xfb, 0xe5, 0xb9, 0x66, - 0x75, 0x5a, 0xe6, 0xb9, 0xd6, 0xd0, 0x8f, 0x74, 0xad, 0xc9, 0x67, 0xc4, 0xcf, 0xa6, 0x33, 0x69, - 0xaf, 0xe3, 0xd2, 0x11, 0xb6, 0xc9, 0x05, 0xb9, 0xf5, 0x10, 0xaa, 0x40, 0x4c, 0x05, 0x9b, 0x27, - 0x87, 0xe6, 0x31, 0xcf, 0x89, 0xbb, 0xd3, 0x99, 0x54, 0x58, 0x31, 0x16, 0x1e, 0x80, 0x47, 0xa9, - 0x80, 0x30, 0x35, 0x3e, 0x2b, 0x96, 0xa6, 0x33, 0x89, 0xef, 0xde, 0x49, 0x4a, 0xcc, 0xff, 0xf6, - 0x47, 0x39, 0xb3, 0xff, 0x9a, 0x03, 0xc5, 0x75, 0x89, 0xf0, 0x39, 0x78, 0xac, 0xb7, 0x8e, 0x8c, - 0xc3, 0x46, 0x5b, 0x3f, 0x6b, 0xa5, 0xbd, 0xf6, 0xc3, 0xe9, 0x4c, 0xda, 0x5d, 0x82, 0xb4, 0xe1, - 0x88, 0x4d, 0xa0, 0x9a, 0x44, 0x35, 0xcf, 0x3a, 0xf5, 0x13, 0xcd, 0x32, 0xf5, 0x1f, 0x5b, 0x3c, - 0x27, 0x16, 0xa7, 0x33, 0x09, 0x34, 0xbd, 0x71, 0x6f, 0x80, 0x4d, 0xd2, 0x77, 0xe1, 0x3e, 0x10, - 0x92, 0x80, 0x17, 0xad, 0xb6, 0x7e, 0xaa, 0xf1, 0x59, 0xf1, 0xd3, 0xe9, 0x4c, 0xfa, 0xa4, 0xe9, - 0xfd, 0xea, 0x32, 0x32, 0xc4, 0xf1, 0xbb, 0xd6, 0x5b, 0x6f, 0xae, 0xcb, 0xdc, 0xdb, 0xeb, 0x32, - 0xf7, 0xef, 0x75, 0x99, 0xfb, 0xfd, 0xa6, 0x9c, 0x79, 0x7b, 0x53, 0xce, 0xbc, 0xbb, 0x29, 0x67, - 0x7e, 0x79, 0xde, 0x27, 0xec, 0x72, 0xdc, 0x53, 0x6c, 0x6f, 0xa8, 0xce, 0x2f, 0x09, 0xcb, 0x48, - 0x9f, 0x2d, 0x6e, 0x1b, 0xc1, 0x81, 0xfa, 0x2a, 0xba, 0x72, 0x44, 0x1f, 0xff, 0xde, 0x83, 0xe8, - 0xeb, 0x7f, 0xf0, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x69, 0x5d, 0x6d, 0x1f, 0x9a, 0x08, 0x00, - 0x00, + 0x56, 0xdb, 0x8b, 0x35, 0xd8, 0x13, 0x32, 0x0a, 0xd8, 0xc8, 0x33, 0xb8, 0xe5, 0x0d, 0x2a, 0x4e, + 0x7d, 0x01, 0x4e, 0x55, 0x0f, 0xfb, 0x18, 0xbd, 0xed, 0x71, 0xa5, 0x5e, 0xf6, 0xd2, 0xa8, 0x4a, + 0xde, 0xa0, 0x4f, 0x50, 0xd9, 0xfc, 0xc7, 0x06, 0x29, 0x52, 0xa5, 0xf6, 0x84, 0x19, 0xff, 0xbe, + 0x4f, 0xf3, 0xfd, 0x19, 0x79, 0xc0, 0x73, 0xe2, 0x32, 0xec, 0xdb, 0xd7, 0x88, 0xb8, 0x16, 0xc5, + 0xf6, 0xd0, 0x27, 0x6c, 0xa4, 0xda, 0x76, 0xa0, 0x06, 0xe5, 0xf0, 0x47, 0x19, 0xf8, 0x1e, 0xf3, + 0xa0, 0x98, 0x30, 0xa5, 0x84, 0xaf, 0x83, 0xb2, 0xf8, 0xdc, 0xf6, 0x68, 0xdf, 0xa3, 0x2a, 0x65, + 0xe8, 0x86, 0xb8, 0x5d, 0x35, 0x28, 0x77, 0x30, 0x43, 0xe5, 0xf9, 0xff, 0x29, 0x83, 0x98, 0xef, + 0x7a, 0x5d, 0x2f, 0x7a, 0x54, 0xc3, 0xa7, 0xd9, 0xea, 0x53, 0x86, 0x5d, 0x07, 0xfb, 0x7d, 0xe2, + 0x32, 0x15, 0x75, 0x6c, 0xa2, 0xb2, 0xd1, 0x00, 0xd3, 0xe9, 0x4b, 0xf9, 0x3d, 0x0f, 0x3e, 0x69, + 0xa3, 0x1e, 0x71, 0x10, 0xf3, 0x7c, 0x13, 0xb3, 0xda, 0x35, 0x72, 0xbb, 0xf8, 0x12, 0xd9, 0x37, + 0x98, 0xd5, 0x11, 0x43, 0xd0, 0x03, 0x07, 0xc1, 0xfc, 0xbd, 0x35, 0x1c, 0x38, 0x88, 0x61, 0x5a, + 0xe0, 0xa5, 0x74, 0x29, 0x5b, 0x91, 0x94, 0x25, 0xb3, 0x12, 0x32, 0x2b, 0x0b, 0xa6, 0x56, 0x34, + 0x58, 0x95, 0xde, 0xde, 0x3e, 0xe3, 0xfe, 0xbe, 0x7d, 0x56, 0x18, 0xa1, 0x7e, 0xef, 0x2b, 0x39, + 0x46, 0x24, 0x1b, 0x42, 0xb0, 0x0e, 0xa1, 0xb0, 0x04, 0xc2, 0x35, 0x8a, 0xd9, 0x6c, 0xc8, 0x22, + 0x4e, 0x21, 0x25, 0xf1, 0xa5, 0x8c, 0x91, 0x9b, 0xae, 0x4f, 0x07, 0x75, 0x07, 0x7e, 0x0a, 0x00, + 0xed, 0x21, 0x7a, 0x6d, 0x21, 0xfb, 0x86, 0x16, 0xd2, 0x52, 0xba, 0xb4, 0x67, 0xec, 0x45, 0x2b, + 0xc7, 0xf6, 0x0d, 0x95, 0x3d, 0xf0, 0x64, 0x9b, 0x32, 0x0a, 0x0d, 0x90, 0xe9, 0x11, 0xca, 0x66, + 0x4a, 0xbe, 0x54, 0xb6, 0x7b, 0xaf, 0xec, 0xb2, 0xa7, 0x9a, 0x09, 0x15, 0x1a, 0x11, 0x97, 0xfc, + 0x0d, 0xc8, 0xb7, 0xcd, 0xda, 0x39, 0x62, 0x43, 0x1f, 0x3b, 0x2b, 0x16, 0x26, 0x29, 0xe2, 0x93, + 0x14, 0xc9, 0x7f, 0xf0, 0x60, 0xdf, 0x0c, 0x05, 0xac, 0xa0, 0x0d, 0xb0, 0xb7, 0xf0, 0x28, 0x82, + 0x65, 0x2b, 0xe2, 0x76, 0xe3, 0xab, 0x85, 0x99, 0xe5, 0xc2, 0x86, 0xe5, 0xb2, 0xb1, 0xa4, 0x79, + 0x80, 0xc7, 0x55, 0x00, 0x88, 0x7b, 0xe5, 0x23, 0x9b, 0x11, 0xcf, 0x2d, 0xa4, 0x25, 0xbe, 0x94, + 0xab, 0xc8, 0xca, 0xb4, 0x8d, 0xca, 0xbc, 0x7d, 0xb3, 0x36, 0x2a, 0xfa, 0x62, 0xd2, 0x58, 0x41, + 0xc9, 0x9f, 0x81, 0xc7, 0x33, 0x53, 0x5a, 0x6e, 0xc7, 0x73, 0x1d, 0xe2, 0x76, 0x2f, 0x06, 0x14, + 0x0a, 0x20, 0x4d, 0x9c, 0x69, 0x97, 0x32, 0x46, 0xf8, 0x28, 0xff, 0x96, 0x02, 0xb0, 0xe6, 0xb9, + 0x74, 0xd8, 0xc7, 0xfe, 0x8a, 0x03, 0x27, 0x20, 0x13, 0x56, 0x36, 0x12, 0x9f, 0xab, 0x54, 0x76, + 0x65, 0x15, 0x47, 0x37, 0x47, 0x03, 0x6c, 0x44, 0x78, 0xf8, 0x0a, 0xec, 0xd3, 0x75, 0x73, 0x23, + 0xd1, 0xd9, 0xca, 0xe7, 0xbb, 0x28, 0x37, 0xf2, 0x38, 0xe5, 0x8c, 0x4d, 0x16, 0x78, 0x05, 0xf2, + 0x01, 0xb5, 0x63, 0xc1, 0x47, 0x76, 0x65, 0x2b, 0x5f, 0xec, 0x2c, 0x57, 0x42, 0x61, 0x4e, 0x39, + 0x23, 0x91, 0xaf, 0xfa, 0x08, 0x64, 0x1c, 0xc4, 0x90, 0xdc, 0x01, 0x1f, 0xc7, 0x85, 0x9e, 0x11, + 0xca, 0xe0, 0xe9, 0x5a, 0xad, 0x95, 0x87, 0x59, 0xb5, 0x56, 0xe6, 0x37, 0x29, 0x90, 0x8f, 0x8f, + 0xb4, 0xcb, 0xff, 0x5a, 0x1a, 0xaf, 0xb7, 0xa5, 0xf1, 0xe2, 0x01, 0x69, 0xb4, 0xcb, 0xff, 0x87, + 0x3c, 0xfe, 0xe4, 0xc1, 0x41, 0x6c, 0x63, 0xff, 0xf1, 0xc1, 0xfd, 0x2e, 0xe1, 0xe0, 0x1e, 0xee, + 0x52, 0xbe, 0x3c, 0xbc, 0x51, 0x48, 0x2b, 0xe8, 0xc3, 0xdf, 0xf9, 0xa4, 0xc2, 0x85, 0x63, 0xf0, + 0x6b, 0x20, 0xd5, 0x2e, 0x1a, 0x66, 0xeb, 0x5c, 0x33, 0xac, 0xcb, 0xe3, 0xda, 0xf7, 0x5a, 0xd3, + 0x6a, 0xbe, 0xbe, 0xd4, 0xac, 0x56, 0xc3, 0xbc, 0xd4, 0x6a, 0xfa, 0x89, 0xae, 0xd5, 0x05, 0x4e, + 0xfc, 0x68, 0x3c, 0x91, 0x0e, 0x5a, 0x2e, 0x1d, 0x60, 0x9b, 0x5c, 0x91, 0xb9, 0x87, 0x50, 0x05, + 0x62, 0x22, 0xd8, 0x3c, 0x3b, 0x36, 0x4f, 0x05, 0x5e, 0xdc, 0x1f, 0x4f, 0xa4, 0xec, 0x8a, 0xb1, + 0xf0, 0x08, 0x3c, 0x49, 0x04, 0x84, 0xa9, 0x09, 0x29, 0x31, 0x3f, 0x9e, 0x48, 0x42, 0x7b, 0x23, + 0x29, 0x31, 0xf3, 0xf3, 0xaf, 0x45, 0xee, 0xf0, 0x0d, 0x0f, 0x72, 0xeb, 0x12, 0xe1, 0x4b, 0xf0, + 0x54, 0x6f, 0x9c, 0x18, 0xc7, 0xb5, 0xa6, 0x7e, 0xd1, 0x48, 0xda, 0xf6, 0xe3, 0xf1, 0x44, 0xda, + 0x5f, 0x82, 0xb4, 0xfe, 0x80, 0x8d, 0xa0, 0x1a, 0x47, 0xd5, 0x2f, 0x5a, 0xd5, 0x33, 0xcd, 0x32, + 0xf5, 0x6f, 0x1b, 0x02, 0x2f, 0xe6, 0xc6, 0x13, 0x09, 0xd4, 0xbd, 0x61, 0xa7, 0x87, 0x4d, 0xd2, + 0x75, 0xe1, 0x21, 0x28, 0xc4, 0x01, 0xaf, 0x1a, 0x4d, 0xfd, 0x5c, 0x13, 0x52, 0xe2, 0x87, 0xe3, + 0x89, 0xf4, 0x41, 0xdd, 0xfb, 0xd1, 0x65, 0xa4, 0x8f, 0xa7, 0x7b, 0xad, 0x36, 0xde, 0xde, 0x15, + 0xf9, 0x77, 0x77, 0x45, 0xfe, 0xaf, 0xbb, 0x22, 0xff, 0xcb, 0x7d, 0x91, 0x7b, 0x77, 0x5f, 0xe4, + 0xde, 0xdf, 0x17, 0xb9, 0x1f, 0x5e, 0x76, 0x09, 0xbb, 0x1e, 0x76, 0x14, 0xdb, 0xeb, 0xab, 0xb3, + 0x2b, 0xc1, 0x32, 0xd2, 0x17, 0x8b, 0xbb, 0x45, 0x70, 0xa4, 0xfe, 0x14, 0x5d, 0x30, 0xa2, 0x4f, + 0x7d, 0xe7, 0x51, 0xf4, 0xad, 0x3f, 0xfa, 0x27, 0x00, 0x00, 0xff, 0xff, 0x8f, 0xbf, 0xfc, 0xd2, + 0x88, 0x08, 0x00, 0x00, } func (m *ValidatorSetChangePacketData) Marshal() (dAtA []byte, err error) { @@ -964,11 +955,6 @@ func (m *ConsumerPacketData) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.Idx != 0 { - i = encodeVarintCcv(dAtA, i, uint64(m.Idx)) - i-- - dAtA[i] = 0x20 - } if m.Data != nil { { size := m.Data.Size() @@ -1294,9 +1280,6 @@ func (m *ConsumerPacketData) Size() (n int) { if m.Data != nil { n += m.Data.Size() } - if m.Idx != 0 { - n += 1 + sovCcv(uint64(m.Idx)) - } return n } @@ -2054,25 +2037,6 @@ func (m *ConsumerPacketData) Unmarshal(dAtA []byte) error { } m.Data = &ConsumerPacketData_VscMaturedPacketData{v} iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Idx", wireType) - } - m.Idx = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCcv - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Idx |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } default: iNdEx = preIndex skippy, err := skipCcv(dAtA[iNdEx:]) From 1b44d27f8e9220162839f1bdb166ee93106d5a8c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jul 2023 13:10:17 -0700 Subject: [PATCH 091/108] build(deps): bump bufbuild/buf-setup-action from 1.24.0 to 1.25.0 (#1157) Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.24.0 to 1.25.0. - [Release notes](https://github.com/bufbuild/buf-setup-action/releases) - [Commits](https://github.com/bufbuild/buf-setup-action/compare/v1.24.0...v1.25.0) --- updated-dependencies: - dependency-name: bufbuild/buf-setup-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Marius Poke --- .github/workflows/proto-registry.yml | 2 +- .github/workflows/proto.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/proto-registry.yml b/.github/workflows/proto-registry.yml index d79db5af70..9764edd806 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@v3 - - uses: bufbuild/buf-setup-action@v1.24.0 + - uses: bufbuild/buf-setup-action@v1.25.0 - uses: bufbuild/buf-push-action@v1 with: input: "proto" diff --git a/.github/workflows/proto.yml b/.github/workflows/proto.yml index 9791a871c0..8f80957d92 100644 --- a/.github/workflows/proto.yml +++ b/.github/workflows/proto.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: bufbuild/buf-setup-action@v1.24.0 + - uses: bufbuild/buf-setup-action@v1.25.0 - uses: bufbuild/buf-breaking-action@v1 with: input: "proto" From b03f6f0ce07e4d9293e19e83b8f5dd54194e7da4 Mon Sep 17 00:00:00 2001 From: MSalopek Date: Tue, 18 Jul 2023 23:11:37 +0200 Subject: [PATCH 092/108] docs: add changeover procedure (#1123) * docs: add changeover procedure part-1 * docs: add changeover procedure part-2 - onboarding checklist * docs: update terminoloy; add validator instructions stubs * docs: update validator docs * docs: update changeover docs and validator guide * deps: update docusaurus deps * docs: update changeover docs and validator guide * docs: update changeover docs and validator guide --- .../changeover-procedure.md | 236 +++ .../consumer-chain-upgrade-procedure.md | 5 - docs/docs/consumer-development/offboarding.md | 2 +- docs/docs/consumer-development/onboarding.md | 2 +- docs/docs/frequently-asked-questions.md | 2 +- docs/docs/introduction/terminology.md | 15 + docs/docs/validators/changeover-procedure.md | 88 ++ docs/docs/validators/joining-neutron.md | 15 + docs/docs/validators/joining-stride.md | 20 + docs/docs/validators/joining-testnet.md | 6 - docs/docs/validators/withdraw_rewards.md | 4 + .../ics_changeover_timeline_stride.png | Bin 0 -> 395340 bytes docs/package-lock.json | 1357 +++++++++-------- docs/package.json | 10 +- 14 files changed, 1086 insertions(+), 676 deletions(-) create mode 100644 docs/docs/consumer-development/changeover-procedure.md delete mode 100644 docs/docs/consumer-development/consumer-chain-upgrade-procedure.md create mode 100644 docs/docs/validators/changeover-procedure.md create mode 100644 docs/docs/validators/joining-neutron.md create mode 100644 docs/docs/validators/joining-stride.md create mode 100644 docs/figures/ics_changeover_timeline_stride.png diff --git a/docs/docs/consumer-development/changeover-procedure.md b/docs/docs/consumer-development/changeover-procedure.md new file mode 100644 index 0000000000..825a0bdae4 --- /dev/null +++ b/docs/docs/consumer-development/changeover-procedure.md @@ -0,0 +1,236 @@ +--- +sidebar_position: 5 +--- + +# Changeover Procedure + +Chains that were not initially launched as consumers of replicated security can still participate in the protocol and leverage the economic security of the provider chain. The process where a standalone chain transitions to being a replicated consumer chain is called the **changeover procedure** and is part of the interchain security protocol. After the changeover, the new consumer chain will retain all existing state, including the IBC clients, connections and channels already established by the chain. + +The relevant protocol specifications are available below: +* [ICS-28 with existing chains](https://github.com/cosmos/ibc/blob/main/spec/app/ics-028-cross-chain-validation/overview_and_basic_concepts.md#channel-initialization-existing-chains). +* [ADR in ICS repo](../adrs/adr-010-standalone-changeover.md) + +## Overview + +Standalone to consumer changeover procedure can rougly be separated into 4 parts: + +### 1. ConsumerAddition proposal submitted to the `provider` chain +The proposal is equivalent to the "normal" ConsumerAddition proposal submitted by new consumer chains. + +However, here are the most important notes and differences between a new consumer chain and a standalone chain performing a changeover: + +* `chain_id` must be equal to the standalone chain id +* `initial_height` field has additional rules to abide by: + +:::caution +``` +{ +... + "initial_height" : { + // must correspond to current revision number of standalone chain + // e.g. stride-1 => "revision_number": 1 + "revision_number": 1, + + // must correspond to a height that is at least 1 block after the upgrade + // that will add the `consumer` module to the standalone chain + // e.g. "upgrade_height": 100 => "revision_height": 101 + "revision_height": 1, + }, +... +} +``` +RevisionNumber: 0, RevisionHeight: 111 +::: + +* `genesis_hash` can be safely ignored because the chain is already running. A hash of the standalone chain's initial genesis may be used + +* `binary_hash` may not be available ahead of time. All chains performing the changeover go through rigorous testing - if bugs are caught and fixed the hash listed in the proposal may not be the most recent one. + +* `spawn_time` listed in the proposal MUST be before the `upgrade_height` listed in the the upgrade proposal on the standalone chain. +:::caution +`spawn_time` must occur before the `upgrade_height` on the standalone chain is reached becasue the `provider` chain must generate the `ConsumerGenesis` that contains the **validator set** that will be used after the changeover. +::: + +* `unbonding_period` must correspond to the value used on the standalone chain. Otherwise, the clients used for the ccv protocol may be incorrectly initialized. + +* `distribution_transmission_channel` **should be set**. + +:::note +Populating `distribution_transmission_channel` will enable the standalone chain to re-use one of the existing channels to the provider for consumer chain rewards distribution. This will preserve the `ibc denom` that may already be in use. + +If the parameter is not set, a new channel will be created. +::: + +* `ccv_timeout_period` has no important notes + +* `transfer_timeout_period` has no important notes + +* `consumer_redistribution_fraction` has no important notes + +* `blocks_per_distribution_transmission` has no important notes + +* `historical_entries` has no important notes + + +### 2. upgrade proposal on standalone chain + +The standalone chain creates an upgrade proposal to include the `interchain-security/x/ccv/consumer` module. + +:::caution +The upgrade height in the proposal should correspond to a height that is after the `spawn_time` in the consumer addition proposal submitted to the `provider` chain. +::: + +Otherwise, the upgrade is indistinguishable from a regular on-chain upgrade proposal. + +### 3. spawn time is reached + +When the `spawn_time` is reached on the `provider` it will generate a `ConsumerGenesis` that contains the validator set that will supercede the `standalone` validator set. + +This `ConsumerGenesis` must be available on the standalone chain during the on-chain upgrade. + +### 4. standalone chain upgrade + +Performing the on-chain upgrade on the standalone chain will add the `ccv/consumer` module and allow the chain to become a `consumer` of replicated security. + +:::caution +The `ConsumerGenesis` must be exported to a file and placed in the correct folder on the standalone chain before the upgade. + +The file must be placed at the exact specified location, otherwise the upgrade will not be executed correctly. + +Usually the file is placed in `$NODE_HOME/config`, but the file name and the exact directory is dictated by the upgrade code on the `standalone` chain. +* please check exact instructions provided by the `standalone` chain team +::: + +After the `genesis.json` file has been made available, the process is equivalent to a normal on-chain upgrade. The standalone validator set will sign the next couple of blocks before transferring control to `provider` validator set. + +The standalone validator set can still be slashed for any infractions if evidence is submitted within the `unboding_period`. + +#### Notes + +The changeover procedure may be updated in the future to create a seamless way of providing the validator set information to the standalone chain. + +## Onboarding Checklist + +This onboarding checklist is slightly different from the one under [Onboarding](./onboarding.md) + +Additionally, you can check the [testnet repo](https://github.com/cosmos/testnets/blob/master/replicated-security/CONSUMER_LAUNCH_GUIDE.md) for a comprehensive guide on preparing and launching consumer chains. + +## 1. Complete testing & integration + +- [ ] test integration with gaia +- [ ] test your protocol with supported relayer versions (minimum hermes 1.4.1) +- [ ] test the changeover procedure +- [ ] reach out to the ICS team if you are facing issues + +## 2. Create an Onboarding Repository + +To help validators and other node runners onboard onto your chain, please prepare a repository with information on how to run your chain. + +This should include (at minimum): + +- [ ] genesis.json with CCV data (after spawn time passes) +- [ ] information about relevant seed/peer nodes you are running +- [ ] relayer information (compatible versions) +- [ ] copy of your governance proposal (as JSON) +- [ ] a script showing how to start your chain and connect to peers (optional) +- [ ] take feedback from other developers, validators and community regarding your onboarding repo and make improvements where applicable + +Example of such a repository can be found [here](https://github.com/hyphacoop/ics-testnets/tree/main/game-of-chains-2022/sputnik). + +## 3. Submit a ConsumerChainAddition Governance Proposal to the provider + +Before you submit a `ConsumerChainAddition` proposal, please provide a `spawn_time` that is **before** the the `upgrade_height` of the upgrade that will introduce the `ccv module` to your chain. +:::danger +If the `spawn_time` happens after your `upgrade_height` the provider will not be able to communicate the new validator set to be used after the changeover. +::: + +Additionally, reach out to the community via the [forum](https://forum.cosmos.network/) to formalize your intention to become an ICS consumer, gather community support and accept feedback from the community, validators and developers. + +- [ ] determine your chain's spawn time +- [ ] determine consumer chain parameters to be put in the proposal +- [ ] take note to include a link to your onboarding repository + +Example of a consumer chain addition proposal. + +```js +// ConsumerAdditionProposal is a governance proposal on the provider chain to spawn a new consumer chain or add a standalone chain. +// If it passes, then all validators on the provider chain are expected to validate the consumer chain at spawn time. +// It is recommended that spawn time occurs after the proposal end time and that it is scheduled to happen before the standalone chain upgrade +// that sill introduce the ccv module. +{ + // Title of the proposal + "title": "Changeover Standalone chain", + // Description of the proposal + // format the text as a .md file and include the file in your onboarding repository + "description": ".md description of your chain and all other relevant information", + // Proposed chain-id of the new consumer chain. + // Must be unique from all other consumer chain ids of the executing provider chain. + "chain_id": "standalone-1", + // Initial height of new consumer chain. + // For a completely new chain, this will be {0,1}. + "initial_height" : { + // must correspond to current revision number of standalone chain + // e.g. standalone-1 => "revision_number": 1 + "revision_number": 1, + + // must correspond to a height that is at least 1 block after the upgrade + // that will add the `consumer` module to the standalone chain + // e.g. "upgrade_height": 100 => "revision_height": 101 + "revision_number": 1, + }, + // Hash of the consumer chain genesis state without the consumer CCV module genesis params. + // => not relevant for changeover procedure + "genesis_hash": "d86d756e10118e66e6805e9cc476949da2e750098fcc7634fd0cc77f57a0b2b0", + // Hash of the consumer chain binary that should be run by validators on standalone chain upgrade + // => not relevant for changeover procedure as it may become stale + "binary_hash": "376cdbd3a222a3d5c730c9637454cd4dd925e2f9e2e0d0f3702fc922928583f1", + // Time on the provider chain at which the consumer chain genesis is finalized and all validators + // will be responsible for starting their consumer chain validator node. + "spawn_time": "2023-02-28T20:40:00.000000Z", + // Unbonding period for the consumer chain. + // It should should be smaller than that of the provider. + "unbonding_period": 86400000000000, + // Timeout period for CCV related IBC packets. + // Packets are considered timed-out after this interval elapses. + "ccv_timeout_period": 259200000000000, + // IBC transfer packets will timeout after this interval elapses. + "transfer_timeout_period": 1800000000000, + // 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%. + // The reward amount distributed to the provider is calculated as: 1 - consumer_redistribution_fraction. + "consumer_redistribution_fraction": "0.75", + // BlocksPerDistributionTransmission is the number of blocks between IBC token transfers from the consumer chain to the provider chain. + // eg. send rewards to the provider every 1000 blocks + "blocks_per_distribution_transmission": 1000, + // 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. + "historical_entries": 10000, + // The ID of a token transfer channel used for the Reward Distribution + // sub-protocol. If DistributionTransmissionChannel == "", a new transfer + // channel is created on top of the same connection as the CCV channel. + // Note that transfer_channel_id is the ID of the channel end on the consumer chain. + // it is most relevant for chains performing a standalone to consumer changeover + // in order to maintan the existing ibc transfer channel + "distribution_transmission_channel": "channel-123" // NOTE: use existing transfer channel if available +} +``` + +## 3. Submit an Upgrade Proposal & Prepare for Changeover + +This proposal should add the ccv `consumer` module to your chain. + +- [ ] proposal `upgrade_height` must happen after `spawn_time` in the `ConsumerAdditionProposal` +- [ ] advise validators about the exact procedure for your chain and point them to your onboarding repository + + +## 4. Upgrade time 🚀 + +- [ ] after `spawn_time`, request `ConsumerGenesis` from the `provider` and place it in `/.sovereign/config/genesis.json` +- [ ] upgrade the binary to the one listed in your `UpgradeProposal` + +The chain starts after at least 66.67% of standalone voting power comes online. The consumer chain is considered interchain secured once the "old" validator set signs a couple of blocks and transfers control to the `provider` validator set. + +- [ ] provide a repo with onboarding instructions for validators (it should already be listed in the proposal) +- [ ] genesis.json after `spawn_time` obtained from `provider` (MUST contain the initial validator set) +- [ ] maintenance & emergency contact info (relevant discord, telegram, slack or other communication channels) diff --git a/docs/docs/consumer-development/consumer-chain-upgrade-procedure.md b/docs/docs/consumer-development/consumer-chain-upgrade-procedure.md deleted file mode 100644 index 4af18552a3..0000000000 --- a/docs/docs/consumer-development/consumer-chain-upgrade-procedure.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -sidebar_position: 3 ---- - -# Upgrading Consumer Chains \ No newline at end of file diff --git a/docs/docs/consumer-development/offboarding.md b/docs/docs/consumer-development/offboarding.md index bbd4cbf35e..7f2ebb0f5e 100644 --- a/docs/docs/consumer-development/offboarding.md +++ b/docs/docs/consumer-development/offboarding.md @@ -1,5 +1,5 @@ --- -sidebar_position: 5 +sidebar_position: 4 title: Offboarding Checklist --- # Consumer Offboarding diff --git a/docs/docs/consumer-development/onboarding.md b/docs/docs/consumer-development/onboarding.md index dc870b76de..c9b503ed66 100644 --- a/docs/docs/consumer-development/onboarding.md +++ b/docs/docs/consumer-development/onboarding.md @@ -1,5 +1,5 @@ --- -sidebar_position: 4 +sidebar_position: 3 title: Onboarding Checklist --- # Consumer Onboarding Checklist diff --git a/docs/docs/frequently-asked-questions.md b/docs/docs/frequently-asked-questions.md index 6cbf364a36..e431ef3f01 100644 --- a/docs/docs/frequently-asked-questions.md +++ b/docs/docs/frequently-asked-questions.md @@ -8,7 +8,7 @@ slug: /faq VSR simply means that the same validator set is used to secure both the provider and consumer chains. VSR is ensured through ICS protocol which keeps consumers up to date with the validator set of the provider. -## What even is a consumer chain? +## What is a consumer chain? Consumer chain is blockchain operated by the same validator operators as the provider chain. The ICS protocol ensures the validator set replication properties (informs consumer chain about the current state of the validator set on the provider) diff --git a/docs/docs/introduction/terminology.md b/docs/docs/introduction/terminology.md index 59994353cf..fd06174f92 100644 --- a/docs/docs/introduction/terminology.md +++ b/docs/docs/introduction/terminology.md @@ -21,3 +21,18 @@ A particular protocol/implementation of Interchain Security that fully replicate ## Mesh security A protocol built on IBC that allows delegators on a cosmos chain to re-delegate their stake to validators in another chain's own validator set, using the original chain's token (which remains bonded on the original chain). For a deeper exploration of mesh security, see [Replicated vs. Mesh Security on the Informal Blog](https://informal.systems/blog/replicated-vs-mesh-security). + +## Consumer Chain + +Chain that is secured by the validator set of the provider, instead of its own. +Replicated security allows the provider chain validator set to validate blocks on the consumer chain. + +## Standalone Chain + +Chain that is secured by its own validator set. This chain does not participate in replicated security. + +Standalone chains may sometimes be called "sovereign" - the terms are synonymous. + +## Changeover Procedure + +Chains that were not initially launched as consumers of replicated security can still participate in the protocol and leverage the economic security of the provider chain. The process where a standalone chain transitions to being a replicated consumer chain is called the **changeover procedure** and is part of the interchain security protocol. After the changeover, the new consumer chain will retain all existing state, including the IBC clients, connections and channels already established by the chain. diff --git a/docs/docs/validators/changeover-procedure.md b/docs/docs/validators/changeover-procedure.md new file mode 100644 index 0000000000..4149d9b412 --- /dev/null +++ b/docs/docs/validators/changeover-procedure.md @@ -0,0 +1,88 @@ +--- +sidebar_position: 4 +--- + +# Validator instructions for Changeover Procedure + +More details available in [Changeover Procedure documentation](../consumer-development/changeover-procedure.md). + +A major difference betwen launching a new consumer chain vs. onboarding a standalone chain to ICS is that there is no consumer genesis available for the standalone chain. Since a standalone chain already exists, its state must be preserved once it transitions to being a consumer chain. + +## Timeline + +Upgrading standalone chains can be best visualised using a timeline, such as the one available [Excalidraw graphic by Stride](https://app.excalidraw.com/l/9UFOCMAZLAI/5EVLj0WJcwt). + +There is some flexibility with regards to how the changeover procedure is executed, so please make sure to follow the guides provided by the team doing the changeover. + +![Standalone to consumer transition timeline](../../figures/ics_changeover_timeline_stride.png?raw=true) + +### 1. `ConsumerAdditionProposal` on provider chain + +This step will add the standalone chain to the list of consumer chains secured by the provider. +This step dictates the `spawn_time`. After `spawn_time` the CCV state (initial validator set of the provider) will be available to the consumer. + +To obtain it from the provider use: +```bash +gaiad q provider consumer-genesis stride-1 -o json > ccv-state.json +jq -s '.[0].app_state.ccvconsumer = .[1] | .[0]' genesis.json ccv-state.json > ccv.json +``` + +### 2. `SoftwareUpgradeProposal` on the standalone/consumer chain + +This upgrade proposal will introduce ICS to the standalone chain, making it a consumer. + +### 3. Assigning a consumer key + +After `spawn_time`, make sure to assign a consumer key if you intend to use one. + +Instructions are available [here](../features/key-assignment.md) + +### 4. Perform the software ugprade on standalone chain + +Please use instructions provided by the standalone chain team and make sure to reach out if you are facing issues. +The upgrade preparation depends on your setup, so please make sure you prepare ahead of time. + +:::danger +The `ccv.json` from step 1. must be made available on the machine running the standalone/consumer chain at standalone chain `upgrade_height`. This file contains the initial validator set and parameters required for normal ICS operation. + +Usually, the file is placed in `$NODE_HOME/config` but this is not a strict requirement. The exact details are available in the upgrade code of the standalone/consumer chain. +::: + +**Performing this upgrade will transition the standalone chain to be a consumer chain.** + +After 3 blocks, the standalone chain will stop using the "old" validator set and begin using the `provider` validator set. + +## FAQ + +### Can I reuse the same validator key for the `consumer` chain that I am already using on the `standalone` chain? Will I need to perform a `AssignConsumerKey` tx with this key before spawn time? + +Validators must either assign a key or use the same key as on the `provider`. + +If you are validating both the `standalone` and the `provider`, you **can** use your current `standalone` key with some caveats: +* you must submit an `AssignConsumerKey` tx with your current `standalone` validator key +* it is best to submit `AssignConsumerKey` tx before `spawn_time` +* if you do not submit the Tx, it is assumed that you will be re-using your `provider` key to validate the `standalone/consumer` chain + +### Can I continue using the same node that was validating the `standalone` chain? + +Yes. + +Please assign your consensus key as stated aboce. + +### Can I set up a new node to validate the `standalone/consumer` chain after it transitions to replicated security? + +Yes. + +If you are planning to do this please make sure that the node is synced with `standalone` network and to submit `AssignConsumerKey` tx before `spawn_time`. + + +### What happens to the `standalone` validator set after it after it transitions to replicated security? + +The `standalone` chain validators will stop being validators after the first 3 blocks are created while using replicated security. The `standalone` validators will become **governors** and still can receive delegations if the `consumer` chain is using the `consumer-democracy` module. + +**Governors DO NOT VALIDATE BLOCKS**. + +Instead, they can participate in the governance process and take on other chain-specific roles. + +## Credits +Thank you Stride team for providing detailed instructions about the changeover procedure. diff --git a/docs/docs/validators/joining-neutron.md b/docs/docs/validators/joining-neutron.md new file mode 100644 index 0000000000..a9adbb25f9 --- /dev/null +++ b/docs/docs/validators/joining-neutron.md @@ -0,0 +1,15 @@ +--- +sidebar_position: 5 +--- + +# Joining Neutron + +Neutron is the first consumer chain to implement ICS. + +You can find instructions on joining the mainnet [here](https://docs.neutron.org/neutron/consumer-chain-launch). + + +To join Neutron chain on the replicated security testnet check [here](https://github.com/cosmos/testnets/tree/master/replicated-security/pion-1) + +## Resources +* [Neutron docs](https://docs.neutron.org) diff --git a/docs/docs/validators/joining-stride.md b/docs/docs/validators/joining-stride.md new file mode 100644 index 0000000000..96e32d8fa2 --- /dev/null +++ b/docs/docs/validators/joining-stride.md @@ -0,0 +1,20 @@ +--- +sidebar_position: 6 +--- +# Joining Stride + +Stride is the first consumer chain to perform the standalone to consumer changeover procedure and transition from a standalone validator set to using `cosmoshub-4` validator set. + +`stride-1` network (mainnet) will perform a software upgrade and at height `4616678` that will transition the network to using the Cosmos Hub's (`cosmoshub-4`) validator set. + + You can find instructions about the Stride consumer chain launch and joining the mainnet [here](https://github.com/Stride-Labs/mainnet/tree/main/ics-instructions). + + This [Excalidraw graphic](https://app.excalidraw.com/l/9UFOCMAZLAI/5EVLj0WJcwt) explains the timeline of Stride's changeover procedure. + +## Note +Stride re-uses an existing `transfer` channel to send consumer rewards to the provider chain, in order to preserve existing transfer IBC denom between `stride-1` and `cosmoshub-4`. + +## Resources +* [Stride docs](https://docs.stride.zone/docs) +* [Changeover procedure timeline](https://app.excalidraw.com/l/9UFOCMAZLAI/5EVLj0WJcwt) +* [Changeover upgrade docs](https://github.com/Stride-Labs/mainnet/tree/main/ics-instructions) diff --git a/docs/docs/validators/joining-testnet.md b/docs/docs/validators/joining-testnet.md index 5ae9007416..dcf654786d 100644 --- a/docs/docs/validators/joining-testnet.md +++ b/docs/docs/validators/joining-testnet.md @@ -178,9 +178,3 @@ gaiad tx provider assign-consensus-key consumer-1 '' --from Lfo_lmY+ zVwK^lm3Zf?P>%(^Y}YxVe3F8~Y8M5?o%<9N(|GGnHwDGby%ZEbE>ch&@};1lyAhC~ zB#LjW)RvQ$q*x&Td!8NXiFYW?WlkQa?4qQlT1y$fW8yR3T4HRfaC%93$gOAiO%yVc zM^0PT^)*@t_~^__3{9Lqbh4OH_R?iqrYBy4j``ZF*(2F6C$H~Fx*E@&*<7M8bkwxY z)Zv=YrrHEn&M_*^OVTgSgjOCAS+6Vq=;hR0YsH+eyWjdBD#0~fBeA_11HCx|6E{E2 zy(|jV*YrGd;lc$*T*5D}$1A=0HGX-QydkkIpLfYWeCGtyC7*wIn;r+vPt1_4W!~5F}?`tgmhxZ=~{+C|91WmXf@9#HsXTyIC z#q8zFx*31m?9u;I6%;$ZwYq5JD*e|y^CTztC-eW{;cpih|KQ*fy668S zi+?TVNv;1e>;J-u{%ihz|HFUVI{p9P@+D{!^~&80VzUKTQZoniC{M2D+_T3;%{cpj zQCjQ6-JG1o<_Gbyv&(;B8+U^5yg2r#klja}RzR=pqdDjGWA36qPq;81;F=!qXL8=c zQ(}H_R?>wq#!YNeE)FK`g}NDA@$2lC{vs&7UH>X9Y$vl-_lvao>E8BscZsH! ztchlO38S2;PRpqdpHSj#u$uic{qdopN6^|S_LVo|3@Wf@@Gnyv@58X^0 znCkR5)*kJyP*PXVI$pkqm$#|S8hg8D7{KJ;2k_3euM!JWMr7`2C^QCtWbu(-%PO-DI%Vb7HT}>SD+pn*z zZaem^0>j8Mn?=JWRZwm}KQcL0ZqFPl?OrxIPCk3(tIK~%N`GC#b8RX*UimtVQ(a5e znb)f9{d42>d|z}E*LkmFS5Lcf>5W<{?^9k4M!BbZ9Qkr*`Cq9WO;H(6V5 z_tbQ7q+EhUBg4FSbW6<=@25|9^{=4XBB`&hZ-e2Aw;XOemva5Qq~zBa4Ur$;Uej6k zC!dv+ysWExT(ZD-pHACA=AawiHy$66a%J>Rip`n+@!``a*UnG=deii{%oA+Ch>&sj z4*iGpvPgRTtlQ;L-vQgEV-`-qE<`SRjOAM2+ogTef6W6-3D|fuk;E9iq z&rfFC+2JCS4?7-R9~Y>myb@C#F6ZMbY@+=&T21In5k~d!vtQTbw$m0C<5xb-O!vlm zju#&NF*$rL@ybcjpC8ziPMz9N`jp4nU3_}?7Cz0{dsVx6cwFDSc@uRZ`5J%9#k{41 zAEfqZW(ntD8m@kgQi_nPy%J=cNr>DQ#)ZzT^W)T!iP-aryI5H*>hvQo_l4s3 z9l7L_+GJ(Wm%A`;(ri0%TuDi3)8@_Z>y2}_Z98QCVRRUS`FPhaQt3rXD8|o{UY~iL zl6PD89j}?08HQ1R$bMnMexG^w=TAYw{{Bq4lkfRLWIT6OL@9+{ZOXcR`qgPpR@Q4@ zqn>bL?j1o z=2k7}t4(Y#<;!*H>+6d;8>_khdd*(;%Re7kwLYM0du9+*+c!m4Sc+l2@b|~ZLX<+K zDw6cS)L0K@v$2k4Ur4xIO#LbptHq>N*XR9lI*m< zx_`4_eTr*Uv|3TQ-FTwcZFh-z%St;8q#%RE`E%#!#jHjh90rf_DGImV_oDbP*7?zI zBPnQ#5_9{>wv=YEHQ#DdK*O{yVw>=di=(~Ou??0M78dHJ#q1T?))P^h*;bO0E=)qa zQtrKdLP@vctVxyYqv}{Z~ySxJfx1}~(sO>kX+B4pGtNBAo$*UWhwG-ERD#O)A zlV7SvU)XQlWRuv%rN!nXp2)?Hp9m&n@;U*%DCC9 zU6-UUgKav|++ro?!|Up!Wp{83&xK8|&&IlGSk$twe%N4~J13YK0oHkE_5iF)ccznxK=J5W=Z{nR@+n8i3}>dKz;2|KyY z#%z_CsV!&a;NWl*8Az+SS*^jH)pa&^`pn0Gg91Il=9MxPS+_^%CG2c|jv0N4I9U=T z6n5p)Ga2jmPMg(icS&rSnwm1HH%xv1^`(kR;iL827-?vZJzVQJ-e1qr{{H=Y8Eb4C zfAs~d9@#o9@AxkYBH`*<8Rq(HQK)V=S?LtIVDFIIiAnE#X4)%0UZb;lrG}Iw*~Qrt zO-y`QLr2$c72eAzc%9xy(@Nho8=cJL$IHm4na1B!LRFdOa9@2!_Dly+s@T&-zsXxc

PhlGT5H|N@uVmSO&Me#W4(BE!+IVr^cn^kl3yFt5&%Ql5%sA0pxbagIQR#TcuyJb(fPss`!DM@v^ zsScBt-zcTRWxYdgk90o4Vy2- zoz=Xp``}WDgy6DUK%+`$S+IlzerD5y2M?HR>=x$dLearZ#%uLBbXaVLj*Jd8T6@m;i`+5_ zu=!bRGB;Ko>Eg5Q(H;ZrUd|&vu1rF1xeIfH#d?Ni0S7nR2?|B@Stpxzl$cf*xou-= zFLaeFvpN>+IcSYK;1O4@7j%0UhI;cx4h8wUylgo$Yc;XEhkv||-4*QWG%jj2+U<+a z`uge&cU`J63$TdOt23|XpWDJYi_`sw$$UkMq0hSbJ?KMZc&oMS1MlY_m)vSmbE%^W z(95xTVSZvCO1-Oi?_|5X`^;dj1lc0%%FZWTmU+yXxqK?VhKr{fo%wQnDmk0<-kNx=OX<=ewQaO*C zZ!6)Bbt(4b;LyR+?p(P{*ggu~y^zgalop8MnhlCw{LDb6bhg!)HjvveE>#+ZnN(x6 zdAhUeCdd1dz9^{8eROc(REhAS$`Duk9cnV^11<~# zyL4^(YU1}@`RGe-Tgbp3AmaMAUlG|dE-W9w5AGg`(a*>B*-Q>$6%MQ%oU*&vR^rXw z?!+B)Vs(Z{SAba?hS~YyIwmPhMcWf;W=HH6f>lUi9v-hZmPWmQ&`ZrMnwCH8Z4R9#mJUJ)w1=F`BioEisNcG z?PzG`W+oI@iw1y`tn4Cmq9Vt3CfcquLANvntxrZmL_{PA_26o4g07?_SpuxAtFvry zfgb5Me|&Xx=FQm6Y}xXggM%gdCAUqN`21u$J(_yuU}NU3pEu8^8flP<$NAe6+nI4! zD!#0}Jwn&M?nd=&2CzmC3QbDdpOBCcf|dG^nkDFC@8=iCN^HsRUcc>7L9E@_YkGkz z^74NC?DKPj_8f!rM<}v%3CIXE~3&-LjQ2c(;I6{5`tzge&aXD}_%Y_b{o zls4JsEF^4S875PF8;G`RaYL%AR$b|bvvh|gLOFu!FIw`)A4)RO4_PH7Bzow!Y%$v3 z&CjYGn>{Yu(`;5QhT>^IQ{UVcYd>d@WLPf<#2#Ct9~s!zpW3VtLx-mMc*ilpw0SR1 zl@iy+8}HT;2qcUx+wRB_bmF{$?e>AJc4rdYKw+P}q`0 ztFa$vTA8^4g|>-UxL{wtU(FHl*wk$^1Dc`ioeq|T$)YIbaM_Z8gu!o}K%5sUH9@^L z(a}k#8Z~mQ&2X9I^-TyVKOfnHWB?wl(k;Q)2B>jTop`I|ZMJsb>f0nkp3N<;P$4E;S z$nj-w0;zH+msqd~wGKkVUCS&g+@p1?@g|x6=tDEnwY}gyD*5YKY)30Tl$Oe!@14XMT1{32~pX-fDN-@mdb7n9#H|;Wca4gn%mI z_iRnR_O0%f-f>AAj6Pv=Uhy2kHvFXWtZOm@CX5{QKVYy0aFnbIf z4jukE_NlCl^m?}R6fD>@Q~;H#((-b}gVlo~gIOaU%e!=xNQ%q<#L$ zx7TMQ?;E6C`^M!aF+XWKQj&9)DG_}(NL>6$uYYGHwEDi>5tA)~C}!nB?U{}6-f7}AiiE}ieK zKeU@n0-dJir3*lmtmw^8lb`~qGzB`1_I!zK=z1gT&1HfbbG+b|)|aked+~HZQa*s< zD+lo}+3g*#V{@L}KO`jy#B3Q_K8RK$yP*?8jQvnh=|FtQ#TsBQzRvRC;L(NANQpCP zWeOtwUX=@WlO5pgZN55gj_;@?M9;?p`a&@By0y^yh{cVNW&j`M`M%q|(W#5etkMo^ zMKHr11@Pc)3GOqmylh-qbEsAa3K?sD@9N^vp;NzcWEKU0i_V;ZhQJUnyV}PWu>dNi ze+g0b-6<2BXz-eMpkX5|hP2ymEPsO56bQpUsQZq-^x*)u(5r^&Wh>V@K!`Xq*_U^Z zvIqi(N?{e{&Zh@V+6qjUcpbR*^+ZoBWTdA&YN`WG_H(^joR?6#3H_);K?ftf+G=&H z>9$^iDi#o--RxgSh}3cUZEI)Evur!S9GP6*(x;r&XJgbE(BlKW`0?ZWAXR-gnEWKvd^)WP@(&|6t?cw7&9y_JN}1l8nu^-Lv!9gl z-q>7b0&&xCg@6~5Vd<_*Hh9oG`{Qh`Y#ph;=rMc%c{GGq^4p;~M}Bm6ARMSN2f#=h zWXS{&Ix_1W4b91C`yH|Q1y-)#>PuUAPB6>7qr}@kxhvs_E4BFKMcTa@9gck%f%jEV{T&OHKsdKu+Qx)gCM$`eyz&WF^#gVI#BL| zgV~1i+hiTu&Y0z z)p!}@dKdI_^4|ngxDk*wkTWyz-D+mMUk7u@X%J{q$Us0V#~feIWQe*eCdLGV$MM2B zJUo1H#6F$}6nN13glH2?###GThjDXp$)?}3t)r*=Y0?v0Axd687`6!k}2C z59Yj+>y0wm`vJcqmQQWT3?b z^MQtg=}oA%-5AmI8S=AXjTkqgIGOiUvhPw1+B%rKU`J$f@!6qwgtfPUeeg`&=AH55 z z<2uIuCm8%OkYv9TI)&{|NeW|pv)#=5=+vfX31vi#@G9Sf^3n6F(PnX2cNtyj!*h08 zbJJs<7PW`dHYy13&@YD^K$tgKpaD=l_UTuKeZPRY)){KaGwFWus1UH!gUBGHg6lxy zB^|ukX5{39@?bG*i=?X+tfU?jI1NE>fBJZ-);vG(sLG|?nvw;8IZW8_JK>E0sS|mHK;6;k0b0M~UOEDyqqV7e+Q1ozrR7l#jk6OWj! zqSQZMmn=XD@*MwO?5Ps-?WGC_qmYq$t8H&IRPFGEp2%RMgepSCR?w+G<`=Z+tMQev zw@Xi#-gfh=RCOIVvBx;6YBV&xRng8**rW@GTHkpZ5Cv3HvSeoKaAW4}YK>doR1qJ6 zD0ww9cFqYkS%M*6t9ru#xKnJ2K@0&T??|*omnFJD$v4onN4xsRmL%vdvw^a*M+{VU z5wJm~J!j+!wR&+stElUKrj)7>vdD*u;;84B7{YhWiuvKo$p6kJ;^GV8OX}XQE@uAwe zN3GO~;8?+fUkqOWkaFfZg5SEgwYBkR#-e=?+sP{)b(H>~>E%A?f18`Wz$gftgX~`b z)zt2@09Zvpr4|g%$?D_! zf_pl|YJ9bz7c#A*CDYdXPtyjqHUzzwNQPkg!9v1=pN~QZYEK-A$xqMQKMz$MIls+cvCZHxLeQ z>v19~yn96LF2|c5){qSH^uBq1Jhi(zR_pXjWp)PR&(Dt#*D~YQAainii4AnAU0Zqm)$gqJ9&2DLyy)#Z^2PLeyfj0BCD_ zd~Cf;`uN+&D&nJD^c=#htP-`xM}S zJr)q-9UKUoAS7_n((QPv)|Q$(XNcX%LzpMQE3))@_z|IA8{&}ipGV(Dr07478PxFW z6uF%|IzHdLFk>GNo!r}>uw}yFK>^;wJlqHfSo1xD*c#9e3&?7O&gcxt_qlkwPtK*5nBCh1<&Y?og7g;W)YZ3Q3CRLR_=sC_SZ(Bj3(yz4u_3BfEZTmjUSrqSM`>CY3TAb5To|fSrcmwx0wC2fK89 z|6V|ZcN91$!ZfkDHWD#cK3H6Am%Q%=m{^LPO_uGhoWFUiwGr3~eIndN!|W3fvLi>K z-Aq3n1X(x8{qKp~ZHbE4_MT2lekr><%-pmeuU@zPM#=0TP$tZF$f7Up{Y|I}kv7qg z0p5L@ZqS0ay${m1SA14h7SWN~7s11NA3&Tp=M#xDNouNLLIjGB2xxFSG-mliANba1 zUY(X%9WuLPrXj%gxFp&l5mP--UG3mVTRWG-W4_~BKWpEC`Tw_QN>&l!-OopGh1`3ATrg*x;&GAMe9)jZb3iScYHW%+?Qm8)ZVC9o~!N-SuA z8+cYXrP$!&P%q;&_!>onv2`UKo@^Upbhdr>RCL1}THl-KODN@yFXhd=uDTAI4Y8FB z?|o@Vd3E|FEg{3|Rz2bS-~u~15C9EWX_7bq_VGit8ZwuVBt&u9$sbq(bns}JcMV3P z*vz)kNsgJ1QMa_EKU|Is*JoT44mV!^#?B}R>fcy zk3x59utb|ou?+UljD-z(pxU4|A^bT`0^Ko`|Ak!5I-H5VaA10@m+niX;=++UV~Hz} zorWQb@0uex=?lBzEihmcT<_%!mu(6tbvgwOG^kd$3Xr~%xGCT_p8*btMs3p2TdIg)lm_P`_*e2P?WwZ)}Nmxve-s(V}v zJ0kVn%fU%Pr<0)4yp{KX<2~fb@r(Of6NbCl)sN0L_uRVo+w0W#6RO`q0HiC$+g$`K zqOud(iT$n))k?-5)k-Pdw4;A~7Dlxcb`H_0X=vgxh(we_uQi-*7=z+S0|j8-qH)CS z&7zGCkKB)!5(JBb&o;N}KR3~2aUIs7=Q#M;_`LxhsOD(R(XVu%sr|06ekd+>WOEbN zepJUT5+naeT=msyeSb>0o0`oU_yxaRPr#Jefxx-J;&dGsjb7VUoiVx&>{pGFFSbnHrd z#25r;n%=D!*`u$B`nWoKMK z(mk4kHhgay8WOdT_ksF3Byr^L+iQX8&&=~%_vV+8LC=zcE!!MF<-}qebLM#=3^2My zYylhpM=e!G8$q!T}_DFUdd=r;wl+d7tGXF0e7VK)+z3-lL>es9Pu{ zxQw3v@(Dt39l2xDj^5xw2*cvnLxGbOe`Jj0eaQBFD|Nc$KVzm8Zxz1)dTfT4>ZS#R zMl_8`-IGTaHFpv5U;Mtef{UfA?Y*-OTl8bw}xXUl}e(f=}zg#>n=HC`GmV+bbnM z;GmhuI5?Al#(EJ41as)YBqb%YATd=ya>C%@r^EbkWc6YuC+utz>LJ!B`jR`jCTPW3 zc~e*vE+l^l>D0fcl3dYWuRA=C0fCZ;W+m_QZhae2)5$ut<;AjxR9%8BQb7V5%PEGw zU{)Eip%h4QCyQn`7uR&20m;)?jrTDSb{diT@0VYHQbtB*(VhlA)XVVV`H8k8Nrd1+ zVi^Nkl$h%?sKCKRM$o>E?7axN;wX4{JC8(>x3od#O3Y<&wTGY04bD?-polxkqn@^x z$eF@GbD?HkWh7`}sPtJ^l2}1>geACaJ;?v1{@-Bko&Gk&J{-{UcM`phxI+=8wXCRW zCFZL|0>G{IpkQo4B`Y=OWEjC^?mXi2$zO=h95sqULg@@SY*Al^iD>s!6n7+29ND>O z@_xKM(t2ui-76m}s^fTU@_S!8!Il%fmG&&@~!7ISCm;b-@eNEdQpLJ zhD2#3Mt#lgu0YSnd8ADOT@ZuDujz-NCxnySsZYip^Qflnq|1`vf<%w4vE$vlcS+%G zgI%SVW0Jx{0zD}6tbBZYU(`TK|Mj|Kcn!kIi5}vvu1EhT>?K03{yNzwvbliNe!QIR zuTD?#c3wg)i2uV?iIA%sAkIlxBOu40Hwl1au^nvL5mb)krc~!tUl9q!4%)O26CZFR z_@5MLB*{QznfeWbs@DnZ;cmM?j`DS_o40qHzq);@5PcFj_sGUlV|y z9-jk(c{5Y&Rz=A1{{Uo@#UjWegrKLHl#5LiV2@+ci5IfXA{`%2K3HlZ4lT`Vp5Uqq zD~sij5Kq=oZP`O~C(>!~V`oTmA*>k^#P4O`IvW|54bVU(+CZq}rwO0YaXYw+H={cw z>U?77l~@5N`cPncrMg^@q2M_HrJ$M0uG~6V^szwveTe zxkGyPBb>lOcNP{TUyR5qRDx~;;mV}yyxwtS;{=o!Cf@N1onBb*U_5YbXFpoTmHmCD z2&3(@9`Bn3uw+BT0HB?29h0C-AY!8aVqgq@#pRL2cfD2}6Bs{7wnP2XIJrA(XAoCz zLwwO0l5V(*A_B5lN?Xur+@P|FlP2UElL+W$36HuRrbEMk^(0~gEQmPX*souCIa6Y0 zMjX|~5^IKNnrc}jI3aXU59yHwl}kR*#GC*!ioPgHWS{R!m?OxNHHHL)i;HUqlHnH|3b%)`X?(+o6w#qP%J}QG z2?VV+TGaCp8V$X%35GZ%SyYXXMV-=}VTee6cX{Li6Ro`(NYOWiJ${_B+pU}K0 z=Yb5x!JBRLNS;b0ZR)nux5m(8Hrr>HC9XFi|)VmyUUUoO%l1> zXE!@}vdj>7OZaI0o2TGD1o(XP7ve*0b0-GCls;8hezlV&nz=w@PN2s*JqKLwi+Tbz!Q6Gu7cI>y>s~2^_(HpSz z2%z#B9y3_Wz`qk}Q1H`{S1?s7HQ|b=Mw6%<;4g>v+dE5$cI2Xn7QxC&Tp~*>h|&kP zf95D{CPu=skBlLQQti9Z@|K|dl25nEf`-NI0KJ7n2fCCKmh|2qNOA!in1h3=rp-eE z^h;7py87g)068FSA&(-$ABMg`5(`8%iI9_V#@{ajD&2BczS)QvBS70-^>VJuNPl6}7S)6X@_zuAk_b#BZvc8tY$B_3p!B7emh%mq8 zy_M_uHJI_)haVu~p$*%AA55Qf*;Y46(2qbPuZ6I+f9|EYa46@eFMZZUl!{2KWSlem zQ`E@M648l>7S`)X>XxKs_gN0Lm{wOkI`(v3rYNL{PzYO`Bcz|CK`+xDZhOyUQ${j? zlhBZviKs=%Y`L8j5cOV?%Q`g$vlbxv0EzM|9OYtTCAnmwW*ak65aG=+5|{GtPku7C zORUI7r#XO{7W_2Wpnz`SM4?BOHb~*Kw2$8pAeZy>H8Y*45P1R7cJ!9(~;s$z_k= z+-(Q0oo)aYgLVUk=e7N_g9DNYQjrRQ+VJ`pEntGyiBwA*eyvCxBalL8*TIJ8?D8jd z7ghoCC)*Kf5B#c$Hc1dT5m7qMv)D~usw51XlF=u6Nai04+9Tl+aoY@28@G^baqj$BEQxdNtZoJ> zP72VdjVm3~QwCj$46?c=`?+I!&Q2nLpS2Aj%@MKwU2~8V2mK<5zofsI}OVKqAPuE`hh24zjYs`P@jNR>-I9z_!@{9Ay!3BY!m!tH?o|#gJ?^ z2_@iic}R4g)PgnuRTm5kM>Y4Fqk)JCREl@{>QtHrVff#=$=X?nvz&A@Re)0>_Q* zkSQHVI$)|_pN2-7`SxY9@b_J>i6d)-l&yWJfy7_dhHdp}v?6|4NqITn#7QAs%^mr4 zfDj$jO#c8OvQ&t=jgC`nUX1T9zTUcj0D|?fz~&(i5#()^PO@MsfYFHE)P@q)u2@YB6-b}JQR?Ul-;Xca7)6TbR>?vrwFQC`{qQ_ zkEA+(1UZnmi+O_v=T{F$D=ZM%ZBGtGH#k>28LW{mQ4YE_m^~3OS}xq~LXh|yATh+Q z{pt5#J>^2bk9Dz@CIx6=F`(B-AzVn>5CluD)>&8$<>268C$a*}r-AL8}&DLEjb(iw2G>U=zaKFO)0)b1e( zCvphF)D}mecv1%d-Fz2C(xiaD%6?p+Eg}yDEcEcF_$4g74KgC=j<{Ro;FPYFzau$$ z2v(1|zv7QIw)Iwni3u*c2)V12-bB9i?;fObG?lw7jV_3b61;^2-9BgkF=??7!J zhol)vYfnScL3!zpFGNn0sUydU{(uC^og|n6`vnd;IF{E10?HPdE{S2_h?dFnqd*RA zIF%(cO(xKR1QxRz8sOAgB0o(mII^W(_;C73pCIYQh~Nx~2MTw1sgQh!$>$@Ki)jc` zKm$d^(kZYk9{ut^Vu}HBC^V$alf~|3-Gta$SR>}h)LU@NDgX%ats=s7)fBihwsjU9_tXz^$Z*u4u72}4P$hMcLxD)GE6a0Tws z;8GDS^t;PhxC16zRlrZ8eahGaK&YJ_!AAARKYgKa`id6G~%&4JpsELc&DX-k%9`ad=l2s->E_7IuF-gza+ksl`o1 zrfEGFY;Yj=;L(wh5$=GqfDmcjA zSxp!saJkGX0-I%P+6Wx%_QUB|7o1??=wU%R1U2KdQPX0C3ah9DDeq6LtVBQ}%$`wt`K>nT?jk)oMnc5&K`^y`%5JX)8nc3&CoW%8WhYOjI z5ESmTB60*tY$GBRf{n&$Kz!FTXEipHpz&86Ic4CRNyc&4jw|1AyrO|{k4hGC8%uJg z54Pz!qX81+!FFrB__*V|Uf^b;7=XMV$1kq5h#;fn_OhgkZ^>I~5*iPm4IOYNtRoZ) zfY38?rZK&FAejdpV^<7r!B_OQY25@Zjs8@GJP9riG>V`J$9*c-F(W@hB7-E^Mp6^? zV;V37b%{4g!lK?YC$GoxWFrU2*_=j%hMFd>X~i%8y+Bp2q?va}Y{J{K_TvMhF@>WG zER);`%%#3M&VCzSoO0d+EW!-i)T|{s6OJGjTIbA)0@^lrj)XW!tf1 z$=jLcPYA8BL)~aA-tYl_pc5rf9IwanQ6Rd7E+15gP_Uzd? z;fd29E)ok9sTvg(72wz3DRT`*$H%3>8{@R!uerLP@&1Dct??eowsLoVjs1>9jp6v=^-nz;p$?@3g((VuF?UFE^{ruDcJiPgK4laoJ9nwgvL z4?eap7--CVbo9ZR7dBHr_ww_XSj3>=x1x*%_Z4~Jzz2Dmazvb> zq2YXvl7_y0FGS4u*|Rp(z(?WX>@dylf}_8HGPCKN^b75hj z({j3qu&|4WQ?6RSzUp=i;C+5x-V)rObg>7!fKm0;{j1ij$p?}(e`b$BAdFTKWW}xz zwJ)bA4-$Jf++IY($T*$%tzd09&gLUe!vby^{bAm*a)I(B>mRT1udmNiL+te2FNoPk znD_AE!xTKAHLvWJ-p7HJNF#vM`844%A2Tu(x^a7 zD0q2!&*2v#ic}R1SU_tvF%URxt>!AV41yi3g0)+=Y_Xge*k;s}Aq}UF8chxm8tF4EEyI<9n`Ozb>98ffX8B?miJoEo9U%*)j;AaL?Jf zl;bAq??Z3zGljVXaSdZSU1k&mgnt9!(w)tQw#{-s=t?JSG?rNc&Pil5MMqghMPPm_ z4b5+u(pIF{mQv6&F@<6t?@r85j~TqTOO==W{q@jCae~vq;lv&R0fCRf5?b-eNZH+( z9@PgZWQ2eyg>>sMDs?E<&u*oV#BN?*o5E9%{&DgD`jYOFo_@P9n3y~+ z5)v5G_HrzjW5f#3E8B{nYk?h;X1^fb*51A(i~6HH9SzO!k*gu+U>wc14DQ>vFL=3z zm8GT4h8E!)Er)&m{FYGI*xKSp%>wpb%BO5s2oiNf4n!ON34ZdBu<%8!1_rv#^H5DL z8W>PfAnhuK*3aKxU0Aq_ZTTp;$zkjOiB;>yMn@%;l|4Q#Tsv=#)=X(1jI%tbE27h_ zxkX)2cgUff!e*ej`{?nG7iQY`ex8{a>=KT^`z*7KU%seR=1idQKq*F3UwJ}a-mCQl zBEjUPWKj`??A= zG4IZjWj6o`To_eUR05~T*~zE5Cdnx&g}{NW-QAOU{SVe`&PObYf`VPv>qD9?Na@hn z*l}!EiB-?#^^A<%&=cCwk?+Gyh8q3aWd@6SDGLh=GFFSQF`*e8`Vv$+hU{f;!NLRv zav=pFx;HGds-p;x9N4gN<2}HJEUPiupTk5&E7UA|8=N@17dqB^8Nc&1rr*>56=xA$yPBu7O-1-Dn zjb)a4>$GWG!D<{*KQ-7pdlpCV_d=IJ=`DZWOS?_XY7^=~S-cVE9!_p@W&a;bu!8P7 zpe)doYuN|{YX)o)6)Tbdm|ICnFXt?qDO$xK(W#wLSp7aj!^3&#jLR1U`S(g;IYB(j|L|dV={^`y?=o)x%Z@biw&&iCBiso~MxD|BUQpB!$#VPP@}KhaK@ozY@BkVBM#{14Mr=(=#;^GPw+`D%J^oAk??blO~g821X^7Vz3KgQ8ZWM7|$ z!)|wj%CKTet-W2}ak%0rhQrH9L=GU05AoF%u2O9Jvp6!a*Sz~wpw(ygA?0x89XPI_ z{5j$jK?%USk`Dr8b+27pBP}frPR{`19NkpSR`L;|&|WBsTYGWh=pMu}?nZ=%7GJil zI4wk~#*h7vWW)2(gI*}V^lDoF$G89WrGv)N(Xj?cm&$@A+-)#2K56}ZP!i+gX|`Hjy>`tBZJN8$GzHHNat33TW#rcT z+=xrYDKjA%osNu<^QtkL*-oHQKMd`>Wgoyp4FLd-0t-z!dy0+!{^!r9@Z1f)qC?i! z){~QyyZ;&n8hA=9me$rfs3RU-D2g1|?P31}KisWGI@e)=KSG<_-6$I~-ua0MUe)0n zlOZo(a*`{EWiL1-==Hkm&sps` z1|ZxzFyICsO&jbQ_4!fv!64DwA)|u7*P_4udp9-r>8Qt*Jl|K73XJvX1jp_YgcV_& zWW=zqiB_eeh(dxB4%>P)HMN?$x)2mv+0=l%x;jQ25;}bK>TbJ*xmyJV1(%m=J@fT_ z4pJYNlvIFTx(ej*Jo85Khy$n(H*nPTdUMV;5H-4x(9k6mT;6MdyI_=W0l0KQ-LU&P z^OlxfcDHTKA6NL{4!wnpq*syte#X3H{45449K!y`AThPd8U)NPVz(zue2v$Umbv89 z+S-b2jziyEnDy*r{F{-nfkq|-<&VQA8Lbj{!h3(-{Vb#FO3(>Oh+ketehv<6ceAsv z0Bzr`nUz)9%hK*@zbXd5jy@}>Z2IjTlMM;)xf|2gMB%75$w0c*IK#U=2IJJ zo@j=Lg*m)}G;}tjV-F5d?hqH(98JSxOmt8%!2mq6kvg81sZ4wPctgd4p!UvPyGr;K zv8oYouz%aw7$PLLa($r4EiWS<+}QR*hZq40B+(B};rJsY8m95_aiDtTj03DC z?}H@l-D+yiVbWS!-#xM%>2$5+LHv#GJGpsOqZ{+Hx6?8+sWSE|VJUhW`Tudj|N7GH z?0xngldFr%D6_erUzSzYAKyBW>*8&6$H5`&%eCZ?A9%!3gn6l7<<;LEtUxWn@DF5U6yFh@XS$12a7nkMWSK{wlQ<;oSSo+l?1wDWn}+uM~O zfrYE#;Y(sNa&qqg%3J&U=ZbCPGZ+cacb z(+v*~``JBIeR&!Wc%p%!LJ8M+8|F{Nib_&))KBH*X_!Ak;03M#1?_;lmZRM?nmIO( z#MJ^dp`ZYC$+pcs@k@*R>y68+)@JTxEqPb)Py>ldnVzQt$u?7_71qG1dFV(2cC*oZ z=t7>GET(X@A$yK~4j|t{H|V!zl-lT(7>mzx!IGw&r=vEU=JI}C?T7-$NorY-%(ZJ= zp#8rgDt1M!tEa~iDozNJv)F~vLdH#R%gd>u-xT7cgA$$|2C9kJ%sL#UyWGP3DS*vAl%g?=u#2lm}=+v{S*$?6uf`magIRakn-w}egbA|GvtLVhb|(R zKyxkmLQhKK_a8r;T3T8Zji}eJF9Zlj_JAL3?|6@(gdEhVcld}Qj4d<){3Ck%=W;12 zsokn?=#kZ5iOvClng8|cCN6K;9@s0vfPoDf{KUA^paifsRQ!}c2FKn`|WekgB2^&Ffl)(Baw*wAm}3% zdW7IJ+iCN)jQdw%B)+IMOJfT!rEJ z9$~9t2n1ACT2WNDZru_V7XD!IV#%Lu{jaanCm1Q%!u_}Z^#=Z6s}r&r4Qtn~Qxy#j z>OB?`CP-~P&DFgluT+g#y?x8brZ=cbdj#k@IHq)usQYlmoy(N=Wz0%^g&U!kn5 z>}Ay9d=s-&p_6jGHpIN%4}N?;ApVMPWqtzExSF9K-?)KOm3su211N5V6Th5^iAmmf z?~>ns`z_=i?~?7};>;M|2ar~PULOLjG2`?^5du73O>KI7`}WabUham5vXMpvF54^C z&EJUj>D82@N$Lq&_z49C)r`#{>Kw6wUERlkcS(WJ*3lWp!+To6Q!S@QIl`UWCg-4x(fY3b>Cc!WW$_45Wc9-eg&AP!4PF2~9nLQgpS z`rDQBv8t~x0bXHswxWF;h1q-Ya#-_1-HCAJ)vt7F*lBuLd3o1ERdaB4eGja=frZ5# z_=#F`*nGpDuL22^VKNKX?Amm-~+pX1K82-y$Y5J$u9)Z5>F-I2b^$26=NJdcZFm7 zb_&c!b!h_>oh3__tXj3|PIB^r2!%j$>73ae$dxJFc^75x3c5r zisNqfsw(NgmUe-n%a~OSm(Yn>1xI1C$Gvcf5{$kL3gjv(D$kn(m|Dn<&p|io4_w=H z&stmuB|4ul2oUnT7iw>3hIW7$;za57hBO)oPRRf4!lR2u;EY8F|>iSNZ5L3k8;#svsp!ejY19O#5A1gQ43$r^eH z`_g60;xD~hSx{8eb}G>2OIq@D9Nd? z6Exwee|73#|1et1|0g?V^|*qw05xeQq0j4vhHiiq?QS$(X>V_jBW+4IvM)qSojd2N zeQ7BU3m;Zj4`{K12vJjC-G3hg1X}P6&>W&{=b^Jh zL=@S{!O@O2N}gJU2jiKcQPCrXI=I3X7Pwx;GrbvbIw?)5Cu)%Yz62?Q=+W_?E`Wktg>O(ml`Fzud>jzqf@0N>YtMoc*~ekp zf=q9?cRv|%|NqNNXsKvQl_!&b# zf6}TCc6B{MJzxw=1?0K(yQcK5_fThNCq14j2ou#EQa{6GL@^gyRa%N{&>^sc^Mt?JbF7TXUhpbYSwsAiFuI`#USRpTSyiR^`B+ZhY;j#dB3 z-9U!e=+1{IU!UfJG<=?KhZ(SW9{ia&y>jO40c&XD-L;94n$;&#@o9V1(>`xE(2WGX z@I7>s3%Ip1`nxRB{cq7dZ(tJwV{$htJRKis^zXgvEMPX;t%T=atw8fLHaMrIMgltN zKbA5|9-P`*Zf1IWe)b@|uI=6VoTz)}a_zF4ntOG-pz=V5SqUE}HuV4ykt=lcj#q;U zW}yJN7jcB`?lmz{QD}})=B2;x?LXfM+xt+1mZswp9-Xs_nz}r`tf4{l>;ngU+hICB z5i}o<`=ZXiKf4Og)_Z_4U5$424f@}4M_Tr^Rn3rj5c9o0IW^T|%L9c9g1`%43bGm3 zrASwP0=V7_*}AVTS#HqaupZTt4aU(@iwsJB&B zsy*YmSBatpit(ts`|74Vi57692^~$GQ6*MJS=~H5V7plc5`EAWsba6hN<)BLh>47@fy!1 zZh;PqX#+wDLF*-k+7RkT{>P7NfuB!jWQ(?&iIx|4z-qwLZgQh0-hn69WZvR~#bZ2V zrwH8+QdjSR&q9Is?k&R^gpcL9=ZS&^yufwsBc6xR^5e%V^WHya{nxKy+kamNf`WqR zD<9&aCs_=QkE>=hu4R*UD*zr{Q5}0O{^*U*VL4$D5p4uJ0hqZZ=j7x-(Me~uW#mVa zWb3wVxDaY6t%^_PJob_)n4TEq>mEC*K)fTwj4%5cV7EY7jBc6Z4`^E;y_9nOR-%}o z8?vv+!N9<^BYH~Ixp-C>5qOBtBlT?*D=6@2$9E{fH%2;7W?4_H$Afky34GJhxd$pE z`%D1qB_<|j)#}wx%(qf+J9Hn#mfQAfjxY|}kWPqUdGlc!QvL&PZ|@^jRzodI5NR-u z8%lKl1|B|uTFQxr zDAn)wa6aeyUf1=xK0p6_&ha_&e!pJN=i~W!+}Crt7nS=ro4s$no&=5T03tKBN_m~= znp60Ft&-^%UXXFo7o>h8{bt`cD=wGE1m;5wY^6xQXRwK0TR9L4a|5URNj4NFfQ=t> zp3&$BQ+2la`gSl7DwhV{1Vp=Hz1GIcw|8;lC{yc(CVCWh9=1q$64TJho!n-{yuRhx zrM9;AJA=?yrUp3KrlgXL;^9srG$!dpInB<7GiT163Wt~(!;d&%IPBk-&_BO(O8M7P zvOah29DLA@;8(me2O=XaqnaxKs=aA!glE$Q9 zm{+f3%t4JgJjux9;GNg6RpsqrgbyL;{;rDKZY7{0<1+&ve>mCLi%dfhbEt9O8oh1%VwmJi|6s#UAdR*mB_Zh_c`6IfdNA8tgS39n~Eb~ri$BQ@Mw0(iAAX) zeI}o3LVespalDh1qy(%y^?Ixo9_P6z7BkoP(oxjZ{_-WJ3fU2I-9L=4(W7{gCElUt zh~HsGfXZ*5?aGTY<$yn&9X9#g6(S5%jXx25If~D;O3#p^p^=iW7fdkv*ZTB)v0(=~ zfw{^lYZLCU}W7@cX*2Ta5Z~0~i<}GWr z3M5*{|7TCSv~_D^D#(EqofMqW=@E6O?Og;9A?XEu-+XIKhvU6%Ta%fw9xD7Lqt~s| zhiaxgG^V*8UHEMX6WB$&s0q%af@cb71r{32!mw2L*0x87#oQFS=KC{dnv}@pc0qZ> z@^uQ(o;~pFH`YxbyU2_7mHtPL?0_CFT-D;7bW;EVKQT@>vJGQX#q^q~{VxPQO0|f! zq&R*0^!PG@@|w|=zl<@0H%7iSE6LP96jf|b=4aTPJ{U|cdj>XBp}<3E_wDTA&k?K2 zLh-Q-_4E7-n4V0l2COnmr?R%ddvr&Bxt_)d45VGNp2zqQ?p3!wv{eIQ2R6dhSJh(2%!ei>4>{=NbSU@aZ^n#tgP-KSZ@ug?$%#n!++JOueMY}B>(`ePp(=2YU13A zpgihP@3!*2dmx@*?la)EwNNXr)eXu=C^?|dBo~S`sN%k0T{c$E$B&y}Y71`~{XG^u z`XkOzPHm2}d9=zNcBTS~3k;6%aO%}oC)%`aE9yJd*<*NHjb_iD9pB;Nh;`owZE4x{ zysKA0KtPk`%^$0D7+Ph+mf%0$=jT`d+Kiz7Yc>80Q~2Ni@bJ+u)O-xdSSOeuyq7en zUmtT=gHVibTDB327p7fmGgG~D=N-@%bQQgs;0I_W<|yl0E?Pa55T%uavLdkOrPF-3H#Jz_eXfu>eIoVS(8)Z zmDIK6+Ujr1p$ode99lXJ7{lY({O6xT>B6+#_fX+avU@`k-rVxEa}M@36gV8keS4h; z94M^Y{h?00kjH_#zlYZ>eDLT|vz9Ge>Lvf_Uba9E!@|$ohVYya6zL~#Roc0ad4liS zqkDJbup&gw>LfAtDQ;~=D{q6xKyA5tK=7!gNF_^b#}fof&Va@H9Z&<&3c}T z>6+^xgm7ktN?E_@=-lUP@LlKbH8hMW3-s~v37+(jRHZr0)ZTdr9O|>-H6LX^U!r4T zV)6xtY|`qRX_~|_i>{|>Q$NoYeUTRXawPS8v!&aK6DQE=9M752{p~eEyc=Ly-@nXY z!r>w20XbH)ZmzFEOxIc-9tSg2d0A4vdE2&a#U(2oEVXzckZ@qVL;qIV{_8jNzPqfq zod}p7<5?YR|rA%9;We8fiw z44cpPhZdjN7JDmL5U206#d~Odn_TvUp;#8%xM9N+0-G4E*OxsR9Ua}uTNx-Z9P~vh zC^BVbDxpSQy>{Jz#L#Yc)L(O@NBnxr&m;Q-kSR|&le)+mpjfqtKjqlsy5a^>Ox~fx z*`azIAbTE1H?-ownX_iSD=IqbxMmu4S41S7G<0Syot>TIIID@OiR80dV8DoCJhXuW=Mj;`kywbvDH;oJJg0U zQUv)_;abcoEIeFPKTcr|z!lu-i^Y3rtLLyeES=1UakL`xu8+(Y5Yk7fY11^jlu%kR z!k2f_^veoIKw`qAXmla?5hYXlub6%XZ4?9+`uTljXx4YFvATO;3#MGnXNKgbz26@^ zE~lnC0f3bFeu1% zJS=r>;HA_>{wqxP(uXyRQbi3K)$vw5L5{8Wx=yEt;o*W zo|u?uWu)CpLj!!dK471`G67v-Gjb0n)c+5Iw@7C03NN7liQ(RRDH8WHZZ{M*AS^N) zGp5;PCsI+;26#;qoS)tUh);+Oj+jQa!~67Uf?i1OJu%yS)o&Ogodo14{wqGTWivkD zt!w%YcgqMxh3UYA=?u#G>~FS0g) zSEiW$;QoEbwO*E%JBraxDR=3zlTNcsd9+Xu%o1k6TFT1G-4^fRNSMoHe3xeQ9WkB*c5;MysGJ7oCj?UdY#FSF{Da$ z8M(SxS?4rAjh~dZ_zmPD)u}B#>!f8RncH{oR#EXjei**BNOjTD<;!;?nsGo*^`){h zL8b{B4YSdsp@3AG*6w4}7pQm+syarz=0}D*T`sHj@%B!^o~Z9tJM+QGBWt(+DDLNf z>CymXRVe;;;1ZIl)Y9p9Z3kp1^cJz3H-CCa)b8`@fmKsnT!#EYj{+}mjKBVhnT=W! zaS5MNyl_7ewFjM#JrdS}?%=@kC+wI(2$(a|xu>H4FX%^rc(fYvjJS>^Q>VkcT1Iu- zb|~GU``nmg$Bu>Ex~uXDxLxPtTw@MHqFYi(2PY9@a@yL2O`8;v!l_Hv6ElNr&1Uug zj>7-Xe|G6IFSH8_aPg)_TM!I(n|})Y}}Eg$?Qd z{Nt(0RSg<6pnGq^A|qGPe#)BeN`F#(fEvda{ua@$Q>VVV-7JCEFMC31Oz`B3s&Kc% z-gbN1gRS%Q-t)>Ex$iP!eL(dKQdm7BGj-80{ICNM6K{ijhdeS#T@Q$>m@d&Nnc25t z5o5c)#j-z#bkD@&Mz`&K$G`}-RMVGeTLHN+lgTsNdU`8oGM{O`PYp~BSNPUkNe4wTIUIZ{HSJ}hiP^<};!^Rhm3 zS$B_hhle;yPhef|HYqjUyLa#IQ9bL{x|o8&%#F|8XMrIAC7TBrpus!AD?rewH>ID7 z93{%i!DU5Bl)kwO7xrFUOo61d_IF>7Hx5^x7|2ytsixiiuG6{2&zhQW08Cn23j^80 z(3+f?>F@gFwa^V(dcXAR*NuRJX<2DE05pX^j0n0x>D^8CNNdp;Fiu{ff8;1e)vfs-h5e)&wmj}LAM{6+yNFO+QAR#l~t{h+B`8}hLV_GPviFO36 zYD5@7Yn=u35_*mEi}{L_>lZOzPZ|x#0Yg8i*pp` zy}55iW#z$}5=W26V8WSsC#PNDTx!bD^}V`U^2hy-sRQ)rRqUHCYR1SI_I$Ou;w(6F zkpbqXdjcTR*qi_WI=-prx58(Q1#YBcxq@OVsl%udu6euO&ppW88^=Ji8zIO~0`u;| znsJ2n&-zItPB>}{K&7pW4lZzQ3qw;wTJ&fZ8rww)$Om(xN^DbsXeMl!x( zR=e))+_lSpKtUQ3Dat%pTb;)I?sTNIHzI4DG-+=^OdW26Bu|xrGi{tdGhLb`A7>)R zm!v}ZNNbhtCE6oMB4s2BYj54HwR$j0FY$|Ft(S4x+kVx z80`44oj3-w5|$&F5+W5ZeRKN4yTC-|Tldiqjd#w-<i@lt^5_QAby zS_cd)8pSQaE6N=^_8Ipj5C7yO6szT*v!*|frlJZkM!;oca22wB`tv6_8!rNyx1Z_+ z=kGdaDX27azT1(z3|}&*?cO~;KnGl5QO1?-c%tPF!T7gt)sb+wjeW^CpX2DL=@Iz+ zOAi1VJerngK9tRdksd{V&%I2I*SNcLnzjge(4|!W@+l6s?juIn1jGQzT`pf;K9G7% zH6HEec6CCTQ0e#YYi4!3EUpQ9Bk9=(&Wzpwi@Bp^!n5hYt0y1|b^iWkZgF<3UH-fS zZFi5}|G_t63Tm4I9><{lNV)3&=a!)z&j0^R|}} z{qMPFE8DzB7~$;Z=0EHkFO&<$u4?_Nsv=e6qko0ZTIW)SCQ`&2cM}rEOtz`vsGf9t zy=PFhDx(kF>(E&IqRrueMDTVhhER5m=x>}QhqI5VUAud43k$dbMPebxWZe>PnB!(S9!_o{KxHB8^pVn)iDi|eg|4)bvOzWJ*| z(w#f?IXx4Y^f9t4$2Q(`{l<-xJT>^`TWNO5f653pE^a3J8fSv>d174{+g(o^JE6vr zm&u{lx?MYss;^(6@sny)2F#e^{F!0g{7Dc<31#Y`+GIfd9gH!L^m=#mN(qH@<+Tg9 zOxGnGqnuK!|9ZWhBUc6qnshT~=RsU-rm-fQ*ZRp|#PI$OPd#~_)gL1nQQ{D6bn8B! zfg>X9PwZg`(-XTHA1p)_<#gqmVSvBCA}yUoyiOtFkxg`~cT!WWokv{=4iZd{W1-fiB(>xxk(cK4jFpt0R*Jraf<&y8=QrgZudgMq| z(sE!IEL*20Bv_y!U2UOugNT42qcBKyyeJI?Za^~;xR{w!ka%h(M^p2_z(BLGGBgOb zd!|q0B~80%)BVSf$ro(~BW*LjcG$DgggPt7ZRyYH`7@1-Mw^?XwtOnDlg6b*Bms5* z;g_}jgI`1BSgS+7uV{M1%EF@c%>KRneLgM(r{eg3k0ydaPr2)R&C!1kU?L6+jS9*~ z1T+Wc7Dd0_lMlJMn`Nq{De_JbVWm{0YkLNsIPGxf_PtHBdiCyo7lN3z=C}6IQ%Dt% zA+4-++%b@CwIJ9>2|o`=Z-sW z+!)DlrQusyUVaa>PIGJX0JQAXmkv6ktp;V#kmu@7I!q?9lE_!c$lB5QAd(d>h*TB| zglz@jx$2Wd7~si^Iy=~WN4wT4-U?)l9@@$e77 zr>-Uqnr)o;)@SRMEfRC%_pLYK;fhk(JZ3Vf>l+xXnsI}7DNrprbA3l_dY+Nd5r9-h zrB72a$vyjFEf8=$ZR*6P(9mBV#x*QwU=Z8n_+- z*MIs|^*8)6_HnBu*WWWj55*1LGApkouVN#rHGaaCKT7OT{EXKw!rmkDSx)ZXJs!C~ z1d38-EOoz04J9H1&x*$GlGiaq(J(YjFKUx=*7wRIOc-Ek-TL$y>oQw+`<^{p$llX( zWx(qMA>!vd4|S?c0(=k2V*z?-(=|ecPVu}UV5i%LAXSk;E`Cj}t!Varw$4v%oq@Nh zzjP47!YwK(L~wjL@j7-^zvJ_0FL`ZZ24D4;T-+D(>Hem=&WL1Q&t4!yJ=9H5{@~%m zx5AN#z>&#&>@i8T3Td#4d2c}UH+GF)$<(vNY;DWldE>^733V^2bZu%n2R)_bqR8Io z=n5;#ra<>OUkfrFl8zE5x?nKhXVJ6MyPsCKeVCoCMs*Tq88<(Ix*Jw^A2rY1pC)2| z;-nMx&R{hXXo}+BKi0q&NJN#g=ck_yv_vg@+NAG6Mtv&d=;wz-<(Yd(s)UdMf1hy` z5nBvJOX{q=l##(a`7M3Z{cqnm^N^eF=uFk<5|m!UQlp3U^B76t6WqE??Y^E@?ahLk znCsU+UCl$hbOpTGx`Xc6>0_xSp{gZm~FG~96NX0kkZR3a*E-v-oXZP zV7v)2X}Q^D3)ei()6-Q zo7F#91~TrsP1-4Uj=t1YctwZUubPM}3h*Rf3{x~@7CB7mW3o}N<`I)yf_9j!p zXH4;ACZ$@LRqB9j*?#N2W#7Km@cJZwG+FlQsuF0!J$8}vk5Wgp4-M&%{66dS2@}~B zESpAAApQh!X6XZ0GAD;doox#qXkqNAaAj@fiV=Ex57Wd@Y`%F&gE+E7HLJglz&0u1 zy!dbef^|*PmR!sDbD?kWjBsB&I`q`;SuU0nCbTygU2wliM5$&_{)Wnu&zmjlv|PFW zjy*cA^cJ;D2ndUL_Zw9Lq?(_}FK2&|b!`>o?fLohXEdb!qU|47wzh3u6?FDcGgVLh z+bPKrAV!V9)W+!ITS|I+H!~~iZhHFkv`Qb~z7Vw{b%>V%Vw?tE8hgyNrHQH4zl?DI zv)TOhZ@1?EJ#}r`vgXAlyXl3~jJoy8CITJ#Q8j5i-0&^Y(jS^wUd@32G9)axiBM_;Y!R^sV7t?<0C-I!bAiqFi{^l;ysKYn)NbZ8&tOBkpSp zdsk>?R5Gm%p3+0pqlaW4oSzRr&le0nJD5Sa-OLN)_9iEYNExi-BpRcLCqKfOBIZ&@ z>F}->gyT@W$6TVA4p5?w2vK>;S_GIHnwo{n-xd;S)APKDz*$8v7C&K}oSHTQ-(ZDX080R@%LoU+s1W=}RL7Hi0}BeT=oTPj!Do*uQaK57d-F>$V@Yc?>vuv#v^PkF$%5pT6NNppd~XAIHX5xNMr$)Kk^61>$q7cGr$` zo=M?#NpS>YyF$#MbPn{-eosyJ?c3*92{i2_I<2%dx}lA?F3^P7cHRRaLqNKgFx zzGmjX+(7?lBiXm`(N9MM*!G4p zh?{crC4Xr6zjX2Qz)u)>)qc@|czapg$|_Im-}FLSooAI={pZ!In{MB}y)0}aN|!Cb zdO#y)yW5uCylDI9X|32jopqW5hM7~~9S>{wrri(mQLi_LOt%nw?d8jtH%w>Kz4drg z22w8KLF;+1-@IAX)TgDAlH8wT?puUMM}|DRL!Vd-sTZber+(PfXu+8qvbJ;@wNlf1 zq-J4An;8%IP(CCoDrz|4B);^XA1GIrPE+^NU|Td*n0juCd@CSv$HEV+NMMQI7^}^9 z4;?&sU+%S!K*eGQLKmx{yKcbn)@}Cu!5&L3dsuPUu3z}^lhSm1lza^h%2!x9_aN$3 zaX7PZF~*CNCnDlu^b^hp;VkmD`}!t;nkc?lkrg@KrQ1r8{m{%>%p3X)lp_9krki_M zz=VQ%))!t_HZ@&WRemn#6>nJ%&C<#qY_J3l%%R_=gqSJG5rQ5oBu|&?3JWAkg6yd| zncDUaj*go-gyRv#uv5|NKU!%;uM**T$#>hfQ83Db*e0s_Ym}ixCCmY3;}+bZA_|ZA ziwjTx!>>M3f2&qB%Ex@<8BV|cqSZE~)f_Qvz7-!%8?b*Ab!argt1FI=+W#uQx=@6h z5pIM=1@!+>T|KVlHdIObgVjIpOpS3}XuJyHnP0kcoA&z$UYK-WR(RKu)7+E~i*{WZ zs@UT->jd(-r^jpPx+{3q+x43=Hqu~hVb7q^CpXH|g5?JL!-so^AjCjr$yjluj#k{>$^aWE=uF-847@VKdPvAMuHvim1o40Hc zGnSwCw0nwEAp6E;-pGuyFsY+6V*`8#P)`)j17Ax&W}x*YQx3!}I>8!8e~;&m+}n_-5f5%t792$4{R= z9dT2=gXzP{6An*T$uMxY2S0W<`re+iZ?&pBb6>Cy?z((F(?R>R^s!7>N$n;2Zz#Ik zcf5jMi2EXhye4ri2Zx4{+>&M=>0dt;UQ=&`K`hBb)Ij z!a@CQzx{g{#Xp0W|IuG;Nh?e2R8!9Q<|xnF#*GIXIF0+i8Db%BW`H_RZmSRHYR#Z; zOX#fJi#hDgUL4n3WjT4&DTX-?l+b5}L(3pK3x}_bh zBemZrPZqAl+EScC!PIALKBqO3r3Pv*k^xYLiSSmw5w*hd&95@igsDH|L6a6W6Vt^49J_BWVc2c|b(AB7gyw_4zy-INLiL^##M0?UTM+V)yA7Vf zekl=j)pf?zMH?CG_l_6c8-m@Fb9EA%Q){Uxf|pF_KKD7M=Yywq zt_EyyK=SV4UM#s`S=D&HKtsi~Y5Nins`sZ;fnm+Rc3Sf~dL=A|RY2uI787dhw))5S z?tNZ2gOmc!sa4rysP4e*+W<|1!S)eGjy=7KGBbwt0@1n^hkiFi3_R?|-?e5^HLMao zXZ|_nOQjLWy2?*?ywCsPSD&!Sf2D_;nQ0u}tG=(nC^6cssAvG|himeSZ`R-09%tRM zG~%&@Z9wDH04OPesYo;VWa=ViU;=QlzOkV*d!kXM+J+=tb9&1IE>E$W&4)H&*jowB z0P!{o^A(A-BF#&oA5}HgaB+YGi2g?PQ2%K_QzqkfJJrLN5zUA&wcnJp8)WSgYcEZ- z&KNK{n$sO5uH@RlBie~7%k4O%39gTgXFq685slRc7)04R;JcY?s}J4sF=V2Zh=_%D z^XAXr1h~+oWy9<4Wv6p0YHDgwIh=o{#>fWyxEascw6rzkRUA5cbfKNAbR@|mv1VZl zlH0Gd^cc>9zFmH?q%{;LEE={h`EVc%Xo?q!W7xlsb$v?J7&;zn++Yj=@A!5jxNA^M zG`cxMW+BF##L*sZ_J00 zvqiM+Y(4bfjgfb(GF*WlskK2Ka-h~zj|T*tc0GP-HkSe4gE;(3V&Gf^2I%fyJklfU zMUwaj0mqLRIa1O~tUZbpvbQcQa z@n2$Iae`9+Aa{lIN5)h1{5B|r>gkf)TunWF>lK_9h^m`jopGsn?mUxh-<>UPJT8nq zXgDjz#e7Of9R=Y!OFd?Pa&MVZval0%gxZw<-98byHPU|X+iRoowd~R11UUG-4A8OR zR$P^f;>F80atQ0X^C+3grjO=q-wnoItI*C@>G z7}|vrNG)=?h_*i{C*OD41(ly&lY~8`w0yeS7-E!qC;D{1{KSD8?boPJ8z}|O6%CX+ zUKYL2|H~Kp-?m?$;bO+LRue?Xci|9ToZCqe;8NmtE2IuMG9=;=q{G_K2escm(lVq$dR5F{jH?5m}# z#g$56$0vPXcvd94C!((Sxn1AVdci^lGusX@NM>=GyyuJG0JiKfY@BO$GBxh)+u3KF z7o7l?7Jk8(>wh+$^$0h1ITa`dSvWaVQd{ZnihWDm02A+^fLST*M> z-D=k+8{~hawQE4%-yZ}gXwBmC5}DbTFoKDsUNh`R=&^i!#1&Px3xE=7<=all!bZo} zHu0_wy*cm+mgkbNXY_~?ZB}u8^mRmUO`G2M`L?dMx1QG2%zT-DTUZ8Y zopUSFYuh>JXkcLT9M5idaO!9@o;3lJHqMc1vd0Q}HTwGcX32du2Fa&oCAZTFV>HDG zN8RYYI7~N_n_{%eK)8RRIrb?0db?ajc_>Jm09nql8Nsc(=dbDOd!r7)q7tKHg__&B z)I}PbC+D?$FZWHwe!JvEE7Yjjv@QtVcEQnSyKDjLy8HC$1ZPQ@Q%ol}$HsX%D)MC; zhxn=)c$2Jub}*+OoTJ{Q>i74XVTGI-V9>`AGMiI(Tfs^PpFlBnl~1!!wuRd5jakOLJQ|j-vqnK0?kt>HcK|yD_(T6Q z2gUZH*U^LfO~3rpVifqS3A<3HDBG7#C<*uI6dt$RH2ITvuV2<#-REFFv@Hj&W*=O4 zZ0*&9*PI*vD~`HNL0_PVnin*{@4?O%=HCN1Z{51{JU98N zaQ6DIuxsyd=LgpRK>(AAii%@rJc9X0Nw*<9d}V+RgwN(nmoA-kM-=Va{7Z{gtvYml z84bxf<)V#sn!RgC>Y^*SlQZ+mzI+iC)`f%i&onhO5)CQl2JiCndM&Zq*Ta0y;>CTV z4bM0qrD5!eB(7AAV^Dk}nZDx};Q!NHJahHjc_2XE_2;?v=X?QH=`#NkC&|v1b~;mL zoBWcEFGt_4nB0{agf2R$vXnLi+QX{6sDhq`G`&?b*0N9C^|~cv)-PRZjn?68Rq@jg z{%Z;DX+zq*s2#b?bzEt_I7|en$cxUBy>s36tc(Yge%J{}m zlHgfhZCVEIC#|RHWlvg^$jURPPk$xE@Bi!G;_krh z+e#17ST{M}p9GAwOAF3p@e#Sp*})H1|%%tT~n^pN!$H*TCdugoR-@N2vjW-pKz zO)U&?>^Uq@GC2`C+yyYwxYSlzS%JaV_?kn5L&G|^z}FYB{0X1M{0Zs{FXOp-lP_WG z`=$#MdoF7Iv$VANt*S(kTb%i)=I-SL*yX%JE#bJfjuTO%Bt9#v3sv@DMfCjMJ$jg= zMblKP~IYb4a3!$;}jKK|0JV%FjPjW{)VVzuvGv znbJfAFrlcIre1YW8)D8(>hA9_`z<1Yu<`(l#=wRTAWT3U@c%-x?n_$`tJR31(BO}tftUO}jI5t9*_zJss(0f}IHgNby9NYv&R zE=DjH;$5|Qa*wz__z(TE?V7cysLnXJ{@7ZIbg@B9bo5vcCmYNd@g1Hf7P{Bag`^fi z-#=Wh<=?CP#tgjb{l0hIYg9}!nJ8)|otqMpup_3=*a^NtczOtJv3O-l;1^eytg-bS zw|b!c%|43*{aye6c=$WNibF5x!%29>r(J)c)dKjSydz&;KaotV2~ z#lR)6X|E2fFi4LE>O1R!#30lzV0X%#K*_Ob*wA7IJ6M^nTX`l=S6lDrJ6>vLwinb; zysNE^%^bvQe&71tW4Va@wE89@E58Q)T}r9ww)wx~6UU|bF)oDW*VcLYgt?KE)zby` z=sN7u1=LDoJF{kDtep6Htwm#Sy|FHbyf|7L*@cPynz@qCOqy!@nOwMRZC#d?mDTL> z8>~xcMYPFJT~rSp%qOtfR3W2))4c-e%Fafe%X_8%W3NyCzF zCzuu0VI$;V_DjHsIG`dSsiY)pYMN^oQ5Fl9x2jsObZP&-`XHGtC}Rghr4gkGea9J0 zj>ahJ-Ky(3q87$_(f@mOKrxL$BS5M)Q~H0K+55L9Gp4h@!~%LMJhS1Uh56$Qlk3IN z)Xo2#faHUJ2++5;8oOY1*g>SO9j;x5MHckdpnc57L+O3PPkiE#^t+bMbNxW@&4FPr zp+mn^YUp}4GFx@; z!bN03bGNLV-(d_tl191mnJJM;|Vc^AsA0%CYrg*$IvRxX2iXma6 zPwrcFi?3DG&X8NT#>ZdFZ0LzHIliP`?FFy8T5)7vOwi~}Kj`P7qoZTafHpL?gd!M{ zKa%l|ZMq;OcHsid=^aO|zG$5O_|u4fg%aU=Hh&?qMzbeQtm=L_wo6iGQoNy{yLklq z`ub|s4Rr8%kA&43eh%7VX8yHRxgS3GP|PjWv^5_yOA$`Ae;57Kc4*5U^ys4Xa&vp0 zHG`lG5%S|A*v`!Zwnjb=(0Y?e@Vp~)s`M>R)hg#f)Ch6hSN?hjv)m6)5QWc#4Q<7h zBVcS~vfeLDKQWLR)YiH~rSv#wfAC0qJX*hbtfi%&+pTfED|E{=kHaJ$Z=4%~Hudx8 zOV47y5S_0)^XQv}ho#e)5yik4(RJ%B<= z=(9?7(lyT%R0xO*g7)#z!sxmmzn@GMl{(UpdP)C&c>MD_?kayDB7%gS@6Y(lA+i+c z#P7lK%!u5b&2Q?vd~6~lB+bm-)YR6f#bjn8l;*PAQa=(Kc2?~(QXn0rAKvhAUWc-FUp{)8rSq=>?B@lS&65D`G{J}kW@ZkJ;V0T6_+w%?|N=+|)3`Pm9D!7>c`_G#bi#PW-OfQQ%7hRJ z&a2yzIa|jMc(-oN&9u+|kbZsNmsuF~=uu_D>85o4Sw-W|RnveDxbb{cnvIdsZS7uP zWJF;>Np5^jNr^8gm?XbaghjR@dyxL4>H3);djXtHsbTa!utIm@!-4v~*=41rcL2}2 zxvvA+Gk=kQhp5vx2?>ucLv=ODDd8hc25yYY*?AMW$j=Sn7&XewdV@J{@KO0{xlRqU zpEXIKTAs|Ol@ABHjaFynX#NO%&O^6yqK=H=s*N0XtMTLCy?^ibwUUko1yoyZQQIEB z$7jYR6h7)WJLX=|sgt0s9T$%tV0nt#^!Xvkj-B>ntP=ep2Pk8T>9--Xp@~C$Hc7ZD z(yJZW;}*cjo4;U&H|Tj~IQL>nlo2zzBAAzLRqH!Qc-aPKtj|@)##v^Bp77a|_=Q1r z3lBxCrqSzu40+(2p6sO{aS;5-5TsM!HIX0P8Gc*inOgFg6MXLc`HDH7Ycklsl1d$0 zJhVSbj5t1(Swr3R7a>3W9-utH>(*7WiHfV6Hfa)vn|A);M`>x3rxXlPSjWu=A?ca7 zJZ}^yyqm}Ny~k=;b;NX8boaP2RfWv@&4jCg=qu1q7DdJP8%Gf*YL)b#6ujZ=Dqy&N zk5(owzqfAsh15lg$DJ7Hdf9o=w?c|3=c#VWVwF%UmOj_ zYe{MPU%&3!b;;d&&3e5;t@d}ne~n57FiDw;Q?$PIi4%u5V;y z#FA5>uv;DP}nX_O)uk*F=T$WKfqjoAercBRq0;l7It{76808!8U-qJSTzvr(;kF6ZB zX`R9yA4AIb!CX&nMfJP-4MeopBehN72M<8jHFsb8^Up^^?tNm~4atMTdewWQ9`N>E z4(WIK`7$rWs%-^f6)YOIj?|mX)bypN<=W;pD%q!|UHHnK$=mHADD^^2Hqq*>WJjnL zu>?es0w%cgQv!o6yE@?WwfWE+A)k2F)k(|Q2}1q+vf<|s3>Tj(f($MQv<>)iO7ToC zS)5^OPrVLB7mNN>gO8wyog(&PYoc8!Ujp~|J(zvn&EomO4Dt(tsgTEuU2!Lf2mvIm zA|lz1tjZCbAIKT^X&+xPyXQFfClcidcUskJgb8dx`mp}q9#Z+t}z(y zDfCKG@w@JlYq_rC#dM7BUt{|BM^|ENA8c%u@yYAQ_wOCGev&)i96N=-C9oYZPKYq%6@qd$At=l|kaI-FanSGPheQhH&UWU!qb{FFzcars{pZs`z zQg2<9By;(Eq!IY4w?cann)Ngl3C)!`@%2+bNVnux6yu$-!G@lK^QhmO$fqJUt_}oN zifH&+!VRW)P7BMIc2PfpdC1YISKZIDR+ywouKY~mIe zEra?cMq9bJv@;Y>2X3G2yL42Le@X~YmURaLdlum701&o+BHA+3_11)AdxuYa)`?6e-V#TM|PhwaPs(K!ZK}d zw{6$?VP`Vqay=dH4%}Ed_w<&ZGnX_0XbyR5kvXgRyW1bX>%-da;xj*roIbe2QcN9_ z11gnT*wuuI$5P`B=O9I?{mr9r500unU9 zMz=h67r+i~>{0nGZuVSuccS4-N`b0r8;*unIK6N~HbkV@n3JkkVFvN2A@rzHHG$c# zi0&B#<8;ppNBKkj-qhbv8UHb};o$|N8L;Us{nCqHTsU}E`2=PtG=J|IN|VZKsc#m( zC9(&a<|jRbBrto?OzD;c*OJmLp(}qY^)0GYnMvwl7858RJY7Zt%A00Z_A?8m8_&ns z{Py>vlpHM%-MIjn5nJt75H+}G&z?24KVxzRJ3L(shTN_^@FLmF$O(3lMabGUom>z? z>j0M|8gnu6kVEw{W$36^_nVz6*6dB)d{(Hx|1jskShfC|>qb(g*m-+bwLh zIg$>i*zz&|%nbkbzy4W?`~NaEGi%g+Shp|KD^}+YXn3*z@DRox>&YDo4EuK&l2hqo z^;NzfRyk)hP2}|G5%wTTmH0V76Z7)!P}C?~NWoAsSj`OvmQlx-QV-SfF^41|=e+}> z1ffFYuwNoqDzC5cAS~KG@`q5+ObN{{8xhb)@JwmaXLz@E`db0MWdSX*nkHmgadC4B zsK-TS6M7g)4P+kW`U9JCRlEjl!ai{M=Uf#EDH$5RNSs73IH72v+(_ZQ6ffSdOPW1q z15byu1T73iCeCLged(OmT8^Bi@Ju;HMHkA1FlN}H>hCymfq^096M>+EfGp&u0Ey2- zJLHU35)$`Ud^D&C5V)^614-lMI%0K+8^Kwf*gl}Y8Fv;cckMbLI{VF=u23997x}7} zVR@jEnERG}`_^7%PuXD5RUYKFrcuBh#`K5y9d|%4NjRs-FX71Fm6T{---?^>J=a?9 z%O6#HX3PmFP4k9fD96Q~B5__sL$fiy;6@c`lVrC*zqNv~MOQNF(logbMKTXX6ULUv z?Kr6aLE^+y=bZ{nFDUz+J9xw%O8inB4NN#^aHd)pc98SRl^estoc0`-%cUb)lvmjx z@-nX|C4ls9W@aZ^W44WM?a#7_0@{eH5;SmSU9G1?cX6)kKx_zWBH2gWh1GxvqkeT8 z>$dquPpvCm{yp5BCs zOKJVhrNcVEMgW(v^VocqR|EZ-Sh!B3N0FhNj4ZBZRn1-D@U%*nW<_55m>dY>YYbu@ zQFF8J13FOdQB%8UA3GyI{ShZ)Fo^&W<=7+s!!Q4=zagEm78dcGx{5C>mAsRdJmJB& z)3TXVGS`AC1Y@o3{3XXYDDNxr;LwS1mNFI)3uhJPS+pNwSpPRdd?ls~E1@_TNjYf% z2|8uII=;`43C9L?Nsvy0ZXl9aDGi}6KFb%!>z`T%f&9yLSz4Ob zH}N9}rC$QkNaM7_4iv`gnwZ!z2M*$HKC6F?ErkSU^aQX59?p-Og zqLV?w@9){_x?gFh-hKO86h`*#&=(UfxkEc7J(8VDYSdw^ckAE1dk4hs6BYGGWPUoH z(do}U5YOy;{W~xg!i{n9#y(rVuorf!iL;I@!GfEst*n|u$ePE7DL*7H3^VcWk6&RT zK-*0iOwX=F0gEW;KIg7A(LWYTd((9C)$}~uCqCu4>-&9hVwvg}!m@%MaPQ$bZO`pW zH)zxxPR~84kaBs}NQ?N($L(@LGbU9MD5841cS^2zEBL9WrEjgKGZuGfx0(P#3kK); z9xa!{LZ2;}VVGA~sKm3!+cCCjIit4@utq%&%|Lzk$pIfiCZGFm@Skx>PwUdYZxmX$ zR%)xJHgH5o)03%lIR07EKXSgYk|jlyoURA|@>t`_dxw5Y?wTeGbQ7~$4i_Ssa`m8u z@yi`mhzlfXM&Qwv@6AL^2=#Dal@|t9>3zflW1GjFdZtK`WVIt5ZiEcxz_ro$w8#DRB z3%$*2xkJT)6~=5itb6y3CX&ZVJLgfzykR}1hAm|jbBTHpk|&Ne0zb?uk6_SbADjfM z(%YOxPw-*?m*@P4!l0(D`NM~o~4I;JfsqklU$zW`uS z(cI0Y2n8@k1y?GOdP*H3faSTJD_;1_Zc>OK{EiFDLB3EgDOuQkhyuBa&z1%88s*Q!rHZEli{HXAZ(4u?AdO;y1hJ zvmXT5G52;lagJh{Sibf>Pe;})=Yu$)LG@0fW8 zZ!H^R6UfE3Y^P~^)C_j;d`%FAA*O{g(?QzOLoWsCMh>Sj`jfk84EF8ayMgy3q46X? za<`2)gaoIZ^{sX8XvrGldoq`sexR2vVo?Y_bZMSO7biaU>N)FKBrwFSd1mJH_o9K~ z(hhaOKlvaBT>4!ugaPBA`yWFYJCMDn+x1Paf2NE2aM{JvVlifpxRB3ehYb(m&*-4oY>;<2wI%jhP_50+25S9cY(5Q z>)c;Qqpbp3hhJ*pJr=8_x8XVF*_`=Xmc~%Lz@rZA4+me!@7jDX7+(=64q3q{#ywZY z*rG^&*S3pWwpt=+IQ|#f_3YKLm_GXEMWg&z1Fo0EXTOf#R_ zZ4$JiU7ty#B5yTnsoDgwvX6eivlu+#EPRi{c2-|5+^YY^KL8i3ht;%r3;!D=7q+BU zh)<3d4w!s5XZk14Hxd#+=O_b>jJ~|5!t%qUN_`$g8XAoLkk~pJg^)b7JN1Zz4XgYx zXDp*Y$n2AV%v-4YJN3p$k{OfQ9i&pLs)nnWB(D7u$eA<;V9C#<7+tGKS9yKXj8VaT zNRKPctuF68ou2NlH1tR+JAVAxk-Q!>zs;(wlFL*jhSlN&GbReK@|V+Zt@|PAg2u;< zC1D2Tg_XJ&fcFM^*N;2fnwguQU`oR-)0(9I;Ha8UM>DQG3LLm;e?UO5!fOrI)Ey=f z)XZsZ4S97Q+Cy~2T;ngdR|wPkn4K!|-nZY%`f)A(ssSLq43_+(b(4?0;nGdMyfWy5MZ z-$95WH=Hk9Dx3*FBuQ_feFZjjBo!8&i}LceP*##Ue?wxhlVi6lqmy3a?S(}Z?%)UD z-~Pn_tBm;}^?mQRab1s}Lr8fJhvpG~nA+Z6Z@?}!-%Zb#)a28d*M+n>8!uh@+&hZf zYg^$<^=P*D$z#Zl@Ws!1VS^ZbCjA;W1ppLO?9YK8Y!-Nv0eiZ78raS@&@qd&*ptQe1O3+p$BDToob;D_;F+sH>|h5t+I#2N1%aHScRUTk|BxhNaU)CkgvvPg-_f zN`L`7CoVhN-nrnhmjR+7j&?DJ0)=9b=>6yzs}KCbDONR%_&>K#&n-&c+0&AXc9PjI zBuWQ>YzH7)d0ac&!@vfn&})+8MQQBVg!6PEyK6XJil$+vZmT zZpq^S(5NU%r3=z3@%s6FuwV<7kQfr(|H<>V$?>ee<4GS!$|NZs+w8S3J3x0)t9w9z zS^ggvoHn}pEo^{Im)wJ2D^E=G98|vbmSxmGbMpL2RW&Laty??x*VXOB-I5#ds*&W| zf{7mtrJ>w}K9o$s;M7H!OnOw`X{)GeV)C(UBMo zo64dva3L_4Ed`>jOS*4T+6E-J5%(VauV0=Ux74O|c$xdQE^6Y-+yO&t|G8VZTyrjB z^nLX_2fhn9yswR6Pcxbj!TyTh+?ehbY_dXvSyJbv`6#$lt*p+UPxp*WH9T$kMy0JQ5| z>}ah-{Nz*K{{ea@`D;@@2>P;ex8L*j63u&C?Yp1Kp+s3sC};$i!_c zU@VzF;tm()P{i?|H4odbIQ$f20l%v=HgONCc@#UrQ9rzhZI_H(kGEShl&=T{xUTl` za`;Ql-C5U`9!$IRdwVHl@z;d$R9!#dAk-`@dtk?FcsO{-Rsebi%}kDKB|>QAt6xk_Eah9s}~+Tgtu8 zXR9~@Iu`fnF0ml+Ai=Ltfar4uJgP=qgGfPptuK6s%p2eiqH4kms3P)FD8ONzcN_27 zuk5mQ7V$un+*&~}>13?mY`8*U4%)uVY>~AgOaAz3QcmEuAD90*djH@58ftgRS~LHr zx=3<<{VEtI65t*UBErLeEW0zHZX9g~HgAtvce!3$TJ1 zIv>dPwkOy~BC>z=0tfW(A{GMHGGXv4kKBSPf$2r=NtOl^9Zo+vqyb*!&SbDEk5+qr zDQm(ZBpbDw_?b&2er+r(uEdB4wfD9PEd_msvDWleN3`5JP)VL0p)u<%orwUpjK`WEej|4C7l65-TJLF@Y6`aqSywQU z4_)NtVDb>?`q1YZfOL<#N)qhu(dCKD@A)OW4iuRCc${(cY-CZ*yuE(bzMbwe^gVC5 zoF;Pr=bB#x_NWCYI4zQgpVJz!xo%7*(lp)LqwM5H=wFguHy(tf`7OiT=KrmlfBjRR zKO7P@|5c(qlY}mu-;IvxXR%4Yv|mvVbLT=)N?5SK?AFG%F`Ea@9g70?9&2F^I;-;E z%J2MrA!!_Xt+Q_Z-6sH8=Y06k00WZGrA}nF1NBK*F0Hn@q68u|=Oo|~w|&csB!sUt zgVwN9ar7w=jdnk0zQE*6Z1U;K8t!*#R8lh!%$NhJb=RAvgV~cZH|3|OQEd79-@`XN zpm{J-x+C{^V9;yWu-ttn37~%7V9l3q#2&g{T#6bv#~{DGgIZ&qCC`-& z>X?3TWnL`*t>QE%Kljw1NLxNOjS-b>6uF_R(X4bffT*M@+~4QsHiTaE`7BDYkOU@| z&b+iiHojH8bc%;?YiQxizRgUYx~lW~%;+IRQOC`AX>(%ju|}64f;aX0QYqmq>(#%^ zru+@gFl=!G9S!r?fIVB_LWA4GNbYOg*!6d6NpnAxf8@^zD|)_m^uW+x0s)`J7zu zQdv_o9WC>_;$p3{(~t^sH$s9QXMtQVm8LtjFF$X}^@jhZiukYJxIc({nG;6=Y5K1) z)|MUw7QK_(6WUR^DuaN@M?>HFQUcA{a&AXX@?KEW#<3p|*qkm8nEwHWoa!V=BZbpS zFaB*?Zbdt=qhha`YB-6#qT8WW+KRGHhF(NBGozjB(c1gv1$165cqENwKNtObHwTg` zGW1y%CxM;BUG1ygSh;Z%JKhW>jpN~DzI%3dw%iWtewq9Z%)NJCyr|e8_lVA~hg76V zH<<8>K4&=o(HxaTzvx=PG4D@w<6C)!@xT)~Yuh|RMZ@WYIvJA7qMCBnPR(%L+49vD z+>dSiRY7Yo1p~{YXw$im+bmp7E+nzdD}{|=OgFCX&~``pY(}4|kE=?@?eAdU#o{I~ zm3U9N#B*m(S!g>}0Jxq=f6RSjp>%pjNtR2wK6=tP8p!gF*Zs+` zL*Mxx%?B5X9V=eiv}WM%1%G%IzE#R?S1SWfJ8k=!wLXV@fEbk48%boY@hT9h`zYAv z@RYvPjE&z}{f}Poe|1+}rF(Ff%%qLlbnSY{ty#okNIE*lUp{rPeyNo`Jcl7&p(}sD zSeSwVB(&AI(=dg!&l0O>o5zk<2SM6EJ0%wZG9OL%*y)Gd?E~sY@)1S{)a$Gf2skKt zgKRkNttL-jQ4(jxXiHZmSK3@0D=wobGXH_`Ib{ zFWA_)0J{$672&?{w&yt8#iJLG-;UyOefs7P=$k)@o1}*ik4oh|CgpV4bXr@( zm`f}vzr4<1TnjtA*LThtWp0@Kil@vu633uE)bsyi?!BX`JfEmhj4csS6BS}5DvC<8 z0b&75EP$ZWJE%0JDF_PEENCK8r1xS0q&ERUss@p+ROu?ciPAgYo&y+@-?#4l>#lXr zT2X@Vp7%WOJTrUt%cpu6f-^#R%M`;GWJ@?mNg88#<6cO2mUT1_L+`bzpRG_eBe zVtH-i5;87tZ{_M9JL()zk>lK$CSiQpZ(WZfq$gOR6IPftRE4| zS^4pvf^<$aFmY@D?Zxc(fiAbE8l*xUEsHt>5LA&(238Me0P9g#U(WTck!27rKxg-# zE6+i10GFcPg}eP$T~+*0))p&PP*<YbW>bXw8bl&k}Bj_6O98%jvHu< zvn4Jj<~lli88fx#v~}q;u=oqEAC~M=B@IN3rVFJNE$^+BK&MU&+D~q-4nqK=^Z3Bz z#TG?Kh0shl71pU@`!oh^C1}n{34kZ9c!Zovv2HTZzeP9!Zt$cqrxGp+Zl1co&RQYG z=F4tz1a!tJeS8<{sQLy+gt5ukG}aD#uv| zxDH7pw4sVTx592fkt5=wlWn9Bnrl1~{fUZA^?WuRW(tGywdl?Elj#)yt^6 zcKz%Su(FYpF$p*@0~2nu(UwZ}Z-f^*x`qlTfyzs9iqu>T`5eRnyRdkzX!bo}WfxF5 z2mo%u%(Yt3L#q)G>$ky>5&Qv>nkVZZ2>yo>M;b`PtGLT@I}woBu^Yf)x5>@9gxNIM z$c|KM!5c#DbMF2~i4!MqQ0r-^ZArZwM~ONBt${-G6sCFVoJ)~HCe4k%E_`TDIZakp zmc}eGR2I-faPodO=Ux;V4&ar*4}Ono45%MmXSW`jg__$jEE`K~b|(Q1%<|{-SOfdQ zv<~--0e8@mXGE}(^gKRK7BEO`w~9R6qW!GD3V6hWM&A zvbSJ53P%Rek)$RICD<(VLB`xdg{i&IV*xWW;h?xPHNrI#yGY>ko;2zPA3=l|y9GHi@54!E{g7bCAARBvy{|9}{eB)h*x4oi5B zhFR=EQt?2$%_@C^cqJAPukbJr!9Fg0E~5ZCfxr$%mEh~&G3pQNA)mPq;l!;A6OeZB z7A;=cJ`c8S*uGAPQ_=?~?s4MSIjy#nAb6p(OMwMFnwbtoAn8dw5hSbF%5>zo&_T-l zV3ntZ768S0N^6CTf9G>(p!01()6sF^zzToTpv~AYl5-N3$0>UEQOwpEOZxrKUvQL> zRM5KP(?|CPz^z5zLmU>hLR$P7Sk~!qG}=}GVa4`FVfu9ub4D{VMM)``#T}vG3}| zwU%Epp6Br4H6z3mi>sgi4c-^vV6EF_TBPa&hHBL(}i(qCHPb zBUn?uzFsB1T<%%yoi4gi<&}CX`w7)AH`&L2n;fs7RBcZ<|F_c|kI04SaPmZJ6z{;8 zgUwjOzAqWG#dn#ZE@GU=lc+h~U%}UJknj{`HW4v!y?M zkY`b$Vj_W z=`Gxw^zrs8V+?S(kC=I1{*pPr1-ZCUIX{hGoVl~6ywzOc^S|hnoe{D?gb)MP)zO5N+Y14>w;<3Xgqxg+uH1vs?9@E>|{6)qno+Hp|4St2bE$ z-mog`$Go{%*?em~=Z%V4Oj9r0J+C+&jyssuiq+1;cMgdD_+pNNq+xPfkc#EktUS{~ zG$=NOsgGYss5X3|ACtv;9_UA)Qqx&`?*8z*7xeUc!B4fIF{&tia=aUXP5|)b{Ej7| zAQ3B(Ud7d#RRt}srfWqfTjb_pBH zJ-%Ft3rvb6&4r`%kng)U@k{!V@t?0MDk^?-$V{xW=+KYN*%X+jDhxhUCLT;w-;;XP}4#SV*<}JQg3hAGJKZmN0U{vaW5-^${ zE%FKheFgim3F_w_sMPVdY~oVSiG1m6{_NvnE6s3U|di@NDdFc&uT#N;~}o+6vb&hBcFe|E0tLM$ZJ94+P!A_1E_&*T$>IX zNcx=IQH)=cs&7ApN8yb5(}*v7CO+I;+ykE*42)W7kXY-LVhx8l++}3rjXY7{+Gkh| z5B^O;R<`VyNx?Scg7y=Gxq@k5?>UKFId*TQE7nv1GAovpH>25Y*@S_joSYlhd=pA< zVwl&B&EtK+?LH~TzWwa)ei;228}GI$!g{)<4pecak2UexPZ&Qa8@Dpl+Kx8H)mDA) z?8b2?0>{>v%FyGK5UhQc)x1K)+7gZ+{qI?sd3jEjikTvl!$m%pJvsJcXPspE!(o`i zv=Kc~rdxi0&85G8ZUYH8P8DQzL_d2Z9Z=}pIU;3pRUed{@el?D^H z?XNP;V_&2aFD%G{e?GMk&3}10D5v)Lc3W~nrzd@7? z+EqL;!>EN7@Pzr$_OblPto|m*+t910r>9Jq!$tNLYV19jA!>nrC^e@$xc!c2H}TcM zW|xw*s;aLDzBF$S33e)-J7?|Xw+Dx#CP$+5EjU;Kmm@`e4@I3!i@L% zhZ`GLUc-#t@M!&{A3XxhZoUDbwG$PN@E4zxxA5^5ZSvN40w@UtT&&cOE1>7_1ZT7; zUh9e%Pvy2(35IKKu1KFSef;s&e0EF54qeV$dRa7exY^qr`>+J5GVtd4K#Qmqf`%$U zuj!9ECWo>`w2Sr+s(czo(Z_%3$$i_wlq-GOj&2^0j>s30Pm27js;Zz$!OfTQ<&YYj z*I2Lrq<)`}%_|nc#(uZ0>n^@xi7S&+)^b-hQw+J0CNE2+V0g7enU8@$d^xmt?%uuYRGSU_+e4lZ z=(mU~D#ZzSKu~ECBWb~)2t=Lm8TOOutcno9oKP=`Ymr+^ZSf$pp>|jS{Vy}m!u}$giJh=Kqlxax2_w6)9~|uY z(spOBy`~=*HQMNWvS)Ilelic=^Qcg}#-kUNYL0(p9R&_qO>5jVAu7y0opD8=$Tx|`Hn}Nl!=FpQ3CAIRyCokH?#EIz-&!iUIe8+! zLQT2d<}rL7&$aH*z#9Lpnb5m3k4PTGjU4LHXm6DY6&SkZ>> z73XjH`Pgbl|M5bJuyP5M?nZpDT6d!=JCDE4K?MysiU` zK}9aUbp(DO2wF9PhO1^C{^o~8cT@*-D|l>ne?d5zi|C=7K zf#!&uy`|D8U7t80>uSmtnYa|P7!<_@XOe z>=Rr1=FkLWm&16brR#eqn)qzaJO1VgN8n?eyM@AmqReJR6HJ1OP~7%2Z}waWsl1Sz z`557>e>5I*;rY-fdy^6gL7x8IAlM6`LhLtt(eB^$B9pZ32hh;cnSvi6&&+V%_XO({ zKE+T>1>YW!8AAr`B+i?2bFr|(ZcsIeH5dRsk7}!Z9dlk0V3kRoc}o+*E1xM>L2Oq- zbu-+5?(0=XHR0EA&eWjPo!y){e{%YHkQap~F#3AU8;=Sz=1!dcmOB7rTcz&xBScf9 z7f;=MeXs zTKeEw2;R$GP96Ml<}n|5zY$;BMvL1zd7*lOVIU{0oqpPI^LdogLzI6wF2$BVn#&cn z?9c`b#d#t@<0%m$`D2mswv#+-_sr*B#in}sv>|@u(S;(R7N4;%cSQ7Kl57Uz{G0CY z{jBR41B%!9a&!O+pdSYTQUFXY(Oml1&`$aihZ%2!>Hqq`rIDgGE znM@_-c61S@0iJ0A1QinI{ks7Nnr*ikt*-B(?Mj%^zSij6It?7icZtx)J%Ost>M#mr zeMzwntm+%Wh^*sQ$>EkQd+T$s7^%Nc-nRm>H^Cw$DDWL)x4Ik}8d{7-*o_lc`my9r z1lLZAj9*@RtuuyobicGsI+w-!ro{B|E~H7%pH^Xdmp%!fX34NK{yTd*o-iC)t`rVzpMJS`U}6K$;P=p# z2YxcZI#$Aj#B1ke98$s=O1@X>g!Xo)n0#D3j10#QjASERS{_`x8^UK3qTU6^VQAqw z;=X=NzU6w{EsKi^P4^jZ*1 zVO(hgXhB{!m5T?Ro&ctVgocWN1C6cJ_SOPI%DcVF&;yCOR%(B_IGi29S-LK{1)OI* z#BdRaJYv6`cn&PAnZ4$U%IDr#{WTXeW>I3wWh zf6@jwN&u^OFnw}AkYx@)ix>ZEMIB#P_K7cd&etj}+8cfX{aLCq8RxKQ*n5?qqP_wm zwYW%2ikh05hPa>g)RT_jmPSmPM$UBYoW1*X(W7jHA~IfurSmqLYxf zZ>Eq}0v?BTRWE>PE{s;CcvNXEF#tHpC8E?|S35@=p-L0@IeeJ!a;8{##;=vH0ou#rykC z0cI$*yM0S>f7$!>UEB`Ko7m--U$XSu#0!uwfNx=|iUk*}#cb{N{Up;K~ln|@qQ3#ZVQf3i5VRD!;yR~U!Qz4=TB z?5hCyd*Y+4c+^L$D#U6RME^zkUTc-siU}F^s}yuw@U(gQW4V`tHn|p}tg#Ut9@RBg zgSEp0iRr#T&F;y*tn!MAp6U}l?tz9km;VkciNn^?hJTT8B7%SbDxpm_b<6GGP7A4g zh0-HmNrRz9+1+m;Oe-o2pptQD?%% zAX+p5bB>fv0IT4zL)?;P>R(N{X{-ZMrYH>U$@d4 zL>GUZZ2N(}!pm*BjRD}xfw-ydi44QUb0D@{Nv|n1EK&?^uox3eXs&x)npd(Ov8o3M zWIG5$MC@?J_NQba351sktlR}lQiAES zkWf9qJ?c;nliU%hJX8048A$@TebJ#_rcHyvAj>Gv(}K}Td{Wt$Kkms}Q&!_6rP^_NOh3JTE*e7r!j+%3V4 zFpcF*uYV!32A;$Zz=aoMwPIRYT7<)3lo#z5CWlvGC5Y1#LRb^8&6TRg3YZ`>43|0R zE^3@HYyPgV3AXg1tgTC*r>^f6p6`+i!GODws^#iKj7LL%gzvL>Rv%KzLtnf2FhZeM zAdo%ddGcX{DH&QBfLuyKer5vj_XHqZCNJ)9vLeL1Mwk%8(%h2Q$eo3+uv&Zd!}YOF z9T6^5F7YSm6JD`P_f#Pgx^T4k1{%&6dj#VVYI2e8`FrWfaF>UQ%a<<~0)<3KJ`gMk z9!8}A%2C>Ok`?9U&0qleOsm6Kx=k{A2Cx*Yvht@-J7R+-mv+rq7!%hY&St{GU=K$1 z(?>4_8vcaOqLHM>Pn1NUA%4u(HM_`qAdaj?qFnXrM>`=<1meXF=%Ct(prvBo+jP-sSpqt`Xca^s!V#>W#tzepwiy|tA>6^Ia*RYoZ>r4ih6$hOE3iSrzGm>hD@ z2TzE1mfMZ)!9q%g85`I&s~t9IhAeC~-28Bld%6#Qg-Tp0505LctU1V$>%;XZb3n^U zU};2@TuRZbyjOs;9>~$+bCMDJF4|34A#P2*TwZ_4*|74K8h!R~$y=)U`z<%YD72}S zYu3WsI%DU$JgY#XdLu})0x(m9 z)szdjA)Yo;78L|k--bdUcBEMCFX79GhlJ$UZp#0mV=q=kSONjkmq;Y_;avIHELLUB zd;H~_`+tdl3fv$F0Cy~IV*C`I7jAGDNDv;=(XcgmlChT&v77I5Me4?WMjlzXCD=!* z-E1aEF+Ql=uP=G=4P7^|;t!vG2!>V1&(kUdxJKhICkPmM8vbov?p92^Ac74!-Xvt8 z?$s$6q{v4Q@!mi1e#73*=)=H)s_lUa%`+*FZaF`|c^;U!I54lS$>U{CgF+gLyOHOa z;Qjd(uOKreC(UE}V*0U7{l!I$78BF5E|BXdVP)RoXq7rQF;bE4mRx&;5`fQ`#~JI7 zvMInrsyN%==ITm>OOAY6k1P6Kx$w5iJU22F%pp*)b@9G02PmNeC!U=3I^yZmH@HDJ zh_eLJqeCdbF+#HK)poMQkMcO6=-x8Qs+hm9& zS?Gi9>>cRK)>ggp{>&W$-x2jz8=I{b>24ussD|ybse>pNup(fXzwJZ%l;PVLMtSNP z!DA#&hOs2)p41*1hDXO>gNYh}wCfub2YbP21t%m35ZMX>ooxY2*wd%Sp~f8B7UZps ztWW~90|O?bX4-}xPC}4U^}ldCBKg=BmC_@|K*kO1lWzdhrLV35p?>}$ILm6NJPCy0 zT41D6JBcfi+#3jh^n-Q4?_|j6rl&-~e7MQI7n`JsHa9Ln^eK0rA1ZHd2*s>*6#~`z zagu>)N$QLGal?>m)eES0oCML2I4rHYN%7q^O)a#1?>iG2 z?G!dCGCOLhTaU{R+~i~~SQsy>T5vNy{u6z{frkF;ulmns)j_2UyD_a;Qx&n5QB6r! zoie|vKW&%aO|OGL3D8AD1y86U@IJR`7|+?JALl5qu+Y@vWLhX^O@3dru0n2~$Y^De zTWj(v!{_TL&$O&By<0T8I(j#HD7ZomgMH1mnudLUbtbOWHkt6h2i_64x=c0^sK7m0 zmdTd&9mt0<ZfodT}vu!tiK}L?B4Ym9@d*)(qdv2dxd%B&K{$K1U zBTYWCO2}B#nI8cI2+!JT!7Tn}3>mA`Jc**}tPPDadz}5pH2;hw zQdYcHm`VIYnY=m{4v=;8KOa70LGx>OLq7e*V6z3&ER~VFoJjBBc#&W>hkC*XfL0o8$@Xdj8dZ96bBDrck=#YI2j8Jhn_eF8q(crBrP?g z1wIW1MP0@h5nDsn3>q9nY>UC%-&HWcl)>z`C!pSCcG?uENR>X!cQ1u?pptNRStun5 z!VC&PX83{Zc$)Q^Shc&M)fd7d#8UAid8Oo3D1j#Tdb+>hr`K}=hA9sqj|`k;6tf*% zvWyJ!*6-c`*M3$WXo&CF1`1yJTvLN&b{HhIPq3dwXl4>}eicMv5H(#=1z)GaI>JeN z6MnB5z-fm@hV8zdHyg+yQ~t@Dkg##~n^{j8=~`l~nKF5?Qb_XL$F+sr)hy1NVG9MW zOn*N)Z@_Nxziz~SQ|B*OwT*)>nfV&s)5o;PeI44sm5@EoLN zYEc?I-M(=alLBwKib=t0<2UPsQ2*+IqiXTg@yj8i2VF;$K-+oYW8iT{=X$_%TZ2b! zd3a~7QsXcpe@pbMMT~+iN?{lNY%ymnDmnWQ_iv$`?oz{!W9se(z>l{)Z@8})YX~Mq z2shO8_V8jY6hqY?B~2hA@GBB~_sp;{asX9UmVr zQ9jYgDI!X46Klu!P9^KMD)}=D#eXe|+;KgZWU?kV7|S^%YT@$A%HCjqgozr8Ye83q z9HP8ecs1TgER`ES8GeHZcl=1&(||k+VhNxql=^!w;=kUJGL)ON1Jzc3|0cG}od{0a zx|WiE(pK-qCU3;UEClNEHdT#T#}4k3t3MXM6TM*N4$b4BK<;U)U+Ij=)<$8aAXyu^ z0;9ql9tPf@@q_Cp*Y=UG8|=L`v|H^7~^3r<8Q_`Q)}0vht7D(X%Mx%(0|{fgRL9! zos4$Pds2e<;y^FX90)%0I;qh~+_+Gvh1)CzuBrJ3Gw)`L6mSEf)1R>w>!{eioz|af zhUTaRu_>FN#H0xeK5{RSnD&3n&UU#E#-3pDrqlcJ8Pcz3?-jrh`WqvZ1|}q!Jv5=B zE}^kU*;Qy!5TE{V$azZEH{f`@^#sW&W49~Z59*pw#oe{yjNridO!P;_rzzj|Qv|lQ zP}>t{CH)lCIa(SGAzLs;O*9HU33oIfQ;wEc?UMX?8@cR?O)M2r?>TF%X*^UFzHGyPZmzAbLVl za6O=AVMaKxl`SPQ4e|LQy-i!mF`TXa-Rr=HscrK2{XOkZeJ&S^1{!V4BJDI3dqT}Ce!r%QS6Vt9Ew6YmupHW{buwzqGC|*lh-;|ldjxx4>ww=A`4Q&Ie z{0+pQ9O7=VW#$^Tt{KQx#A+!H9>_s61)Tfb)lf;JN=h+I$|-*msrZXhGK-80XW`fL z9yoe4FWB;}hURo6r+!`mN$T_3%&>YT%V zDP;19$MJYu1>zQC=4)18(=y;5`BuNrAL#cXRy2qJUhS)*IBipJU7Lkxk$)L03 zp7Wl6*?>BEf`b-H6Y+LTl;dK?iyA%noWGvj)Apnjy)=Po-#9F~oUQ8(hWD1OQPPWW zMUo&0f1+nUPkOCs>FG*TuEedb;m6))P^}EjSiwN(JObM2lQem~LdRvKoG$Y1CAX51 z&dDu>iBOHthoVMEHkBBxQJ!-fp{3SvOh7(WgWPerZZNH4eFH4ZR1yD)TPc6L5`DqN zGWAFtp*+V(a#8n)`}-V~D&3R~bI?$9s-2LXZI%);y?`#{4@s3%>$iK(WzIoyWy{? zQUmR%Z!cTd`-}xFD|Jun3#7aUh%v7=}+{Q zrk3(hB>DxKRC8$U)3!$4Ywo9K$f?-CzG+rEktpq z(0_8Qr3M~Z5rtusH|y>^0q$lb^m_P_x1R`()gXG~aAdJXV5BI=CN6)9Tc*3u*s9So zYyPr?$%`MBx4nz3mimkKb#%|qv;qG0dixS6eO)6k8rTpXq-BvcgX@;^Y7P zi-IY`&-~B#1G4_V`@ZfO^o?zvMhPX!r7Zt__wcQhcdSxR-ap-7HpRP>+hfYBUCDsS z|N0#b+3oOj6q=*08uAidli`M$Y?~zi9q91A1I#Og&ucy&rQZ&l&Da$5<-cCfe*ORd z_j#Ti8}*%u6#x6ob=PrrSz1~=>lmoC9z?(-+sH7k_@}1xuMeCNsyWp7Gs_`9f;w`X z495dEE;ZTi#gP+tt}f40c1^LKcaK!!zo0l8j&{ua>?!z8D0pn_Z2QUDr@@YZ?3`ITF!14+z8uKwyXcyE#Ye4Ar5Sq6${tw+<&ZY zTWn^GH9lojsPV(9qC02nta>Cd`ETxQ@~@RbVCgL1Y&sR1xa_&uevCT7%6?h#O5~30 zuCj;Glfw^A{PPPMWfXs<66rhNmg?@?^yE#4vnBaD2is-R-UsAyc<$NRmT>r0M&3jj ze_+~on?XZpH)8gJNqRelHPcU7_vPE|B_-(=mS@uCgL`VMawY8}{P*l!v1?shs#cHp zhOH%0p}b#WZThcXC+cka6@7P=u=(#q5WG+O+EhJb5e$e9_wbWE?~==&96Hu3)sl8^ z&~uJlF6!OiF)%7C8-zFEIKRZ}yJZZwFtltNm^b>0^B%Y9)SjfI8ZXa*7TYv{Dmix+*uZ~Z#;A>oATZZN;^UYDnrhG zZRigR)nD>o8;IVDZXmi&^pA(LPZTlk7av_JX>|su(BG#V zTSm)j^H*;;M582|+T>-E-X}Z8o6;xHw@jhc!}P?g^1l0Z`jTggAY#h+ zfpwwZzPQj=XFKLe91kiyVHT=OzwC56-hR>FID>O&JS>~}yUl4U`@6%yURMSdwsm3< zD@;sZLLQzA3byGV;xIkvlA5qZU95UhDiztq&-GXCT_z(^LN_e_8A@PXU+ zJ^d!i8k{-CL-#zX5NKj9JK?LycDYh}{Pj)vH_e}~d*tYR^mJcy+S6Lre=eg8@!bW( z^QR3VER{=y#bd^V_lTHk@6bJ@iUXQ?Rf3qs?j7|95BDwsY1OEl3+M=Kzws*YR`9iJ~mkskz z|Bt(%JIoN9&J&}nR_@WZ7?F24>C_k2{y?qTg->QDZf-Z-+&pRPx~J!Jo>m3T-rkX| zA7@=`T5>!4nt`;RHS-)b-0{D-Zurj=Gaoo&gVC>^9QYuNO}j_rf)YM%#a(!D?*)IK z5N1y9Ol^8pG#D0oB1+Qqp*MXPQ|%D>?;H``Wq|q2^#V6Uu`9k8hAkgz>6p#^LXJaK zP<3p#w2rl${E4?srJgzX@D)~i-O1K#ZO&L4VrHy8@VmQn`=8_s!Eo=igK*|Z-QyaJ z=gU$k$Vt09sG~jG2aY>ctK^}F`unF)a+hVhS_!`#;?7JrHucgCTBV-GL(C~!6S*If zN6xq)I<oD(lj_ zm1e0$?S;P?_p5#HW5PMwZ}N7q`0q0Q=@>1Lg87U|t@_{PsF<(tS?1l)?#Dr8 zbI%FL3Yu!;F?#pgGbj7(2s@)1WsqB9bUlL+9{#y;Ti5GT5kn*XQX`AM)rKBV|J%pQ z!{GB$wN!UEefrBwj!mOdrnc0xfVl`4GR!aPkeBsT^KCyQG%8=AS^7*WYW+XgqpuD$ z%vgfmhNwyI)>w7fJ8;V>(IO06owBS@hkYPG2NRE z5aB(vzaO3p<`jkhIhh`s`!eZt3E5_H+ox=gJ-u-Od9T}@G&K!si_RX}eymJj%^#IO zN~;s)RX;R!9e(X@A;j=w|6G6NM#ht3QfN|D99KNhh`qU>`f<>5HVq-hp1*X^{pO}+ z?0$+O+JHU%R%X=?cfj^IMenCrYlgTl`{zpZl}5}h)tBvt){H_rlS0A>)&`hL)QP~1 zo_BJ_o3jizWT5(+mb59Jk(~mo^xoJvNgbouUOESTfkaLMyGil!{QJTg>wkK2t4uYF zL2xlecM?oODEPJx9H!S@9^YLUy?WQf$h1MXdlhAOq&7)ZEb@BrOf{;FF0XXDLXVz) zcL^bzhMfrSQheM0^Dc+*%)%3zr%<6nbL7~r)*YgSW4kzv+w+s7a|AlrU+#dcXJG$AswV8lMk zoALZ2;T7(Cxt;JV>#Gsn5$pIR-`aoPl|^gz?iWdo3R)8Iox^dd`+p5sZ=J|uzPYw5 z{!)VlZ*FcXwUZWDuA#_&xiWrz8*HZ|s4#rh&hyC$*7=h)k!=(9ZRE@uKDOrKOG%*= zJ@cIMRsVcOh4GYWn#L!0q0d>hx^X#@GVn2-1MWvw8LA$A2Ae=2M~9` z3#9krK>bkMb5OISRBN0^K*7PKP7MR0%srjz`-RCn#W((Q&y25Frqf8dE%I^>eERjk zt1I|&%|{Z=XSzVS^}vR9q5fSNqJnBs}9H|tv>yW`#m6htm(IKA}HqVE9%SChK3A7!mHs?v$6U z{4nvK%_t@@?TW>I{TAZdW&BtKw(bwbnmmr+bswHv(*GNq5a$vbaNC)tTXw?pKE$){a!I3lGQ(dWqW% z)W1+O5|DSqPRhFOjrJ`aUf$MNwe-+MEam^XR=^Z@17awZ0bcN|TWr_5o{zIGIp~gv z$$Gg`#vlgn=Nx?d?CvAwpljXyos(Lzdz?iJko zbo~vnzm$B~nHSZIOwTv~rH*+a=)K(Jy%g_et3B=^VJEf8be5a64y&NH)o(i6&#is? zI5t|Ho#|Ual8K319hAVEdwjKO?^zijKK%Z)+vkb^2-RUYKj9Z;4v=9Mp)st*ZPh*TKRSOV&2Gy zDctzybi4{Q)dI{F4KB#*jY#FPUyuw3h?p8r;ZJfC17h3{=Mi=>mNB?=4rpHGH=S{h ze#%3*=coz)qkPZ(6CVy7LTLO@09Mk67rw@?)Jyb4HpBcIVJy=4KypLv=^Xdo2K+Z z=Nz4b?gr&XDG9>+;@+Ri4cY0vHcl9T;XonX`IG8Ju0n=Uiy&U0&htOX=)lZM-vbc+ z25h~<*%g(M{8()UT4qyE)VQiGO-sF8u=&P8cZq%>0^_)N$KmZZCV%U6$gnT_&f00E zqq%2%^MY^aOGnOBH`bccf~+~m1q54TJ%ByR4Y~ouJPLjy25JHTdPb zN=Dxv8dHE)pKe9OR0A9Lm1%G4`qEMGuM<*iHSYmmj_P&1TI;>wHn)Jw4$-3m8(d3`HLBE0u=sqcIyD zui>Q;_-q+s9~aM8a}-&9^@y7A$3N#~GRTiG<|%d|V}U`dM;maiu&A-N?46@}YzwdH zbL#?R%>9Ae`^Ui5{1Mp1XPlXD>mYsK_iLQ>=d-hgyp#QlDtIN+PeK!_f2d~rlc1dK z(+1^~96-&~dq@b9K`#{iHbuaG3#7X8)+;YpMui?`upr52Z>|#|_qkaME4clkOV)jC zGgYe?D}m*&lQayZ&tWO^FI_8}t5%0y5w~{Q4{7xG!wF$pE}@iX#+JEu&wQvbV20cG zef>anf%P$tF)jG%_G$|LcsfBpaCq-+F7=ccO!_dsOF%94Y`0bEvnLJB{&Q~+L`9yr zxHx4I8u5d}Q=0<+ZyPidu8+gk01Us1I_(VGvrB1jY{GMmHwTvrGkfcYn*p1_|NOwg zNcb*&^vvp0>>MvGQa@oZK6dOf&q=IUoVC@={Z3n+5~H|{aA0>C&f>4>eAzx?)vk5t zU#ML=P7biWPc@J$>ymi9xVwFTZa? zAye-VuwrHh`hZEB<_rk4XO-XclEb1zX9peH;=PKZu;Giqo4l)5b@vX|$#j)^`WMt| zj~CtdS1kKj68{g;q$>kWmsOpM$;kdM%da(UQ#m@<|FYi!(n(9M1RrCb>ZY7GCp(n3 zw#EwU#=hU~y)p`I846c*rqD1Tef~AiJ#lU3|5>2B>!veN%}}bJgtX*p+{2KP=Gkip#tGQsyZPSSU{vgY2s#1CUxrM$mBt8@XTP3YK|F7ya_S6PHP zP-YO{99vhH#ZMUzjN6k+)R_}Bb}&`&WC~DJas{t#TXw2rDqmvShHPgFo5I~3DPOi~ zVE2V8oion&$^1V19+gt2bag{W(DE zRbD>F6z%kN7C(Jr+l?mZqzlIA8%=UMJz>ni&15JFnbVO%>~rp+jI)&eT0ZQ(xrxJ| zf(uB{gDJ21mPGk{g#^X)wtzf0zZcduPk1w8J%nG#EkjzQCHHDOgSbKJh$Tic!ZuTD z+C}nP>t^`m1Mg-Mkc{?-e_RmTis<(WZ<|nP_r|o309u{YH|rZ?h|3(e+>4Piw)Pf` z;$;@y%a>R@!4pvzv1QM`xPp;;WNOn$tx)A+&5O0>JJR=dcyyvAs1h;;#`)W`H6e>@ z?_<+DEWM*M&AZpTeryxer>>G@LDoR>(^0Gw__Z|)9K@~OZu-tN@Z|xMXS`F4eMY<9 zwh`P*CjFRM2GJpu3N{;OG_K|)JK(^sBI~4-JR7=R9c)p zf06#h@r=*4CKwKD#LbO%zR$Q$gM2P^$E*asJ1trd9dyUZMkjHAlr&n1!0h+N9RM`p zW*=_JAM2mkyQ9ff$GCR1n~K%c9!5hFN9soX{VjMCCqCV}ttW6<7gCsBMwSh$l0MvE z-eJ}}vO?B7v(?l}ks!IM0)KbLhHA`sN1o{@0#Jm3Lu&OYLAA2_6OB>{we}V!#qWp z()L%m;Yn%=V3yOk`*Q0EQN?HYyhwGo zko?IsYj-ilBOvd|=h;1?v1W?qH=}dVF`+Z`CHcV{bdqpFNlDbn^33DAD*bmv0z1l0 z+1DFE43hc`Xr5J+F=$cH=D+Oq@Q9k~syT;o{1g|O-&LKGmlPmFE}DOqL0iXHj0u#~ zt;Q5jaw86#C_;<2CnkM3A-baZ@H2Xy3efD%{Lp2U&5n(twRh?;U0bP$d4@?x{pCmlieqRx+_S>W{Ga}H5# z)Nh=ILKj*xn+pW%^U<%>Lk*2+Q!-p~HgV5$v~wF{jIio{NQt0-|dnw&*ml1IlI8&=7(a&2H<#7gBsIOyL74|H@7ECro$bPziV{y&Ru) zoVd)dAv;Bwll8d|>=3ORc@n9iR3H-f*=Nw1Lptb04q8NwS&VK zEDTdW9%_ILr;unYrqP@I*~3+L3lH8*6sh*xE0~VPOPZ%jHdm4bcLFZ|SlOm?{@2!v zQeU-Bt!agX(^!Z4WG)(lRiCceZ*ke$r23U;`=KppKX>C$#LOe>%0yvZlioq~oFSWg z;^_Ohk6CsO8qTM7$kGUdbnCXN7LP|actz3&fOb~RnW?E{w11#yh)LW2PAErIqPHj( zzM&aSqBMG7f=)Eo79z}VhdlSu?vh4%P`Iy;IcwdKM zG_k6@8xA>;jT5h8W(vPASv5Q~ZVixEDtJ%m|#HOjCvMWil^ zHL=!;irR%9j->B`)5z)W%+aXJOZoiHlCnK7yi zuh4>ZwqPIxvPEZ(L^U(XtwE_S9K)Cvb$W8Jh>~4ZE+?DGhAfVp)5q4h!h`RkVP#_) zHbFml0fqAMiQa6_0nrXD_sp@xkP4{H z9zz5MF`4&i?gB#u^6hf&-g9sE$OUdYMU>e7i2pCAdFxpUduCWHaw4CI#UMG{X$Px-Q??wA4>`i6sG_=w#ig)=$7MaVy=k zsD;{X%bI%=RV3~3#f~*vy{5fkh~kJ_G$N=2JYwfXVl7STH3CH^j}Juc+3Zkz*&5Be z47m{?D$@73IkHr8ub_HW_tVP}$IZseij4pM`IR(UelgO|dVwayzr5qr{4lBF?(T2- zo2#Cx#}iA({lJon$X_LB@Soa83;C?S+B1g!OZ(B`gFz01qmsVf+d0=d3#zkIr`e@#48HukDnxP?A^mSbdsSf-bGAiot{V)JZdMXsBNt21@ zUO6f?Zn6|(7UX4%GU1e${G_}fjhRfSGrEt+x#gm-UH-ix1P4T~DQ@$*g3edFCB=w> zTo8IHpm}y0=Vn}m8XgB0Foo@40MCr}6Vsr+=36ZS)vHsxg<})U!BobpItcGsW$^5D zB*y0GzOktapw!n>Ho2Rd2zbGPx*q1rk;oS`{M!ig%*TOAPL?ax%)ew-j=yc#p%)kF zUy$BrM)P+ROsSu~5-Khw=&bCt_+X=*TSfC)75NQ=b&eQp=8Mf9`SM1f!^TX6_9soQ zW9T|y+n@u6R4gY)>x)_km2~pM8*PkIdB&|TTGD(n^#zj93iCO-Pmt?p-fB5fXR8Dn z40oRW`wtbfN-fCsSUd5TD?E;tL^}crLeT=z;^*eEEo#xq-BqM^U#Zk`Z_1dx_(Vr}*nq!Q zDu$)W4|S@W6!2rZO^;QPnn4NCVYX$fX|>B6%;o#wM#7>+pxi)1WA-?)M19f=-N3Ae z_&U~LevK5`(0nZ2uB>zx4dh(R-4@7}&z?A+cv*w}Yp>u#gwLQB2Ir1Rjm_x3lfak|YjQB{Cdl{bm{A0UN;X4PK^F*%%d3q)j4u7^y1zgobNiq>i(W)E@{M` zftE-jLY=oat*=;|)X;VSVWnVvX9X0n;v&-#PmQ5^!8h1HRWO$`2pf?9k?}Q`3!@Z4 zh2$q%H+k#P)c6;~6_l@hPI!aD2ZeM&Pxc!k~l!=4Ibi9pyl$lvdCA_gd6%hTfi$nIf=4CK)hI zJu{Dz%md9x+qEykD9XGu?#MXOSF*hDnVw!JZ5`OO7@SZE8r?}?VRJtZUvZRmf7rai z3Kw{Hl4}qJ#%AbA;XJUnO&1zTdJnN#?y?moZ%7S|?wrO3smGfqF?@7MzC}lbJNwv& z`Op|jbEa)R3}_yU(HD0tIL#6-sD_kLjM zU5NSq2oZA;yl)W(q}>tD_e1|L>rg7|i-G=lV(!3)Qb*PlVTHU&_9a598^&fiME5|7 zh>!$L#669KdKb$8N$F(WAI{%d#DM>2YUcK%y`KbGN`POFjzU`cA|YIO2~7%f1j8X* zpp6z^wM`vgAa)_3Sb_mBAE+qO82v~4quvb!GS*zFair-;9JPG{IZhnf^hwr15j)L2 z$7&-DAJLX=2?_SgCGSOZj%dWCA%&PX*%k-;9|qFM7p4eYF{-=^!;2Dl_-;?#aUeNm zxg_dd>;4N35DGDTaG$ z!K6qIhV4r_twkV8#1Ml40%jm_Fd;03=`i#ayDw^Bq|F~QmV4pkuFxp2j2!Er=Mz%h zz#0;0-iecFJKGfG_31uShIJkII%8Z}X!{hW#;A2j z0HwA0*X;6K#+JVuVu@qj5s4c`(=N4Mm$ln$U5uvbR&t=`44OeO|9dlyz zw__T)y45NbS_K43AuCH$Czg&3;21PA~@0t=>9>$?69X@7siA z_}zN;UdZe{S;2TPNEghyFfil3 z`xv<}K$aCb@8BQe7PT!r1tz+Xn4qMLZNUYrv9H;^G_Osq`bd<>B~gsA>)mhB_l6YV z2+dK(=tT3iLZANFpwxJYJF6jP7n=T{M!H`3cNDyd*O;-H2D^570UtE1e z$_&#@FTcX11$BHb9d$~+SWa?ZP%#njzdA)4Fn=difFfr+%TyEZ4pFJ``fL1qTVq42 zL~8bKX7l^1UfFAV6ABqMZyPym zz%CnD|LOL3u6GAHq+c@?DX$nsLoy)St#%&!$mY9X+5O{*#M#AkLS@Y8vdCWMp3ok%pG z4I>p!PcYmgP60Pm+A&5#!Bc%!jR^xYk3mJVwgwC+#n1Xjk7!& z;qTQoHQH_v`L!COH}?AnhqFKT(!R$AS#Av)sMa(I0yfSZ_(GmEPzV9mPYfikQmH_8 z1pd-y%h<$JJyYrROv9*x)#a*`eUC3V`)>7$T*D|B&blwHvuUty+(y*t@#1kM=X2%r zkF&1QNP0A1mGyLs`mKY~$LH3-MX5nQ5a zrImA3X=I2T*92y-S|H)}2J`lwVCSA+oWM9r9t~7+kmwKVf-Pg^iD|BM^FnY^Y+fzB zbbySmS<6nW~(P8;M}CrM3_ zU=+=95oo~?Wtwoxc{Cz~$!k-`2JV~=;@$78F;lo{(%&H)6%vrc;knP;_~!WBinuML z2zxUiuN%Qu2&D(oq@iVGX|6~4)ff|{&4BF&U-n^ib(B?T0P&>cLk#K75WCJ5`TS9) z-V1P`$REz0v4JLpT^HRK4KlN?=-dNRjPl7N^;}HLI$paQ+Gn~=CX8IPEi`(-juDs^+0Tr zDf$&qGv7YTi&6O3tDK`MP~L)`cJH(^Q;?BKL6rN~d5KRLc?OPY=`z6?<2vL09TV)d z-_0Q6;{dZ;EA;W!(jMSdlKLWrHHIO<71`Z@FF1&;LBX-%Nk>T zag*Zi2Vdc?lyp-Nk%)@2+m=Rx7X%0>W)qe(O8I(}@&OtdBz|G#K6erlp)p+r{U{3Q z6vQ^={G#rz8RB=C6p%?oZ(f5xb{d0pBge>Y`Q;!*>O;pr!VtW95>@)<%d%RgEn6C@ z(2ZNmg}jCA`#O?Gp18^#0>LbS_w2%!L+d*zX{D7QT8P*gD#&CGyIGEN|9WTyZdJg1 zF%W^_&2i$4j?|7KvFL?lS3q<<{6ArfA}E9zL!^`cYU+$45A!HQj&ex`jDrvme183J zw$Pl;WaOFYfWjo-Spq(WBZqiVNTP&o%f_n3BF=0SB@MlK9oC@x1b*D4_7?8gk19_` zYWbL!o%>e3eT88fH0ir0Q;Vo=(}k&_XS8z(n{~_7X-b&fSTSGXcyrODemb`Dz58h9 zYDC}e;$;1;y2hf}Jeyk43>7QA)W#_8Lk)~nrF86tQQYZo4l&%AkSoSycp`JME?l&RgHdYF{*4ih=Z#XPMZWLQMKwex((&6A!kn-CwngNM zF%);2!CC8nQ5k;8mi7RSb_;Zex0aGj6ViG<{R-u63Ndg=q^C!2?PUygdPJu_so1C( z+5&{Tzw|>DqcNga`)13KW({^BGW#r{sP?q5K=|*t`9+Pyup?hkyt)5sNOQ2G^ z9=ZRqzF-l9B|&6^YzdSEz8s+P#JtQ5_y9daRPkO;!06O!X0tFISxHkG<1_tsqBE8B z@Db{8;rKs%eFr$!?Hl%^WR{gt5hY4Ol&r|sKxQF3DOpKmM|dPfrHqt9DOyITY$~LI z5+bXJjHr;z@4S1P|L;3K$9o(-Z-d{s@9RFV^E|KXf)(PuZQN+t$shKLPRljxX3X2G zNxy0|1ar!=gMR>qnpdi4N8bxSCZ6}&Y?_3}biv#kzxDK3TMQzfaheGG4?PC$X!{}F zbK9h2R7`HB60|tdeU+J7$kmTi)*-V5O{};)TS=1-a6MPbvansmQEuI`JA=SzrWPzX zw-B}mq~$W6jI+KnHXXI%K6sKPp#l=5VFPmu5RciO=h(C_!E(@bdXTC1YMxlGUv~G% zqY2sFIxSwV+`W-LK!Ch&hmZrbQ0IuB?Lzy>s!+y-q&<|hTpJQ(H5)4;;GrtFuq;5_ z0ZK{@i4o-i3xGKB{oFx4=IguQ6h@1{V&k1VKai?x$VwN5NPTJY-mMwt%{{fjwsDnw zhja*+LhYOFFPT{bmh=GW$FF6*f_anmlJ)2fatqOtI*qg@GgAqw(vQV;c_;(zBmg(J z6NZ5BvsApb8Sjv!=R}hNOmvEl4V)%#o;vurC`x%YUaS{|?pvbC0uV1OCLP`fkfxH> zzog&9RG&$SBir~!qJbjgAszfBphMEVCkY#AD#z0@M4AiBG|dua4Sdp_vMjV|Oj7m! z7>rD%ec4sNveH-cF!*p8xd+mr2pe6k71~WxN7jEFRqTsD$PJ8fKvoa;{Jrpy!}L|- zNSZjW{chJ<56{*=v@B8z_M ziXa8331Et(6)FJ;3z};4KP1Sw>@5DMsVZ4 zQGipM5MM%1kb5TL!3jOVdo)Wkd)Xg5CZE$`N;)ud`;Z|>cd_O-ET)_MzBYZ@f4rOY z#X^6gwWPr!@7n{@pjgmN@xGcOzqVuKh9xr(KA=a_SJJY8S*ei>LjdD@D{~eE&Pp?x zjLV~qvjcOrnCYw=CeiEYBIzOlHe+iv7!O%FYdj?U zjkvpHFaswSb+Cqh>&hp<@fSd~k#3WVk%2{b;T#ja*baC_THti!r9KBM)zHz5S4$`} z!V&||UD$j3+dI;{a>1AYS`KnA_A+RLSpEYpP2*C0&h&q8$262TxCvgqo2+v%;rlrN zcIzJ>Z(25kaYfwblc3Bv^ZNZPxigSKw-;tkBV5VIk@Z~O-=!BgVH7PkGI;=s(DyRd zBbl}Lf%$%nbs&wS-3ZzG6fnuEDTB3ECmNlI)|2)yByJ$$$t=1_zz*2!L*OSiFfj9@ z`#%tuNmB{fS2T-kT_%##Mnq182=C-}Dw=<~W@4F4_Moexv)cgS9c(8BX2&=Gc+o+z zzw6R(p4taf9K3rx3Xqz{QJAXPAcF`2dAmQK7^lnxs^1vbb_XAgkBn@&2xH{KjThF> z)=FKTXF1kq%>U#2fuwjd+FQ3mw$0maJNieIXOSK$ByA<(m=7Ic-he$MqY!>gI3aW; za2sjADjqr+fDCFuMIxd(W)?K{zFoif*%lWU7u!J6q=hs=hE%%|;NdW#x`^5VzE*SB zJ*$z+L8Pk-b&&8bNaXAZEr8h5MS2Ocad@GtDH*o#LvXq(@%C%lm8fd*dvD1Q266W( zUD@e@xlHI>_7ri5spwaa_RcAcIDn1}b;(jL51i07OvNH1GwHSZ0Ub%I5l%=;b7$}Y z;xpcPpm@;TgBnyrTEr7|bvtNOYOo~FH-B$%dC@{7K_h7h8QqXvIY^jx&>Kc_dFV*n zg$=XcZD^}y_`4qU(da!y*Z@6xUWhcKBmMi=)_EeU?J-n7hLBf6`bI!AQU!T`0eNys znO!>{j%YE(A+p$=(RGP>2!|ax_R7a_ByJ_<3Br#F`za!Mi0y4Vy9YRH3(`*n;(C?i1qKKuzM=-{wuW;x8FmSzSV& zPAI(xI2XSnaUe~NNUJJ>C^Vy_py|*}l4f3{%O71OX}wuKM%vqwsYkt||J4F4xmWQ! zt*j_#2UJJ>z*N#x(xQm890!Qwk%v(jwF|nZ%mlW)F|D-=u#{3g%RJUxe}9GYv|q^X zIntXO8eZoZ*V-TIDS=JLb`s_%T~=ZsC0}cfl6I1$D{n|?5vX&tVJUfn&3%a|`o!l} zjNbb{j!j}JS-4$pc?lY3GK~Tu?U($J65P3I=xgKrr3yJ^M@SzoOwACNxhlDp;Og=* zl9k}3y9)kK9+L%lN8DhaBDwf;vYjy_C)I5V9MO}&smj1TXa{$KZ}#i*P?F6@?*W5B zY;;VA&@5Eg+|}%xDs`T6@cI(jP6XqT zHG^LKfoB>6`_0=$odMnV65f|MILMYFj;HN%ouS05xFDDd8N(%z%u*z+CesAy-Y3GA zL*xjagzMc@ezs*+;5(KcvtYZ zyEgatMW2g{+Xn`~5{_BJZ*S9)_0)9Z7+N!cq(_0MBtT^)aGeurl}P&2WT%sEb!wiZ z8N6-5rt$wO7abP=w0qgReshu87CmCUOft&~E?Cr?P&Z2~8k0kd?2F(iiLGx*z09i8 zY*LGn{{ghd23JxQ^d1bGS>TW^)nDStl+j+)j>Fpf-#Vm}-q=kD2;y5oUgwq^RQdQL zIttlNex*5ZplEdG*~YlII9Z1A0_-O;+h}Emc`dPb5+t?jM=r$BJ_+$XTR*%5t?3e= z!tPIY0{CcMHu4Fk)4gO#I)hdsDGhTa239;PAH#WT*~AZ_l+3Q!+xqI|1ZagzSRGf( zvdA&rQF@dtTp~`9Uh#0V@}0#5;(dTVqy^YnA@cl=pl71={V|e}g71q*0QE^`D+F?o z1^}MDFxr?g8B_&|^E4Xl2ybP<;-afLGj9}$#<1cf=)L?$jk%8w^^#+ZG_Rq1FXY*o zPW+B6;QtU-S0kHqAVYXa`{T&42Zwuy-|(c7&VD~65b^-Lqo7?Yhe&=?!D@V;9ccBlc>e7@{V-30b{3m(oZxPDMyLIsPRKl; zmQfG0=-G9$eLg%qE57whGOJ6RFW_Ku3OJs&Mccq&8-3?F_Z#g3`+Dwv{dn<}{Ok1h zUwk)#?4SPb-*)+1&$LgVMB<@~HT_AKb?ZhwTD`huJl|v_?dce5InPiisC-01S68b3 ziQ1&i{|r?w(!wNI3<##Mva;ql)Xl*uERlWp?&tB(cF9pEPB4>Uj*n09yvNDR@d5NY z?<&1Zk6<>XP#_)z<794dX~3{zr1mtFtEs7-P*}&Id+0xKw~y@Kvv1#f$fn^ZPN;(c z#xzkBpZWFWj74(x8ZCN8CQi_;B{g{&@ zUH1j_mo2Ecat{QegTo!F7^wZjo;}m4hu~{mnT_Vx zy{~WbL`O#(m(Qd5?zKJo?Agy)G_0GW_{tCpBQV{v^wA?)*xokrEnRvhF)4Z3Am4W(TKsklJC=B@w!=PQHB4IeyJMf4^>wJ;W ziI2+f*}Inxi4nS!Ea*o!n zbeOfwlQ?95aM~2(>A;NgRD8lit9tf~GxkD!ybWHNT9wE$*4DRKcE==@Fhg3*GN1GH zO_R-#DA@!APJz|4!yF#d2kyd-4Y$(stkH?D48#GYDx)AMh%z$p#>g&!a{9@h`-gg1 z-o1N=am-7vUcbIVMus~`ky2k(#em*?`izTrjsc=Rdi;2~loUHgPf;}~yHfx@! zrb%dSe(mMG@8G=*hQ}kU5gHDKQ`(>CujL%oUT-uwR}J%!|N0sUt9tQ5D@Jrj#C&D# zty{}57KIkGY;lImD&(#?`=mC*T3KWBX6CQYo;@1|2U~`b(+v#`-rv6nW2h=SKYtW# z%7P*yThcI3$%2gir3??eSuZ3kT!ta@XdxYpb>A@9p6|(wccM;SW^ZrW!FC+`Q5Z~G z=g-5#gXtdZ*eFJ3J#aq{kBo3W?}q`JjAMp+&AP#{z7z(YgD?kNR1W0F{NNP*>hW>! z#EFa(y}b_P_b{4t92w8Dm~F2cm>C%j7&)KS)NFQi6m@rZx7o8N6a%dLZ(B!X-9}VQ zZ+O)sPg_;Cro$z?%8IC^CxAws_#R?2 zE?T^}44Z85i^-@rXKGRs1rv1dV?v+%p+mO&_cLPMM@}-Fdp?Q>!Vk4YPr3$s3^9WY z?s*-ir-jM4U%H<uc#sU;8^c67Ft-{LTFKzp zPW;Pq&*le*_KBJ2=?LdEwzct-G3;O&Y;A3iqSLzIrcL~4mlo$XBRW1gc?AnjVKi6l z1&yGfZ-GmG-rNgCCamjX6rEH7Fx>HTfMhl zDMVyy>e`;dOO}+9Qgs{G#ro1)#nn-kyS_>GE3nx9bFe*^m)w+@LJbQjVt;c~z zIoX9qc~1j(G^eJoX7PWcb=_|BUn`S*Y)-v?-45DHikpn3xM`+}FlUC?79kF2OsU4h zcX)Me0lLFSYDGrOyn6`HA_X>%!$t41Z5){f%PQ;oR>j#_3^8Zkd7Ur_q&Gr87HzNo z!iQNp?5=Hv$K&G{J*ud9hd1nonaY^+cIV*I^Ez}0RTf3QTxe;F-&Tj^X@QbXMojko zBN*aL#j?S`*LmQd*vV_$+ju_v?OO{mtHMRV;i6;tckbM2%5&kxvz2sxE4M``diTA9 zT~+LIa&qUsAK_qU-~Z0XT?R3Lp5i>cM_!@+eY^0__uyL~IS~Cb9E68g>;BpNW?W__ zaha8|;^u0iG4HOIYAhf4jEk;%@+W+;*gNJIHTy-tnq0N2?^=!?oR!p*$2&iF4Pc?=SH-ab4q)}BluTY&J}yA z(EBo%UDDo9NbUW48p_Ye@y`KT*Rrp>I);InnM^#i>erV`F)`S_odw`~6{dn%UZ23T z!!jVF%=NQ&YpQ!$Ul|^DLo!Uy$jGSh8vZnTZV8KU6qzi_@6Sk-9p&@AP_)0X2698z zo+lhzQVnl=Vx+aCTZal6#E!U4Pf_$9rdS7za;d4Qc{E?b{eV%ay=^Y5KBR#Ck0-jX zO8DoD;-cI|hqwM-O5GK!mN9OkIZg>W$CbFD;gvA@H=to5{c(-phjH)f8p;_kWxf)y zkcI+|AP8_*-%HO_Fjj{zs7Fr-o1hE>cTUI0hcokZ(Oks%Kr$0sD&Vsy-;9ee#ilMr z(;Eo-H0F5Y5L~XP$cK6B_kBl2UtCf;fv``ZIGXS3JbS8j*sE%>kdRO*HgV-C0iMwf zB4+&F=}xs*^C;Sy-q-G^#_fOeC0lbt>s;x}N>3hjEI31<#9g~4H*C+Vl*st|cF2bj z1x7r3XuqK!Asp;R&KCBGyN-7iW>SMlq@S6YJOICmIs^6Yy?dLX(R99hHwS@M+M%|z z*7CL4kt3UeLqZOAl+rwU^oXG>AT~DEp{-D!kB{%i)~>5#-*LlO%EQar@4!3x5gET% zcP@j?=2P%sIC}JGcx0reM*UeLJ3cxT`Ze*#Vo-Oa!*?_}x7oMvSknI%xTi6i;*c}fJ!s$V+Y5>!x7Ff2Tf zHvjvPT$xwmy)WOIP8M(8=E0nAeDeD4f_z#_(Y&FBr-f)OeGAO`JF6D{zWg5_3=S3^ zr*TbPkay*s&%&DIdv7irp6*?dbGAqB&)=)NIrw~>aqZ90h~vz~yTFXG^LSwU5y59B zp-O#AJQfSnh*r5%R2cH70J1XOI@O+ClwU}3>&(#C*cvp>e2hYYN_aFiRTx@3HA$PE zp5DJ;hIQ&|p{Qe*5?7w>o~twWg7>Uj4CZbgrB}IpA%%^HXBDj_%OXh%%A$(WF6R%N zy+aeL`s7QNquovqrS4&!q~60ZArh9nG|BhYQzZ?tKT}i;e_!SQ^MlLDZSAzb@66yc zZlrA0GIp#T9J;~xE^rBY&ZipFuFsd56RQ}_@RbLV5qu;Ar8eDY6-DJ;BCTn);lc0a zW|Yzt%@g{!cWtmJ_Fw$u$rFdB%;h&)6jn?aXvXu-9UJOm7*z84LW|uj+QM3Nn3-bJ z`j-D@pheKohwYU>_awW)8T}APcfFqF*j9F%?>@|flb0?Dw|i-Zrz%vd#zjnMzK)#m zTEsQFbBfo4kzzGVclP)0{Cy99fB1MKC3&OD?+txm)li^1XTZ#Yoz7R(MXn0Q*X6R? zT%6@IOy{K3UfIlwk<~lXOp1Ix3)@?lQijE5vL$CR>Rxi)IyF#zQXakf(oX%sy_>nH zgHQLYOU73AdOfyWpRL{a+4eub_OP|N?sVHP z%4#^mxaH-Njx>h7#-U0ivp#(IFgX`6#>N0iT(YbFy4nL5c__<-h3C1tx>6_zHOn7m zyVcsIIx|A@qFcCdAw>oG%#I1RbMsB_IV@Peem$iW>gH-%SJ7`@Jq&41UP?`hF>pLH z$r+QZblT8BkKH3(+xwd42A>CMHqXi@Gt%z8YaceC;54`p&2RP3Lh}vr7-*`iwfvnq z{P(9RjXKoe;NUsxUctY^N!xa;TPbgKAxde>^Ch^wCHz_qKbw!=LdjTid-Hvwv>f-fQ;$bpPUxev+6XX-jpm+P!->qxp*e zZq;|A^M7DBMO}$r$DNPLGRil<^;cN_7w)bT=?;1fB=EYyfX5>}%6(btgDh_|clUKb zBcVtrBKrf;v>M|U1VItx2oOF52fxR_&WndUgKV_fUP$mx1+oAYGrSO!a6 zSvRw0P5Gt`_>PQ}(W0)hiy$5jc085&_m#}~4NHtII$7^L{MzMg>l^)EM8~n;w%7I7 zuEGOs4DlFH_{VSt!@IZ z(*dIg#dij|SCtyJjD(M^S}qq9R3Ztydp8r1P5sO=X?FIQNZrQ6Hb#%O*A+V1 zZRgE5|Mi%={|#fbRqEU{r6fw(Z3d+lvq%>eazme=+@nJac8 zrRng&V2Rg*vk^fWlpt**Bf39mhP==-yN(<=QXV)zU&!}sS9dp|DmFuB`3zk!8P;h) zcqxy2z2aH+Pq|Ia&Fyg7;*!HYvDERB;X$BaL@*Ei)cyN%>R!iw@8a+_!TAM3zaB%1 z2@a7MHtz?5%M7mTZ&A4ih9F#QZ*8hzykQ(g*D^$crge_ktGf{_cZ}QeoK}1<&Xrk% zn!DaXozMz2n=G7J8u;sb{rEMd{91 zSG?@69Msnyry>mn2?wyv)!ZY-VN(2>=Tw}UuH88rA2CK5Y%vKn80h5kWJ_2nDZrs=c9QXSx90ApL8N+=+RuT|3a3%VNYF1gphgYl8r+e^Us`JrBUGIL*M zcfA5ky3rDNIYHnyhnE5K`L3 zzFW3L0+rL!(d{1XdmXPFxCwh;_)E8Tj4#J=TJ2b|GDw6-eE0UcI(cHqXq|_u>e1u^ zjjLX)0-H44-LuQ`lyTgGfU}6-zGX`(7_kLPVt=k+guA1r|5r?6uUn(Zo-e{$pkvHi zp2l#nUbxq=k+N0g8;;vHnXyZ`a2O>5ox`6%BKw<`2L3i><+H|6UziP@NH4@h}Uo*sr8kAwWCeuP1E&ZkeG zy7K~FKF1j9%)r?r1I@YG_GY_wEkS*zL;?>dXQ;S&9)*HYq!ZNwuO2cAK^WX8Q2qL#nHhXpG>B6?37#g5X`7>HpoGuvR$HmozS3w}*iwMhL5vQXpul zBU9e-=g%+p{p-?u7gYScZo3IARXqs?C8bnbGyICvm6W+cT%*q-J(&+0(;7KCnLN0Z zhsc^Kwp}?Sn&yOK5H+jN0;-^XcA@SG$G(=Oh0DLRXXR-{CS3bcyzVao;J=5o?)>@l z!=FEwK@tjq!!#Ks*N*+ucq&Z~4y~dj?S33F-W_K>(o9eNg61g!6Veaz)L`umyj zjnrBHg8D^eqD%7U{#j6ccvN#KSQ6Ocv>hdEl?{6}=?&+obd}IVH><6tIVhQ$m!xeO zEOTO^M><1ly|Ch4Hz2u98lnL`)-JW(zCN|72(TynoP`Je`Y~jQ*0p?qNg*gBV{IP% z?ty`Uk)!1gA5y>I1&=fzL$=M_4b$gPoapq_ROlBZcec*X77-2A88yh<`4Nki_%``B z)wb3ZAkvcMuzmY>&~wMP)utkSz%!>JOH2U_8iy6%xEUc@%}g{V*35d;Qw*f>$^;1! z5s|x_7RKD$79+}Nzi;0@kcBa6Ad|v2I5i{%&dxX@3j5q2gnv82`8vkdEmHE$kt_mJ zzphA+js1-2F<+LjPjh~5H-iUj-mH56=gHYWYkAHTBsj2+9Z(>=ez^+A>0_$b_R(Cv zS6iI;j@GD;BRoBApX;rn%Mtq907r0ukLFMVM8_ zdw?d*%+3zJa^*^L!4A>2*2RyY3%Eg{7-+et=du*3FKPxC01fYY_~qO~!Lw)28tCf> z;Z>~Iuz?E^h?atS(z)E++^Gt2c#5cVSdnnY?C!O;%J?e%ckka*-I0fHtJeZo0iwr) zDaP`i>(W>;Gs8WJ2oVn(8+n2h*}kD%YaB+(1xm&m8V9a!bx~rwwB-0OePj2ls4IU1 zK$E)KrGK#4OAU5(Aj6)`OuMF}vQAW;e=JR0#n8Z{5#g-rs>G=DJY7*EoHJ+>mnOxq zZ6@Qb*2BANLu57PP!bwsHFw$@-R?~M^M1%DN~U}FHgbeRRRA%z-oq<=q~i7K9U@3$ zB1d6m3v~y3G1`0#tT*LLlD3O#*o6DU$o^zSn^H=Ad^~xsH{ImkLu5XE>5^-&YmBMC zzamQ9PTD>UOJ9)hap+LU<;wy@O7ZgYy4|xGd>h%GI>(M3y8!*}T@K&*np+YHZma&^YsiOivwySDEmH_6cy8jM19^Xk4N`gNDC=Vfu_yoYg17a_jbA{wwg}V|jUbCI*ruPXR^o=4)&CUg7&< zYTRV9ckea*JS@gyBrQ53=DT*qwj8-EcTi1)xRtu|EM4FUiI~6C5`=s4%!E_t{jI5n z$f4iVwn}7y{b97d&IA%<9L7oIDYyW}QQy-!FmRHIOEk@L7Pg2-Fce7QEV!SapMrqb zROoZ}MN8oKFZRbL@0_wrc17cY55BzChQeo`oQCS(>srW#pNOHaG`7ue-aKe>38hkP zA^nx-Kw4zslM6ysc@oH=UQ{nO+_7AZWa_J96uTb+{4q|sc1cM@dmizvgp)TE^ zt*6IRy?|GyzGY09S7(p78OsmfCF4xz1J*vIGV{27{h$lQXfDOs*%?F_ zUDKO4$NNlf?py#nY3G zBInu12_1EG6Wy=9fM5Rs=$F9q{J=tpIgWGJt`N?rnuzux=gHuWSw35G?etb^(jFhV zR4~EaNl#PqZZo_$b~a)6O;3NG;|vCX^0bUskcOh$e<3B%>3>rUc6J)?sqrlRJ4TzQ zm9OFKIia>%TuiKb&mVZ%WF_u5CQn0BE(zwB$&ULmRwPZiCGmz^~n{3OIS<#H;4w&%B6tda7|7f9LNX;-rtxue@iHqh0fv%ur zi5g4l2Op{4-MV$_>20YFZ|_UtBClnWp+X36r7sdU;xJ9liv$Teh5ZaAXU$!yHQK`R ztP)m*;V7GCpgC8KJ_F$ddcq;%+y5RgKh%9|#doN53=0-;T?+^Z_zX+djr#R6GFr%M z*f}`nsC@IA0If{Td@UYO&J~@5%PBs+=W~>Oiv|+%{QITd+|974>adZ z+Vg!jcb=(e@M`4)$wik0al#DtFY#cU;(43io8h!#ba}!@voA8wBXemj@B9}BZEJrC z8$a)vaqnGNSyTe z9U;fpH-yh2ARd@6u*u^3=(d6qP3m*54_#fxxANfEiUMA~g6QV(`bLaodwaV8l*T#B z1ndA7iERI@B2R8$V4!1Y=oBW~o|v-(G7>u<-$@jW*?(Kub+crWOT<7XbM? zyvY`ZL+TWQ@G@Ch6XSbe%>DT1$PB;h{v)fp?urxgKlp68%uH;eYV2ku|igs2UMhH!a(LslP%!8&;E4TtnxT_p|=wTbIMnZ!A8%d%jnh~6c|#S4~5*P7lVyjoN0 zwGw-(=f{`xuv<@W5!#}w`*^g!(Ua-GFZv2Orzp!`B1xT78Q>s@@Zj2U9UK5mws8it zGi(87w3dkc=0U0MBB^;tMCrZggrBxFaC$60H`TsQcQEWH7245a>yq>7{{qlL^73XP zjpM8J<75vo8ymyuJJEVF`6VRE35oV zxosGdIf~7mtFxO+6+C)_ubBn>TDD5%xjREpm?eePT+ zX#Zp^Y)TL?|MG!sITCk}5<15Pcs6G4x++*Kxn`t|5FY)*H2hFW==OCbEJ$y^B2C{$hLD+l* zhL&yN!Vp+?Y%qV_amY_ti530`NymDT#Hep*wBZIoBep9i&G=gznnN(yjl-wTz44jc z#*O9-8MH|oPLIPJyctme_%sR^-j}mr#flZ=(y{6(LCic7f9u!bBX@RxyzmEeiwan| z&MH0XSa>>gL~NP3xu1yeGS+KQudGbibv`z438=d2?g!FQRBd&xO92wU6bs`EDs_V_ zZETDbhh6QQ)8-fY-b?-=6Mw|QA}Qp%q1ovMDYmo%U7>x!XL^&q&%S-LRa?Y&0<&`9GY`hC&;)&Kw{sGn%t&) z2LzBfk7l<6B_Gv~-Im$}Jlx=kmKE5arh;mZkVbip?- zAo@2bbIkz#&=AqSw}>%l5ochgjPz&K_KW)GFT>u=wPt4$9MaG<7tEPEmmMqyF0`z* zbtzt0{nMtKcFxWxv04QoDnpP`0vy+TdNw+m7;%zeu}m4>fjkS=5k}QG$}o2UJR}5tl*3g-XV;)~~Qr}efKZPbe5JN``P`>7GDd=Ex=-74Yc z`HcIs0}!JG@vOD7fz(~@Qv^~7=fO_Z~^?bX}+y@ZxMS2f#S zq2nh&vdcU1r z2#H%bIZ{+~x=XX*OEU0-U$pN2ZCDhSDJblUkKNK`Euzn2b9P%Q11qZuV-@+p!cu{P z1WEUBFpQ2W5jsx7&d?{G@QEBWO)@WOUoiqdMTetB2do+%VF zq$pG$O=VhRa))zp2!FuN#ufy&#TKKIL6}`nJL2qo%PQ(Iayl`lojLdJRi0U~IWu7L zFrV@fzIOkwkrfBqN&-u^`GL2%@76g7$=L}|Ht)a%{>TmyYbmFX>7e+Y9?^F$rEb&* zW%npH(z3JW>O74U&xmpU0w$(%WHAQ;3KGZ61-@;7(F8!-;=UUVHonS{BgG=pi^kW+ z9|GBb|HyQ{133kZ^L8YBRgtfHjmQGlDh#xfsBu~lF!1|_tjdqD=85~0WcIk_pa%~g zY=58n0=t1)oDd(+DIb==$;rt8lBk> zZK>a7E#GTs-eh-GgWtoHTCn}3xcvZ&tGQ@`iOuvHs3bfjM7n@==xJXrafhMPK!>hBNtm_0hf6 zh-Gy*P1d62tqP|v4}65E>4@{4jXZfW)1gk#b{C9J=oYVrr&ZxOl2rme+hFmxt5=0! z;h2jxA{RL0pEb5Z>T}6Z6jb3YA~3ud)Wf-D4Re@o{7#mFbK6qU4T}~sp+>+ZDLcAY z3Cjo|S7a9a=p;geb^~+a2!M^YyuH1ozA`!O{d+_sfWs9~3h=kM#nG!n8hlIoVN2Z} zV}nm^MQajvvbY=XOg9uB>2G9x8Y}(~=Y@XOyTDVcL!c#q(hr5t9;x6lpg|BDiC2I!uDuA=`DOPW-Y^9mkYY{T60m zobal`PM>Cru?NU8kf-My6m37T&5z$A-(#!D+Fdye6%~CYTV5xt)BAsG^=c{(*hr4e zXv1PzbOc!h+#_+Ax4LJWmX_A>$&^UJTJE5VgUba|UcT{gp>K8_VyroPH|t|F%O5o> z?XA>bq_@>Zpo9RaX6TM~MI&OZA&`JTnrqTq&iSIELver$qX@Q>G4l%_Van;vxR!Ti zT~|PTD)gT(^bAttt}#O3CoCSN9Ac9m2})43mPxF3Gp}DjLvn&p1tAbx;8W zd&+Prni*)=rNv*kz{?`A=_C><=Qr8&2oHjMvJM8!WbiWKBJo*Qu@jG>qBWv95wb!> zsdm7?0a)P(CgziO*Wl!1ph!tcE!yD7Ni5`Fdup8KyBM?V)84+FySlnFs2YV`Q2?FE zScNGawE%T?6Ax>nWXR~m~klRQZq(uk=3lf?+fO;`i#9eKr53ri1WWIoe zmI9V0MWLdi0;h=sTSulROfzkcN(OY6&!edL`sQ!5 z#6l$IF_;3eBSR&X#l>|+%uP*8LE>WZb0rQ@*bt|Q=LNv?k@D=+l|1E%;tUtO0l&u=7 z#@V^V#}JC_?7sAd$4A$;oa;{h1B8G4XkYQw$Ldz!&CVt#MHZ|}&TWN@(aw`A_Dxe$ zc;C*OJ9R~1taF;b4@l*Kh@76hw4VHy7cdlqJ=4Mgs@V?+uoN<8qJx!%#YL+MTVS=! zd-r&*0q#U1@Tjdkn_mCAaz+&KqXR!=_}jNi_!u>wA}f*t<|h#hiIstwiG1l0v_Ca7 zOSulPCukkWN>Krw@EJw5j88dfPLTxo1LS^NqLXgeF>PCi_#h-a{cULsfMu-X!29>_ z$>Aila%G=!JHRXP=3k3>IDM`Ng`_DT%RA$6SgHdPe@2eSJoyzaZ;ru`e7j`6M}57$ zB1;ZYVMJATnPtUF4HdtJatd5;`MU0}#!Jo3&13qnUOiVM?C0kP8qnB92~L%!=H_w$ z0XuUX1WV?w;DTd1)E&E!M#baKYO-+~8omtaY(TVJG>cGryl+REJ`KFlk5jedG7rAj zLP~S<|o{ag%Ece7j+bdXOWR`gwRl zmhId>Q7uh+?~9A86D0T&G)EL}SQROtL5HXg$nSR`lL>es^c?yCuwZXUp#)Z>KHV@i zA}tbeiJ==J1TpH`Zv;cW5#_PV6Rz{I!EHZu`~%u;TDt_|>=Q~j^7$Rrs-g_54%HXO zaPCN=TUJ24f~P3-jFI9JYVLt{ei9^M(A6wUp}0*?c*5YtjZMowhmGc7>25c-Otxp= zJIdzPO%U92{rYtWD}*fS7Z?X`8{~kVuN9fOAxIbmpV~&|0$YQ0rm1|0~2+HB+0l5ALwzPL>O?GhR|;V;??mK zBSmP{s<{-`_G0mb5_s{AZ;2f7f6>seQ^XqfeM-ltPZE9R=!-K!v>R=@2Dyfg()Hm3)7Ptp>D$XLBw+c)Z`RUca_Ro?p}ew^9+mUl zv0lBkG$7j9sLLiMC+AWKoP5?_pT3a5d>{f_G&6>^`Z4_6glZ=R2*8J0KzG{yicChK z2ShQrX+El7gm(oZErsXKBz;B9Ho|Zc`*rz)+FU0Sf7Ex2CSPM=VG%96O{q=MWKQT!;t7R zzn@DfE-rRxytA};ddwVq>OGvOgybZ0@kp-$j2z5_4|(v3*>AXm23H|;(JwDAPqatr z&jLTQ$ru8=h@{7=KOt~iHL>+?qdCPQe%r=C*N>P@U*?`sbTc$pvMgU8(p9tFVL{FO zZDF;WyR)ykteLoe+w!sLuM_$6|C*AE+6d8rjYgq>SB%0*aibntzbXzrnyR@2Ec}Wh zyN-P6+KOfaTl@2%%ZfQOQ=mr&BfX@dgw09JnLtKvX*QzPf&@ZOjWaoLXrs$whN+>tJugAPPWTAb9|hq&y1*cq-e=F;ce& zl^g;`mcADSfO-W~cx9rs48ir~Q$NK3h0)aEEXXu! zIK4GJEi5geG%u)IguCnnX#kz55-SM}p9B~N5i@KM+M9CrFQoW1y+>lbZA07R4f|g3 z5l4V@O+^JA3V_OqC{4<+LIXshG4ntP;(Fc>w>}^ww9{jFQiR3Hd5gV>8nLjfEU7yd z4}yWXnV!x}ebvjQxu>eCit`uNQxJ9Ks8aCS?BO9z#75Lr=QzIJX5R`G0j)#UGB7dC zA<}vW3LV4J)Ay%m9O|CD_Rf@^j_zGkmK|XbBm*HH_O=$>lbjyzRA26vg{mvU{G*cP zx?v(c`n-;#0SWaZ&QN$CPKxa0easF44I#nF!WDajDSyX3|2Nt8DQs;pXW3wLfO2Vk zAONmgEh!@#Ng%0)kOSqCCIG0biR1IBvqgA#+s+Gj21~DnC#Lu`R$P?vxc6&aSMPZI zxA}9A92_5N--lZCYPF8(SHGjPOyKS3_BelOUXIk7d@JLMz|Pno%6W6txv5507uC2x zEqkWq%kW&;OVyJ&{@2$5PP_NB#nPYxGxDO~aMM3B(tD=*3rT%AtI}Q|(a1u+Vc>0n zQ(J!q8AB*Vi;9#Rd>kT}#90tngeQf7P0`lYj+wz}-tQ8)eqEP!JR~>*3lLL3ql`*W zL177QTYcL$CVoZlWlR~gLAZHF`|hMCD7?7>$@PbJP^I3csHj*!b{hs8XlnG7Wy_b- zu<|PgrKhikmreT8Tu|5N5~B^`uEbwE*ju|i5`3qP%XGWf=AE}pkCOZv z@^DJhQ=Ilpwvni2(yFE4Ks!PH2Qj|WREUAmN9Vfov)d=&jFS_`Jo zV6prQq-mmJmX8qT9BP)~DW8K=c=4eB!yT;D)aF3255-1L#&RX03^{WU5X=fOF&ze0 zXK0V`M6TE+Df%9@D<=li~nyJAQ!yp2{iQFRx!J~5dtX(bIYnbIni&bO9j7^4_|Z=eszA z(qDWsP0D3Sjz_J;tP^v>$!bc9Q1e6NN~TkFO;((aBKk0p_+mqo20n}LenRvZeZM^bpmlCBOc(Y-XWVW zFHGF%m4e{y`=-6LROO_Aa&go2E|fEa&Ss_%IEW&y`9HHLwL~0z56j9_g++{rXB>nZ z(oA~PUOq%gFlG4NV`ic@gZbWsqyz=2q)rovy90VG_*0r?tRIoUU23bC1g~)4`?DYn z`ffchNNMqj;9ebFU0YYzC_vH_01qO>HprkUyTr*Dg{Y_~6i%~(z@eku_Zs5g1kK#m zXV0FiBE3HneK;4u5hcqs)jWO5j5gV9dAH%d4uUTA4wY@DxsF_$X2$K%VAql}`eT3p z2_O!xH1YwD&b;WUPZgEs&g?Oi~^q0U{1F^u!hwDG?nK%xd}L$C|>ucfrny z_H<(FN6lmA4lloaJbX)_jAhGFUG|NdU++Z9yZmjy|66V4Rh1uJXRo<0ax|DwQTg*M z`<6&A7OvyJl+Ndh0)PXvU%53KU)xW9G%GbZ7R}}@%>L8-->o$A*A^ll59Hv7+W=Bz z=HzIYnwp+>)dtTAl(hv&1L7Z$H5IER2`<9!{2F4aL%huL9d)FXLeeJZZ13%9ELB?^ zIrq`tZ2M^I+qaoMU-uF!D?TnZmJW&>9IIS@lX!%pwkI^v?MfP9g(i(Iu=oZH9Z^`n zCq95=umL5$Xp{eawlC?!1YX5b6|*9%^P7PJ*=UINJ!ZP>3`VS|c6*CjW3~JDuPZh~JEASW#Jdb70@r zsy*vM!@`I#V{*r$&RYO3LNy#X+uU4X^@Hwk=Iq(IxQqG>YwNYsh9dr(dU|@^WBXtY z$82AoNFnqvlFXe40_JobO#~EPXn8Lm74e$H0wEre=D#|A zWEgYOjUz5zEh$P^d%ir*k(U zc91GQlAW;JdZlSu{BKbT-eDoD;sBIO^gC@2cZUy08Ce|pVezIrX+u{IT09sP`2^|e5 z4;4h)!|LiABfPbC%6MES0Row(jV0HwSI2=x^n0SLLKLlS6@Pito4?Q%Rd$Gn`rrzU z?^wWh2byHfUuy9`Pw+FU;`CGmDX)p4`l_It;X*k5L6lIMmabvFC3fR^HdDTFPHxj$ zj?b&lyX|+3m}{LU^(gay91TUEiQt#8!6^lYYuKl1UQ+gnrW7hzF;9g|?_Px={5XII zO{w`}?+H=Bwn_+Or%#_wGMYwHIh)RMs>92x$CC?Ywqf<)VZlFeBe}p(P>~gcvZs;U zKsIWPP{aKoxj^&hHaEWWcOHI#v%B;u3XNz;{V2mVSmxJ}1`aMRbi%Vd7U>oZIWC9n zz;Jsd>Zx^beJ=h*82w6n&dmG-$UyAAzPsT`3H$WYd^MsSh!Q!s4hp1=&{B0kG3f(s ze8~C6fn_>-d&AL5V^MyAv6eSK8+%=U1*(ifmG84qh;7p&t;eQU;@3}zS@TbzyI$Nl zj}mn6!UmL>W^UvjFQkr*9yTo>?@U2!26(jp>H>8LyP#kEEsW#lNHj zb+F)nu;xfCX{-U5KM!=rvxE)ISPQ79U^jRG-9`~K@;r)Zp7UZbR*txuAQY)Vz9MG! zuun{j*=pvZ-g7Cg`Nip98k4Wn=Y{@1Nn8Bk`@gK@SB)UBIvc{eYdL2%%^;8=+v@Kb zx3mikI2csp5Q-Oj{A+r)7e(v=YsFCwcrHz9Qbx9~Ji8p7J;05pe8+O(szw4D_G#tx zO+eN8azdBr;b`4u^V^11^n83ZdU^c(DmsYgrExT_StNM1=Yj-hmzAs)VmGYdxGYLL znL-qdqfj#PE?*L6$)^p%VqM*s^_RCtP%!159?pU@uOK8BU~htoBKj_{Cj&ePRC_4p z+|_6ev%$mUAJAmQ`?shk8;v3${V^0On(E2NXNyE6J!#mR5V9twKUZop!$o(LYx#vB z*A~`obeEK$X!vhiN$Du%{2%)#ZYU-eCVChtD6p;YAqm_J0~7JGLgu6dAyl>ne6v*d ziuskUkY9UqZTIxD{4r+4a2=3!`p=m9xqbhdI(JQC?BA-wFP*Oaqwb+7=T?fkG-&h| zx-QRWktf=Ybd{)HaJ{gChJx4C`SMwPt-8+toSY-gpn(?ZB6Zu1Ud_byX&61Vc_+XW ztkVDNoT8oomL1qXhFhx5wSlsX)=E@_-pG*|!8o=Nc$i~+?df%c?QG9w_V)F!R)goR zd(`tyvE~MwEbFV1HT~_=zgOHZz2N0}>HQo47RwU6z;&YbhUpa=K47W*S`6gZIw$Ji z0Zj{5XpU;w0@Tddb<)Kh;5VNMY}C?hG@>=!wdiSx*aoVDsG1CoPk;+eLd2l5U-a?X z@n?bGo)A)Qfl|)@JPC~hp-VP6me$m;f;GQVp#Z11w1;eZJmPC@w!JnSM;#zyP(t?C zCDoZ9`}>M2ewnkGj>hHF>1u5alG)qbPxFOH9M56CP~5ZdG`&k-_B61&-w)S2l(mRC zivKJ>y!o^dlt@bMe#CGQECjw%?1@VSpzJ`egrQXHgG2Nv`vqQ?!=M%vg#C3RBMr7q ze@u-uv zLaj!&S%yJfzz&w?`NUd1 zuJa>;q7Lm((Jk2|X^Qe2H}d8)Ym8(-9=QTEx=7w#2tK0ut%uizo-qyd}pbf`!g_NPiP&mXXN%-@<8|*59GvUNAcS{ECn# z<`B^Xh_ki}=GO@K5|2y#`8t1df_7hFBrUe5`pA&g(^-z86(Un;cj z9C$o+;8f@ea=s&J$pv4v80XK|Kz|*Wi8A-US_w6GL`8mJ9a`xAy2eg7ZOvi4;i3me zX1?!3UBrrI%g}oQH-PYM|JTtU-bTuhQ9R}O16~uQcXr-xN9KwjjSUPRv^IDKmG!Tn zez%$(yFi}g@2|8%JW@NbndLd|=fkVfhx?rV_N`mN2(^j8m8d2!C6&bqlR*`}ewC`G z$i4-$N1;HWkn%7A53_4N|FxIffWASjLl8d-NVOO>4F_mvnEw#$MLV!QVZ%ehi^t0N zG-X}aY$G`qm$N?7L8;%O^-9|Oml&%;B%Vi}a5a&4SdZE_)H2Qv-X#@@OMH8OUo`p9 zD=u^BgAPc5hXCn#CcaJpSt!V2e1!vu?qekc&=4%>w`gGlBP>9=9AL~f!y)KqO(lWK z;7mwofRM-wcg|JHtX+%#5(aBvb4QQEHK4cWfoNCv>WTRV&t|eSFhcLA)6pPm$;!g9 z@)&*={hK?*PcGTO1mar8qcM%G&FjbYd0Zb?M2fX2e+}*T&*(%Hom`-*(XAuz-SqtV z^V-(r##&^`$Z6q&4hBz_3^9llNjjbSJGL}@{^fc8IJlRZHs8lP6*X~u6|r~E9vevFq>Kg_miPtG6DHKf>W1@;4ZZ7>n8OX3GQ~s*9JR7GSE7ijUcl*8zHY6olR7KUU&jXdSTqMz zfpCIE|1nSdb&GMiq{a(;2alPFXv~dJOHq;FvFdfp1|h1XfgMY4FyYsO;R*bmiA0jo z=Oh_QC<>H*ER~mQ2EqNSJ-|Z^`xMpIjl2#m5XvAobi#Q9RJa`279D1w4(uq1f&&WH z1zNz{+^2`!-G?E%?M8~Z1@;-Uwk*5NfJt08FXMnAc3SYmB<+hFg}ZZs($$QUNRpSs zX-Ql-=y>N?TRdEh^C#m3=}!ahyZ2=(Gv@5_J@4+Vxt>h^SjUM3zC6 z&f!ZtMPqhD)*+h~Hi^iY=}BH+)9^NiZZ3X{B^gdzI$Juro}4A6yFgr^-z6a~0qUpx zAHLoLuIIh~|Nmsmh?K32auSlgqNI$hN=7NEjL0avsEo2_N;tF}5haBX4H=O`C1h8K z2$f_s|M#bJuJ5_d^}F5vZr|H=xxS=6@9}y*pO5wAE#CCGt)e6c{YY@T_@OsalIM9$ zN%&cm@lOSQV9rvo!y+5}i!3Av-wFyrR<;T=4NwjlYa z=3C}py#y|~fBpKZEN|0s%K@qIC|mvsa9M6>29qiQd%&?Zuv{gzqOWrqwSU7hc>|+K5Fcns|PW` zXPtes!meFat8SenQZy-1f9k&n2&N z8~~~i_dCQ#dKIsKsUefy1gzo(p6${c0;6BOQ_jC_o?Q%>VVXs7a5ssBLpP*Irh(jn zwf@hbVb3y<4L!ANrSTja+Q?Pol5_K>Jp(j;cyAJA3!V-It9J;(olT#^lW!H2Z7s-Z z`QxykpXHmR_ss&1Wxq4~r=Pmt*Yv<202^zon;f)ir7zt>_=A=}1JV5k?yo<+rS`B! z4b1jmh-eT`+>EiL*5oD!M&C31@;@i?-n==pXKx9oCYL?>2BqM`Y#3n&`_CMXA!`xn)+XM`8_>wwS-gU&1niyI5xakhoM=i>yPFr4$A>kzj2 zRyOP~f5EwZAZMqz<2HSc8_{j^*MzMOffUAT=)j7&h7itlhQ845aStDQFe2QsP!g8tn*&@@XYemSVR5`uRmW zc;NwGixcjDc<{4m+yaR?dU@s2i1Moy3^ebb0bllB^3njim;)cdqscCd>feujDog+U z6+gc5rQ$V52ad@59snguYm)Gmj7rn2wCp{JsE`$_`$pe>)#pL~wH4nMgBi|Bv8N|X%r;Pmf zk@!zPW` z>`~;0_$);*ddbIb|94NyPkkJV-AWn0Jp%s1tNafFZ7zIzt|8Ko>xe-5C3+tixI_c) zq#2e8@^nSZ;PJ$Z^!I{cTj>2mH~(R)Q@^a+<~d2-ezh-Cz3v`5a->P_-L*$1&3Q-1 z5jH=6nVG%XySIgEJElzC7QboSNHC!8-5a5+Je?K`B9)hLiWY=q^QJ~#(E?|QWvLQD zkK)bxKzXG5&f68bdD}~|xm}~Q$GBwc1 z{_L(~@I{YGZ{YwR!GRj*l`^H473QJ{Ww z^_Xc_pFXwe^$BClsXqZ#u2D2I&p3>XDkP16d;`@CU$~Q(-Zh?rDh?PhfCFXY&3Ncy zNy3Fs*(8`MhDqIuPvj?ac8j&8q@+Z;znIhz*T-|j=iVnyy9@^Tq-X1yEl5U{rBG+i zo*l^_2|~%^*LJz)gKjil2(H~IM960(07N3q;236feKxu27S9Vb+(4x~$$ z+#^yi_9z;PPYq5EM4~+@Afjeqcz`i+0ABTIG^9&skB6i&tuKBs2K-SkcxC%J1$qHn zc^sts;3B|1jfTH*5DtB@x%nP*y~?&%`uW>`hf-ahq9u3MWP~~M1kzo$6V#87V=!!(NQyJRFpoCO zr!|i7DVan}E}RC>e?5}j;#Y|Jf=QyuFx#*7#*7e<7rYc-B|1S@Rn0 znj&pLaqNlQ*+!LJ%y?B{CUnOpwc&vr@?Q^RbEQH0$C}hzvPI3fSHg?PW)V(;@ENoQ ztC@8=KQ%tAx@zFq>`^s$8~p{2xEm%ebSn5CHLRt}KVhQ4APa$F5(dB+kT4{9HZYF+ z2l_k@+zbK;{=H6rQs=!PjI?q^AV1ghN2lxtA`(0vBKuV2uSt_WQKgN< z79os*hcdUGi-m?-ag?ux&b z=tHyBTGf+(tan?1>Q8^s(|%CG$i+ET{E!D`El@AI7PjuNYvjlIQRs zs2BLRoLIQT&wpcPP{Ejm!Mu+M8!3w^X=!GQJoEQ7a&qcv|DoG4N(dsV*2u4~AF_Cl#{C%B527TZ6eZxck|=#0eIz*OvGrCV2lxBlw=`Ck5JHv zl<-)^iI92j)r##&NlE%k{)!s8Up{j~1I0f%As0d$e3_Gc=&j4eek84SzjEO*m;l)0 zZeHq!cLIvGAKJBq;j4sZrIXGw=$s#K_D$MW^+b8EF)Y^9)3)8}d{v)IoVc_ow9l!4 zaK&876A$2fj4$=r*riOpwVg)Z)niw4^TODPv_$AKv?koqQT~N-tSHp+Z9vftw8tx2R%dzyCpcJmKxeN)Ho?D6b-uy=JEdbFFg2fpsi$Uv-J zm~NY3?&6HJ(cTlzm5}^Z2^YPkS=kj$o0s=-xM#UI9*2~fcHJi(+^<}m zThD-QBy~wtTd;^(5q3;fP|QeV>eE4th4V-mLx+Acv8YEe&-Pu5NB45R0r>e3t2Avx??Tlp;iZ9*@0(4MUU+ zRQX-7X8tE@eCe%cG1CgnaM=K&NF0YKqohg)7+uG1C)V@UPQH8yB?ZHg&*tR;!@R3) zbzB-hm<-FPjQZ;Ubct`gwAHZ?bMjWJnLxhNrKe$9>8a8ZFvgBxzmu{ zC~8l}oF>p1aLLEK`HJi#@GQJb`usbYKYwS^p{q;57sl{=mBT8nvQr6VL9`4vi8(MW zJ#yqoZ+w_n@b=q0BhLM%7@YAPVF+yS&L=7=>fZOhMqba8e!gw@ONwU*OhtOr)z~?A z^hp4V`UISn$B8cvx#EGQ*0W}XJl&kNB4OV9(!_l{Se&IUSKbEj2uyhwqt)5NF5xy4 zyg6D8X`uO0>ME|_Kv^^_zu9jJAx&SFhqPCobIY~xOL+U1R*&+^Htiwr|IpMrnf(_& zHt*+6vKXv*$}Z>q=R4ov*)o`atZT^Db?+)7`9^eZpeo9Cy?NF{?`) zaZ8%~_?Z3dSvzEh9)%m@D2VM>M*R5RW~38+{OAAfOR#r!;-qzzjS_xwT;sh}LjOZJ{59XbA2)safo97i4D760x6drpVz53n zE&3+fgno}2Hfdr?b?&E^PFO#O8oA2JXbo!`pegYnouAv1-^w z>?ORVViM0AF-qaOYE^cjh?nz@2YX3CL=45F(-qY{hO-hdMIdAQwZY){@!xFD{U{0? zegP*KXClQ(8FgLCwP)xxuF_;|dl4wK3dYoIn_fCP4KU^VKpNUySR55I6S`0U|AjB& zr_4Fn`OSpEAD7ab3wQoB?(aZswI|Wcon81!SXS-f8rY4E0eUP53I|Y9R+%d|puv&u zyJ-5?R+VLoqH_8>R7``2B*iu;jrNgRGgp+skrb+VfEEnlG|Xe#R5uq}NV z7i0f<` z)VYk8!qg_8+5ctDvvO9A;BeBzmxar?$wHT-HEp=mz&h6=~^IMddkF z)!3+2d4nB#(Z#vgJm}u5bw4Rvl$~NtJ(g%hs(UDBy_6 zPG5K(Ar-cMS(2_pVB@vn*>?XD&whPd@Hmp}UjmXEgjxMItS~9$&Lf+|7ROE$J{{A3 zTbsYYQPO(By?=$s{}<4bIb(F!eOI47yL>BTsG{J>+26R}N8K)c*?5QXQt?Jb<5Z&t zGf*TIT)jqPB)U3c<@eOD>dB+P=L<8s2_hPJd$mBMRIfo^m4na|o{C)yge}WiyedmZ zlLxA#5Kuv^=3tiUzRC|GttaakuKi(t{1dV#f_zB9F9u@DrRt8Lf{Qo{vu?7d_^ZV zPXMUh0OFAE=HO1?#;+i4q-<9?TufCmR?#!?5+;)^VNx}GdBL8vIQ6S-L5&t%tNV3D z6+1vC>3pYx@DML3WTM_0jwJO&VDG8sOet7LZg}{cLr~hDYJ6-sTLwxmDD= z2{46;wyGC z)N#q{6L=`8_KTjLThFeLk%X1KY?jvPrL41gIs}9fX=K}x$Hy7}T=L*l%Q&n3{v+f1 z`PNOiN9u-2mRQuD{T+)1CSOOy?H`|CY5~Otd|sC^6{!6>(7|pJJ3`=#C9j<;a{Qa; zom1nx?#lzV8?@|gV>whIHFD9DZu&fRD>d%qpB((UXBX-JdSh+GEKM#XkqCAF0$N8* z4{!fC{FChpEXbJsWlhEMf($Tj)9AeftTDb8Ewc2o?-{)C~p3TD^>R^SEq4?6muRoDymRlpLxUL<*&Bcp-gw$=^p-#>PPMG zpI@=uqNqOqdk321Q+Cnk#4-WoyJfiHl%f&wKZp0$Pl=vQm=?3TY|^a(k=MFGk)dpUt}gsVefhL92^9f`XY| zT_PkTcU6+>cB(Y#o<6NhFdYvvLTQ6E4>wo+n%aLul{LV1_aoH7bm!RVErK zF{G$nym+xenFzn>*|(SX<2@I~lVw{%+QPfx-G$9={B(;3pP) z2(YyLS#Fi_t}Oa_s#rieY$h?lA|#ZThlj!PWK7Q<5>_>E{{26u7ZSZNBid8xjmnhE z@$o4H2m_i(0HUNRo$SjyEaEuMp@*$&S+tjY8>UpNx6hD&NM8(2<@4H=y(^@IHD;?v zvk!!rw)|yGwX?OA%$r{_)oIZhlKMk~TU$X%+e&R*aAlMfY76H`U@$qQ#b~2oPtOMJ zar+fUd#@hy71;p>G}D>CmtUC|@Fua8goXy$;VF1ZdJ_|bICZ~63&g%5OcxF3OmNsI zSMl{`sY})VGR>pnI81g!J_clL*|ArjBB)ad2^& z5oT@)u8a|bE?bqJ$>!S1eim1Prh!YeoG=Yn=k%g!+uBa@gn#H2LoI{MYWn&bWv_@ zNdNZVx%Kim;~d^g^bfZ#6#5?@#F3}p52iUydE^iX-YzM%G+O$+WC4XE;f3sfEWFLZ z`dUTyV_p4!K#%<&Y%*6i2^>Y78-4q4YZE1%2zdWBPCWGw#QR;mHDJfioh9Ux6huw> z`pvx6fWh3iU;e9j@RO7^OYJUQyci;u40b9pVovcg8VN6z2aJZ~!$|&N2L~k=7njVc zG0j_7G27=-lvm>lcuG8aWVQd_z5mesbPtp`KIvQTY+UMmEY7=c>%MavgJGbYwfLAk zb`iFg%*(5mJZFg&_%0rp2XKJW3s;S; z6--gNmpo5*;D68my4R7V4X>$Z(R8NfRz!i#d#aRwAAM(A3(~9?|CQOQ{Os>|`~N`y zVPDSEvRh=lfYMe*v1@UJCt7A4WjWa)_l`wTG`4)`X4oT#%z{X6KS36ws4lnAbCE`RzGQnQP{?2IEQ=2X-?)Cn}xjj}jZYAc>!ai4sk6}#4;j95Z7WO*{> z%Oc6k(;|tzTHO~69W&u#P`~0>2q0F8wz-lVt_~-kwtwmmHjbxpDXRMV%_fDDl{QeP7cpu{f&+{1XEbZ zxH%GtN5Aaz9#(hD=_Xjok%@80g#mv_4Na`6UgL0yG1@G75(ZU8@&l`~(avS=Rnm#+ zxOiMNWWkvl?x1Y@K%GG+bkeG1+s&i$G?hw2=EG>uZjrQa1X}h?Bwkda4#eoWzbCux zfck}%9+%J|f7vM3hc%|fSqDleR%9>^C~!qGXt=yJ4^B-};r&;yYd7&wzlOYF>b`x| zoBBRjzVpieM1o|l7>MXDl71L2_nqr~@a|c(b2f$VOM|BPRouhpFTm+qR%IIJ?zYms z0r3*Uh$qvOz#YCiIz>P z=+E@BJtxuE(K$-=B8gM;*Cw1Ai(sF&cq4nT>+=?>&&;~Xx*6_cO3r;jiP+bD@J!H` z1E z10oaI$dRX%%WXOa3HoGO)u~fQ!q5tyU5HNm!tMuggM}5ZQlz-dH`&KudmA@ae15*Hzkr z4;e_E0eVV-8H8y!ro+g@U=S4@;9c=);E(e1T6?^2E=R(0zKs58GXW0U!VQ_29ELE? zlXPj}Zh!PgUSnF$OqDun;YBVN{}4YdgYVY2H`rkYd?Tlz#4N(W2R`}s{?q;AlQcO3 zX7*cxo;R(Rx8hX)ClW0Lj=@@u}h1bP1 z;ShVvGGG21Vu3(@2%cxEVy0(%(OkRWGd@m^xR!VMz#WFyR4$Y8tDpU3^TTLNq~xPi zl1`^pieA?J`w9h+N2?FG!<(b(I&apFwp-2jjnbEly1jZuFKyS014$Bsc@>JkeQTN0 z41t4~MH#V9L>_IgwKp*Ec-#w=c$u~Drm1XVaI<;0=XZFa&Ipy5=J4ss0XQ*uc+VcI zTwT`%2M3$2K|Pz2sDp%RBx?y&LJ40v=`$SbPHj>fG9CvLUFLt=ZS~JD$0V$AK_Nq* z*eg>;{s~%<(g(!_!6MdQjn2jbZ_1-?yypWMy*?#9BJh4S%BPmUKX;GGu^9LMwzsCE zN4IJd7pB*GN{RW>ysC%a%j|!Y_vir~srKi4G%U1L`&Wc1 zgujlF=%)@;wt$d3^oE?IV;+3t=WW)qWj$m_nU%;QEiR_eAx*hA(#gpQ?_HO^eJ5)h zoGcz3E*kYHhrseg>B(vhc zGDnLS?CF^>O38^P@#kV*vJG_V*~&r)5tYtt&ahLF`c5O@0$EeF$(ohj3Y(gvpT(9BY*ek>+8^KU-?$+!T?}cCPf0J#iMA}?engp{Y%Dfz6%Ow%jbsM(w)|PEm%)$-JsK@a`VHv4xV*PHUn0|+d4lu(HsNJ z$&&MDy7FkIg4JY#!eth!Qkd|}jC-ttvoX`fc@B=o>vUm9`_zzGD{^2ycjxjo$0`S! z4So<4DcJkhYg3fb3XbOamAM>NQ?2_CE6vo?I)|#mNuX!Ns>RnXW{1$t%&*)rDOiLB z+heN&>;I>uf(_hA9U#eUr{ z+aLeG^)r9}3uXSA)$KqzX}*tJjXyEK^~x25$#VBdf;=T5gcy~bo#v)3$UeQ31{=4T*@5HT4v!e@+>t!e zIX_`d$*bH*n_+$6c%|ziH;u*TxjShCm%OZ_s4ViXY4P@M(6AYJuCR^JjhR0STB>*} zF;V_ek&)+yYgI93yl?+ux^0@uFg8beadrhh8=_#k56qxz>C)!(T0ZqNw{ zEONZC0?f(6@Lb)HihrNv#NV=3v_3?cj!=hDkoWAbajZhX|<0dAk>yd zDXNT*+rytWJ~uBfG_EFo^_MpdE32x0WdnYA_T))Koj%wi13emx4>rJ^CnwQ49;k*c z?SQ_lULaISIrSD3Hb9zr!|Ow!y`NURKzMXYwcwP&E?RmSN1j$6`u+E7B%kD0|Iyw# zbgdVF@@qh5(_QNmi>!}bDnfTB@e<;`lEjY>;}Gwo?cB~~6nIiM4{_|*a-H^m;gyGa z!5}i`$lt~C*zwN`XV11sspXp=UlRz zN|-80l{6x>5)Qy`x(?ru$?gaA>EjOEOHc0=Tg`n~kG2Z2r=-T$?$~rc@oGjua@3Ko z%08B|HQ8sWnb|f8aYam4U-lp%kxn5*f&o~vp+Qr(^Y|zmUR2z&*YqZ@VS#<=)2B~G z3Zxr-H5*12DyU)6C;ySBsT4{IMx|6FBvwyt1-8A|^)FYYZYTG325Xm48992dQ3!p0 z^0>8nczMltJ*t?b{%2kcTyCIF;?Wt<5!%n@v||#4iAdng!Y6%r9A48$=oV6>PyJa+ zVh+t4p&GujTaqGhCMKp^)}A5|AV&nFruAC!|5q27DfS5P#nziHj8!5gqxBZ;s&wEq zlj{46DDr5l>M3jmye(Mz7kGQVp#Me3q2)^n6_P-j{Hh)uRf17-1g8xS>GsBz?uvnj zvM(7Qk=*06Rf5VE5uR{zvcdjLnzz=KXj)wc`si#$x&!EW|q2r?bTfi8t zu~o`x19Pi7$mwOTK>lPeQX4n8Ryes#+U*8Bjv%$su=MrV7d6Z$dbe#WS9UNWVlfY2OS`^ymAmN#24GvVzeCH!5n=tm>~z_9A;zNbmo z)>ZbMzQVBDs%?Bd74o7~HNAdxq7B{(f$c~eFS0JQ#Op)?09f-dz9&En*q9@YgTx=3 z1m8Z@-q_I5>8RyIFI*TDX z%snmGUA<|qfZMa#7|~ZUBP1j5$EqFoGrqR{Nk({U%-KBIjge^xE(v;alNUfX?3DE1 zIegcV0cpX%O=F9jj_lt6(1sTl+Map(6}X$w+t9>jRZrsewkfau467hBPQsd1vcZNY zECsU8B)ZF%v_}6Ga<`>l@yd##t2^*sI5;#u*E=h5rYzg~utARnYboT{Dssz~9Qc=? zjcXpzD_>CuX-yv?(zqEB9W)hT zn->LWc7CY6cCsXO8s)8oPxt}%<&&S5I@A5IK%}VVPkAa5 zXzCs(tQk0Jw}#!Jk(OFeU7?3rcoh4bYE10`zmk#uD(AYKwDY!6FN7u2KH{< z4E-Yudr$G2^_V0D&c%QqU7FOy8kL-itgCZXXEj^;f6H=bL{~!N6mQ<0)l0qm;DH)HR;%z{winm&54Pr--gxg<`z(lY(N6-DD*;DObAXQ+o4t(iK%Xef~>i*}OmpGRGu9#4E` z(MFTb=-wJhaZ(*W&g5&?$N$81Hm}Z&54}9O>uLK|MS)8*{vbID_{GZj0P<_!*e@=9 zIc2bnPkkNdzwvxP&SjmXx8u#sjF&GzXEtb;NoO7sLt4L$bnh(-t2T87srdTx1o(#O zBNaxjv~Az_peISWLf7I%D#?OtEtK5P><-KE^)?svI?+pE)kyO&w0Drp{#)?c4Kxc1 zN&AZWR`d-xhxcR)!n95h$&$rQd{eg`hATg|4xe~L*{FSaDOntXfbmsU&z5X8>AY~p zUy_qBFP5@6aGbijx+*%V#9CdsX>Q&$rp}uYwj6{F8aGx;@ap+~b*(SON!Utcx!Qul ztk+YES326+RV&ZU?w!g=h{z*%9 z5)hJ#7!+Ip22@GZGZKSD*vxC7bvXq<8kGn(Gyre<+NBPUwBW50;Kw1aNox6ao#I$m z^Vwr%RRPCD%e#f-<)GZrsbj+^a?0oTlb7o=3|&i29ep6~>{%&6`e1kxI>n&aEMb4o zwKbEQo}1jth72ipsT_lPMMg$4-5cgIR}e!yL}Jt)G-=%UI-jiH=L=s{bivNYFFKNv zmss=NyJj;3WJg8?2?u}SO>E#AnL_C_Q<&XM->q>$h zN95g@Q=&GW87`@J%Kd+vk_pnvH;aP=|%WLlcLt%a0gj2U=O1D)r$Eenw zb+Sc((jRkbpWgYPmwm~S8HmSR=ZDvLpX>O4P5fWK`9yF^XMZ}N`kdJ0XlQZ_iL@O- zmQOwxS0epHi|X)_(#htw?a+Lh>kI~scmj@^k?6T5^9sP|RrZu~u8bKordeGhLODAT zNyHOdUm@}~g1%a4?C%fI%@kF_n}*bPvI=v)rJJjm9X1D=6&fGCAGBu8qb`wW=nIF-YBUcoq?m+SNuJM zv{xB~>#1n$5a5tm-+0|9w4<^qh)mX2ScP=TE*Y78)ot*1>@ zJMa5?XovgL2hupJEeBrhuJ~f!$v36b3m*GargT&9LWYh^{s56j#EV^YZWP_k=yN&| z(f>G{x(h=j!8?<_&Ya-DbpcXnb=L*?`>#_U9}J`IV1>JW6%Vmbb@%czc(4XpOc6IB zePzpAC#&8>H2jCt=?K~Ri_bu`?pR+KbuNDv)QP5R3tsSghf zWc<3&tZAQRJ7#w?8`(v5!pWF^*0C+0+DlDq z?9TNpbb60D88ICxLpM1mwY;h=bOS_JD;x;isX*>a?^+*_L@5yX z-m;-ou!}E!-M*c9!}@bAi*XZ#B*}u*HG=wFzW5yx!k0cjZ2Z2qwc)^n2M)+%&-nT{ zZc#fXwCf%&E``RIY6y1puYCR!Fn3(%D5I(E`&Sg{VE_Vh2m#A(4?zEY6{Ic1 zGD2dH;Csi^a^-9ZTo^p#V;?9|9yRq+@*ZS7)yhtM(&Z0|+DKLzoIAaH^5n@kJon$p zA5wc7fPkL@yUCFTFFDxkzYIACx)czg?r)||4G>luXW5L%3mp4J&x&64w`~S$p_YXf z;TK@ZdWsT*rWow;=tO54`53a*tnRx8AX=B5sIzC8@X}ti_R4CzSr3I3i0f zN5g@Xv^g}{;3BF@3DjZ{qZ@9isPDRWb6T8$)sj+;^Wjp6+0{vDl?#+?TCEoWun;-rt3C{ZZ`VujVa!1Li`^=L+gQ9k= z%7K=Zx3S#rEe*J&VKGcyFxq_wp>_t0k8H^06?K2v3&IfqeL5gb=I=Pd$NC+ z{>fc-b8DVlC#MxH$NnBOF1mJN*pQUian(BaFNe51|BzdXM4(hneahte!Hv2bP5jz* z$A7JP&NuFG!B*{1$FRV`b$iwPRQWMlX|4U_?=eGaJeoHj7?k|*>DQf^}7c$(;D6$&`*!Csj%bpSLQBgK#g7rnINmh!aapP#qESzhos=BQTNZu@Ra zmiv*^Wo~ZG?H3HA;e4}nu$ppR9xz*5+g!}l;Ia$qI-FRLjzL%r{Yq67fC6fF=s_D0G3wvTUW3!w|Km`U8E#GMlYP$}t9`3H_Ttm@2fVC*$yV>6AwMubr&xfQMz-p2KXRnQ$*FhC$3-C(#MRQuet`xy7?QB{w-4+7nN%48dE*O@swteTrZpl5&UcMBoTTY*1gq z1U6Bz8w`1X0H&~ilQB-w3Mkdul32#8uyOb9-GhS4dvnsrph5l$rZ{z^O}IQn7`%}OU**GsQibM?9w-~R|s z?|yWkgLA^ma*e5>6yE8(dIuezz57~%SC!3p7q9)ZWpF5YqCDGk)4SOSukYu!>dsaqe- z4e6i?g^l5F#C$pe>`M*28nI(XWBAZl=+5fySbs`4jdpOSQ+aSD6 zhr2~TZQ~Xm)LJgI7G0ln)yGiFi0e-1#Tm_&$UYRdz1P)swn!qye+=5W#Q?W2`AOl5t4No zu=x3b*TebR9>t#CWgj4_0CSqsvF=;A4{Sm`rcUh3q<&6;AbNoY^%bICJkZ}||Gj6V z%Li6QDvzn{^5pe&o`V)efiQdwA{pDJ^OoB8iMG;RF;ml!L2~E2uI$uNeT-sQm*+#2 z0O)vru%>IL$D*XRK0M7#UD zHJdY!8I2BK_5xl65rr<)9zIklL>5B=or&aonfKkC&2#3?efxeuX$zf4YjYkn9@T29 z!5~0x5T*vLNeLwvKIH{y4 zLc2clD4O~^elRM8Xi{1g#6;k;5?*JkT{ZZfe*gYAc*O+17L74YD)CyIj6;8IJmAk; zl{+0D+xKwf{zHe96*k!$AbUgv1HGlSyN1d54AmJ}RE<_3z+`-mdcENHBlp!9J{$di zL)+J_8I33FDNiuEUiO>Kv*+G>)#DciUGsK2uhWle5c{p&Yln!U%m4S+fBoj`R8Xp( z;j|2GlK)T%Lbd+G&v|0K#;w=!SZ^5=$XXKC*XTZ(%e#hHp%;3^E*oYc&L0JEy+UJh z-;PURCxG84#t!e?*;v(a-|gAF-G)p%BV)$*z0Xg*tJaat(Af?^vm`EhoT}>4qlZv$ zV^8$C{4ul@zW{Su3bEZF=tTP2LvI5o2f)KyzW?31-ZB|{6-JaLt!Iq&^L_PLjVa)6 zZ*}fyM zBqS^w7JlKvg{j3_Nq+nGWg>Kte0Q7BJI|NDzi;YtkSSAaO(1Sg==t4;^W2`-`o0J} z%BK1Hf%6$TpqQ#B1}$Mlrk_t+b!FeF1xpcak}A8I8S|cESJ%;_M}K6;{Ph*5IG<7X zjQv~+=Pk9B`N;wKpUu0WNT5Y|%oad%WKA+@^Js}0t850F#B8cNAXMrpxcf-eiwg^?c=q4fpz7?SFJ|eAo&|k3f^u{u|$a=sj<@9SQXk zQPp{Q#LKyynSL%|w8aZv%;ez7S#94xIv-j3@?A6Z0!ei;I^61RPKOB18Fx!Vn!3AS zY4qE&Yynm0kk*3Z?!o=8jrut(_>kd@XPog=;2~WqJ{TH=PCaI(-h0v9x%C)I4-ayy z#RRm^-~z*4Z?{(_h+PFqTg_!@m+n3jMe3Fk8kJc94L0dJX(Y|UHZKr_Un{bnbE;lx z+l?<`=WIU^cjnCM*XeaZQjM8l8?CMBUlhoeQp(1#0e5poocQ!IVTNj?9V>kWBfC>3 zgZ=(q_CbYJe`?ffN*-+%;@a$Ovk-8I9-U)TLDVA2pXdG_rFSX*^2P5; zFQE3eSY*5J$ZFd0d$H??TAA_AUb}cjuHpH6w~}Vsd{4nMnN<$}Zs!(0DJIkw2A1JVM_`d|REn9R{ZZ4>! zJG8#7f8^zwS`98AQIC%ddA&Q=)Yf~0X=uY&gHHGVpA{8fJGDUsz)z&lI1G^Ve$5~g zUq=u;$J5_<^z=5P&Uxf&dQ43!+?#<0|9%UxZY?H$GuNFq}~ zWoO+z>bqeJMp6W|@9^O3CAP1Ka~NzVoF)fpCx#N-K1Q6RsB;_9-Biz8ytpZK3FovE z&nR;GW>|Io3*7_(-uhH0z$_}m*2qY~s)vqm!DDsY+kf$>Ieg@ZX^(V@tQ=|FYWpbrI4GO8!k}6vXm=Z&rj2s|EIf`r$?lsICP>Z7R#2%sYxXq6VwZEK&Blrd!p63y=LF~ z^-5ym=d*MM#Rp85b8S$U<1;HmkhtMRUG zq^%B-f!57!Jy}UYKy3YF6?N#E{qJ2nhjr$yvHtSpN&E^I7~JMi3us>YczpZV5T<JBd1R+x>p~;PS^D z-n4D4?$BgLuc-1rcyKEy12JWmv9{U$*+r)DCA zrO(@CLo13Vu8TDE2yyp(eqo7yiC3t(j*0UyDlb2=<7Fx)Yg(+{Y5qXPERJKXqM-{w ze;jQ}tGW&wX7}fv{G}pf_N$`0Z$x91zuNE}Ys=i1+^$}B8)U^)s~4RrZ~DIHiE|4E z5=JwAH}tXK`26X4uemWSe}{9E!=m}Ho_}V$j%eMw^_ZE{o_J^faq07fq;VZRW(-{X zJef1?OXc$gEC_nDYHa+g%L_jI=%hGeF`GGTy0!JzY&WmkH{v&B`l_pN*JMHU_4t7| zHqw(Xul729#(C3by5S~cu5F+leH7o+s+3#0!?bV6iSCKR;Ymx@n6l3L_UjU$-Ab;X z-=`JBW*R*zN~N_rR^}D;(+lmU+wFM|L|Flx8pg5$znn!aA8Gz}Tcgh1JDT&|TkU@F zd&=zvgYBXNbS!FtE&Z|t@K8miTTq0hdjZwY^0=bB;p)8dJ#AW5Hv6YZ)l7=fu&yZx z*)?@#by???)qBb`O?+O|`*3SnQ@fL|51f7!{%X)ae_MX1*%raxprJzx*R(eAy-7|u zZs-wc0^EoZ1J_O_JK&4<6cD%f8+d|*gwmOIx;@JTl@;tgwh0PbggW8|R?YM- zh$GH|Y~{G~^Rw#F6^=%zTm3z$CjaM3ECy~riXDJ|wmbXaY=lwIAi0K=uuim7KpmtY zjG{X^pE&*0TcS%SC);~nMcSfHsD1Mi9~6nQH;;m_j%`vv#3kirE_5s%b#;|_>jJKK z={oW73H1xzwg~V~U*b2Yy#m>UBaJClI_r`>y{SG@3Wc?O7=dx*u7jTbY!_TwSGJR> z^_tlpUk9}a1k513?ag*3i@jBO!PJdBzVa7|WmaKr|;_LgUBJUlvcqm8C6T!grXl&i#x8kRb0vO)%3Nyl%2 zck=7*>JbP=%ah(bcm?Gd_P!}xK>gaaYky>Lx6N8$HgV!89Ic2q@VR)pg%im)x4FB5%pcXRKGuw!3C(YMMuS;@;~4u=3^vCJB|%F$1Yu3>7%4 z*?mf+Y{ZEqxTFW@Nn_#;+X*@xi_l@D1X|t(vgm>!P?E1XOv!o*ogN78%_AgWlR{7r z8C!Ntfj0+0MP;lF9#LDtUY!&;4hJY-^>#^~6$4IAiw-I(WrfHLx1q|uwZt9Aq+mgd zfBoi7lK#gp)p%HOqGq)z4~h63si0fmt)WvAv5G*O0IxUcwQrPJ&7Q55i1ELY9>y>C z;j{aV+tRhS19Emlege-|mn+qeDh!tyGa}1BZF)59&=6f@2sDsY$VTS^zA^QWy zN6Jh}F(W9e$ID(cj3uyH+t;<+Q`WY3|Ng$fqoAgnc%fcHo=JipB*wBzyA9>Nr)4#s zG5_;Xa~)BP2?sC!G+zHRtP#6i>O$lA`0}dgA4i+eT=+7p3KZ+sP7X+9WeUNzHaG2H zOgnULgCBA?KSO5;D!T32(;}=60MB|XtGO_gvSkGH@XO8M8s+k~dMDsewq<8g<#Tg$ zJ3g9!(`1FGSF`+S9v(wLBzpzD^6~XAjftv%aR6zB0iOlaU1Wk*-hCx z?!psPjspO!9P18{Z&Ryg^Q}x)_HdR2nMP(cflVc7~j&j+7_||RPCT4Z~aM?V}q~Yzg2m8$V z(!M#ejt$51pH;1z2_|L2mn^eg0y;?Xmeom$*hGDABGE08gxk6E#TF#Fa=Sz5Bb;BvpV#_u z5!6oPDxi4))T$1K6Bs%4{ELG?)3vT7qVI3MGHW(wL7I!^GfT<%Vp`*c?HcFy*C72U z5jaHMEsdi_bP%)!+!uX%1;uRBeR7&#vfZVuuA7VY+%LJsp0cwR=vtL#+l@QfC5wA) zifRTieI2}r25Y{Fv)kXtLm~9r4+12W#&kK(Xe3f{cQ1$$lZ%D)o_p@(o9n2V>jubp zaq3j}py8gnaTYU@yb`vQN%|tM-e?j5c)*o_LZJc8R4c6Pqu+jCTmIt*5-Jm)jkE}+ zWAuMJ^!=yM0Yml&&#jGi9jm{^qayMM15Z~IpQY*DDT0wcfX8T2#1jQ1Mnhg|D( z02|;qEg&T%#{ia!k~DH5;WXA5KwE=()ZVkg^GKlK!dgbEQ>$?HUOyKa+6i^tCiLNo zWSn)fJU6NeBnN1{0izQwr<})~{WZ~TQp!Z}fFnjWdA%8Y= z-!FAqho65+(-I0Mev%ZVSHsM@?i>5)At@x|StNNr`GV;m`^m4l^!Z?amzEeCeCYlp zl7mOWm!C%R61m5MCDWPsrDyR_=C7^_Z4;5Tqqx?d%FMHS$n@R>B*rEbq&ySn$P3-5s=B_b(T8}s>juYn$jjp+!+ zemQuw`b7@mLTHA%|4cYcBsE{DZT!CO)!e?GCzOMR{caPQ!6rYhK=J&?3ctP3DOJ`fFUc1DBCL zcV)*!6?UgMK7ICVM$Wa+&ewsX#f*o_Q&y-)ViBjgLu;es|5}Fq4Ofb+PEBnhYG#R& zvQON>snU_z6Tac5*yW+UL6DAwj_Vwz;{W!%4Fk!F#YcbkmGzkCAHkAzpxeA#HUP#8B#(^DYb8l~^PRcAN=5J7#eWG`XV(CLYOglq=ZvWf*8mn6yqGx=dP?iv=vIGW?Tt896|vP9uQ9)BMF&F4C8Hw18WZ@D zKIz54U03mtE{&v`cj@2%ywUgW(I^Og8q+As<0&OqDYMZg` z1&*9S_OCOq1i_7+(2D&Qej>tFZ!{r)1SToXt{Q)Z)BpCGnbLSN+(?Hb$$Y4os&57d z4l^*&Dg{7y^k4+M2*fqxMQX}gK;F4OCRCMAW9A4tkO(vo`dp*=9`)yi_m6F#eb6#O zq}ky5n`qR2t!~PW*2FU*-Qewa5j%HII2}CUkoV!YT>Z{n1>lq3-q8-pw!&y$$e>;i zt~#G5P~*dn`YI&rB9qwbqjxrSNNcD3wyq-ZRRh7-^=+0s<#FkL^d@! z1!UfcpBE-I@VYAKf-J;iGH~R__Zw6|H!B`A6iuo|kCr(C(D^+>)Y?a&HI9v$s_~>i z#T=N*1QX*_pXW|n=^=u?E$J>34i&jD&dPa*1YP^dTy(<-Ig))EwrEDR#iG;^Bi_5g zX&R3SYK^$}cr7oMR;L?cV@`A8EsAQN8g}RM>W}LpU1M#&rBA+_?exv{i(Ii7|~SZhLxnIFw8K^|m~}c{jJO`kepn(h`mxF??`i`tHb@5QnVWb(Vul zbUr=Lv}c#ohF8NfOlaPkJ=P8qmt#4jcAhK{-hSlJ zqJ8vf^Z-h;O~=X8~X4~JRA!W`p7*&KWag3wH3%8}y zf}1t{Jj)(VbF}GO9X{9DxdF%#88;JDYb^j_otqxClkt~y_>_!{X7CiFIj=kJyRFsy zqBuw?_ua3D!=Q>Vgc*6JNtp6>BuC;U20h;L_y|Q;P+IXO07B^4CmQf|GU{+BU1MoG zlQs`cswnx;*|bmBRB+a+u(|+$;fcw|n<|o%lNC~{flIq@{ppNL(u8S+vaNfmC1Dje zmn2nf0;Iln`*ycf&sLZ!5H`x5wxvg4b+_i`&ce^#9(PN++jCaM{GxS}rEPe(^}>aL zq-=@S=Aa_olV7}8RlcOQLa|OU)?|cL2i~)^r%&6`a65W(y{H7*nFH)(IUX(OHboRl zIog@7kAere8IMQi)kbpFJQ6s2N#UYnXcS}f zZPs#!8ykfldF$lpNbu+S6z^s)J034~b*LZ4`uI8udhh%oO?B$2P@jh5li(VC#B z#*G_`^jvYPyvl)bZ^dW()3$?4E~yh1!BH;%9z&CEtDh4Gm)rQI~o32v_Ma z#0N%AmcKz=cz51Um3p&%D9NiyJD|3Ci z%60>dz5jEVY#FYF*l$N%!n`(Z+MrEa2dAC5+3zT{9R9`*3UO77u%%q%{%@gtGQM1) zz!Bx*nfLpTAXAgC!=tX8X^!w_?0&m~Rnv2>-Txi`WS74X>1*&9FW)a3wz^nB^Kt{- zu6g2GcX}ULl%`oZZ&&LfYhu&tI|9D;43BEg%&DJ%K2=eTrGML=yBk+mi`IP!JR?Z{DwFo)bACgWp->!RcI?|3pSZi7%+Dw_+@r zH+(rbp)aRJOJw)NY^IQbGz(MV*6D9Y9kaZO{Eb20@u00q(HSWkDw=k`gA8`akZ@@FtrCYa#BA^6=k!2#i5`T2g?oD3-OR0qBZ_LDrn+UO* z-40!rBsmk5D_OnFRNI8~q9cNr9Eo@3@c=}EP1^P|!XQmRRAYt|h?&~7P}%XHU=KsNO@80zoY;u`4NaBH1oU`j0UI#Va>w9Ha?y<6-mt%jA3R);!4}zk~C`>E# zgE_{Pv{Om<^Z6!u!3Z7Hp1NG@NT}T|I8?Kgm4|j0ahT=-zyfPK9 z8!(~Kqj}Fce6F8wqL3a@Ts{nd@H=A8X3UaYy3UKEEF(m6C4gW7Z4^OKwG@I;aY_To zo^M~21>7hyUg}sEbWb}<88Rhnd18>k!Q;!8K{Oih1_8gWN5Dly5*6~6?f3U6;KgRl zkZ)G&_|IdO5gFLZU;&&ee@JqnNzk|MA5-<{^<}YvB9}?i&m|T!n_JXxfpRL79{hnQ1AG!KHgj4%XVuvr67-T#I*&hZF0J9yOMRnT zyq!`_nKr^|YR_@^SNt|&Dy>YuEd^AId09;HykrWV=~Bj(Hu%PxNOQk<>pL zg%^9RiK0+mkebQlGw`gnsCsWbJj9cxSp;oT`DL=D7X;OIx-SiAsfE#8RxGF491Q+U z-UPiJB@4yhH&#hkTup0Bt83wc%YKHg0qUxlwF23sJ6Ni1hd?}yx`FUoX)K2Ud%O6Z z$l9shkmK~@SVR4e4e)Lp)#2~``J-?4@dhe3$?Lq5biz8c^!%j;nG?5u!-my(#wpWS z!@u@ZRZ%gn0iQ|y7!*ay{^Vz=4nw>*AWg3d>!*Ukl-PsEiA=4#7yKQxy=`B4q*^SX zEF+McA|28Jzc@c_@6vBk_;bKB6`@Ag)*i^#BBf>u6>EU&;QRz+`o5vj)G)E}!*IqK zQk*jJ@?eM}aC^m(qaRtB*&Gwwi2j`^0E%#0IRTuNb;@|YxE6{OoLbGQY*W>#rrR&EP3m5v#wI8vt~vJWw=%+o6FcUWw@C_$kd{PN#4@w)!$AUN=?~8` zpS;^T;?H8g?3_N6X%ph|rOlCFj=t0%nu7(Di#@n(C;NYd3ub6z4yfumPKX@H{@C9$ zb0;-lEJ0V}B~VrY;`yt%FXii-_dZ8NC zgx1UJfBO9S_W0D=&adnZ2aGY|Y?DU0KnGDsi0e=ga6H~ZJ->X`UhF~t%jrM(bKJAH=3d0k4M@o!>K@@b2t#n{| zj0dh1D%qKDb%x4&j;U2TJbAt9Sm=@Ii5gG-H6W3%?6k}8{k3T`a$0LQ-R@}2PUY7d zZ;UGhQnhN;Qi{{-3T(K`XPwE#r9e^2mMyygnw?XUQ~o9Ji?WJP!l~~FT@RPc$k-ln zhh0jY1V6`y$!5Q=^t9;H?uE&!QV$dj2iu~N`I{Uzw}IpChkH#ImWBkwtR{zRZor61A|Qa}E3um!(S@{ae#89M`8glj{@u!0Q*E-9mw8G} zyDcGSwWF3zC>j67A0+=~-X|EohM21h)V&|$fsI<-j4joF>P0;g2G;!8N}51n!~4<{ z0Fb%tQcTr&zIglW0VWH779>fc_)Qz{)6N-@lUAAp`HvN1q39T4Hkz@2QFXtYyWqzY z)~^OR#{KON;0_p%Ovr@X&8g+~H*#Et85oO3g#}17TeWGEOj-a}U+x-^b6b=WFhRUJ z&!{q{?RM@{Yq&O|Z-;7yqokl9?oAiZgW4{O?rG4DGLZFZ}Uk{?pIYz4loz zD^QGD!{R4xhTw>-A@HEk-TKi;zBz9$tQ5BLNw1Pu2!|~X3qhxv>puQYHAZ-T;vYoK zHR8;Zu}8+3pJ(Lf>s244?8=%Hwa+!x;-HbHkCA4iBi)*4J9I45EUwaO-^@)eK_4zo z?vRjs!vD9IT6_P~;r+P3$}>z3h>>cD*P4|nnIm9ttD7Wi(sNJ|qG%l42&beqlV@x) z#S^QVWRSThG5w7dH}Ba*A!&ZlWQp?&M&YZodu zV0lnr53Omvq05ho6bUM6Mp87_gBEA9n<&uX4Y)bKWU7STv+W=oBof> z_m7`z)Jba*AW4~nip!4V#f9H;z2i?psL*bzqLMYz!V^O-rAqxr>)hRU{Dm!MEeJs? zW?9^JL#@Mh+7O@+*!<*_=uurR1~BsB9}~B(qcRifJYwD{ac42 z2d)x=;L=r15iRqEjiI9#RdX8shqer?Qk|v$!x~-hy09cDFX6wrH=Ry;Sx}%}NW(KG ztN65sZUjmLPW!lbV>g(o&_)ymPDr&WQ>IuuZJ>Vps&V#xPbfvxMDs)=CU!%;JlD-Y z|HNa;tH$aNHkcmm@1J=U3?R~$>zK1(?fTOkGZqb%$cwJRnmC&I;#F$Vv?!~RW^A@5 z;_B6_NohT+w#;!#yQ@KgGIhK+3V@nm5JWxc4w?h6aCL=5qBs*^0ID1ct=>Or;60bR zK^@n>SkZP@>6E0cGbzb)ldEHrt~URrEbyCx0 zzyp(;Hvosew8?AVs9{4z7;7qZ>Xd^Q=v33-xHw*EKSQFRdgflWz(ho@fK*~0FZ>*w zuY@f?ctL1#l_o^vER*k5(}TI#FX`~H>&AV(NmVxubgN(Q(V}f63OhYxrWYkOCtOpT zYGuUcUZ^&>{-D$*3UPPyoe5!!?;VChBcAmXh4eZ9pZchV_p*7p+AGM&cjfJQ4f8wf z(%ZJc$+&vq=(xyI1ISp9RBq+%G7ZWokQ^W8^*3d8`7!Z-`MKWN_tUbLZS&OG9u-CP zR^Qu&@n6Wr*)v?my&7@r>eX`KRD+3j2A=59Lozes`)iI27cS(Edg~#sLF*z6$8Xu6=lC7i!uZVmILE%&g!@j9pxB+?thP#c%Qa2& zZ(qM&OYmdpz z!vXeiWl$~&`0vxIXiU})>Ui{@WAcW}HQ&nSy2b38f1h@^ZrBhBihzP<9pAjcqmJWB z=5W1wRwf1Nq{FIOkC_XZe=%J{`*|)rrz(=k!-rFvSXe_G_=7Wq6jpk9Le>a>@D2vK zZjyyJtUE~`NVCVRJ_uyzLY47NUPB_X`zGVOTKIfLE9vDGfj4Y~OZFfjGm;Sxe>1bY zj_!D?C9~2_2%S?;f(Qn`xT)(@oV3UTOH<3>VRn`<2Ew-%6#CwC)Dz0U^{5V~E~}oeEA*e}o~$_T&SH)Ik+Zs5^HPfF+w z&;?eK`U9LYWLvL$v%THK+7NoA8-NY;EuprM);Sz2D8ySlCJbM9@ad%2zu(zfTVtqe zT1J^bzvkeyfMs0e0Z<;%dNZ$rf}|_OP_k(MGr4$)Xq&2Fwk-hF&CsX$9vgZ)fR zDB$1|XU;pBCQPv(+tAnA)HmzQx)~9}-ddW2{YJQa9F*B5#}r~9K~blFd&Yk~)2<5- z!heQiF9BM9v-%}NHO-iXR61}D-O+yH$@0=g8UZ1!yv@lGIEy(XXTeuljx2&@U2=8% zDj8B7gGGPeK7ej?(q7u5;emDQ41$vX8u9rdDOUTWvv*j0Mcpodn4rAGp~C5;x?A7m zgFj~D=DNTCe#FRqq7j?yV1x~n__tZCZj0j^dnU5y!TUB9l<>zT;(%>(d*1ylE$~@M zRyh63l5O6h0HB1(fnCgYO@P*?_{6sK&U^xCddr?Y)ljBTfOvI2aOgouS>@RkTxf6L zhw2V-$Uw${Sc=4)o^fNF%00-0YdXh^w1Mv|&^^naF=ZTSEXH*54C@=Vk$% zhcYtll*BLl3M0f2K_RFET$(m_vhCeDnZ0rX8?^{Iabj9(LAlZQuYQ^{u-jL|furN> z2e&S@AO5>v{c5hn_6q8!h#fWSRtfHnmV%8Df4oRA%vc!1ftxMh@`w?jHe<~dV;b>N zAy_Y~j5$7~DTR^0vX=rL9PVOUSz&QS{wVB!!L&hvdKpH`+KHusuuE7F_H+4}dKG<| zE}f0hnR~Q7tXn*#of!jv;3D&yEU$t>NfYIr0uis>wrJ?VJTkPI=U3@BNHQxLLQd>9 zt?@Oe?&vh`KG&7vLzqqBp0Wqdb7igC!@tm}p{BP%`eJ-Mixk_fZoLM-1M zPmGR0|wpgCKOeP^4Fz&=73hx zfpuhxHmkb}Y?79(TMs%ZXC2)4{xa2WQ|q91`~5?n-h$@}X}U{f9Jpmc#SS@15$$9Ffp z97VxFnl*W(SM3HED!wDNYj^l7_Dp!VlY8*&&|H=Liq4=1>(cNaFx1-jH6r|2?2;)j z@A6$KrklrjXju2|&_BuA@ZcyxDX6h6w@A&J*DonkeR5%keo1+i3-29v`$tCmZ^qp+ zD=JWzAX*85TSR&Nh7m+Fg;r9>d+Lkxx>JW* z%`O^YbAdDw)500Akupr1G`h;)*JRgu_UuCDWx&Zv@Y9Vw?z)YHZHSitQTx+H-GfbSNuwy#80`eqf z%?(l{RHQ|nBfJR0yVa;UA4ZU0@D=s?IOW$>j8J_|KC`ovSy|zg?@fpCvVbetV^Eyn zyoj{RD3AfRrdz#ZsS-v9Y+^B)mT!dfTr>raG76{TDgp17ZQEK^HZ3bWTVwHV_0J$l zh^1zx+A@HNOVHRK3l<566psaCKKry%#P}RBpn?su8uG{H(FG#lWGU|*{fR!8!a-oh zXz6$oNQq_238+SaPN=0ZKx*A+5)of^Q+IVgzd!~fXzJysPgQxDqOc;17@Jj8-1#CG zL)xgD`KR?lv2G(Wj{XFR?YHXHMVIs}efQ>3LB@cjMz@A1hS-Q5R4Ghk*$W@kW!6FUgkB^Z5OO-L9&>(Zxr z{gd=xtWB?4JHJD~hrTKnzasPhNI&JzZ5^Q{ToKC_DgqfaLc%>j{Z)B!Me*YDLbaue zv5d_Q^N2x54nOF+YQ?VTrCUK3hP@#?*(h2(h#g|ED}VtlRN)iz+)pH`HQC3gc2}l` zqp|L-_yW&*SVO^)Zv*!jTp2+%cuU4{aFMmFoHMQbn5O~ckcXM-C)JntV+^r=X6!t^NE@P>$I5f>`|n75X=??ow-L%Q3$A1M068a z4NR>jQXNA}_OW-8A^gfi*2I&DWi4Pim^{${tzkf#sN93nBEn3M8F0Vi9w)(j8{U`B z9hWx!G3AK&V4Vuy7-u+BMu&6SA=*MjDa^A=M0-Zz%k1_(K_>VTSixKmno)wyyhkT1 zh-lQ!tv_;itSPN1r<(*oeU2tM6~fS7;|HwqX6!fS-`Tu$`+HKbyVjT99+f*G`1Gax zqbO|s!IQfjJwQE{mUl(6k|)$*rRYlTzIyh7unxN;>5gHqNg|0~Rb? zSax$gtMtdA$Hw^#oyS*p-MFz{+$iPC+hfN+ez;yI&ZX@|-%OV3mKZ>SWQ){=es~(6 z3m~!BMPPWrwPc_rG&zH?qoK~iRuacI>N4|H<3ZTyMPcn062v5WDzHo7SyQ4WyJmyc ze64R?pY~bvFw`u7Bb*-;Dm7wl`!UZi4TMr$Jr-_|4R~_;d4thrt0Ss5_6$Ng3UC>j z^5U>+K5G9i{Glk~4@l@@956w9?-M4SXgjE6Q@UOQ#tJ4M=i9%MGVzaC&fgygN0~v2 z@vvG2_lc<0hi+*e7H`_*RIfYoY_sbtQk!UoF*B5g^-Bxw{>{wbuAJYsU~h=&t!z=O zM8fY2Fhn;*RkK#JX8V%0yOwj+8EAHr6GOS_n3pxpNO*qxvbwM=q%(WO4KM$M|;a^AXZF3|`?#RsgsEh?u;t%%%!J1&rfkedq7B|ekl#c|tdWN?2) z#O;w`&H#;@Ty!Y!>Ah+VB8Kg1afg(3cHl+0 z(wIPK_}-*mIgJ+=k$MutD&qxXGoR1jl00ul&DNnT^a;VU^{gLc8QyB1N(ig%_+F=k6|U- zCN{YB;SgaV<)5|4Emg!dj6C0r)|c^CQOD|cn5-#qg!E;^&yJnXXG~kZoqf!rjt*}jP>6S;kX_PDk+FCYNIPiSfq*U-e>_7@ulCDZqbP*GwqO?M1Rs*6G6#h zC5x)~Ul&_eK4^5l{D*j(v*&v?5|&Awbrw}pARcS|fG?GShGNvTh+T)?|SP`GuXtQJ;{ef5g4$0LuJ?Cn#a zlHULV@evb_bNk9C5#cBb1x_K62Tz8NPW&QXOUr5PA}b#P`%8d5IB;p6rp$VYk*IOT z6F)9aXv|5%*ksHRXjyd$9699WR^lbCZPCpgKBS?W_>(pux98zd(yDQ4N=lo`@4wQC zTHc(~yc*tx4`K@{=6fb!0HlI*boN6Sd_^q?n4d#;45ns>`W1*IzR{YyIUip1*A5pN zvVF~J)wT^7T($Ov`;PBt)N~Hl+NB+oak&jH0GOG(6=-?h9Ox4Vc?weY(r@{pty(XJ zB%s>T4}J2Ezs`{EMB5Yy=d|H%ATBl6%{L2d&s+fMw0vTj7VKV zR`F=@xbFGJO0u@$R%<6AQD4X2Rt=IfY0U$j&jf5QPy%~o)0OELKR!XEisJDl$EJkq zItTa%&ioQjvkRaE%pU3!X|BcJJ(+7{ayRnG*TB3bhLg044s^3p3&=i9%z70IklcE{hGGmC_`0sy|bGUV$1UE;S1Pq{wL_*M#WEok|?IfI5sPcs}hEt?8~kmHmF zu8{0n?68X32fT>btd)HrD^3l9_^su4lT5ce#ME#n-HMq9m$)jAtql$B#ts0VdU5b= zVtax$ljvYfEsTsd$J_T>{`Ks*rCr*#Z5y4^Ud3romD>3g4t`FZOv&>1+fxbcx2!5_2c5C~W^|YL`}CPO25EJEipK z@a?qTXXZ}Kx%mJ$?oV)|GSJIys;U|ib!<#qjf9DOwJ2!W*G?+~wuLnJwf33zB7Y@O zQ%#Qif9rxut+{@Nqwj||4A_u(pxZa?bM!70F;QiW*M|t6 zJX|-=d}TbEiPS3lQL-mn{8f5hxKT7QDL)Rld)M&-pGHH*RN8R=&&CR|`o&g0m8P$8 zX6yIOUW&-tT(`KORVSOm)H!!LWL1PQb0gtf?7%MZ{*691>A9der3pL_tI{oCP&)~R zf!A8a9VMg`hLlP4zFtd$;yWK4Re8mVLe*#s#9DCEAO}e&4zRaV)4#Du5HeS-rlzOL zO!u&(B$1$-NHj@`R6`+O9l&Qs>fZX2_JnzU)@ymzOPa<3NFutH4vIQaovQZh(z&99 z9Ch!BL+R>m&H*2`1f|Y_Df8-_|BgO~cHXncrs*=o$ZKIo(h8l%zm$5w6QB)M($+fJ zvgzG>8;zZ{gE?fW-SHFdqs9)Z*XLgE1ae7_?2~j1#IB<@IgLlkTl~E=4zVk?Ka`ZC zyDet=ga}6+_<`{@1TdATE5v*jGa+h$r0%2rpsrq)dWJ$S{sv^{zjT~~Q=DYgb2 zBca(Bbx14c8$d7c>ZEp4>7a$T$?uQog4JJZUnNE6#b4=NfZi@(+~NId5egqq4(e9AT*kokGjz!xW>^w|A87w}%J9oIN3A}1_^>#SN=ryF0Fon6AE9%u zNI*S)%-}8ol`JdG6qzwopG-%UVyJW1;r@+c?d#n7Vg%iJOxt?G*69rIE6_=7V+fwz z@_W&3uY!!?OBi3bcHPU{e| zdc_%(&edN{iHwYFPDk_3?=ysiO`fs$%sIgrjAksBXa<+hV!x(}B6!SaEf-T*Dqyv4 zcJ04TVVJrTI1b(61Z~YcpTsLqcNY7-c|PR7dnO1ds~sG*&fnj^N8+8Zp~HsV%H{vx)S2Q|=m}O$! zO&d3A^m_L2^Zk-`dC#U!>ERsmnA2tJzJf|SyM|&E!b4_5VT+5TU3@5rr8N@t1Wtkc zwzT7!;NZ)|#~R*NEWi7L?tDi+WKg@sgE5<9mn=`dYn^UU)2ZC%-ieQnTinM>S|cGx zF+x?RoL9pg%AFuj<-mQ%xepQoD^zwWmshiRD41mkNu&8#OR+Yhn@L zvZjRj^)n;P8MzT^XlL(l!|Y4$%Sq$#H%HE9j|9W5BnAguTmcTDLjB2lW=@8HDTSVN zo1`WbY)CO|8hU~3FS~-nAfpV4C&eB*9BY*n<-leAgQIpH{?NL4b-gl|hldx^*0Ki=g4J9V?hwc zFYLu3UO{>l5>b>{T84$emgtgCIljO1Qg!ip3?CJ2gT_R4zc z(Hon%5RR|U175`nbZl)CF_^)wM*R(ZK=fX!=s1$0g-bV%SLXtDP=!{Xyz7n?rstoo z0fV=mcqlJ_BZ80S->&LFO-W^m#(wikKG?Fwc+7y^vpMY0oxQ!#QH!0c)f;>AR|Czv6k*bLWdM+3TpM=#$p$yK zs}OwmrJwy+=kMTFzwvQzj8Mi65j7}T@TU0XZ@;8Sloua3CER4;H;F{GooMk>6xuQ$ z8g$Juo$z9XU&cQcyWcadGAk;OaTL!RY5zDdY@w@w}BN+JE>yMk>8L9?Dp+9xX zSe!*fzy>9O1ZhpHDxzb@r{ML{uVRyt22~ti<+<;Xl#y1~OJ`{>t4N|Vy)f+idp}4G z9{R%p^fltV;pAK<)xaJ>pGuX`s)B<+Qe;C=e1IO!&*`o`(rB;l!dI@Z77yE|DM}B^ zfn}@SL_b9xs?|+E#)H|PySCg)90~Sv(93Z6@YPs)Nt6#mvo#Dtq>2Xf+DE7hqKTsEYz2V*R*hB>SkeP-CFzncnpE>Vu3{EAuEAML;AxNO zA)M!B=m^W^bw3$x_#o~!NtT5Et5?DH#Bb+8Kl^~L`*%LF@DW*BKC7Kbc$sINz())s zEfHV}x+c!S_$d9+ZWE&oIuZ?BHTzAm&MVUPW z6Xfb>3QTg3fXAx4GkLnvjlhS~=#hNw+BIK(krqw>Y6uJVTBsUiM;ui9MB54`d zF7hj-iva=k6#>sHPsS8OxW=$-JO@ncHant0bs7&4?uv#@cvUfH57F_3TgV4B4GDiv;FKfm5>TspK-G*mMinFr};?RH4&#=oF1s$p;Fe)Bt*td zo%E(nn`+N{+*MrY+l`Js@~LV5^8B15@hAC?RuzsuNZ6zwA8JTY8u^vj&jx<8|CqMe z`j+G345XaiYSTT2yvCMy0OI0xXmZB1^bT=}Rz7VGiN__tiZ~!ien<-obc#pq0?SPA z)5AF+!SxUrv>#PKj~P@}xGr^4jD3yjYUWgb)pzpL*w`gzYYNw$v?xUa_(w@P@j5nu zlqB!wb}D(q|2Ho-=2qXgju-6(N3Nm0I|HYxYhu?bNi6Z`y0fhm>C;qxw`j5p+GuFJ zw(tE`Q%!MXZ;%#q)5H7uQUdg9wcr7MPhzTE{#fI#md*VPwY9Z{qTUK2bDdRq4TP;4 z{KuJ$xJ!idFQ|dXpPR?gJWoyit-024n20k-_nRjqi?SKOP{l@*D<`asleb{Xh|XQx zn?iGQtxEt+t*@Aq}q=zQoE~rwvG`XXJQTXy_b+ z=R9buOjNl^ls0UBmkW#~QQ~{)+8v!xAEh%DtQd=3lTMuGnw#e%MU`&fK!L4}_h_#5 zA&;EVhiOSQ{F)>z%v>{eDp7nV310}*&6ly7;^*w)dXy3YuhlMhs-KH6> ztF6I`r%|~LXQCRz(pvQnu%2MMfz$3i5$F1>5d?fFFjCHk&%FPE#Xy+0gl7js_hRoU z9w$6_HP&dC77bC#IXXFM+=Tbi{!ln*b~@3nsBpz!4R0XOg4Czyx={OX{wRowkyOEo zqx|QSTON6<{p87$VOLD8TRNnU?y}>+lq8^ON4?JHS)X0g*lgF&W(GhVHYnR~4qzqB zaIaQXDo9OG+)>B5j_WdaCI&iWHfE@sq3tP~>vc*8vljI|k)9tPDIKK|ESurB&2W$i z51}~3Oi_u4UfI4&bPCi`aOh_Ps-z!paSmxAIm+11%|;OMh=%}%BO6!aYNX=SJ8?$pq%NNwv0Lvt=l*X3w&1IOwxaZLWoK0^ooXb}`|VD0OtbvcI9#r8 zPS@3SM%^~s%?sriRbICneW;o+aDu;6aa&fM@O?n#*9*_J8W0e}X8FO#>l1K_nHE@`$~<#0k0#g`5J;L!SGvi-CqMawtG=VCx>Le)tiJofZ_b znANp69ijNdgo$HGv)KrRcY4gHz(b&x>(it~n`Vw_?1Jz^XR13jD9Q>}q0@!Myz(C_ z`#=9owKxIH2Y}LQ;$q(j1Ue5P~9|hbB|;j&ih(n_rL~IoWc4mq?|R6B~mOK zL^&u0YKGc^*Ei~kfhV}jkm1AYKEZOZfBN!>jgYpX!08xX4kxD)cCA-W8+EK%YABSY zuad-X-m;|(>fUYbCU!PV`N$Y5v4CtF<&CzMsb#^M;ZfkVn;M@F-^SX`8-ZJP*V|7& z7lMLo{Mk`KZFP-$K9$xXl?~QnVuZ0to7&#GO^U^t$(&PjC4SaJmO7JXOXAx3j&`0Gjc(Qd5Y z!p4xA9L-jcunjvMOyf27Fd+{>O?tshM{ZhC^pObT$QIn@!Cw%2$bT`HG@CYUb8=7N zr@^?MU}6%HyU1`rW<1AYQ(P%|!8U~5TSTk!v*yfM&n_S<1U28-yoi0z5FE3;YU;SR z2Cx-yVTcd(EGmNw2)&d`fZ_slznc9OdgNtsyr4`^fBKq=2s=dr7xqo+Xz(UXypIFG zO6{8lJnLEiBx*D9_C>K^{WT+u4gg$57iw^?8;@GPl^jvjvWhbZVpEnY9K|vob-}f$ z7V#?xF0AiJa?wunpZ1LT(!O0gsVCXKy>F0`@(B1)wtDaqW#X0*cBu;zMU7o%zQ`9g#qjq4<)?iaY4zNlA&MLq(<=2?P?)H@?U@6Do}&RH=;~ za~)7_;_>4I#%9#D1NU{8eb&{>hVRKp-#<3VUw^i3wZXLh z9!3Qg6yIr{0*UVugk;#7_i|4pKK@&!xiYGQn>s}x7Lk{X z|3UO0olHp1Tr1K2FRSU)rgdv+JHX<-Ecvt``Ho*YiHaQPSD6?W2@3L@a7OG(!4Z>| z?qT_ddYw$j|AjT?nqH<>&fZCrbvr^4?+rs;a>Uy`zdu>9o7BzsPc>xsqVOt=w0y=#p>_RF`b)n}@p!6BVO9X2B7hI=;y*>M zH!|1NQhALgMaLp_cVdIJ5l1vjAD*TfhxbQ{vzwxfw;G-C)ihGuCs#t3Y<_>k*Rd04$S{iJ`q7+C^x0+L(deu>f7+?B@*k9xsG{3h> zHbOJ)_^bVruKs#rmd%ohU(7?tT79CZZi;SgKSJ@p6zmrs;qr$Z)`9UQpRiT0VY-9z z<46&0s^5y$_(g&e7aauL0Q>_byxdoBwh^@<&{ybha0q2BpYF2!9Ak zVd*E8nf9NvO@zLyw!?-xM6-~80G8#QOVxskkE7JTH(an3@Ijak$s1knM+4CRTK8Zs zC;TmPD++j&{~}C7KKMKAEM@^#i4tm4g#Xm%fZ>jr86VkVkjIz)9x6&{xbx%gAgbU$Q%n5 z4+O)F75wF4@8wru_hzxM2fh8!S@{x8=-uOcA> z&L>eEo(;BSs%I_`?UV@6nl%f`yzp`4z`=uuy-~wBiLF1~VS@JosO4^HC<{u2nyUjY z{g`ZVhuuq!J?fBwW>pdz+kGmQ6#qC%b-&yzgi-9k=F5xt`?ZaI9lm^MA+!wvI8v4o zPjNu~TW_UdXI1E^hsGB>ySWkqKM= zO(0m?I+!*l8vipeFfbx>c?2$kQ>`XK$dl{FWH>3h$NzmYXx1cuZglRzrlEB8LHebo z9z+k)M*^-%O^FcxdsH%Yv1E2|j~P>)K800khPhlaRGYRR%f(28Kp z1?A)j4+Lz)cK%@_O{qL}o^b=By-xHy0tn2S)&d#q2eY%p+mC^j#f1t#l|AgovME0^ z2giMBFzO#8;qO2Fa)-3uDviF$HV2{9na~WUFnsMU!K#oChb$_!z=C*^Qs_OnJylf1 zC<`WmCW*dSv7b(VbgB*Lcy_$Sun{A!k+*K42N>seKd|8!3@y!YdT7wVv&VbNf~JDb zG9uO>byB1SubAPmN0w0-2f!MG-HpYJlJe_ws-~im0}548Cn=AEZ^C)6`#9MHtdiP{ zG)CkG9(XIk292vQ`rAzjYY3gb9m1wdUfLFPTrTKWb2D^O`pONR<*IUh*?cK>NDm6= z-_1R5YNU_GYy>DTtKktkimE9x7KFQR5>48A&TIMTjLszV4BCF9M%BK1_ip5(V`NTf zjs^u4uwa3rPWbD|!-qbgJtj}Y6oeB~?|4nt9zlpsuiLos8Vsfl(B5JeesY2uMtNeA z@4l&jUjbY;E>@!$(dAR0-+tcfS92^)&RATJW}5vHF`#YNW2JgdvUv$Eb1g90&?&gc zv*V@8W$^6SaR-a&9$mXC;>1P2!wKK%`@8NeJ;5_3MR!2$Xecsb`emi$gPWvRt2XB? zP=@PoQxHFqmqxN4OG}QJ#e9>2`ufiC-=*?M1{Jd7n1$P}^w$e@XtK=|ouIiXnhp_C zwo%TvT(?Vlor11k#*>c}z8}L@ncn9Rna2&gsRXT(yP>2Q=)0lG^(tM--TN3mx$$}- zRT)3lBE?y%fxK08wCOzd1e%TCh;0y%w?+hQ0ln4`Kitx2tzmd|v*s88TaY4ZQ@Fp=tOf zrODE=a^2OGCElD*f}p>!di}Ec zvfUxyh@u3G2vZRcPy$&do zb0qpQ#*t1(eqG(KP68O(@+(WgMQ{d<6hr@^E$mw_V~It(zGvH)h&z$jnl5x;aI z^;Yypjq-?}KoMm<`>{AZ;#g^(N8%JZzkqvQcDGy8VQkxa@J5*D1`rsJ64~?AlZ}%Twu5^x=+4y0NFXeQjzX zYv}VQO z4)r05P65m)Q?2OXqulJxn%W`U^1KAKFtRdcL zgmO^2Keh7KhIp{#&pXA}t$JWW6STuG`(3=cAi(l?=>R&aw3$nsizX4OQ_VkrnK7y1 zS=rfFS;dO58gwv%@sYLpEjdJ$)t{~-f^iF2i5;x@UV5YfsjUY5OMhBKuS}_b?Y=FO zn`UV1^Efr;FC*7+_3Pg3dUb_z0*bo0MxFJ+`WyOk3@o1QV;{orz|H)fK zagiZVb%31cXcuJH?v{@~YLeRp4e)QY|2_hFSya@-sTN~axcjpUR0iM&7w(U%rOZ0De^3~-`SAP? zgQwOEAFM)-+;-xkX&f5ccKhvlu-TMO7E#r--@SO@Tkrf|5U^P_Gzu8eoud<8f~1D- zhiGlk zHm~eqkrv*7B9e6zn|LZEe&o5>|NOxj3Eejdfoi+hyk8uXzLl1k|1uZ&L+^J1*kLB% z8R32S9X#34eol1Ki9I(Dmy5`dnO{cT!s0^urdF+5PLWPXgry2TTB}%$hp|^k6K9sM z*-g{QitkpLRkl|2y$}>T;NE2w$cr`3O|GGcbErZOrJ-}5Py+SZy?fYaX(~KGr`wvf zYwLedi5Ycrx!q&*9e%`R>0v|6{uEHw47uziu z<@7a-jnB2!OG^ujt?8c`{@Yg%UDTvp^XhfzMkGBBV;{G1m|I7oApwQ2&>c6Ych(Nn z@@H<1idkfhfwK8Bwj%S#R8$wXGo`S%2Ek>6)UTzD{Df8e`6t_}C z^JDTvrW2~s&FxN|Ia5g_S8y(xV~rSaDm3(gZWK0k!Z6hCOPc`gaIOFj#(vFfR#wDJ z)*}zXg*v81Co}%$?me`t&{^Uz@YI--MD(do`_h?s!y{|0HgBK*u29(h(IpM|rNyJ$ z@$vOphNSVI-P&dk&d^CnePU3fyS57#-hE8J%o%vv#Os^}EVryMjhj@pjOMRFO=2NoIm2L|+F6SgdVe!%95{!QSYwnQ$-wa=zMs>Yvk6cpL zY07ji40q`@#z5AGnkh|Gh$4k3!~))+K!~|OQo5VwA?7*6E~k+$7I@IbD=Brg#tm=x zgrcH!+$e6ASk#07;p3}^ctWhE*~^6Pl=j&2jQ^UoX(1(LshF80Q0Zr3~{R}k+j#l^)*;YwKb=SGB5b5fZ(MzgL-IuT|k z>H;bT7&=KMVL~C7pzJ2o?1qojR_%eE(tmg_j4au1Wl53RJoO@)GF8KD`Z8&d^k8b( z`0aOHA6A{SQ+K_P_LJJ-oR+6y_I21}gnTC(JuI0a0ZSGws?%azDA(u(6$a6F<9ayG?ly!CJ|XBMYqDMZ3$mUc!G86-JokMP~|OPX=F zBk-H^KUbZff2TSLSBkgLxG5znIF4^-ui%DT%;c2wKj;zWR2c9iAM`6ng6m%CM|NoN zbktV-DWJlaC8?Q9S0boT>dkvnYGKKmM(p9Sxs4)-7^{d$G-c?zthL@)V(j&riV?`- z_fIPmJB#}xsa${+k~#`Y|jH6~I({^6k`h-I)aia~5C)BbG(!bM?mvE^b33K}oXS-c> z16QH2W&Jc7Z;|2F3>O&qe(-m(zXU*vkyXy+0!uPuuoB_zrePpikPMv*Cnj;=BA6s{l`;cor7qqRh zJ-*DQ?sK2y=+`<>#m~8H4P*0-J9hJ(?2c@&s>&p!8`O}iv?SH zpUZo*dq3vvkPl5#o;GvHP|1C^Wa>P#*PaodLyup}Tv1qXmZu~i+C6_xr&+jxyjph9GATPbb0Xu)dY?MhtzSP1(TckI%Oi*Pt*5XwU_d0n zWn%#8je%zpb!nOx*RF!6)oxw8IlVtWw8+Z#F6_-{IX=jA(KEXQX)~Jsm+6Ab6}GTq z5(TV{eS>{~Yj81d(dy1JIDK_mL%I|=yM4>qwiMgh(@aZy{oG%DRO zKkaZ9BFAW0W6fAP0<*0WH=jvdrnL`-y>wwvUHbgb>UyWh>!SBLyr0(d( zi=Px<)1i-UeEgE--SKFb9dhwu-P-byqFib{8rB1HoKTAyo+p+Y_Rbp6JMYz2InUQxxTw}n%8x(O-Qcpiol|JW zLSm0B24J7GA?Z2D=%N_Wrjtz0wW!f2C-w_1Y`k;YM~*h^Q*YKDn?VB{jolryZ}mvH z@c!MIB=;_NdUrwb9Dez@4aCIgO)I`8AF!^c_{6pTYo}_RnMtE(jeMlR@x&&6NidcJ zb8g*G+sA4{!%jWZu#PLb?H<^6`_V2P5C!Yj4p}-_)nkAJy2^?PkxY!*^L0w<-rwc3SurzZ&!H5dZiHCfQ$W*H22cg4?T{nDJc z!7bIr>mf_6FiS0c@-#OuFqzY20dZUF%^mNllRoNL#`-*D<*|UU2Zh-6 z;q1eEJt77cpPXGoiq2p0AN-qs@KtTg>PWICI()s|E3;M8S*zxTe~PzxJp1r9UWZi` zfQh|enTSI++lEwhnrPcdC2N)1*XFv5GamY<^U_8vS7z^)0>W*Ks9$^*;{W*dW0ZMU z#^3BfD7n*i&qn-%x7)7%be{Ef&ZbSAlGd5~!2;#x^KN!t;bR$>f8RC|Rc1a;X72P% zBk&@gv;b38Q9-5uL3(@L-BSEq%Rjc6V!rVAEw;5|a+4(gJ{`2Q+>l7?qz#!D-@j&` zF%FJg?N&`I6+P3r{-A$3)c8r(O`}y84Sy#seGGL+?arY&Lv*>Cy^VS$Vm9O9UNm78 z{i^$mul=-^+d3Q_uKV-Dr^+(=pc$I_HXQNYsfGCo#j64f9^DD1$`PAv)9yd`L8F?P z-CCs$kt5k{y7+FHqC+y-&rGy=Id4%*b@Rv|)8xyGDz<4_Jlq)Yu06jzUu8jCVB;xM znpJ9QYjoG<@qzJE>=|jK5eCs^6w58|bw7^RHv8O1J1lqF3{T!v|H6UdL-nb=ypM&! zJDap)+qIWR-DRG)Nt;mgsT{#@?1K*6O9NTnKv-_8>Ri!|auA_F{o~=EO)^eDna@Dp zipFP*Ll}#*oI;<0jT5bgJheOE0q~{xe7iAJx9HvUt;XcfnQ^ydA5gmQw$*J)Cc0(h z;g(>?3~5f{iIG$b*LUdQYrQ;s_ZHeB%S2?^YV-5bX!c4gIkw^-A#<%fCmp(%cA#aM z&C<{E+OUq{+ia^9KWK6y-~bJExP=UANmwwew^iIxo>~0pkAFjcyV2nvcNINk+5P|j z{ktBm*4es$?hO08+VY;Y|G6~WxOFSA%gDp`3iP z66agR>zkrq=T(i=akCuFrX>CH724~whHFlmIHlLVP6hjlADX+k)q3VX##~ zVW0O+T2{0j@pJi}xfNLx?ktKDcw_v{j&cGXugdswy2jPq*QICLZ}Kp=-2*A<)vZ_W zfjc4L){?Q#NuBoV37T-6g>lH?dqCdu-o<0r>N!vE>iCwY7+@>g`s?dUumHiMl z)UVok=ELg*b>WqG+2hrQGfhoreYHt@U>rVo=G|b$=b4FJbkpEhO_E&4E_u4ewyt8L zSu`aTWyA+|+c}$tO%2?T)n!NPA5(nVR>a=xsrC(m9msS%kbG(8c$`3}3v9vVfp<`R z>NV_QJLa!O-x9pKxY*tj$KzxbQ`Df<3vo`YH;|TF@U^7Z?rlGT3(*%Ir6Yo;pqG-e7p8nIVVF|)(c#|M{Btv|J&L)MI#*W;syPAxjYmYc>svl;9-dE5@>=09Jf zG#QenRrLCIacv5}&SH(Q)F?W**a6)PiWlXQw=eo((!A(1yBfQc4A;^Rw%>eG)}4R3 z?b`T1-|sxLtJ&>W4RzB_NNBYF$>+uPBRWO~ zye+WZCbhymzXQo~@Bcj)i(XrnS6Sbe8LvNS$6i~xPjQZaTeQ-bjL~VQG&MC{sZKt& z0Xh4z$+2t<|8>7g4~4bCJY;Fz4;ub+Z0c7%^lM}?$l&0pqN)005`-+6So(ZFtVMjs zyKHs;@dS>pTZmNU?xxxP+$4C|vQ^0dYvOBb{P*_3BhK}wFFoF3<1SfeEN}k2G--Y}9%fxhc^UcS zP1L$Gw@2vK;PH}M?8*&|x}Qw6@JZ8s?`Tx?F%OkTC12Tcvk?t+%|&*-789U1E_-=YOY-ENktle=K{kClB6B z(@hR_D_V->-6DpTx~#D;=`?hpC9A2GmFLf(Ccy1~9@O%V%KthEx=+yEJF+Nx39+1^ zb+gn4wxwif7QG$+n4FflK)#XX*pi66j*5!K+Kn3sW;BWxuxY3M4gt3H@_C|5`-dMl z{em&4PllaN?X3P*Rjy-5gMYViohvLgUX&B3WkwE`w|E$Ea%=JBjWy}B^!9U2(=m-& zR@5vy!#w<04o=o{c`mo-!%E)0`%1s!MWXraZYpst(rW2nFoFP)W~-~NUZqNvf7!bp zpJmnwHh?6bN>tIDDUSFQrEAN9o|oQu3_a-h?MG}At64marrm4HYg}E4bRgOeEj<#8 z4=6UODAlsO%Antiz{utmPCZSl7C-p+zm`{vMt4XT4zMUt`g=N-JSoKZ*RA-+Yk$Tt z-TN^wWc)DUEtY5W%}c! z*^+kSlsvR37zvqRvDSTk!(Fzr!8pGv+1xEFo~j?XzGOb}k!FO7q0wx3!K`hEtSc71 zBlpk#Wx-+}oH6Y1z2Y@Np5prR9ZFtM{6oLXCWlFDh#qZel6ob|H^vT}E$>_T4Ba5TqQlFh<^onI=BV8Jh% zInLt(B`7T#u-%XSym&=nA7N3HYZ=q6?j_mFiI{p^F4lQ6^W{gBIwgm0=~{e}oHzQE zq-u&~MT8k00gsYD2{2!$UcGuGmXw*jy3QU&^v2C3jBKoU0V;W+$>tZ~YrD>ob;hUt=*5*m zkrv(QS+SNmd_PP5E|l;my0_wOZyfvj8}X4~56NA7O1`w>QSM2PIR{ZXavDkwFwy zt?BlnRLD7!Sp~+ms;1s`uXIG2CEp`}z;A|oc7CfLOU|^dF~#VdLm1QS?=++R7%c2< zq1U2~OkE0CwKbxz<(8SZ_cW@cx{sGMRe088%QTyUFGAF*R|Q_ zisMLYC-2w*uABt`U>sFVj8d;wG%bL?9tEt_OhrX-J7{dKu03CG8(llR&9A{}$!B+U zsowTNKv0moLuPo7`C(a6q~de#cVlEQOdoHfR1%HnD({BV)B363-i~jQBQRccmp9;d z9!np+#-2+<0gh+qe&TlY$*_IP{jjuX>)*doy z>O~{v19lJjvBej?d+ZIs8m*u6M!#xk;>nv>%|yqv@m3u>cI=4dTbfvhX-hkS1DW-@ zo5*FJ%>84=kGH-b;qd<4EWg~bqeshhv3mo)y!Dq;W5UK+93{wy`P7>@>(Og^aW!f= z*nRGYuV}N9S61!d3jC%OboS-?iV5&cnge(R%SSza;i5Jr^D8)T_c=*@K0j<3SCCH+ z*e-8S(Cz)@Q+R9V_&Hbh#Aw^zH7oj`b@fLO{;2w1|A2rEYG0pMVktAu%mc1yce`iu zhU>S#Uu=(WVdFM?7W4~Gx5gU1=f~?U(*s=MXQIzJvSfMx8y))6nRLTBnx?l}HuaO! zp3Jk!?(1gC`e>Q9u#&AC^Rje|tc2(bGMTdUuUKP)!7ImgbnskNw0K{tczsT4q=x6@ z+LTg*a-V`d)deM-~dl#?YyChLZ7yCflka5=FnOR`s*I@88<$tFP3LG5bCZ=cqyK%c72&&D% zXp{}IXW@4)5h!xQIib_+l1$vE+tLqvE*leZ462s8OOjc+Igbc}6-2Z%Ct6muB0!A0 z^{Z|-UObWGp&No-IE{PVEQE!Wd5B8JryZspOhPm%Wq3rS407Q9^K2Ap|3 z=h&b?d84Ay))YS4(5@?-?yLZr9oAJgLVYXW|9kVBFzC^1Dw}WH+x3Ma|M;qBdcY|U_o-H_ij5WlnQhs-_nCh>q@aD;J*Hi9K47ht zXrHoo!?}59o^}6;?a4_F5$!8H`(kv8JDlrx*iQ?f6<_*C`7zoDkZ11i@hz%HgbHtK z%zU2}ap=&@{Z~3LL9szr%?!&PIferld=#_k4IuV0_^zvn@%abK($h;vs5kqWi@q>6BL|@lj|rI|NikbT)mWG1ZwH(nRHAgp9FXStR4om=(E#9 zD*+KN$S1zo)n`;Vb*(h^8XHSFzpJm8Zp~Awgyo44F9!>iZ4&g1wRTO<#xargC1|4= zXbK7{A9fw#lWGI~eMJc!R5`+B8J6PRxzew3-vcp`+uCU=2;iJsZ?E^nD@E9vfkex5 z^y@i`>}8oRW@sOLSk^`^03&ZjsLr9mWm{^Id6RD|Z(~x&?hGBY*x`2S18Z6Q+gSG5 zI*la(0ReW9ESLrP_7s9PE@ zA$Xj}GJ6?!VlygU0U9B_Wx)anN+LWg9?clJn$CToL8?r;c^5?xxtnL$`&tL{~tPtv0ZI5iVAnkPnbLA z$?p&U>$|2~GG;b#TwD`2%6z{G^IAF99MaYbRC!Lj^tS{xV;83%8#f!Bf?7@9$AEHT zuLCFDjIyj`SH^6o)_khER8}ht9A#E>pPs_DQRUQ~gp%r{6<^On=d&4%AkkQq*Jwt| z*RNkC9OiyT1i%B5yklbT&({y%NPc{Q<>JJ+?AJRxASBL2i)udGPu4pcN?8Q2O-Az< zFN8n^2_01UEOTh|2IWNsN9Dp#G7uD(K-b!wP~Ink5>e2@Z&c21b)b+V6C(Kw9wiWdooNW$Y7{;-F zx>Wp4ZV7B8s{9QUm@MiZJW&Pm(a^;%-#Ldm_FL#~mH+V{IVdc7>|Gis_TY&}BUNQD zNaf;2nLE{Kd+*l6O`_s!C5rAQvD`c;pRI&Xg)sRAEmeb~Q%8I(h{I%YsOI(Nd=;eU zXF%Rc7fGm}sy6%RUNQyNIpv3+v!T3g`~C{;hpFgL?14gUd`>Tw3}g^!k#Y1Q?*!iV z)#j4O#Gh+>>x~t>piPr{os@l5N;J8z!8{XdF++{d$*O@Oi;B4F>)MTNDZN#ql{YVJ zy!Yhg;|1Wt?#j?nstPr|D(7IM`pN_~#3$PxMMp=M$;o%u++fRbgk#9WBF(Gtdi0jB zuSSjPFF4R(z%<0gJkW^~(~QvJ0(;3fD=P~_fVMZdfZ6UtRSIGSpfc@?s=X|ZH4iF# zSDU^w5s>wSEx&LLw<-^UJ!YsYuigeDhHo_^1^Bhfe3gfRhvLJ}9oY5{L57;zHeIM= z8eaqH)S(_9=c;fv#TmF|`Zo%{RaK><>mKQ>9v=RZM%(xXvWBu4D)1w|&iwl7!aPAi zblZ$AJ@VT6hr-^MXP?$ZBpfJ`I;GeD)2|sbb<~t!fE>VMTXxjg?2EoK(^s7_rLdh$ z8_KkgZGN0no9&4Sy!LubGpR#$@j%_4b=;B3-3NG3j`z+g1{X@YKI-|NB3)Z=9Q1T- z#&Z2;a29Zud13lcoqYj1tOjC9xE!uqK6=)0m6>>DkhG(d&9~aaOo@FrU|sr)+q8=JTQ_-w3uAtGBMgRXp-JY1l+I_OC>za+8x@~koG4F$m8)iW zTi*n+A(OJ|dB#L;E(-OS_*7omdr5xh7@p>JdOamYlBRRN(5jSCHJQ?*nPNA8Y!Z&E zIK7xjHqbs4w*c+g{4I2G^LtzGD0pMr%c7<_xx6dKwqi$0_x2OF&LA+sdZ@jCB&Xt( zLa)II_mkXv&{-lTbCW`!Rbo@xgol_Zf_np6iXjwNZM!=%xXs_s9;nkBIE@_i$+IH# zVe|k^Gb7~GY%ST2T$ldG8ePs!C-`2VTD-k_ckYVnYv^>Q0+KwI^&J}Dh<{tVb}catXv>=?Hmh#izC9gQ zDKRH4SF{ZcAIiE;p4NuorHL)82d|xpxIp}y0%8Ff(*PyF%xLDhOkm@+nNLcOth?s; z^VOS2qFCis>$b;-{T%Q?L4*l_F!z4LMuHAT0?68mA_y=s)(I2(juN6=Xn=@&Sz^&y z;Ic0>m?%*mtC7>uv*?{=@e|v3y^J0&Wp%i+l{ad{aBy?b$^w*`-p5flQv)fCrm!Fsg_Uq(eOnGwE16H9J2>fS18Vt%UF2OaxU6df7E$F_P==y*J)byBBJ7zZ@m4UU@#hN7zDXQ(ee~J{|gjb%=(_D9$a^J{?!-Bbx#5z(Xv9j5st~ zB;p`Q6VMw(#C;2RTL0*E;ZU#=z*zAIR0oCuN zzrv5FmH5N(WgiQ>a|e2J?W@(!%+#oElT-!)9vymDj-ABwG{>4^!``0qfkW-a!2dd9{wOUOL`Z4D$Xw~F-{CpSR#c{OqImN{ir2JHWO)(-?9`4 zQqWBIXal;m^f%`zv8O}v!Y?Rj9OwWIxGd;@yyX1gn&)Zg>LzJ)^i+6>X5h3}GGDX= zR$2r=%!e>1P}*i;tbj#>o$iZ3sy;kdmO*K(uIM;ZCSrk* zJi;~?!Iv;}7PDz*f^)X_#`U_}QFoIWcajwg!Mc8*fR1O$+|eBf*LF5K)WH?_n#F#& zZPSbBCDIZ-*9IwDWH69=*?qs|R{>LVn!LNri%Xh{y3$L`fem_=y+^%hN z1xALPamI0YkG9KS%nlUkSZ+WpZr)^#KH*+Cqi4F9o52M_hFVE`Sf66McN;yTjBw+Da{R({a0>lvyJfwI!}jnI&x)D~uF2OkU=Gj;g0? zZv|ZJi+;E9wSUin4^@6djH8z*@B3lfHbXYT4AbbFADBBW1`#IFU&?&4h7)HHOqZi(->VR6KiU=ah5{c>ox`h>+^@rc z)FsJFNj-TLsaxJ-aMdh!|KUE{l%7wW2;XKvG;|u-r%6%|h8f8DAm)*7$rd-na$l`s zkt{>V9=p1Zk|3g-pi{J%NOEVzOtHOdG6F!Pd+%VTlpbN8)TVhuZvZ?04EBb7u322w zW$O$$ytWA0rqofD0j3e2=%F9c5<`xU@?8Y5`>tuD2`(W^d5VVaHRjX-9_&s2(BVqdPj`one3-?M4c=qseE%+wyZD3 z@n<>|1Z&(7@V$I`8?C+Bc$0XTU%ab zWu0aQImD1V)GGgv1)~3rcDBwE!CZyO|LS*A5S#GWso6`to<(?R|K7a(KyQMJp*NxEBsaL~Siw4k3wPo2J_reL_6m{Hf9T zi4D4Sm!DaV5L35NeuGmifmw*BU0(T@pZ%E);Iq!6Ih`}Jyuba))1O(3i?r=mfH6%_ zn<1o28?q7~`bbxJ*jM-941$yE1GNh?CPbF7>EOfk8C-R^jhB`^X)Dx@Z0Wjh2HQd$ zQ0s3xu%4)!slmjYFh$GM?Zy~EI$&QU2Rb4}hRbWaFsnpnHv08r1Ll-dT=C~a>-?{J z;u__`l4+oLLw?-s%eMRQ2P4090$Rx?0H00S_1v++RPVL_Vqsx#E19I#Ju5+0wMZQ? zj&ddOoKIHoHUN7`diDW~sOjiOb%x>$!kerk0#QEbt>8@YK>p5V?@eGT@l&lMR`hpP zR>A~@ix(j_K4VP@OM?X<@VZZRPg43C#&S%7CQ21|sQ0H|O13mTOB%aFsxuB+f)xZ| zGLI{g>js&1qC0TlDU+si%H1o&T?fAzZrkrr-m^QY@ncLuM_oLV3hRt)89zsE>jNo< zQFhV$_b=x8uAE9NHy}Fq#b48_$W%gyQJ{TT8?KBK@@D(;c?AUpgcL~bj3PfQSqtsL zUyo>xY2ViSgj|^9#Rm?A|5D>4!!<&CZN5`%+)TRybg;-FA3$Tp&)1^92-R06_k3#1 zP!|lG9v2r!cMVaH3JpXn0~ge;(pzc|nu#i%lBff`96(9qSHQx(Zo7#Or276#7EKXa*if{gg74YQF8NGlNW`JdD%5yk%ghk%! zaVi*F!0i}FTu|svCL=fYDDV9y)r^ckuFM)PH6I%b?R(eXa2}+tg6_=?Hm~{NHw0iv zl^#~ga0DtN_6-8B?GB~Dd+1J8;<6t+{)Thz1s^I6Z38EQf1?wT+8P>Dh^$% zekJcs7Y7@F>39r?Au>MzN4?oQtxdFVGz{+7pKyfyrrnggqKQJi`d8e(yppe*K^A)KeAE09A z6Jt(ouzss9m>%ie7H*&02j;vdB_3_pWpS71p(Q<{PEK4S;;tzO;ykEMfrzN+iX}*p zWZ#NWfD+F^i#i!{nI*70dOU!*UI}%C=O!L)sUXHL%0%|L1K@KrK}&GtKa+*b2tYhT zC8rzEd@O_TMH&!i?WZ~dl93%sb*?WGk)=RzHo=`9%(sSx*xndJW&;%Axqwp-!Zk8; zQrr#>N`_Wq7qFFm^n=T(aGSRAr9Y+$ZzSe+OeF#Cjc`20@XLigI(S!J%BK<5MU=Im zm!*vk2-|g^?!;vW%1RL|vo~AMxvQ!f$f;dYQBg;4OG``Tx2xudngS4`h(`cU_Rb2# z?ZV#RYC*54)7a&)HobUC1~mAEaYZP%+yK6sk9exH=7w(t5^vq=ZeouE3EyR&FNosM z4#19efqIZizRhO@7sxgj#%X}Pc?KPTbo`5?R3{cYDg=W~2hPA%gls~K7Tpuyff?{1 zN2sffVwgx3_G{fde|~EDOXY+ihNod!QN;*GL*Uy|{|6q!GMBgtinn(-Hz$Q5M$AeyAIfPfJtU}%T20Lw%WSGeUN z7)A?tH5Hf$etu>lht>+9K+D(;ZCnnZ?O=^a$b>umCCvhuKyvUKhr#;HmRFPzrrzE> zZ3^%CNh281W0F}W2W(n&DXY`Jq?FHat(3|BLXj%t%C1s2GcVu$jFRwrXYEW$h0?ej z9SsYMZ7C7G<0K2Ys*Q6vI60X-mlAKft zxS!K`S^JRZm7311Z#we8$%HW;smthhnWDVh$cYLyGQTC$~k;ziE7mx=LNRAv^ z2uhA1v(07a=BZ`S?Rg0(RXj&}-i`Xf>alg1`JLq(i6V;a~gdsX2nW*cF8Gwb5(*96IzMMcJ zGy*Nifiya-?8w`0+Dd>nc;Rot0v(`F;kGuzI@V)7ns4y+nIttn0a7H910zCN-Y!|n zP>QtYTn!BD`Z7SJ3xdm@)`WTmv|h_Wm5LHMDp_!My}jJ?S$ zePJnl``SN>qQqNTQ*;IUfNtv5uOm1)IWwVs;F~f9_sqx8XT|Myd8+j6>sxpmF2@4t zKcN%z_$!bzpF!eoUj)Iw!faH$?2zi#PM0n;E_dqirp2Q0jS5mXT8PBcoYd%Kp420y z0u1X$bhK5H`_(u5VahDNxN~MuFiKCQ(wg_8t$lA%9IqrDocI$kRaEr`NRJWJ-+G5x zqM?co9&~1qSS!#+maYjtu?P6@{w55m>1(t=V3pxA(BYCvumQ+rZ1O3z(GXP<3Y}@c zPR;VjkqTIBZ?gUn6~?b{URaWNxqD1!mb!k6$=#H3s~jpSCzB5xeiYCA&=>1t=KRz$ zFwSM5np>l45`e+nZrwi1`G0xB#Wiz?aFU6a(#$ zIxs-N5E%?1QBm{QY?Ao_T78&fi6G09I3}^hd%P(83uuT*z84zG4}!>ayn?sZ0HNrZ zpi+VPh&}**UI0DZ10d@(#N^6|2MkdMI&|bRaAyf%Wf1md?~i#pyrhF)Q@`D*KYug&ROpqUdI`B3^+zhMmT!=madk7wQg5f|U)ax{ zV*XCjsgK>o!}oPoZFZ7P23P+6&cltSj9Qa+pn><}<7G%?NM=eyoP)Gu_OoGbF$Wct* zx1oyPj!rU5kYss#h@O`HvJNYD`nNpBgyZ7eyt0MQLgZRjxVG24?r;Lt z576-$OXMW#YD1+dlXDk!3+JK1`y`o~U^;kc&W9U-Mh&y6s7gi&X)-U`iFgB!5upuE z5&I34%aQ17&*x1_uY=U_nq|%ki<}kJVAIi&CEaEPs-?c0 z?sQ~=xTJ2mvJOJMojad?c-%Rp94s{Yi(xLQh@o&WZh}N`vbrc~48+V6oe(lVKRa>3 z=h25B9h64FjCAcWK5&$9hNu-?4kj)3&aagYycT&}raO6FtnPKI`2lM**xu(>vvnT# z9m6oGJHQ{R^meYR0EB}5*+e45<*gwO^&<{T;$DNaE;gjM4Sck&I2-7~MXS+T!D(q} z=*h21ijW&oBOGsxmf*W37WGB)Ys+T1rlb}`I8@fK3PPRF zrYw`pWzUA^aV=y5{i!Dr#Gkg3X{htX+w04LJjk(3;yaU#^Gd^pC2u4u_kEr$c`<{N?{i_JcqA=kxWGkeCHp5b5pz^j5{AvotRYGKqI{rVJ|s zhOYr%P1gP2S?=0P_keez_Qzjod5C(66v+=#JcpGE&rnmeW)%_5uDfbAyhL>2V<6@# z3nQYWYwVI?x!Z$+6V(%az&l+=YU*;Pe40!2g(8`eF2H*?~ z<}V7~Z)MluQyKS*N~$iSV)+N3?baXam!W6ji|f82CF$=UF~9qt{oJIPNL@^J_u$|E zQqlb5p{Q$w{`j-{hZsN_slKgHvST$Kg zd1r&&7fUE`&y(hYl(@g?^Y|0t7eo^0S)A(j?Of99V@&H3eD0U}W!5E;drUj5{l33iDr85p)42$9F|) z9_kgK@9}s5W;{iWB^F2(pi~kVR!1;Qjy*a*7@iG26WT?HW9!bOXgM-JiF(*>Npa?B zkXZE}j*R&y!>cp&_rJdUFZ?`JU^B^#2A6i&>-~BIEad+{W>j(^@Z~@^hFBZxXrU;kw~o zaBy&rG#wFIK3ALDBvnQ{Q~crp);aIsFY^|#Fpk0r*Eh_BYXn*zU{`y3i1s_i+H?(> zny7~|^LhUx>{JEj{GR%%TH+U3m)P@}` z4%vNS@PKgOeuv?2C=6#x5C0S_3cvLaxxs%@Adqa@oE5)q|BlncNnVK;?fps&vH2Z{ z*P=bg@MmCt)k=n*$GEqkVpzxI8p%}D{d!WW{R7>>kxT!g-;0*{kiat(U;Zf_9(+apX$UH=Ta7l^`p9-gRE}ME>0+iGT{UWWH~qRs zT-fFHa03Wlzv_o9=+Ysc< z^8VXVxY`&q3mJHql7~ppm|kAE*iXgJly4MwMu%ih>9J((V zGInbJ-d9sb#Y4)6+?45C8Z-wbKdTZ#>wVjYBQ?1N^G)U~Bj^D}Bzokqg!O0o z*WndgWr;!AcZItblS`R&P;<i?QYM00?~`pSPX-8E8* zy1w~S_dNVU`1=3XM*bI1bexTJ+e~wL_0o`(Q9uTTuK$d|Rwevumcd|bj$HO!wQz+d zb9YBe4d;j^-q84|qKQh(-#!T!UVIZ+BoTuHk`v4ccfjeHdWy&etLn!H)ZG5 z;oKa56r2u_!#V>tfyX{1x!T?tu->5SGS|EOH4Te<}IGH zNh#aJmYlzgsjx=P#C`+s2kN5P%&rV2b6rfyHw-?sK+7Pl^=b5zM0_;Zw}HV3+cDJV z3KkJ}F9VBz-sk;3dU+?p&3wKSKLQIGZF5_$GtZvSzBHkkEKA9k&b77n*Gu)0w%cgP6YcuhN^V70T zG%Y&A6hQ_bh4}a-i;2ZYR)t$rlKr4J)?ra{Y zwCD5lixBp}bjKzwOeUj+g~d?B6a0zR56&2zXTqQYo6*U}khxV{@a)((XLs|*EZ;z~o`CJTBn#2m_)b7NQ?Xp8d+ ztwOC` z+hGaS*wENL-0}z5!l%&=Z{d+6N6!18m<8Sj=_EiBCdwR2_JFXwCD8M&GiabI$PSf^ z3Xpufgky{O$4;C%nRaSD0DARIQw~&Iu2ZYBQc_I-++DzXN^&US96T_{g}0z?4*(hW zpLwEbx0;+Fk_v{rhIQybO~P!)2Xep)^m|IUc_Vf)L_6ws0mNJj1f7OY)prhYt z{+|nohJG7m8={FA2Sk6~ckKg~)FTl#Y@>{7cod3CMYBagV6;IM2phg(4JsKxFzsqW zPSsviEV^^=-r5gU0*}C;DX9cULv>J)!mp@tWF&sZ0o{PE>azMBfgpA;i%o#41FcGD zG*HJqQkSKRI!_@I(_Z87d3)bA|M(+&L)SP&gVe!;pbCar9#Hgc=J`fYWL>kby-Q5` z#d|)iM-@qdBb`OdQ2ilA5NQnqS^qOu>ZErLPES#MJ(L$EUu{RaiWL`auDGC|Be0*SI zf}KRnJB-UA(NPBV(L;$$>FvXh_d&ZWsl*$q>SCnFRE3@oxe#=NA7(~067_P`1ll4` zf5g{;d``7cl!4UL)jd}Q4~yvw#pDKV`HizE7^lquvDPAdE?1WJ>j>y zkM<%Imt6Q)+&iFvj;K2fy9d~NxAXJ38BP`td1j)_zxP#pjQ5#?`E!OhqYcu zPx6n)Y&mtmXQ`aa*nW4*7>t8T$J)8eyDJ{U*XL-G3(2)Idd#m~+4w2Jmd0Yx=pjs{ z57U0~!yzTMwYBvL>+9DTeU4K3Lkz8Dq{5|Xglh`t`-8?ZM_8CGK0Y4v)`hGepaXrn z&$(B75tXp4U%#FP3YqNR&#_|njvYJZ8Ei(ocU0hIX~=7$W7kwPP^Rha=-9g%ld3wl zJV*Ulxvo9J5%L}ym^gxgdEkv-d4Tu4%+7X;h&bfwOS4t+8eSOgA+i7MXbj!qY!Gco zvhV9&jtNqy@Z*)}VE^W-6o&MU(Ry;o8(aKxSmDKs(`hOsMjf5la(8-RYs%C-b!9#u zd`bi8>lSsOH$V8`ESTJ`gn2mjW?`69hWNIYHs!i*XnewtPB) z^K1wTrQ*lz?1`wirK5eo=f*~M290E*wtx3p620-V!RWG_eo}ZJCa+-CcRt?d9VN+_ zJbU&e2K5dH3!rR~YxGSh-xeGMpPCm_7OAYPc&555-Se6}x%m9cMy|u5{qQy*y41jxk^Z*3{L_n=>c4cup}S z&-|F2jN%stP@S!3pD^J$tVz~hVb7X(O&G9xX|*3svIh??59~MF?%k^fEHUK)3 zZ2k=(&741W!oPhRIxw1-mlv%6iP*9yPMsQuSkcW1oux5*HWdbH>A~Wq=s^D^ zJTiI9id>MDmmc}LX1;*H+V=DpFZ7|ppDAM{gzK8XwkOWMZ4nPI@41T?Zyrf`@IV+e z($k68L2eqq{JvhwY&6I|FmB0p%w)zO70$K|*QBT9fF+=7meF(DR#{xL3MkM+jRE&bswx5znIvT;>Lys zHgj|HkWX0MrwIv4n>Iye*S*||ZsS{WJHEb}2Irw<;wMpm1j~*|%p4^kK#trj*?~Tb zY?xrbxV00lM$iIzGFsLz3aUfMsf2F+n3u5FUZe^FX?C31iKeD?TO#L8ani!cn(uTZ zjt52dR2YYd?>{AKu}MJ2P=y^S?}`IiX*33-#AIUJ13VEI=wdIRwqU^ob!e_Q8LsHX zZvY=0FtStEZ+)P( z+(1@Xctb&b}!1Wim$4Ph%38^9b$M{j?c zH;3T^TgPJ{6c(rwJw~P+mu}g+ZyzzjLz|Q_v76@SM(U-UM5zu3MTPw z&jh35%lGeh+dFY9o@4Snj)RfrC*J<`^9q}_1ui7{ zSwhk@g;PXl6>cHSqgKsR%=$6V-m#-2u%IPk_5c<(19p5eC+8_lwg`r01eCA}C$C_V zXzqkNDe#JmwuQNZQ4|cju)tXaQv30kQdOLIR2-9`aUd)ql4N7N%*s-X%L6Y&FO$v>GwIjWI6w-u95YVN#XzYu`wF;@bd`U(?HKZukwnc4VL{ zeZ+S(6Z-ww7I5&u;*x#ERUgGAB{OhuXka?b$EYK5I??4HKXT*F&2X2OckG;u&2=f; z$i&1WHFXtD#H%4)O<|;-=qy|KU09RN{_j##8S5@Dc}DgSF%|kwuoym1OT$PDZIiw+ zC-$=zMy}P=oB_-0uFr+xpk#1+^b+kxV2m|J+T2~)j|oZm(2H6e&MCYXjFhy-xth0V z5i6iM4_{x-ZX6zrEsHXGJp)Ve8E;dZ?37Sb%q?~3Guky^!sLa~4%k(jkBG3dvn#8r zvNnL1G7poQVq;@xDmbqMc%)p3nH*ZTO}8zLTE`1-CHig_gCtHLLZqUl$j(*#370K-(F zXE;!|3VFap!;s?_Aow>!(47Xe4ITb7G`MfZkM{T~IJ7T8vu$@|f(FQ<7wo1eY;FxZ z198f!(o&s}Kuk}>{DlyN^4NK)7|6EPiH!P^16QwHF@R z^aOMKPQHI1nv!Ba(C^d>VI>U#ku)zmgU&aj$Bm=p0v|$1qEt4ezW(4fcx5D9a+o$w z6Abf>`x8HxDGc;ZgV%9;@W3o&wcpWgW4zzpQM=Q+^>-%VWFHzSmwqpApf5f9UY@r9 zhdZq))75?*9+j4kj#CIJKqQ>Qk^)SKKh#zfBQG#=kWuFN-2qgm0Fj{yq%{irkA&y@ zmmY||{kk*E5m3irD=TJ13DZrtRZ)5y#BYd5XbM+NO-oiePOugIdSpd*c6Kl( zZ6Ic29JaMRg&``ng%7-7rq*9yxl1|%;=khP{nPGgK3LRR#eQ(KE6^={*!s|AU3EDV zJilWW2YjC!CYw-fk8=^Gmm&{t+d|g!I`BA{PqQ%k$-xi&tjDwXzK&wREj$NKm>;4v zj$y7Cjiwf-Vcq?{%e~Zl{t*j514Gy5eNVw~I}EK5V9C#Z_39b&y>r*DEm?tqVq>A+ znqC3|cN4;W@9(%T*A-lRux~yiFX{vfO{E9H*UsCf5_V1cbY~EHDdh_lk917mtI$4=#wfGQ0tr`fw)8+{-T)gjH#j6w5;I0Lpm(KQcg}~#1UM< zqIMZ$jF*D;=yF%zoX|~vK0cH15l=!e_zdIKI_pOy9(_<2WiU$eV6iLx5CfvnI_FZ> z(d#RZ9tYi=wNbF^@3=AK#tj+Gdccdg-O8BRkktpPa@fLR;ZJ)sR+{rZ%DK;8T3R}+ zPo9QMsi$^AH}nOAMBv~{F>p-j5m+HeP=FH96t?Hik@S0u*yjy(FKO9eDL7?tZG{fTY(IG=iZq~2??^TZEcWHExnW( zsr_UUG`^d;l1(xD8a^#GBV#PIvgx4Nin4^{YFn;bw@$*ea3VrJccf+DlxOwI=bbub z;P>nJDI3l2F4<~zu(yAJ|KzZDs@b~d(4qdEfshr@Vol-5LF$Iw7{~GG`Cot9n*6<{ zCKw;cs~((|inv zYy21C?(S~v@AGau$BrB4Rf2?q_~>v_UiUw}eLIx__cZ~zJj49BxOU8e1#XhFWvs@d zEA$kfUAPet{d>S3=~i7sSBFu!1eVVm@+uGjj$q(0ENO{x!9a4Y%14hMYanh3(WSr+ z$>GOEz7HQi-uj`jw)Qj<^^i{yy0R}aGDb46fb(b7efuV`0{1F8PbQ`78}~N2to22h z;cEbBG*liFk><|4d!XQ+2_UH}*SB6eb7rDJf}%UCk-W?9okbX`!wnNW5`mB+ zX3;qJwe9$_dqgVYqs@0V@-l9v>=-d(L}=z12F6m2$578LM-!8ilP8az5S-V8o`27f ztlJC1#=^sSVQ8zJgF_|Sn1%M?uf~rbpNh%JWXSV-gqj3)YH!aoaz?;H>1A$lcxupTl`9F}q4b8+j&lZldko9IWm&YG&Na56sWLbpHHt zg!`B_w%W*vZUL!S@3l#ZiBbF&COS|(ZTkop_c#oT#(85PXv0-0X=`&c&cfZ{$nF7R z*oh8^!4DpIWBM>ljQOW{4jTWANc3>aw+(aAq>SQC^W-kosUm?_u6QDE@H#HS#>Tb` zd2AxGY+P+x4~6e28N3x^iOYF>v}K>2z5PA8e(1@O9dNkorLZH|gps}wCMxQmu;fxf zWqEP&%#_}r6I`Wo8+!i{`_3QznMU=Z-{91WqZm^+ky~>8bgK_BraN}-+Vur_R43HS zZkZpTfZKLb_oSQKocZ&W-$CUi^eH;rcurpNYA zeh!S8NQdLENB+mto}N>Vi?rC;*_p&I8A_$Q*PxNWJir39Adu2Nti%>(K^8f4=FIU< zN9Xzh)PJ(q@nfu+N`qF+foB;RswN5uOBs`A&05q7h=pzWf%lVn{jOa*15dl=o2{*_ zsHD($=#X9jTtWChNn-%Lb#DUs(A-{(;_Z$#=)T%6>i@V^ijb1c@J9y8&0WV}@VzeUCeoFtdr?F~8Gbz-E~ zG)$O9EyvB>eXhLx?wU;-H=a}sp~+Kcaf(nCBpVZIXkPmC81TweObMGh6S?;4S8+I? z%8fBJ2;9U(=%ASy?fiTPVFsdynDs?rICBf+Z{I)hqF@T{dptF4J1S^>5qlgT8kefP zckfN1mjy3hj>n#ZBXo<2S?=iM6oR>}^_$kLnfwN#%M*00`uX;v5f4sG`q{Zkn5T6H z60q?-Fv|;qzHeK$bZIIj8#G&V&3%keuNeqI*7FK6q7N>OUsg6DyC_iJabg06VweN- z5)tt;M7HmYeus2Jn?8S>&%mVN;qYa*u#=vbmCZ)gW)<4esmwj)ezdpqp^y;JmmLgO zSSj_4laOb2qkE~qLF2u9=g7)xj}JZfy2_*^`mRYYkUf1MXm|svp z7`Mvmvy3Lpl{bI}1hu4Vc|{li2i@6D6O?=Otj_3&WWv6wtVU>aGR&R zl^XyIdXxxmyhhm~vODs(_m*$MOuBQ&wgXmyg7#u7ri*_@i;Ux!FJGP~IO?gXj`p~Ogb6|JC|xbZOh*GfpjZ~2O$Hdz&Wa2wYP9X)D*fi0bAxB$#cL}nkb0_meaZ|0R@xUm)R;Ub6LPKyvZj2gt4 zc`cL0m$JmzEk*}x*63LPTD|pX07eypfXnlh#RUb&L71*~K%h{Q?455nXEN zpw9i4!W3>@YP;B_!N1^cPvOqLPxzfP%r^y`zPNAMi&$#GxL~&YtNyViYUedRq&N zW0<8FCc1n%2N05|=;*zNrPVL?4^VQ7M~y;mc{v{g4sldSBrt{m5wF2t{L8=N8BO&c z#0_K@E@Z*sIfb!*i1Iwptc+DgMus2=dwZE5)l>rA(~!Wq_qy3tzl0cr>^ z2xn!a0tSl0bQuE|Rn?P1y(%G_^|7MZiBoBwGY&Ojz@aT@H#1jAXgtp07{=%^V?uP| zjtpV`4387DtFy1%5Ubw|;2*t=6hC6tI#PROMEvf_7&ds?XII>j1qa@T&8>aSXT!zI z+qdz@1sIRX5_Z)&ypE`Qr6nU1+*%xgiJ?(}E^Lg?2(->eUGFWj#@^EiI(Kdg`i{&m z4Z??8JHB0g<3?4WJIZzM;w+6(vkAf0reTMeFM1d+i0OZ?0+QI#=fv&F6DdY2qA583 z^s#K0RQK(>9i}_O04Ue`_egRzxYlq3>%jtrm>C(3K}|5<|7}@#ufanc)DzdQ&xReK z(UpilE0Ln-6%?qz-)xVt)YlIV%Rr*I2MIu0-6_S8RoI!!F!vkdWk;ef$d`^~o;86O zUAh`S&xdvs9ge3V7iW~Y%>&{}{SDWwU3;FV`s>&Ei75w6O`m`IL~S8vq;Wid{v3L= z@leO9cGibRMzUk$Z$m&OvE%UJsIUjy7Bxel`z$~I;mZOD^Uqj!wrlAup@i_P9mqE`1?SInu?oM(2EQ zVbrNUIzOPP7KMbOtflMMu04)Q0Mhf%H8q&M>}A^>=O;h0jD9RwDj~b1U>=hfU|8zFk*V%%j>UuFie4tH zeO*f3l)gnD`ZNn(pfhElMr(ji<#zrqw`j}^y?J=!0v{^aPEp&gm_EE z#6~s=jQ)v$%E&qBr(P~#C`Ka7oD#e!R(e5w-P>DUQMz$QjPjkrw%t9S6^GI0H-E+h z9M=H*gIRqr=m8MGC>yO&Mb#kXOzOJ=yt{Bs-h!rY&Ny7GIG+GiGiBL(k2Y7hhXpD~ zw3#6{nS`WEQG0un)@nE&kV(cw$D}t)-b&hmTb*We@Zb`p;r!9oR#tgY21+PxamMEW znd6N47`=ZKFgcBxmry~$ptz9;>IfbP4e<1M4>_Ip*|U>jrKpu;x=$oZ%ng*?5o-C3T?$AE|HzRe-E6e90-9#q0`}sOv077XeDI*o*TfA05(_2f zKfGVXeo1s@M!yI-DfpEakmH9H8h;1IMBq2-QHq^)37Z2l6&M;GCKeq#27}np+;?cw zeyV0g2~srvYB+}JV+=GgT0HOJz1`EcA%T8|S`^K)hPr-Dw5W*4By3Mim_6@Uc4HI! z^C6H+el7~tO&uM6y;EoXm0bM!Kj#FNA1t1XlnG92NxlWPa&ercAViegew05k4-&e# zCS>!P<43SrSuqot0nF6!Ts0wKDJ}{)XAB0%qHPqix>b&#@v_J<(xJhI%^7!TxtfZ~ zGt7#8l$)E&PII|ieR*Xyi?7St9tvq=;}TOY_VM<1dYz#0v^NHk1`T?|z+!5E=hhG0 z*0Yeub#fX@B1`K?$`eC2VR6t22+aA0j}!XnF5g!})yushF)s{2DvJ{f3yZX4=iw`Q z4*LnvLt_2GVMP(#p^6zVZ=l!}DHqrM*Wt)MBN9Ac{ovTK5t3#l^H~?Z*;?YTy{Y;0 zj~}~3D_azP;A2tEnc<4iDy#akV#s90N)M0sF%BJvFhtfc&5Z@@pcJ96QA@!Km@&p8 z1<)1aFvupaih*{jV>EJsTLaR04>m?&q3MlM38eg3mWBx=AH$JF`A*QqQc??U#5h?^^T5?d9dZLdV$VK+cnKO zfMD{Q>CLrel~e7cI&KBSU+RM&g2vfSeS4nsA_W6Vsd0O?mr+~iCUx~GNdomHF%w`G z77e)ULkKyZg=I>A`Mg}5CHDqoSaSe3!>@6S`8LvA{)DJrG7p@iQrwX$w|>NO6FyRO z8R&qE0YbjbK^Fk#s7;$T5z>V^D@Vh+HEU9ls?(Tf)+KoU@Q(iP#=7j-QwNp+kuN7u z|Kdb&2b(Y*Q~_0dE{eXeD7|;!KT%Rd*<l!;5BI0WA)17sDT#H+px_cBVDCJF2e^fK7aW#*G*qbTN@k!25txyqqBPA z_r99?D(O9Hd?iTqG#1}PSla&#)euz1w|z6cwQ$S{Rb zHO}YAVi6yy!tgH5fN4Q!%uxasFZdB-ap~^Ky^#$dU#;G}`Rq-}TU!>gK9iJ?c!7jM z1MSs98iAdM8Uk(i1O)EU{qvNrs+wBLg`SH8JZKOxrJ)Cy7Hmqc(3m0y<4}3BZcXpK zh}X!K0kBQ|k-J0BX+izEjTnc&sYEgt+H`=iNWoU<(pswIB1&FzK`X1aIY?p7V;qpY zckh(I|D~8y2SgKaQ$0LApMfFt1;8RJYp!Kqw{<=b()kzItrkDOs?+@eQj-bKe7Lnn z106qgrq9PATaIjug!K7PXb-D- z9Z_8eoFYb)jh3%wzmhXyx`Sua6oWq5;vLI#?ZK3QNVsl>qj_Crz0) zZC*WMuuPmgjRYIBm~V@vJAlQ`cS(@|xdo161OuVySeU&_nH>!ucZ|OY&#i*UFzegc zK9}dG*g20&7-##BKsrN_4sGq!G_-*9lux1QF=p8i>B`YY6<9tvC%|u{``y5*Gk{M-C|cp z-EsWo9AZl{XY}%1?y$GS837}ERqLz^)i?>Oz=&~g$LQ;a2G7TW7zL_Y1@f#*JU39b zMs|#%-G-WvkB!+;Xxx0SXBFSC|e6~;Y)S(I3=a$Q+bW`^<4qnv99(T13K2G){;A$h32pJLlof- zoR^VGS#AsHj`ig!d`LGKWr_V}A0DYl&t?Fp%ZoMBM#)6gXiXr(I&jLijb-WX>QX=6 z&(KHYpVkhGJmG;kD1nrh)N7Y{r&UG1L7t6@y*mh0LN!MKL!ZwT1+JB5gF}uDA0Mw6 zv|ivjIy*8LxFXJOD#`BhMeaZ0Bg8`t*MAE-8yosGwtMVxM$|{u4?ta%X5sXuqVk2U z54!2(3>8(?%kh^V+4pkRTLOW%5JnrkTTw|)JvOCJEtDDzTNE@$j1Q_KtAWsQwZH{+ zpE#R_fUrIQHX|7q*DgT+7giMHu<(;TJw2ZyvP3%-Rc#|{}o zXJ@B}VyTBm*(Df2umdRqz}b^T8zNRjV~9e&D1d!2lZ(p$gX~e#RNJ}JU#NGf!j<)7 z@q2=oQ0+V42Xl_#eks~NFKjJ{)Z>FYL=qjiHv%PAT(sg;EuvoG-NujbKYDN5-Q&2t zP-GE`LH}#P+3LI7Scyx5*5JBFt^sFom1VpGC*Us;*kaK-rGY z)};<>@RZIwTv0galy!080r%zo2rr~T{ebE@%khE4Eo?w^suV*0x$uLrfx)rQpY=7Q zO|Apt@{l)9G<$0AjF5W(Nh~uWYpAR|0gR5Y^_MMF*&zZG67Bki26yLMTRc&*sRV;j zWp>b|OYWd`D6LyJ0c@1zu2KX25!kP3{@A|ruv|Z9wLoRyQ8K1O5cmej)CjZ4Z^5Lw zqEG4-?M<50_3g0DlRDc(bFAh(3=KJc^LRJIHDsv^@MZ~wV)lOakP2) zYS%qwu-OnlTO|zlVoX z6u9s#E2}o}l!`H+c5UsRz(8XpF9Zd(am|{w2Mkb}KowG*gdhb+XO7=%_vFFIB6)k% z9)PfmH1CfGR>w#Mo}zDTEI3OXkv0IIP^eVHv|<*agP+IZ9TA_wI{>=RAwMuOwXLp5 zA%0FHGD@N8tQXOF2+-bk(?AZ^F(SJYJy7fk0qOZxL8F`GA1g@)z6O;*GBa(MW@X4L4u9brJ!q8rq(D_B!~muJ z01@}W%&tbk%fK&SIg)sgM@BI!Dl0V}@7sVVa@OUmSH0lp#|Akwz??QRHm2(gNS@9g zDt3<3W})9}3#cbH__gGtq4aT7TCmN>A>xJ49S3mxt<^4uD{3_QIoDR0Ti0jKwCQ^2 z>Fb*be+3@TTE}|8DU=4H|Nb5%(+lL25sVcBs=cD4wtoFY01l^+LGjO>ySm2jbyXM; zDI`4ZI42x*h&p>51{EmRW-kp%0t^jRRqY&viltllRoZ5FIKe!1Em7eFvk9_Li=z{rDI|2A7iE zZQCwtWm2RE3Ml(d+}m40+Qo*?=FOcT&^p2X%*5?VkyAeQ(a5irGMqrY12UO z`N7S_6$0*MO=+AsFimzjIk{InXfaN)g~jL85vZMh0h?#dx^<%%&^VCACv25iZ>SH{ z1}2}RngD|OfZdwizWE?ezbUYq@^3dPy}7m34fL_FMi|h)OD$_c3u1SNw*O(fu#Zl_ z)sA3*47SJ65Uipb-yhK)UV9L@B1qt48HB-u+Xo9Mu>?mFD?L%Z&tquknmainbpb#L z?&_`Y>*kKsyE}LS{`$A(1jwEu-@QCN^R0IMdCjeS;Dm7_G-bG=++b(-^foivv|o(! z%(U3X@|4K$M`{#Sty|}X9TN9;wC+gP*jULEBHtBGL~8!|LjU%CYd-R(X9z6a+L5Qi zEaMjEYv0vNNse+tTDiebNm+Rt|8P~8cFH1mFjYO0+qeBoWtTQczKj1Z-Dw;AnqF~9 z9pXWD#|Vbo8w`eP9>A=t7q_>xD4}r4{2W`ZYND@B#BDEx3qz0Y$!xkVBl3&NN9*R) zzhj8^%rv2MGWZDf-3>mHn;DK7s8`s0!@r=fo(Qj}_}PrG=$N|n!}}Q*w7m%2h&FVxn>l)<`KvaR`njlClE|U4DO(jjN;;ASY=g{o}QlP zFu3oG=mriyoT9-q&r5M}0b~IU#5i%(ZrQP-w(Z*O<;p`0Pq?2jPf+SdY%5--o6UVw zGeVHqxwGWJZsjKL3EKZXU3@nC>DfE?>vtG7w>NbA#*;I1-OsfDE9jQMC_dV$Z{K#t z#>R|urPar1X!NIqblSCR*VTlpmGW=}QZx`cUC^+XBAoo^$^CwUz31as317>o@jSb= z{y*Wztl($QX44uA?1!3G?yoUJht7DF^UCg&o10uggnjLp|MRcq@A2|4X!<|b{MTr7cgnp^@S90|wvdx*OcD6~BVsiG7d)KR_F}Q9|v=s#k^Xuub zI$aKNkcJjGV8DKloYqO%b45MZy1 z{?D^R>r=q9b!vb#bU)hgB1X~`T)uj>sRY1=e6#0wN^t)_v;N5cwj#feQ)jnb5JS(w ziKLo`1wOtpNeQSFb3&Hd4JJVDbpXnqW87iQG2fsB3Zsk6ccD*0xO|LFdFlI@W{mJJ zq5K1r^kGjK>b?1wrni@LdeWnuLET{H)IwWce&ydzsIz_f$6~qrHv$e`P56DUZA<>o zaz%d@g@6-`^>~vhtUd1Mf`IKlH2zmt95+muFyVbcK^vkD4M9IfEoYRkKf?xCyGDG7 z{LpTFynRV{uz|h6t9{>Uu9O{>ECJiP~7${`#`-jnGGMU#wc2LYNz2nIg}KsI{%_ z&zqNT=kRJJV2HcmD+`iEfos-M@{3>tQ^tIt=$<)u?h{Ir&fU9TvEH%q=tv29^&#+% zF0Ga1KKE37=-ThickGxzk1fFOIV#P5|7_y?j5TJFo z)U7Vs^XBcpd2`h6J$n*%{LSg0hxA%!Y3U3&A}%A0bY6DXig!`=hOcx4E+aF54=Fh> z1dY?5wBg-wxp88!>z@lT^U{A0K>4Y^#-vV*eWIjh)bjWHtJ@#9QdNv8Ei&%}U)Awy zIEKpV6L_Dw>LO|u#@wTJROh%0IiaWy8BQN~qVKEUM!+=4^fmx8WwHU2tg|07_EmQ= zlGd0^2<_x#Ay_LwZv)ihh)K z$)~`4m_F4K9rL%UQZp*)X)~@_)vKGK%oD&A2%lF86Kt*iU3>L9NS*$XZ;FJwiI^-v z7@nhY{I^te?cGC_A88GM5BGR_ddBCSr07)Iln?_q+@;cP{tSgQ&RLL zJBijz_=J9<*4~5{$%fcAMD|^XAbEVu$b7`Yw5uhf<4DrozB<KU3U)XD&Pd|Vq}hIV?K zy1I7F^JmXAzY>m`NC1Q`S?_Q_T)?Nb-e|!RL4ouURA{~DW8oT$ktdDpGzzhm4LCQ5 z1j!cNj!f~oOzgnvKZp{~`AHJW-txs9A;Enat9Csl+-~4m?Fu1#5n|(` zZJ{tSY}GIB10xFfuXCqPJ9%e=Am4~t(BX~Sw#D-HQG=7rmH?;o&{b7UUp~ct_xHk27Xt!X$?7XFauhJ^6MRpGNr@by?ZBDOa0~a6~&?$ za7uWAyBM_1d@|f^me*AvLO2T6CE9WIhvM7jGct-0N2AC(1R-X zK4Tp@Gg#(JzWn$Dh0|fAJ^OOT;%@VQ?&g0Bt#WOhIdfVFxh|J_>Z_bi$*ooySST!X z%6h;IbaD4HzWtO?=>(dDnle@B0>| z60c8evK2I*#fulue1dkYSCZ!>=^sYCO-4{B4u#&j^@!&fghWnMaSS2$Gu;rXQ?jPc z6FXbm9uXawyz9NmW|*#9OJul%nK=AxB!+8~qo_~Xz9n+N68Bjd1>=9fs8I`2n5zht z{fCm4-$4)rmb14xdJNX{7QWc}Ag-tml zTtTNJEZaU1@8C4mOLhAuX7fS-F`p_?HyYyW%$WyP?hq;E&C)+%4VcJ3?rNC#x<8FT z^0j?`s@ZbwSE=>cGDjKl{d&YgN_0c&p4_dn^<95|kM39K{Rp%I@MdHC4eQxlG}-1O zFmijL-o9PC5kwg;L3Kk?@(@&V^js#}gn_BGJa*3OzLimw?(;Pft6yth6)+r2L@J zM^s#wx=Z>VD|#WK<*X-S-T4_;H#dWo5tmo0dNfXNdZ^b^W{Wz98c3=iOH$f1GZhh8 z-Q9PCzC^Gd;*ZU~q9;Th9JwjH13txZ8{SKxWNl!`A6G?`aJO7X4Dk8PH-R0zXV9eK z|Kwi#FGFtkK3w+c$OnLhU+Tu+sp#Jhr@SGDWcun=S7l{oEeG8oS)exJu_F7H`yhrt z6Qwywj|Ol?`obUPvj%y)HX=K6zq5OCE3nzd*&``vpnHN`Z5@K#Ci}HoXoHF^C|{j* z|Llf`AjR5GTDEA>=B-^t(G zvr-_`5ja@m&^fduGkif&#-V=W!=8@heZsnSFPCnYs{f-h5DsE215W+KK3%%(CKO(T zcqXK0OxoK(`;9Z}EowI$&%Zr~&+QPgk}%gqa^b>-c9H)BFA*@@en;T)2B-b| zq3kweY&xA!pXPLrUQz+F2^6(KF#mCk`{(~V;ZjwbXuX==rRFFzyo_x z#|%SZ?Xyh)c5bn3@oxQ=^dsCt7`Z6)9z{kGE5E1K0+wh6L=c*32jp(iUn@2@&$X%g zHgNP6lRG&~kX-u8p#3K?Vj{38r=Cj4CBt|3;4*@u7RdE+GbUZK_WVU5@bSU!JeaPqh>C=mStA%ot`!F?csCUCY zfGpGT#4Muj?;y}Qxz!Lw#dZ+xA22xT)TPUyHuCz52sVN&R^V9rv4x~t^|W=fu7o@d zhY_IC3&OZS8MH^3!+WC-H^^T`Q8{0}o7RQ(bV=SaXXED?r01|~rpf!~+1IEh{U#Js zWKIk8A<_1eSo9Fq^2o=gq#^Z7%eYW1tkEwE;k?XiTXQueYS?SBO?}r z)Lgo%0=w^@+pJ2u&>q5LTofv+OXzG}>+$%2)i?R2F#=O<$9hdJk_ zCf&}udDh;)eKC{kE!60lX;7+lSupyF%|N?`r1%>y5}&`o(Bp$KDD)1SJ>qZe_ zKK}FNzX_uc0~hE)?0quIuLn;wgBIZ(B{UQ%QE&@_&J!1|r!lp?f7UJtMxm&+_!7;K zkmQP?GuMuA`X`WO|>teHin)5m*jOtnrt8Hw@|)6cIN+EI$rHP`2nw;%iujOrsRRlCWY^oXt! z-U^+PAW#b2k3#bpGjD!`!1W0Y(~mbfNClW!~w`F5<~Fci;UB0Fj#6SIc7X&(RS7k>XTtNpJ! z%ziJzrf)Dt2f>;n#58(YZP~&=YY!Ywp>?5P23kF%?3O?26NQi~Q_H&B`kR)+etYST zpAoI|z1KS$8UH3G1HioFXVwQL+_rc47jR9!RzUZ>6HEdKM5^BoHtI zy!_|N54^a1!)JV{q$HT*JOKj4jkim3z2G6!1wBs9D=zNPuU|ioz6qi}6dyZfA8nwL zyMz4!c2K%kW_6b|8XKt|2)QiqSGrQ4OyPf}Edo(dQIYexo2aXWlLmLrDT-RdLbgcH zV4V5p&9~%>RKZB#LVJ&d08cFt`gyUz2M>xErLYb>=chT}r#@7^7a6(N?yNCw^oQbN zsXK76Hfz4(hm>^N>;W%sG(mST@*jS;&%*WN_QP%s5g@k^S`d0Ki`jn1~Gg1 z)L6Dx(N9^)mu7+?HjbY9t6R%{wzfH#OZrkkp5CnA`G&eIu4QQO>ZJZ|n_9GLbqRux z5Uxl7Wo|sJo;x_d7y4OOfrl=%Id6tl+v za|JZPh4(@i8Z>fbaC$IBL)zwW&4yt_h~wo3zWN3Jc@a$N!7ndI!_kvS3=Ivr7-pQq zMuCrR&vmBXTYb;5Z!_D7%3^VlNfXR|n((J^or=5}DqHhnf?dVzbmiw|7Y=Al?ANF8 z`s+WYB{H|+cA7D66wV^Bz?b{VEL2rfdo0?1$NC+xJ))il!!er7F5V!DgV4NfKtPZ& zH3y!dCZs@HRJc8SSqIV*>;N6}POIV61*24OTYK@BJgmu1d8?ZjS#D^`k@C^K)RLw_ z|44FLnsB0{Wi~N0yJUR`z!4iDtX*s+5^yjv;|mSg#FAcQA>A^n9Zwe9`%>n_4~S!E zAzrUS!@8Xw9=$M=F-T0qE>XAYGMrNRpj))L-lANk=$;xuy_JqI=f&2I8)N8oog?@0 z@w;U3dA5*^TL-H{m0j13`t}ucBfSeb~J?q~@+HAri#=t_w=x#UBe;qCWehV;;K0==ylbRZqeufadw+z4`zu;bV z%th+r_hg+@hdN40J%D0~rC~xB|JNWGoq3-ID)e%B$Z!sC_5q zcmJX_gATtOR@Y6Ooy%(gg~hg4pLxpeLPlwHcXJa7PDLxoy51vMcsZHe`ipZh;N_jh zx=t8C-@Z^HRA5m*V{X!KdQ0K~*aaoORfoRwtIzGAsSrxGFNJ7Vj;m2{3ZcsVvnm66 zj7Bxf&z%`{aeDc6MB5LxUYX@KTHtObt13p`f2Ps$is$c?dqAT%vwbmo$p~9lo0xPW zkGX*GD?(f4%wrljcyKf986dnxeKWIqJQB+ch)mc%?cy%FzVf7Ou z9!O$Ba5dmW+>2}TWNul$p4Icy`}aGEDxWBCL^|KsuGem8?6Yza-F8OipKW^{2uU({ z@TD#?Y0yZ{O>z{BvhMyrYE$_Z@P`Hr^!ldqFn*;fPB_ALp!F1`XM7yu_y}uGG_A*r zDp7G@P{Xq{$TzztTS&XyLXbqc_5xk;iK4@2<&2T5OfhSnA9C$Q-YSPYZoYjrJUGFi zAqV@kn_NffpVHw7^a1aeXEp5aLOcC^wSN86yJ5gSqnEKmr6px|>14Wo|M<8qpr1=k zyLRmadZs(ylLlQhj(}xSLIy^roW_u0w0$ql-tGXJ1%9L}kHktSkF5nD5yK51Dc)StYVnR5Qn^y5>Gk&T9x70wSmMTsj;j<c z*{I4j-I7~pcz_K3yBtRJzdyR6KH}-Od6Mlvz8H8Ii#cuGQMPG6d;XmAs~Jeg|Fk*c z{%AJnwu`uYwBsHWg!x@>LVwr2cz*T}F)NeLS52bN(K2Hq{lhx3YX=#PLmcT#_#7ilZr`Er zxNoU>7(-RD%RKqkngzNC%$c6P=M-}(KjD0JXM5=&W(KBKRzIUooz^gY^X85CSK_B) zw&9o4#K7_;J7z>AFxUm=5h0=~cePxW8+g1|5KigBaMGSm;8x{S(+ev>V$a*xAp^O zq0^9M{30qYv=rkHq!WTO%@6eJ+qF+07dSOto*PCx*v~OWh?zVii8iZ|FR~@k!QMc}hbZGBC>zQx%YFjer}t|H<$`On2RBP(6j4_OsD!+Gn9vYEO5p}Ug6hY7d;9vM!C+_@`H3Ro&bE^N^db9cu`V)|vuyELyaAy& z>DW>F$F(b01}Z7Fr;`_q9`J_t($elzjrWM#3gt|ICms7wn9SHhm{BeM2IPm=}ARx7P`9!8s{2);cZ1o+uThRD1_`VP!X`|=;=wPIm& zwq-G=8H5pg#J_lIi;F2}1G@LU|4OR9t-CO(7Rt;A zpteTYcYYb@83wmL@+SjG(mc#*9vXrA;SAo8XT1o^f+)0VvG1@!NtS zR7(&)p)$^|p9_LW73FyjF0zNU6`o=7a2vrKahn-R%0Ka|9lxOfPMj}=gzATo{ z)%YmUefw#qb>%2=VsvVof zlQ))y>-n2;Fd0k>n;j7-6k>@D1K{kq`PCRE3~y zc|6S>&=U2*APm61?hFG7f|(-h+eJ{Mxz?%$) zA2<=W5*%|f20e1IqP!=uEDW#b?vau#7*34&JM#eEByDOPIF)oo%l+?i1KU!M~DMvfHxC{N^45uhMa;?)+R8M}1J5@D3tGfc#v4?gHN<+?A);Ms+VNGo-> zEKewNK>|Ww<5a;*opq~&Tn?WzIK1@u0Lt)m1fGrKqSMqBH^4s9D;>d(F`v`kebmL! zWjFTb&G{El$GQQxKA5PexUAeLa$DZE+-JRnLEzWWNwAF1j9$}pa*gd7Lvg@1uSGiak5=iH(?<|sejXU<6RKn8L9alkvU zmxIu}CHJY*M15nLO?M^K{e2+5cY9`h4;Y5d@i@R)ogNDB7?d^`}-R=v0JCktX+t#{8 zLYZLs4j=B9zD406$;bdpFv_2@G6w zt+2^sw2O3DLb~hpb$DT(eN3!&))^&)_U1fJma;S@Q_9^PvV{>_48hyK(>!E)qM}Rs z@sk}gV|5Jyd(Mto_W)6>*e@cW1=WkJ_k@~!&RP`J$OJlQ+dOTKI^ z(7p^HioV5*E3=0TzZF0t5T-;A?m2vWzbk$zrSCUe1cDY+^l`VVhm~d{Ji5i-`H(S?%I@Hg*bNqY~Jf_+4e)jOKb#F3m7tVcYt6oA!GPJ z)Ym$aVCSg(6cG7pu%AIb1iEO;nYyL#=KPHGS=#mD_CNleZe z)zdoS9&wN&1>3k5{4}oAi<=k8WzDvCRamuty~>+t^u2DoTsaTIdQkR|6@d`nlo)Eu zAged37{@vn$5P{KrQKy>m|RK(29_5fD@Shrbv-$ruL)OM$VJ(8K}Ti$QEg!?cg1Ag zI;C)F=244pS#%br+tk@2#ntl1*r#%EMc#7gr&NH>{dke;!T{{?kqAEQ_*#Scpui++ z;nx2p?d3~XxDJOO^C1iGccOmx@!JTWnqMPhJ?;u9iXj)BR1-vd-p8Ut9I~W;hCnxN zbc~(iS3S&a7HCqGX4>Td@i2Sq3I03D9}bjDjaWWII*|HGVjTdfVe~4B3wEP)gwTu~ zHXbcUgvkP)Bf^bnWOeqWsq%`qHc$&1@0>!@^v-ghZkhD;a+?Or?l-mVH-&|e6Ys##0f!(kF%S~ zLl7Mn!#>?;m?=#3o4|Rc25kj6(6s`f>0wNa*V7uQ+CksMPvamb|kO z^j~@k=Nj(qhUeJ0#BlZH3QtT*38lhU$cqB*;3G23jY%xuXxROXv+bz4D}2&g+>n~1 zRJZr{MbUI>BqZVsC&(kBq~iQZhtUW$dY%1-(i_`X*&$~$q~5ODGUqpY1p#>9e+D8K z3E)F4^EwtPC>eOMabVrL!-TmMO!a#Ts9$6RaMqp}vRV9$v?<#g(2_X`xLt@TagmuIJ)(HU@KJ6L;uAXWiQkR4gvNK6k{mu&^q}56(-QZ2@OAOjjmh)DM^=0mEo?J-4^1 z92d>Uqi3|hl%dq+kZjx&Ni703V{~f59HB_GxRS?A1rHpddUCpceT`RM(aS4s#Slv% zelK23f(9zOSMp@bZ@KDeA?7+lApqdxT}_QeZxgS2?<#=1&Jkfhhmn_1)klWWt%?Sj zJNksHt{G?#LzqF{ZlFnEV{DXU&xmzSII;?Z#l|H(b^2P@^&ezp^k#w9RAJ4CEQGMQ zQ0$})h=N;qlKJG<3J;fhVmAj&v6Gtys0IYzy#Wlwj5 zVQPA5rjPL=_Sj01(daFj{D2ojh9YOcH)ijIv=MpwY-rn0V zYRRylzh`{q*MI2;l3OV_nsk*=VqbrjtK3t+r9|jhS@Q*?(ZVfO-)~`i0+{e~ec_I{ zqj}ZD?cXlGDDyaT<^eI0n>+)oZ*M)Hv0-{@a`G?+bA~2F+%81bD*}T} zIk(>k(All-;WFAsA*9Jk=kh(s%37WyH0iU?j%kl%!RbOFeZQ-%JC-ZGZsWN4 z6SD!BNt*0Zbg25!iZ0Um34OLpz*pKZ?>dI=!?)g(T%?K>dikYhE`lj7JP}gH;_5;+ zoo?+&N>`G)+bnDE@$TK7!L{bbWiqp)-ycSih~LLF%JUU$L=d#R<{wELx>cXKk6K=9 zm>g2t??sRfqvPVWYx~JX4>6;M`uC8qB&+7Mckj%a@7dCnQN-)+5r0?1W;|)}uC2xs z0NlY=?mx=vNfuhEszeFlc+_R*l9V#<(M(jYg=Ev}L-D}uFc%ZkgB7t)o=BPQsD3!5 z35NI6{WleU`QlBL=;|QIIb~|m!qJQN#aqR{rna{2hePHY=K%1!_I1QUmb`uS#ofk3 zxh@lwcIVib7;zpaM3>QHd674my$O1hi_v%n;kp~}NFGR4pA2GCts4{+PwINg729!*@COgbUI-#tjH@I(AkT4UDN@;BXd~3FXvXxJh>J z_1*&FAlebCdgBmrK|yK6QW6LOvR+{=+s_6|7^hqT-E5fw#*G1P|0-<9Dy^9r7~D-cI+epapg; zvX^44AUDaU(Fm$Uh~@<^oG}9?M<`(bBfC<(d3Q+TvL@BWJjDNuhKwa{kBt1NQKNJ> zq!3-@cG<7@GZ}CJ?0{r&(ch>%b_T8qg0tuy#n`Fo_O6;&oC(=1gW3Bn@#lx7v##iM zo7z$$0y`H}BxSd(}3t0D}lEDYC`%MAVw)^r(gxr>bcbDw{Xd!ggPR7apX}p zB8dGkBK~++FpAXrN@M678O<#bSSIG@Batlu=jc2U!}gR!nGyd`ha%U*@tcCi{lyqn z)d#FtWiBSyD}p-CZIhzWUH#UM34AgzsAgLT*C$ep!k$#j#SYWm`kb58Fj1jr&%6&G zc5z7kCM04Plp`%=wqnJ%^6TS%`U<9mt+U>UBE8o?nyug6z-0Ox#>cvjF~>50=82|5 z*VJ9a62YJ0DG|rPCuXEyn=4tN&A5JE&P1%4&&n3zXS7cgI9m3++9r~pz);@x^mEsZ zrp5gDioLs7gIBbXDN_stDouL=rP9r{3X9YD3|?^DR}_LQ^#amWx`ph{X@m$~4?t{$ zS*68n2SIx!LJc+OnF#ih|+rRT4z#cF6$mRv6t}2MK>wC@RUxU3prVfd?LxAuW3dA@V1F5E6&O570~#Ze*s2 zCHuf#k?v=Pc0M%|X6h&`81`-zcHjyh>MC$~ul%{{|ZlDr`m`Bha z_J%Pgm+cvfm#&~0vNER)Oft7!H#Iaggs6*DHMET#=<$t}MWDUIJO+;%b@ORnh@aou z<7uu98m9~_ZYeOHUhu|v@f{zcqE8(ru|j^(?c+G}_-?`uET@#BVtBa*Jix_WhWO8- zW`%FO8-!{FRzxHHG?KbPW7m?-$|mAMXiMPRiq{hA8*IksdGKPZR_E+DGf) zml+7Nj?uU6=5!UauxQzr0r`>#% zK7q9J-W6hGK2cbfju1|7nwp~6alJVE{hXPZwDs>HtbR#~{@do$_f`jTq`P%%PGZz{ zT(#=z(n5SM7UXL{JVHOz_5N9tI}^YiyM^(zw1|9 zISSVBBJVP$IT=~s^ggAjplJMLflTd|suUaG@GL(6b=>sRrB(Ko?C z(hNLdLrc$6)DiduW=1IrW>EwaI(bJ?`P(n8>d?|QI#DQ&pbvM6raV-8Mxi4 zLIevdoLC34c0eK=J(7VPeh5LXFi66kON>-;UlEi=*kWj{#5w^ulyj^TcMsf78PcUg zb(EZ}?1AD<3^VDkDSwajSHD*gN}7HuQj#6Bw_R?F-7PMuPgYRUV7VAbVE ziRf_?+wOZN$EA(*L8g- z)>p1zgt9oy%EKZP)gls3xi5xMJJhKMrTiDYo|y9L)gF2XN%LD zQ)a2+Qdzv)>nbw6$8mX`PcJ7Jh40^4~k~=hyWv0%N(nZ(G-G(=_$R2nrYEh^Yb-V@g*F zX*UKe6=a+uMc7|AW2(>-FC#h#AxlCQA~(>SuHdnNSL_i*ARreJ%nO32;HI-k6hfwO z!RIdzmWmw3p{9mz;?v>t*-@+KdZnG5^v&0#Dx27w3`{HLJ_>s#fC_ymDe36Q{bGqy zg+B`wyE!i$u~(JhJtJ?Y@Nji5L^9w3ewY3){yO36D%IXR;U<$&VFvJWJ&VG?tb5qL z7pMJoGq^EhxhL#lnK}0)yq@&3NCxCkByAmWaJA z6e16Klfq<<8F$R<*WHCZmWzvv#StOZ00K3)okQK&^+&4~EyNaHfm>7AgIw(5feoNw z6nqulIBI?Qzn-wKfWf_V2Dy9>`0?FsB}e$Z&hD{z@sB|JMG(LL?wwJ$4ecZpfz!w# zJilRIV4156Hv}4xJ`0V)=^r>jGgAO_|_804yeNWC-54FF7}N zh>h`2_71YSOE1o>7WfoV&u(z8&p*0sFZ-(yP8fv&9s<3*?a>YsIzucHLu^ZwdyY68 zZ3Oc|FbkOEVhk{aRs<)Q!z)Ut;tXkD7Qh*7TQay>_}vR8sJ?zT7R4xLNaGqo7&@81 zQ7}z^ed+fQx%uaLA-W*aiLGyQ+?jd(zhAQ6ZfD)CFj}R5y#+M{UFFTE8=gF%2?K*( zk^+>o8(cBkKnYqrv(gito^FBD2SBEsK8blcs^9PzpDK&q43>I00qbAEloO6N0PRzw z*+&G!E}5zU;ls?_ICk0dy@Z-xcO4&g*9=_M1vzPH8pKg~;rvEWoN7#=O5xV*{hXa< z^&@Ty%`5lb^)4H|g|V=hWalO!YNrs~`{EJW-j6I7j)4k+u4-|<+DV*0&dBSJTHij3 zjmEdnl&qVG4>Pn0=@yzj#O7Vj^$1qh)DXh+h=&huaQwC-l9~fI|B{onWxumXR(knm= z`l8lC3M(tyy0&k>esWVbi&+`X-QKN;%sN#pI+avQ>tIlByO}hcJW)|_N&qcciZQy3 zfQM|))^Dj4DVYivw9Ij!=mxEi3U82+kcdqisHx-zhMEfs-h;ANBm}{d z5_Mo~?mbV5*o`i9;GsuuvS60z?qpX7*{5AE)#jiR-Wvr;2`JtKkoLwdeAI&+A*MhP z*-51zUj{8s?8d|#WNNl3LusH??Mo6HmP$q1yp!*_%t(){(zs+CR^emdL|s^`Zl5R| z2G}IAGCD+lnVW`Ea@qwkbI{FRUVAD(eQ}A>>OWFgy=<*h!|-aPY598Iy1R4C_x9r+<7m{~PK7fC7K<+&NE zC!!G)6rI+Q&31x?J>Xs4KYPrNGu};op4b%@n|*f+8Z3XM`YPY~@+Rxo3&UPP1t(4- zOmEFbrp~l60CIxRySZ_(_g9{W*xsX+I@moS7>8$po&#U|%LkQk{~ieCi&iYefj$y3 zhl9D>`Tp69)5I14hP?Vd^P7liSB8z3t%$mZiQ5msv2`}D|E`Zf=;bv9t0E)6rJ=q{ z2VNR7WC#mB@5st-WRj;Kb6f0V2W*%9VCS?1lw2M=4=4iiXKJBNTDHo@@kneVcC8)H zogdhG&UJm~rXRky+Jsia*k3JfJuQ}y8Qi;fPd;CdtBE?_^^@T(i-DGf1$8Qi{9s~W zKCzn|Ai4kYWyn)3r5|i+zP&8n5l-;IFZ11nNYm<#w`%j?iD}uWs@pY^f|LO z7tU;x++%M0yiM#)6d@&Iy$X+WSb#sW5y`!8gX)%NczO*Ese=eIlx;Nd7Y6t z=;c7x6i`+@26O5Btsy<4c6(r6t>gQn%F8|nJ@asxs@r?rupwW&bzZx|>dA&DW1c^@ zc-HMnK+lkoi-t;jD5b9G6TV8h$GS}(9eY~`cN*GVq0QsY*Aq*QM%g>qpS$dGXTevFT{kVa`x?4pooBZ}g+n}LjT)i?o@jJ%%3qSe$BP> z3yWmH!gb0c6DO2CJ7-rME|+Axr~R0xp=rzC4!HF_s@mr)6#PLZqIl&C(G z7q@Qi_^-EMktp7Nx7Cmq;Q09BJA>Vq+pb9*_vui}w8i7{drSB-(XxCK0;zZNk_8K1 z4OrPm{5y$>xvFjaX{)j2h3ek}PFR078tN9&mw&&rdw_P`jIQk@lB(H)e1wgGTPv9z zBQTlS&e|y#VgK&lZ(HU_ z#|a+HqMIe3&jG1t!Wek-cf{9_`kF$=6?K(acI%;ioTdNyEYnam0~7P(vc1M_FbTNx z(b+u9osK+*I&}RAjWsVX6UAg3s*@a5H-3Dizi{EIG^1^EP}!CJ2y~pdHXwY}#$xQ( z&tniY;dZ9APE_63_0oGf2ZraKSy8**vDR>FmQCJAbxL3zI7u3OBlqS_mA{1Bm)K<| zfMZ(2UCTQ*t%J7f&ziL8M6@zSs@w3Wudc6*&K@wc=n}M#vpm{iz^ArZpkSGsk|u^% zWbi;dcYKfAQD5e1oIBB|f09P6)!YfCk6M;2qzB)WxiQu}@Lt8zq8eq^hMu#pcq3;v zHgm%?ikf3G_22f}d^|X`hs|>8VC(O3Ls$Fxhb{eFis#da?CQjAs?3LfzHc?@>5|pw z-JmIH3_X7UImf02QW=DCrmt)R7smYA4Esn4$Po8lz zK{-NE*XK)k-i5Oy{cCsc{*}k!9hzvYmv?^Ka^-vFFJ-mKvfuAF>$no;MtJevLTete zT5DfFU*CAs{ryfcGIvk0Pf)u3x$4tVm5NC<>c)Cd%@er}XT^zvUGevZ$dC}#?3&cu z-|v;!mzX{5)MxFSw)EOVx4ql4h=UR~q5Q?P>)>%Cu93Xd^DpkPelew$QiYurHH`Rd zJP8{rWuwM_*xS|FZX(3Yb6Ydkv~M~R31!(OnL2rhZAL{Z-^C|ZKyMLu#-TdFI5+>& zQRRxG6D!hP3nxJvS;9|q53kp%PQ4vv(C+d?e}w#c%?@x3N&->_#xtn3?3?xu9p z{Yt9x6_|28Gj}&S)m9}kXl10g_n_LZw~deR-L&>8sEpvKih!U{y+ib()Z;p;la^U? z9hQH#3%VR|uOb83bE5XAx;GO6*o%0;Wcp=sXZE-6bBcRa+BFbm|$PTF)6|7|{2 z`7l$CRZvqsSij_2-DClyjpg2*BFyh)=V?@iyRs4{H|I&8_0L*JFAI8l?9SusK0Z$m zkIgzwT5wSKF(i)9^%#Gq`$Khiv9d_K6W8}QZfDsJCsHlg^F9~{7>($v$0`&j?l*WA zk4x#@MgirEt8E?IZ`;Xp+mf}UbAn_0Cp;gUeQs3ZxWTRZZ-0L+Oh(6>JOoM;2Y{}p zt9x9DdmbFKMdnBR@W9W;4K<6XzRq*#R&(SOi$6``J5H#t`sATuZyWW^N#!!ladrHn zsF0`M?i{T_uU5v@XB&Gz@To>@~_;>kDK9&E=5woc{jy0AAZ9{zoz zdu@1NU|^RKn9lL1RMlDNA%Tu=VpoE=V8+b1)#%=^%(uxh6z)RfkUg$h{ z`pWO0;}`=O?irBIfGp2dM>&p|aiQPV^no+_ZhWMdR;S&gL&SuS2L@Ybthv_xC~i+f zRqmDRf&RG1$H!aU`LNHks)KAQJY_mJ(H>2r%-jTu_8WcXt7qHJ zTScaH348Y<(7oJ=nQ_P>{J|KN1={0UjeU=DAZDKF8$kMHUAYZuNKuD_?I z{gUpyh`~J%KB;E>`xGnehG~mb{IJ7# zMR5kT^FOYB{J_+GhK&7Y5##t9a(ae_XLXdrS00?I60xQ5l-bdVV;HxPVV>07tfi9C zaVR^Ry`v}`9ATC#HOnZMd$IPF@7$Hb(!J9i^S$<~@+2nIt> zbQAIL7OOr`ZX$^!-4r9Vybbzk3E_+E6u zpYPY#{Xx~wcM#fbC^?shz1#ZMirko^oU`C|b?(_b3e^OWRVURI%=4IF^L^-rS2Qd7 z1_tKDC>;X>x19k=$3V0L^t^0xLcaCCN8y#DygJnA)xJJ|pKd=kbA*@@ZX0GEte|nz ziD|PUy}r$u>>Xv(!?V8Ezqv;u%o7ndAo6=WrNYXCi3NNNTd8h}2-F4X!JlFi4GB3f zf#x~vUZrEZ{PV&!2K)N@?p-D>kN9$t%W28m7+HAZ=G+dj-22+*dsSCPH=JkMwTjQj zWAqw57CD^Z$tfEC9c~_$Vd)2Ku4G*GKsw$?_2laZp1U$KGOXRr=J;JFR{Er0P&JxD}5L|V>vDFE>+g0bcqz>B_*Z87> z9^9iIt$rXK^{Cax*3UtfXB zlxe=?mE~0dy@mxPJbBGrzwh?MEfo3x3N>KbFNaKiu1n3jD`M#xqz z&RX>Q=j=@C-%vi1-+8W)X}|B>m~~6TbwaMbenF~TW)=NCes~T;VDYs$MuZ+w6p8n> zD1G7#s(x7y%5O0gD^}Y1_a8zRo$Wg8}OA85!3M`2%n=87B zpC6^8pK_|-_@r@S;%D`nEG2%ZVsyaS%}cCg_~rYXbN_ka{E&GJ6`kuiX%oIb9h{?_ zaAx5sT5vufDvwk3-gY3<%(^zOFPXFqG=KGCh2vYmqTq0@_tt;P2=355*4)7m{q zzp=M;09l;$!!C+XQLc{C;8Nz>$%AdahNf8)i&l#+X3Lf>m^xhG^BAg)we|%r(U@_o zxeeN`Ko*~o7AseF>Alz^JIzJ;t~{9QGwP4Z*|-UL1eUS&Ay?dg?V;yS!i@bqHoAJw z)@=LA9ems>m0d)j-Z@Vo)@Qb^GMH;gG4tHZ`3>JoN~{RUYFn9vri~b|MIFqYm0cli_iZk z$(}^?AJ$E(fEDTC2}^DO$>fTzD=s~cI&5BDl<14JqwzM&G>oyv9Cdjywbe2Xht2z4 zt$Ozj^zoTV^oM|Z`fJ$RfS6J-G3Z)%)i3Wl=Y#oSn@+{KRsj8oD)%JDo_jGiXMU4^1YrL0|*HC)Y z@mYyOWyIse@Q=>JzrW3{57Yh9Z=&tyL~IRY<0#25kd#Lm*ME0k^ev!?A9CMg^b>A} z+C&mQ8oxAr*My4 z#iajLc%zK>&lFLvPG!f3wmDf+r(VjrFLM<{JNSR?cPop^go5U?I48b-emCiA@5mW$tWEh5!U?&`#jk$p9(7Wn9UhiO6d2B5MHL0_V!3bG zqSVSQbTOj4c9o^`c%|p*SoVCZdvl|$BolhFglymnQbNGE`n2f!&?)cpLYM?C(Qarp zscOn{w((h8$$aazNWR;w8kzP{zn{WPSM!F|r@2xl-L0vP1m5LAv9a}yxqD+q@}hG2 z{Lw`v@pjY?fBZhi5IX&D{ONZm{^;2{r)|_*! zua-0G-o3jz=cnxJddKnfAkSkjjHklPw8^9Le?GQMG&@9uL||)|Smg9s1K8BpkjR8U zojSt!i)|A1uQ*!aANKWem324TxZ)QVC2oxEcRRgIL|xI4wSO>p(p=2-ULqE<3Vpqh>ccDy z99An4owJ^(9Vty#lkuRgt_#VsE$n`DeMsDp@b|mhT61Y~DOhyMa&;;{#fb+3m@&jd zX7pW3Dy7%qoF3&cdX&n>9;Btwkg{eIE8nd4%tVBv?TY(faPpTd@?Ho(FNX=#JXS`= zrY@(Z*NU;;O zt?6(+6ItR>zKP;ysJ6oJ;hPGsxGSqlgs=1CpahXU zlP!%+D1sB|8{U~1an4r<-2LLq_Qrr1^`r@9vzgYNJ9FmD^uS*Q6Hj_^U1J&a&u3sE zi#qC=!6GBKl@2f7f!dye@*%4&a5UF&N(-vI#T~}I--$_zg7)_k$AfFMz~60_s-L=gO8%laj6iLwcRRR@87Jsf$kMcW+OFjI!76 zc<7jYIdA-Afwl0*oP%;#PgMgYn`~LLSsnk%zxc6g&e(S+dDg=jmn2uyUs=AEp1+LzsvceQI?$TnARWs`UYyBAp@E1`o*{D{FWf5x)5o7g zK`(4V+O5e13KO3~-tigz;}E8wkc}t`(TU<)IIL*T`I!q-sYkEP9^0;0b<#QMMixcDjFu=bTzmOJiQ6cit|? zZBdW6lWN~2f!72-wW0Z(1$g=8%a`7J^&EP0YNAEG@_cAw;k$^+Ys>%Xfh3Y3TMLR& zW8>mMji1^=wM)y-9jD6jU0Jlx?5}IF3zZU#8lmm^Lj-<6hvvp6M%g%UobyIo-^h`g zo)I8lQAr)@s~$4WF=ji5eG_=vDmv;nK({&pZy=jenKx+TY3*!=7TkXBUj>(2R!*w^ zd}0%AO)hCvxn=*X?Vk=8&}d)sFa1<}UX}wM&I7smxQF5Bnk?nQ<#KU68+Wc{F3;Pj zXksy+z>56$izrVUZ*~X;*67x8KgWqGWD_TMNMqX$dauN9vQz_W4-UQXluvo-_bf&B zVn+P@Jakf=xK)CksLhJl6QYwLwyPWwb%iL-U1g)|e*_AAGrwy|Eh%N9fYfF^5ud}B z)FszqH0nj%OmeI*i)1u2h2@HNUgXN$d&@5ZtAR|}f$lE= zR=ak=*7uIP&Wf0bGqR#;OEuc|?&$g25Bp_ud6lzBz%QZi=LFdA5=9t`PQ z99V?Cp9%jXa(Lj5AAZJjsC_xeg#c4S4liu=?Ts3MLP|=?$wPBakMPPgCxP6bwYL1^ z$b!4tq)?Ghf*z5tzb@>JacXL6YXGRI4HArIB?IYrUOK9Ax98?+f$xg58+Yz# z%Ut?+PaW4t8aWRV$e@Qm5jreu*L1e4zyW3YjIp8MyozI0VC45%8?7!K9%Fe+t-fHM zqveJYz)Q+*4erStj%El*O>Rsp8LRR-qf_^0mvsPJ)+0u9QI=luSxv$L~ooR}VD z5>RoS)tReN{n>S`+LKyasPFC*#2fnmi2Dw(s?Kz4l1!2@#+WfGwrI-10s@Lyuzfs6hp!DguIFp@|@&DV=|7S?_w+Cq&-@MpkL3r?w0JstTdXea9*n89~vrK<8wG5QOUY*`Nc1 zzBI!YMen`?ar5>e5i_InmLHng^KvDol4({kU7c*k2PSB<7_V%(={tO{c%XU{u^Vs} z6DI1&o}B?&L-TvIZQd34{KO#F9BGQ@G(7HQxI>5xl)P*+mIeEk2rpJL(#M?k*IqGS zc4Gc;u-;A;sHjL;tAG;oI4PlF*{4@o1(8OU9<=xMkNV=#8gwWU{@?zkEAoKZ$Trp& zBGB0@aecf^+3{w7yWY3*!JB{;nh2BYx~2JU;3*)6F>o*5Insr_B$p=BGcfE+Y=>2E znf$82sR`Tv0QaTJwE!rkZN`qvInxq*-t9sHUx*2NFR>lk2U^JIz$zLFIzl=yz4?=0 zf@z1a;p0nR+#W5BMvSr44dG^DSzI`9j8gz`65HW%4{*31G{cTQXK2T0ly`c9W%y;F z1z2$ycYECL9`7;)Q!%X29=azi21IxwP&oy{L}EJv=)G8!lToB$wP_5{6(oLNN{N^D z3G`SN7l!OnrR6fyINVekA_{-t=3?^J$^u)=tIg=|PJBs2dvc-+A_djxL*vxbcdyLB zY4CwXXyyo%5CTinDf5@PvS5Lw;FxV_+$a7x_n_C!jZL2!E9W0Sy(6i_z|v4ePL0l} zbezW7cK8{-{>JFTPLF@-*1sWZhkx$rb4qjgu*o|gZM(j-rDR?H>Wd{9ayQut)Jixz z_f753#o^wV{b;$?7E6+l?mK2lhn>VWY(o9bvR9=sq9~g!Fus80kvWYAg=n6PlO~nX z_$4;ERYuH062}6`P$>=09eq9IxdU3|LV?|^kNk1)L$ZBj<*94r}~l! zAu6xIxkE6}gjP!j7B$X1UR9Iz!cazQsj_ic5;GKF3|d&$Qdo>R1?T7c3A!BQkT8BBQmBOHBf=KZVTJ;vpJq1XDjCv(qM zd|Db1mn8*tuwWArYR%f}gu0?xZHVvku%1|M$QhjX)TyefW+6tG)NNH)hD|UX2Ol)k z)hY}y23*ROTuKR~W~o7~ah?onYhi_>0V~J#{A_Of{qxc@m4P#BY(ol(9G-A_<;pKOIHtp_Up) z>t`PIEzFkpuZ6)Dck+>t zVml`3Fqq1^_;T}D9YyNzdk0wRbEnptTc^p@|6TLIkin20{KMh$vr{Z_;KKs1a%Y^bsQ9 z*kX^y^V&GB2Q`qtkKRA}z>wLO|7cb=nNV4a!CSG;9f^2MWn>DAF9-s^Q8vjsa&z1C zp-i!Cnu>C;)HP`~lWG`$19nblMHfl$K7T#b8A}Rtu-GDV3*lK1)bBlc_2v(s-XlB* zo>V#}>|()2bskUAH}KZ=$6-=pbIXxTGHYXq^P~~64u{YVUm^w6m_XRhb=&TL9I_ep zD61^1Pq(0)FZ@8qM*%70_Y`a7b2^pbHwNsO0+b)?qu{G_1{k%09j(I%oo!tv_r4KD zu*!%~+oAKk=#NkaJ3@`$75qHvaq;v`*}60(lNlw?jp!|l8Yoz zcBkhmR(rWTKX`r!OJSF8bNSL0%MppNKB2w(a;08C3nuF{@Ll54FHl4=@GnAsh#)>F zHxN~ZtvUl8!ly-CS@)Z*mR@TuLc26N0duF+u~Hel^Tkc>(wxY3xh2bXPw_=uqw%Vx z8H2C9d&q{2X)$1HAvQQPqtFf5b{;ZuKi4AVO{imeSIu~6FLeipKrI^GcLA`addS-< z9CM+Ut9zpncx zmMVbaY5z6;4dzf{AF!823uQT1t3*ac8x>ZED|;+Q}BYYpn8`H88dKWf0XM( zZQ3!q{z!24?YIE6CD(F7V>PPRBco{r=__FpP1jeV(5(-qU=+?493~Bgb#wqJCME7Z z1_EC0$MN7HIACe9DEtEOy8o8uXNl{QkmH_&pj-^{_q`HQX;?D-;JK+OQo9EWtFsvb z;~+bU6k#Egbx41X9p=C8n*i`7;*hxJ0o>r@vLiR&hsl#ku%DY?A_GwGJ#x)IY)eCM zqBCMkklOBlac}*~oltVWl%v;pt!EZ!C+;X+%|Xh`kQGV44OWPNk6_lyP90jKdesa) zvP?<`m^%^vjy^r-z(Pld$FJ5+8~)__<6khLX2&kaqcGe%AFPCVI9@y=KBW5j51(e* zY{@MF46;8A_JjlppcpaQD2m|g&1HyPnmVv-)-f>Go0hg9P$#KpNo4dkXzYwI^=F_a;;_{SzGtYf@TzHh&D$Ym$u5!_-7+E`d%K@C0P zyi^@Lrz)cC7h30BfKMgCUhEMF7I(24SZPDpshP$UwvVy-9>BfDh-mJxFe%ZgICI<) zuCMg=*SpP2+bkbk*<8G5RwTmJJ}pp-a%Z~4TFu_MNK>hGi?hqYE8>G51e=oD#{OlzC&eoa>_f6H{|BV9EUyEXedRk3xmkh8V(& zE0+7Vy{ZOapT_zW%jL+GmjG-eh)-yZRe|kah9$LDd!ddz6sh(m7Q>JS*uwBMB^hjy zA$Qb&8VwYa`N=e$box>mGK1x4 zOA{^yP0HBDrZyHY5j}?VgRHvzCtUlWZ>-`M2JwlAGNOPj^xdk#D4WSEZ|)P_#zz|f z@{laYJb7sgrq@blgSccKz&Du$M?1SCDj8TnX;p?OvSOAIfsU^2vm1lpp@T!m^nZBI zv-Rl^JFu;!GAzns=(uPMHp@!*ea17irbu%ig7T~Xg9gqqU|*!|m4^EO@KWo3)@%I| z0klU=BPi&EOJgO2)~y_wV!8T!=FG%p1Wyn=URwOh{8Ib-$R6u%>9t2(YXs5k7Oh!I zTzvQE2<%{Htkko0kX0m8eEK^d@5mBgv%dL^FL&vb?stEtZ>4&b^^L@_jF`)GG5;!U zyQAPOet21XHH^?ogeOp|GJK=e`=(g>6R+uUlcgM7-wqw@sEjc9+Unv;02O%l8WdZe z_0H#N^{ztf@TF7>p+7A(onsvwt{wR8M4wr? zCdX^!mO_SpMN3{!oW8zL#t?r`=rv&Ch83gBk)Z4%G|WAt{?Z?H;=cJ{V$GA0Q-?$W zNq`fxQ_b2q&IO|9xiVH@hXrg}3OF*`+7d9NBM|QrBu}mf$F+6n4KPL7h zqIO7aPr)&%JOw9~7?%dpbdl|Y+?9kyEC=;nbNwfb21;yI+M-!yc@9iH9b`G)w+yga z$*%LhA`oV9!veDE65sMr=9Ny`VN+YRXCSh_F{Gl=B!PSN_4tPy7QMv#Yzy;e&`i+a zA`kC#HZ(Mic{q}5<{#YBAt7_X`_BS;-U`xUDwsOe^%dFn5jm3^A8pkSNQ4Dj5E3MUg%p$Dh!x(miUm*o>)3!}MVzJMY)<>igHSQMTC;Pl4HD_Z2v}H#W+?zV^Byf> z=0lbullhY$ZSf!V-8TenpTtJTRX-;ljI8H^=-2S|q7Y-BLI;v7xP5gf>6C)plMeW7 z`*)En3Ti+Lx8y+-VstwI+pb9F>+k~Q>Ue@(SY@PN@dHtVP$zK{IDX*Txb;aMnEaRK;0PgzZu{Nd-!XXv?9VdY3j>&DKZ;rtd(=wv z*{l5a51(Cpc$8cv#Dm*Jnvznu|I8~BzMc}jDyCIgU;yZ5f>wn_@I{qj<>4vd^_9|# z_BC^eSX?%x=J(I~>uqu8exYMf3n|Qgh&ApAh9l-*<5$QZ*piXu(zLSzFjW!}X`t_4 zbN4Mmm2>zzX97=w&`VNoJgByQ6>(qhn(!6F$(R(Yl?;XOwOl}#h=@bR<_bk6k}$|d ze^G_xP1tDh*%CIP% zf6*2_3Dh7?MaX;-pYY?m;Q42Rhd=8s)JeVi90!^;f4D@-tm}oN$qYzMe~qZDFm0^+cO%tEg zqbKx`MmhQ^>_*6sq=o+ZCu7CG{&?upiWG}KUkbyz^slkziI_QI96P-tp;!MYwsXXa z`f%^Axz9>K$3zTaEinqiU3A3v_1FRIaaQ5Rg|ZXRhgvu$T9*06O7N6dpV^`Voci^% z!mGCODt&sKSl;fFFa3+93>{Rq=#N;LmsNCE_|oByms)=f_O1e7wzzg!*zEYKPt;um zpQ<+JuA{Q>iQz#LBMkCo&b!aG_8QAa+#di^nBCm{UCkvPq^OV(46#;!8cI-iOnzl4 z0L=m4#ia1%)?>$ld+#V@;`5CZYboF;TRb zly{7JbpRv-Fzc>T)b_%Kgf>UN_X0=2R%<>3^B2SfehhxBRqhEKJn=W|kyZNiUXUviRw`nZU#Ygt8B6a|>TMZYRBR zX)HJ<3vSdJ^-+5s)ucTI5J^n=F>gmu)k^I2T9$07KR(13VM7{#84Fl?2#yT+0FTs@7LPW1udpEHCyv>Ul$`*@XI5z1qF#z0irsO&ab4z34gm*d? zVYMucMVM7m_&O#sQ6H-*U&O(e7igw^yZfA}Z>)fqnW)2&_{9F0eu7p4u`xM!W1z}T zbe$VA$sbUK^`5fO+kgDNZTjH7Hi*W|Y7SlaVeHK)#zWrAn3J+T;Hdfhv%`cGLtHcN`gz^;yj&O=$N8Du;eOJ z<7lE5AmeeMP3CTVctU@sLH|WrEO?t7ZtNzYMP9ZWuKn_BjP>t70)Kg_?sOyKaEgWC zD%?v+*8;4U*p9d^*&=HpBzY_YfMzgQ0Y@>F=n>>1eE;&PFU})qWAB1SW&z`8%o#xt z$chFcDsbJF-2{ATU;V}0rQUrm>6c{oOJ9x@RwIpxZ1R;82KC5O%0L)Wdr1UJy zT$mp3@BE}>O@n{)Vo~r}paLw(?={dp!0HKpMRhG16S)tZ+Moin=!N$?);~Vp{bvi@ zRP=%u4cG#G^SghzhW0vP`@IW>cEUPKST$EP_X%2?8xt>jS1r&?z5V{zLq%KKm!sug zin`;M@Q;|-5)Bn%kpMD%v9&ajQKle$KJ?xv6TZObn-;fXg_jX11kR>^Q%zOX@%O*Y zDn_r2dbh94a{;+|zd8tx7l{#!e-Xkr=Q{aj13-+H~vP2bH|2k z<1*CI(oy^HL8yBQx@0N67dK^wr{D_b7QCWvx+|cK+KS+?<#0(bJ$L-#TT4z_){!`q zrLSq5IyOgms3hp@=zvs=tC<7Q^OP$F?5jcC@EgDfE<$|-)~xZ{q5aI{h5fK3Ub{m;Ma=x)3dDh)$6! z)2+Dee28iT&Z<71TL>moU!5}4y+%Y2R6DW(QPa)MJ-=Vr{i+&HNCB`JzOdD$KPDl> zfh{QfAItV@^fF@Es>{O{lbOdY4@R^qi_uk5@~3AuV9$}VqS_y7F&oH!2W~NmXlhaf znWTHB`AHWdiY5;n(6Jj+%?&W<#f<Z4uwEVLG!0>Vo9G zqhxFfN>chsbR%(3GIYP~v}?kXU(6u}DwUxGJ{Bf5jqNQAm!(-)sg=O~^eHs(=+kNbWweWPT`qhH3IUe~6AvwANuq)%H<=P^#98i*%hIj#Rgqg;r zM?cV{U8@0Jdjc^i*%GkG+n?ekccp0!3)_Sq$;KF-D&5U$F! z!0sQe80Xw?)Tkn)FWajKGo5T)JBEv7i5LnP8PBbF{``50g%B4c1f6N<)^lIIfugS? z5-&yQ_lUhK*l+Q!q*66UAbtBa*rsU+kV( zaVD|QKG5Ukh@V>3E5Wpzhtc((<~?L1Fb@xhMkWFJOE9oZmHrpRn6?wuty7L7uNT48WN}~PN*c?+zbq#|7e+bNG5b42+~a71uAQ79%~1X5XVBLDPS6A1{9yx!A&`4H3wP2Glji&hrKHED%4kVFioou8x$ ztcZg^FxE%ZS)uhIB;w|PJQOVk4kFX!Fu7jdAN#kRVd+8-Kq9dbf&n>W2pp~(Yss>xX#~QuhjdMn1i`N(G%$2TkIXB$U4rAMD;qR-Z_6QK zHyYr(T~ZBlP3|}H77%a@hM3%w2*ig^O!Y1+cX#6+BVQ6@b{hffUJ2_6mJU6EG-110 z6oUPL>hKs;*{6{Z2kOG*#{Td6;^^;hv3-+r5sJNUsmOU$eA|ZI;vy1%jHVk~Y&6_@ zBn9;=7375}KrnNbhCfCVh1tikIF4_ z8v%lOua9(aZ~mYgfy2AE7$uiv77lDfqechJ6-i#TghXzUgu=Qw>25MMO%XM6LJ8Z? zzXh(&_b(Oi2*PU_vi?*e#sG~tq$36wp_iNC zqc+Q?(w)RJ2zIj*(Dt0CD=HFKa|6))$4@{#=mc0q1eXEg1%S0HNg^f0pW;itaVg|< z-70*_2v3HihgGrKQ_y5%((5{crlQ?bE~4v=JxQn|)t`OwCW7D9HG(%x1R}JDh*WME zwlAxatO(GkP=0apIC6H}fGj6E{|rJF#OcA{k+JGKm`EG*VLk(KaL~xiW`sX72}vrw zs`LICHD>Ln>njph2g5biVUa1{_zNo*sA;Nk!4QUIU-FOZH3m(*H1a+Q zz)Rg09NnqEYQdLBQ0iJwL{?~w#vB1G3-&g*2H(jxTVlS@_L- zW42)vYR}4U)mR#mrjDaK2!bWmu#uLWCE&%gZ^F4)e*CMtU0cd3p!V$Z-`*D3R%u5Q zj%IFTtV1qNwpf*P0rZEah*u~d^hh&nY;jpnJ|=c!Y_Y(8q=B0H z^wUn1;_x5)ezL|MB`>hU^lZR#Q{7dCe4M_A41IUDlI}7%sC_mUHT2_AHwV~{tZgRv z$h4EaGi(x-&VK~Csly5u2z|#|_oo9BmmyzM`=EgBH4K9Xv+0_}xW2oGC6TcvYq10s zUjKai`_q0w46@`{6BBy&W6C1XhA1JC9AQ!|tDkWFYI*TCTdW@fT3kG62o@YSDoKN> zEF$6trodIHyyImsx#sVH#bPG!9uMqthO~ob5KWV&z2+R0fM73hd4)O{$|+ZA4cIrm zU5qqnVbaLvK_D(UFa%0_6IL!Wd0=-JU0Psjyt5VoAXFTWYzkqIb#)4Pm=0(=Wzdw^ zPFe-9_EJ{ccoEchrU0#g#Xu0@Yi}WN3V1T1M%~8f0>=~?$zn9IzB_PkvxKC|q*#~4 zKE@I$OJywm6Z}gG2n0l)hmUXqdBXikVGc(0hwd7;8H{V`V(11zN213MGxrt)2QXV% zVP%S9{u=Nz{WfhuU2S_6GUedhLRfHusxtz{(7tD^##6N?H9ba1wb0!!b48_tm5KKH z(|RSab?JBf+pM^A`e zx1!|wJN84$u>Mle4`8A-4%97k7;_zT^J&@K{!L~b$HtI+cH`7+5$b0sEXbZSs+D{U zW{>|x?V}qAgKdpqaz%nX*pUkd#Ugwd_?O0=gQrYHUMgG;<<%#fz(W(_vLwJqR)abc zHMi_RE!4++8Nw-&Uk2X$gCyOW0ewr3AN55Q?fR{>)o`ND4>#s4?O-O-E!O-I%*Had zXh>KQUNXq4@$iZ{`ppi^b8On{a9oq;`quMz=cO=zqU}$Npb13Nnt{xGL*|Sgp?VnJ zRun|iVGpf(O??0d>j2(*%7p;bosQ>TMP~sce3t{EQR@;aQP+O(=&)%nkoE;1YaK?G zMHo$zhuCTiSl;wZiBFSS)9<0A5s1`J9n|BtuL7^VOY^fe0wKBIU&d(+Qffi&9JaVY zb0-1{kID$9-;haBIT{43V_95)QiA=Sr>w>>a$FjZhFIJaw;eW2^|14_JZdm3|nEnTRW2>{z`%0GP$n7PjpoodCx5 zKzqM26jA`#EC-0Du?vN`4z=iXP&Z}lBPsd)GXwMDDabmCwk)+EQBx+HdgFZrqD95m zyKCM-O1xl@*#!4m`p1nM8@>vQWhVtz!N?CrflqQ_6DzZ72U>uL6_bATG8P(N4n2qH zy8jxOG>n@^YF#)h6|o%sMg)6D%1|%WJm7@neBWQpov|`<15nyIo_%m+TND`~1Mf_N zOJwqnKy@gI4Q!jXX?J6s5C_VO(0@FH{p|r|CZ!)hXwasw~-Zf1&FvX*1C$(4VDDEW;yvPyiwo$fom>(7tzML1+rN67$cP1=1pn1 zH{*qYj4BH%ZdXu%(%v71;;v7Rm+s1bq1Z#-ES`-rkQ2Ot4^>;45?sBb>P??iwdQQl+I4~`9<0HsTr1X29A zm}w`_rAqg-**Df9pHq_lecEC)EHKEX#77h2wSAx$Or}#|JJFMdzMmF~$wvqKkdzrTrdJIK1Tj;|8 zGQe2#VtkuAuvGIcAUY`D(D%#Xrj^Z4g}r2-L7HBB&2HJ)RJ8e#pKggmv}83Wv?tf# z>(1KRFs$yq-fV6iv94@N|))(pef}Q2j`BaD4-iDSQ_-X5H4?D0c z?$G^I_8c@}lu!o&^e~3e<0tsnVga`7|5)LwPb^%bfgn1*wpXM_P?DJAM=5J-Bo3ai-TpolZ?Mp8aZ<>BQ z&mG|pxw>}%;?PHrwpjzaI8W$9NUS5MN--N|xg>QV5^{>LH-XFat{MUkAFKULpMgxB zm|zJa8@cG*E-ZgjD@iItY&M#Y`aNrk2K@+qM>cF{mI&QkEV(iQBBV%22!=vvoGz;b z15yWVkF|tnf1HEEb4O7kDX9V6tvalJrZCLxcx;hvkkbO+(!4mBQk61jESADh&mmZK zGai-n-mjK|+`6)`wWFiF2GECz0~l-f^DtTiSE~=XfB{+#g-a$KjwpI5Kc_JT&QuFu zJsR+;!>39*;H@mRE<=*^8`(!lfr&ga8XW{~C0oL4QIlPciapG#8R_6pnuvn4j^De5 ztw!vl;?6`eNZRgUi4@@Z7>JGwtuk2j7VgTPjW>p9XpL$>HCwft>l_*DV(d5bZX<1i zu7yGWss;H@p3I~ngNmM-0 zRPvQip%YET31jz&`BWY-&szE_Fgw&^X2Ou_uOf8mb#omk^LF+7nmhyJzG#dra{k#@ zUd=xBtkz0E8mt@cv5&ej-Yey^mh*FWpA!SIgwyBd58qd>{K-}GzcE|krjoR-#w0W` z{$Y0$JJD<5dG*+}M@}hDlR9~AEX!X8ap}lIEgh_2LC8w*yL9ug^Met<9TVHZVw?Sg z2965$Bi*VA4e|RWI^c7%mhz;AoGxx6B)PG-8#LDu?1l?miAuHU$45i3C`l!i@EdP; zLOv6~tl`%j9O3p#=0s|`>_`e=u@a2LT%@Ej39t#{^{F(PevP``Oi{rw>f2&$>1xYH zD>A}~l;W0xgM$f#uu+XwlPJWX5-C*v3_tcYH^HuBbEHH%*rPu4G$Y&uZ|gLww! zOBmZhhhjKi?_Jar?o1E|!oz*SGNEY6Tv8abx|aai1*ULJ&JQjl4h-33me%Z-ef{xS zw(S=CZ+mYj+CTqe9)c47R2iU_{#AW)0dy{IR$dph^j8?c~~#yl;0E=&|1&gau`c z^>?3hgFR9C(u39%9XsZgR^V_o;bQF(WfUi4^;?G)q_r+l${=FS0Fy*h&WNx@G$CUbKu$|v5ARG6Yw6b4SDTx5bo87 zNS^+?qxUuiJ`04wjKNpqZdkhCUZ=w9Q`Ok>EOzjFk?Kt9{ERI_8TKQs)s@QhHLsj+ z4E5NMMrtu4n<+%Ta8Ch51aK=JSqOe5N#sxQZdsI|Q+X1@Xova&1-N>T(0n8 zjvum%sUCmnz)1Apv(AH*Z<68gFI4k!rxQ#zaeH>w@bFSI3j9SSjAVazP^;JB3gTVF~b z!-3uGDCyasw`;}zDrM6kY+@Et2qN<-9;qm+>tSsCfrFDqSnm=672Ly(*|J;=H03+99t6LR)vfEI&YI7|$itE))?oM~0}E?a_89KDMM zIF*Cw$qfWApcKi9P{_o(Zu~6$9JI}_J_9I-*Do|?!fAiU*`&^*Ut}iigI{wSiK?SB zBK#XXO+nFK6@o-B7z3}+%*QK)1S*l*~i;jn;gQWj*?vR&E2LtAOE zdM79lsSLdNE+kB=YcGU(td4kmn1P;Lb4oqig94bqsOlG)-LlKf(miC`fPlU9%<)~b zEi4}P3RLtM7nt1}PK`*co=Hpw=#AsBj0oyehz-u~6i5g{MovP2-{sl&I!Iv_j3p#G zPT+P*3I}tIuh9M{U-f5;Ed$uzMtOpiG3k?|a$Q;SU~3Rj-sN+%-qSpTs|uH#pW_2IIWrh=}PaCiK}WaG#|=&8p?fU7Kj z)Fi319?9#MDk-e%n@7Zd{U;u8>@S5g|# zg-a{nk!t(I&-a?SZfRijvj`vY*T(bU=-@6sz((0;@ao0G6mg?$_{SUNaPH~3LYMKM zHcEsQR*Bf8j+^%Kkt-1J8}P^11W$vGG+!=E#Fy;vG$M+Z2wPRLk-~e~zcsVMweUw{ zW#{^v;!$8;$K}NQHxCK_5*`oihNSGRCxl;Re+Av}7wl&KW_@8Cgi95g2?KH4@_#Em z`m6z604i+|uanF7y&hCsZM)rs&@?BrkC@tS5Yz{p13L7c;XbX+bY;F(SWl#@s?Q`>f#~Jr)XAyf!Y71l!=MaCgoWh` zl=2HvgyM<56NciDMN^!>znt^daf9gee^-}%r(~fsF7$;1LmQR5ieEaZcInZ2@lfu0c z2TW-?E5QNk0T3x=I_i zOQ#kBo6c25EQrOr12!q_UwC+@&_Z|b+YJKye#T~OoKu@0C0u^K^W5aF9RzQ^KzNnn z58*k*FP;7#uv2bxO1M1~TgqPeX7c+|xg1>)mrKWzU?)#8y#DLWlm%+W>nOuJdu{A= z(PSa8H~}$(s|7QJI|$kSNx#;`Gp}eL&(%ZQ00c7Tiu&7_WDt<>AAEL-#Ybp0Ig7H4 z6nL`BY|axUs*mlDKa1)3~> zSM)0gx4}(y99k8zlI+waV9u7LtY)MUi;cd+qCIaTox=NQKvX^IG`@6@Pin zlwU*ffc)=&??hdnaR*_%roAijmMWwX%}!m93aw+j}0t z4f@T)>Q|bH*2Vh5d{G_!q&P%!Q3@q(IY2ua%nmEd_F|Y;t^@0BuPqmx%g`wgF1E%y z=Tq524EDUTufxmDZtmpJts`a{Y{6#aeTB?Vl_wAhK~Soi%_Y7{ z{L?G_ldf-8Jo#^jo-ulJXB zz4`NBc-+h28oZ8}XiQzw+4ULeVCAACmOhw1oIgVQRA=cXF-5iBCYK8c-*I{Eg?4c& z6HcSY%|=X%co__@xG|^#^p8}6hRer52pO}Ed!&f%2x9XdKi#PNb#;h{2V;APX4y#R z_%J;~ah#0Kl*;2IYeQ$WFpPomeimVfBu!X#!RO>7YGg0;gUK!V8y}V6*lUCQ!H{{> z=Eo{!4;enJbB6fl4ZI`%=%0jXha9G+z*y%a3A5!AsQjhN&;M<*6zl^tps*uei536K zt{MRTj@b2v>B)qDx{Cx@DnryL724XQ{2pqH|F!TBTS*u@G~WduRz!epulnIqBX45a zZ9gj39zJ_L^U#NfA-&V%ma~SqQSs8iATh963NlSQ36Y{pulQZn9BRo`Te!ej{2+B zZ%u929B-*NzWcFL>V&}b^_$iOlzCX@G+YUN-o9+tjmJV*EPVb{zXh-Jap3{^AODHR z!@Hk9w@Py&SNzm3Kj{7Wo9kPHw#r{3t$LK%^fFdc zbt2u()Qc5X8-(|I6$Y*OT~~7g?V*zMPRAI395tvtemoVJ7P^c3C1cT@gPwD33!;Oj zMD;bd*dU-wN!mD8-mG9k; z2rn0`_QO?EGezuTbJW1Jeuf+57=+iFY@B9oIMtG0K>nCg{irr?q4!a^U8V3T_=Z8H zC5|!W-zq72%)?QsI8AcEz=3zOvKDTjBo%*-{M>)O`2ED+m6SI7Ej)XoSmA0nS$4Uo z;ziimDL+RlVx~8b;$N3{{Ckgk9lm#Y!`w^(zdK@}<}-W7Eb+Q$7RGj*QTFFN#TASY zV}smj=k#-my;i`U>WC{H#$2z_x)TjiATmCtlzn9rHA!g+bu7D6enkyI63n*{O%$RK%96kS@RvG z^1+8Z2Mafcr@aOTW7V9j=U^Stl&|IRtpR4vI%^se3fA2`b4<7jp00ERz4qLWfdd9) z;ml_F&EZ`iK9esmyhixhyc(4%st|b z2K`Sr(%F`x(R@p|y-!L>kgJoElj0JV^UZEuKlU}B+z|ZE3}N3Ym8Y(muxzoo%J9Tx zL!6w5ucBJF@a*C@v+{FSyOiLJ12Lt5e6XYTz3%chd;3Kg2fS{?L| zppP(u9x~BPczv$@Y+(1h%?SsS-3$KsKIZX`1v74mi%BWB1T9Ny?-%#z(PO29!^k%q zVr%_d1AApwjCp8pi=om^^N;O0^Yu32eJM?{O{sltvup*2D?Hxmj}86#c-)g| zDxZ2$VQ0JwD=NE9*MfaYc7O2WQE}sX=^i!LFiypBr`~dR^2ZMkCSqj>Ti>k5aPj+2 zUF&?K|M4uC>6<(IU8)-?0%81s2tH6Os0g`W$IZ5^rD01jt874B=&4Eb-H$Iks1iuo0uIQg#JR2@6Q`p>iz-w@j;$p%J-u$ttY5spUiU{9p>K8gf z2p!~~lCkyP3%wxGCvO`dcbHy^0kzFm9c zoe?Xao9xG8I8?gqbnmxk^ln+`nH^?BO!ne3;*(0vJA8e8wa1P<3C;GtzKm{RW4ThaJ{piPrh6}oS*YB6kF5IF7r#_LpL9n7Mbk7|Ka_`rB8qAd8dcn z4pm_x;K>9H;#vq^BvKeZ1O$pXS5m6~;w^7KwK_7Uyf%h=pFduI@4BJ#v25Z`2x1O+ z_DJ=@|LjBvpDF&)C7gR>gRxL3)&euJ2xorp679z8ST5O_mq@!7#014oC8GlthbJhoW%N~ZyQ z6Ku}QlzaG$ob%_;FaAhlASX&;LFz|!amU!;)d*&@7}+UAE06rFxR`KPo&K=Y?L2^Q zp2)EMHy^J&asMRjk#HrC*|Y`XL?m<%dgv*4wjU{?;9-MCRTa)T7&Gd_IkDrh@`sC7 zpuRsM37_?67ccY@W9jl8p<#X{S9uDsGkw#d@h;6Yw1`HU$h(2Q&LVRqU zc{LMoQGe6yH?JeUI#$kA ztdwD=J#L)nk`dFn&i&kJc7uE6KKVqviEz)sdnMJ!q>SJBmPhFn-%SlQ%U+xuB0vWJ;=0T0g4|BgL=o zWf6*1hVb2|skS7=rPW4!7}?>xj?Uo@?mpIG$%X?Cs;?zlbLVvRCBi%7B!?NOds$BV zhflT%ImneC{=E!Ses8b;>XNA*F{T(1Ry$U0<^u6G(OUM`vipx|x#aJhuOn`va%cG@ zUA}$k@q6BKn>Q0a=-{D4@Iig#4bfBP!IK~sOD($DJycBPre2i0$MCIb0i#X?J#y?6 ze;tpBiCLu!g#*PxU+kc9xgg}+vhT!n=CY66i5*^t5X|w$v*VF4R`4b3$_#}0!3cN9 z`Y=kRoZ%Zx;0uMH$jBd|U@$Zv#7fvV`y_mpMEWM)#}&4|wPRv^W~-Eqm6h~ZEu3Dw=sGOs&`M&jOOrvO6_=YLJ{2%NM`JM2u|KOg1b3wL-Sx58+ zYotiOy|yE)JutT8VEj(ye+;1+UMo4@ZMr;a_4vtAOzDmc%QxQ;vqZ@G>F)k<&hG`x zB8Gvy2a-~Y>~w1mz8t(j==Nz>v+v+1?i6_-esbY!U#2v*=dn(!7bdI9=}@4Y@`6=s`lezWHx`e!c~8Vq+fxX9YE}px!!q>otUUum*M1jg^xM16mVHk*_(u= z;dy0ceGZTE!U~=W#NmLp(|6eqlKVgP-o;=-$zvua75~Y!wY7UAraqF6wL4ol@{xO= zIK$=>imZj(M(LpdO~C(ra!?V4ol=Zzd3SMfsMTQ>1mCBCj?2G%%W-=ZoD17=~y*UC+f4+0zsU&s={p4vyxf3zvk2HJ$;q(rU zh=>qVVqE&q+aW6>tL z_T47B&8fS!mcLx@Q**J%V}TG^iA9CiSTSR@69>8n-+vQT34wD-I@UZFMZFYh2vk58 zO(s~9&-s?_6HbQhgrLcBxK(o%QB#I8yaEzi<5C57Ca=vZWlaAQc4kJ`L(WdC(H`|__uRM#RcSlcfF2~+*7>@Yo2aS*d$6yiw|6QRI%fLhdB#2 z$By%@8zw2Nn~;bQ^pN9)_5FcTGeWI_n2sVc5@5D}wr_rn8uszI9j8~17FLAwIRf%U z=86)}XG|myLd#Z6B^8^EZ%TqCj1t4La4}}bojp7zlq9-TYTmL;xogzb)rlTEILsmD zCC|5jdD$rHKl0%z_n3WBCR1RT)`#9QgYsAXU*#_Vju*Yg7w}m}ehwo1BtM#|8oGE?}b_~Er3=;Yae-G>(n`65bMVNv)g|5W%AR~Gyu_cEKl1(7S~ zT(L3g#Q1AE;;-aOz)a#hk1#@p@C&j{fr=G3IHTT5DFU_;%T{Ws0f+2K^X- z#?8HFDB@n>el&yL0!aVtUvf3l)nC_Xa^>*0Vn!5ycZr`A5906t?r|@TH`TFDZ+nfZ ze3;#1h>4g}mfwZLq3${M|7q@B0p3?S@?RwXxznD`Tz!L`iKUTkL2HrFPA^l^{+VhuDOrm*?*;8#`nB_efhg6QT7%xd-=7>j|v`u*v6Y& z@G~G!dlc1}&f5im1{~}vp~Nc$S4zK04oocFSJ9L^LX23;joKzonl#D#6JeM$23|m2 z2b<35+&TZzSIbTKsTs@;@ShNmy^qQalU!6|p3ubP{)A9WUZ+t~`or;c&ayhVvi7ID zvursjv*aTy)MAj}?v*G!ilRjP4?K$gKdi>Qa!D9kC7=zx0v5 zsW3jyI}zuQ41jtj_y92e^}Y0cMuea}l-IKn~d2q6LG&$q3?;f6hJ8!EC_+S{uMuuaCSt`17U zeK<0H67XxGN;jIlT%|T*0{}$JSQao;-O{<>bN<$iWcdsJ$r%ZGEd8RQU@!Dz&M#AGxXK z36*^{pY2yq(P)8Wc)fc4Updsmxs8y)yTcyYU3(=<;x?_fEy&E=b8YK~)%Tjl#lL#z zz1FeYLl^%kO{+B%>Y3u8C{>s_p&v|Y~3*J@H)`o&8ykW`ESy;Zm4kDeXBK?d_h zGL>iZI@Web`Ui~=qq9~OTS zec~f2fWz}+pbKYs-^|n$g#($SKaO)@M6n)mO3xZ#6mbV_*J+yM%l5RO@ z#16uV9vAgar`qm8%i1dqoenmnel~Bym(9f^G@ z8nGjBL_v$7Eqkb_bvfInU(}Y>W44Sv0`H@1^KMyz`!3@v6^5~sJ&g}QhEDg7?|T+g zBToVDDJexC>VlOxCqux*2{O&4PJu1vJgk|Ar=|DAzj&HSGMbLtgRXE9Uaq{1CiQud z%WVB->>G?#a8)Y9Vp!|v-vM3d)MGQedCZ-vpSfdF-3vDyKI;StO^KAmboQl!2y!qzKMM@HZxm*ESaVB_H{14lLXyFv*?%yOw+L#&MJf*KmX*G;T(l@kKgz`iC;gOC zV8PVPY>aL4KAyv&{<^OuX-uYE+==6IY z`P_NK21(x4$dn!f$4P_}0oQoWJCvd^Y2w7%dy5Q8AeV0I7vPz)@HWLsaJC2}Jc4#W zZzY*c`mX382eanFg(isH1WG6*Sch)raUD&89S0}|!nW@y2uHFLUd=f44vtGovZ(c^ zyq00=#gPvS796Txi_Xtnl>@O4@YRxW@~jpFbZ5&T&!7S`O*yd4OzZ-$&liJIBIYTV z4HXusemP1=x8J$@B9;FGHeBNv!i~+t!0QaiuClc=VxU#Hq?i2-Nu0KS?G&t+F#1-mz zRF0Pj$NXVo+d$ls8(dc0(O%SHmX{A|UR;U#+9Wh!);+A=GT!CkMq>)lNd!f8$eLBk z%IYz)hN;vcsIJ!;UsS}sZy}2bzVf6`*lnn~JK_N6Qpf?_nfBr5`zREf?zXnBEIpm= zVNY}@*usjQo7J^*9532l}+iO5KvE;%_ZkoEReC!--y~xRmqJD9hNx9 zKwrv^7NzhC491GSBTateIhU@_&590wIX$|)V17g#bbwGK4cSG+~bB1Y{uca{glYYWMwwX#^_uZlAMNMfgwP-A` zLujA_#dVkFiR^;5jf1elmExz+B=eK7_xxg09#2Mv@i6vT8L;WeuQ2?MyCAx|x^G`y zoJvBuBFfhVHPC)Su0D5pwH<4>FnEaR1y!6%oWhfQsbu-Ay!_1N`;dUT z`mibbJm!6*#bs@@K3f$w-W-lv@h%EWQ2`TT&?Ucoy=zlpD?b_LzEDDGV&O!@iaLsEQ;GaZ zqW2ga#6iIXP1DHcg^ae+penYg!NWC_hh?1(t6L~$LS&jrBi);74^R3MlN9%{SP^Mf zl|u)dIUorKsGvhLA+!PB{$j|tUAV`?VHV_E{zi*AmC|R09O-Y5j&1@ zi=3CZ3d6AE=a#Q7S5kxU^NWacBzZv_{($I5Dh^V}JEt`)2`8BNW2c}J1RxkM|=3HcwkDBpvsKy~G zDXNG{-|{l5DfgCcbgEl!?W9IH<1NAI$|FtYyT;Q`+S!#k>z&>?aC|BBQG(q4)&hjQ z1KqM!1~^KAp9iC{oPrPbmURbL!@QXaD01Pdxqp+NRif0jlzXK6=MYt;SC`TJ#y~q# z5Lcs&njpKI#8VXS1nTMG?3yJXe4HC$Wsl*#rS=q?f2~tGG>8tNlYbazz_tpaV)n9% ztQ+X-*XU>t>oDC|i9nzZs;HWufByM_NiJ((prR0W`eTBjP-ZV2Lk-zpeO<`c7=JX- ze$}d4&5l~lyi4nsX~Y!EI2$-u>+ZM|4Nd$S)O2b6Q%+>b+_jtU&YRLf`9dCE#t?%s z(voP0B{;6p7rG$hU|M|qDY#v-zo@lze7f6JhI)|Lptx*dt?xw}=nMD9nPklk&oAES z4>|Vs)xIWa_^RUz)=f8jT<)8AEa_BaR!@)e=|0C&AmZg-xok)Z#e5Lcwc=Q7{aLeS z;R{jtL6U^4sNK@L_?KFUzTC#TP|FzvzBo_CihJB+?QNcE(p}@y7qqR0E6bPD(A&C0 z!)Z-J6C^d3^rxI%Iz;X+JWOAOBb^v?;~+sl3bZjSZgz)o6^1}Rdhb=WnwQI<9d!p_9#fz) zSWko6i%)Ja*7Nb87IF6az{cN)IYJs|Ib;#_W&V&VqG*F74*)}^#G^$hQfrRe7MzL= z>{SeePHGW8kCR5i_Lf8;*zqnMgfYiw#kIB-b$IwqdBu2Iu&5G2hMFR$h!Dei|2+U2 zSU$2$Eb&uUu1rZfb?g>B3BEgzg>{6}_jx;|M<^m}$!&1cH4!VeKZJ;^p3Vkds z$a0ylyY{|M`Va@Yp%VU=*o5nLWgWQ%}SY;?HM$Y&!=zIfCRZc=k zVRc~qxN$Es>P#_vbU9pj!dY;*Fzu?(t4W^itvrB*5=4k=#$d`cJggKmI_WKDUirY8 zJNoVM*0_9T;W{3Ze*VIRs*D&w6~U#j+RLf;p`!0=^Z5EUx-ppzbc>sy(QcY|F(!9i zN@R+9>c*4#<|NQ67bXYLHD%r|#mg1g)JLeu?mcc1DTl>DJi-LoRkyH-(<*Wa?>!o`>v z*I+lwDn`2&N}38^UG>WjHXbI`g-*OtALliUR*pMXOQ}ZVUS)5U0$s!^2vVJiTnkwk z9<>SAieUBrh9)-!4wh@#rTA5D1jm&cTi6gP;i*B+<%7(87i?ixLv21Pp-@iF?X69Q_J>mRDXUh7MSnI#4_a70 zKV-vo&Vh>K&w)7%v?a6#+0C#yeh7}Ky^O@hr-fOyFDOWWcgkq>jjxQ8uY9kn*R@JM z;G_%hNx}9g9n$h%Q|2{EJlnkK<=gb{E&XPiz8g^P?x#JtF7O_n$q5hs}L+Qk4isc5?vR}lneWL1%mSkj)+D<_ zDqT9x!;dF$(EPxcyCOz2j!C2RH4Zbj$FKsa!O;kiBahCuVH=CEp2az~42M_ACE-tuuhGO07iVe>iG5an3*`$y7Sm})Xlj)4F&AtmL4{K7)Z z5xaO$aQyU~{K$+yp!t->mCevsIGKSe`%T>UP42)=d}>OcT*J}aM)%v>t2?f;25_54 z+Fd22y`I@uk$ z14Y*?4;UPtD4g0%)M4>QU%K3+{Xm!+bb$vz;6Rjh*$;T!Wq&TjNgfZCqoCY2RB9Ar zvIlZRC*edoaAN_U9j`pYDr0y^I&3kIVv#yRn@>dwzb+&Gv=$EBj~e$yh`SxJ4a=Yr ze1{^uI4{&8*nZ6tlbEK#*pSu9&2Y$vQ#9iz^DGJ{oc~)2*EUB+hryJ|>3X+elDx$O znz47=JtH3v;@%JK@Ba`y1{G1As%WR}0$(?ys%vR=BD#4D z>rfLAD-2*lm-(9OTE+BJdib=XHLzomVXX^58sXGc4Bi+BHaQer8clG4*$E=&labZ- zRxPH5fLW_E##RI7U<~ATZ3^8kmAQE)hE&GEP3KmTG~pBsvk~!el%$5ifBt^DAsh^} zKZoKMv%Ll1mCs&QPs z`1Eh5v^PFgo3WP}lIo1#G^rh&isLyCz=W;@%pog&Zq>0F2j^Z*U8akJzDrx{(s}wQ zO@e#z*F(;>7Et2|_HY!_zo393CyIvi7!v0SS7>9}#z4!9=a?IZ##>+eftaO_JrAj% zG8+#=lq4bLuRUwvp$aKfCs{F)F-xYO8g4(E@qpZH_mnbnGdwI%g$t6UoLzR>MrgHS z;UZ(TqDm=1&>5?R#sx2nwP4Lk1a4EWsevyGdL<@$E0=NO(wiB0R4i%&NOYKzzlJmX za6G_+Pn0c&CeerC{DHBItfHF{(|pHqrkbzuc8$GrZIcecXdB)P1j1CeP1F5Li2M~) znBy^gk|6p$JJVK1t#^~kcsR%DfX%B)qG-bmOM=obK($jiQWriv5~5$W$nB&u+TzGEMqJR43)(dh zVr(FQ)IqBL?83pYZEmFy0H1>rSmfC`j!xH}eTXyO!EWVQTd6ogByf7qDd!zS5r@90 zubT+LQkjGSNyz6oJIAM5-_7m+(e@>9HRkWzXT}dR)@f`ZGRc-CTPaC1DpO=@QCgL( ziAwu+eq#`AL~3khOIj6LwG7o!Nk}DabfhSyMT@rgx}S4S3-f#b|M&mC@A>$o&hnh+ z`9AmeUatGTuiKem6ynn+J5`;QrxE~j{-ojgq&bneX`igoh?25Taept`ifHE!O*Y{P zG!&&A8yDF-au15GnWi>LwqhNW4B?-#phROXiO?#VkwxB3nEH>$5#|6bpevk;NvagY z6cks$r=WQ!5eA7%iU0K2n5oTw96e3rod_BwjR`NbT_-3SW(NMG8UpZ^q~a7Q82nPt zUAlL6X&?X%Vzee=bpN)t4@-{_p)+ZL%P!5?6pWWDfXO{NAJbm^$IY8npm?NW4Ky+>AnY_Vwi;aM z5lLBCgge&NIm9rElu3Teu7>*h4f^`}ls>rs@xa0GvpX!`Lsv(fwT9#K4iHJ%``!0C zlM|}#ZE>{DEZNl4w9JbgET9Z{DaxegK6^2bZDZNPm)n6v})j z&Y;a2Tsk=8=`;r@NJ=i94AkUdwM6rSpMX-Dg947wMs)F?vQMcqER|fhvx^yL13&67 zx-Ba0MK50L#3aM=?NyzmB2ddf%)vCSu(7#rHNv{R2M*+6bi{KcW8fDoB;r*DCxR4| z5C`M?&$-psu(^KMnJVs&&CUSJ*cHDq)hthoJ2hwkn&4rVNC}AAAId)vG(B#0>r)YM z`>CvR)PwA~GGj7ei)nV-Ik=z}_iBhq6#@M+I8VgRS$^&S0uE~E^8?{1GoCjr^jiUf>9NZ0w%^Zr6oeS|yb= zbNQ#s{%x=;gYvfWf-*4vQEKzZW5(SV&n8RU z-@VIzF!bmzf26d6A2DYQDmFtK`^7<-j@RZ_Fp&&Z8%m;g;rvk;tmb#kN1mAu%VZOt z4lATeRw{5ARHctfbTR7L_^NM%vUk+t_6P;wcc96{vuWTn)2Y(>(^u$p*pL>baHPHU zR~S=W>}k5t;7zD^mlyIXO_s>D= z4jsCSpgAfONAnTpnei$j>C#zAXTN$UA+TOZ!VE|S%aGrR#C!lC^D9akp&G`(^>ZQQ zKO2f@>(n)rcICXcBY%k8Z9+d()-5O_?p%y+ORHtdF6j{89Im^wr2tzLn&axV`#YHv z=z|HKgq2whaGElZgk3V}YtDifRL{FUGZYI=RhD^ z$vQEQ!+!~ydYM08Zh>4tfT)OyirUAqhL^;yY@%C?$nYE@ASAcv(p)sk!;y8Y4V>hw z(ENL0H@IkRpPe>(LFpAjd)1mTLUImG7P)cVYMq6i`WHY0%v4KCQ6e_q4bBz9<(DBv zF-G|5oxWEO$rq;4!T{fLXhs`G@O9W-;@U<#BQ*qcZT=TKoF-dJW>DcL+$8Gqjp0-l?T&=>AP|wJXx%*W%9R}# zoXNoqq4EWN_g|x3su$9P9Leo>=c^I)fhrR6n-_PAkpA|2i?MdD&*BMhIDCa)#gLP5 zppaK(tQ5qrj%KQS_E2}#)P?DcLTSKgVQb77c?Z>1I}GIK%n13dQXQrUv#bGa*ASuX zvu6u0W86l@dz}0snaNCH8Cu;09T$FAc_oJIeY9B-m@qXb(N2ZoG^gnuvNAMZ!tP5M za%Y>(6(D33%j>1OIFc2o;79IL`Y_|?iIfvD04ptVj)xbGhtqBVVsgT-{jO8a2dPb( z5Abg6L5H<|JK<}{A<$X~etw&v^%$ZX_JneZ|0%b0Dd(IxfqLs;^nfvH7eTAU?s;~V z8Hxrly9KI45!S7Ey_3{*SUBBBx`<^+9_yKq%hQw5GY{vpu;pAF^DgUSziZV#gf@WYVY{Kt+p zm*NY*kXujUOob;KFEJy%C`XAfuNsJM9yuuh&$M!+WG%}&{GO0ChDqCM=Dmrlt(k-pphUOgWcA@k-dl!%>I@=!Psq z+LO`*RINkmn0$Ro>EEEFqRq|J38h@POpmcP5}6nCQ{oAn+u#RuM3SmbWb&6FpeVzL zu};)dT*5%tmDwSU8re*P5-@h*=Cy0HY0_*9h_M@5?-5~kJPHT=A3Vsb_Erm1 z|2`<6Y|54KuAy7!>gnrWAnb-z_^OH~A90E>ki|J89_^61P=Z6_y5-=I#wR_YBt=dK zL?s`0$XFXZs+9SrF6*G9@|o3X2HbqCE#>1$cjcZLuLR9@svL9G%T zBFao90ufod??tHkl09g#-Ss%|G*ZwtsBuADOf%jNKdyyOI!*S`#h0#M4kU6Z2WC*H+^15gT(9W5KyqSbEY2iz~8x?|xQ=C#o)&Qay%&D@c zypraJ%VG2kO$oS&NRB8%7;_pb5>JM!#RV|eBV5d9!lTz9z*<;G*c^=mfVtn5T$zjD z9&K79QwWVo)kigl+W!6fsT}JqM&gy2=l54!g%9ziO>VkYFEnPt2yw^a z;2sbuKY-{?Lx8J>ZXXxr&ZjBSQ_9`J8E)QGm8s@Om>f+HrnsM=A{wJ;UP)OQaT+gY z{&B777pj>!Bi`u1S+y0nSDgGSD$b!qDP|Rf)vv)IO5zi*LFJJf!K@+(lKpGWio0;?&{Ko7btbOVs9`>V61W?LKPD#*}6Gk8gL zBI4(`9C_@Z$jda8xaG}w_k^W=K!UeSC4Hs;v9kFu8g{#?YtqXcl1A81IZ7APoN*P; z$=a7SW8WtyAQ~e5J4!y@WeR5KR=#r#fGaAOPa^|zz92(S6+lQTrIj?aFU2&s$S7pB zIBzL!GJJ}`Da>}enHw~oukq5OWP%5m=&nMGJkx?OjBO$DrPScH17VjmT#)^pdzbBJ z0{oVyf;W9BFlrGb+YIe`7LAs|EaH+WWnJXBVF-BS<3?osynuSq%x|PRco`OW93=Kqm(eYp60pd%z@_OCeJ~Elva+!Ca~YTyjvDT-~*-7yr#=Wh5fKh%?-IA zGKeqVSO7Kk??Im9xeQ>o)$NZ78U)xrTg@7y72jc|V$>_-(9graj`T@^9hKnbaVjxG z-2WcULD8Q<8Cnu@inkk(s8;~IxwwOHiiFwGJ&qJflYOstJfH)4K@lP4H*+E85_JRx z7ba_L)!vwRgYq6r6@j^gW7;`jJ1oJ$cIOhEzpAHKd^$$NhwFnV{-=kM{g56tc2sc3 z&%rCHWXX^C>hvcWRv_c$-^|HNZN0JB_WkGh`xOvkz0Z`?szCM1E+7zUGLu$Y(#$jQ z3+m$lT!iNcLCsTL0%{+YTj4l~%{dG20Q59Rrq$n-5OxeYHr8&t1b6&>W#7THxHS+$ zWF>BXFd+Q&M!nU#*dCbgsE9^PSYG_z(H1vh(yF<)a$K>Ny8z*<`H?#NkSeB^dXTfE`INJIUF^o&G#t;Xvtr*21$!f z2z?+`129RNdub@r%&yE)ICEgiq29Oi)?~vDX#SOk5xua{ zxSHQL&o%*p2g1WUgq|S=+0Y!nl>?O^Luwxt8aBY+cfl>3y2{Q%vFXI7x9|g=z}+;I zBgLU(n?jKFNRdNIel(AXhN$|9Q*<_v8_Jmwo%A8B8|vQ1Ph+?jDiqcHG&0X%Qbp+- z3;oF|wAo8Pm(i%9uy%iO!l`L~uPlbVpd?Ex$vlxufUI~n!pZHnsfg2ax)&XET<-_( zVvfH5eoHr1wPw_O#q3K#X)iVe&Ca#2?fOKuC0Qs;dPD=$ic=bF$wp)9UPPE_J`fR_ zAhh0((QlvWzEC|)VOJN{U(fc^qV)>xFizsxRA=(hi5XEx)1Px(a>ZUE4C$dNF#B2t zBwD=*ghf2Yom!n?cD=lml4~(_)T0i^q3zy@twBZDAUz%#;6=kv9;N3WIK98+^Dlh#3ugz_a7(c z>-_ZVUA+s2l7A2TvVXzyKNgw#i@ka2S1DTWrD3zjZ?2x&yVU61T)jHSqU}MSAOEsI zLs6q3$1XBKn))jyMt3~} zdB2$u^yXd0?hhYikvjLM%3$AxzN>PlL-YPDBt%}pRpg+lT3{ty@h*ivx?_$C=rDf? z5lr@KL~Vx^Qs1g*IJ)2S@u07V2k@o9HSTV2trHWPvZixMVLeWR;cif+YVM}2XH&{~ZJWc8Jzsm9OAoM;48csE1ji*FuX(<;KH=aQ7Z>=w> zCOfK24q8Smwi?a34MlD6;}S@)gfFy*8S)>7OOf)DdRA04nF>r6b`eXoE|Rm#%BUkf zV6ynnz7=L!YdmKYB%g)LnL@LtR->qI885!wcgOTj-n<%00h72tSi!~h=dUEYJ zIdLRfW|F?8L0HpYIMFUI30&3Ep&R?5S2s54^No*s9CM~S#zeVr7mr5DM6ymYsjP!3 zyqE3IGC`T@p zI#(xPrrKh~)+^&P35dx{a)Sil_|%NM7_MBdf)&#I9en?%7ryupmL zzOJ-&${7HFM5wMWI2N;sqM98ZUd_M!qNulJ+YdC6ii66bpWuJ_cz6sOw{n&uiq5sN zDqBNjwJ#UIqN*q#UXXkdCd}eqp^kr7&*R;S6G&2%45EQL#5PcsUAzJY$(-~E7$r*H z9EY4yI7k&+rn;lzyEJ;mOI@je@G@LN`6L33m~w@yxnuK_cWl|GoIxWF7u+^L&Q?eCepOR?R^4V1?O#oV4!TG_5w2p#Ex= zJtsgbj%rJoJ)QSN8dlW9W6!~ZzEp!XS;|0IXz?T|s@gaS+v?%564g)(Ih0lM|32d~ zB!4b~y2?z{U$?28EG;kusr=nXAPiQR2bY1U*bHHhHw6jh@6c17MdQIqLoDo~ zf*B5cmYG6ACGEAErEcne1H86 zUdE&x4}c^Yls(V6kB-xq71fEh@_LOpDCLG>n?GbM%2HwPt*+Txo~M z^viVsM?3(SgvTDl7}+M28{b}kqQ-=xttND1tb`$6MZs zo+K25N)kFV6ko`QiBUmhYn>yZE;Iycb<{KD6u5{U&1n#mp%LerieixOa*c(h7^rYE z)3hjtx45_;O1#eJ^jU%+PS}w4_U{GDX^hey3yb=D7A+`u@gRA(LQr+E`62*St2ald zWMOKRjA^^{_B&&bqah}fBn;8|6freF^(}7?0T6Cswh~k`Bx;G()imyO;!2b%?Ju!n zZ|v#1sSCjnJWS4(qV$D}x&jPke7^sgdCh%-0WuyomS_yGgji_BJR)qjMQh{oKt^q8lyCFEb@U{;!eS%^cdQv(L)p?o7ZBC*w zZlnottE-?4Juvkw^Xvl6FOsk@kZq zOHAxsgr#@q`YBp77c$MdVFGrzJn86LS8~mU2hstgtufNl*u#$7haX( zpSD@a{g7LyOF!QDV?D1=_*CR_jXPii+N_Ok@qos^NjjON7M;x&KBSkvYpXRMZqT~+ z+m)Zx{Io_bJ|mvp-@+rUKCqm08YY|l#J31O!aA&Z!Iqx==8^Ru*s8`bWR_pQeeJE; zbQLB4MAj#Lc3&)b22L#+R1%*a2xlc0*G7-0i@ne6+R1danke)4+RHIhr1p6(xLG+v zb7R^nDT5d1cy~HwLtC?&-%h5pS@qJKaQ)e0 zWQ$>C@fZ+@yAGYN0&TK;4BHlU*BUKh#DfwRcnI6=J+G=56m2nO)KNHMdIHK(mg>J> zMeyIld#7|8Qfv{kd4I52*M=tQSTgz~wSrewe;l-Mf+z9+Ki`S}!SjD54L-XuI&e-r zJO-@>vZ$uLuEiPMH%8Nn1g@$}*mH6D?7H9SWM+p5ww+mFefhjyyyoPv?dL;Qe#kN1j+m5K9-pE1oPb>05*;)EOUKIe zx<%+p?&{|X5uU?O#ao1wByaL^)X==cln>!Mq_4t4iL3n#r^wJwQINz4&E;{GGN*wb zW}1lxPx`q$rAG-oa>48T|JhAz1>6}!Us?MVhpgb$|JL);QsQcUwv_gQyw6;*@%(A# z4~TvMZzr>3ESj3{EvfPALI7x_x%Tn?^XHk}!3v!Qkw;>{d{sa$v=@8k^}VkS7$aB< zYLOSUpFDMnr^<~iIR*3NLy#`eu%ginQqK zyxJ4XqsY;oqfs#5U;Q+AH87oE#>n8X>wC8^h}=+cm$NnZiq`yzS8*d;OO?jUr-^E+ z6Jk`pNUt1wkQ5VCN_2w&A`87B62>$Ml}FSPuc+dH)_`e$Y?+glSCZ=JBd0 zmTSxo%HI~}|NMJtNqMoWbL)6#$Qq+%STx9fvV>D&r4q_EpAXq0;eXXYYWIvA64-_w z9*?T6N2$KwQnUYh!JdwbEEAEf{80tca|M>47KIh;`Q-a#cx>N^CR;5ql?tenxe4H> zG`08KTieM-lRYyd0``_k_^TUU?!vn;0i&qjIJpgJP*74nyjZU6?33n);%Z6$25p## z(kfS>=b|U!?btZDwuD^kJcfLrECc>Ly3ufF|;nxb4a-LASdsc z-bFpB0HS>Jvs#-o<@mZy)mNwcjJ^KiY>fHCcD+r}M@(aCJ1H|sk1zeKF7%huB%F1R zRDzeoty;^KqoqbVj~})8xXz}`t6rOiElSF(X%TALIyJItJ-rzZ6HR3$aX6uDmYVXf zT0`7b9Symj2C34P^V3X?3SLC;smfdTNuD#1k(F)V{y=yB#EC}ZuE5tZ;^;&f{AH^k zQ=l|jstfbV04{`-Iv3ROWShnE@EEf3(oJm7EdISTBE`L^HJ zqJ3NisgN|q*`ArEC|I+80p;^yVL799`pQI<7dgr@j06z(658wZ+wg` z*JJ2oHZS@><`oa=b9wvEPfIMHtD1XczZoq*m!4MA-tuVp(|E+2jefb$wqyEb5q_`h zA%UIkqn8@xqtW9U)DEqJjo{BonWSwu`AS<`Md{|6PWn7OhA2!Z&BuH~awRy=l{+2Z z=t?BkV|P0(Dyx(1)^w0tiGnS?b-_XMmBWTDO00J|*s5(&a^^{=nxC>_P@_$SZr29E z&OGKjxJrd>we$XDL(9OF=m+b~1CHFeRXnC-+J?W){luYDMi^L@6nB1c>btRb+KsK* z&isAO^7vthh2*N<()w`c?jgwl1G^88EA`)8j!pTu=3zPcu_3RQnmSb0TyW}JaFLV^ zJ>-Y%ap95Amw&u7@u0#)LpzCyqjK7gZ9cd^`_cM><=eM!AEA9{DvI=GZd*y3iyp1( z4itT7Qvc!6U<0Ams-v(?a!fk|zF7XI3itluBQ&I_-o|?9< zd38ncy%F1A2ogqKn{uRfJZ1bP-WTAf&@<;9JN(4CQEy`lLUP(B8nxvs6~Tv%0K5sJ z0~F_dG5lFiax!@DcN>|89}=)K)$$ugc?V)IiMnZ;2oWa5cR=^Eb{r?9x}|gG`mIx^ z_AE-=;CEgB@9I7CXO?TdAs)`B+T80?c|M5nmVR4XRlVOV=e<4WY(b;X=qdNic{DI# zIa$NkU%S%!W)=8mD4sNT1#R<(&Npz7cDDZ=^aW$JtE?RYay?#&0Jld zv}!$|MJ(Le@R*xC(Lm;ZXlA}hDhw0OZ|-!7fBwKUMt4P!CtQw{b009lFl>I0NGM|) z#&;x8Z{ZBr$E8}?<~4P;k}2+8PUD^OZ~{sheua^S>KMa-$mA$b6yb_gwMV@yTXjXw)@C5uZ}x9imE=D{onsRZQwdfdoZB>+BdPIYtO zqNK7H&JodnY~p={W#Tf#j7X~6DG<=2_@!a}G@-1H zn?syU*6q%)L`0=xAQV0yvfAgy-tG75?%cYX>)}DG{CLR$&HV-ppc&>mwyllv{b(_= z;)i^t_G-JYQW8=4GXP$%hKgysN=cMsSo0l zp7mb@lWXV4muB$1ekJYfnig`9J6()ACvX1zMPh!0UE$WaZ4&+x#?!m}#MKZVDS8Uy zynVYsp&#D1Kgy5HugR?cZLG<-&t`26ynADE9S+`&`xcs+Ml3J)lu64~GZLis)NlIH z?51gqaJ9ALnd(qi{}no#Z_Lk!s7v7**uRz}l*QiZV5X03e_=j@-B&0iv_kJVtr=^? zJ{XlpAKSM6eS=rb^T_CY$OXy9?}O!S&x!j6L{GS6ex_%Uv(#kIVN#}&lRZ<;ZHLug zClxSVwk|P-EKu`PkI+|sxtJofBJ(D5P%K>f{A7_u6PXbX>47)+b7D*m*M>X5{sA95 zEv`1vGjoaF^T3e3C`WHih8jOKC*YF2Z`}cnmQEL})sn<>t5Kfnzx9R2tv0{hu^8OJ z^Ft>Z^I~pLMGp~JVOfOJK}VgZpEEj_TOGk|%T-brmNhtjWxi>BxYBad`YA?s75eU@ zm5=W;xgHj6nA0V}!MKCv2ja95@y^qyh`yC$bVY2w>Y)9 z$wg6=hc8WDzruuZQgYd&q-OudKz_6i=`3EDJ|b$i81%ouI+oi`{uwo4Zh4yumP5-S zGy&>)r|gnrmwtM}6>&9eoU!^-&1zn?YCDubp7x&i$*Fp}aoD1tX82TX<}WaNACDhP zc%_PffXvHu*rNOJ_gZ6-;UqlSGjm5iZ+XYS{WQBIx9;kxm^+_h??}hSJLlB2Y>^6B zr}4(TM!r2>`LKAg04Xw27^0HW6EGVPAQx`hF!?C-#>0(5HUiP`+O4l%>LtAFbhr)Z z14}>G-0RZO0IW^EGu}K~XWFX^Bp-j|dej&7AN>9hJRv>dthgE#^pkI~)9Tno$L_CkTZwU#@o&9d0K`#p9h!WD@*=dR`HE-;gvIO?=`_T1uF z-qOND#f4Azv;Oe!$p)%k6;)50f?K+l;Cq9^yEY~*B3SWO3XRYn!iUPWrN?&4FR$TJGP6cPoH8o?p@+mYq|T)o!xVT(9ftKKBs>V zzudwPKlw5@0VH4GlIi8-IME{Lm{!ZHD0ShiRR%0^vkosxS{ z4Q5_6;LFE%5S~3ysB8I zA0v~NAA+ECilZ?aC-c+A5xwEUr^ zc!&)~UNP8MtJ19ncz@v@K%;?ahkvbZg15xm6NB7B#5GdByBni;!IY{xfd!{Q4F(L1CpG_ zoTX9-Us%U{$5&=bljTQOvtqX*`b8iGwqBs1LX0)TCt0i^jt*-Kb}{6!AMjy$Efp*U z^X`EkCf!3uz(|j~zW02;_rqd)40*NxW9dH)QCZUC2EZD;r~gyZ;?Oh~_=gJ~1#5+< z7FrS4%nRC>11c*kYoI1?UC}ShpIKp7Dj*t(meL&kJpvY4MyzFy>7|`n*O%5&P#NUu(NWnKeS!(@ z7|GP~rk=DWG!$i^9%Kec?fe*6S*Z|)7R`SXkPlm5v;~JT(fVsuUB{k_3bR8jk~J^J zSKjip?QPjDgbYr&WE5s-@^m=iU1Y_d^)rv zf^{t8Shc{;DSaMtKbUK#AL*xtl0OPw_&9!Eogr=Kc09OS@GAIy`?|x!Af7VLRNM+aAT7)^57cpj5_*9^CT?6FEIDC zAWwwAX8ksm@lI#FO3@TNyf z{YMjg0q=j|H3EA$^m*x>|Hbnb$CwQYT$B} zWk655ttjf~zYEE52}l?`Jm_b_p)L9hfXhT~q0<;!2s94aKP-zXhGd;wu5nFQ@{8LT z97pC*rCNL@RCEl0sQ6}bDcDT{ZpmG>lDzOI7XCDUU9}>ay{9uX8g3QioJfZO9^=8W z!|2R1z5=(|F-VuFKdU~*3>3yY1lSP$I_UBBVo8ewK%tD!WX)Ow3W*7xXf=CJtHMoK=_`l3nnL&-@_NQD}O0s+(@mM-ADN2&! zq0JGF80GI-rUUNM6&BQM8z21I+yO{o+mH~*c1i#tyz1%H53DOF0zMJBDqVhPY< zbLWQ~I(lL7K%!Q~Qzr{)MOEbt{LDJ)`D(zRDHQ_v7ZM^N*OgTD6DM^Zs?NZnI0$>o zZs1+lkVRuMX!Gg7v%lS-2%_NZA`cU>_0~jqWO{T4>@Dk=`CTXwxkG?&PtoZ?saun^ zy!%Q=#CUGR$ZP60H{y7t>TWtpy22FTh*HwwMNEm$e}N@@Yo;*+PPeVL#+m z81jVKOT79VjJT&Kk@J~LJ1TS;Q1j#QxdE(eoHBkqQ`%|_jvCU{2bVm%rjXK zA3@~=p3ssTq;Jy$0U(M&B+YmqW_-^;_sSLj$wIBQZ2#C*#+Z>~+jtNbKL8w3-$Fqo zvcVpxir}8r&ws?QDyMr0r2J2Q3~2@#VU%=wV60UlkPDtKi%cFq*maM(F--1<@%`m= zU76^;`^ZX>Mn**Vm$=RXae0ne< zD&0iu8_yY31@8zR+yN)O3u#2D(g90B#|Zu~^rq5t^yuFXygvm$*}atX@e;H*3ZCZu zADl)hoNGZm8OM&r_wj;qdfnu)dcSJjYzq~mb;O6Mz)0`7hw2h?`8FVn8feqh!}BQE zVK)<4p)!i?>}TRUeZxu*CHoZr(VKCzy>{E`jbuNo0w<3*@v_CBmYDP1NRgk2p-cYf zF_+Hsk8jK0rl?!(_&ea_;+hqm2bm?3-ijqvRtCBXKuHsh#i@Uz!GYQE!u}1b-p8Q| zc?H2qiOYQR2X4Pm6RO0Q5Yw4mi9Kj+In?&f^w}|Xb~Fx)-25A)k;CV;_c#? znjm+@I)}lp@_(npiOe=~Y09jvt$ie)m2ejYltvu1|HS%?{D=3OsUs%Ix_}PwB{RX7 z(h=0x8RUSrqbjOnr}DQg`ufx7U3M^KD(8QkFt@eKh3Md1KttjU;+9pY)JIDXC#|P6 z&D`|@HwSf$&NIRz3r8}p<5%A}>`J}02QkqSWd;X*S5wfF_}+?2<0oK+_8YkOd|rZ% zL$^!q*UxN3KbwwL++qausA}{=AN%q;{h6{~B$8dgcsS^Cl-4kXQ)GU4DKUyhQ9&oE zXX~!4{7r7%dKnQ~G@S|R7LNi+hc0@M(tL>gideOLiM_7pd>X1XExSN*`LlVzTJ-wO z{9s#;YRUCQO>{-rILQY^Jw*+YJLfT0WCXg(uQVsXjxvo7%vCEfDff=E`ug0|GnTnb z#$Iq|CK3c!A}btQjzLL+01n&Xo-q>wWrZW7a`Ke9L3IviI ztfx#J2!eVVh0(sS+qtZdP?Xm91$T_jEolTt&)OjFg)RefA*6dLY2R`_B#V-(Z4DFn z!M65pE@=-{9jSnp)dH@Pr{1x-iV8ig1y-d8;xoZwCychL;!~HXgZ+Z5PldWP=MQw2 z9&7^Fq$J4NdgsNxH1%`qtqpExK3mh}NpGCruW$*{9vCkKOFbn=%J~zu zbJA@~=x)xvmXhMSxh8Olnd<#I!^V@hG;e0br+$t^p{W%*emS7mop}>QxVv^U0%H{N zt0SmUuVIWMIwmzs?9nfswGNg0D@FXHC@#`8hvF?ITI zs39`}6}%%|eMmqzqIa$%0FBc*sVEzvg7(O`R}vpSjEH-i;(vg8j`S862X}X+^*IMz z&D|Ja_&sR z7xCR~t_h8f_9ddHCJ>Gs%vdi3THK#dQfxy7yF^k&CD9SOF=8{(5CD#GmH3Mg7sLB# zrtm#7PJTWWxT_c%%53UE*{~@Zr zjap_ygl*M6XQ+r?(k198*t38C^cPJBUAWV^VE6HUIBu0>96C;RN%S#ayZ42)zlS9qA*hhzHC9H|F8_YBX7wy%ibc z-#~0B(Mzkggnw4-F??H8rq2f9YaP*I2A*j!s8 zhT0)_(4A4Os9Q%#Z^{#DB_=LgPm&OPIq^FU{c^7rd(TS*Fn&LM`BH6L^8mD?xlUeW zX#siyE6`EV(9R9$M)`edH`$rG=rl!iK%`|7tzu^-`h!$=j@`F^|GKyGt4nrWI8X)p zC|}}-Y9g8sF!ep--Y1g2nQgJTFg$K&Yb5^G-|k2;wHwh6pazJNbWPf+*6|(xzci^&lGxsxQ7zok>=pjLoEm=3i2JK`|gg z?7(QZHMj0l^UGi?jP=KjAUFdB$bFhMSB1XXli|^+^3+2rWfKA-{dzgHK_zNDAp!!O zTnc^Cg`fQ=U!Ez}6Gp0}S(wE>9l%2-ovKBD|8CYoDm8=?P5=s(^9n!|?QM2?+ltfl zjnG^}9a_If_kbNMgF4l*+eO>D%1~pE2r>{fYV~NuZ6fwAL`|k>v0ZE33nCbFgZ%m9 zgb}VjFs2#kUl68-X`+=xA-idLl5GrH4}5;l-szqrWsmNO9r?5c(_a?FcAseA*WsHe zqmTqn%YPj=(CHc*i!!?a-TeoGTFA<;M1L(8z3tw_8vc8fE4nGh=|8ImV;>T?nJB7f z8c0B%GNvREZ7pe8GwjQRh*<H$ULi0)D=BIU}3_HEgY0K1i>QK@Gz|H8HC;(fWYYhyzajlIv_*Nzn zF$G$94nI>_a^Th74(KWoG?<=%={ zalpVggE$#o(D&hmww(i;i_6jdcD#NjY~%!vsC)PAr~+C?>g^ffQieTQMGXiSERz;6 z?PlO2KE9&HWHp-9Tzy2r#d5*b8}vL(yB@I^!xW~JcKFR%FX3ws!nKue{+v(+I(jc+ zXHNM?TQVOp<)a+*!gJB7JLBmR>VOr2a9CkOa?r_+s#-H8PTG5ogD3YEgnX96v>(NB z=xkXD7JhC)Q19XBmbeP1x*di=)bDXbBB|^tK4pd$7*C?yczFI^0k~-=5Ro<}E@Z*^ zsDeRmu<1n?V{zR}>b9T{j=WS2dQmUphloKlRt7D?Oia&?+m&}dq4uihRhVmZ>!b?l zE#s{*|EDlYZL|5YuT~12ot^LLdNEib3w&);skbf7H@T;+l&13dQlG^}ED9s};LFLJ z>kE33kBp`RLCq4kuF^`KwqiI9w3Dd~Pl!&=EO$|SgcswSgI77WG?7fi4*dY4PI>}u z{>!RLaN!A2H(z%e_&k_he%=;L?M6yjiP@)V~C zE^5&KUT0tBt;u}34Y3EbZNt@1BH{4RcMW?2ziv|| z*iNLyRRS*6*`o7tTy|pr^<*XE-cVT2vxdC3g~#FJP7s>Tq>u?#AmAeL-%w5HiyBsy zT-jskf__|Ic$J6KYZ5>!a4jZg330iNRSQ8ASsbT_x>HY8_7VRKIB`>-)m)_hxF+<@ z&b7SXltmsg7mnRN14M&XJi%cIS zE}V(G25h?vt7tQ$MB_Dg^wHm3swM<^U{H{yj!#9-PegSzrgJs1dARzxQx7*WlYmnp zc_s(^D`eTI%a>+)n4zimqg4eq$#fwh3T|(RSYyvxeYka#I4ZjyA3}hcMJnmnN-mVz zahI_~vau4knG2)w-gYCbk4tY$kT3CbFT$Ew8W*0(rO!#rph(zgEoh5Wdl_DWIW1Ob`Au%-v27iSQWh=)f4 zxB;A3Z-VQCzTNiifr(eJgJ!+U52~!|fYU<+0zTCAUn~cfE?;UAEpDP7=wU|Abakqi z{SY+MBY4^zrdAHKO`luwo+1#inpKF#b8Osq4lNfdMQAQj75IUv5tle$aq5^#L(>6t zL82CPaJ@CPRxTLp<2rLNYNfZHDIIy+(kUo8KsrMix$UgjkMWg? z#1=%*7!s?ka`BOoi=@)Jo4+&WqLWkjG&8#)+6*0@FK!#y)J4WO#2rLURe2jYX3SE~ z{i>?Ww5@|cE^YlYbK_JD7qGN`g2Prs%Ylaby=^!7y7k2S04A<=7|BPngg}PrO9q?D zd}tl&26n9|1=)z~!PC4jmw!We|C#)W?6--6Lt(fPqcpgGjFzI|e0Pf-iK>D+z_)BG z?lW(UtZ&A!9?|E{9cVOuUiWgczQvM^g>8P|<>jEoIjP?l+ z<+#Z6#{E(t9JB<{lExGAQ_SG|rzmb)oZ4YZlYJVBR|FtLMJc`djpyv*S`hCDe-eb3 zgHQC-4HO-FO#zdh74AtEJk9dDi_qK&=)WFuxS}G5Aqe{J(r$2h#(*cy$X6en6w#cG zXlB~oaW(Zy% z#!6ix;sa$6_uV$?k3f;!=T+GW&Qi%=(@rjf>Gy?0?mWXd)uogDBp$34tqE!HTPtfA zqeLWuX3(=IWK-U2kTtQiAxdK--{|o0>F4gf0`(anD?|cUa@*kOI$bQTtjgJltF%PK z5>nZ65aGEI2NmkKBh+p}&k_Ek7*Q-Zi$VXh-)vriSx^cs8&F{S5;TQX#(kfSxfgAo zoPZB7HuoM$XP~01ldl=^1F)am!<3R%$4wVv!NK1FE(gs8juwDch<~W`J}gk1lh0|X z?(RQ$jyoNkrfPTCWawQLZkVx z?PrL$gXTTuNiY$($y>vO&_y8^-RvJHcJ%Vpfl^^fM@^ca`1_{a4|vz8x)u4ZCH6&D z)H$2?NS>;_fR~<(&81d#uyK@eUjqG@Zrt%;N|OJYaYeKisKrR}8Gmo_ z2%Dj%At-Rv>`L6w)9<{RqcmE+D?DB-pL(=oKqBbj@IJ9F8*WWm^!_pjt~apQCQ;x` z1ZoqE2e6|jZM9E(YtsA3N3F!maO1i)&?;|?tjL1wF|H>~vsyjbcq2R>=5CU^1#(Oc zqN#v>T_#yKmM-BFWljtd_LwUxOS&C8V1T7SGT+N;lpbCk5ry8ZUIpZZs5Wi0Es8`? z{mCTC(nFU4cd)A7F@>rmGyRVnp5kYV(Nf7i{RvUqXE`@a*~^%;%|M6@CIf;JzXHW& zZkLkLNe@inDtHiyp_@ZXxZCR85{}5S*EH)795)SVv--eYz<~|xQfMOt*tct*#`zbG zD_$iC+k_Go!|DbC5#fcegcBZb5H2pMyr<*&FG zQB_J?lUO&_Ot?B3gnZw6-w&}e&oE_h)w z5$lSGcD>{z%}9oZTZzFtPLe--Tn?0hVkxZ!1rZ1;Q2m6|Txl60_lD}~+X#V^3j#^3 zMnwyqQs`GoO?o9iBb+{;DX(L131iBfl_pJn->8NvFC?lzAJA06!o-4kfgA}6)V{br zetu)U8KzLJJ@*C#4BjAvwB5{U(;4MR{2GLFa$kZ2oD0vW-YVjz`;yN%{rb;eD7YqJ zn-+Vowl!>9N?36WNJMhDK#VeoZ78oZzpp!==zF+5jqdIwM#OML)&o=~ht3qIBAhXU zx~_|DgiH4!roI_t^L#<1lC;%};Mtk^ou03=ck!3Po~m_^9*J;?DMC@E1T#TVy3%6Bbf$O;H+?{sD&8y8Yrx5fpe`1X>XT z{`T=-L{j__Br`h~AaNGu0BF4NPc&RE=;&n(qS)?RqYt1nnnPg?81_aO7L^1L8r0!J zxP7#O8>ot=$HQjrGTsjY8mqh&#fKM+EPqLhC@~W+2fUyO zE4P})f*g2M%&UsZ5=)boI~+0R;je%F;AN!PzQbXxO7_Y21uW@TH}-yTo^0~slOw;7 zMfyuevVrPvg=cZ{^#Fbutb_vNOfccgMBE44NlD1+&Qvw7?(BiBbR^_5*@7IPEwFDm)g!4i$)qYQJnG~O zyO&q;9VucU8YSXolj@Q!a|0>z&#-@nz8quF-4Ng##d)xS#g0iARo>CMdFA)l&P4mS zUN_G@B4&57H~-^u@9xD<^5u03n|lA1m3(FX&hJ^T=k$)@tpnYDrF#phb}e|+3yeTM zymN-wLW<9c1PFjqf}YCB>95FVfk)^ep#K`9SA@;G0waU(>hZiOjCAD0AiT>+>#a*` zTWLoqDgmfF+heZ~DGqR%7v_}|wo<4b;7S-4S*{~VAdB#YEXxu+ge z#)K6_69y0)fiib>qvIxs2HYRgv_!$SLvNXCG~f;)w*@0cJm^B?FFd{|#& z=Q*Mt@zg}#e6EOcq~iUnu0v*pvFx;Af_whpfr!lvfPSM>Aa`cETDBOUI)Lt^acyrqP&?~Yn z0jaIdt+vswdXHV~wlCj^qO$A1)Yx3!S52iYxA*2qaZZ8#W)V>ijj0Vpgu8~=2;ts- znOhTOoTi8p3kvA{T`6q7=-&IO&$Jgl-E`0xnb7zcAHd$h#g1eriQt+5feZxWN#1}b zDIoI=#4y|YpCb(Z~g_hF|IxfG!*lwhN*nPC>jb>?S*EBuSXIzMqMl=`>s?^#8( zdJL5lk(!f5a*}MvkgSv7|8)sH7xc?hw2ncc)d|z47-7`CrqTOzL8U%Jpg|jjb?t)j zZ=z0U@0H(`vhJAajI3orv%Tz%xDP?SVBa|t)nWSkSxW_FM*bhE`-tD{q*_uf+>C)4 zOe|*B`6i2eI0uNfD6#@I?5HLr8?zS0m;Fp+nKQuV>_vNR3r5C&j%=?*z~@WMg;X7Z z*{ohLe?lp}1m?a3klXdy1#vF~!;Yr;k>4b>{|iBcs9NU|n>>LuzM?&~>nV5EZTNoDPHl^*tJK}mfuhE154`{Y&fqG{DQ-0=9O?Hsr6>(4DwD*l)auz zUh8xhrkX=zA%2EwK&HAk<0 zTz>J7!RI?g{-wJ0%I4a8{XC?hMiBQvKrsslo^}9JHkZ6wf=?Jp#UND+umtLH!sS5= zZ&jcnn@I%c-_3{zDP>+#0~JH0+B(4l=n0+-H?#YXG2LhUM8f`x9;r1u+Sw$*!r;-} zH*3Opp!_uq&P7|+i;to31mH1~#xdAV6f=c8rr;;quzy5)PlI_pp$}G3md)0-B8q;fHKQ;2NJ0#eOL?e=x9>06gLXW+p7znS^TtQJQ+7e~Cy#DVW!fxF3 z-@*GuTC%^Ox9Fe3RW-lsyviEDc@(Kqp<6UlkIyv}v~^^~Qm4gHPo31(uPaBDl$ofR#p3D!NEQ_Feh?J# zvbRVL{xaq`N@@R{n#QdAa3jznK}D>i=yTnD_2tek`JemxnpWvN*FWw5*V1V@*LR(+ zXc1CWjM-ymNH_o;6GDq{ge8Q`h_%Uhv8dzt%MH zOHQo)k0%QX+t|r^CW%*1D%w3MH)pPk#d19F`p6uS#^LS`EBgTQS5M4hKB;tB)~wNG zHn=igxqi9Q6W<`k6WCeBZ|&^`;Nu}#=XsAf%PV9c%oc7{v8Ra+l=Y{{2qGGp4Hc&Tx|D){R&B@7v zzY?bW#OD{HXJ$o%Y-?64Q&q!%N8nGOt@`@GzOd`w_DRCRwGB%Ly_7!V&)a;!d*IoG z;~5zl2~2<1z>|(5JD7U;foHz{?a`7ynHK!7pC9;p7U!SNY~Xd2vx}^KIYhg#6=u(! zn^iuC^=SCN|NU=fRc7UvB--3e=AHIypRM=)OymE-I<)YCVBKC%*3fnTZBCb^X2C6t zO=IK|By#gUzc1k6aDvCm+R0B}2}f;z5X9QRJa_7*L&CsPUr-TUee=gU-H8 z1K!)sT)j|8aIfABtG)qR+ zZyE&N#%s&?`m}uhc7IzW%eV8hN|zq{defw*{Kw7C99QsT?>7sEo4;Yh1~0*G;J@+I z@qQV@Gi7h=8p_@aR_4(0suI)>4m{Yag!=E=z_UYs`+qM!hen<_al*=;lvewgsK|kD zOITm{bFV-Z4w4YI{_-6?Kl;}vYiQhT*w*^Yra_8dGX2N~tjcE7#*Z0u*j}ywKp+15 zn>^jDMk~cYXwW7{!SE|698*)%7dJPF>P71C>;-f1U`zkfP;Ao7xgRy-a}Jal^4boR zqQv?gUCY0pnAL3HPAC#BUiGVDgB0H=J+cuK6Dwox{Y8%xCw}o_xZY0P#CDGko6}ux z$deGIsNBYWA?m-Lp}!nzoYntrLtp9tOYYdWYQFzP=9jm^{i<`w3kmZK2kai2Uax&C zb=bU%1UK+zb7H^tgaO>rzlDYzbl{I!oI&cA|1?{F(&Wi=)kcjObGC4wt-T!Y>4YPE ztE4n@(uKQ=KN?rL*^b^5$*dJ`pDRWE(!UPYn?J{@@Rk=JKUIUz?m=On-*upZ63drs zflA%Vo^XBUG0XQtjD4!Jx_*Vk%-|3;;0|9s#2kHb1; z_U$cWJ3oGMX;t~qW3m;zzLFBh5mz=19EkVZp{~K|+IiN$0o zSdTOn$_xeHR+e|w_j19XpE(7`d@pIfjQ*0(b`t5f{0h9$6?$cIQ{xdmOa7HZYTiYKP!*NJX=CviU4FW35hxfnC zI^-P;pND;sapL%vZQ#|{m)8yQoDLm7;o)%#UlF9}I#EdI4da9~Ow|eZmlhN=^ndix z@ct#nbN0eKH{|HCV@b(~{MpIdv+8brwY2=tKAP~AWF5+fGs^$ko%gnv^VMPhS3x8E zICDU%dCyx;`Nr`Pe85qC(B>07IrRU3@ONHc{t5RiFi?1qD`gVcv^GIL^5aby`35Q8 zs?ORrAjxu}P92X=7pTBrE#` z{3{lRFZ8ur&SEPpN*f4toWJ|^KX~b<{=otytRFsNL=xPtL)rW8*j_g5MLr;@N9vLPWR_8WBQ5{-HPn!sL#%>lo9osf_av$k)yaC}AW2Xx|F$8T;r zj&rCbLMOawF`PT$5$rOutw)a@o%+yaJigsN*TGfbI6KcF?vBy+WPJ9EA~EDK6t zMM)KN)KkAAZ@U7wZ^izi4NSby-`=ORtnEp$S4s;UnoXCA+WKWD@nrwDOBmkxug<{l zrMgD=+c83$pwV2@m$oJbcyA@o?X|-x!@-=lagfV9%hwYU0cAI?fUXzr#HjHDp`(4W zd7taXXY2BBIVFn4r!HYVnv+sf`WqbId5iWI39EMKF;auIZ;k4 zOFrt$Y+*sj${d(}wC4;ssjrQcp3Y$>=K-LdG;?ND6PFW?p?5gb_W4himF?fEsppbr3`^PV0`v(8^UX>araue$hhB%)Nbu>Nht9*$K83|N9zPgACT& zUrXZ;${zC-k-LhSf^f^qj;zc-^uGxE4yY=xZEKA68by;>s49w4P*J*ofF%~H3Ia+M z5%2&4B1O6tk_f1X^dbU>UKEfHDiI4(T%{b$SUU3WJ)I3YWGH!B0GVs75{W+VKTosU*zZ$A-t`}>}_EK`De zZoS)a+gx5APxjL*^A~%yU%$TK|M}c^|3rE=Hk&4xo};?E&pm(sya(^>b%cBoEP7Fx zb}FUk_QHpE3U|JoeRxvL?dv63T)sBgdP9fym_xwjJ(oW(n|Odbk-3T;rmeok?1|kM zKYBfQ@PKG7G!hytUAj~a`HR>8=FOWdm>-xhgB%KzwzF|)khJ~q@+YG&a1CH>a<+?$ z*VwY_=Gm9EZ07s1aAsU*hhFXpv|=3h<`VyRg8TRT-}le^zr4q2sI>rDzY>>x@O&%_ zkvxjq4=Z8U7}#Y6z};BjoW&oH>(I>VQo`~aI{kP5$d}Pzfih@<1KZ&y&h6P{zkJ(J z8xpZMGVS^_A&nlv-Kb(^I%%h`ph^OgP+_4@EIzexN)b9^B`zjs!rPPUEGc65>D@k~ zFX)Z<_9giEo{E)ASvz#M#40IQRVg%P$x04DkOE^Z30vg!do5wXW>W z`B~hs!p^dg&`B9wJLno}n!Q#p$L2Z5Bs=RbS@s~}#$IR!rQ1;UFx*~UXvfL*ekMh9Vur%X_eW>Gn;tB`PYl~L| zmkjx(vEcI8#p|iY9i2gask}e^6uES@VBG#2OR-C8c#Dp%-Kqa(;J|ka!R;+4i2nK; zK{dZF{tqC2(qj2+>K9Z5*zFDbScz`s;vGBI+|0G@d4N^z z!TqCJCrDX5Wf#5dP|px4G3myDHsf?&OF?T-JLaezr*K3Z?ypH zOIi5cESkAhgRiLTS_WSMM{$AEnD4Dyw|@BHhru}4M?-4S$_TJN;Bw*6sT)oA9-qmn;sbtH5XvSaA9qn7N$)4`-ac5J`jqY{4jg zQ7-VQUJ83s@(cXE=nVaJhe4t4^!UKVoY2_VSl9w$Zr@&sF}OxfxY|#&Wfo0Q-i9G% z%m}wBg&RMvtwm+-=jRuVP1XmWfD^2^2zxmD8jsGt;%Uh8iVV}swS9}#I|2VzNb5)Z zJP&jA4sEf+y$h=@gtzNY;MQ6~vyQ(tJwCshmv@H(e31Syg2q7YEpo#3IZN*RaCsRb z%Bt@*-M1Qt=K~+!z6NaCy5&}Qw+OzQ3=G<~pC7`KE2^qWlx#T~o&<}qj9x8^rS3f5 ze;lq@%LIG4?KUNeAf+IlR-u_bJ=2@cv{<-$#dGTknDyk9J8;9Bg98TPthkjiCs^b> zVX0T(q_J@6s+XB{ZZJtGci^J=YTSBmHCg|mT5dBx|L*E8#Un?4FS)fog4^?N9x=Q+ z*@l~VAtER>bG-i-2=Zh{y<>kU!v!nh1g5gZc%Gx;rAyf!%Q$^|L=cZOkVrIA^<|@k ztu^GjW6z#F z88)4YDq+$Z?d|Qrx%DT*yrlJPG&cde$ZT@`xrn=8_&q z!}rAFhWHPS=0FB&a76h1suIi}QuZr09Io0^efsoiPT^4`mA8}?VH)Vh@sqZGce#i2 zg?BWQ`LXfBcWZC9*8juEb+~8$+xB}oFF5hO(#_`&B+fU+85Vm`_-MDsjke5}FOP)n zaa4n`Fc!YkctD4+-4`}CiErMrrK^5+hkpJ^m>YN9u(E^pshxIupT9xrix-DsS%2{L>(>)#RbIGY0Ywhg02O8B zYJjf?z+`c_s9f;)gX@X`Lg%%azy0wum++bEIE%69dOVH~R>w8M>6vq!#X@kQJ2&~* z>D#qGTS&kqwP@D&`I$Qb0RgbXM4|npq9sPb#$}D)@Sclnr+owgvBMG#11QAcb81rb zWM*(ca;@913TmZ<_D$PjD*+zAsgA7jK9O)j0hfwh4R`7ln4FqQzyZ#&Z~i;$efyiW z)qfQk&6&ujVX70Oqt(!@PedQNv)#)4$>n+42>U8^?|XXU(a?z2l5n*nM~?UmMBy26 zeP|-0wJX|kr0x3y@v^?zV#{`G-|Ces-#vE45~%rK6~Y%yKt}F`F<{f~_5Zz+|6L1O*NuGobUPv<0>D9;b@%Sw z)m&V_5r^V&kE>*JIr3;auPx`wl^Z}8A%}M3)9wZYX!+MF9XV17!_unNt7HE9>o*** z(z-e=L>V>QKUZ^q-~4+5>LrE+0E`J(n=F?%p*L2VY`*-Ym4G)Kh`kZ+v$S*b^Yc&K z-+M(TW%-=xcT9WC!XoMCpMU08kdu?cZ}gjmN45{WD(Y_^9Bk2JDutTPb(zS2c6@~s zn1SG)te2;W^quK@_b#vhAAkN?<-;qJaiQZ-R!xv_b_Z;WwmLi5M*LxG@40h$-P@OU zHl=5_0=Q*5jhPj|l-}Evl^X8&k<(!a*mNQZ=~A!IMxg;#&K-~6W z=7HVG30zV5wza_7dlJca4uu5$g52KPvG4tWLLKOwqQj;~dm!?J;XcRp4 z$^4V7UN5;Y2IUm}1TUTwLGm3d!nG9EEdV0R_%)ZVvjK;GH2ns5yHA*#QUog72(?B0vKq9<2e|D-*lK0Y& z@8)2~QQCCa=L9CQh~ZN0rggu6=VQO^+b3Z@MWO#h|3(Z5SoQPI8$-%Wf(so#o8Uku zpyKGQjJ!r2F+9#?adB}WOJkLkl~3RfQNO^zbHVG@uTTB*<W-8&_S0P^54K_=YSO`qv5MwqtSCGM zS$1^4jRM@dyJn}p#nPo0Hp_mg(G!_12Mf0$i&7rJHr{7KK-#I7FS8A_6&YZ+N!~cy zfTfGV736VXD$f1&`%eqbgG~&<{3JE{6XM3NSMAWvt`xJvZ^LrmOVCP9p_qn&P-=i~ z{0ew#b=a`($-BED4Zb|{@QCj^r*6JY{US1jUq_UZ5llTw&o^fuM?Xsq-gKykHIu?T zhIB+B49UDvTCq7}MV>`-_CqxB%!_T3zVQA!m$=!7jJwxtaS8Gt`2_`I=nDM!a{3Y8 zFgApWubAtUEw8N83AANLu#C~vSA)=xSY=)ntstnEn;~q4Diaw!qF7oYM1?*CmaBNI zXCeTVkU2%-j7!631^^ej%EQzrM>=aDWXr-{r5Ye_+kM+(Ik$bWtJketbyOXLb=k(x z|C^fji=VOWs&L-)Qr7bFCe!=^k0yE7sSJ>%yw3z&U0gD(+xOoS)Oc-M!NbGTZ=(ad zncknL6@y9yw`w+~o8BU>C|uS#0YE`D>mpJ< z$PTLAG4|muK_IM|xK(R&PkL}jLo7`C=ddS6hKG+60Cc_zw(i_mZ%vj<=)A8HXaZAG zoStFSCIz8w7s}4}^6%S`yR6fhhmdLKu=d}yv_sWr7RBDU8cvTfhFo`)w1Q1|4)KUZCF%EzvchPr{W zL$RwOLJOdb;-#abW4z<%k4|VUe5BV=;1(W(xg7UeT_^NBFCS1C867=Q?8oX4nsCZ{k<-#ZHTgi`zO- z|L_2!nDrF5CVp5YNaVRO8zwxzGYcJo_Yrdik#q>w;DmTr76NMapm?o4yxui>(Q+=1Q~?FB z5!E49h4HS_<5I4&K>A3>3CL`XX@=MMd*HTI2W;o@S2=RTx_jjVj50B+Pm6^4daWx; zl9DkcZ1GIMY97a(RQuyGxH>>VUU1x*4W=vee3PbcHPG;;b0Pu)3e-{RuTKrMOP4IM zzGQ&=&EoHDIxM|h$?Kb}W*0aMtQve({je8DBrzI@$+c*7%W$2xryzsvC^le#p$;{m zVUp40#L`CUz_6VMbUm(6z#q46X`#0?OkYP)4SyGR963v5O^Hak&lUdjZH0P3rD7`P zH3|3NZeNJRux;bUXMy1@rfexm`UQ>k<@fhpt1fVMP^dx_tVuUL$`TDg;Y+*;`@~e1 z%^-4U>J+MQa0vUT*lW)zBap=@YH|)?jy==a*|`tAS}htc{X3@pEMMN{Te@OJ0KfW4 z!OJ0cLqn4g7xkZ)BPqsdr5OHVl2>w}qr_NhRMi*3 z;{BL5|Mp2lMPdHe__)lWON&|L=e5^~<+R0*jhBQb=8)>P?aJjIs zFr8jZ+zB1%xVsuZS6AZAy;%X?h+LGh{?CNKx+NpjZQHu_2%h>laI(sD9fU7x2W3q> zK)L}Ce~9AWz1Ug?l`7o%=fEBPiFL!d0T%*RN9o@7Q&pW#TB-U}4m`3`Mjt~I+F7yk<_X_0z)_Qq4QrhaS7MHTSA>u&QM5RqlaYe>O8z89$$ zy(KplS1gh>5|j$!4wZ5=rn8tZTEHAIkVI)qqh{(8dt!mlMbghKwO*SAhY(z7Nn zu^h1C7|=)^ZVrye?nC8E_zJ@_B*Jfcb4!-5vSmCxS)IX9=asVg4N3Gaur4wrET9Si zaJ~ohsEEc6Q#QP^>5$hk;3KbL@N`^Z8-F`|m{>3NIvL4LV6i!nzU-M{>+r9+i^ns| z!)2R#My@Sdt_F}$lWHK};g*LkwZ>e#M7#=1o?Ejs(>S&oLIx8+bpg=*6&3$X(am{) z?v|4hA!VyH0{20+~R@_WcDE*E>$8?FB>- zWw!L@f8+HVxCEIn9YL1-^a*KEI3I(@cc*0l&g z#)s$PhMm)>6I41t1A}^dc@@b>6SEpM@UkB@KW!}dh_g})7!*mID~9L1)ZB9XpOVyi zQ%2#xVFug80+e0iNR4>TT+qY`AWQ`%Bx((Fz(iqNE1(9d!%fy7y1Go?q+3~7q#n7m zkvR;?`v8?!DFgU(RnSG0Sp-4Rw{@8Q0C=v{HupI_geVQX8G)p9JYHj-Ln@uS0_O>{ zH-W;;;FydNb5Iq)8K>^*gHka#WpGo-JY9|DAUt8b>?-(!(A*tz_*O zVWX0>Qhq`*r~}V)6=66gXaR@8P)sNi64>#{7OT0Gon7K1LWeZ#zLGN~ZvLEQ`T3A2 z{C66pL>}-A=KAsiii3oN=Ebh^8uXoxp{sOv%Pim^4_9;+QWofMO+bFa&je`^Z))EJ ziF(%^!SW!scwMvry6$DgRxF=*fzkp=F&MK*{JE?@-uv8-^H(O;Ez%+Eh;b3{rWj7C zX4h1>{PFW<~7G#Ht;zo2Bh~{m|4esxDjpOhETxg9V*d4F zJ{!u&sO+Va%~1zPqfjJ_LRAqSNY(t|$?ZbdB+`4aSEwRHsq0*9{KA_%7FD_iPTX5h1gk`%# zE?yWr&+hvWTKZ62l}L@ED>(tI(8$e# zX-NVsR6mc5P=f(_+kv8}Owwr|%$B@<TzuBJlk@kpg(h1K3iGuy&b8Z0;k|$;;O>~eXxT20Uw-)oEKrou z3!k9<>rmGwp#L{edL-LzCRf_F`*hl$~ui&*N+2;s0`^)(T<#>UjH8Gn-Cw% z2}oZH%91h*9p&e^+%fWr;0ZA+1ln;t5uOEh>=oHkU*|OZ{vdJDW>wLDly>Q?cl#1a z86Q163a=Y3PJ9{eD6z{gGf@Zqslpp`a{C$z0-UkLxA5lWVsj|K{L?x>=k`D z3aOx{H4#)#SX)~&d2=W3>-;F2{L;~axh|mB^Pn2pu;sVX~-xT!V&4w zRBD5n36{1?fQ+~~Mttua*na*P@so&=lC|iO_eGQ%P@cbpg%g(t?Fsrc%nzE!UOeURl`KQi_l#tsk_DKUA*i3k!@Nj=lbg(3e}x& z&CfyNOC-$9DxB)wh6<+#Em`6_rV&Hp5j5GagpNbzEu8$w9bgy$`Crl-vuR3+f$EWU z!eG!bAjt$|Qi5(MMYaM`{jhN95nqh*GrBGi{ds&`6G`<1Q<)Q>N^P@}{|P|Z%`rFD zWP(dTjCN(tOL6SkgDFhDrH-i6v=G-+4A*1Pj$?)JLn50NjA_b$PPrr_$wL}iL}MGJ$rNy-ds}yXc9CqA%too zSv%8aNwdpjXMjesws^>*9LBLU zcGN>C0&D$b)cGN}3s+2n03Ci`cn9QY(1bB`+_Y0@ch$^?2DT>0SMY9wo| zGiM%9xrd_c^@|r=SuiCQqAeGK&NMYLS5Zk7u$f#I}kvZ*N zGc&zN?H@WijF!5MPE2UQm{~jyO)CSG9xDS2h`_`>p+XOYl{u^Z5&E}T!=so|C*2#i zt;?oAF)^F$S*Hy=1j4eCP8fiPO?0~C`ST$EF%;g|E8fFYTZTEbz6E2*uYdr;0%MVh z&qtm1ETa`iP$P2xLeILPwxXipCSFd?c%;9;+ET@r7$_MlW>m7w=qsApt-pAy4!IP! zVxCI^j$~l@dH-Y}RQ4!Ak7Le(mjRfLv99428pP0rys6N^9_@u0bRvi)9!gR>cv%$MI2* z3j%AfNk#ZTWse&0p9edypum7Gn*1cLYFL>>h!Alp>;m2|cAD6~j)qN_-|$M?z7z|; z*VU6_h~Prxeo>M0)f43r@~N1OzN@ru^I&5vu>+eocm8qu1u|(OV5m^ndVpt&i_mQ- zgaYpx;G^E<&~?q$KbrK1K?u!I)%e?~?R-<`J6V+N{J~pj@!#O>orL3-ms^T2F+e3f zQAN5DGkmsy2pz)RAkTRHId@y%M@$Ipu^;J@oKxt;PH9L$hU8@qL&%d7TX(dpy*(0% zaoexI9wMR#Axqi&4^a=?hbHza@~JCS^$hnpHVwgB!n`pP8Z@6 z)t6icui$(%>hP^vSe3-A-|c1PqlTtF7>=W;OcAq0U{MK})gOeQgOJ4n2qo*0~zFG!@ez7zjY@`vMR!G;M7&7Ohy9ggq1okVrGlc^{ju zZ|zprm#RSgQsG-QuJ1agLHYH7$Fk!%5e(v^#O-=d7=6{0`wYIpF1Pt_TA7SVB~BHx z6QPGt;exOMt;$gvzWc&{n4u&~^cL=gkcZK0g=*){#i3r^v_4`kF9nE>C_7;{4BC)N zvU+$jTceD-biYsDAMru2nw>piv1R1iQYG?xxMZ{%VFuH-#)% z9j)*S(Ay~-J^NE#s4r5;;{t|79jB%m1lw|;B5+YuAq5Z2_;`D3fQus~FVm_`AEH#v zL!%eXBkQ0$n}PfxFuHtMiA>EvDVbH`Cyk7ByZS#7QT`>&Qd z;>!>hg|?R{Jg`0*n8Qo&m)aIVFnQct0ECAv91BKF5ReioOEt!$KETN$nSy;{PY(*s zZ-V%G*U>u|gX3s7)Y{T%rz)+*_dZ(^hU37&8id*ILEqblsfU7KIqHq&0b`#&9h;k- zQJHW{84SW#b~E|{9qmG35ehdAD7g4|@n^es>SmvQQ=z)M1&oi$GQ>6mHSOK{xd4w+ z3r?VJE;qiPHd1uo2S!Uah2Qp_aAo@lw4hvJ5GosyzLtk4lo5E^zM(B3H`hlB96NT` z`C$Ln$ui(5UjHoUkMFK5R%XHUWJO?*#9Gqd7(pN|$ixNrhOCk!#^k2k${C-XZtAxR2n;# zjq?U#0O&7S8AmydmlaiPMXD|=EaVb3QTEAS|D<3LRr)S((+MkuEG60(0K%R{0Utb2 z)RWLhq%6;DiS?GjyRM#xCm!{$%L4ZRBiCP%o6vSxh4PrA!eJmnC7NUrX!pse0lOPB z&84Oqvo1DSiiLEwqr7TIo*7O(ZstZdLuK>z0u5!%P~?=G;Bxa&vt z)zDJq8{OOaXY>17wq|x5Ln@!EbM4H_0)>ksho>;+Hxa)f5!{GsT@lKC#-6;neR4)= z6;L1iW5!5MksYl(z}z(t=L*QI4^*Wl5=Y^e_dl|vv0n<2-p*d<*Thz#VgM3%m`8WA zL6JW8Gu8EsDKOtW{(8vaKI`RE(1Afb5s@#Tm3aIw)}E8!Qopzwej+4yAy#JvpaVvX zWbYX#`GGZt88=a2+BrIKXpbS{0!WxDhse7Z!gQXZUyy)~hCr?`C5Csk=Q7R*xK-mg zuvR6hRq&vY_6X~bCbScN1q9Wa@qs2{OIcH7Q(fo&b$C1P+M`F0!r@WH=XY_m`>h$k zYVpYUzJ)#5zf5*s>A+_@sybsnZt!-);gXm*4Gj_3JaJ_XcxdVrdh~#KB5;0q_KbBzI`PbD2?bhKoh9OkBI|Y zz_=!rBy+w|jA&$>OHF7@ot>TcdLD9%ns~*_p%^4TC`LrzX5?TanFE2b_qhXNOIpO4 zw^cT1yyU?~0o63hZ3p|%!o`adt=pfCjEqzrSRosYEI?`Kjm@X`04`?BU}q!S{wl@J z*U+spj9#!)qXnpPQRWFG2?BI1XUhfg3-lQDhnXNC7}{~?<=D}8z5U&-1$nFyPg{1pDl(+L7$M2G9I?Ii2|CYKYzZF|J$6 z1BDNuCa~__{k#?1S2^-#%Km%(L)YMyT;Vwhiz|?>I?M+kq(@Q01plzPfBvxLUxh|q zFbX53)vQXJ1jr5X&jKmZ^f>v#dJ~kJzzGD`51r@ZIl$7J%8x-2p9zo%$a0ajZ@|V%Ojl>P&ikfl1hvhxU6E^W)b}+-CWyO zd@Ds!S3tfKQMq~RmZYq~?Px4tu#dauwXFVYoQWEVA9uNvfF?sDRUQXRoHw&oHguo; zGBw539x-kgTlB)0#2*+`pLQSHEFz)?5m3y7MF13ekA?h|0uAKZXnra#l2V?kRP$tO^} z6QDLYfo~Ya8H~peNT>jRqDGb^$oQwXH*#sBav%MVK_Ol?YtJb#>1Wd$XfL5skK1=` z5p%MKmo6_*0pn&r>3-3&WT07sC&u9i8Q@~p+<$xsZ~kdqk-B_a>D}P%od$BqxA?v3kF`pw>3k?)$F?6<}x_*A8FE()(iXnVvN zFx(aWwi-IkRS~4bv6N7u2uvs$#NW%n$L4iHvfwt@?dX&REz)Bqk|tb}7zj(4n24%wxHSHsZOF%vi?8#U$ zcSI6#I1{#6*6jv-SEDcXq3&$&UX!xLG~VJ>84kA@7~-=_um0}kCAM&7%kPL02-Bp) zQS%kaO=*V3p|h=L0Z^kL5Rm0xut-ZQ!Yh5Y=Rkw!8cH1~4sE7%Om>0@_y#g3|2HM4zH_J^(5Yvn`O(Sk zW^W(d0P&vyb>*9V1P(#?6th*WjiG}$0codaSm2*BVUeO|RnyKsXR17# zl7Kq>eucZgk~sh>5fRZy`WMK^cQOT~0m05{NO43HVF_3ib6|>VemtE7)~585=AFR6 zIKaXL=ZQfw%%H-G0mPS{32TF713IlkjI9#PIAAKwnODejrB~$EV!LxkjO@{`P^r#O z&6qW2#3Of#o*-r+(-jdRXS2;ueqSAAQs8d+1VVM5LoXRP;ig@XL-ymZ)mOaTE5Z! zOZ#G3Tx`Ye{e`*$Y-ggQ`ImEw{M9*Lm#kyDln>g!^=^HL%aTc=yLZ|6M3wt$P|8bXDC@lp#MER5ECM~WQi--tv4<@`L}-_Vf;f0{9`S&qx3 z4fD!r)cbEgyt=Dbo;A1b!7%&f=1~NJw$WVVFkl*loM3|g@E>{hC1C$Hiw%Np1*;Q} zQ{sfB@gBn31%$Xw$jywZpKo|{5UXS}IR%?1P`~{beR(L#M0FXNW6w_xrI z7>A*rOm;vznpvIo-(jqn(!OxOL{w>2K+}4Q^ivQl(Hr}!3Q9*p3`&Ybcr}CqWYC($ zYTUj?$^WXPsEu6;AiE-9&FqdFx8drlV^kW$(Q^V+?emfn=>?I{x}RoCWUV-n-UY}6 zUDjA&*?NRQ@SN(u-}PJbK@9M6dvY7Jp#ltPRqZl%SvQKsB)D#$9@1YV4E#!8uq70MJe@0mn+!m=`|}f<0s6_GpEOwj zXtA1%^GyM|QO}E6PUu8 z;R?A`t1n;VEXvya+4N0VRq<_B(F&WJo}Qj$=^+&vnbvm|H+LesUD`%uo6GvY>9uakD2#q`rK2FF&m z>?R!MSU~t*R8e(cnlI@GmiEuz64r9K$i#WxTX)Po{m;xf>&0A> zmZ2~{MWc5y0lFMAmHOjad89waSMZub0cG{wQy{TyPErdIbYFkJ+TD{+uFO}>3Tf!e zR)Y)ct_8V`&zsiEIQSw~YhWGarLFAv&YPY5a;0>EYN8@u*0; zF~{6aI|5goc&u2Tf_6BuCO+?mc1Y`7q%?&JP2h~noPQTKTpuBIv7~2e{OO%>k-`;t z88%Bq_Q1zbx@Z+%6xBn;?o;la_q2F^I1wi9RrZGR$TFDnVhux3HJmti?i{m;Q_3bf zUie5!hka^Ty!JoKx&pHYAII9W`YqLWjCc}n#{RRPG9XMZS8<(zuY}jDv zRC0fj)|hD~(R|Ie<)&YGnm!K?zr}mV1PJk7FWTBwoY311LZ#nkXft4ci>gz@lO z#&F-o?ge`2QZqnK5mgC+6X)vHs~^zofHpcJsFrhyRl>MRMfBwKG)!4D}w_4yIYFOGX51Q5Uz7mo#k*#>lhs12)o!8pBXoJ3CJh8!t@%S9h1#?R^ zM?+&9(q=4c1>|!GUoEz2hrwhX*x>Q}%v^+l=U?P}wgsCyqn z{*~c*EQ)Wm9x7G5FJ}$Nx`%wR0g+dOIMJCv(-<{2&;E^Q!Lf2$#6pDxrdrYWc$BN@0t1)fgOA-K zEbrmmqP67X$`R8FbQX{)8b`~kkMyi>!dYi4q{2-cA}vp^EmkS2L-WR=Ek8qK5WTu7 zy%+rgcllRuJ@!PbrD5#gA?R3Nzjzj2oS1YZuTzUwjqoE*Ixw@ zz5$2;%JaTY#ye|0o>T)nNQ<$;R1td%Yz-GTr@hrj?hrfk*AlX112Wd4h`PwXKrHXy zeLTu!|3Y<(LgZrcWhRmk`6nqQp%p9={&Mz`>BL;- zcRrKtW!`^{DR78^;2l^ZW7~ZnES@<|7Im8O`X5zMslg^?Qs{x)A}XHmU&UpXGXif> zPzez7K$1_*uGX5PZ{U3Aa_?vlh6% zi6qQKKWRok>Xgk=i}peU?IX|!(u6cTr1oAk8CRne9iw0mC07H75+>ZfN5}0{U)4Wx zgDk*g3x!yD!_zYnZ4Ij20wg3}Rn%L!cC7ntG2bU4#9q=+RY-Ivh9rmyF(Lshtv0T# z#(uU%Cn)*vQR7vjlKHSQ<9%0GEI{(^&@EX%M`xXTyHVZfH+&^XLOoESMRpLxfE5@1 zkAnx}0j`-&BUO$c`|}Pc{&@4zil6UP$u&`7$Y{j&wVV{STEA;!%t9aIHLWD}feTb3 zx?cstT{IM$A+b;`#pyk85WI-w`vg5#xua+KRanZ5g5}`NS3ltIMQ0fz00U|_vj;+n zsJD!H{|D%8&~M0y3Kf^#`x%`zIR^)mKJKRxqJfn`!? z{?38<@2ThJs^PqM_LFF5QtrSRN#rMSGycyu;po9u z2uCAoUR@yrG%>)7sSVR=I*>YA7N>9WUH~6jWoU|Azu*G?k3e10;VjCedsoqw4_m z_9T!AIY{x*kzm(lmU|P8Ryy^!>gBnMfi;5}gcLhc513bi#vvBmESw&C~BCQm@ zva)fjcL-6+bzQBkt>{CuU6S^OBVQY4OQUQQiL_063XdrMcq9y;4?>)D&;jQi%{ut! zJf*$sGysPPVv!yUdJrg$AFvZOOey9U(otUXfOxi{ z`y`I+#wFRVac4kr@fJ$z!G{GXd@p*gZ|{BN7P8l{I-!jvpwJNH=l@Hr;Plh0C9dzt z2_-Nfr6i5-i6qjtD-?4HsCSixfMgS$eg%QX9BYa%?=_r9UQ1{t9XSVZx=x_BBPT2D zE_cvwTwGuccda;Lp)0PxVt-MKzzu=94qh>3-Wzc4P-;bFB)|i%2G6+-8^a976J}Z^ zf#$mTMD;VKgY=>rD7^Bd$W*nZgE{Xd75>uWDyVm!Y^g*a!HO#+lMILRAJmhAyEMwh zW^g4#HLRFc{dxRGx{5NM;8}Ver3cyqng4n7raI0%%XIOn8i4mG9~^`pY+C!A{-W8j zogJJPPwh+|-V9=pcSOuk_)U-Kc8FUx-pN7HzKQU{Czh$ESSw_OH{bA-Z;7{K&~DzW;uk z^N=i`UHwUjEpL1 zx6@Hgn{&lHjmq=x1-2M#eXZ1yq#C$K-LkZ{G>&R1=1ZL1`H zTD!JurS*r`@a6l#?&bOU1KKDWq$OY-T+%@vc4T-WC;?PZ5>6SYR2O+=lMB=XH-f#DV~hVz!^ff4OR&zo>bMTGp$#2P{P zl&RQ+xkFNXFXdXOb`%#-^C^N|5*;AoWi>|ZtxOWebPnpE(%09gUT@Zr2R;mKvL@(Q zCt>_dwOM)tsrg7}W$g}p9j5K*#=STNhlx~~oJ9$~vN2mn*~>57&0sFJCu_k-7#nGW z9b5^uQrANryS5m{$6Kh>GR$fO6&Qv$9zJ}CMp@V_Z?ncIM0bqAvK&XO0CqviLzp1Q z#p%^n6gmQ2A`^y|rC))i6&O#w$r-A=c_0X$m26mk}Mx6vWy)qV(f`YFN@xoce z?t8M$+G1%bzM~f=65~^2`;Pvj=&7{plxJABXd^i~p%0Dsst>>d2|`qx!+Bf_XyQ`5 zVFczdbI>hJ2I_SukfIuBx&am64blXu=}xhgJ{)384s9l;KapD z7lUOSQdo}EtQVbO9!^#~>bitVt&xA}0@+=HEbGiNr3>6>Jdc;*^u%Xa$t!UykNA(L@4fN^6{IMFQ^<2n{(o5bt-j=O{QUC+JRo`S1+_EckRCTfzd|{02IMB~ zG#ZD(=EQ^F{zVTHv}ijfiJSr{SqIvbPhcSE8H#3xt`0g7j|0C}U!FIgh$B+@(J}iL z0DCpK1!Qn@9DtJXMeIE1mWIFaq2WJ(7}T+eh6~H=uaGdsQN59ZDrG+?0hc1$VpI=k zQCFk->Er^WXRc!W+KM}_HYVt)SCv^sk%^c&?1i@KhcCi51B?=54z!+tsxDyPV@c9M zh-)MnSGi)=#l@u>&2~}hQK5bqqJ+kKPalga8ft?%oamG10+eH2eg!gE@Yi3zMc!lg zFGFkl2?|=T{M_U%xK;dHyZ8nty?A z(89u2^dsBg5lnYsmaB>OrS058Arz-s3%C*1xdc2_?)0&2@0qrjVRre3ZS#y&<+BRH znhL`PYd^n`>mRXq_&tR6UsISal+HQ+ozq4{{%h`!9)`;3Q@A}~5iibbyEnOFvgTnzSu>(bi^w5g)>?FK`>{2|y6LTuZzSGFryADKt#J=_(C4 z3YMB&X~H|e{+33vgH^17JMr{&pR>!_aM25?hh|g#vP7na_R%J1s87Nk4Km%`5Al>W5GI8i!X)fDZuhK+XF{3cYOph>*^jC zU3APemhW5%+b`I-@E^bP@aFyuZG!ACh5^2|@1D%VfJW5nZHA8c2~Zi*)fg3V1g8M1 zCJJ+&<$21AiZ)KJT43osCnBj&7G;RsRQD#MMj-D|EQ~oCKA6UEId_UJ7$8+4+d7h^ zO}&Mv8}pLJFfig6UL&#Q_!hfoT*DECacMOb_S7%w1Q@PoIRrez0x^&QYq5Iw;at3! z1Vn7&Cdj}>0pyAVwOB~cz+%g87(5Ol5&OGiR|`zbknS{SIF2`WSDH644e78{3J`z? zWQg@nocGT1c-%2QvV9PJgg`ik+rE0h!IX~be>ij{q;7NPMd2Z!bKAg=g3-dFJ$#-$ zi?u})y0BzHg@u9TL0C|D zrPHjR15((|_^NjedjIeu?BURttsUvUMABfRjRF^K#hgt9E}F~$hOc=xlwGP1Rg&1? zFUSZCr$Ya?KoT`M7ftW&(9y(1nacSq_G}Osu;PVB)FyWj^}#C4d>~+nwoswsshEs+ zWgrSrZn#x}>0h;S<$Zz?%j5l`QSVfZ_BY*ww3+~BjO4;_*YQ&djIe=a(EhN7cDbrx zwZL!WZeM7N)?h7kdN^E~rCUnD0hC5wOGZ}DX|Bz_&@qbNkQ*8S85HCWIl`rWUS~Ep zeNWg=6q+hn?>elFM!ec)6!2x8RzrA*nnKrUWdrK}fEB(&W#LBp4JZ=TFp~%~B$CK) zMtq3-VoQ?xv%;^(ZCL~gEI(cS;q*fE%!ruw}ud1qO|`p+!^ z)>>qZ!Z)I>o3?8A2N=0Vr6}U`qg8J2hlZ@U)}s?r->GLaI3K9g1ES}%5CKarIUP9W zEXmqE41!9$=HEe9XimEm&tEY4F@#*t@eeOt`C;KG&Q~|gED}4MA@141JOUtP5H3@} zPy95VO~aq7lMu~%mrqxsLnq%zqW`_gP>%o(V!9Zr_JCAskf31;3uJN|$sVuL#3gMT z_tV*64b*Qm>h3^gjNh7G z=BP)60epM-p}#PlPb7l;Vktiig>pv z{$7IOJaxMye+y>8Grm$QJ7f&v#M3N*E<+`JmM>YdOYbP$Jn~Xb767ClZF5~KuNQdj z`?Y6Z(753n!l~cn)fv3>f8hlVXDCy*Rw1w zE_c^w_f1fw#;6@~FiJr^u-^a(dE|F%WVQlSa+KN)otA z=h<%o)&(zj`;DcoWj^a<%@7d9@&i`ELx*&D%E|3sIkpVKVj)VNcaL*h><0BQQ!rZs zzKP!RD~8-KpMVw^l3fqt8-Mr6x{Gk}pu@kI!=ZLxKmo##8eBqPt!SQ;S5F&yADMhX zzN^-*jg@S3Ve#!UP|P!(2DT(bgEvEzE;Y{}EyTWiciMBhZB*N|BK*9U4qgDdU#4(W z>@X6ErsskY-8HxzvxU5UexNm`eJgZLC?>->7~iQEsQQ&{5tRm%8ySZWgW0J01|gNK z$0WV*%R;US!J7{MVItxeO%xGfZrQS>4^&S@V~ETA@ri0QiHH>#z|y(wHW}i zy?*FQ-Ro4{YNY5kjD9ViZDln$UdrpocY`~Hy0$XmiT~D5u1c=eSQNOe{@O0CuEe|} zf{>FwSlGye=J657_;pdi-0bue9wHGP1iCVsY&Hfk`|sbsU%76jqzyI1!H=SW2&BS0 z)aij?eXqm@`?WvVr@5~SZkl$9eK>UaZ9`jW%W8W^q!^w#`6b}GglE=AhS+6=%lFi= zl@F?8iyw6e2-uA6iQ>b?f%7t^DHn}-e~*mKoBu=C|8EyNyi})R0HxPal+xO08o~e~ zN;Co+HtYpvgNs#c7NU(H{wFFP>c=IU0j=zz`gh(mSxl+a6(^fn@&p&B|4w?OcFCz@ zZ@jNxzs@mtYEQw_C}eD05g)-=X-IY?c(63$jy*Nh$FLY`KrzY#zvzpff!WbS+Y&F3 zYq#}j|M}Nxup8tW1_*3v2cfQ_wYXAr47!FnNE|rLM45HyzatVJnT_UK)6^T^Xlm`i zmQ}}x!VEbiw(30%rUU~yM)`j0)|ZBbATV>T#%oi0n(nJB=zJ{cNhu{ z29Pi5M*iDRy|3K*8MiM62uTW&i zLWWKNTxOrv1E;jdF`QaGQCU-;1`Tsm)`%YLmVB+ zAFbJA*T>>jF|bbworTq&$B?J1hKMm=@$uYgoZF+W2=iaFef0bF+Y;XcM$Sg_k5n1#@ zjOY2UNZTc1i8W@rQH@PV2m+@Yf^gEL7aYt3?2iI*W`^bn8aBf+{{vuN5ECEpX7rd% zR0Pmz$4x)yF;We=jJ@=)@3k<^Qx`XD1zcg|famR|Nf~hT>FVn&TD*9hh=@pO-BEBZ zFdDJ&4r)+Sdrm?ZLy4~r$QkocjF9rXwDcJjUiRVWA&MBTjAn{ zBF(_m4a%Q1HjAElU<1EoL)(^CpGprXWk(eIPV>dimmd_vIE8BRID_FQOoI(7%G*X# z9^w~$Gt`GLG)hq0a%qK?RV-#~9mSA_Wnds0TJmn?g_fC!w(KO^HLG*rntlI}Lh-X_ zp+a+{dy#BX($UfJZHUN>If5QG@_Ug562ii7mt2B$l7!-gUjYFsAYT1C7B(I*lKK$& z$>c`tH|f}9SAo(^;FxT+G|wBEqa+t4jkq-D7a$NXRVu^u>=ie}xUQQX>oX13glm<0 zCoVDJR92t_$utgaDS`x~K?51drkVkrpT05i#OQ5xE&A}=@4jaX4UWn`rdD^X-uspB zFy7S#gAbmF4d5xXusOUhptb^fqEtzZ>KK?|zBK<0M-?Y}`OsNJR#4lDtqL%5IUy_Y zN=qrOUA@}4`A2dya1_?KJ~G9naoE^AQXfxU5ape0c_ZBb`(`8tMD)TNQG**yqsWki z<5-7rH7dM@#1N(I^vfBADCd{Pr)JL3-Ate zZzM?XZb%Omwt2`LjfJjxxD0(UcD9l)rX#tM*$K;2Vngkj_|syx-N*1BOILja2l0Ty z6K)-yqp~cJD*_u(6N*yB@I(~ccD?8pC|$YVncCH%n$b+3fYRv2tNjJk4@J0+2Z0Zu zp+IC3r&%ipF5O8y|7CJAXW4jZ{mIV+=96WxqeuiKK&Y}l9Z-hsBUou^7{|z028aBqX_nGVdN=zRNoh}h1vCe;V6`Vm@tv7j{e(fmV$TjyphmjImR<+i`QDFL zu4bDk^tw_GE<`GK#*2>yuID&->-3C4e4-hb0k8s49nCy1>6E5%8z=%*mP=BZbNTXR zWo{45=vPzn-!6RP3ZXF3XOYpNR)O7uE~1#~f@u5}e1LLM2n|2n(UlaA6c-Qc%%R;k z!2glE28~rL8zR%mLPb{SF}^A&KE^5%X-g4&p-iS62fuBX&QP6;2V?@ ziTyz4UJP$afc8={3cbH0tEH6&%K%s=Vm0uegHaADf2OG($odQrB;UM?Z5_4{IgcZ0 z(=H;l z$68hP=C{NTexHeaRp^RLHN>Ad?0>GvQ#}(o4LL<+Dp+nw579+;+5|D`P>FNyng*~L0EIFgn*kJM|E8QMBvg`m$f zmaf|l=7>K7h>KA)OV8$E`Nyd}Ws3vOZvz%nFP#HH2D3`VY z0aD|WZuv2jl@$hNAA$IYV&3ez@BK0%QC%fKo1!z$FTKCzj5axp%ZC}%tFi&j32aG`Y`}Tb@`@Wb)sSn>JwE*I;cb_JH+OWm;|9hk2?Q2LYDY%>qS9e@) zI*UP#q=3-0{s9`IoJZgWr z(ewdJ0Tasi<{5Jg;lXf=^9sIjzfmIqm15OjMBsQ(bV%@;=MLT*EY$0_b>A?DVPZ}1 z%F54Z2tcRjp2OqB@l{`vl+j)I;$!CL?Hy9c>UTP=uVBb#(`OJgTukR}(-e5442R2J z;{FHpaJnjqQ@vuif>+|`1fB$?QpZmTW?_RIx^PKBk*LBVzDmZG!?@qrbeURa|q>&r3owScz zb;7(u+6ajifrteU-7pfr?_&>&n3r3`I%5Dv?*s7?fgi(>huK;WV(>Dt0237YyPee| z8Z;+JQ9F>JZaY&}Ib6ZoI(o}xPPWBw{8{C4SwA&$r$nzo7&{0OeP5~|E$`jJqdsvi zz3uy8LPKaf1X=#gl=s5V!&XnBI*oK1whs(zp1qTQp%u!vcV%X?UL#exT{4+PLZ(y_(&YD)3)JhxYxk3k>q1)=OVaj$;9%Qd z1(y&P5}pIu*)t)))Vr_m0K$CZOb85EZ3f4R$58s%!!Q>8dgL3*6nEXZYf)ZmM$ZS= zO}%lf9mP=Ri+lS>zjmdxXgb-HvUsE57Ty4edqi<7apZz^e3yENd6D?L{h=;4X zxUZ}1_4Zt+^_azq!0zVu;_2=`$H_aG+5R=o(CxwYIiHZf8coXAI1J{v6qK@4+%Ds4 zpF}ey=?WwOj(}6}oG-R~nQ$PDETkn1#gCJcDpnBSNyjf|JAdIq2Fieu&KRi|mv{X{ z@8<1I$1nrQZFFKykDf}?$dByH31>D0@8;Zigls@;!P~kIqMWq$0-d}eVG#yB(oc-6 z_?ozmNh2c65PBD-G0J}urB1?ggm4FLhQu{f%=)5s5c)qHDI=cMGm!sDK?b6RjL9(s zw@UgFc;N{|6Fid7W6VHY%O-5K5kaiR^v32Y;N-9>!3zoC7n`9wE+b|04@50I9Np zY){`%fgKrxu!7m5h*x=HE*HZ#bzXynC8`T}xh_u5*hlcq5HBBD#3VdL*vrt+!T}hP zJc7Nn>rurfEv`TD8MO$RzDHV9a8<7RHx6&#<$*zC?awmmZ17Da#1OX*Jcnpf=AQh` zuEuRV`mQ6bS2}LfA7Aiz-HO`5E22fz=F+F&_aBn4e#K}x2VNOS=BRC~FWn2)!`p1V z{u$2L~M@P$DvCDZadyM(WP@x zP0bh7`Z_|L>W!wA!N+s3`3vkWmwNbI^D$GANIRd~x^51S7JSzfCN4fC{x8I+M0DS* zX~XP)ggo2?{kK0)I(zd&@@gKw zogEKHo_mq1jtoUi2eC#r@U=Ip9MjozN_hqzfc~~Ah|LyQj&U&x{3LNGqqvql`V9?1 z>ZG?_Twmli;NLgQ6lui+i~Kr8jLfiw0Mba*UJ1{8Ph6;-9)oM(j*xg`gTL+(sI6ucq|Jt~OX6xf z4X$iCxqNJ?t$6Y&_xmNE?yNecmCudnZ?i>dN8i6Hs`Y`xCT{p^r2e4L713G)>la2J zMAj&2tP{QWW$flw+9-icisJ%MVpr^ePI4t@gJj=`&Y{&?F`|jN2=Y0(c@)4Vp z-M=K~`!=A#&m4nyhl^P$V(8qLGJ{h4E;cI4k5y2`i8?YYER0P+;0pLj=XZ|w_F<57 z^NKR5Fp5|_GczOOW&G6FHyavY7qmB5p=2H{U#Cz@HOA)8^xGlaSz` zu(4TBeg!Ar)29&lHz9M=E?-V9rm`Mw*A25HUp{|c?&|8wuk6kS3-{+^hd0T|RRXy* z12BZv+JDR!m)yN;mnFK;Ru0m@If(TUO^P?6dOBf>2a3A5H={%tE?s;0Y{DLc0|zVy zkn45!u3i>%{``4MRBLaiO0=&gB)m+AilfUM98-YcQvUWW7ljR^)0wK38gc zJjj7}A}5o8pYP$wwv;)Z7Bj!}0VmSlbP29USyU4Y8?DUEeevrwOikDD^70M@nfi=Y zXKCsdpOY!dc^^09eeh!upwx=PhY!P#!U<7a)50RPdTU($eX}wZ-(Ht)QPnc-$+c@# zL9Lw_0445p*Y4D*s!yNz@J8I{XEuQ(6^T<>wQ5!6>(|kfv&G6sjvOIR8U-l5pPJD4 z4vlt9NI3(vucf8cjmm#GF+xqq_uf6*z(vQE8uY>eY`_0!VsmP??!W)|`~Mk8-~>T1 z-~`1{gX(~tgX1EU?{37Xx~8VxKx@sQ8?bah0MOlEO(@bW&PGJ#`YOtXkO^HjL32h5 z{^p6!WnI@C2NXC2+b1RlbUj96?S)k$pNh~Z;dguTopp7s=o@bnvN(G569b(=tPL0; z;}Z8x8M=&KViAFX%g&xX>xA)=fQgubt3Kp;;>3yT${un|Oib3iUkH@ho1}y#7QDvj zY1J}MRTC=5$s=P1L)By6K198D-!Nkp-bxS@m&#YK_VrHQE-h6-V!whEpuoJ833nC{IB%_*5uLGS;BcBH9P@`%*9YF#WONCKkLH8w~Yz( zVsLV@;Hi7l_mWwYn+97kSttO#3#lloq(ZU)^(IEv&r-E!nF#`2)*>iVC;(T+1rBTA zRG`B9Ox*5vC2%%WS63I^(9~PDZcV$X8gc1TH3D%CWG*oY2@NsMUcf-}H#^m%@U+{? zd{ljVC&!T4sxiv786$t7POJrf?VWrUAJ2myp=fbcv?(WU*Zgv7SPjZiJ{>r8C;)l} zVsoI&6`<@i7<`u@EH6))@%e#DzzGf{^msE>cLN4=+aZ{8HR788@2naPAN!U7sDwD;XVc#j2LWwSf|D{#Iy zw0s^I2n0`k<|AA@<^IBu7_tEzfi`l0~d849Y z{0<+pzGp=+lyy(e)-^T;g@x6xW)6kO<6BT5-}?3~j(}t6w-YwdJ1uO+n zlmj=A7ob;mgNHlWQM8qbnHjkx0(I2kZ&RKtdV4|tx=6RGd*HDkAm!}$K-lI$QIB5dlMDdQ4L2bmCbxB$zSL|9|Vlc z587)RU%sq@UynqAOP83SqH>|!*^N1Vl4su(G&JnBwy{Y?Sw$Yet5-2!-Pln;Q~_2t z!$<7w_~=G*asQRVJN96{;FU|k*mj_olixe zo*3Enn4O+>csGdRuVz1Ts(to0^^LDvo_BR=|IOO?8S}S-qQeHtv@@0!tr;a}SCb-p}6RtrT93yhC@K|GxMBKQ+Ym{m12Qs@GiO+p@ zLKHMQh0|y1fT7{Tv2N^MS-yNZJp+S=kTGFVjadAxs;cO|s0OFPP^$e(F zs`19gMmn~`JVuMqDdRTR(9mFxjEXb9cI{dk6d60A3Rr)XLD^n|NMnBLR5%{b7Ke83 zyLa#E8yPLv=kG_8`ei(1EAUWUohlnQZUp?j_!bnw84#&|K*q8EV&j3}_I!EKBP8S4 z*w{aA=!;oj)c!s^EW}1{?0f3K0rul1?tUP+`{4DUU$LSma~iD*g6KJjAXort7kBKw zQx^t_9QuB-V})?Q{0#C;0QeIs3Qi-rCh@A_@Ox2!Nd^LT+1lDxy?-C~mYIp^OYyJ$ zIP5GaC=#2Fie9XzW9D5q>JTkhjTyR5Kmx1u^3eXeN=;mE-#%twi(yZ|YC0r-#h#tL zXeQ|y9c4Xz`gCZY8`{2xb1wS(N5;l3Pf^gyD-l`%2%)CT9bdsoHx4G+nOZDulf3+H z+)UqIHWNIH^vS}aB1>=rlrS0=x9=a9Q9>djY7sKeps&60asWVkOODlUCf+Ud@O;~R zTKmxvaX9GKEfJ{pK@gfX5$MnzfuW#0sO>(KpjdRD{LIX#V{qt@7G6$idEVkuOo@2l z?c29oUB)o=iSD7%n&XBn<*iPzk!`uh61y1H_(jBQ&O8N(l_@(k!7IG~O{3pgPN2f@1~ zB?E`Y64X(qgM-5r=)Nh4>zK301>$dG&ffFql~9>Q0Au8CGjTYfPCx6d>^|lj1CxbG zs?AQn=OUt2(vYXJQJNrax_m^^i9nRNjWcKSXbBV;7EP==Ugmun8gMEmLP_11mzR%w zWovC+-I%ZkR+x+U{k{0Q;T?tGxiC*vY%5z1*f@Mpi_s-}dwbcef z?g7Bg?A-k9m-3FClo>gTI5X#t*CBLTWj;%#?M+%{zh=@ewYMJwqU=K#N#Ya_@1 zN>5)71COx}{FKd*qPcl^a+bC#3$S9k0m8uY_Kpsd>vL$wv|&)kutcRlPM;Q~_DXAc z^CqKnL)gE8DpHU>(DXkL6bW9D$wWMOuyr^$JDUxVEtdD(*q4^IM(^IfjhViC)gXkm z2t`}0o7;n(FS1`EW->Gj1w@YSg$iZE>vY%zWnUHG%Y)Ni@DOW3lF2B!8STe{7dJqA z*>j)h+^v+9a-NeWQ9tQvsp)C`_x#j6dX(?u$Bzd0AjeXsrlziMJIxClHm!_ImNT6h z11NI;W`$Tv@kMGJb61|~aK=}Ed2^3-L$}VV-X5D?3w^vM1$1#V^r$00SW{h! z>9`A-PA7mZ{lNq0AvhFv;s=OcNyQ^Ddb8Q!2{25KY^#ipry#YOxw#OASeTgZ+_`LM zXowUCC~e02UvPvD>Iku!&(DmT*_5$ql(LK`P{qzK8Q%mFIWyEN&x7?(wZL0<7RxZR zffGrpX2q>laW`+WVDU<*koMNCTlu%2W5V2!p3L_R4VkSf$DcY;;S5_^xQW6Z#{txL z?W7~BDtL{_gs`*U-d%R_b^~uB_bei2{gy49aPG>u+yv4TS+_30rSq{;$%Sbaz^tcO z<=FZaaOx>IrM*2bdwagTF5Mj7>Gq)Sqq=KWF>VNK%xdoL3M7@ntW917>|$hqnacHVOMSonJ6<*#?*V>eDlaJW}uGI=Q%1 z5yda*W^8N_>~aLSt+{|QF(@H{&$oAp2PGaoBcqji+^z37c3jwoH5dM9far$6gr9OT zHg?s~CM0XcWViZBs0IeA8AD&cRx~s)VbU35+)8(40o;M3r<*wbE}L-aRe2eT*ZoyR z{RS}P--(V>Z9}H7g)RO71dKfo(F(wXBTA#s&y0``z%3c7ngCA59>rlg?H>&1GuphB4-K^A^CEYc4;i< zZz5^{r0TBWl+f+IoRqYN)HQY-^t5eHPV+$$_lNeW>@h)$>ELSMqVUZPzp!z5JHy=i z05$^~uqT0!AG@Y$X5j9Vyid$fi76*GZ_bmeG7jFGV-bSlvEnTi68!mZ#W z1Pv`4xB^)O<~XN!m>IO0oMJGDfpKxGZEv7T04*XqUS#*_$wtOE`*n2G?d>H3G=vGA zf|9TY<^&BKJm22teNh-;l-DhV!Y*FrJ%$5TB9@?tG4F{HK~?aSXi=KOiMOG&?UZ1F}DYaCv)s;<9h<7cSfe z-F#i%@pycfJRAst=u`0g^+QJ_B}W8p)*+}osl-?gtz5Qi&t{B-J2x2sg}Cy=2Ojvh zDf;~OMd*w`7cvcsMlshlh-g^BC{EHhcue2gzKV|@c_HAdgLhY)#B~$FNdsA~y>H)6 zkSvIsDYtG>8yXruefl(8O-@s@%KpRMXt09IumU0=D2Q5&Wsk({j<@iO-yLo4x;o*o zJPNlbKR@5#UIx-AHXLxVsEP)7eyY|Ks>w==yLbP72*9h95HLTPGc@A>P2M&W&v zv)S3%ksqap%+8(LhM;TR>4@3yar8y`PoC_;AH@!^g;7=SywN0V&s+=`9dP+FGnR1f zN!qY!6FazL(!bS$@<#6c^myNHN={IsJM9hhA+`LDxjip zBWn=DV27@ls)1*-&9-}f-t$QVep3tTtMn#YyedpVkATy|rSkjEYMPqOn>WAgF#GV~ z!^$O}Lx&D^kB-WmdFKBw{9rTK_Wy}HX^8MSx%y(&n93mQ++W9#wE?v?jwmW7D96T6 zorJ**zNGenEv0Q9Gt?tV^tqpr;WD&AFR>iuZGXo@32~mV?r-115m|KCSZfhJ;@}IX zml1-h-s65rxl_Bh=uclDmktvQGxwy5iJ*4(3kuqmMt6vhm$w&nh5}k?wS@HS(2yR1 zn%oNhLQ=K5mZCtqg(r0K&D~dVAENq;^I#YJ0o~tHcAId(Aw#=V@mwUfN|ZFR=$ah< zRKSYzrxs^$;F*b57`#ms@)=7{wxxxD=|QH1(P~-Zjti?W@UbVLh~2=Hq-_k%UA5Af z7kE6qN0y=wl86u@jg5_@^ao%$0B6@0$Ig;giYMj%(E@37LyEb6#7{FeQRcM8cxQ5Q zk?@SWZ%IK*_Jx2|_2Nb7&n$wVr?L=R2%(bs@Zp)csnZy(5xUG5hTSp+w-Nq-%fgkY z6<5mhuEZuzUqmHTBOjC?D7-+kmN^6`WJM9!bp63V5c0--dSs1&s`n+#N1}tvkU*SC zI$GKk)Vwk0JArg4VCoSzWBG1n+_^&wjEjXgJgC!sA3TtNEL86w0Wn|Jyquz-q@)2{ z2B5a{_;CSJRDgrUMJMU`p(6-RL?Qu#(-D-;I4Fp|MjtK{M44O95al>5*9lxRi8&qp zyrm^7&@>FQewo1C9)8$k*~P%c#RXEI4p6-st}epvVy@y^aq;wq0ZbvpanrsYAMe*R z`0~PLdSNsDoenEKmKMGA)E-4eu}hkv-_bth76_xedP!l3rn%ERt5>ha(W@#ir(k?L zLhT^!D?5ApTlkx2V69_Yy*e1gvWSq7@8C&aP3+^6BhIRE=R~qS&Y;)oSNi~^`edFDIeT2ZH)bxCy7KT71VWSY;6WH(vIV{mlQp#r3|5lPfSH+@YlV6(ia&4y_w40h zmEdFz%VZgNIEROVMbc_uZvY1`Bedq&VLL!I&iWqHX?XW8BEH-L+`(lY&P$%z_WAQ? zYO%%3+Aq2dQf5Auq@{`CC$9gwN#er%p?4UEz{bP#VhB7gk-$k!NRTmz|qiiPRW|;?4W8yzbhrpdAHX zY*)|Gom1M@d^&yO=*YkE$8#&^IUR(CfBy}ehW8#(x*!3_y9O3D;;JKyPQ@$U;8hhWiP{wHoMX zupiBUYUGF%6&1Zz8H=Ci$KT1$#T5u~ig3JuQBiJjb^9~%W>5sjxJRtL13Zq23fJ7^ zwRs5hqs=-!V*nnX3c(mh+iSdb&%S*%AQ77JMzfxH_16jud^SKy5Xwhy7&PPdD0=Wa zs5WyOh+sb@#Kp-%F|H$bQ8};7Vn&gm#~mXDmQAte5YUWK3 zaxvV)-o6*JvBoARt3dd-;7hLGxS?TUQmEmz*eQk@3C77=J2q^fLrSf}PZ$R|1zH6} z%_=f;H?VRPR9OMa@jB1Vw@{!s4FMY343GhND<=sp-qEoJFKBFhyaIigALjbdv*`p` z0c(kQp;Z6DbL!M7Kny4U)l%JPZ1%_Ese!B$EI(SKZ z$mm_U)5TwkX()IiFG_q+k2R)8tl3T$C=nufe0I_nrG6qu_F+@`)`q60TKFrCn?;kG zg25W%)FvRa#c_miL#`rY=Xgqzu3n{~7<6r~p;?(RS9D?LyQJ9I=PIi3)auZhvVaBJ zwQJYRkFOk%`aKYpD3qpLKD z0C@0fZ@+cYS~eNc~g%n4X>9>WzKbM(#dY;O@``Lzwnc7Z8VVV=lpDWR9|w zTh?6dr?O6eu>7}5gX)q?b7ju_4*ScbMy1*RE;a)G&s8)W%Sh*4^!l+pDxz!A?AgPT zVkB{`UFc+_Np7;Gu|@J98~(64|MbzEr2*u$z$;f+_`Zlc!?%Cz*?BIF)W|o-TYg^6 z+70#)%_`+M?Z!u)oMd5OmmGa$_yRJ3F~*0uF;>-@9|7f z-P(HHTyj44#5W{uFQ^wjA8?2yGRC8?-@aW)Epz+&BN7Yf#7ZGU}jBz z!wU8tPTiCZUsh5Ei*oCbpcQ)(L@@$afO2Q~oiMs}@1V#Zd7}BwRo=ceBnIPRQt%uy zGo^qHoIg*FjrkT9DrS88_>r0dX@zag8fHpJXs9|^?G3|nva*pb^C#`>P)IVPSgr!I z`63ovl@^&)|Lbsk-@RO%ABC6)f5-PNa>zz~g^tqRoCcJ$+UtwXP z)Vev)a4Y4xNJDUX@-qP0W<(|zK z{pfV&j2}KG3JZm-WXvXRYim=3CY83*quNZ93yX^Mdw1^C73<;$hXf$Qx(vn4 z9y3b169`eYRJFG!F2Iu+p#?-K*anb`2>25ttAyodAt(}ADKsT6`2fy<gJ0 zNzuZROO!!MpFtQ`)b-e}6;_==4CmWw}Aj#H#_mQ9KPsCox-o+*~1LX5mr) zzAHa|{#2}JM3(QN)s(@o-rgJ}mT)){bn-W>U*C(`f#M6#dd@Tlh(#!MhP}@)p(uHo zXBf78xu#pV_hK+WQ+;nmV6WF|dRizG7G(9Ijm_4rkDaSZK`@1b43GV^+62ONb}k4U zD8UMEAh-p9!qAaIr%YgXcenF<8HQ(4ui{Elee+$z>GpO4pc19NKK`C{bDA~+7{;cS z+nwqxQQUCNV16zSvMZYOLSa^@YHYkRS<+eRb<{pt(q;aT(XL&~B~RJe5l+NlkbK9M zEnDiJiTmd-Z1iRsMv%`O9vG=c}vxE(zzJw0~a8L0-WFn<}lYT&9sR< z(2-hAPwz_gS*#KQRSN<{$MVLLC))@=z{V!TuENK`L4&MnY;4?(dWp;3=s%#;tcN}c ztN$L}Lo_t5Hr)3mUl#M>-%8Xyf4lrz!okBWy&i=O1wI2KvQF%GLI}{-KXix|3BmP%_VtnwR{v$|=*kJ9ExN<& z7boOn+lvd>gyK&iK$n&pm+%1MI#7Boev^fxqs-_?U6T9#eW3IQI+E;d{`iB*Ppy3D zRyK=9Jyx7D8a*1}qY9zpHJX~ApT3V+3x$3MiYk(Mz(w`oc`A7Q+5#FW91aULli5$j zQ|8m*y0%t&Li@w81d`+Xpu^t*pMp|mUv27H5 z7z+@nnU5Ymyo{PC=NHl)MLTFN=2#QT6jDs4e~OEYB-#I3anm6~Lz7t)go$=gAQdi5 zNl^$zvT}hYjAlcYX>kyE58Z&{ygWQTke041x!M;lM8>!`KgGGT{fKf#7Usdm!Odqt zAW3e`G~lF&e_wC(+uf0wnQ8xNmC3sfjMz28a4gz#W@TDm8bBWrH+?yLp{zs zjXozb2f0;kze;ih=*#TEY=q0iu^PajJ>Pw7Kvq03E#4-H=`DR_ON$w=7g71fUYGVZ z9YCO>gqdXlCTA|-(O?@1;B zCKJr8g3qEd`3cYwB$x#-BW@choe!4Xs6x2T~$w58+e@Ce~GBnaZ=Fa3@5_6f<=6S*(VrU zXpSKpnUB)amSM6Iq=*;Ar&QDMH&?xTw~CNXZih?x08ngf#>aw_W8B+pF7tMcG<}C9 z-wD%vfW_mpHPi8&~fw+dk_>7=(g7We<|MABkZD&!{A1iT>n)I*+ z+$2cDB{|f`M}lW14;NQW{Vl#7D*`q2w9TROx8Ps`LGY(9C9! zRcaBKZ3YPT0%=1C4cvCwKiXs)_a(!+&wv`RacbXnS@oeob>!VAUSQ4=?Rtg7UsuXz z+$wPm?=sir905se)~Jl5{2YF~o{fR3+c0lRoiwlp2}tpUoU5aJ1*8ggqE*}R zVY-rJaA2U$cb}aR$q&SMgiy+cA~)@OCG*($A8ma`k zpt}(wGcPv{TA_R*d`)do2tE?LArj+K|AKS2iN0Uwe7wjB{jY0qIOWcr0Q@c&@3!My zK$hf2Bqk-n3`L=Ucy2=wa@%hH)Aly#R%9fNg9i_Gnx-2;c>2urfc&h|t?+C2v@R?x z47^*7=gG~-mvLS0T0-} zcA{9T2Z?gc&8=S=RH52W+AvQY@ciYVFWC6`F9E^6Ea6XXswF7%G9JU3?z&X{5X6n&QUK;b zR2Ci(Om5l@-BhtB64F^ zh4xdx3H7(awik-9>yuQzzVH58*cFMFk%3~726^K7hpBY!Ir~vQ|g+8?B4?YS? z`P?p+5DosF{A<>t<1H<`@t<-Kd9o=8H|A%2vxmAHG$K? z3F8j**fO?YQp*XO1Mc?~#v?sj7FVgtaI9JLYDI&WA< zNd*z`i{@}Ey?Z_723Dqc9L~z+*gsZ&7vuMwVi6WAv5hh%0~cj!F=6vVm<6zuxE#cq zEOyhr8$l&T2L6XN@&3o*S7rIXy!D+Muw$^o(Xb08B6hJcxVcR`dOInTZwo024c4VD zN0Z6GN5S!m`@Wu4^2jNk#i%H=K_45LAqYd3lN@zm=L|M1^PDy4><~K)Y>f>gQPI&N z1#ke2`Nd>>3zF^He1I)kEV1vXp}u~3J<1lYBTvB2WIuUw;wLH3HFndpzsH6fqbs4I zQS`DB5ioBtl8sLl;7P{7NN{p;cB5285_LqJyEc6{It!}8 z_Xy|BP)yqkgex*F9hv60341U@VhE%H1?6&ggQ(~k>Qx@f0wpCSkh^Ivac}b9?1<_Y z7)Eh&5w5I6KCw_bZp`Imz@fNCzg0>H1rRXAi5?F;D;$OsQE2|x5>Cj9}P7tyH`pP-)%_nL0owryX~iiSaE zD~=vL3TN(WVk1h?fh29j!pyuA)u^p09+a(3OJQL2U>&Be9Z6M@6cfuXH&lVAcUuh+ zL)Wig|3|`|Bvu1M!+}=l=ZwgiKSnzE(EgI?1yU_>R_l{ECj(hr3CQN93&1DAht&nzfip9c+H(7 zMrd5ciOv#x;t6Z)X86s`7!+aVkA|69^4q+;yr_f($$~}TeW#%brWBC?wu$dWsM+AK zqT&obz4yizola8`ON@J8H!6Kia`R>mxJtP(Ir%WNBK!2>!UZFv0|%m}rK7gD6gE2U z7?x92O^(^A?$0I6z{IYIW#c9Cp`N!%Nwp$TiOjT)mGM}6A1(k3IIFV3z5%pTary|Z zQ%y!7cNyZ7cc=!TrjUA|H+2vGywWSUV13|KP%>OqGDS=WXe2%%e04DI)_TEPMkE4JUuRh#G3g`npNjxzKu$yopz&))7xk`i} z+a0~{HzJVN)q|GMfG1t|`zI)YZQjwVN{vB>NPxg3@BwKk<`<77m=E|H33qP}7=qxR zZHMANJ3rt0C(xJ9@P?LAtNh20sW|E4!UYe4v40okJm?uC#mSAuTeCc-Hy zMPDcbu|*B2?><;zHQgc0^YCUE3$54ZKQ1nCi;+T9faC+Zo!ppJC;<2z1bqdbgJ7tk zme8?g5JW@;BK`w-80<~eo?m71KSw*D?&O!|RHp0NJmX~)1w};*Y+jiddA&ai+Ek_|&I14f9enJ>4+qW~&_^F*WeH^u4mirq4JBQL zhJ61|pKrLf#1u{`Z)rIoLOX8z2I>KQpvIS>p<){x|(VWVmmiN!`+c#lS7_8mbl$y{YPV{LH z$Mv)IkeOvYCi>-QE&yjK_8cNN0@NC25536$gXlz<=s>Aa4;vX7 z`QyfyIUZmXm@V!|W1$YQTXqBR;kRo+#A?An9Y}}i4Yl~h(!_7EB1cM0Obww4m@EQq zN7}T2QL}`{{!)A zm6RxB2?{X-&?BBgiAg9ZYCH&Qod9??(tJY5t@u(pQh0!V-vy&e3TmkMRovVmaAgD7 z?HA#fMY({-Qwu~+6h7E~AJ;Er)fHhKpg(Gqde31<6_)6qri5MOKps+jgGbK-JbM4Z zgV^Fn`0zxi#OTE+URjftzI#g3N0H*dEjghxMQi6yog`39%=q~CP4d=Lgy2wtnZXa( z5Us0H>=N;Ka7Y+>*S(G$xlvunf?OtLl1mFJTNC{U#9>QtJmzDt;>5D?@xA6?&o%Y=72m3}D^gkoOAl+kaD|dXbe7J9 zJ-@%8^cLtlxK;SwM%w*A`<4`6MCD5CX()Zb?EC(%T>JSB>g!W{e0+>nFWbg3tFv$4 zKr4(r$A(IXg&)tjzr$t~Hx*|x>($+DHb{$-Z(i9_QuXO6e+p*?5B&Y9OWeo(-@Jpi zXE4~6Ys2_FLQtl~;nb;@mD0#P?EL&p$crA10<+8GuU}V#XAl)Tw6;ghxzHV;8C^tE z0b#6NZ(_7k9Wm;G$?wIradLC3g|k8QF31vGxBB7)WUhl`qRr!g@1Z`URAFUq*QPr( ziBhopO6HiA4&!zN$Mu8H>2nFM4ghL2;t75AWc$-ict!dcwgc-Y8}`PDZB<794Ljk1 zA3og3_~T_`<8uUIo1w!vW0EEN?;J2Nc;NKK8pHTn&{&!N2FS$1!QuGOwoe~E80wZu z=8d3UID9gxx9jm8uc??-M@)FFtoo1{4+C#BE^LDsey(FJDR%{S;8#-%D7*XO?GTGK z&Q5QM_fgn^P!&IJ_!&lLO6?mK#sIIzMfd=6BPVBO+#6pxz5JGuSla``JD1*ZO*_^DM%EQr3gFbI-^>lTs zkaAm6HR%ffxM1S0d_3^83?kNn11+mph=yLiTtgTJs0`~iY;e)oYJI@iSnRPWS}M>7 zU{&!9xB-gs9W&Ik_) zD;*u()CUF%z-kKGWJaY4OF4kC24bN8Bqrxk;*+izjMgi!9DMm7n$JXMyI?2E3gg*R ziDsE!#wSIIg@WhA5kqwNkcu1Go?Spd`i&gqBa|+_PtN^ZPW_iQ^sqIzcQ7#=nkOvq ztq+gJspPGUZ~NM2zCTkYJe_*%@gj{@C@cY<3+17nLH6zq~> zFh;+RkJ&Z+sed&z)fY?lZ-}~iv#}nD=s~LzfV$IY=MK^qf~ye{9!>x~T#EJt%=l zT|w|%30v$Y-U_^j7=ivAiZ9+Khb|-&17|()thsdJ*!Cfo z5X}L}4#p8y3VuA4_JF&0Pdxtd74VCDtNo$C*iEvsY9N|YA3Z_^zzh*8Mkxz&2V*f4 zD{C$EWO&E>?7Is3=U_rJPEXN21G^w5G*qBfzzObmG-)q`b~DkrWr7*e?Kx;#V#$K6 zV1WW0zw&oLkCb3zjabdPd3_Di??ohXE8r41bHz|{nPH4|Tt~IKt}Y|GQv>|`sL*KE z42zbB+w8sZA72j|EgJMhsNP0YCUOjjs2Y?$P7uGQcHF4#Q%7ir1QM8ITN0Iy zo1313taTA{t4fN0RGpvbUvcmF+X``Fb1|-k$+h&?IV=?u1`z!9>(@!h7mzl>kvqvL z0-#bS=^a@v?I(Jjx?o3$xTTHECdTGP7PP0UW`wSEwZ{aG+-VEYWgsc(hkN?(gQInX5iWC=_3c zj+Xi%KqkHBJsyBNq;JXk#0lcaB>Htx(fPo4!esw^o--xqeyb)6$e`+a zJRNEIVL3qaKRvkT6|L(c?O9{lmc69Bu9BXdoP^6T6bVcSz1KrZ#4Iy9+T^eN65BFQ zk&Y#t;9A5!(qRSqm%L_Dkt@=^{ih`>;MT3-Dq3h%DR4$=?83B%P3MN&>^rgoLNKFv zImjvV6DN!|etU_|N&Ky_sr5gzyAy_rEdo?ueKB9x9hhw4oxVa{04E05_-O9LuSb(R zh^2?0pWhhnEDHIZZUx@gGI2GnxfyPjJ-!I#tNl zZx8&pngpK?H%3lndcrjGS4Yak$UD}rNb@UC1DM1J99x_jw+ej%K|<#BG%^M{jd);T zs6?lL@t1y(yFFjN)O`lnTuGHkxJpE_!U`^8EWy|q;>aU5G0X?nfP@?cvJ~Z<)~;Pf zx)fdTN7y{Y%gBwEzo}} zzk~gFjv^@vK2uU}@v(_X%gC@|Y>*l_bBaSYfTS?kzULYOAXYHyhzZVDCIRK^93v*N zm6aN#Z5XP>04?2v^mLSIR0Oo>vn6jq1N=qU)GDj0s3`x{3-UoR31rDFqOEiQ!E^>+5)3Fb_*D8b^ytD#xP(^__d2Yk zwn?yWQYesS+|QrC^;a)W#Zx>N6zqTZ;>4mC=h4}=E(|UyosW+Z8JDzd6mJh;6GwgfVe2$b zCsM^Nn8tBhSTg8VbULrYHE-g;0hECxK7%2@;fL6SEa&D|g^YJt} z|7efVMDaio5)w*j^+*e3B+gIBa){IF=`XQ_mmRdc)aFDXbQ=-p?8Wug9YI9iX=;jK z_Ke#}dUL#d{`oMfc{nM~xPfLe^24t&NXWifG@`Z&42HS2bpU*3x6mStKw4PsyM&sr zyrRPItt9WcLd=qdnJuqKjQa~L8l*5qnRrLq*2?N4DA<_dMI1DgyE@Na{3Vq}AnR4a z>jtS5YMd&p8`yS60nvpFm(zR?rIm=RY|v6F-@!N~Web8$E%-ePd=MlQLnY(v zJD>v4n!AVjz&y;6PB>#|tgpgb5ebk*%!gUr+!Y=rFi6*a8KeH3fzx0NhLb9|$>7{2 zF2)3D0hNP@$OHs}2|V&7?+z|i4&@~-DDGMuZ)Z$W5;F!X8p-hdFf^^ro>9~p?`}eE z7|VM${oXw~6cMC6N6pYZ?tT)QY00#c*7Gb9L^L>?v zmWTLC`Il=28hLnm!$?K|$TB=GBWzZWN0@{8Lq>-W9@Ip|-ruoNqcjAMJ9`32b`0;{ z-QB&e_^5NtwQJQX2SH3Tpqk*kwzE$D0U`kDwT0ao2PGVV`2`Fa6bdNG9yrZYW}Y*E zZ>Q7utUA!*M#hKMk?Q5|e2d7anexA#rt`8$E{Z>KNeMK&cJrpRE5+4t`7?Oh%x*o* zt%$do1x|j+uO=OiNVJE!7@QL^dXnJ+@$XzPQ(6i`c|O-}#7Rah%*Gyb>`;tV5{#(5 zh?|Ye6Nn_W79}Cnc~CBzk4N|a{ek*zQPdMM9e!QtB>osa+D+RZ^8>O;=o2&v5c))J z*^d&>+3164X^1K;L*DGBU5f_TLC+uw6=q`z>vtu8#n52+EVC& zz0iFDBxSl$p1WtHhmIW$!Zjb|4VE7)m9Ja zsde>W(5`PiwJPKA;3g?=z4+R`oLsS#-HE8!&_&vUo565;8r~QSTiaU2{o-u&ve>NH zKQK^%M%87J%V}x5(a=tTbr5;4x(MC;-wvNUcP@>_7)O{U{?XPtK zw!llPtgEAkW`btDF}!jYe`x?C33gxIx`=B0B{gF6#diqR2oSn0B4jNATD1f z`aox2c^Yk+#-*Nxdn;l@9k+>`YPLlB2Pa=OgzAepcVVxPSnJH9M znCYk?QxIbbVFc01o&6JbBr;AxPIZ?F0Do0I!0U1fteK`mmko%oTkne{x-TRr-IZ|& zZ@1PKq8DB=oH|bhNjVwh_39>lgKab>|33P+=*lOK%A?1wj@} zHE}5>Hgl<+*M6i8_KW{06#P75j_3& zj0@vG2bDzD|0#q6A_cYJ-Ne}R7j{QWJryzSV-q}R_<(F6*GV;l0v}_kgoI*!Dntdqf7ZaQO z%q`j!7vispKlb+nLN4X#?>nZ8M8qlPXfI$b@fOzk=Jj6iUq-#TLjl8+V~(_ zbs8cZe_Rp~ZOQ|jV1YrjH-CrEBL81P1kjby$P{=0e#jJwPXMNR@DAZesfOMrs-gGk z@u|Z@zp6F2W$^xZi=h`r(%%$BRD)4e3yX_~PTpJ(-Oiyy39~Rb$isx34n?=jUg5#L zdm9)F-oAd_8^G@Mjf^)ybVB9E4FMA2y3Q>KA|wjE#3yJDs|R#ANGO)dS{tHk($do6 zFvVz`S`kG$Gs%>M1>7fcx(R28q$%8ju?w#X3j=1Dss1xK2OJXkZ_W-Do?;Fzu4MpB zSi8nf`ZAHxL0((|c0E&{RapoGOw3F0(ZmzPPkPxa>`<` z*0!f+cTi%01HZfX8_`+X+uIdR!&c!3vpbpPLm^};ymE}hoaG75L)@hU{ENXSlsT9M z8jeR!q!8?Se%i{W_s^a5Gyx(d<0TYM13X{l{U!Dq?g7HcllF(}PjGAy^k`sau;{sF z!=vmj>)V@9ik3w}65-!g;7#F0cVT_R4GyDo&`_{-fEwshsu~`iWq7ap1_r&EODOmf zi}b~$wi@dkIr#!3>J@s}kYT?-E6RW>p7SyJDnMUet~*=G)9CN;n^@bxmWZ}~ER+1I znr8&{HZdwx^0&7cwe@hv^#usuNJzj2U24(`@g11=!~hfx91{KxWLYu+!wBnz z*HP5e)%`XTfQ17>g8pXP#%^TSY9NRn_%-9Rte@pVa5K5zk3u{0>eZ_FQozx39Ng&A zgeaYD_tuMvrhW37D2*TlI%YH_A+Kv3J({q2BbosbG9bfBk+W<+X8mF^gd&S+gXB!& z(U5pV8oTmgmOi5)rd$8&mCXR|d-~+HDJ3y+QPIE{2(40Y={xqL0?2Ym!KtI9V2$ScUN+ zVw;sy*8OQmHa0P_fGY<+`GgYruf=Ose2?707rrfRgg)%~`1DHVu+;|+AC9wAJYXK6 zfS3z+pKieZci^Z{$o1!^rKRaGb*~mb?W6?H5nw$deDmpKT3~#+w zUEFKP$M^wxIC|A!A;!CWmST$bLL7oWH3AZrIVvu6c4M&f*cc%eb1bTsV@yrXR5aCj z1aSA6u~e;-v10A7U%g@`oxNTdO(u0mMnU2FV?m{}+9K_GoYqFKVX8n&?E02PjB*Iw zMuOurbcg-Mqv4K6UD;VxuAb|}kPAAnk%+RYf)G zDA6Tr{u2?-$fKAFoI5+5pS1e(AKA+k_o6ie?uhy!RQZ8u2ed8HcIB@UjZwB0y9G}x zx=|7I%yG{X?Vtr_=j8a|*rNBnG9I?~EBMbw?_a-`m>l1_WeahV$_=u!nnj(v;tC80 z&J@mUakry2n#E$n6SX}v}!3j1$M>YW=r#8}N3Fy9QPxPI#FGHNO~sEMuP z7u^qV8V7@oFdfUyV=c|{2b2q4xf+U9n+O)#(@4H5AeB_8F5H4H-S|~{dI@U~F z&B@L#CxF)!(+;Xb*q_495dTtKQql_B%fO`j!oK#~5kEcr;UWyw*=ot49U9NVC#UH0 zSvyl6`4IMzas)2pPr%ii0JNb@@3@t+5pW*H6zACedU`>ZFYilV=*+gbs5ORJUw5lL zfd(Rd?2)pJ9{ zkt{AM5|Nf>LF5WRk$kG)$&=3w)1p@_QWUrk-6@eRg1^K9Plwo1i2E#l6*@z~Ihf<3 z54-XS2sGaP_VsHIa?se+R1m~(TNC_=&;)uxW`V!)i1%V+UE)-&UBMZA3JtNV)W&lT z#DbH_%_YRqp!|zz(G44dUG@#2(35eC$5?oH!gGFMs^GdxKQw`W?ld0Sx(fIb4MCQm z3KQQSGE7qOx)HN_tDreOOmB1P+e^Nj$~O7_h(WaM#WHVCrA}V%G>P_m%JK z>LPYS4MSOA`x7`Q?)+rFpy94vL0U%v_RH$6!biVhG5|O>5tIt>FF~}gK~V%YPICO_ zUV8Dx&hf{`GXf5gAv&9Y86cipAV82yLpW8X<12*UI=l-^YvcG9em(BYbyq)X*MBhV zgv+359e2Mx!;D&-96Aq16_IW9Hn z5Cvq(#`19B>4QV&Uy}Xuvvnc6;y#dq=NC9)i66%d4T(;Tvee}B0LC@frDp+{qneg> z^@b=CTJcR(Q=)nS)IcH|O%xW-p$D9ddviy}?cq=R|H?oU8zH{+w$@aAp`Ya)9v+sx zF!hIC0-FE9kzvdeo!%S@NHSkX?-QDKoiL=Ef5-W29OvUfVxf42H&r`v1FlqmKy)aq z9p(TPnGO~fR2Y2%sa-7WT^SbHfF&SfG2l_DL0cQfPd)!U{_|%IgeKz!*wi2jipg`! z%E_$+k7!$=26~!wttA|vNYr;d`JW@;cmQzd%9(4RV%Q8IH1q*~to+8s5UAiiuK-U@ zt$!_?u(BACDKTAWEw%ya4V8~V(?Jk0#3gM6#zl#eO*t3^0lF7)4B1JTIH+NX!q7gw z-c1P2%~!kZHftkOri&fJto9i(jv1Bqa7q13+f02O--$s%0u%M3d*Xxr|j)9 zO(H(8Axfe!aWs_ZkCbw#UfEguBxGhzB)Lh(bqzihu{&m9@6ThU zn?@7NY(7a8HLwqb@&~X|+j;;hLls;+z5GwWH(&)+1W3Fd{7YP2;`qk7Q<#K*hhX{mouRA6}$WC&E*B(X%VTK55?-ene_Lb2%c>~wW=+l}Z#v>kvU3!HKyjuEO3 z#MEN``=}Md{TI^Uk45(k?C(T}Ake9wj&oA(%E2y|PrKpV`v)}5+H($cQ2mo{09a-_ z7wjJdm9DvFk@84t^bzb6PR`D7No|#tC4G3XqhA8H1Bmm z7OqCGE0h>QlwfATe8xyH84m)Xj!X;Pvj=1XLo-_VF$@J>Mi$(`L8jq2Lr6?8Z~1{* zCU$)SA^?HOvU4%X)l12eJm)aY@**JFwW3Bygt#3-N=m$V9-2sI=9ZS!K;276(`FoVnJ{oA)SxO4TU4zO#(v9?@axvm66WLhIB>gKWWjL_nI zb&?qROos*m;<7$dI0W$QK}f4>H!l7b25y7axCk?xg;aWguP!kuD*5$$Qj@2;vi*!q5=suS6>so z15XPJb);VY)BOMC+qbnC*SPEp_K68?-O2^B=(ki_<|FfS93HQ~Cel^coS}0K4`wx5 zJwACBniAR@H)8N46cayei^#SE-gmVA4~QzC23i)JV0!|@CT2a!nv;(=^T0jha+}!Ki9or4>GA*^bb52-rjIBN zV2$5?OD|;Zwr3aQAy2_n767It*A7$T{Vral!6XJOfnl9WM31xu@F70F`Q-6J=Rl52 zCfFc}*$ju>yFvv=VS>M|=t2fWvg0)oQq2w?`T?m8oD4mEeT2ON*vUNyDi<}r;U^c} z{tU3d2%X)>v^vGLg_qz=lA;=$8mg) z4`jwz{vLGM4>CE}IF!c~3GNL{0l-vzsv;Uwy6-!&aLc-RnDj8D^1h^GtoE)Arfj2l zmOw8=_XA^LSNCI4UU@^h^yJAsS+3jb`t|E4Jw0X08Ws;+6jK24CTu>;-rVXS=+a%x zgRJk+fB3sWJVeKSQ;ypY7qTY`^}CUk>GRvEhJ2p%A%$eHl1m^AcH|~ZCy=RbH=oo3*npNhx-vM|8LM0hvA$R}EsF+{cZpfT&KjsZpq$Behu z!l2Kg-Ub|U0J5P^`=&SuP@S=l5%?_)y*YiT(2RwIY~J5;QC5^~FPiDDdo!9fZ7TW) z3K637{Psg9FajTOk4{ja?83R=%q<`eaiSOic0B{1z@)p^xO?N~5GCZ_yv4HVtZO7? zl)tiRiqu(G5BV)a1sDy>g1Bo>{6`msoq!_d41zOscRx0EZ-;d~dNBpUN6Z&I09!(E z4N8%>_|3sT7rFH)Kb%AGi@Zqa6>ng}2{2qL%urxD0FMJVjUp`D0Ovj+zK>^!f>4!) z+#jV8vl)(m=Qm|eRk)-yY1Y#G!DHMVV*v>5^3D2UGP-^K&HNDKUPd_*4w6l13@-7YPbE7Za3p54Fl3)BY-WMcgx-U4%T+#J3}q*7i+lL+12`kl&<>aH%P4~M6#!Mx z$p}xtd^>+^&$xQ}N@&iZoKD(ww4)2w)bSb8a(dTa%6zvh^CBKt*AMTd>kNlK>7PRQDDi}>9K0~CX zTL{%Jg##YN#TJ{_nGm2K$i~LTmQjAK?_^h}hnc4rIPQqFsHs7QQNlLsl(hrhxDX-} zz9HnA(NkTC`cr}alg8~r3fxBibKrmC5Y=CPemW8pW8+O<&3K9XUl!-&G#xa^OUu8U z6OL2Igv(t=4t!+>Rw52G^@)*LWV^O)f3mU}8MohBgKqsrPUcKpAbI8{4&s@hQgxZC zgj5A*6k5+4af7c@?96}Gh_@9a0Z-O1&1xVO5>H<=JN{9${d|-!d%Za!9VN&?w@IJB z@o{<9aHG~ZJfq@!QYSCDaQQOh{Ouh3D|98Hy~61}&7LXbyfH z{D3}vMp@m1-~OC=^Jw~{uL&N($vSpF8Rz@<%Nk`a5 z=-4R7#n7liOT zEw}XKH;~=eSY|HV+*8HiI<1PB|HEi*4y8Z#_8lcc z5FosfxO;LL^@KRNy|QyCFfp#7%1ts|tf_hO%y!Btv`Ll<_2QK)HFIjC06IiD#f4mT(b*Sr@IFMu zacAf5-1o$ZV8INlJBKU&nvcE4S05I;pJT~pWjGfo+ElbAC*cO)mQPn|V6kfF77t~Y z-BQalz85#X4uy{JU(#eA<<9+MBR>N}AL|yX-;*06!ZbCTxs_G!zScrLiD?*J(M)=R ziwq76B>+obpTLX9-fv%xX0T6{S2A9JQ!`06064vVL zl{j7UJH8GUKz(&kpr2pMR;^m`DPMnvl->>mL^8O~HU(f8x!SHc z?eSM4{OJnO`8Q4R{rqwkqr_<4-b~5jxuOR8Y396n!Z`4A{kxc$3vc6H^FRXR?SA|P zovcthx8ikrTwHVLI+wP_())A_fMoGT5N>FM6cUr}|Aa6^d2`RUEfIFkw=d0qkuHB~ zpZQiI%wuK|*jQ5>vV>h*YES)qeP>c_Uot>7O)v8|;$JDh-2D8H^kB$5@@}w7$(zP6 zJz^t&^nkmeFDz84TD$JODi&DqJ6ki+r3m*Lt0;afT*nON*8Q_kXfn8X5PAp1ROqjf z2WQD;~r!RH7mT3_#u-+UcJzBT`cD`PzaM-*&=itzV$=)AyA!Fuz8vqEvfc6RIw58}!{E~5brdM|La9gPi2v?}e02KcuE=0|iDr z*;K!td%}4ChO-x=qj=>Kqcy4xcF5}>6$xF}x_ z3)}L`N&2TYP|Wi6+|+B(AS2(#%+nKF-2F#Q{&sv$4(b zYH5i9kDk{=)23%d2}*%J1c1sbQity{KaN$U|K{N=pHF#P(Xre;CZ zspY2ehd^C$V0d;mk)P77+px-rY$(0=1qFwg4xC>?MrtW*cy~!rqj2iDNYV2mIeF!j z<%-)r_hvIi6A2Ty!GFK9v<8(I5;s)Ut_tsvpD_r3tL;^f&RR;sGY4K-GO}Y2CTU!@ zyK!3U2HW({Y3ci>@D(;$&I^K%{Zrz9s?};3sq{~q^YiylmI}>|zais0<=6S>%`P|{ zB7kam$`6@@;~2SdB}!LLwMFK`*`oquiJ;Oit+ACqd_h$LTX5BUK|Pg;9IeqFe>mKoB$UDfp;C!p3VSGNCo`*^!A^lk5n>rVdtLR!MrS`9@cZ&}d!61I3CAtGrLn`U#@ z7*iIO5^a3~_fe{^;zJkWR$}^$nQlIrg;bLe$3zkV7)6?5{&2f9*NtXxeshDSF&x<~ zJQfX!p*2-gXRQ9#56%FdzXsJJgi16px!Lm%CFQ3!x_BKzOqRdaXmRlJ4{B9aRVMj` zl=Mu`J@QkDysxEC`5=e@8BBmsae^nwj*mkNbbvgo(ipR(~+fqIz!1 zq)ED~UMz+oRjA~uE@<9&!32l89f>piiJ*&%w-NVGXrqeQMWBtdqXBsYP%D-B@#9Ca zOe26c>*NZa9Urpu)Kb6%-;Pd>IOXuoO}clQbr-i257PerpGW<0(-`DO0F$zn*VYV> z*BTJl>dLmFG?lzu`ojkSu)D6-&+JVpXN6$^cS`De6`3jb<+yJxMm~;g_UA3#b0$%V zDvvEcz7yBI*yZwb)bUH_Z@QyKj=VtqNykzWcZ}*oP*Fh8c=J1UGZ)+p4Z6(I8?8m! zgf>GlxQ`c&5%H7lW~7lIQJ$iDm&~BJ&mX=RA*RqP2V%jY5_I&}+!ntlT%AQ(gr%qe zlt9VA&VjK-=6l+~(8Y!9#Sp4~y-*n#&SOc>BXnI$>cIiD@@@IKBSOsyTSBTuR+1hc zf~^gT)b}4g?4}y~NRPba+Nu`QMtGe$b4Vy2scEzZ1yZ~P)j?;Ty`=y({AL zNa<3?yO8IF_f38=aSc;(iAMt_EQjM&G&CNO^+Z{f$#9gQewoPlNTLwN$M&7~yCq!W zxUgL-;~{mveB*7H(Ep*b{aRU>`>YX!rR`NOa%SASamF3yCQ{e}V_|ZtdVfc*sMV<& zM{Q}A9)e45Hi~9rvo%|PuupO(NPT8tB+GpC=N7Q z8Df()3In}24l++Eto6}4=gE!BfV0CS@|q3KF|3K(4F;qaPCT`Lz+>N%6W0cFnTT0W zi;9a?+e-x{wEc3_;$iRjY#*voHUfMm4ETC=|@v43)UOZJVqBL=?*;Mx49`HHGYUwy;5% zK5g2vp*J*qpevH#DK5nHa4S`Kio;vChS8FLKuKn7by4$io5Zaa7NTWQD8`UQ ztgjaeI+j0y?={0?KxnYJE(efAUwu$NwvdmkRFYWIDY5~ z^$BuD&ux%{(7fj7wdr9XvbvCL)^6laMC_ordtX?1Sdh_-t#)l`q%2%0_%(D>s9m*1;`5hr&5nw2l_2zJ0MZHY=%*t{1hih++@ zr`_j!NIOJ1CgoEI4D?ML6CvBW`@vmY7Su6YMh%o3WkKn}-4mP-?7Ovd=XVpyq<*9D`bh3RKATluL$Fq_`DD0)iV2ZXiZsgCv-r}HounRqTI1A z_fxB#UuU)KRPh;v69<8B{WlV+MbpDzf-u%+l4jS0C^7wHJ+;jc7paEKp8to$#%M&_ zy9-rSKkn;yIz=qt4L;#TRG8)Aed!XE-`8{puW!TJu}URcpD;On#DyB$VKxRx+BJ$c zUu_-GF=Fh^+^iOVQtG~wAqW0L9(JUmy+cRcgRLFkShYHJB0B-mSzQ`iHy;E<+f*(n zvdg)63`Ev-YNr$Nvyb)7HCpflB$NJ6VI#XZ(r>9t?-e7&K8d%H+CsCsM4X4Z?2owc zQazYWP!QCv)oaqKYJ2mWIN-Oh5U7wuf)Su+HLaw~wR>Qyb@bYd;h1c+QyzqouxG=O zgLV!oFof(9oVojY=Rqf1VMZ@F60xX#bmbGuQtAy6j)e&U;EB$GzgRg8w} z-J(AS^80j)4olX6++cq@+KuDX+7fw<_UCDD*O5XEFaykRkj1MdFXES4ahRa z2oM&d(zFa5LPm>mHv`4Ni#&f!a{eitJ=AJd(-~s=LBH;ip07bOf#(Z%M80?xrDTwS zWz;B?02H7>=aTY=p>jj9bP)SDVKcvZ^JZZlDO8-A6$DIOn+D|PGF|pO1~3s!Uq)(b zEFmbNh$7nTo>S5?{frzTDO1Rvvr=y;?@@9jq}L|a)u6u;fFwpY5AxcyZ@-Tb%s>j6 z>l-Yw<`A=VCg+INbErp!9|AvA>>D$42k0Ad$f&OG@t`T$V~+iZU;=fyuhrp$c2)&1 zcJEhosbKI4)pJ-466seR+NfrCUpSFfmu~4S>=U-YdeOLCg7?QBpM*LYuLHcSJi^Xn zs({Co#;W?9`z{!DdR_>JcricTLIR_6dWo>+GtQi6ZEYR2JafaH&``~x&-Chcx;-Y% zzQD~)7~vsU@GQQ>a}E4DNp;rzbo`OT=19+5{~sX@T<>s?=ufsCKXlC+Ice(Dr8yIl zGIYL$%@MGpy_e4MANeL1ew3fO5n5il`$zH8%=~_{M#pNzA8@f+w*KEt5=K{S=>5+< zqlgW-G<~mE6Uop)(GTU5rs*#4H^gT&TiBnpSs~NsM=J^7%YBidqEHe9z2zC}ar-@I zZcGt&tsDf;nTsGq&&Y3Cb#tTkllz)rJ~{2r3x9s(O!CeCYO(^{8yxBVjg4sY5%+pd zF5A5!rRBbsxXFS{d)}h%x}TkWzT2)o)O)xsB-Tj8+DA_thL}*BiF#Y37D3;5d}KA2 ztyr<*W=VVsSo5&4V~?fdsV$5%z_rDAEk?%=>2ZZ7om{=3{T;D_SBwLhVmo^VghA|^ zCCSkq=;v%98=r*dAUDr1Sxl|xuS_d1P-b8gr`9uC9BGw?9#N=3kOK>=2>H}wj*j7h7z1<-Av2bhh(1t3zIHW30d6C2*+juvaP*{ST4w>EG!ufvC`2b(ZlT zy`GKJ$Bl#E-Ngu4Al9&}c?PJDZ>Cj4=!q@M;7?zYJQZU7TC{4l^?@=$y)C$4K=Jqq z6UI#Xu`u)A6@$oIY1V)5-nHw~^H_;+QvIb4Ubzv0F37ly*}}}ponXn(Wf@zQ&A87h zG)WAJ^tpZ>LKv;h%US33yp0)>hbXg!TBFE?!;{%KmlUqiN@GOYla^&Bb+PQ}$pZ~nA6 zY^{3Yr2E{o#BCg}**T5sjNOU(uz>nD9XqnQ^@2WfqQm{_fiG0nuUHE_V4~#PW#`7D z?=&@~(4Zi4>pf*t|H$(m7;=Q?>1U7kzIbsrs3IoT+_;C29_8GA=Mc-KWcacp{UK2N zi5RJ>#c9E$8j6 z{^4l2kDqLNRu^1Nn~WONdi$}HUV5ClB|F51adu|QPoLF*k(qosBIDC8{^}kFSiz%b zgkdf9#tJhtM^qk{;FtNN=7HU^!6>PZ*~sf+!P$l2E9V`gp^FDue6b2~_v5A-?GOQo{@ydrsdi0)b)*IAm3)8iSV}w7T z@FUE*D)kv^!ovqsS>OwmON!QviAFAhAmg+678uA-Nw>yg3 zM*3cUms$4)mX({K#uvIux?Z-XQdCz@hvgAA*?}XZq(Z-uBWSNiU3&)muq6D3#}xaG zFdg>+GhR<}XI2dF&6fDbQT?AjvlAlV^HL#M5pSPNDi()WBV$CWS-fc~F`< z&dU9-pg*8=&sjc=1-_mu0(jRkIGJtTswhEh+meR21B}Sawe0qxCQiJ^e&AJ=&^$v> zLvz-aOFMNtzZTe4G(4hyxD-aCx`=%ytS3Ij;DIWTDoQ)Y1s zbAvt-n*{C}S1#Mo8_LjgMT!%P~m@lel!z&7lk~|21o2%cD42a-POHlEc|82(P-`H+4kAG0V?rKT6-RYXY9?TfuJZ*G-L*;(iO_P~*Ws?$ejxn}-c613@`XtU4G>VFg7 z3lL!_R3di~i|gp1kl}sYHw6OtdXv@?HYB&@f+r3hf%zOx7p}E;D0#shJS%k%k_uMB zjSEl44M*`dTE5&ftr|nPviLze#Y7A`JvJphK!2>ztduopNAc=dP5eODBKD!Zy1{7@ zuIySFV>`DNOXVk;z3MCxYl4_s`T$vF7R61=lPPEIV9@gL>uDv+h;-Z`eS2KaWj-V3 z={^}Jo%L_L=!hr}mxnhwlI6yRmr@Z)2r!xF8FnoHKcIs#`!V3A+xCO9v= z0A9UMPjMY{0>uu!oA$=qf4MUHOau^!hn-x~IT;uL26yQ1Z~(lv5A|Z2$2ynxlbauj zb&5-xeYBNP!fB{hVo%a@)p!k%OniXOhPbKCt0+46%HVpxNp zXV(+nh-5Jjm&AaMC5ISIKO8!c_L~u)o)N7im?bkza4+p1d;dZ$p2S2!I_l+>S9_ZB zI@V;gLwU;z#=W2e7I}DHx1+dyX41W+6c5fqXpX!d^}fqeqAKG$y1 zqe2{<4O>X7l{jmj>i2ny1zPMq1*Z4(C^}r)Pf1A$Ab&RG0<(#)BCN(R!_Ii;fE#A7 z1&yvnyePhM{e#LMdHUk`n>RpR%!5w{>xZ=z?nwMqWxTxpiaRumj!8nm7Xd&nQhaL7 zRtHwOMsqFJSaQaAsGj-N1O-p~9>`%SBLz_-T)oHv@)>eSGdeLG4*eoy@XZj!L&hghR<86+GqWp;lqTrKK@z_u9WB z4=xp8!OR9CU$U!wDT7)CSe+gZ;IM+P;`k`4L(6{1wxQqGqSxn&#eXRFVa{&+{LTjwX8T!xVYk!$3na!hd z7xs4eQmk3CM&Nv6t`p_hO)bDD^9yKCfdxT@f0b z@rZ{GSIsI5{m6k?U#coZTt~Y7SbqN7aj^zk4DeE>e-2xtg3S5{%n-p~bm?=qBJePw z)s2phPJ8EzdSErO2j7<6e`|@>@47khUt*$RlkOT0j60F;G^E_6^1n%QewsH$Jmc0e z96zSgx;I8W{|)Pn zMB-#NLrJp3+WJ0bGDUZD_IBEx)5M9+WDo89vz3Q17Q(40274Y9`{m=VtBYTOyZdy! z+wC^nW>dEeZZCmfGqpD@lfH3CR(+N>E$cp-*I zYCoU9un#VXMAQqgPN0{K{ z&7yV#`4Q>s>`RfZgz9`5aZ7kP^_Mr7&`_VADj#~c0k_}2T=CPrKmTj@+c#fQhUYmC z#+EUj!syO2PxDzgHUY?oCpUabYOf%62gJi}l=a2JBA)#gj|1i0Ta!0vofoyt=m5Ej+rU zq$IGv+IP^`fD-(M#mWm*F=9R_e4rfV<~D=%pl_eonvz=YSmd@v2DcxW4S=f|vip#~ z=jU^5S29Dh%Qo!px8U1{zn9ZXN(Uch<=1r!#E+1Uv9mhRd?iCIwk>g^U`bF6(Hyyt zs)adsg%A2*E6lxLNhxpE{oSt3IO_=8fQ`OcFM@YAHZTGx(X6Wx8YmR<^6|d%7(1|$ zi-q9Jat=7~A+4U0+3d*X;QZ3kPN0o-SbcbIxW!2M%H2NXiO)8lh%_r0hk~vB9s#4H z6)pG_+_{1S&FM^fFlL3(zE- zS`(WU;7!7EN!N@SU)iXeE8jVii=suF{sp>TQ`69Q`qAhXM0g7 zEQsd&1%vU#N!qvNc0K2ikdU+&UqLt@;P@pJoQisshx*|+s@m)GY32|qW!^d?ltWu2 zHod|tD6CBHq5FEZHHrdUE>0JY_laV24Dk#-kyxVvu$s_+@+c<^hRWVtO6lFFkM6oG z+8uF{0P0(iaeD4^#|2Wjs#MjIC|9C@NWZsv^n$vuQsBbC8^Of=59mH{5y-a-?qa`| zZelk}0ps#ZnEF}p)_lqG88alDq-$i+!!vg38xyJ0{xn^?sF$4Y<~Eq}yJ9m%%n0cIj^OS2XmLaBn=_nX|F!%?5}#>LI86-A!V=%=!r zQ|O>klMTYA)K|8VPW{<=rG8wzpyw#_=yJqCM;kxdN&#R@Oe69_(pZLqZ?o4qIeW3Wn0B z>ESzzkL9|vLuT}7BO~`~f}x$VGoQx<&kNHCHNw2HTT|ik8O_3mZt}ufM@*nd%prNi z3?|wdA;^{ppE%!52jQn86Ng5$IZH9izQ?Z_MmwL}*a&d-HxD|nV);3|hbZTpNx(Ee z@>G#2GvSFqmK=C(R{#JI;!qvG&g1#nL9CS68hbOkp{5-ire`&Z2C-zAsBnF-`Y8lZ z+-B8PS#;ZZ&5sfnT)G91K1x=yxHSQDw714QW8quW({JP#qyesdmn_rIiFcid7tk)O zO2m?KCEM@FUWSX+cxb8~G#v@ibdAHN71FEe!^Xv;{9;-QqRZv=I4V#+=L6l`^N@sY zvfPdrB8_qrPzmFf?lwDim^ZyhsrR1Y_6P2NGhKdI3{}ez36jF|MvRTouG{&7G%YBX z$s3_e#c;(h{s1vzZzKEkMr}9bZBys&+xq-nLc)<27nuehB!-=sd=%iI{!1iD zw6^IlOX=xjA3oe)o+)z-7ee~R7JyTfI-=|oI|sqyJ^aDdK8I=9p%7o`#(P~;x`?9n zqZ)y|@l^*|WJbbqQY&NF#+@#4zeG&c!s_Q~o9nVi;mj%dM|63=tP6B49qvO;PJ(AC zpXft0s7nm$%EiVPk(wuu#WGoFbcvzK)G3Ye*-`OT%NrX9MQ_ggp%=UFRF~niyj|C} zZl@}z;C#YUxg(=dHS(2P7FaBG?w-lV@(_%h5mJLxc}`wVXQxTQ(Ws{ zz1eJXcE{Vrx!=N1FeJaW(&5d#Z9BzkNWaka%lOeRY)hj|YO2QFvZyIl z`|?Sjt#1BQW9L5D@R}B%9NirYCXW*^fRWrbN|$f0M}&yHCHJhFL{VSEM#} zSVZGDi8`joNX;3XvBa;c24i$CUm(F;=JDFpmBs7cF<TZ z^th>8a`w^Mm{l3aO|P#w&AE5|FqOHN7u<=P%o_Rn`CUPzu%0w{{CvJ+e`UK@tvAyf z1Z26%pelR0Bgu->6zkQ`x8Kf%M4Ty+Cm(ymX?-QT* znDIFV0xiv%H!qML^$NY`78#|Wm(QQ8lXVg+25zbfTN%L@Slih2t$cgcq>bd~Kb`#E zR<|Ag>%Z|xt=;G0;nA|wK(m_tbC!{v)7TuvM4L-tU);~`WINPu6wfKbrt*r|JZV60 z=A?6BMiZBji)QsantMKbF(pZ5wryzuq5R0vqo>o?>zCRaT~hyLTTnXdFddcw}VplM!BNV?yp)ys@pUs#?5c z$r&sUFQAg0??jd4N9kS6i_%=R>e7*3<78RKq*V2GD-Y)7#!@SK%ghL?Km?&%H+B*u z8#Kimm~CFevh-cN6@zP4l{jemzh%5S^pl>y{oMVeL7nA%6uoJG8M6%rq53q+iV)&as?Ejh>U+_k@tZu=V;pNi;WsZ zJixm*n1H^F2)vkvvPZvu8=BYXFbNtz({0LAB-*GSy!ji~F;nMfe^vA1o(6XM1ybVq zjq@0@=+Zvmq8sSkz>8k(U&bp+Cr=_l)}+iSxfk=kjDJ)3eFn$2LTxS zK}U+sBy(Sw(9d4KVZwmWQG*x09Nv3Ba*i(V5aGN@aT%>+&F8SB?gIw~Gh?6|VrW2X zv28vw`xQe2@vOrvT{7 zR_d&&fCDw}_jV!;j)`0i8Kw;s4XUBbEeOAJXC&soWZBSmA)IvImhF45XnW%{gwF`( z1?EDhE)89=d;Iy=I|r3yM@5dBQIdDzDK)-_^3IfZ(S@Z|Xtmf*^SJekgl7Q1R&YT* zM(Y%~mTnn*`_+NY*+JA^3sh8+H%Hg6t(hP*c<>Cd6oHH))u+*KX#EcaL2~Uk!6sdW zbaW~-*|?3S+qMN&O9|KB0x2zlXAYglRM+WDu>=)Uc-x*bJK}B6=`s$)S__Y47Dhzn z)|K9?)u7}(a`uF)t71O*h&- zDJL;kP*{(G6K&h3O)^NKRMro*YEH6R8q>)*e2F+?;9!$~Zo7`p{8R0dA}tG@Xdi9g>`HVLcp^BaesC2ciI*U@(pjzBJeR4HnPxUS zO}YA0x0{>aWxvXx##H67j9zppZfvsvGsJT~_ezL=n-zFT`rBoCFH(`LPDtdX~VbjSYnc}g)Go*mF2t1g^g zZ|P^0?Zz3WSAD%d9mDq`e(;mO;=X~K>9OxZZ8ZuBTIbVObOJ8L542UoGAZ>_@0-18uOh7CGRH?z_)ua|*QCn(Z=dDGVa_q%J zbV;T#q-PCFy-z4>!4q37-yUv}`}q-8tdpo8hu!$jr@Hix`9)aoP5a`(zDCiZ#14Ln zPGJlZf|O%_#d2TX-8#;j@3%Wa%uIjFPYNNU(da(k6ig;yOlE!C^sKwqVP(?pDaQsE zqlFkY5*rC!Fv3SBN!)>o?{7A%Iw{wFo}hkiYP!6bWb1R_Qv==;H7we$xSgnEmR(!SP|!m^-~bDUQG2kbH7|iHzU4DfLM^8^nN=vCTNhiUsrMi`1z; zVgt#g<`<4Xq!x?lfrH zwjhK*LDaVE7^n8L?s;?$&9oj5`g({U`oJjYCeMS4+JfBx6< z@%8S|OXC|pPot29m0H_t+ola<02{PH;;8kIS@P9&`m{9~P7dv?`QS*@>dE`qn%!MI()tkHP{B-1PS zS7qBSWRz@D!^OY;{9%lD&;pmy{Owk*d9;ICUUuIOd#ffoQJFxc|2&bQ;hs3w>QO{m z+|}R}>LTCVf8fAqJbG-ZbKNRaRL5maejE%6IvPvW0R|Hy8_zwP>?}&e@KD>eEQT7N zNjU1$(j_aAbP-HBsJJZOnI9%PjxF^ZkEP)jzD(hY8b(Eng+u)JdEauH*2@f|ttocT z&d#pkTb*59{b(=pe+>N6;!TDE^s3+2YtM8pYtH0KK7MI6(Dw8A$O}&^w!C=}5_DP1 z_XyY8;;DkDV96rFHF{_Bxmh~c^1q*dtBhTyzdL-4n9B=_rHBDzGShHy)UGwN<^2TQ$a3LJ*Q;vm`#f$3MKTQ-Fx?57m?(D z-X>vPX;x&$y2jdfjfsC1XgMXgj`bMR&t9fD9y~YOH4t?a}y7xzq8bGP^^xZons+i{~UI(}5pd^#4+}uNFP_JGlZI7!p zmR~2}L~JW@Z{T(Iy&tLN=5+b}k$sq$`50GLAP3v5EvWa`T#~7*pNU&@l`}|%4+5FAL?iU3;5aN_b4OlFHvqrQyYX({|YN5GQ&(xh!^R8+`koV z{2p1~ex-Y#HBF3)iaPf72_I{}+U?BDx8G|>WtonKrG3T`N5_f#4O+Hr>3;mSY3f`~ zLRa;G;ZMQwersa&?_0~AtQxmRwu!i#J1o^aCaVM3AD0!y zL`O~9@JXAqm-jsSFxmHQ3O(Z`(eDAS<1QGv@kMUbHpW@J>xr7vB0Oug7{#Rsn;yWi z(N~U#Xh9I?*ZJaSa8}zDdt?V~LyyR6pv&|U?V`#Pr`>KJp;i^LvtE@>@~Pe#e^#+g z-kfds&VKIu4?36rZsWa?lt4*m+_y9Ar-OFy?>tc#PtPD2zBkXUwr)-3eSP}y;UYr? zy+2anB)CLuoIMpDW8$i~*4i(8uafOH@UZ+MCOCO|n%zJeCg-`j-=R@itskgU!^&$v zHkdJE*Uyahu>rFB*!ND;>sGY=c6w8D88+Y=5$OfS?C|45tB+@>vPL=9P}$v zmY*Hyp8w@bFu$Lv#th#Wlt>g|!e{?(Uivqyy`eAibeOz@UAF5UX|{e8R-PczYa>>7Q+>vap= zCqCKq93HnIJpX*E_Ch6Jum$%A`W}-utW`XLnrPy=D$a^YWCJDln%+a-PyuM0Z?e(! zThq`e5jc}*XY!FP8HGfBcL$r-B_9K7BwF6(Ci^*Pc=;Y&^yx{K`^^paY=Zg)Jw6>d zz@Vcz#gZ7MIj^LD{?|YM+VP$!s?InVt_hryG5G}+{MoKnT4rWJQcqG-Q@dxobi38W z=j{FgO6$l?zTBZ=e=i3ukY`=;RBFAAt!*I1ue*}%Erbr<+%Jzki38^%UYVQ;+_BYC zp=tmcR}_tl(A{YB|LXVM$TB>_-R#KA z4yvbpkm8HlZ&Nlxr(@CH)1&Cf^?h(4EO;_Sqj= zS^Cb1M5IZ(JbrDzBc}b-UVG2$r0%6`fNcmqa3{wP?A6PkIxhZ|x8<#!u502}T`MS0 znm(mI+=c_3T5LY0o=(TF0nW$M^c>L9`1)}3a^?L85B6JW$APNhTBPG*#yegJYw+kU z33Ne3m!4;Fcd#D4^u}e=5@ZX{&rXOBb|o)lDuoo9?QL6C^2X%G)^9S?6ck3$Pa~6m zA+{u9il17>rMgUoUX<#80?z}BlAGbxCbud=AA7KDUJr0#?z{B#^i3LYJd@B1ZG3%Q z6j_s%Hj}$VWhJ}{o_kGy_eE({zn>dF2;S;Wj`>-7Fl(Zj@rDer_dYjJJ^~wt)j^Op z?nI9RlbCh(FuXm&%T8`yt!Zu0a4D%X54M;*clX7!BS5r=gy-?+2R^eYN*jf%a%S)7 ztlCUqAuPtn*GxHRke64RIa$6!B&Qa7nGVXC2NHp!-+q7E91!R9%2%5-&ifur4!YdJ zy~oWNr$%fKjE}glVAT2NA$;Ft)<0+R)2_|Zi>vkOqIb?HT$ZeR&t>`6(4oJM>aJ-- z-<3rRskM`(MNID0JurQJ^M%5LJLBb8@Sx;G8N0%nKQF_e>4xyL>GaZw9sDut0|+zj zJ7KM(z{ggOOpU#~=84nX+LgBFwjPDQ1+tom&{{+W2Jn)}Bt5!xxhM`gpTFCQ6DKJ2 zOAEBhT5sKUuQJ3_%n4FjPOPC0>T|%EjHQP2-Ca|>>s6gZ|4Fr-m0F7f_L;)cBgli# zez;4x?N{Q_tVTcx+)@=M7)LWlY!J0Qa?}NF53g4Ah19Gd3@2gR5{Ss{(O3EL+*`=ER#P0 zR`PXzgu-W0K+MP^^{(mV*KN?C%{ROpY6_P}x^6s^2FNzRzIeMX7*&6RJ+ZG281P>y z$+?Q15%O*7C)4_EyIc29(2J+?6iV`VwCnivzg1Ob0N4T?Z15oCWtl`$IWi=%^7ere zud$%430t!GHlp}c%Yu_x{i(=+RfV73++7CH@#0;sz2mpBwMU89QK#zC^JdLH0Z(jj zcN_T0ZJ;Gdzst=IPije^YQ^YOmI07npn(Daxj`{sf3{I@1k##kF1`fRrv(I9{wYk$d5n#%` z0%_uo6b6Re(}G`cIeBu$Gkx$ifU*r0i?1#f)pa5LqF?c=mhB(K#m(0`?v;y>XU^QY z?tA7To0>%J3-KHv@|_iU(^bTN`9E%s(z$#xd&kEP-h;Y!y#%5?3ZHTwP6|@ZvzM79Btji&N2e(%kE3h0sVr$7-B}1jNP5_&$BEB#v zAsVgJGaFwS*O;i0#ExB~JrZ3AcyJ1g)K!3rKx*Kk6yKwT_8<~lMJSqAdv;O5CCWE? zs7-wXbpo6U!`?GrJ0)uaIquV^Pd%}#kO8UGKU6tYyxp24N)S;(a!&ji>{2IPh{J$eX^7~j zchvt2Rr~rr`oPb!mSZaW_3Ec9RrN|1_kM-rUk7~q6P~EZZFHT5BEQdDs^8^be_u^tCMy*t`52T?TAz%Otjw$ zd6k-?z>v>->ZH!@5njzfeD>ba^#0nHy^&)kxQ!bJkE6XV@2YSkRLD+Uwq@HkQAMh) z=F$d`A$@6J))Uo4IA>d+oT3=P^m7om3M}W%^D%f@j*Y9EE4*T)S1osA8T?B}NdLRT;QT57^;cKLje?8&?G*> zO+jG#qW{>RK&IWm&78X;o1-@jvlx{WK>M|AN8iZ(_;DB%hDr)bM1VvN;v{?yQkUSu z2&C@|Mm0u8=9#77OT>(2+a9Bx3*8qgSNkMq!x8e9{fX{l1`m#TwU=LrVQQyM`{uu~ zDY=>=*EqXuMZ?;2hpy~wWay6u(Hwx*Jd^E zd0!>wb|*HSur((Sm-4E2Qw&QztV%M|TW@%Kd$U(zcxIICZ8EUGnL%w{l~}P6W@!k? zdh8YrtY`^UFyB2Um9^u99RQl2wNn}tr}qFB?4aq_UMJk%kSjZvC_VfC9>W5_J{(Uo;BH^P)3eN zT{<5E(Qnr+OC%bi#}O8v&zTIGbEJECt_{y_($&*kV_u>_l_%0g3_F>am1RJHJ8d~k zZ4+Y?x0k=0yyh$Se=z_+a;LU!Q;=y|0u3(<-okiU$?LFrG%cExN{(d}nvs!X>lHBO zaySrAs}6<}jIDJbhDP52j``2Zm&-Qyv7JWqp;TXyde+dJqC|9lQiY_{(b|5FVEBUj zOjQIAKqyN5Qx~;I;j7grl<;UBJWMjdfOIFFwIeTe?~v5l;~7l`R?eI#I6{L6%Tq{f z`G~wpE|(d9**3jhk8y^Iiw!+^#_Qm61f|zyIdSnK9Q!&dM0ds_;O~R!y7bYqo}`qb z0U#Aisa#=Ntgw0^%{wK-&$vn@az)$!IA4&4@_g7UZGqx#xWP1*>5WvQZder5^9j~` zI5=oipSiD5DhtvV=oojVlTuLM8dPto1Xynf|0`JW3DyFGiA&H19~Dk*+Gm}205+tL z6*`|6J5HGR0QMDOyf0Mcn% zahKn6sm$GhbAYTcg}^eQeb~;jhrPsjN$Q!B{51H2bnKBLB`-V>=!_aZd@fqN3=;g- zT>Yj$BWO%)?5MHzW48ZWP(^K^$>W+(*{Xf-3kYwfMxaBGyuUXA<0I_-LyjMm3Q4uGB+Pl9&*Im;r8PL|hs>jBZC!9K< z;Ab~)Vi0Lz6=jJTfZ!l3EUq(OD+C;{+iPskQOFjfCzyB)iXV;2oYK4H8V7ctg+&#o zXCUs{Z-N`2PkATIlSLCu12*z!Gc7U;22w(Ju)tL&fCvS3G+U6df(z@>!}wW;jve(t z2cWkmq4Eolh{&tCm%RYMTck&bGhy?f7dR=_np$c!X`b54A8a(Uh4xx0Sy>HozAg-` z&@8O3!+%Q{J>O_9?hVGKotP%{PKF~t1yd|H|E9eqPc#{eOc>n;`U9-jqat0!D{j+)@VqgwqxwY%S;gj+wjjyy#FY+;* zG;P|?g9YehyXT({>-S0g8Z+!?H}yCI@0VgofyaLxGDRA=9)u;>XoAw3@=g0pa~e)U zDk6|FMby?;aYrb3Aiuy#^8PsVwIS+2w&z6~I#e4+@r1T__dMGJUk3qcprQz~7eqLM z%iMwzIpGgU7XJVu}$I^c51ZYXC zIH9MZ(9J7wQbSNK3ZjP(9~zt9qxm7k`3gcL*;myG4qa6B)DPoS%awkeNh=iha8hRz zBL{i;+V1{+3cil~_2K_{d;G8B*Vd8E`QI7(Z9X2G()vDMai>glk( zH&K;8jEn326QmTfHYy_>v@HBBs$fFf#fQvIzgPQZnz-Yc7~}`(1xf|LC5f-bizm0Z zI1tsCd_-Dp=JSe;*ZW$4j9_28q`KYqynz9gJ#EP@T7@wQm@iLo~&zX--$N*I^g01*u^NZCkq z6*rY9dR#X5cv-lm$=VY45dB5%92iQr~+Y-Mn4tES?o*l zot7H7*2LQFn-)-Xk#1O+_tRf3=NVDztV*`;!uy{8 zJm~-Y*0=QY%hQmN3&@jM5Wm%c>AI-!1{nN-TbG${vHblm{^PsvM0+A+q{fkzts6aB z5-%c(pj(M-rrZ%x;qXlJ3$A~0r-{7+EHPUDx{tT&@4w9=?sf97i}0_%_tODzmybJt z{l?>a6ct6$jrAett@HXQ)qV~Wg{-$~Q;CWbV66yebeA<3J4SdS4HMKc#n$}kjddKc znX>Fp`4{Wa_UGRiqx3Mt^!HDn(ea1S4E+h5mct6Jld9%6Vm&|^{`1S<@3ue&XT>67 z{4^dd@m=83-=L>NQLBM{MJi6{OHry+P#y=8?vBg0Q&`c@;`QpRO(jJO4vqTx7woW< zpZ3qG*`YdQ;}I^HMCI?9IxnJ1jS|y_OS=7fr+2F8AGbYK{`D(4H~71qu*Gv<_yWjN z7pF(>+&Ry!rR0RO$KJ85{qy4|Dn!V9nql+8IO4xTlYlulZX|`_YM~!hTKeH9pCf+4 ze2$s7&_BL#vfjpe3b3 zH*$kMY6M|*wHc+AqV}&>zGHCszplxS-v9Q5e|^QtjY5lzc-^sqf3fEE011`*QcQ!2 zf2bGB6j(HImEtNPK7L+@z7tH@Kmo8)DL;P8WfcsvSWCF)N64A#SiP&sY0R6!8!&Ztl@ z?YD{(o9(YMN;Zi)JlXg6VR`*8X5!b|`2FvgVLy5JOh_Mr?t81+tia$S07wQs_v{1l zi-VS2r0JdSgswRVq07^U`;AJTA3+ukJiqF=?675MJ67GGUt&3CAo+9ch7NQ;$oUF= z-3%=%N)#<}a&jy=g@S%e_MPtpn&gj|ejh>)VAZ3ZvLIJhn^AvNT`w_BZ|?raM(sK3B4e+Xh4bYQZo&$ zb9*3WAC1$zQw1w{izuhISGfK@Ec$;6vwwf@l9*uyoa2d^G!s^q3Y{FmrO|vUPy$8K z8~a@oyak&+g!Ig(-+dc_baK{p0GoMj_VLf3KTqp~evCCWxe|w1bylsTmdL8<`4MwT4T=r_gr=xICXPTFZ4>u(pgpb&`xC6OX@40wipd~ zb6&9T0-OTyKP|N}D?*np==s;T(0?N*PSoKTiUI|2Tct%r60DsjW)v^5Z+f_FaPP*3+7oe*P287(k91Sg55!W*1^g?A((msigA2Dx3 z_GZ!3;LPAX9dkY|t8sOmz{QEBM^2n@lhS^bOUURB?Lv7r5=)NQ^4mZ`oOy0_4^_+i1hPcV@3odQ1#uYF-Y4sEChF1a_9-gyf&M)o9VSJCK5f z>mFIEv_M3$MXyb~qDm%gD(1%jo(w@aBLfRScqm3w<8u16_VLmXfiwQU>b?Xn=lpHA z8Dq?t!9+-#En5+lv}iFS5@kz~HcFdRT18rBBeYObX+vadL22KNHkI~8n<&~#X`@u< zx}WDMG2^`d_q^}_ocHvZsXRT)Z~1=j?|onQbzR?Q`Y3I&E65!*JtWN@Us#oV*rph5 z?9IXBCCWlZeM$q(a=A>iNV4+S-8lMY8t0k~NL22^O>-^0iWo^eKVwKb5ADYir92Gk zi5B7F{Zi0z>EOKz*w(2o@P&Eq>q|i`(B~rSsx< zKv9P(efOpEuD3aX=c5q;ZXbB`8){6aQ&~V()?(8|)LJ`mk8QJn`$WlGi4tT+1SODM zmPZc;p9z*Z)V0M{VOQerpiYeKgHCZ|L;wrJU!vBTAPcR0m4~fJAm2{ zR*r3V;8m{A4x$c21IoW*S55bX#-M_ zavDiOQB;Nvs|e=_>fDP_kDKp0($TqI6!B8Din?G>(fJwM(O%!^InDy@Q4P5?gkLHE ze4?xavB<)s#FTI=FPd#1gy(m(@^Tn@`IJLh!)=8wB(G#<4nwy^J-D zYv>`UAvgsMkp9*og5w3PSnJ9WbM>Lr=tlTJlkXsib$Pv)aY;x>1Nzq-Ax%4lgYl9C zq|uP{(3rf!sC2zb z#txGvt!PM#Rhtm1hSh0v9bikyC8PZ-KrZOO0*sKh2gCnWM@KlipaxveIl)n&$U`L+ z0z7{Ut^yIENrDB1&*NL8&`BW2=LhVt8w_{ha>A^rn?KjOrLi&8*_n;O@xUHXNXGaV!DHgQvtfYF)EUa>pfs5)h?nIVR(?aw|`QkrZlhDH+y z4tw*1(b#wC=rQrR%=wnRgo#rz|25&e^luPE9c+cMMh(Y#AAnZ*x3F|>uG77by)pGE zKx#V;+c=<=6PlJQH}Y<=h7C;TOn^~vNgTZbI8QXdE5!it6m)w>D+cZ$5QYvV&q9tQ zI+-&C%PT?ZSY8iYo(pLNM#NzZMD_jR$mnol)CHrw8%+)eY_Jq630gxrmNkNiRHk`G zV`sRKWXz7lKKO_}v}seL#tPy4Nb&oEM?YjeJB|B5lmM{!^1O!t?`vgdWtjl4%-m-d z-mxX-pbx73r`FF=dnq|oAE@#Nhh{rMKe+iaD#-ZsRwBV4#f)s%9c zf0+!Z!l4s@d$I~kx(sGTCAc(;Gxf$3Tfj}BKyj2Xa@OR398z!>RsAZ_H% zLK`8lWq-_@Cd3JYmO((gmr*_&LndZmgx661i5$?BCs9(Oe>-V5JHT(y!kz>|oh*9# z`So7_6zsmi^IOrc5*b7ogz%@_wBQHurTehoR0wis2F3zKj6p$AIMA#HJ4CxE)r!;e z9kB(NnqMYh@>}SR$|HL1#vB8vu8gRm1VBL*DCSy}dx;5qaU<4Mq2Y-;mRtTFI!Th! zxQ&pE3ghg~hF`xX1w|S5A}RTR)-F-Hsdj}ZE9zt*9BobD?QFa7D&{ zOQtU>DGd0l(D>vQ6cljAPP>w%0aL8C#43NrZJu-$nGR6svDSvtLa!Y%eS1RNpyuW3 zfD^#VGTQS?#R-#x#7|cc_}2UxLwM~`9yimF=Q^a!8xr2DZg6^824C* zh@nDsnm5SSft~7C;ZI2^p zDOEg}b^wgiYwXwTqHw|tLS8B=azu;s_m9ooa{C48Z$%`YwA^%rN*94rEA7-kA1-y{Y|Ngv#4 z4o5@V7xa>+x*JDkgv4O;C|0W6HHDT49VDIuN@Ddo1*yi$yJZ53Z@aqU&aMBEdFx*B zjbQ;3;wb&fw+lqrVrUg0Xwh{=-JQ)b$FPmq)>YuYhW3bv802x{ey+;xBiUu>2v#p@ zQY0QnC=BHaKGAwRF=a1WnCplum$O!>kVuIXaFE359YHS*Ibnct5C+}XUw;jovgr=! zp1C&au535g2N`Z;u*}}~*FmEWS#A5JfrH%j0*a)B=`(%I zZ}pgH#kQFB=8_dm3UKP{raeRuu*FhR+YQkFF5o8Wv+}nf*IUOMTl?5QQVSPrwveX8 z-p=&`0y#$2r;1q^?||r+ZplGh&T@nhB|TW$6rllaJoj5LMz}&`FzcxCMznJ+Urhu; z(x#FmU*jRi@||g=*lgl@Z2&rmkbFE^OYPLelpPGR6!5we!+jNf08Cduj>p9#S_N|N z>j;8+NvObD;SU>Hfh}!{z_+`D_=^g!s@X8~t)TPX6 zbDsNeYugMroHMpU_^U{t`5ft^+9$g=IpAW4-lydXWkCf5(2$oEM@?(C?~HHSlVoQx z4dx*v9D`&!6f*^i^eu=dw5f$?vNrH5V#J`Fq*`X{)~%lWsG+jgM&dr5fGiwK=Spha zVMW*rP724YS$cUEP;+1{IM_>u3+UzF)r_~KaDpYwO5cO}nh<9`YKA>-+rtX&60l{X z(MLe=qik`PNaC`@>EV4JHnq50?@Zg zCNN5QaCXkB!(5;>-T{$&F;wM>#b5%P@@%VHTzw!7BnF&bwwdV!zG<8;)ga)aV4z$? zkc?I{>ntPrcyB{}y;57v?Yyr=K^-~#hxWHqruhG*Yd(9;Aob;t?KT5g-%rA4aNnb0 z@)5j)mN6AHd z5j#0KnbxIf6}t_*1bf9*669XeO)gQys+Qf&w@v)HRSSyLRbcq2-rl_lVS|K9B-}?C zOd>4e2Sc1;Q!QrtyK0GCTQMeEUYx;+<)Nr{S{}|rh#|2K(oe%SZIPiLlPYn5y+sQ1 z{eH1Bm3z~5!1tdT5g+9j463`rSet6YZh84XpuV_?OA0JwI}&oMF_2~k4^D=%leKfe zN=HCfMPI`9s&mW2W1q6*&UkoKK#8RL%}O(zI@y5m--en1JWRo2rdb(GY71Bba9A%>gyfIP0g5I72@WIm4BfdCNHy@G z{h&u0huVvR*h6mspMxT#!OB@!}{H;Z`Rs#>l+U;vhtYik8oj6GavHVc~)b(Cog{{yK6GDf0a8HeQlvIAJaq7=M z6+Q71qi@!4Enfd7DFoz1E#moN_E1xXno`tt?RG?cM6xDSt)>Cw#}hJ)!P#i%vBc_D zGtSEz($$bRfbozeH}pcy}1jXfaF2EoQ8dk9N1=C0^6Q7H7J zwmnw^j%^nN+e#H-Ap8|=uZzMJrIbFD$T?V-E}^(E{bo_<58r)P2*+w#uwPdVZ=pG? z?<$8CD?Xtg1*K~@^(K2Stod=Ch&)C;bsIpPQUG1B?^2KXu?}SOq~47UD8a2E;0&0n zNG1+;C8A$4%u%30I{`dK@^Q~OjupD!gk)x95S5L(P$2UdYXdYw?n`nLNb{btBsB7ukbEH+OdSK}b_q`Me! zpU8r-lA-=2`P=A+COOboqx#?|6YS9MH+8O1K+6e`j))3_bZvfFn0g6EzHbE5fz8zb z4%e*NNi{BfcOrpGv>~HX>#omG1>=j_a|klH#NR?6QzKE4kukE@Fc?d#W^FK;q5xed z_leo4-ihN5BfL@+Q?DTz1mB|h&$-$=F-uWr-B=l3iC%a^5dR9W1X1h8%0!|OP3jmp ziQvF#2)P)}D^X~44@J@#I>!4TkFMy?8GwNhl60mj;C9052% zYr&Dh`*g;bATW~3f-WEWzTVIfVVKf2CptJ7hk`Ae3k?7n6T9^;kYLa2Sgl%t@mvCX z5wx81En;Ms1F#HcY<~T6IBBRONqES<<}&d+F_RdIJ&eg8D{3L6Es8)xBBI?Cr8vw4 zuHY(e^TfFAO`o;n7I2~*v|>Y>P{^tQI4i-@<~ppnH&kgJ4s_nn5h%lfT7*gx_H}0F z5+yy*Rxg1jvld+~G)c-jFXI_RGK3hx?LML0OSWE&>o9zQxX|H_&C&!h1|lL(E?mzX zY}JpaW}1WXYgx5JW9OL&K((Wql|q zNX6@Uov5e?FPZnTLONhwN3`{{UcA5z#k|1o>n$kSWxy`h6bn!WAo8E*0cs;ehbN`_iSQ$BqqD%NioIQr$I( z3}`QwS*si6{uP(Z{&+r}M`9<^%bft0Ns>#cD3E3H4+8DlH6BoY1=ZG4a-f8gW}@~X zP}*=*Z8hsSXxj{Q^swpXMRW`d=Kka_gaL|lyaMHr`TKeAknOjkM|8ou;Y|Xp8*YPu z|NL0NvCx0MJ`#J{UZGjIF z-u56Ju6VH$tYnRwvoWSg0&egH+()-B%WOQU86$NJOf6Rt^ zRrL^Rk|m1Zip{VAW(;<3cE;Wr9+y*BUoRw-U+M%tC2#VQ88>SO@13aJtDnc5ICsJ7UJqqdUAI z9Y>8KG6?a?UJyq*tNIX*0Uj?=#AG?z+tKiq6{r^>T0r#^2g77@jts=35qhj|Kju~m z19Yq%`H@xYpSJvXUNlj@vwhfNk5`QU6r~aJ^`t(rwL_ zeBZB5>iSD2nQx3^mp1(S=OA5I+Ffwa$NEzngyK)We*h?02w;>9<_B!=MBRDe=w}2& zw@MIZzEZ(%x*@=B9Ta?e3W=XpT7#s#bhIbmB)H!S2j05)3GB+sa%ZDL)>wBN%z z=GsRO7ak9B(iN!dXDZp*Bz{4~M5{Qsm}EKQE;NPtf@36@q~zQfyB;c&TxHJ6cd2Rj zP;Wocy)TiV$;M{3;_WN5O+hu`4DvAt<8{vVAFmQTl~>lR}? zJ#a3PFY&R6bY06WKk_8IuGrVrZL|?cXr*bCl6rcK^UB7j__r%kBR94XusLhK(0D>> zcV4YehuQe`k_dpvDEP*98&B6u6S zbcBp2rOQ~n3+b%^P-PbLXpK!j>Fg@JOZALlo$S|VZufl*VOwC~17%kUi;MA--53d! zjYsIe8V|-sE`?qC)3f`pfUM3x ztkboG@n~AeM`1|zRm@Jms`05gppB4mdp;*;^H_b0`MH>G=oq;6V$Fo;$Y+frx7opI zhJp_(J&-Ooo6gV_j2!@eIyX#U@J@Jq;;+)u z2(jRF%zWv{6$`r$4`uL~%Go_1yQ^#-*AZEL2N`Sn_#Be1KT+0tsCAYt^AWx!pH*~x zhZqz4^vLR0Z_`T$$AhvR|0a2PBjn{Iv(tLVyx}-^=f(0^puyoOgN#7IhdHN??vR|o ztS+qlR%>f9C~pcrtjRC!iCDqG!=r>f(ivYzJ^na#>J9*NYTlq;)1PO3tiP~TVxt~|=+#;YubM48x$c&= zHqYd#hn)gSzFmO#`@oR<7%XRSj^Dts*E4@QD-;5sEdyzVjA79QuavFp4EEz*i)l3W;)rr^L`7F51R`#T`Lc@2 zQ(98%Sz zC>kK1XGagZ(TAhwXWq+2Vy@_kZg$8v3l~VZLL9KMxPp(@RpgPRrmBD})22TC`_rZO z4m|o=rYBF7K(Ub6Nds3gRK-jxPL>5!$Vb^eJ!UP*Jb;0V=f+oV=hMo8XDdf-?WH#q z^Gix5e8+ssq3gK#qyYhb2m{|M46P+U<8RKV{{jR{C^9Mc(KjiEww#pRA_-I>b%F21OO%a@at?4sn(dDq*O)kHu6}!Y~F<8mabSo3W4j zQRVNcy9(y}0yNnP!bPcQ(_1cWEu@ojBpQb5M-@!qkj&k&{`=gdx*MmDSDn(*#`Q!$ zZ!h?s2q8q(LfP`H=tkoS)D0b0z2S$>!1?2ZL`$+7eEJwN5X=&C^t;j1IbisG{9+ka zRrO+*{70@KAa}kyDn+WPd{U7BTE~|;=h4-R7X8AApv(#OA_e=jU&Ch^BdS#0*E>x# zpFjTiLsQ)zY4PFe7~ovsmQ+qnRD#POotq+wWdUyytT=ns{?a0i{+;nhU;b7kq!OCP z8-9WB+ZDq)FX|q@Lag)5JLp5U!_dS5u30bzUcR6d&Z2zc7 zj88*Keo`=AYHYGGpTZUw4%-)F)IYGDN@1ukQ()1psig&rTY_Vs02hOzBeNU&Su&U1 z>|0Mw6!64Bn_iY%fo(&?|LTW}3sJJbQpqdQ7}$B=p<|o3fQ^C)%yfVi)D^{EY(qiM zPu%lNU(99W?JzkfFB>dd5(zb$;cw9J4|OEDlY@yZH6Bj5Lzhazb;E?!Xkx5&P0@?|DY7d>L0bT=hDD=X7fx%q?Aq2i)8{R|H zlAW={BsFM|cp@F(25-asEhs(?MnA<7YAC|LONXIN!p$I^<(qYz4UyVMkc*~5^ z)fg8tx8-$7&>?B(SzQmKa#|MU@SPSbb zjxUsm9_In!`ws$-f$soyrBQh=#v_MuR-&P}Rc^>ch6xsr=4*%eV@cxE$y#*i+ zHGV)^u-*GcF3~b1#s9GoXH#MO`#>!zdr1 z?$E=-s*KsvmY$V`P=5!#{Lp)aiICeA8Pyr5JqK>NM1Q!_#m$ZUGl<=eXOQq{H|)Vc z$-eON15oPlefNJM-U6artp)n~XyL2jgHjvP^7HnEtAzws4wI!P`MH<1HHHS18gloq zPz3dMcSM=ZvNv@=?4H|d;d)au5qwa;Qw>tIB|TY-;RpAdM0~#sU?MZ1JxL8cM(7AC zFfd=Wv>e~@i!?JicV7SVcr5+oa;7c54xKNiW&#GiP4$LN)oF6oT{&UP!PY9;K4Vkf zG|;2t!JWQ%BOV_fZ(Hk%BybZkPKei9br<-sq9>He2KfQTRZSSfCb+QVOTjL3`SRsE zpmk8M$&()>1L_as!=Cn50g2zA>X=NIjA-^~8PN0s5_l<;WuPp{OTnlc1$_N{&-IOlFY(S_bGs-j<8jZaX$8Wx=BR6Ia z*Gjmh0jneuBP}HiZ3-In@gWJMvjd3$%^iUqLDJ+=h_#c5c6CJ~kmk_nDuKP^?3pul zkDWw-4851@3J?4i$RmkHAiEKAnMgD-Nons%a1?p&S57UP%)C3Dv%ipi@(B}h@lqpt zAKV=nZu)IpNGUcCq01GjN1P>iauCUV=8~j%yhD^Kq=;pY5LVomUb! zK-E%gQv#BQOo=48E7afz9BAM=4I2J9{PElo$x{IMX`eTI_i0GvH zOHWV#(F5*}O#qfNR<+eZ#tou;_;v0`d-Q)hGRvO?U{R^cCpF?vnK~T->$3A0!+2qLh*~h3hXc>G$(q-bRR0 z0jpLdFco4OqJUE`lwr`;!iDxi8T#R3&}<~?p@BzY#}(~l&!D4!qGS9W&5A$ZGQGTFb<193HU*K)VHgFlmgkB&$(^oj;rKkWwmKOP_V$%PHe#1 zbOJNJ6r>J~2rrl?5Wk_=?WY3720<)0GADZ1fctL@uLp8*gR^(QODST@yG?Z-mq)R|mZMxa;#-~B*rIX3(# zg_~pI%p-p6)rRY2_7#cUx(AW^viD;rld@* zab zA^B$(H?73x8K~#rOB!;~(^Hox%9PZFX2VEniCB(aZRRsnkz(NG6LAW48iUBLhjzL6 z*Q$`}n#Vqe7hx~VK#2Dp|8A=R`Hyd2A9XJmp8^1)q;nrka~4}nd^p6VHad#nBI$BU`1?5WeIulrgE)V}61wL9Nb zq|BSE*VU{MG@EX+9!wN!ZNp^i$0jGV>80%ZkDSUXo;2$Rj^$TKzJ+PLhS$T@bq~67 zWzc-WV4^FcQ*rZGzk$U@tzK_r1-PxZiDK4(tX;e+=GQ;S|F#O$S=#xDRl6lqgTsg(KH5s8$|Z*TS#<(9j4n2jX6kfFSdCaE5SDFgg8J9U6p0 zo8rg3C1fTA-RpUn4gduqhP`e3z6Lw2?QTussNhMxgiEeuB7__TjVO}Y5kXqhPE7Pz z;=NpJ)UKj^8`0AS5evlBwIznbYHiPg8c=Rwz!;oxH|4yOp-aRnGxa)9N=Pjj@&=40 zxW5uk1g%Ipm=I*qme^Fi?wQ!K&decknFXo|>@~i#v2c_3-2Do=1n8`j$e!{J(49&V zJE9$iY#RdLCv#+qB{oGMIx1ESOWTy;$iC_nwU~ln3^ve@5BFlFiUb|w7CQH#GD>ri zBBHwVFE;}tnd$^`?1wmPKUL?UZioYf0*Rcr6zkTg8!NP z*1xeyd3eP__0cSr8iLIdR*W8)MmE@08(Ph@FKG zQxlYfjCIy{B}g9lj6$;3L@{&+m`~`7g4pLLa@UUHh$~R~2fUnHod>f`pn;{Jxhb2x zT3S66HO)-fXXG-0L!c>mMuTI3I8^(cp|T;X?82s9G&rFzI~=QhUpIr_ZxT0FMx&_# z4{ZRcL9Ovuvp6V+&?qG6J3wLT^s_w@bxdS6q@Bubr{GBa%i0^Nfkuc*t|jC06A7K6e@Q>$Pewt zy}z8YFZ1w21J3f}R#)mk5>fuu15AzBBuB6kl@|uLfMj+B_=yo1yIj~>hN4cEVV>_* zQaXaC5_k7!hk29dRGo6}td8B`2@L+oWu&K>614;X4BL1&eWV7Z6r?s zKvI>RcAzKWx<-Ja#1*WFWKhf<{`!jGg@^=Nz0R49;GJ(44oWxe66ZD-gr1T?Xlksg zhqId>4nncq-UuZ*If}s%BGH^S);%;TMJgoPBESSjN~GQjy^p%2CPs~!+-rn)GHp6%ONsyH^-@yU(%^7gW5qB*gVzZg(G#DddXM#l+}>y?7&3U|@d6^5C-$I>(*5HOe1lbX63}5~YF_d>b10TP+}DSsm0&dn&LJQo zQv6-MwBv_3i<*9i1+{i5uyPALxICPnF$f|}NbYKOV3sVnY89!E4&Q_lA4+bK9pvMLOVDM!Q@c^N#07>yR3|6ZK{2#MV`ub~ETgbb}!M(&0ah(iq z%4uzOC8q_z5T1v=k=R;{D5PXE9~iq4K3s#m6=2R44JjXeGzK_amb-x z4Yh!d8LN>6Q5KXfqJv~Hxq`zQklr8!CX|FjHgg-dnXw~jc_nOuERyqDqiUOwOmKFf z_(|@sGQpO(BAJv4lg{AHW1#%iGO5P|#OqRHuEr5>oxDhTk=b(&lUC3Zk?w%2vhSLo zq2etCO(`0S4Q{*=vbxM}f-K>*wwX$5k{fLgl3t-mlyw4yGiHcJ zTnQH>3h-dqgEu#iufQsfg)We=tTy-+sG-bgvBO%4F*j=R=6OR@MB8Y$oOtNlhyQSbFk<>E#ChuQV-de zpKbvfw{h(ca;tjhncwSfdN=Z*%*6$npJ>$cE*|lb8UT&;@WgaS-n|*@XY4R!>JP{aV}V3qmOM74yDW+omt_E&6CHvg{^^Niw{slg-jPVy{F0HqiMmU* z-jaBIQKddtXT%aZ)Kb^}w+PxdwJ@1FnZKZ;>&3 z@1f^=369zn&OJAIr1MznIYjFWrw>_9>DZsfzmF#(>1|Hji{E~z2iWcb)N*yyXr5?6 zI(i2oDJile0Iv*^N19{@;-BgJXzAj_)$1bt%@S5bB(&a%Yrb}F|8Q;G?SjJ%4_?3s zl-_9F`<3ECu}U{~1M;>{M^PALlaCYAL+8MvL|J?jBIRBCJ!)#1sDJ~!3g*zbUl&S! z`2+r*KGw`>!1(U$3Q%VLCI^I;n87Nft%4>gu=v!dHUAyddHr%QE5Q;B^%Yu_czyMv zYgex>T(k&wA?yHxTp_Ss&j(_+9Rji*3iJD*c-lcPuZvipuZfmI@ts4RkE@XAi?*Ti zw|nvH6xq_g(>#`20L9D8r|(U9>mBA<;O6b^t-tjH-|<%$u;sPJ-LDe|1Xrzc(;05v z>sOxy5&rtlq@Mh+zmluX5?8?&ryf25hV3|W3w%zDz)UU7kd;~q(PhI(rr4nvwlfe~ zzT5?3+0~+>FK0MqhYj_%c&U@d!d&&cI5BOwWakYYOC8cW*(e%(Mld375p23|?*rj8 zOgmW$6AbvSeaFMSjWx7S!`&l2Ap&65hGCn^m+!E5R*=of2Du-g0=Ab=+Pfg3TlB1p zQs%ULskX2%xi`TdUM74X@-l_H+@VG&F7LSz@ zsy*{_^URaFGdac0G!24aUK3!Mv%)X__U#pTdfA=c{vUMS{et7u9gGSd4l5fFyk^7R z6)JldsJy|*bYIMf_UMxB{(0|TuXd7*as+93@uGU9zHTV1kMuQlKa6zfc$u#*tof;$US#^e{<2|yER?E2Ur&?`dy1XCzP;!x^!3C)1V=2ARr4WJEV4QZf@-C zyPy+a;WJdzB0r%N^gaQxkB!-eD!J%kUG<`mts#?k8QOn_HOft zbnLsUo^hfnz-qhNqZf@yAKvD6!v!bn-0BogWE`&ZN8e>xJQb@r(*GgQwrYjryT|i4 z%coyZ;G4(JjsazXJjgKFG2Q-#tK3MphaRNJ#KX5~Pn$Hu6_;F4<#OyJ_w}8=k|Wi1 zBkM2{BaetEV13d&`e-uagLWzKmbJbUPksM1Z}94AzMQZE#GSl^8#k70hkAD(>is#v zMTqKpKzO^e=cX>0Q#+_;r&U%%?EkyV3dPE0eD zB70O-^&2sHSGL)ytE)E-tvQh9?Bdc4ehF%-kh0(c%ybD5lN-?Hbj3YMUwE3wvrpYT z2OxaI45xP+d5+as_!U6(?kIfluRrY2Pu9hv$_RRZzI0)SR)nmS6Bx{#9$rkX@CT;Y zv4$&kq%X1oyK|f<2K$8>2HL27KuP6+Y$YQ$b-07ZH2g;; zEwF1&CKCMG);>ZoUo@Qe*?zM`@ib!?HfQ%=_8r!EdRK7UwFD9I(S3{{_wMN7!-p5u zC(m!~o5b*sjPGukKPnLf%SBp7>I*l{7~WZtf<8pivuB)`RfSW660uGcd}CjC4l_3SX+Z-zoelxOhSlu> z-JZn-$^3Z=F9!sVR!K;ly5SU^1^VzDG$6Bc;sBka40(2^Vn6&j%7@%t?6BQ!J^F@c z;cqUAU07=Gys)$yI1YGC541jubasU!Z!g2;ewDV}%Rk>W$&JoS?1<5T(nSHGA_T>n zfASlQ!G@S>vva`BWZWeieZ%DD@71zVtvS&auHNL-rcrk`Cnu*F*r+w!u~C}yVwwdv zV5Xdz!e_T&|Ni}p7U?3h6^6vq4vzV{sN^skUGwhGu*8s0HRlGQKRXn(YFNGMa#K7EoiOW$)B;oC56+3LR1h>HjzdE2 z&|Gn-txT+3K}*j;NoTEi<_s?GhAHmbq=?VIA#oRzrB}H5&FaLYp_-9hMFYQ&b~9{V z&TFWus$ST7Lxf;kFL&zyr)3?1`+v88-G`-oSVnL&=jsBa@zX<_$c2_T*j)1H3{_Q7 zHj`i3_S~jI%K`@UPS;K3lq&TV`myUl7S?$_zMGkEVKwJo)x*}FpUtiyEKp6X*3cb&@w|qZrdiXHCJ`)ER;xsxU zZ22l1SMXS|xrM(q&OKxDT+N@@-^?zAyM%DdmcS~%8QL5+Zhe00FNqac=)IgtDl!VW z{exOY>Et)Vg(o)!UyB<`8c|dro}shQGViUMa2d+A_YQw$ab@uq1$ph_h4_oq4Ro`! zXw1$EewUs#vLB)oVdxw%jxy8&u_bO7O;lYRgz}*9!@KJ{;}%mIWMpjoKF#WfAAV?v zYj8ieO(>qzHlOQ)m>}bf5ERX}-7ZG5hO`FEf zejh#d3>fjuM`OdC7DWqWPMaMaN2WZF5|z%SoIu6){b{)m3mtny=2MRA}Qj%*wG#RU*ny1HTDY$S^&^72@&79()+ zq6$%#;tH$*ZnJpNHTc%wZ;MD=I(`%@SiCjXhdc9R=jN(d$IpgfJ<+=8^|xrJyCdW; z69wimtf+8pmhq7zuA!l!YD4G@o^x?Qq*=mCTbMg7MTwEkxo!{u`PHfu^%Wi(o zT3xUZN@eqQ#! zsJPhE4|}+ey@YkB3lt9fh%Mt~j!Jr=vyd6;dd3(8P$7Q&1LbqP$7+OIe6@ZtF8E3# z0MC_8urB_JP4@f)2ItIq-5srR9((1J(wQ|6_%myg_**3CtqPYQhuVb9T=khG*pDjLN?3C-88H`vU(kvzyai00_Gp3~X7eob(o-Fh7vlO5Cj!S}~T zmW=clJY;7d9d+utcFlZO@qK#BE4eL*I7uiry0Pg(1~%hirJ02{V5FviYA)dDU*C6A z;6o2s7p2XvJ+JEGV|qB%} zCJ_-U&$Q;$U)N(?r^27FFJ82|<>NkG=QqAroG>(FP$ui z$Z~DRu06e~%z37`<;HIHHedk0YYzUx991!r=sunUKABF10(N)Z4{6{JMTLc3S356k zzv-=I_6W_d5CC3^S!@dqa-U^f)PzO)O!=1S9xZhW_PY|p)R_Z;->89kZ`Qq`VT}aH z{BFT&AtCq2)7P(@F8l69GdfNb*AdCQ9J#|0LifcSQD@XEGM2@H-0fVUf6WZ9wiSx6VFvj&4G?Ze)r1Z!L? zyZ_+9gSc0o+jPOE(n!ie+nEd9e^+GQ=Jx@V(R8DcV_T{3^HeqqcQcEYG$;zg-O)SB zz(z4OS968r+C>>t%6Z!7<)QUL1zwvyEB8k)7lrps5#?dz2`AlGs)A~8*DmaU?)t3N zKD4Ce-BWYNS>mdyCME3rGnDjqnY{bfD-}ue$dL%%&BSN@{pI zVC}7x(;gxuWrkzd@3+FkpH>CKR1s@Zkj(n&@Mg>#ftSln=pbN*>~aEMXeiA9xs6f$#VsN+{aIP!Q{4Gpt=28vb4bj35su zS`jNiW%Vei&!XqRsOD!#cWnqjdFaISF-sR+U}Rokqf*KsFTWN89WJm*Pbvm)6)+jR&m%tx zuyjfI%~85!ht(m>g(oy3Wix+>hW1bf4El9pL;-U|N_Mg54kwB;2f`FlZq>sd!j(!) zni%W!N6I1{y~T8n)!JBeJ(^!xKW0hpG2qx5oyAzg!Nj&GJwg zqzh;9%$gz7yOV}VlpK6p))_h?5Q?^qekd5t6G*7p2k#a=+#SZqMAD`QYJ_@LYX8GX zy2}kzI}%iB2K#rV+j{cy!Lkk_ZFKk%=vIX7&Lz~iGoh{CDtJhfN>;#%u^BZ`>g0ua zV4tXW>C0sAS6aOxR2YU1_XK%_(h?1OmFy<}FRQKxh$|1-{HR83h1e9`$ z9o|#!h@4Op>_K7c=E68++v|o#);X3FYxoHDounMQ&*>a$)N_|K@M?meQ-37i!ac1kh+L_A{#XVBV>SPFcZB-z!cIQU1YtjLl?!U4a$&^e32zjmqkmXA@1%wT)UAs0N^N|OL zkuWZh+6^D>;Ob}3;+|BH&ujyR@6)Pk%?r(qG|8eyDhnJhsqQ1sfdDz?P9e`WjO7wq zsR#58v=WmfLxuKvTl3T5H+v$Tr!|jqkeYj>$~@544)ETu51rZpwX8Sz9VO_QgoFe; z*Z}P3#X|AcBYXr%+F6r`_@$ygn2LbQ{6(-r>X-Wqyr{W|`zIHb0uZPHqv0GtjY!o; z4d`Un19o&FU$k=rf&j*-mW3dJ2WyZ`Z)=&LU>%_8TEf7R-Z%RD4Z}`1ZxFk|x`IHh zUu%V{M}VJN!Eu!(*SUv^eNs4pAs9W>QBj$NoV^Hq!Mx|0n|$LPm$D@pen_*hs4l9= z!0pxRHcs`JaEITb-jiZw!n~E*v*s6EW?*R#-YtGUjV=m(Etp5B&yRf45~8rqlvdds zk73R!tScY7pc{4}F2F0ZXl-#7&Ck{p#Y!vDdMo5XC&YP!SdZPdtxjI67JlN5&-VjB zi#twRb7m~ew{xmNWwz*B;cv4`uE5!EV37#KGaAl42DFoA2&C5!{~78=v?GZ z19Q$vP&lzeeAL4dcppWSAuqr$ts4B*0>m&|O!{-&Z@m&$Y;16^lj$05~pc?(ksCQCBn&B#0}a`n43uQ*m!| z1VwucWqbVcx<`jnN6)!rKVgLfw|`h6t#L21FOOnr2E+hD5}~Bo7gzVURjj5WnVr#| zpu24KR6M2IjqoN-Q#jHdIvN#FjM z-A)E)?2NoKPaAwP9(YW_u>c6He7gPX8*;-fJEHQ>xkw;!7i~jE@v5DbBxZh|{=(?M zFu-DSxu%XzUF*BKsqZqvl96%mgV7B2O4RlJxM>7zmuk6AEwTE&se`H%=OuIPk^C8y zb8qF7%SLMU;CUSgWb@$*RX!&YS~F$B_mE6+BXvlnR8W2L1+3DvJY*mT(8EGT%?8{& zj~|5M79jf)Y3l2&T_2SXe9YXj$KL{Ab0&}h(IGHi&S7B}K_%kKB_@EfrW!{QSj@ZS+UCs$v~j3)T*iLTgX;JJ$*Oyyd)b?-Lw027^W=Rs*W z;n9KH896g@t9Q@df{4sm*7re_qlva0+Bm(xR$%Kt*_6Su$V_x@y(-(lbv%jj>JDy! z0+{h(8nHsyPir0$O3J_~M2R-Rc{IZU!8;S}^ZHZVW-e3)Xm~#amVs3}g_;+Z{Ua6O z8gmgCW01zpa4^Lp8G282FDnCFw{r~i{W#X0^RHt9(I`TC;R-{cENbh5d7_w=bDK^m zAAx5ddi|$U`V;Gh&8S!4_Z~}`D`ns~`dI|WQw_Li5!i;PZ}=>L-(^srhoH{R+QenU z<<+m5qs@5?w%Pp=X)5dv!zE%sfyg^!T0daLV6;%s&bbgAoLbp~dpipygab7IT4Lj# zN;8+l1irDV_c{~&idlt<1S_GZJKe<%Q@UYpn~sH@4+N$|(lBhq^qk4gPC;PObcqGH zd#C{x$zp0O<1G{Ys`)@GR~uFGp{p-*-;kM-ZmOW;!&qRQZ9|x!aK()cma|7=-jvm66EX+$ zq#X;NampRlWY+vuo5pfbsf4#F!8w;_Gy0VqM9>S0ks$aat$b(ev&)7Iup;fW>Uk#Q z=IkDk@IV3sG{jat>KX$N+p<%@n+0mHr5Tiotvti&YfW&DbN>YvQ0JWg%LIrBf5IO> zM{gL9vRQ8V942BuF3GwW%zur4cMf3n6viK6{<0yTg|>h8_yR*#+d7q@wPEfQ%ij&1083={V-pnCB^P&c0P_tEgCY%BcO`o|%>1S3+CY1o>^H#)4 z_bUCTObF=!x98Ryo~+X4{H}_7{JIBq^JM{2HGR z=NErkZ?Ul*S-jQ0ZwCW>+@L$LRN=Jh@#M71#s58?%(1t@M^#%pNNfiNBon}7W1H77 z#Z8&{;>1r8V?8tNnGbXQMXhY~75D6&vy7Kv7?f}wfeA%1<=t^W6TMiF>`&;3?W(fc zP%KObT&4Q)vb&vQz>3a?AVrpIVR;m&b1?3i)~>M&%{tGqAOACk^&SlCv5APr@L;{9 z@X>M?iJnJ@)HKuzBgU^cE>gKB8f47tTDauK?%T^z(BNXxkN?vV9dz>T6J{`DV>?tT zwz9IG+$IYBX7e-mBD)fD7bBVmwpMu<(=cErux@6cXI{%f*|%OyGn_(oX3QD8#`wuv z!zVmKziycRIo8K~!g!GV?D?O>8t3g-lai#z?lV2}j|q|Gir3Z~yO~py`6kVttV=i{ zaI@aN+ND@~m?K1b_Vv?li%XWJWNNlMO;qku`!K6TGAcmNmb;>C;Uuvxl>1rB)y z6DL8J=^(vN%eltQ^70I#fb_D@`y{Hpt5_+;PwX(F*v9OcuoeD^^x|I}++z`&&SZo9 zt7WX25Vdn`FH*)S;@g$ayO@kWIP*+M7ssB8pZ{TIG2yxN>nDSL!r%UBft6INy6eOY zBs0g8KQt_}N+;jdjXdL#g#?11(H>??2t(_8jfs$;Ad_5y1Iq+p!JG#FV&1U=bORJa z7kzwU1yY%Kt&us!XRM$M)&`^7n#j5i4Aw?ivkJ$t;0ifruW7>RoXOrHHQ}Ehe+@i6 zVOoEDnCl_@$rA{b_BxfLHRloJU!+s(>I2jh>7Z&LR@j1@I=m;?Re-`M{3)1(*uQ#7T=|4Zcxy#e6d ztS{uvz6l3Z+X2~p%$u1nV5@dU1^A$``}fSHtg!IvMoEkHIJ<+%{}TKxV`jd1%RVal zqJwKMt-p zHzzLFY)ABfis+%78`WMNQR}wOBP4H@$dWsV+mN`pG-Jo{7-CbUntdBJfI0rWc>Qyy`p7bKnXfA z2WE?5A0rO2Ef8j1Jj(-lPq*pjt-}9LF$X7Hkt379Ldm|IHG|8abp^dX;R2(TGh1bD zSl*`zF7vDoaPO?xS9j+f@iwnS<+9fH4GIIV9#q6K;33x8Yxyv)+7-e7``Hp5!GB_Y zr)3@Z-xX%Z>vk~LDb|TS%PbWu&jQV6G+Fy^`6;+Ha}1yU>!EO7Sc;<&b46zje%7bZ zk1cz~iraq|ig2I9ERT)tTMtF~pZENCBwpwB{%IVx{-%1rB0Wp*@8d9Y29J--mxdwb zx4s%9T9)b)Q8Cu_iTUa?ykPuNCA4AaUJlmmKf&y#GGE|q`p3U(Jj%L$vPR?cVoX_c z5DY=rB-T>KI&iil)n8b_{sD0NZ(XPX&k783=>KN|WT$K-E8pB?n##zg#?AtH)s##B zGZM{@hxAYQ!YhJoSy&zmqIBl@WQCp>`Kz6~CuQjud})D3+(qx+$wyOd?>Kc4J8OCq_ zwd&^MoBd~sO?uTogimLWM_(?EvhSajMF9KwfowC?7;x*;;eiv~0ZcSDnwzz55-~79 z^{C|i2mBMS$A-VwacG(C1dht8`a{P!LV=HJoBBL(^+CG6)gjIVyvIMRIqm;0LN)%u z|EcuSnMbgrjD=sG`FnHXydEm++#mu|nVN`+VCsZVv|dNj0UH`+3=aKxCO+Xg^lP@? zSPuQ!9}18E2OW^lp8wx4bQtgW4_VMZue>92i+?KL!};4$SG;bC^`?E+hYninOX*qa z;|H6_8WGV|Ys6OxOY9LAmcoBxYq5Ec)S5NwvmbbT@&Z%yL&gTjzx;ybTc(QQ1Cw+$BO=16.14" } }, "node_modules/@algolia/autocomplete-core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.4.tgz", - "integrity": "sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", "dependencies": { - "@algolia/autocomplete-shared": "1.7.4" + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" } }, "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.4.tgz", - "integrity": "sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", "dependencies": { - "@algolia/autocomplete-shared": "1.7.4" + "@algolia/autocomplete-shared": "1.9.3" }, "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", @@ -51,79 +63,83 @@ } }, "node_modules/@algolia/autocomplete-shared": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.4.tgz", - "integrity": "sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==" + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } }, "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.3.tgz", - "integrity": "sha512-hWH1yCxgG3+R/xZIscmUrWAIBnmBFHH5j30fY/+aPkEZWt90wYILfAHIOZ1/Wxhho5SkPfwFmT7ooX2d9JeQBw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.18.0.tgz", + "integrity": "sha512-rUAs49NLlO8LVLgGzM4cLkw8NJLKguQLgvFmBEe3DyzlinoqxzQMHfKZs6TSq4LZfw/z8qHvRo8NcTAAUJQLcw==", "dependencies": { - "@algolia/cache-common": "4.14.3" + "@algolia/cache-common": "4.18.0" } }, "node_modules/@algolia/cache-common": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.3.tgz", - "integrity": "sha512-oZJofOoD9FQOwiGTzyRnmzvh3ZP8WVTNPBLH5xU5JNF7drDbRT0ocVT0h/xB2rPHYzOeXRrLaQQBwRT/CKom0Q==" + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.18.0.tgz", + "integrity": "sha512-BmxsicMR4doGbeEXQu8yqiGmiyvpNvejYJtQ7rvzttEAMxOPoWEHrWyzBQw4x7LrBY9pMrgv4ZlUaF8PGzewHg==" }, "node_modules/@algolia/cache-in-memory": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.3.tgz", - "integrity": "sha512-ES0hHQnzWjeioLQf5Nq+x1AWdZJ50znNPSH3puB/Y4Xsg4Av1bvLmTJe7SY2uqONaeMTvL0OaVcoVtQgJVw0vg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.18.0.tgz", + "integrity": "sha512-evD4dA1nd5HbFdufBxLqlJoob7E2ozlqJZuV3YlirNx5Na4q1LckIuzjNYZs2ddLzuTc/Xd5O3Ibf7OwPskHxw==", "dependencies": { - "@algolia/cache-common": "4.14.3" + "@algolia/cache-common": "4.18.0" } }, "node_modules/@algolia/client-account": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.3.tgz", - "integrity": "sha512-PBcPb0+f5Xbh5UfLZNx2Ow589OdP8WYjB4CnvupfYBrl9JyC1sdH4jcq/ri8osO/mCZYjZrQsKAPIqW/gQmizQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.18.0.tgz", + "integrity": "sha512-XsDnlROr3+Z1yjxBJjUMfMazi1V155kVdte6496atvBgOEtwCzTs3A+qdhfsAnGUvaYfBrBkL0ThnhMIBCGcew==", "dependencies": { - "@algolia/client-common": "4.14.3", - "@algolia/client-search": "4.14.3", - "@algolia/transporter": "4.14.3" + "@algolia/client-common": "4.18.0", + "@algolia/client-search": "4.18.0", + "@algolia/transporter": "4.18.0" } }, "node_modules/@algolia/client-analytics": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.3.tgz", - "integrity": "sha512-eAwQq0Hb/aauv9NhCH5Dp3Nm29oFx28sayFN2fdOWemwSeJHIl7TmcsxVlRsO50fsD8CtPcDhtGeD3AIFLNvqw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.18.0.tgz", + "integrity": "sha512-chEUSN4ReqU7uRQ1C8kDm0EiPE+eJeAXiWcBwLhEynfNuTfawN9P93rSZktj7gmExz0C8XmkbBU19IQ05wCNrQ==", "dependencies": { - "@algolia/client-common": "4.14.3", - "@algolia/client-search": "4.14.3", - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" + "@algolia/client-common": "4.18.0", + "@algolia/client-search": "4.18.0", + "@algolia/requester-common": "4.18.0", + "@algolia/transporter": "4.18.0" } }, "node_modules/@algolia/client-common": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.3.tgz", - "integrity": "sha512-jkPPDZdi63IK64Yg4WccdCsAP4pHxSkr4usplkUZM5C1l1oEpZXsy2c579LQ0rvwCs5JFmwfNG4ahOszidfWPw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.18.0.tgz", + "integrity": "sha512-7N+soJFP4wn8tjTr3MSUT/U+4xVXbz4jmeRfWfVAzdAbxLAQbHa0o/POSdTvQ8/02DjCLelloZ1bb4ZFVKg7Wg==", "dependencies": { - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" + "@algolia/requester-common": "4.18.0", + "@algolia/transporter": "4.18.0" } }, "node_modules/@algolia/client-personalization": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.3.tgz", - "integrity": "sha512-UCX1MtkVNgaOL9f0e22x6tC9e2H3unZQlSUdnVaSKpZ+hdSChXGaRjp2UIT7pxmPqNCyv51F597KEX5WT60jNg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.18.0.tgz", + "integrity": "sha512-+PeCjODbxtamHcPl+couXMeHEefpUpr7IHftj4Y4Nia1hj8gGq4VlIcqhToAw8YjLeCTfOR7r7xtj3pJcYdP8A==", "dependencies": { - "@algolia/client-common": "4.14.3", - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" + "@algolia/client-common": "4.18.0", + "@algolia/requester-common": "4.18.0", + "@algolia/transporter": "4.18.0" } }, "node_modules/@algolia/client-search": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.3.tgz", - "integrity": "sha512-I2U7xBx5OPFdPLA8AXKUPPxGY3HDxZ4r7+mlZ8ZpLbI8/ri6fnu6B4z3wcL7sgHhDYMwnAE8Xr0AB0h3Hnkp4A==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.18.0.tgz", + "integrity": "sha512-F9xzQXTjm6UuZtnsLIew6KSraXQ0AzS/Ee+OD+mQbtcA/K1sg89tqb8TkwjtiYZ0oij13u3EapB3gPZwm+1Y6g==", "dependencies": { - "@algolia/client-common": "4.14.3", - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" + "@algolia/client-common": "4.18.0", + "@algolia/requester-common": "4.18.0", + "@algolia/transporter": "4.18.0" } }, "node_modules/@algolia/events": { @@ -132,47 +148,47 @@ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, "node_modules/@algolia/logger-common": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.3.tgz", - "integrity": "sha512-kUEAZaBt/J3RjYi8MEBT2QEexJR2kAE2mtLmezsmqMQZTV502TkHCxYzTwY2dE7OKcUTxi4OFlMuS4GId9CWPw==" + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.18.0.tgz", + "integrity": "sha512-46etYgSlkoKepkMSyaoriSn2JDgcrpc/nkOgou/lm0y17GuMl9oYZxwKKTSviLKI5Irk9nSKGwnBTQYwXOYdRg==" }, "node_modules/@algolia/logger-console": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.3.tgz", - "integrity": "sha512-ZWqAlUITktiMN2EiFpQIFCJS10N96A++yrexqC2Z+3hgF/JcKrOxOdT4nSCQoEPvU4Ki9QKbpzbebRDemZt/hw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.18.0.tgz", + "integrity": "sha512-3P3VUYMl9CyJbi/UU1uUNlf6Z8N2ltW3Oqhq/nR7vH0CjWv32YROq3iGWGxB2xt3aXobdUPXs6P0tHSKRmNA6g==", "dependencies": { - "@algolia/logger-common": "4.14.3" + "@algolia/logger-common": "4.18.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.3.tgz", - "integrity": "sha512-AZeg2T08WLUPvDncl2XLX2O67W5wIO8MNaT7z5ii5LgBTuk/rU4CikTjCe2xsUleIZeFl++QrPAi4Bdxws6r/Q==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.18.0.tgz", + "integrity": "sha512-/AcWHOBub2U4TE/bPi4Gz1XfuLK6/7dj4HJG+Z2SfQoS1RjNLshZclU3OoKIkFp8D2NC7+BNsPvr9cPLyW8nyQ==", "dependencies": { - "@algolia/requester-common": "4.14.3" + "@algolia/requester-common": "4.18.0" } }, "node_modules/@algolia/requester-common": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.3.tgz", - "integrity": "sha512-RrRzqNyKFDP7IkTuV3XvYGF9cDPn9h6qEDl595lXva3YUk9YSS8+MGZnnkOMHvjkrSCKfoLeLbm/T4tmoIeclw==" + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.18.0.tgz", + "integrity": "sha512-xlT8R1qYNRBCi1IYLsx7uhftzdfsLPDGudeQs+xvYB4sQ3ya7+ppolB/8m/a4F2gCkEO6oxpp5AGemM7kD27jA==" }, "node_modules/@algolia/requester-node-http": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.3.tgz", - "integrity": "sha512-O5wnPxtDRPuW2U0EaOz9rMMWdlhwP0J0eSL1Z7TtXF8xnUeeUyNJrdhV5uy2CAp6RbhM1VuC3sOJcIR6Av+vbA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.18.0.tgz", + "integrity": "sha512-TGfwj9aeTVgOUhn5XrqBhwUhUUDnGIKlI0kCBMdR58XfXcfdwomka+CPIgThRbfYw04oQr31A6/95ZH2QVJ9UQ==", "dependencies": { - "@algolia/requester-common": "4.14.3" + "@algolia/requester-common": "4.18.0" } }, "node_modules/@algolia/transporter": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.3.tgz", - "integrity": "sha512-2qlKlKsnGJ008exFRb5RTeTOqhLZj0bkMCMVskxoqWejs2Q2QtWmsiH98hDfpw0fmnyhzHEt0Z7lqxBYp8bW2w==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.18.0.tgz", + "integrity": "sha512-xbw3YRUGtXQNG1geYFEDDuFLZt4Z8YNKbamHPkzr3rWc6qp4/BqEeXcI2u/P/oMq2yxtXgMxrCxOPA8lyIe5jw==", "dependencies": { - "@algolia/cache-common": "4.14.3", - "@algolia/logger-common": "4.14.3", - "@algolia/requester-common": "4.14.3" + "@algolia/cache-common": "4.18.0", + "@algolia/logger-common": "4.18.0", + "@algolia/requester-common": "4.18.0" } }, "node_modules/@ampproject/remapping": { @@ -1985,18 +2001,18 @@ } }, "node_modules/@docsearch/css": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.3.tgz", - "integrity": "sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==" + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.1.tgz", + "integrity": "sha512-2Pu9HDg/uP/IT10rbQ+4OrTQuxIWdKVUEdcw9/w7kZJv9NeHS6skJx1xuRiFyoGKwAzcHXnLp7csE99sj+O1YA==" }, "node_modules/@docsearch/react": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.3.tgz", - "integrity": "sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.1.tgz", + "integrity": "sha512-t5mEODdLzZq4PTFAm/dvqcvZFdPDMdfPE5rJS5SC8OUq9mPzxEy6b+9THIqNM9P0ocCb4UC5jqBrxKclnuIbzQ==", "dependencies": { - "@algolia/autocomplete-core": "1.7.4", - "@algolia/autocomplete-preset-algolia": "1.7.4", - "@docsearch/css": "3.3.3", + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.5.1", "algoliasearch": "^4.0.0" }, "peerDependencies": { @@ -2017,9 +2033,9 @@ } }, "node_modules/@docusaurus/core": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.3.1.tgz", - "integrity": "sha512-0Jd4jtizqnRAr7svWaBbbrCCN8mzBNd2xFLoT/IM7bGfFie5y58oz97KzXliwiLY3zWjqMXjQcuP1a5VgCv2JA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.1.tgz", + "integrity": "sha512-SNsY7PshK3Ri7vtsLXVeAJGS50nJN3RgF836zkyUfAD01Fq+sAk5EwWgLw+nnm5KVNGDu7PRR2kRGDsWvqpo0g==", "dependencies": { "@babel/core": "^7.18.6", "@babel/generator": "^7.18.7", @@ -2031,13 +2047,13 @@ "@babel/runtime": "^7.18.6", "@babel/runtime-corejs3": "^7.18.6", "@babel/traverse": "^7.18.8", - "@docusaurus/cssnano-preset": "2.3.1", - "@docusaurus/logger": "2.3.1", - "@docusaurus/mdx-loader": "2.3.1", + "@docusaurus/cssnano-preset": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "2.3.1", - "@docusaurus/utils-common": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "@slorber/static-site-generator-webpack-plugin": "^4.0.7", "@svgr/webpack": "^6.2.1", "autoprefixer": "^10.4.7", @@ -2105,9 +2121,9 @@ } }, "node_modules/@docusaurus/cssnano-preset": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.3.1.tgz", - "integrity": "sha512-7mIhAROES6CY1GmCjR4CZkUfjTL6B3u6rKHK0ChQl2d1IevYXq/k/vFgvOrJfcKxiObpMnE9+X6R2Wt1KqxC6w==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.1.tgz", + "integrity": "sha512-ka+vqXwtcW1NbXxWsh6yA1Ckii1klY9E53cJ4O9J09nkMBgrNX3iEFED1fWdv8wf4mJjvGi5RLZ2p9hJNjsLyQ==", "dependencies": { "cssnano-preset-advanced": "^5.3.8", "postcss": "^8.4.14", @@ -2119,9 +2135,9 @@ } }, "node_modules/@docusaurus/logger": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.3.1.tgz", - "integrity": "sha512-2lAV/olKKVr9qJhfHFCaqBIl8FgYjbUFwgUnX76+cULwQYss+42ZQ3grHGFvI0ocN2X55WcYe64ellQXz7suqg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.4.1.tgz", + "integrity": "sha512-5h5ysIIWYIDHyTVd8BjheZmQZmEgWDR54aQ1BX9pjFfpyzFo5puKXKYrYJXbjEHGyVhEzmB9UXwbxGfaZhOjcg==", "dependencies": { "chalk": "^4.1.2", "tslib": "^2.4.0" @@ -2131,14 +2147,14 @@ } }, "node_modules/@docusaurus/mdx-loader": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.3.1.tgz", - "integrity": "sha512-Gzga7OsxQRpt3392K9lv/bW4jGppdLFJh3luKRknCKSAaZrmVkOQv2gvCn8LAOSZ3uRg5No7AgYs/vpL8K94lA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.4.1.tgz", + "integrity": "sha512-4KhUhEavteIAmbBj7LVFnrVYDiU51H5YWW1zY6SmBSte/YLhDutztLTBE0PQl1Grux1jzUJeaSvAzHpTn6JJDQ==", "dependencies": { "@babel/parser": "^7.18.8", "@babel/traverse": "^7.18.8", - "@docusaurus/logger": "2.3.1", - "@docusaurus/utils": "2.3.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/utils": "2.4.1", "@mdx-js/mdx": "^1.6.22", "escape-html": "^1.0.3", "file-loader": "^6.2.0", @@ -2162,12 +2178,12 @@ } }, "node_modules/@docusaurus/module-type-aliases": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.3.1.tgz", - "integrity": "sha512-6KkxfAVOJqIUynTRb/tphYCl+co3cP0PlHiMDbi+SzmYxMdgIrwYqH9yAnGSDoN6Jk2ZE/JY/Azs/8LPgKP48A==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.1.tgz", + "integrity": "sha512-gLBuIFM8Dp2XOCWffUDSjtxY7jQgKvYujt7Mx5s4FCTfoL5dN1EVbnrn+O2Wvh8b0a77D57qoIDY7ghgmatR1A==", "dependencies": { "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "2.3.1", + "@docusaurus/types": "2.4.1", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2181,15 +2197,15 @@ } }, "node_modules/@docusaurus/plugin-client-redirects": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-2.3.1.tgz", - "integrity": "sha512-Ye0z36/L8685ni0DIxHqPPaHIXFXiSF90QYiYfpODBX6NxvvveUTyylsDBU1GQhPXPn1bd39QgaOuZ+j9gfaog==", - "dependencies": { - "@docusaurus/core": "2.3.1", - "@docusaurus/logger": "2.3.1", - "@docusaurus/utils": "2.3.1", - "@docusaurus/utils-common": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-2.4.1.tgz", + "integrity": "sha512-tp0j16gaLIJ4p+IR0P6KDOFsTOGGMY54MNPnmM61Vaqqt5omLqsuKUO8UlCGU1oW/4EIQOhXYy99XYY5MjE+7A==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "eta": "^2.0.0", "fs-extra": "^10.1.0", "lodash": "^4.17.21", @@ -2204,17 +2220,17 @@ } }, "node_modules/@docusaurus/plugin-content-blog": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.3.1.tgz", - "integrity": "sha512-f5LjqX+9WkiLyGiQ41x/KGSJ/9bOjSD8lsVhPvYeUYHCtYpuiDKfhZE07O4EqpHkBx4NQdtQDbp+aptgHSTuiw==", - "dependencies": { - "@docusaurus/core": "2.3.1", - "@docusaurus/logger": "2.3.1", - "@docusaurus/mdx-loader": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils": "2.3.1", - "@docusaurus/utils-common": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.1.tgz", + "integrity": "sha512-E2i7Knz5YIbE1XELI6RlTnZnGgS52cUO4BlCiCUCvQHbR+s1xeIWz4C6BtaVnlug0Ccz7nFSksfwDpVlkujg5Q==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^10.1.0", @@ -2234,17 +2250,17 @@ } }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.3.1.tgz", - "integrity": "sha512-DxztTOBEruv7qFxqUtbsqXeNcHqcVEIEe+NQoI1oi2DBmKBhW/o0MIal8lt+9gvmpx3oYtlwmLOOGepxZgJGkw==", - "dependencies": { - "@docusaurus/core": "2.3.1", - "@docusaurus/logger": "2.3.1", - "@docusaurus/mdx-loader": "2.3.1", - "@docusaurus/module-type-aliases": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.1.tgz", + "integrity": "sha512-Lo7lSIcpswa2Kv4HEeUcGYqaasMUQNpjTXpV0N8G6jXgZaQurqp7E8NGYeGbDXnb48czmHWbzDL4S3+BbK0VzA==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/module-type-aliases": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "@types/react-router-config": "^5.0.6", "combine-promises": "^1.1.0", "fs-extra": "^10.1.0", @@ -2264,15 +2280,15 @@ } }, "node_modules/@docusaurus/plugin-content-pages": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.3.1.tgz", - "integrity": "sha512-E80UL6hvKm5VVw8Ka8YaVDtO6kWWDVUK4fffGvkpQ/AJQDOg99LwOXKujPoICC22nUFTsZ2Hp70XvpezCsFQaA==", - "dependencies": { - "@docusaurus/core": "2.3.1", - "@docusaurus/mdx-loader": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.1.tgz", + "integrity": "sha512-/UjuH/76KLaUlL+o1OvyORynv6FURzjurSjvn2lbWTFc4tpYY2qLYTlKpTCBVPhlLUQsfyFnshEJDLmPneq2oA==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "fs-extra": "^10.1.0", "tslib": "^2.4.0", "webpack": "^5.73.0" @@ -2286,13 +2302,13 @@ } }, "node_modules/@docusaurus/plugin-debug": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.3.1.tgz", - "integrity": "sha512-Ujpml1Ppg4geB/2hyu2diWnO49az9U2bxM9Shen7b6qVcyFisNJTkVG2ocvLC7wM1efTJcUhBO6zAku2vKJGMw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.4.1.tgz", + "integrity": "sha512-7Yu9UPzRShlrH/G8btOpR0e6INFZr0EegWplMjOqelIwAcx3PKyR8mgPTxGTxcqiYj6hxSCRN0D8R7YrzImwNA==", "dependencies": { - "@docusaurus/core": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils": "2.3.1", + "@docusaurus/core": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", "fs-extra": "^10.1.0", "react-json-view": "^1.21.3", "tslib": "^2.4.0" @@ -2306,13 +2322,13 @@ } }, "node_modules/@docusaurus/plugin-google-analytics": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.3.1.tgz", - "integrity": "sha512-OHip0GQxKOFU8n7gkt3TM4HOYTXPCFDjqKbMClDD3KaDnyTuMp/Zvd9HSr770lLEscgPWIvzhJByRAClqsUWiQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.1.tgz", + "integrity": "sha512-dyZJdJiCoL+rcfnm0RPkLt/o732HvLiEwmtoNzOoz9MSZz117UH2J6U2vUDtzUzwtFLIf32KkeyzisbwUCgcaQ==", "dependencies": { - "@docusaurus/core": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", + "@docusaurus/core": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "tslib": "^2.4.0" }, "engines": { @@ -2324,13 +2340,13 @@ } }, "node_modules/@docusaurus/plugin-google-gtag": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.3.1.tgz", - "integrity": "sha512-uXtDhfu4+Hm+oqWUySr3DNI5cWC/rmP6XJyAk83Heor3dFjZqDwCbkX8yWPywkRiWev3Dk/rVF8lEn0vIGVocA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.1.tgz", + "integrity": "sha512-mKIefK+2kGTQBYvloNEKtDmnRD7bxHLsBcxgnbt4oZwzi2nxCGjPX6+9SQO2KCN5HZbNrYmGo5GJfMgoRvy6uA==", "dependencies": { - "@docusaurus/core": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", + "@docusaurus/core": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "tslib": "^2.4.0" }, "engines": { @@ -2342,13 +2358,13 @@ } }, "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.3.1.tgz", - "integrity": "sha512-Ww2BPEYSqg8q8tJdLYPFFM3FMDBCVhEM4UUqKzJaiRMx3NEoly3qqDRAoRDGdIhlC//Rf0iJV9cWAoq2m6k3sw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.1.tgz", + "integrity": "sha512-Zg4Ii9CMOLfpeV2nG74lVTWNtisFaH9QNtEw48R5QE1KIwDBdTVaiSA18G1EujZjrzJJzXN79VhINSbOJO/r3g==", "dependencies": { - "@docusaurus/core": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", + "@docusaurus/core": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "tslib": "^2.4.0" }, "engines": { @@ -2360,16 +2376,16 @@ } }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.3.1.tgz", - "integrity": "sha512-8Yxile/v6QGYV9vgFiYL+8d2N4z4Er3pSHsrD08c5XI8bUXxTppMwjarDUTH/TRTfgAWotRbhJ6WZLyajLpozA==", - "dependencies": { - "@docusaurus/core": "2.3.1", - "@docusaurus/logger": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils": "2.3.1", - "@docusaurus/utils-common": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.1.tgz", + "integrity": "sha512-lZx+ijt/+atQ3FVE8FOHV/+X3kuok688OydDXrqKRJyXBJZKgGjA2Qa8RjQ4f27V2woaXhtnyrdPop/+OjVMRg==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "fs-extra": "^10.1.0", "sitemap": "^7.1.1", "tslib": "^2.4.0" @@ -2383,23 +2399,23 @@ } }, "node_modules/@docusaurus/preset-classic": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.3.1.tgz", - "integrity": "sha512-OQ5W0AHyfdUk0IldwJ3BlnZ1EqoJuu2L2BMhqLbqwNWdkmzmSUvlFLH1Pe7CZSQgB2YUUC/DnmjbPKk/qQD0lQ==", - "dependencies": { - "@docusaurus/core": "2.3.1", - "@docusaurus/plugin-content-blog": "2.3.1", - "@docusaurus/plugin-content-docs": "2.3.1", - "@docusaurus/plugin-content-pages": "2.3.1", - "@docusaurus/plugin-debug": "2.3.1", - "@docusaurus/plugin-google-analytics": "2.3.1", - "@docusaurus/plugin-google-gtag": "2.3.1", - "@docusaurus/plugin-google-tag-manager": "2.3.1", - "@docusaurus/plugin-sitemap": "2.3.1", - "@docusaurus/theme-classic": "2.3.1", - "@docusaurus/theme-common": "2.3.1", - "@docusaurus/theme-search-algolia": "2.3.1", - "@docusaurus/types": "2.3.1" + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.4.1.tgz", + "integrity": "sha512-P4//+I4zDqQJ+UDgoFrjIFaQ1MeS9UD1cvxVQaI6O7iBmiHQm0MGROP1TbE7HlxlDPXFJjZUK3x3cAoK63smGQ==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/plugin-content-blog": "2.4.1", + "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/plugin-content-pages": "2.4.1", + "@docusaurus/plugin-debug": "2.4.1", + "@docusaurus/plugin-google-analytics": "2.4.1", + "@docusaurus/plugin-google-gtag": "2.4.1", + "@docusaurus/plugin-google-tag-manager": "2.4.1", + "@docusaurus/plugin-sitemap": "2.4.1", + "@docusaurus/theme-classic": "2.4.1", + "@docusaurus/theme-common": "2.4.1", + "@docusaurus/theme-search-algolia": "2.4.1", + "@docusaurus/types": "2.4.1" }, "engines": { "node": ">=16.14" @@ -2422,26 +2438,26 @@ } }, "node_modules/@docusaurus/theme-classic": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.3.1.tgz", - "integrity": "sha512-SelSIDvyttb7ZYHj8vEUhqykhAqfOPKk+uP0z85jH72IMC58e7O8DIlcAeBv+CWsLbNIl9/Hcg71X0jazuxJug==", - "dependencies": { - "@docusaurus/core": "2.3.1", - "@docusaurus/mdx-loader": "2.3.1", - "@docusaurus/module-type-aliases": "2.3.1", - "@docusaurus/plugin-content-blog": "2.3.1", - "@docusaurus/plugin-content-docs": "2.3.1", - "@docusaurus/plugin-content-pages": "2.3.1", - "@docusaurus/theme-common": "2.3.1", - "@docusaurus/theme-translations": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils": "2.3.1", - "@docusaurus/utils-common": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.4.1.tgz", + "integrity": "sha512-Rz0wKUa+LTW1PLXmwnf8mn85EBzaGSt6qamqtmnh9Hflkc+EqiYMhtUJeLdV+wsgYq4aG0ANc+bpUDpsUhdnwg==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/module-type-aliases": "2.4.1", + "@docusaurus/plugin-content-blog": "2.4.1", + "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/plugin-content-pages": "2.4.1", + "@docusaurus/theme-common": "2.4.1", + "@docusaurus/theme-translations": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", "copy-text-to-clipboard": "^3.0.1", - "infima": "0.2.0-alpha.42", + "infima": "0.2.0-alpha.43", "lodash": "^4.17.21", "nprogress": "^0.2.0", "postcss": "^8.4.14", @@ -2461,16 +2477,17 @@ } }, "node_modules/@docusaurus/theme-common": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.3.1.tgz", - "integrity": "sha512-RYmYl2OR2biO+yhmW1aS5FyEvnrItPINa+0U2dMxcHpah8reSCjQ9eJGRmAgkZFchV1+aIQzXOI1K7LCW38O0g==", - "dependencies": { - "@docusaurus/mdx-loader": "2.3.1", - "@docusaurus/module-type-aliases": "2.3.1", - "@docusaurus/plugin-content-blog": "2.3.1", - "@docusaurus/plugin-content-docs": "2.3.1", - "@docusaurus/plugin-content-pages": "2.3.1", - "@docusaurus/utils": "2.3.1", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.4.1.tgz", + "integrity": "sha512-G7Zau1W5rQTaFFB3x3soQoZpkgMbl/SYNG8PfMFIjKa3M3q8n0m/GRf5/H/e5BqOvt8c+ZWIXGCiz+kUCSHovA==", + "dependencies": { + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/module-type-aliases": "2.4.1", + "@docusaurus/plugin-content-blog": "2.4.1", + "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/plugin-content-pages": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2490,18 +2507,18 @@ } }, "node_modules/@docusaurus/theme-search-algolia": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.3.1.tgz", - "integrity": "sha512-JdHaRqRuH1X++g5fEMLnq7OtULSGQdrs9AbhcWRQ428ZB8/HOiaN6mj3hzHvcD3DFgu7koIVtWPQnvnN7iwzHA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.1.tgz", + "integrity": "sha512-6BcqW2lnLhZCXuMAvPRezFs1DpmEKzXFKlYjruuas+Xy3AQeFzDJKTJFIm49N77WFCTyxff8d3E4Q9pi/+5McQ==", "dependencies": { "@docsearch/react": "^3.1.1", - "@docusaurus/core": "2.3.1", - "@docusaurus/logger": "2.3.1", - "@docusaurus/plugin-content-docs": "2.3.1", - "@docusaurus/theme-common": "2.3.1", - "@docusaurus/theme-translations": "2.3.1", - "@docusaurus/utils": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/theme-common": "2.4.1", + "@docusaurus/theme-translations": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "algoliasearch": "^4.13.1", "algoliasearch-helper": "^3.10.0", "clsx": "^1.2.1", @@ -2520,9 +2537,9 @@ } }, "node_modules/@docusaurus/theme-translations": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.3.1.tgz", - "integrity": "sha512-BsBZzAewJabVhoGG1Ij2u4pMS3MPW6gZ6sS4pc+Y7czevRpzxoFNJXRtQDVGe7mOpv/MmRmqg4owDK+lcOTCVQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.4.1.tgz", + "integrity": "sha512-T1RAGP+f86CA1kfE8ejZ3T3pUU3XcyvrGMfC/zxCtc2BsnoexuNI9Vk2CmuKCb+Tacvhxjv5unhxXce0+NKyvA==", "dependencies": { "fs-extra": "^10.1.0", "tslib": "^2.4.0" @@ -2532,9 +2549,9 @@ } }, "node_modules/@docusaurus/types": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.3.1.tgz", - "integrity": "sha512-PREbIRhTaNNY042qmfSE372Jb7djZt+oVTZkoqHJ8eff8vOIc2zqqDqBVc5BhOfpZGPTrE078yy/torUEZy08A==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.1.tgz", + "integrity": "sha512-0R+cbhpMkhbRXX138UOc/2XZFF8hiZa6ooZAEEJFp5scytzCw4tC1gChMFXrpa3d2tYE6AX8IrOEpSonLmfQuQ==", "dependencies": { "@types/history": "^4.7.11", "@types/react": "*", @@ -2551,11 +2568,11 @@ } }, "node_modules/@docusaurus/utils": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.3.1.tgz", - "integrity": "sha512-9WcQROCV0MmrpOQDXDGhtGMd52DHpSFbKLfkyaYumzbTstrbA5pPOtiGtxK1nqUHkiIv8UwexS54p0Vod2I1lg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.1.tgz", + "integrity": "sha512-1lvEZdAQhKNht9aPXPoh69eeKnV0/62ROhQeFKKxmzd0zkcuE/Oc5Gpnt00y/f5bIsmOsYMY7Pqfm/5rteT5GA==", "dependencies": { - "@docusaurus/logger": "2.3.1", + "@docusaurus/logger": "2.4.1", "@svgr/webpack": "^6.2.1", "escape-string-regexp": "^4.0.0", "file-loader": "^6.2.0", @@ -2585,9 +2602,9 @@ } }, "node_modules/@docusaurus/utils-common": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.3.1.tgz", - "integrity": "sha512-pVlRpXkdNcxmKNxAaB1ya2hfCEvVsLDp2joeM6K6uv55Oc5nVIqgyYSgSNKZyMdw66NnvMfsu0RBylcwZQKo9A==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.4.1.tgz", + "integrity": "sha512-bCVGdZU+z/qVcIiEQdyx0K13OC5mYwxhSuDUR95oFbKVuXYRrTVrwZIqQljuo1fyJvFTKHiL9L9skQOPokuFNQ==", "dependencies": { "tslib": "^2.4.0" }, @@ -2604,12 +2621,12 @@ } }, "node_modules/@docusaurus/utils-validation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.3.1.tgz", - "integrity": "sha512-7n0208IG3k1HVTByMHlZoIDjjOFC8sbViHVXJx0r3Q+3Ezrx+VQ1RZ/zjNn6lT+QBCRCXlnlaoJ8ug4HIVgQ3w==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.4.1.tgz", + "integrity": "sha512-unII3hlJlDwZ3w8U+pMO3Lx3RhI4YEbY3YNsQj4yzrkZzlpqZOLuAiZK2JyULnD+TKbceKU0WyWkQXtYbLNDFA==", "dependencies": { - "@docusaurus/logger": "2.3.1", - "@docusaurus/utils": "2.3.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/utils": "2.4.1", "joi": "^17.6.0", "js-yaml": "^4.1.0", "tslib": "^2.4.0" @@ -3274,11 +3291,11 @@ } }, "node_modules/@types/hast": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", - "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.5.tgz", + "integrity": "sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==", "dependencies": { - "@types/unist": "*" + "@types/unist": "^2" } }, "node_modules/@types/history": { @@ -3326,11 +3343,11 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, "node_modules/@types/mdast": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", - "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", + "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", "dependencies": { - "@types/unist": "*" + "@types/unist": "^2" } }, "node_modules/@types/mime": { @@ -3451,9 +3468,9 @@ } }, "node_modules/@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.7.tgz", + "integrity": "sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==" }, "node_modules/@types/ws": { "version": "8.5.4", @@ -3789,30 +3806,30 @@ } }, "node_modules/algoliasearch": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.3.tgz", - "integrity": "sha512-GZTEuxzfWbP/vr7ZJfGzIl8fOsoxN916Z6FY2Egc9q2TmZ6hvq5KfAxY89pPW01oW/2HDEKA8d30f9iAH9eXYg==", - "dependencies": { - "@algolia/cache-browser-local-storage": "4.14.3", - "@algolia/cache-common": "4.14.3", - "@algolia/cache-in-memory": "4.14.3", - "@algolia/client-account": "4.14.3", - "@algolia/client-analytics": "4.14.3", - "@algolia/client-common": "4.14.3", - "@algolia/client-personalization": "4.14.3", - "@algolia/client-search": "4.14.3", - "@algolia/logger-common": "4.14.3", - "@algolia/logger-console": "4.14.3", - "@algolia/requester-browser-xhr": "4.14.3", - "@algolia/requester-common": "4.14.3", - "@algolia/requester-node-http": "4.14.3", - "@algolia/transporter": "4.14.3" + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.18.0.tgz", + "integrity": "sha512-pCuVxC1SVcpc08ENH32T4sLKSyzoU7TkRIDBMwSLfIiW+fq4znOmWDkAygHZ6pRcO9I1UJdqlfgnV7TRj+MXrA==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.18.0", + "@algolia/cache-common": "4.18.0", + "@algolia/cache-in-memory": "4.18.0", + "@algolia/client-account": "4.18.0", + "@algolia/client-analytics": "4.18.0", + "@algolia/client-common": "4.18.0", + "@algolia/client-personalization": "4.18.0", + "@algolia/client-search": "4.18.0", + "@algolia/logger-common": "4.18.0", + "@algolia/logger-console": "4.18.0", + "@algolia/requester-browser-xhr": "4.18.0", + "@algolia/requester-common": "4.18.0", + "@algolia/requester-node-http": "4.18.0", + "@algolia/transporter": "4.18.0" } }, "node_modules/algoliasearch-helper": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.11.3.tgz", - "integrity": "sha512-TbaEvLwiuGygHQIB8y+OsJKQQ40+JKUua5B91X66tMUHyyhbNHvqyr0lqd3wCoyKx7WybyQrC0WJvzoIeh24Aw==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.13.3.tgz", + "integrity": "sha512-jhbbuYZ+fheXpaJlqdJdFa1jOsrTWKmRRTYDM3oVTto5VodZzM7tT+BHzslAotaJf/81CKrm6yLRQn8WIr/K4A==", "dependencies": { "@algolia/events": "^4.0.1" }, @@ -4794,9 +4811,9 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/copy-text-to-clipboard": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", - "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", + "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==", "engines": { "node": ">=12" }, @@ -4969,11 +4986,11 @@ } }, "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", "dependencies": { - "node-fetch": "2.6.7" + "node-fetch": "^2.6.12" } }, "node_modules/cross-spawn": { @@ -5569,13 +5586,13 @@ } }, "node_modules/domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" + "domhandler": "^5.0.3" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" @@ -6036,9 +6053,9 @@ } }, "node_modules/fbjs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", - "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", + "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", "dependencies": { "cross-fetch": "^3.1.5", "fbjs-css-vars": "^1.0.0", @@ -6046,7 +6063,7 @@ "object-assign": "^4.1.0", "promise": "^7.1.1", "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.30" + "ua-parser-js": "^1.0.35" } }, "node_modules/fbjs-css-vars": { @@ -6179,9 +6196,9 @@ } }, "node_modules/flux": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz", - "integrity": "sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", + "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", "dependencies": { "fbemitter": "^3.0.0", "fbjs": "^3.0.1" @@ -6909,9 +6926,9 @@ } }, "node_modules/htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -6921,9 +6938,9 @@ ], "dependencies": { "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "domutils": "^3.0.1", - "entities": "^4.3.0" + "entities": "^4.4.0" } }, "node_modules/http-cache-semantics": { @@ -7104,9 +7121,9 @@ } }, "node_modules/infima": { - "version": "0.2.0-alpha.42", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.42.tgz", - "integrity": "sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww==", + "version": "0.2.0-alpha.43", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", + "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==", "engines": { "node": ">=12" } @@ -8109,9 +8126,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -9223,9 +9240,9 @@ } }, "node_modules/postcss-sort-media-queries": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.3.0.tgz", - "integrity": "sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", + "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", "dependencies": { "sort-css-media-queries": "2.1.0" }, @@ -9794,11 +9811,11 @@ } }, "node_modules/react-textarea-autosize": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.4.0.tgz", - "integrity": "sha512-YrTFaEHLgJsi8sJVYHBzYn+mkP3prGkmP2DKb/tm0t7CLJY5t1Rxix8070LAKb0wby7bl/lf2EeHkuMihMZMwQ==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.2.tgz", + "integrity": "sha512-uOkyjkEl0ByEK21eCJMHDGBAAd/BoFQBawYK5XItjAmCTeSbjxghd8qnt7nzsLYzidjnoObu6M26xts0YGKsGg==", "dependencies": { - "@babel/runtime": "^7.10.2", + "@babel/runtime": "^7.20.13", "use-composed-ref": "^1.3.0", "use-latest": "^1.2.1" }, @@ -10482,6 +10499,15 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/search-insights": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.7.0.tgz", + "integrity": "sha512-GLbVaGgzYEKMvuJbHRhLi1qoBFnjXZGZ6l4LxOYPCp4lI2jDRB3jPU9/XNhMwv6kvnA9slTreq6pvK+b3o3aqg==", + "peer": true, + "engines": { + "node": ">=8.16.0" + } + }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", @@ -11545,9 +11571,9 @@ } }, "node_modules/ua-parser-js": { - "version": "0.7.33", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.33.tgz", - "integrity": "sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw==", + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz", + "integrity": "sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==", "funding": [ { "type": "opencollective", @@ -12749,95 +12775,105 @@ }, "dependencies": { "@algolia/autocomplete-core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.4.tgz", - "integrity": "sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", "requires": { - "@algolia/autocomplete-shared": "1.7.4" + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "requires": { + "@algolia/autocomplete-shared": "1.9.3" } }, "@algolia/autocomplete-preset-algolia": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.4.tgz", - "integrity": "sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", "requires": { - "@algolia/autocomplete-shared": "1.7.4" + "@algolia/autocomplete-shared": "1.9.3" } }, "@algolia/autocomplete-shared": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.4.tgz", - "integrity": "sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==" + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "requires": {} }, "@algolia/cache-browser-local-storage": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.3.tgz", - "integrity": "sha512-hWH1yCxgG3+R/xZIscmUrWAIBnmBFHH5j30fY/+aPkEZWt90wYILfAHIOZ1/Wxhho5SkPfwFmT7ooX2d9JeQBw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.18.0.tgz", + "integrity": "sha512-rUAs49NLlO8LVLgGzM4cLkw8NJLKguQLgvFmBEe3DyzlinoqxzQMHfKZs6TSq4LZfw/z8qHvRo8NcTAAUJQLcw==", "requires": { - "@algolia/cache-common": "4.14.3" + "@algolia/cache-common": "4.18.0" } }, "@algolia/cache-common": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.3.tgz", - "integrity": "sha512-oZJofOoD9FQOwiGTzyRnmzvh3ZP8WVTNPBLH5xU5JNF7drDbRT0ocVT0h/xB2rPHYzOeXRrLaQQBwRT/CKom0Q==" + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.18.0.tgz", + "integrity": "sha512-BmxsicMR4doGbeEXQu8yqiGmiyvpNvejYJtQ7rvzttEAMxOPoWEHrWyzBQw4x7LrBY9pMrgv4ZlUaF8PGzewHg==" }, "@algolia/cache-in-memory": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.3.tgz", - "integrity": "sha512-ES0hHQnzWjeioLQf5Nq+x1AWdZJ50znNPSH3puB/Y4Xsg4Av1bvLmTJe7SY2uqONaeMTvL0OaVcoVtQgJVw0vg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.18.0.tgz", + "integrity": "sha512-evD4dA1nd5HbFdufBxLqlJoob7E2ozlqJZuV3YlirNx5Na4q1LckIuzjNYZs2ddLzuTc/Xd5O3Ibf7OwPskHxw==", "requires": { - "@algolia/cache-common": "4.14.3" + "@algolia/cache-common": "4.18.0" } }, "@algolia/client-account": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.3.tgz", - "integrity": "sha512-PBcPb0+f5Xbh5UfLZNx2Ow589OdP8WYjB4CnvupfYBrl9JyC1sdH4jcq/ri8osO/mCZYjZrQsKAPIqW/gQmizQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.18.0.tgz", + "integrity": "sha512-XsDnlROr3+Z1yjxBJjUMfMazi1V155kVdte6496atvBgOEtwCzTs3A+qdhfsAnGUvaYfBrBkL0ThnhMIBCGcew==", "requires": { - "@algolia/client-common": "4.14.3", - "@algolia/client-search": "4.14.3", - "@algolia/transporter": "4.14.3" + "@algolia/client-common": "4.18.0", + "@algolia/client-search": "4.18.0", + "@algolia/transporter": "4.18.0" } }, "@algolia/client-analytics": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.3.tgz", - "integrity": "sha512-eAwQq0Hb/aauv9NhCH5Dp3Nm29oFx28sayFN2fdOWemwSeJHIl7TmcsxVlRsO50fsD8CtPcDhtGeD3AIFLNvqw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.18.0.tgz", + "integrity": "sha512-chEUSN4ReqU7uRQ1C8kDm0EiPE+eJeAXiWcBwLhEynfNuTfawN9P93rSZktj7gmExz0C8XmkbBU19IQ05wCNrQ==", "requires": { - "@algolia/client-common": "4.14.3", - "@algolia/client-search": "4.14.3", - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" + "@algolia/client-common": "4.18.0", + "@algolia/client-search": "4.18.0", + "@algolia/requester-common": "4.18.0", + "@algolia/transporter": "4.18.0" } }, "@algolia/client-common": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.3.tgz", - "integrity": "sha512-jkPPDZdi63IK64Yg4WccdCsAP4pHxSkr4usplkUZM5C1l1oEpZXsy2c579LQ0rvwCs5JFmwfNG4ahOszidfWPw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.18.0.tgz", + "integrity": "sha512-7N+soJFP4wn8tjTr3MSUT/U+4xVXbz4jmeRfWfVAzdAbxLAQbHa0o/POSdTvQ8/02DjCLelloZ1bb4ZFVKg7Wg==", "requires": { - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" + "@algolia/requester-common": "4.18.0", + "@algolia/transporter": "4.18.0" } }, "@algolia/client-personalization": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.3.tgz", - "integrity": "sha512-UCX1MtkVNgaOL9f0e22x6tC9e2H3unZQlSUdnVaSKpZ+hdSChXGaRjp2UIT7pxmPqNCyv51F597KEX5WT60jNg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.18.0.tgz", + "integrity": "sha512-+PeCjODbxtamHcPl+couXMeHEefpUpr7IHftj4Y4Nia1hj8gGq4VlIcqhToAw8YjLeCTfOR7r7xtj3pJcYdP8A==", "requires": { - "@algolia/client-common": "4.14.3", - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" + "@algolia/client-common": "4.18.0", + "@algolia/requester-common": "4.18.0", + "@algolia/transporter": "4.18.0" } }, "@algolia/client-search": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.3.tgz", - "integrity": "sha512-I2U7xBx5OPFdPLA8AXKUPPxGY3HDxZ4r7+mlZ8ZpLbI8/ri6fnu6B4z3wcL7sgHhDYMwnAE8Xr0AB0h3Hnkp4A==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.18.0.tgz", + "integrity": "sha512-F9xzQXTjm6UuZtnsLIew6KSraXQ0AzS/Ee+OD+mQbtcA/K1sg89tqb8TkwjtiYZ0oij13u3EapB3gPZwm+1Y6g==", "requires": { - "@algolia/client-common": "4.14.3", - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" + "@algolia/client-common": "4.18.0", + "@algolia/requester-common": "4.18.0", + "@algolia/transporter": "4.18.0" } }, "@algolia/events": { @@ -12846,47 +12882,47 @@ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, "@algolia/logger-common": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.3.tgz", - "integrity": "sha512-kUEAZaBt/J3RjYi8MEBT2QEexJR2kAE2mtLmezsmqMQZTV502TkHCxYzTwY2dE7OKcUTxi4OFlMuS4GId9CWPw==" + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.18.0.tgz", + "integrity": "sha512-46etYgSlkoKepkMSyaoriSn2JDgcrpc/nkOgou/lm0y17GuMl9oYZxwKKTSviLKI5Irk9nSKGwnBTQYwXOYdRg==" }, "@algolia/logger-console": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.3.tgz", - "integrity": "sha512-ZWqAlUITktiMN2EiFpQIFCJS10N96A++yrexqC2Z+3hgF/JcKrOxOdT4nSCQoEPvU4Ki9QKbpzbebRDemZt/hw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.18.0.tgz", + "integrity": "sha512-3P3VUYMl9CyJbi/UU1uUNlf6Z8N2ltW3Oqhq/nR7vH0CjWv32YROq3iGWGxB2xt3aXobdUPXs6P0tHSKRmNA6g==", "requires": { - "@algolia/logger-common": "4.14.3" + "@algolia/logger-common": "4.18.0" } }, "@algolia/requester-browser-xhr": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.3.tgz", - "integrity": "sha512-AZeg2T08WLUPvDncl2XLX2O67W5wIO8MNaT7z5ii5LgBTuk/rU4CikTjCe2xsUleIZeFl++QrPAi4Bdxws6r/Q==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.18.0.tgz", + "integrity": "sha512-/AcWHOBub2U4TE/bPi4Gz1XfuLK6/7dj4HJG+Z2SfQoS1RjNLshZclU3OoKIkFp8D2NC7+BNsPvr9cPLyW8nyQ==", "requires": { - "@algolia/requester-common": "4.14.3" + "@algolia/requester-common": "4.18.0" } }, "@algolia/requester-common": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.3.tgz", - "integrity": "sha512-RrRzqNyKFDP7IkTuV3XvYGF9cDPn9h6qEDl595lXva3YUk9YSS8+MGZnnkOMHvjkrSCKfoLeLbm/T4tmoIeclw==" + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.18.0.tgz", + "integrity": "sha512-xlT8R1qYNRBCi1IYLsx7uhftzdfsLPDGudeQs+xvYB4sQ3ya7+ppolB/8m/a4F2gCkEO6oxpp5AGemM7kD27jA==" }, "@algolia/requester-node-http": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.3.tgz", - "integrity": "sha512-O5wnPxtDRPuW2U0EaOz9rMMWdlhwP0J0eSL1Z7TtXF8xnUeeUyNJrdhV5uy2CAp6RbhM1VuC3sOJcIR6Av+vbA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.18.0.tgz", + "integrity": "sha512-TGfwj9aeTVgOUhn5XrqBhwUhUUDnGIKlI0kCBMdR58XfXcfdwomka+CPIgThRbfYw04oQr31A6/95ZH2QVJ9UQ==", "requires": { - "@algolia/requester-common": "4.14.3" + "@algolia/requester-common": "4.18.0" } }, "@algolia/transporter": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.3.tgz", - "integrity": "sha512-2qlKlKsnGJ008exFRb5RTeTOqhLZj0bkMCMVskxoqWejs2Q2QtWmsiH98hDfpw0fmnyhzHEt0Z7lqxBYp8bW2w==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.18.0.tgz", + "integrity": "sha512-xbw3YRUGtXQNG1geYFEDDuFLZt4Z8YNKbamHPkzr3rWc6qp4/BqEeXcI2u/P/oMq2yxtXgMxrCxOPA8lyIe5jw==", "requires": { - "@algolia/cache-common": "4.14.3", - "@algolia/logger-common": "4.14.3", - "@algolia/requester-common": "4.14.3" + "@algolia/cache-common": "4.18.0", + "@algolia/logger-common": "4.18.0", + "@algolia/requester-common": "4.18.0" } }, "@ampproject/remapping": { @@ -14118,25 +14154,25 @@ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==" }, "@docsearch/css": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.3.tgz", - "integrity": "sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==" + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.1.tgz", + "integrity": "sha512-2Pu9HDg/uP/IT10rbQ+4OrTQuxIWdKVUEdcw9/w7kZJv9NeHS6skJx1xuRiFyoGKwAzcHXnLp7csE99sj+O1YA==" }, "@docsearch/react": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.3.tgz", - "integrity": "sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.1.tgz", + "integrity": "sha512-t5mEODdLzZq4PTFAm/dvqcvZFdPDMdfPE5rJS5SC8OUq9mPzxEy6b+9THIqNM9P0ocCb4UC5jqBrxKclnuIbzQ==", "requires": { - "@algolia/autocomplete-core": "1.7.4", - "@algolia/autocomplete-preset-algolia": "1.7.4", - "@docsearch/css": "3.3.3", + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.5.1", "algoliasearch": "^4.0.0" } }, "@docusaurus/core": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.3.1.tgz", - "integrity": "sha512-0Jd4jtizqnRAr7svWaBbbrCCN8mzBNd2xFLoT/IM7bGfFie5y58oz97KzXliwiLY3zWjqMXjQcuP1a5VgCv2JA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.1.tgz", + "integrity": "sha512-SNsY7PshK3Ri7vtsLXVeAJGS50nJN3RgF836zkyUfAD01Fq+sAk5EwWgLw+nnm5KVNGDu7PRR2kRGDsWvqpo0g==", "requires": { "@babel/core": "^7.18.6", "@babel/generator": "^7.18.7", @@ -14148,13 +14184,13 @@ "@babel/runtime": "^7.18.6", "@babel/runtime-corejs3": "^7.18.6", "@babel/traverse": "^7.18.8", - "@docusaurus/cssnano-preset": "2.3.1", - "@docusaurus/logger": "2.3.1", - "@docusaurus/mdx-loader": "2.3.1", + "@docusaurus/cssnano-preset": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "2.3.1", - "@docusaurus/utils-common": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "@slorber/static-site-generator-webpack-plugin": "^4.0.7", "@svgr/webpack": "^6.2.1", "autoprefixer": "^10.4.7", @@ -14212,9 +14248,9 @@ } }, "@docusaurus/cssnano-preset": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.3.1.tgz", - "integrity": "sha512-7mIhAROES6CY1GmCjR4CZkUfjTL6B3u6rKHK0ChQl2d1IevYXq/k/vFgvOrJfcKxiObpMnE9+X6R2Wt1KqxC6w==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.1.tgz", + "integrity": "sha512-ka+vqXwtcW1NbXxWsh6yA1Ckii1klY9E53cJ4O9J09nkMBgrNX3iEFED1fWdv8wf4mJjvGi5RLZ2p9hJNjsLyQ==", "requires": { "cssnano-preset-advanced": "^5.3.8", "postcss": "^8.4.14", @@ -14223,23 +14259,23 @@ } }, "@docusaurus/logger": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.3.1.tgz", - "integrity": "sha512-2lAV/olKKVr9qJhfHFCaqBIl8FgYjbUFwgUnX76+cULwQYss+42ZQ3grHGFvI0ocN2X55WcYe64ellQXz7suqg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.4.1.tgz", + "integrity": "sha512-5h5ysIIWYIDHyTVd8BjheZmQZmEgWDR54aQ1BX9pjFfpyzFo5puKXKYrYJXbjEHGyVhEzmB9UXwbxGfaZhOjcg==", "requires": { "chalk": "^4.1.2", "tslib": "^2.4.0" } }, "@docusaurus/mdx-loader": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.3.1.tgz", - "integrity": "sha512-Gzga7OsxQRpt3392K9lv/bW4jGppdLFJh3luKRknCKSAaZrmVkOQv2gvCn8LAOSZ3uRg5No7AgYs/vpL8K94lA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.4.1.tgz", + "integrity": "sha512-4KhUhEavteIAmbBj7LVFnrVYDiU51H5YWW1zY6SmBSte/YLhDutztLTBE0PQl1Grux1jzUJeaSvAzHpTn6JJDQ==", "requires": { "@babel/parser": "^7.18.8", "@babel/traverse": "^7.18.8", - "@docusaurus/logger": "2.3.1", - "@docusaurus/utils": "2.3.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/utils": "2.4.1", "@mdx-js/mdx": "^1.6.22", "escape-html": "^1.0.3", "file-loader": "^6.2.0", @@ -14256,12 +14292,12 @@ } }, "@docusaurus/module-type-aliases": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.3.1.tgz", - "integrity": "sha512-6KkxfAVOJqIUynTRb/tphYCl+co3cP0PlHiMDbi+SzmYxMdgIrwYqH9yAnGSDoN6Jk2ZE/JY/Azs/8LPgKP48A==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.1.tgz", + "integrity": "sha512-gLBuIFM8Dp2XOCWffUDSjtxY7jQgKvYujt7Mx5s4FCTfoL5dN1EVbnrn+O2Wvh8b0a77D57qoIDY7ghgmatR1A==", "requires": { "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "2.3.1", + "@docusaurus/types": "2.4.1", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -14271,15 +14307,15 @@ } }, "@docusaurus/plugin-client-redirects": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-2.3.1.tgz", - "integrity": "sha512-Ye0z36/L8685ni0DIxHqPPaHIXFXiSF90QYiYfpODBX6NxvvveUTyylsDBU1GQhPXPn1bd39QgaOuZ+j9gfaog==", - "requires": { - "@docusaurus/core": "2.3.1", - "@docusaurus/logger": "2.3.1", - "@docusaurus/utils": "2.3.1", - "@docusaurus/utils-common": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-2.4.1.tgz", + "integrity": "sha512-tp0j16gaLIJ4p+IR0P6KDOFsTOGGMY54MNPnmM61Vaqqt5omLqsuKUO8UlCGU1oW/4EIQOhXYy99XYY5MjE+7A==", + "requires": { + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "eta": "^2.0.0", "fs-extra": "^10.1.0", "lodash": "^4.17.21", @@ -14287,17 +14323,17 @@ } }, "@docusaurus/plugin-content-blog": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.3.1.tgz", - "integrity": "sha512-f5LjqX+9WkiLyGiQ41x/KGSJ/9bOjSD8lsVhPvYeUYHCtYpuiDKfhZE07O4EqpHkBx4NQdtQDbp+aptgHSTuiw==", - "requires": { - "@docusaurus/core": "2.3.1", - "@docusaurus/logger": "2.3.1", - "@docusaurus/mdx-loader": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils": "2.3.1", - "@docusaurus/utils-common": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.1.tgz", + "integrity": "sha512-E2i7Knz5YIbE1XELI6RlTnZnGgS52cUO4BlCiCUCvQHbR+s1xeIWz4C6BtaVnlug0Ccz7nFSksfwDpVlkujg5Q==", + "requires": { + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^10.1.0", @@ -14310,17 +14346,17 @@ } }, "@docusaurus/plugin-content-docs": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.3.1.tgz", - "integrity": "sha512-DxztTOBEruv7qFxqUtbsqXeNcHqcVEIEe+NQoI1oi2DBmKBhW/o0MIal8lt+9gvmpx3oYtlwmLOOGepxZgJGkw==", - "requires": { - "@docusaurus/core": "2.3.1", - "@docusaurus/logger": "2.3.1", - "@docusaurus/mdx-loader": "2.3.1", - "@docusaurus/module-type-aliases": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.1.tgz", + "integrity": "sha512-Lo7lSIcpswa2Kv4HEeUcGYqaasMUQNpjTXpV0N8G6jXgZaQurqp7E8NGYeGbDXnb48czmHWbzDL4S3+BbK0VzA==", + "requires": { + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/module-type-aliases": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "@types/react-router-config": "^5.0.6", "combine-promises": "^1.1.0", "fs-extra": "^10.1.0", @@ -14333,100 +14369,100 @@ } }, "@docusaurus/plugin-content-pages": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.3.1.tgz", - "integrity": "sha512-E80UL6hvKm5VVw8Ka8YaVDtO6kWWDVUK4fffGvkpQ/AJQDOg99LwOXKujPoICC22nUFTsZ2Hp70XvpezCsFQaA==", - "requires": { - "@docusaurus/core": "2.3.1", - "@docusaurus/mdx-loader": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.1.tgz", + "integrity": "sha512-/UjuH/76KLaUlL+o1OvyORynv6FURzjurSjvn2lbWTFc4tpYY2qLYTlKpTCBVPhlLUQsfyFnshEJDLmPneq2oA==", + "requires": { + "@docusaurus/core": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "fs-extra": "^10.1.0", "tslib": "^2.4.0", "webpack": "^5.73.0" } }, "@docusaurus/plugin-debug": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.3.1.tgz", - "integrity": "sha512-Ujpml1Ppg4geB/2hyu2diWnO49az9U2bxM9Shen7b6qVcyFisNJTkVG2ocvLC7wM1efTJcUhBO6zAku2vKJGMw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.4.1.tgz", + "integrity": "sha512-7Yu9UPzRShlrH/G8btOpR0e6INFZr0EegWplMjOqelIwAcx3PKyR8mgPTxGTxcqiYj6hxSCRN0D8R7YrzImwNA==", "requires": { - "@docusaurus/core": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils": "2.3.1", + "@docusaurus/core": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", "fs-extra": "^10.1.0", "react-json-view": "^1.21.3", "tslib": "^2.4.0" } }, "@docusaurus/plugin-google-analytics": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.3.1.tgz", - "integrity": "sha512-OHip0GQxKOFU8n7gkt3TM4HOYTXPCFDjqKbMClDD3KaDnyTuMp/Zvd9HSr770lLEscgPWIvzhJByRAClqsUWiQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.1.tgz", + "integrity": "sha512-dyZJdJiCoL+rcfnm0RPkLt/o732HvLiEwmtoNzOoz9MSZz117UH2J6U2vUDtzUzwtFLIf32KkeyzisbwUCgcaQ==", "requires": { - "@docusaurus/core": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", + "@docusaurus/core": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "tslib": "^2.4.0" } }, "@docusaurus/plugin-google-gtag": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.3.1.tgz", - "integrity": "sha512-uXtDhfu4+Hm+oqWUySr3DNI5cWC/rmP6XJyAk83Heor3dFjZqDwCbkX8yWPywkRiWev3Dk/rVF8lEn0vIGVocA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.1.tgz", + "integrity": "sha512-mKIefK+2kGTQBYvloNEKtDmnRD7bxHLsBcxgnbt4oZwzi2nxCGjPX6+9SQO2KCN5HZbNrYmGo5GJfMgoRvy6uA==", "requires": { - "@docusaurus/core": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", + "@docusaurus/core": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "tslib": "^2.4.0" } }, "@docusaurus/plugin-google-tag-manager": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.3.1.tgz", - "integrity": "sha512-Ww2BPEYSqg8q8tJdLYPFFM3FMDBCVhEM4UUqKzJaiRMx3NEoly3qqDRAoRDGdIhlC//Rf0iJV9cWAoq2m6k3sw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.1.tgz", + "integrity": "sha512-Zg4Ii9CMOLfpeV2nG74lVTWNtisFaH9QNtEw48R5QE1KIwDBdTVaiSA18G1EujZjrzJJzXN79VhINSbOJO/r3g==", "requires": { - "@docusaurus/core": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", + "@docusaurus/core": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "tslib": "^2.4.0" } }, "@docusaurus/plugin-sitemap": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.3.1.tgz", - "integrity": "sha512-8Yxile/v6QGYV9vgFiYL+8d2N4z4Er3pSHsrD08c5XI8bUXxTppMwjarDUTH/TRTfgAWotRbhJ6WZLyajLpozA==", - "requires": { - "@docusaurus/core": "2.3.1", - "@docusaurus/logger": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils": "2.3.1", - "@docusaurus/utils-common": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.1.tgz", + "integrity": "sha512-lZx+ijt/+atQ3FVE8FOHV/+X3kuok688OydDXrqKRJyXBJZKgGjA2Qa8RjQ4f27V2woaXhtnyrdPop/+OjVMRg==", + "requires": { + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "fs-extra": "^10.1.0", "sitemap": "^7.1.1", "tslib": "^2.4.0" } }, "@docusaurus/preset-classic": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.3.1.tgz", - "integrity": "sha512-OQ5W0AHyfdUk0IldwJ3BlnZ1EqoJuu2L2BMhqLbqwNWdkmzmSUvlFLH1Pe7CZSQgB2YUUC/DnmjbPKk/qQD0lQ==", - "requires": { - "@docusaurus/core": "2.3.1", - "@docusaurus/plugin-content-blog": "2.3.1", - "@docusaurus/plugin-content-docs": "2.3.1", - "@docusaurus/plugin-content-pages": "2.3.1", - "@docusaurus/plugin-debug": "2.3.1", - "@docusaurus/plugin-google-analytics": "2.3.1", - "@docusaurus/plugin-google-gtag": "2.3.1", - "@docusaurus/plugin-google-tag-manager": "2.3.1", - "@docusaurus/plugin-sitemap": "2.3.1", - "@docusaurus/theme-classic": "2.3.1", - "@docusaurus/theme-common": "2.3.1", - "@docusaurus/theme-search-algolia": "2.3.1", - "@docusaurus/types": "2.3.1" + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.4.1.tgz", + "integrity": "sha512-P4//+I4zDqQJ+UDgoFrjIFaQ1MeS9UD1cvxVQaI6O7iBmiHQm0MGROP1TbE7HlxlDPXFJjZUK3x3cAoK63smGQ==", + "requires": { + "@docusaurus/core": "2.4.1", + "@docusaurus/plugin-content-blog": "2.4.1", + "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/plugin-content-pages": "2.4.1", + "@docusaurus/plugin-debug": "2.4.1", + "@docusaurus/plugin-google-analytics": "2.4.1", + "@docusaurus/plugin-google-gtag": "2.4.1", + "@docusaurus/plugin-google-tag-manager": "2.4.1", + "@docusaurus/plugin-sitemap": "2.4.1", + "@docusaurus/theme-classic": "2.4.1", + "@docusaurus/theme-common": "2.4.1", + "@docusaurus/theme-search-algolia": "2.4.1", + "@docusaurus/types": "2.4.1" } }, "@docusaurus/react-loadable": { @@ -14439,26 +14475,26 @@ } }, "@docusaurus/theme-classic": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.3.1.tgz", - "integrity": "sha512-SelSIDvyttb7ZYHj8vEUhqykhAqfOPKk+uP0z85jH72IMC58e7O8DIlcAeBv+CWsLbNIl9/Hcg71X0jazuxJug==", - "requires": { - "@docusaurus/core": "2.3.1", - "@docusaurus/mdx-loader": "2.3.1", - "@docusaurus/module-type-aliases": "2.3.1", - "@docusaurus/plugin-content-blog": "2.3.1", - "@docusaurus/plugin-content-docs": "2.3.1", - "@docusaurus/plugin-content-pages": "2.3.1", - "@docusaurus/theme-common": "2.3.1", - "@docusaurus/theme-translations": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils": "2.3.1", - "@docusaurus/utils-common": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.4.1.tgz", + "integrity": "sha512-Rz0wKUa+LTW1PLXmwnf8mn85EBzaGSt6qamqtmnh9Hflkc+EqiYMhtUJeLdV+wsgYq4aG0ANc+bpUDpsUhdnwg==", + "requires": { + "@docusaurus/core": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/module-type-aliases": "2.4.1", + "@docusaurus/plugin-content-blog": "2.4.1", + "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/plugin-content-pages": "2.4.1", + "@docusaurus/theme-common": "2.4.1", + "@docusaurus/theme-translations": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", "copy-text-to-clipboard": "^3.0.1", - "infima": "0.2.0-alpha.42", + "infima": "0.2.0-alpha.43", "lodash": "^4.17.21", "nprogress": "^0.2.0", "postcss": "^8.4.14", @@ -14471,16 +14507,17 @@ } }, "@docusaurus/theme-common": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.3.1.tgz", - "integrity": "sha512-RYmYl2OR2biO+yhmW1aS5FyEvnrItPINa+0U2dMxcHpah8reSCjQ9eJGRmAgkZFchV1+aIQzXOI1K7LCW38O0g==", - "requires": { - "@docusaurus/mdx-loader": "2.3.1", - "@docusaurus/module-type-aliases": "2.3.1", - "@docusaurus/plugin-content-blog": "2.3.1", - "@docusaurus/plugin-content-docs": "2.3.1", - "@docusaurus/plugin-content-pages": "2.3.1", - "@docusaurus/utils": "2.3.1", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.4.1.tgz", + "integrity": "sha512-G7Zau1W5rQTaFFB3x3soQoZpkgMbl/SYNG8PfMFIjKa3M3q8n0m/GRf5/H/e5BqOvt8c+ZWIXGCiz+kUCSHovA==", + "requires": { + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/module-type-aliases": "2.4.1", + "@docusaurus/plugin-content-blog": "2.4.1", + "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/plugin-content-pages": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -14493,18 +14530,18 @@ } }, "@docusaurus/theme-search-algolia": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.3.1.tgz", - "integrity": "sha512-JdHaRqRuH1X++g5fEMLnq7OtULSGQdrs9AbhcWRQ428ZB8/HOiaN6mj3hzHvcD3DFgu7koIVtWPQnvnN7iwzHA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.1.tgz", + "integrity": "sha512-6BcqW2lnLhZCXuMAvPRezFs1DpmEKzXFKlYjruuas+Xy3AQeFzDJKTJFIm49N77WFCTyxff8d3E4Q9pi/+5McQ==", "requires": { "@docsearch/react": "^3.1.1", - "@docusaurus/core": "2.3.1", - "@docusaurus/logger": "2.3.1", - "@docusaurus/plugin-content-docs": "2.3.1", - "@docusaurus/theme-common": "2.3.1", - "@docusaurus/theme-translations": "2.3.1", - "@docusaurus/utils": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/theme-common": "2.4.1", + "@docusaurus/theme-translations": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "algoliasearch": "^4.13.1", "algoliasearch-helper": "^3.10.0", "clsx": "^1.2.1", @@ -14516,18 +14553,18 @@ } }, "@docusaurus/theme-translations": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.3.1.tgz", - "integrity": "sha512-BsBZzAewJabVhoGG1Ij2u4pMS3MPW6gZ6sS4pc+Y7czevRpzxoFNJXRtQDVGe7mOpv/MmRmqg4owDK+lcOTCVQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.4.1.tgz", + "integrity": "sha512-T1RAGP+f86CA1kfE8ejZ3T3pUU3XcyvrGMfC/zxCtc2BsnoexuNI9Vk2CmuKCb+Tacvhxjv5unhxXce0+NKyvA==", "requires": { "fs-extra": "^10.1.0", "tslib": "^2.4.0" } }, "@docusaurus/types": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.3.1.tgz", - "integrity": "sha512-PREbIRhTaNNY042qmfSE372Jb7djZt+oVTZkoqHJ8eff8vOIc2zqqDqBVc5BhOfpZGPTrE078yy/torUEZy08A==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.1.tgz", + "integrity": "sha512-0R+cbhpMkhbRXX138UOc/2XZFF8hiZa6ooZAEEJFp5scytzCw4tC1gChMFXrpa3d2tYE6AX8IrOEpSonLmfQuQ==", "requires": { "@types/history": "^4.7.11", "@types/react": "*", @@ -14540,11 +14577,11 @@ } }, "@docusaurus/utils": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.3.1.tgz", - "integrity": "sha512-9WcQROCV0MmrpOQDXDGhtGMd52DHpSFbKLfkyaYumzbTstrbA5pPOtiGtxK1nqUHkiIv8UwexS54p0Vod2I1lg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.1.tgz", + "integrity": "sha512-1lvEZdAQhKNht9aPXPoh69eeKnV0/62ROhQeFKKxmzd0zkcuE/Oc5Gpnt00y/f5bIsmOsYMY7Pqfm/5rteT5GA==", "requires": { - "@docusaurus/logger": "2.3.1", + "@docusaurus/logger": "2.4.1", "@svgr/webpack": "^6.2.1", "escape-string-regexp": "^4.0.0", "file-loader": "^6.2.0", @@ -14563,20 +14600,20 @@ } }, "@docusaurus/utils-common": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.3.1.tgz", - "integrity": "sha512-pVlRpXkdNcxmKNxAaB1ya2hfCEvVsLDp2joeM6K6uv55Oc5nVIqgyYSgSNKZyMdw66NnvMfsu0RBylcwZQKo9A==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.4.1.tgz", + "integrity": "sha512-bCVGdZU+z/qVcIiEQdyx0K13OC5mYwxhSuDUR95oFbKVuXYRrTVrwZIqQljuo1fyJvFTKHiL9L9skQOPokuFNQ==", "requires": { "tslib": "^2.4.0" } }, "@docusaurus/utils-validation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.3.1.tgz", - "integrity": "sha512-7n0208IG3k1HVTByMHlZoIDjjOFC8sbViHVXJx0r3Q+3Ezrx+VQ1RZ/zjNn6lT+QBCRCXlnlaoJ8ug4HIVgQ3w==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.4.1.tgz", + "integrity": "sha512-unII3hlJlDwZ3w8U+pMO3Lx3RhI4YEbY3YNsQj4yzrkZzlpqZOLuAiZK2JyULnD+TKbceKU0WyWkQXtYbLNDFA==", "requires": { - "@docusaurus/logger": "2.3.1", - "@docusaurus/utils": "2.3.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/utils": "2.4.1", "joi": "^17.6.0", "js-yaml": "^4.1.0", "tslib": "^2.4.0" @@ -15046,11 +15083,11 @@ } }, "@types/hast": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", - "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.5.tgz", + "integrity": "sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==", "requires": { - "@types/unist": "*" + "@types/unist": "^2" } }, "@types/history": { @@ -15098,11 +15135,11 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, "@types/mdast": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", - "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", + "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", "requires": { - "@types/unist": "*" + "@types/unist": "^2" } }, "@types/mime": { @@ -15223,9 +15260,9 @@ } }, "@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.7.tgz", + "integrity": "sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==" }, "@types/ws": { "version": "8.5.4", @@ -15514,30 +15551,30 @@ "requires": {} }, "algoliasearch": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.3.tgz", - "integrity": "sha512-GZTEuxzfWbP/vr7ZJfGzIl8fOsoxN916Z6FY2Egc9q2TmZ6hvq5KfAxY89pPW01oW/2HDEKA8d30f9iAH9eXYg==", - "requires": { - "@algolia/cache-browser-local-storage": "4.14.3", - "@algolia/cache-common": "4.14.3", - "@algolia/cache-in-memory": "4.14.3", - "@algolia/client-account": "4.14.3", - "@algolia/client-analytics": "4.14.3", - "@algolia/client-common": "4.14.3", - "@algolia/client-personalization": "4.14.3", - "@algolia/client-search": "4.14.3", - "@algolia/logger-common": "4.14.3", - "@algolia/logger-console": "4.14.3", - "@algolia/requester-browser-xhr": "4.14.3", - "@algolia/requester-common": "4.14.3", - "@algolia/requester-node-http": "4.14.3", - "@algolia/transporter": "4.14.3" + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.18.0.tgz", + "integrity": "sha512-pCuVxC1SVcpc08ENH32T4sLKSyzoU7TkRIDBMwSLfIiW+fq4znOmWDkAygHZ6pRcO9I1UJdqlfgnV7TRj+MXrA==", + "requires": { + "@algolia/cache-browser-local-storage": "4.18.0", + "@algolia/cache-common": "4.18.0", + "@algolia/cache-in-memory": "4.18.0", + "@algolia/client-account": "4.18.0", + "@algolia/client-analytics": "4.18.0", + "@algolia/client-common": "4.18.0", + "@algolia/client-personalization": "4.18.0", + "@algolia/client-search": "4.18.0", + "@algolia/logger-common": "4.18.0", + "@algolia/logger-console": "4.18.0", + "@algolia/requester-browser-xhr": "4.18.0", + "@algolia/requester-common": "4.18.0", + "@algolia/requester-node-http": "4.18.0", + "@algolia/transporter": "4.18.0" } }, "algoliasearch-helper": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.11.3.tgz", - "integrity": "sha512-TbaEvLwiuGygHQIB8y+OsJKQQ40+JKUua5B91X66tMUHyyhbNHvqyr0lqd3wCoyKx7WybyQrC0WJvzoIeh24Aw==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.13.3.tgz", + "integrity": "sha512-jhbbuYZ+fheXpaJlqdJdFa1jOsrTWKmRRTYDM3oVTto5VodZzM7tT+BHzslAotaJf/81CKrm6yLRQn8WIr/K4A==", "requires": { "@algolia/events": "^4.0.1" } @@ -16249,9 +16286,9 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "copy-text-to-clipboard": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", - "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", + "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==" }, "copy-webpack-plugin": { "version": "11.0.0", @@ -16364,11 +16401,11 @@ } }, "cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", "requires": { - "node-fetch": "2.6.7" + "node-fetch": "^2.6.12" } }, "cross-spawn": { @@ -16768,13 +16805,13 @@ } }, "domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "requires": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" + "domhandler": "^5.0.3" } }, "dot-case": { @@ -17136,9 +17173,9 @@ } }, "fbjs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", - "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", + "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", "requires": { "cross-fetch": "^3.1.5", "fbjs-css-vars": "^1.0.0", @@ -17146,7 +17183,7 @@ "object-assign": "^4.1.0", "promise": "^7.1.1", "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.30" + "ua-parser-js": "^1.0.35" } }, "fbjs-css-vars": { @@ -17245,9 +17282,9 @@ } }, "flux": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz", - "integrity": "sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", + "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", "requires": { "fbemitter": "^3.0.0", "fbjs": "^3.0.1" @@ -17781,14 +17818,14 @@ } }, "htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "requires": { "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "domutils": "^3.0.1", - "entities": "^4.3.0" + "entities": "^4.4.0" } }, "http-cache-semantics": { @@ -17909,9 +17946,9 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" }, "infima": { - "version": "0.2.0-alpha.42", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.42.tgz", - "integrity": "sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww==" + "version": "0.2.0-alpha.43", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", + "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==" }, "inflight": { "version": "1.0.6", @@ -18625,9 +18662,9 @@ } }, "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", "requires": { "whatwg-url": "^5.0.0" } @@ -19326,9 +19363,9 @@ } }, "postcss-sort-media-queries": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.3.0.tgz", - "integrity": "sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", + "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", "requires": { "sort-css-media-queries": "2.1.0" } @@ -19749,11 +19786,11 @@ } }, "react-textarea-autosize": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.4.0.tgz", - "integrity": "sha512-YrTFaEHLgJsi8sJVYHBzYn+mkP3prGkmP2DKb/tm0t7CLJY5t1Rxix8070LAKb0wby7bl/lf2EeHkuMihMZMwQ==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.2.tgz", + "integrity": "sha512-uOkyjkEl0ByEK21eCJMHDGBAAd/BoFQBawYK5XItjAmCTeSbjxghd8qnt7nzsLYzidjnoObu6M26xts0YGKsGg==", "requires": { - "@babel/runtime": "^7.10.2", + "@babel/runtime": "^7.20.13", "use-composed-ref": "^1.3.0", "use-latest": "^1.2.1" } @@ -20249,6 +20286,12 @@ "ajv-keywords": "^3.5.2" } }, + "search-insights": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.7.0.tgz", + "integrity": "sha512-GLbVaGgzYEKMvuJbHRhLi1qoBFnjXZGZ6l4LxOYPCp4lI2jDRB3jPU9/XNhMwv6kvnA9slTreq6pvK+b3o3aqg==", + "peer": true + }, "section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", @@ -21049,9 +21092,9 @@ "peer": true }, "ua-parser-js": { - "version": "0.7.33", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.33.tgz", - "integrity": "sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw==" + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz", + "integrity": "sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==" }, "unherit": { "version": "1.1.3", diff --git a/docs/package.json b/docs/package.json index 297cedf242..a2b516536d 100644 --- a/docs/package.json +++ b/docs/package.json @@ -14,10 +14,10 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@docusaurus/core": "2.3.1", - "@docusaurus/plugin-client-redirects": "^2.3.1", - "@docusaurus/plugin-google-analytics": "^2.3.1", - "@docusaurus/preset-classic": "2.3.1", + "@docusaurus/core": "^2.4.1", + "@docusaurus/plugin-client-redirects": "^2.4.1", + "@docusaurus/plugin-google-analytics": "^2.4.1", + "@docusaurus/preset-classic": "^2.4.1", "@mdx-js/react": "^1.6.22", "@you54f/theme-github-codeblock": "^0.1.1", "autoprefixer": "^10.4.13", @@ -30,7 +30,7 @@ "tailwindcss": "^3.2.7" }, "devDependencies": { - "@docusaurus/module-type-aliases": "2.3.1" + "@docusaurus/module-type-aliases": "^2.4.1" }, "browserslist": { "production": [ From 6204bd8ee6a3eb55fd5cf522d71cfb95a1756084 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Wed, 19 Jul 2023 08:05:46 -0700 Subject: [PATCH 093/108] chore: make hardcoded json string for consumer genesis readable (#1161) make readable Co-authored-by: Marius Poke --- x/ccv/provider/keeper/proposal_test.go | 85 +++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 2 deletions(-) diff --git a/x/ccv/provider/keeper/proposal_test.go b/x/ccv/provider/keeper/proposal_test.go index 4e9ee3f4ea..c84369e815 100644 --- a/x/ccv/provider/keeper/proposal_test.go +++ b/x/ccv/provider/keeper/proposal_test.go @@ -852,10 +852,91 @@ func TestMakeConsumerGenesis(t *testing.T) { actualGenesis, _, err := providerKeeper.MakeConsumerGenesis(ctx, &prop) require.NoError(t, err) - jsonString := `{"params":{"enabled":true, "blocks_per_distribution_transmission":1000, "ccv_timeout_period":2419200000000000, "transfer_timeout_period": 3600000000000, "consumer_redistribution_fraction":"0.75", "historical_entries":10000, "unbonding_period": 1728000000000000, "soft_opt_out_threshold": "0.05", "reward_denoms": [], "provider_reward_denoms": []},"new_chain":true,"provider_client_state":{"chain_id":"testchain1","trust_level":{"numerator":1,"denominator":3},"trusting_period":1197504000000000,"unbonding_period":1814400000000000,"max_clock_drift":10000000000,"frozen_height":{},"latest_height":{"revision_height":5},"proof_specs":[{"leaf_spec":{"hash":1,"prehash_value":1,"length":1,"prefix":"AA=="},"inner_spec":{"child_order":[0,1],"child_size":33,"min_prefix_length":4,"max_prefix_length":12,"hash":1}},{"leaf_spec":{"hash":1,"prehash_value":1,"length":1,"prefix":"AA=="},"inner_spec":{"child_order":[0,1],"child_size":32,"min_prefix_length":1,"max_prefix_length":1,"hash":1}}],"upgrade_path":["upgrade","upgradedIBCState"],"allow_update_after_expiry":true,"allow_update_after_misbehaviour":true},"provider_consensus_state":{"timestamp":"2020-01-02T00:00:10Z","root":{"hash":"LpGpeyQVLUo9HpdsgJr12NP2eCICspcULiWa5u9udOA="},"next_validators_hash":"E30CE736441FB9101FADDAF7E578ABBE6DFDB67207112350A9A904D554E1F5BE"},"unbonding_sequences":null,"initial_val_set":[{"pub_key":{"type":"tendermint/PubKeyEd25519","value":"dcASx5/LIKZqagJWN0frOlFtcvz91frYmj/zmoZRWro="},"power":1}]}` + // JSON string with tabs, newlines and spaces for readability + jsonString := `{ + "params": { + "enabled": true, + "blocks_per_distribution_transmission": 1000, + "ccv_timeout_period": 2419200000000000, + "transfer_timeout_period": 3600000000000, + "consumer_redistribution_fraction": "0.75", + "historical_entries": 10000, + "unbonding_period": 1728000000000000, + "soft_opt_out_threshold": "0.05", + "reward_denoms": [], + "provider_reward_denoms": [] + }, + "new_chain": true, + "provider_client_state": { + "chain_id": "testchain1", + "trust_level": { + "numerator": 1, + "denominator": 3 + }, + "trusting_period": 1197504000000000, + "unbonding_period": 1814400000000000, + "max_clock_drift": 10000000000, + "frozen_height": {}, + "latest_height": { + "revision_height": 5 + }, + "proof_specs": [ + { + "leaf_spec": { + "hash": 1, + "prehash_value": 1, + "length": 1, + "prefix": "AA==" + }, + "inner_spec": { + "child_order": [0, 1], + "child_size": 33, + "min_prefix_length": 4, + "max_prefix_length": 12, + "hash": 1 + } + }, + { + "leaf_spec": { + "hash": 1, + "prehash_value": 1, + "length": 1, + "prefix": "AA==" + }, + "inner_spec": { + "child_order": [0, 1], + "child_size": 32, + "min_prefix_length": 1, + "max_prefix_length": 1, + "hash": 1 + } + } + ], + "upgrade_path": ["upgrade", "upgradedIBCState"], + "allow_update_after_expiry": true, + "allow_update_after_misbehaviour": true + }, + "provider_consensus_state": { + "timestamp": "2020-01-02T00:00:10Z", + "root": { + "hash": "LpGpeyQVLUo9HpdsgJr12NP2eCICspcULiWa5u9udOA=" + }, + "next_validators_hash": "E30CE736441FB9101FADDAF7E578ABBE6DFDB67207112350A9A904D554E1F5BE" + }, + "unbonding_sequences": null, + "initial_val_set": [ + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "dcASx5/LIKZqagJWN0frOlFtcvz91frYmj/zmoZRWro=" + }, + "power": 1 + } + ] + }` var expectedGenesis consumertypes.GenesisState - err = json.Unmarshal([]byte(jsonString), &expectedGenesis) + err = json.Unmarshal([]byte(jsonString), &expectedGenesis) // ignores tabs, newlines and spaces require.NoError(t, err) // Zeroing out different fields that are challenging to mock From 064c601231b85066bfaf734efec2751a672528a7 Mon Sep 17 00:00:00 2001 From: yaruwangway <69694322+yaruwangway@users.noreply.github.com> Date: Wed, 19 Jul 2023 17:29:59 +0200 Subject: [PATCH 094/108] Fix: export InitTimeoutTimestamps and VscSendTimestamps to genesis (#1076) * fix: add InitTimeoutTimestamps and VscSendTimestamps to genesis * fix: add chainID to vscSendTimestamp * test: fix tests * test: fixgenesis test * test: fix test TestInitAndExportGenesis * feat: add exportedVscSendTimestamps * docs: update changelog * feat: update exportedVscSendTimestamps * fix: lint --- CHANGELOG.md | 1 + .../ccv/consumer/v1/genesis.proto | 2 +- .../ccv/provider/v1/genesis.proto | 6 + .../ccv/provider/v1/provider.proto | 7 + .../ccv/provider/v1/tx.proto | 2 +- x/ccv/provider/keeper/genesis.go | 15 + x/ccv/provider/keeper/genesis_test.go | 47 ++ x/ccv/provider/module_test.go | 2 + x/ccv/provider/types/genesis.go | 4 + x/ccv/provider/types/genesis.pb.go | 241 +++++++--- x/ccv/provider/types/genesis_test.go | 58 +++ x/ccv/provider/types/provider.pb.go | 446 +++++++++++++----- 12 files changed, 668 insertions(+), 163 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a5c14c6e4..818bdca374 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## [Unreleased] Add an entry to the unreleased section whenever merging a PR to main that is not targeted at a specific release. These entries will eventually be included in a release. +* `[x/ccv/provider]` (fix) [#1076](https://github.com/cosmos/interchain-security/pull/1076) Add `InitTimeoutTimestamps` and `ExportedVscSendTimestamps` to exported genesis. * (fix!) revert consumer packet data changes from #1037 [#1150](https://github.com/cosmos/interchain-security/pull/1150) * (fix!) proper deletion of pending packets [#1146](https://github.com/cosmos/interchain-security/pull/1146) diff --git a/proto/interchain_security/ccv/consumer/v1/genesis.proto b/proto/interchain_security/ccv/consumer/v1/genesis.proto index 9c9418ef3c..3511f3f349 100644 --- a/proto/interchain_security/ccv/consumer/v1/genesis.proto +++ b/proto/interchain_security/ccv/consumer/v1/genesis.proto @@ -55,4 +55,4 @@ message HeightToValsetUpdateID { // OutstandingDowntime defines the genesis information for each validator // flagged with an outstanding downtime slashing. -message OutstandingDowntime { string validator_consensus_address = 1; } \ No newline at end of file +message OutstandingDowntime { string validator_consensus_address = 1; } diff --git a/proto/interchain_security/ccv/provider/v1/genesis.proto b/proto/interchain_security/ccv/provider/v1/genesis.proto index e1f6ab2e1a..1bc412262c 100644 --- a/proto/interchain_security/ccv/provider/v1/genesis.proto +++ b/proto/interchain_security/ccv/provider/v1/genesis.proto @@ -44,6 +44,12 @@ message GenesisState { // empty for a new chain repeated ConsumerAddrsToPrune consumer_addrs_to_prune = 11 [ (gogoproto.nullable) = false ]; + + repeated interchain_security.ccv.provider.v1.InitTimeoutTimestamp init_timeout_timestamps = 12 + [ (gogoproto.nullable) = false ]; + + repeated interchain_security.ccv.provider.v1.ExportedVscSendTimestamp exported_vsc_send_timestamps = 13 + [ (gogoproto.nullable) = false ]; } // consumer chain diff --git a/proto/interchain_security/ccv/provider/v1/provider.proto b/proto/interchain_security/ccv/provider/v1/provider.proto index b986255ce5..3c41e01c89 100644 --- a/proto/interchain_security/ccv/provider/v1/provider.proto +++ b/proto/interchain_security/ccv/provider/v1/provider.proto @@ -221,6 +221,13 @@ message VscSendTimestamp { [ (gogoproto.stdtime) = true, (gogoproto.nullable) = false ]; } +// ExportedVscSendTimestamps is VscSendTimestamp with chainID info for exporting to genesis +message ExportedVscSendTimestamp { + string chain_id = 1; + repeated VscSendTimestamp vsc_send_timestamps = 2 + [ (gogoproto.nullable) = false ]; +} + // // Key assignment section // diff --git a/proto/interchain_security/ccv/provider/v1/tx.proto b/proto/interchain_security/ccv/provider/v1/tx.proto index 257ab6e4e4..952ba31c09 100644 --- a/proto/interchain_security/ccv/provider/v1/tx.proto +++ b/proto/interchain_security/ccv/provider/v1/tx.proto @@ -44,4 +44,4 @@ message MsgRegisterConsumerRewardDenom { // MsgRegisterConsumerRewardDenomResponse defines the // Msg/RegisterConsumerRewardDenom response type. -message MsgRegisterConsumerRewardDenomResponse {} \ No newline at end of file +message MsgRegisterConsumerRewardDenomResponse {} diff --git a/x/ccv/provider/keeper/genesis.go b/x/ccv/provider/keeper/genesis.go index b3a0a1ef04..f201e6de50 100644 --- a/x/ccv/provider/keeper/genesis.go +++ b/x/ccv/provider/keeper/genesis.go @@ -91,6 +91,16 @@ func (k Keeper) InitGenesis(ctx sdk.Context, genState *types.GenesisState) { } } + for _, item := range genState.InitTimeoutTimestamps { + k.SetInitTimeoutTimestamp(ctx, item.ChainId, item.Timestamp) + } + + for _, item := range genState.ExportedVscSendTimestamps { + for _, vscSendTimestamp := range item.VscSendTimestamps { + k.SetVscSendTimestamp(ctx, item.ChainId, vscSendTimestamp.VscId, vscSendTimestamp.Timestamp) + } + } + k.SetParams(ctx, genState.Params) k.InitializeSlashMeter(ctx) } @@ -100,6 +110,7 @@ func (k Keeper) ExportGenesis(ctx sdk.Context) *types.GenesisState { // get a list of all registered consumer chains registeredChains := k.GetAllConsumerChains(ctx) + var exportedVscSendTimestamps []types.ExportedVscSendTimestamp // export states for each consumer chains var consumerStates []types.ConsumerState for _, chain := range registeredChains { @@ -130,6 +141,8 @@ func (k Keeper) ExportGenesis(ctx sdk.Context) *types.GenesisState { cs.PendingValsetChanges = k.GetPendingVSCPackets(ctx, chain.ChainId) consumerStates = append(consumerStates, cs) + vscSendTimestamps := k.GetAllVscSendTimestamps(ctx, chain.ChainId) + exportedVscSendTimestamps = append(exportedVscSendTimestamps, types.ExportedVscSendTimestamp{ChainId: chain.ChainId, VscSendTimestamps: vscSendTimestamps}) } // ConsumerAddrsToPrune are added only for registered consumer chains @@ -152,5 +165,7 @@ func (k Keeper) ExportGenesis(ctx sdk.Context) *types.GenesisState { k.GetAllValidatorConsumerPubKeys(ctx, nil), k.GetAllValidatorsByConsumerAddr(ctx, nil), consumerAddrsToPrune, + k.GetAllInitTimeoutTimestamps(ctx), + exportedVscSendTimestamps, ) } diff --git a/x/ccv/provider/keeper/genesis_test.go b/x/ccv/provider/keeper/genesis_test.go index d9147ce98f..01a3845651 100644 --- a/x/ccv/provider/keeper/genesis_test.go +++ b/x/ccv/provider/keeper/genesis_test.go @@ -1,6 +1,7 @@ package keeper_test import ( + "sort" "testing" "time" @@ -36,6 +37,32 @@ func TestInitAndExportGenesis(t *testing.T) { consumerTmPubKey := consumerCryptoId.TMProtoCryptoPublicKey() consumerConsAddr := consumerCryptoId.ConsumerConsAddress() + initTimeoutTimeStamps := []providertypes.InitTimeoutTimestamp{ + {ChainId: cChainIDs[0], Timestamp: uint64(time.Now().UTC().UnixNano()) + 10}, + {ChainId: cChainIDs[1], Timestamp: uint64(time.Now().UTC().UnixNano()) + 15}, + } + + now := time.Now().UTC() + exportedVscSendTimeStampsC0 := providertypes.ExportedVscSendTimestamp{ + ChainId: "c0", + VscSendTimestamps: []providertypes.VscSendTimestamp{ + {VscId: 1, Timestamp: now.Add(time.Hour)}, + {VscId: 2, Timestamp: now.Add(2 * time.Hour)}, + }, + } + + exportedVscSendTimeStampsC1 := providertypes.ExportedVscSendTimestamp{ + ChainId: "c1", + VscSendTimestamps: []providertypes.VscSendTimestamp{ + {VscId: 1, Timestamp: now.Add(-time.Hour)}, + {VscId: 2, Timestamp: now.Add(time.Hour)}, + }, + } + + var exportedVscSendTimeStampsAll []providertypes.ExportedVscSendTimestamp + exportedVscSendTimeStampsAll = append(exportedVscSendTimeStampsAll, exportedVscSendTimeStampsC0) + exportedVscSendTimeStampsAll = append(exportedVscSendTimeStampsAll, exportedVscSendTimeStampsC1) + // create genesis struct provGenesis := providertypes.NewGenesisState(vscID, []providertypes.ValsetUpdateIdToHeight{{ValsetUpdateId: vscID, Height: initHeight}}, @@ -98,6 +125,8 @@ func TestInitAndExportGenesis(t *testing.T) { ConsumerAddrs: &providertypes.AddressList{Addresses: [][]byte{consumerConsAddr.ToSdkConsAddr()}}, }, }, + initTimeoutTimeStamps, + exportedVscSendTimeStampsAll, ) // Instantiate in-mem provider keeper with mocks @@ -164,6 +193,24 @@ func TestInitAndExportGenesis(t *testing.T) { // check the exported genesis require.Equal(t, provGenesis, pk.ExportGenesis(ctx)) + + initTimeoutTimestampInStore := pk.GetAllInitTimeoutTimestamps(ctx) + sort.Slice(initTimeoutTimestampInStore, func(i, j int) bool { + return initTimeoutTimestampInStore[i].Timestamp < initTimeoutTimestampInStore[j].Timestamp + }) + require.Equal(t, initTimeoutTimestampInStore, initTimeoutTimeStamps) + + vscSendTimestampsC0InStore := pk.GetAllVscSendTimestamps(ctx, cChainIDs[0]) + sort.Slice(vscSendTimestampsC0InStore, func(i, j int) bool { + return vscSendTimestampsC0InStore[i].VscId < vscSendTimestampsC0InStore[j].VscId + }) + require.Equal(t, vscSendTimestampsC0InStore, exportedVscSendTimeStampsC0.VscSendTimestamps) + + vscSendTimestampsC1InStore := pk.GetAllVscSendTimestamps(ctx, cChainIDs[1]) + sort.Slice(vscSendTimestampsC1InStore, func(i, j int) bool { + return vscSendTimestampsC1InStore[i].VscId < vscSendTimestampsC1InStore[j].VscId + }) + require.Equal(t, vscSendTimestampsC1InStore, exportedVscSendTimeStampsC1.VscSendTimestamps) } func assertConsumerChainStates(t *testing.T, ctx sdk.Context, pk keeper.Keeper, consumerStates ...providertypes.ConsumerState) { diff --git a/x/ccv/provider/module_test.go b/x/ccv/provider/module_test.go index f32cb8cc4d..bf63f86b40 100644 --- a/x/ccv/provider/module_test.go +++ b/x/ccv/provider/module_test.go @@ -108,6 +108,8 @@ func TestInitGenesis(t *testing.T) { nil, nil, nil, + nil, + nil, ) cdc := keeperParams.Cdc diff --git a/x/ccv/provider/types/genesis.go b/x/ccv/provider/types/genesis.go index 07c135ebfc..2118f3143e 100644 --- a/x/ccv/provider/types/genesis.go +++ b/x/ccv/provider/types/genesis.go @@ -24,6 +24,8 @@ func NewGenesisState( validatorConsumerPubkeys []ValidatorConsumerPubKey, validatorsByConsumerAddr []ValidatorByConsumerAddr, consumerAddrsToPrune []ConsumerAddrsToPrune, + initTimeoutTimestamps []InitTimeoutTimestamp, + exportedVscSendTimestamps []ExportedVscSendTimestamp, ) *GenesisState { return &GenesisState{ ValsetUpdateId: vscID, @@ -37,6 +39,8 @@ func NewGenesisState( ValidatorConsumerPubkeys: validatorConsumerPubkeys, ValidatorsByConsumerAddr: validatorsByConsumerAddr, ConsumerAddrsToPrune: consumerAddrsToPrune, + InitTimeoutTimestamps: initTimeoutTimestamps, + ExportedVscSendTimestamps: exportedVscSendTimestamps, } } diff --git a/x/ccv/provider/types/genesis.pb.go b/x/ccv/provider/types/genesis.pb.go index 0e4e4f2cf3..ddd7d478b6 100644 --- a/x/ccv/provider/types/genesis.pb.go +++ b/x/ccv/provider/types/genesis.pb.go @@ -48,7 +48,9 @@ type GenesisState struct { // empty for a new chain ValidatorsByConsumerAddr []ValidatorByConsumerAddr `protobuf:"bytes,10,rep,name=validators_by_consumer_addr,json=validatorsByConsumerAddr,proto3" json:"validators_by_consumer_addr"` // empty for a new chain - ConsumerAddrsToPrune []ConsumerAddrsToPrune `protobuf:"bytes,11,rep,name=consumer_addrs_to_prune,json=consumerAddrsToPrune,proto3" json:"consumer_addrs_to_prune"` + ConsumerAddrsToPrune []ConsumerAddrsToPrune `protobuf:"bytes,11,rep,name=consumer_addrs_to_prune,json=consumerAddrsToPrune,proto3" json:"consumer_addrs_to_prune"` + InitTimeoutTimestamps []InitTimeoutTimestamp `protobuf:"bytes,12,rep,name=init_timeout_timestamps,json=initTimeoutTimestamps,proto3" json:"init_timeout_timestamps"` + ExportedVscSendTimestamps []ExportedVscSendTimestamp `protobuf:"bytes,13,rep,name=exported_vsc_send_timestamps,json=exportedVscSendTimestamps,proto3" json:"exported_vsc_send_timestamps"` } func (m *GenesisState) Reset() { *m = GenesisState{} } @@ -161,6 +163,20 @@ func (m *GenesisState) GetConsumerAddrsToPrune() []ConsumerAddrsToPrune { return nil } +func (m *GenesisState) GetInitTimeoutTimestamps() []InitTimeoutTimestamp { + if m != nil { + return m.InitTimeoutTimestamps + } + return nil +} + +func (m *GenesisState) GetExportedVscSendTimestamps() []ExportedVscSendTimestamp { + if m != nil { + return m.ExportedVscSendTimestamps + } + return nil +} + // consumer chain type ConsumerState struct { // ChainID defines the chain ID for the consumer chain @@ -336,61 +352,66 @@ func init() { } var fileDescriptor_48411d9c7900d48e = []byte{ - // 856 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xdd, 0x8e, 0xdb, 0x44, - 0x14, 0x5e, 0xef, 0xa6, 0xdb, 0xcd, 0x6c, 0x77, 0x59, 0x86, 0x55, 0x70, 0xb3, 0x90, 0xae, 0x02, - 0x48, 0x91, 0x00, 0x1b, 0xa7, 0x5c, 0xf0, 0xd7, 0x8b, 0xa6, 0x95, 0x20, 0x42, 0x88, 0x28, 0xfd, - 0x41, 0x2a, 0x17, 0xd6, 0x64, 0x3c, 0x4a, 0x86, 0xd8, 0x33, 0xd6, 0xcc, 0xd8, 0xd4, 0x42, 0x48, - 0x54, 0xbc, 0x00, 0x6f, 0x45, 0x2f, 0x7b, 0xc9, 0x55, 0x85, 0x76, 0xdf, 0x80, 0x27, 0x40, 0x1e, - 0x8f, 0x5d, 0x7b, 0x49, 0x20, 0xe1, 0x2e, 0x3e, 0xdf, 0x9c, 0xef, 0x3b, 0x67, 0xce, 0xcc, 0x37, - 0x01, 0x1e, 0x65, 0x8a, 0x08, 0xbc, 0x40, 0x94, 0xf9, 0x92, 0xe0, 0x44, 0x50, 0x95, 0xb9, 0x18, - 0xa7, 0x6e, 0x2c, 0x78, 0x4a, 0x03, 0x22, 0xdc, 0xd4, 0x73, 0xe7, 0x84, 0x11, 0x49, 0xa5, 0x13, - 0x0b, 0xae, 0x38, 0x7c, 0x67, 0x45, 0x8a, 0x83, 0x71, 0xea, 0x94, 0x29, 0x4e, 0xea, 0x75, 0x4f, - 0xe7, 0x7c, 0xce, 0xf5, 0x7a, 0x37, 0xff, 0x55, 0xa4, 0x76, 0xdf, 0x5d, 0xa7, 0x96, 0x7a, 0xae, - 0x61, 0x50, 0xbc, 0x3b, 0xdc, 0xa4, 0xa6, 0x4a, 0xec, 0x3f, 0x72, 0x30, 0x67, 0x32, 0x89, 0x8a, - 0x9c, 0xf2, 0xb7, 0xc9, 0xf1, 0x36, 0xc9, 0x69, 0xf4, 0xde, 0x7d, 0x4b, 0x11, 0x16, 0x10, 0x11, - 0x51, 0xa6, 0x5c, 0x2c, 0xb2, 0x58, 0x71, 0x77, 0x49, 0x32, 0x83, 0xf6, 0x7f, 0x6f, 0x83, 0x1b, - 0x5f, 0x16, 0xeb, 0x1f, 0x28, 0xa4, 0x08, 0x1c, 0x80, 0x93, 0x14, 0x85, 0x92, 0x28, 0x3f, 0x89, - 0x03, 0xa4, 0x88, 0x4f, 0x03, 0xdb, 0x3a, 0xb7, 0x06, 0xad, 0xe9, 0x71, 0x11, 0x7f, 0xa4, 0xc3, - 0xe3, 0x00, 0xfe, 0x04, 0x5e, 0x2b, 0x55, 0x7d, 0x99, 0xe7, 0x4a, 0x7b, 0xf7, 0x7c, 0x6f, 0x70, - 0x38, 0x1c, 0x3a, 0x1b, 0x6c, 0xb7, 0x73, 0xcf, 0xe4, 0x6a, 0xd9, 0x51, 0xef, 0xf9, 0xcb, 0x5b, - 0x3b, 0x7f, 0xbd, 0xbc, 0xd5, 0xc9, 0x50, 0x14, 0x7e, 0xd6, 0xbf, 0x42, 0xdc, 0x9f, 0x1e, 0xe3, - 0xfa, 0x72, 0x09, 0xbf, 0x07, 0x47, 0x09, 0x9b, 0x71, 0x16, 0x50, 0x36, 0xf7, 0x79, 0x2c, 0xed, - 0x3d, 0x2d, 0xfd, 0xd1, 0x46, 0xd2, 0x8f, 0xca, 0xcc, 0x6f, 0xe3, 0x51, 0x2b, 0x17, 0x9e, 0xde, - 0x48, 0x5e, 0x85, 0x24, 0x44, 0xe0, 0x34, 0x42, 0x2a, 0x11, 0xc4, 0x6f, 0x6a, 0xb4, 0xce, 0xad, - 0xc1, 0xe1, 0xd0, 0x5d, 0xab, 0x91, 0x7a, 0xce, 0x37, 0x3a, 0x2f, 0xa8, 0x29, 0xc8, 0x29, 0x2c, - 0xc8, 0xea, 0x31, 0xf8, 0x33, 0xe8, 0x5e, 0xdd, 0x66, 0x5f, 0x71, 0x7f, 0x41, 0xe8, 0x7c, 0xa1, - 0xec, 0x6b, 0xba, 0x99, 0xcf, 0x37, 0x6a, 0xe6, 0x71, 0x63, 0x2a, 0x0f, 0xf9, 0x57, 0x9a, 0xc2, - 0xf4, 0xd5, 0x49, 0x57, 0xa2, 0xf0, 0x57, 0x0b, 0x9c, 0x55, 0x7b, 0x8c, 0x82, 0x80, 0x2a, 0xca, - 0x99, 0x1f, 0x0b, 0x1e, 0x73, 0x89, 0x42, 0x69, 0xef, 0xeb, 0x02, 0xee, 0x6c, 0x35, 0xc8, 0xbb, - 0x86, 0x66, 0x62, 0x58, 0x4c, 0x09, 0x37, 0xf1, 0x1a, 0x5c, 0xc2, 0x5f, 0x2c, 0xd0, 0xad, 0xaa, - 0x10, 0x24, 0xe2, 0x29, 0x0a, 0x6b, 0x45, 0x5c, 0xd7, 0x45, 0x7c, 0xb1, 0x55, 0x11, 0xd3, 0x82, - 0xe5, 0x4a, 0x0d, 0x36, 0x5e, 0x0d, 0x4b, 0x38, 0x06, 0xfb, 0x31, 0x12, 0x28, 0x92, 0xf6, 0x81, - 0x1e, 0xee, 0xfb, 0x1b, 0xa9, 0x4d, 0x74, 0x8a, 0x21, 0x37, 0x04, 0xba, 0x9b, 0x14, 0x85, 0x34, - 0x40, 0x8a, 0x0b, 0xbf, 0xea, 0x2b, 0x4e, 0x66, 0xf9, 0x7d, 0xb3, 0xdb, 0x5b, 0x74, 0xf3, 0xb8, - 0xa4, 0x29, 0xdb, 0x9a, 0x24, 0xb3, 0xaf, 0x49, 0x56, 0x76, 0x93, 0xae, 0x80, 0x73, 0x0d, 0xf8, - 0xcc, 0x02, 0x67, 0x15, 0x28, 0xfd, 0x59, 0xe6, 0xd7, 0x87, 0x2c, 0x6c, 0xf0, 0x7f, 0x6a, 0x18, - 0x65, 0xb5, 0x09, 0x8b, 0x7f, 0xd4, 0x20, 0x9b, 0x38, 0x4c, 0xc1, 0x9b, 0x0d, 0x51, 0x99, 0x9f, - 0xeb, 0x58, 0x24, 0x8c, 0xd8, 0x87, 0x5a, 0xfe, 0xd3, 0x6d, 0x4f, 0x95, 0x90, 0x0f, 0xf9, 0x24, - 0x27, 0x30, 0xda, 0xa7, 0x78, 0x05, 0xd6, 0x7f, 0xd6, 0x02, 0x47, 0x0d, 0x4f, 0x81, 0x37, 0xc1, - 0x41, 0x21, 0x62, 0x2c, 0xac, 0x3d, 0xbd, 0xae, 0xbf, 0xc7, 0x01, 0x7c, 0x1b, 0x00, 0xbc, 0x40, - 0x8c, 0x91, 0x30, 0x07, 0x77, 0x35, 0xd8, 0x36, 0x91, 0x71, 0x00, 0xcf, 0x40, 0x1b, 0x87, 0x94, - 0x30, 0x95, 0xa3, 0x7b, 0x1a, 0x3d, 0x28, 0x02, 0xe3, 0x00, 0xbe, 0x07, 0x8e, 0x29, 0xa3, 0x8a, - 0xa2, 0xb0, 0xbc, 0xae, 0x2d, 0xed, 0x8f, 0x47, 0x26, 0x6a, 0xae, 0xd8, 0x0c, 0x9c, 0x54, 0xfb, - 0x60, 0x1c, 0xd9, 0xbe, 0xa6, 0xcf, 0x98, 0xb7, 0x76, 0x03, 0x2a, 0xb7, 0x4f, 0x3d, 0xa7, 0xee, - 0xca, 0xa6, 0xf1, 0xca, 0x6f, 0x0d, 0x06, 0x15, 0xe8, 0xc4, 0xa4, 0xf0, 0x27, 0xe3, 0x26, 0x79, - 0x0f, 0x73, 0x52, 0x5e, 0xe0, 0x4f, 0xfe, 0xcd, 0xaa, 0xaa, 0x01, 0x3f, 0x20, 0xea, 0x9e, 0x4e, - 0x9b, 0x20, 0xbc, 0x24, 0xea, 0x3e, 0x52, 0xa8, 0xdc, 0x69, 0xc3, 0x5e, 0x78, 0x4c, 0xb1, 0x48, - 0xc2, 0x0f, 0x00, 0x94, 0x21, 0x92, 0x0b, 0x3f, 0xe0, 0x3f, 0x32, 0x45, 0x23, 0xe2, 0x23, 0xbc, - 0xd4, 0xb7, 0xb5, 0x3d, 0x3d, 0xd1, 0xc8, 0x7d, 0x03, 0xdc, 0xc5, 0x4b, 0xf8, 0x03, 0x78, 0xa3, - 0xe1, 0xa2, 0x3e, 0x65, 0x01, 0x79, 0x6a, 0x1f, 0xe8, 0x02, 0x3f, 0xde, 0xec, 0x28, 0x4a, 0x5c, - 0x37, 0x4f, 0x53, 0xdc, 0xeb, 0x75, 0xcf, 0x1e, 0xe7, 0xa4, 0xfd, 0x27, 0xa0, 0xb3, 0xda, 0x0e, - 0xb7, 0x78, 0xd6, 0x3a, 0x60, 0xdf, 0x8c, 0x75, 0x57, 0xe3, 0xe6, 0x6b, 0xf4, 0xdd, 0xf3, 0x8b, - 0x9e, 0xf5, 0xe2, 0xa2, 0x67, 0xfd, 0x79, 0xd1, 0xb3, 0x7e, 0xbb, 0xec, 0xed, 0xbc, 0xb8, 0xec, - 0xed, 0xfc, 0x71, 0xd9, 0xdb, 0x79, 0x72, 0x67, 0x4e, 0xd5, 0x22, 0x99, 0x39, 0x98, 0x47, 0x2e, - 0xe6, 0x32, 0xe2, 0xd2, 0x7d, 0xd5, 0xd5, 0x87, 0xd5, 0x33, 0x9d, 0xde, 0x76, 0x9f, 0x36, 0xff, - 0x13, 0xa8, 0x2c, 0x26, 0x72, 0xb6, 0xaf, 0x5f, 0xe2, 0xdb, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, - 0xa6, 0x98, 0xf7, 0xad, 0xd8, 0x08, 0x00, 0x00, + // 930 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xdd, 0x6e, 0x23, 0x35, + 0x14, 0xee, 0xb4, 0xd9, 0x6e, 0xe3, 0xfe, 0x50, 0x4c, 0xc9, 0x4e, 0xd3, 0x25, 0x5b, 0x05, 0x90, + 0x2a, 0x01, 0x33, 0xa4, 0xcb, 0x05, 0x7f, 0x7b, 0xb1, 0xdd, 0x45, 0x10, 0x21, 0x44, 0x94, 0x76, + 0x8b, 0xb4, 0x5c, 0x58, 0x8e, 0x6d, 0x25, 0xa6, 0x33, 0xf6, 0x68, 0xec, 0x99, 0x6d, 0x84, 0x90, + 0x58, 0xc1, 0x03, 0xf0, 0x56, 0xec, 0xe5, 0x5e, 0x72, 0xb5, 0x42, 0xed, 0x1b, 0xf0, 0x04, 0x68, + 0x3c, 0x9e, 0xe9, 0x24, 0x24, 0x90, 0x70, 0x95, 0xcc, 0xf9, 0x7c, 0xbe, 0xef, 0x1c, 0x1f, 0xfb, + 0x1c, 0x83, 0x0e, 0x17, 0x9a, 0xc5, 0x64, 0x84, 0xb9, 0x40, 0x8a, 0x91, 0x24, 0xe6, 0x7a, 0xec, + 0x13, 0x92, 0xfa, 0x51, 0x2c, 0x53, 0x4e, 0x59, 0xec, 0xa7, 0x1d, 0x7f, 0xc8, 0x04, 0x53, 0x5c, + 0x79, 0x51, 0x2c, 0xb5, 0x84, 0x6f, 0xcf, 0x70, 0xf1, 0x08, 0x49, 0xbd, 0xc2, 0xc5, 0x4b, 0x3b, + 0xcd, 0xbd, 0xa1, 0x1c, 0x4a, 0xb3, 0xde, 0xcf, 0xfe, 0xe5, 0xae, 0xcd, 0x77, 0xe6, 0xa9, 0xa5, + 0x1d, 0xdf, 0x32, 0x68, 0xd9, 0x3c, 0x5e, 0x24, 0xa6, 0x52, 0xec, 0x3f, 0x7c, 0x88, 0x14, 0x2a, + 0x09, 0x73, 0x9f, 0xe2, 0xbf, 0xf5, 0xe9, 0x2c, 0xe2, 0x33, 0x91, 0x7b, 0xf3, 0xae, 0x66, 0x82, + 0xb2, 0x38, 0xe4, 0x42, 0xfb, 0x24, 0x1e, 0x47, 0x5a, 0xfa, 0x17, 0x6c, 0x6c, 0xd1, 0xf6, 0xef, + 0x9b, 0x60, 0xeb, 0xcb, 0x7c, 0xfd, 0xa9, 0xc6, 0x9a, 0xc1, 0x23, 0xb0, 0x9b, 0xe2, 0x40, 0x31, + 0x8d, 0x92, 0x88, 0x62, 0xcd, 0x10, 0xa7, 0xae, 0x73, 0xe8, 0x1c, 0xd5, 0xfa, 0x3b, 0xb9, 0xfd, + 0x89, 0x31, 0x77, 0x29, 0xfc, 0x11, 0xbc, 0x56, 0xa8, 0x22, 0x95, 0xf9, 0x2a, 0x77, 0xf5, 0x70, + 0xed, 0x68, 0xf3, 0xf8, 0xd8, 0x5b, 0x60, 0xbb, 0xbd, 0x47, 0xd6, 0xd7, 0xc8, 0x9e, 0xb4, 0x5e, + 0xbc, 0xba, 0xb7, 0xf2, 0xd7, 0xab, 0x7b, 0x8d, 0x31, 0x0e, 0x83, 0x4f, 0xdb, 0x53, 0xc4, 0xed, + 0xfe, 0x0e, 0xa9, 0x2e, 0x57, 0xf0, 0x7b, 0xb0, 0x9d, 0x88, 0x81, 0x14, 0x94, 0x8b, 0x21, 0x92, + 0x91, 0x72, 0xd7, 0x8c, 0xf4, 0x87, 0x0b, 0x49, 0x3f, 0x29, 0x3c, 0xbf, 0x8d, 0x4e, 0x6a, 0x99, + 0x70, 0x7f, 0x2b, 0xb9, 0x31, 0x29, 0x88, 0xc1, 0x5e, 0x88, 0x75, 0x12, 0x33, 0x34, 0xa9, 0x51, + 0x3b, 0x74, 0x8e, 0x36, 0x8f, 0xfd, 0xb9, 0x1a, 0x69, 0xc7, 0xfb, 0xc6, 0xf8, 0xd1, 0x8a, 0x82, + 0xea, 0xc3, 0x9c, 0xac, 0x6a, 0x83, 0x3f, 0x81, 0xe6, 0xf4, 0x36, 0x23, 0x2d, 0xd1, 0x88, 0xf1, + 0xe1, 0x48, 0xbb, 0xb7, 0x4c, 0x32, 0x9f, 0x2d, 0x94, 0xcc, 0xf9, 0x44, 0x55, 0xce, 0xe4, 0x57, + 0x86, 0xc2, 0xe6, 0xd5, 0x48, 0x67, 0xa2, 0xf0, 0x17, 0x07, 0x1c, 0x94, 0x7b, 0x8c, 0x29, 0xe5, + 0x9a, 0x4b, 0x81, 0xa2, 0x58, 0x46, 0x52, 0xe1, 0x40, 0xb9, 0xeb, 0x26, 0x80, 0x07, 0x4b, 0x15, + 0xf2, 0xa1, 0xa5, 0xe9, 0x59, 0x16, 0x1b, 0xc2, 0x3e, 0x99, 0x83, 0x2b, 0xf8, 0xb3, 0x03, 0x9a, + 0x65, 0x14, 0x31, 0x0b, 0x65, 0x8a, 0x83, 0x4a, 0x10, 0xb7, 0x4d, 0x10, 0x9f, 0x2f, 0x15, 0x44, + 0x3f, 0x67, 0x99, 0x8a, 0xc1, 0x25, 0xb3, 0x61, 0x05, 0xbb, 0x60, 0x3d, 0xc2, 0x31, 0x0e, 0x95, + 0xbb, 0x61, 0x8a, 0xfb, 0xde, 0x42, 0x6a, 0x3d, 0xe3, 0x62, 0xc9, 0x2d, 0x81, 0xc9, 0x26, 0xc5, + 0x01, 0xa7, 0x58, 0xcb, 0x18, 0x95, 0x79, 0x45, 0xc9, 0x20, 0xbb, 0x6f, 0x6e, 0x7d, 0x89, 0x6c, + 0xce, 0x0b, 0x9a, 0x22, 0xad, 0x5e, 0x32, 0xf8, 0x9a, 0x8d, 0x8b, 0x6c, 0xd2, 0x19, 0x70, 0xa6, + 0x01, 0x9f, 0x3b, 0xe0, 0xa0, 0x04, 0x15, 0x1a, 0x8c, 0x51, 0xb5, 0xc8, 0xb1, 0x0b, 0xfe, 0x4f, + 0x0c, 0x27, 0xe3, 0x4a, 0x85, 0xe3, 0x7f, 0xc4, 0xa0, 0x26, 0x71, 0x98, 0x82, 0x3b, 0x13, 0xa2, + 0x2a, 0x3b, 0xd7, 0x51, 0x9c, 0x08, 0xe6, 0x6e, 0x1a, 0xf9, 0x4f, 0x96, 0x3d, 0x55, 0xb1, 0x3a, + 0x93, 0xbd, 0x8c, 0xc0, 0x6a, 0xef, 0x91, 0x19, 0x18, 0x7c, 0x06, 0xee, 0x70, 0xc1, 0x35, 0xd2, + 0x3c, 0x64, 0x32, 0xc9, 0x7f, 0x95, 0xc6, 0x61, 0xa4, 0xdc, 0xad, 0x25, 0x74, 0xbb, 0x82, 0xeb, + 0xb3, 0x9c, 0xe2, 0xac, 0x60, 0xb0, 0xba, 0x6f, 0xf2, 0x19, 0x98, 0x82, 0xbf, 0x3a, 0xe0, 0x2e, + 0xbb, 0x8c, 0x64, 0xac, 0x19, 0x45, 0xa9, 0x22, 0x48, 0x31, 0x41, 0xab, 0xf2, 0xdb, 0x4b, 0x5c, + 0xa6, 0x2f, 0x2c, 0xd1, 0xb9, 0x22, 0xa7, 0x4c, 0xd0, 0xe9, 0x10, 0xf6, 0xd9, 0x1c, 0x5c, 0xb5, + 0x9f, 0xd7, 0xc0, 0xf6, 0x44, 0x4f, 0x85, 0xfb, 0x60, 0x23, 0x57, 0xb3, 0x2d, 0xbc, 0xde, 0xbf, + 0x6d, 0xbe, 0xbb, 0x14, 0xbe, 0x05, 0x00, 0x19, 0x61, 0x21, 0x58, 0x90, 0x81, 0xab, 0x06, 0xac, + 0x5b, 0x4b, 0x97, 0xc2, 0x03, 0x50, 0x27, 0x01, 0x67, 0x42, 0x67, 0xe8, 0x9a, 0x41, 0x37, 0x72, + 0x43, 0x97, 0xc2, 0x77, 0xc1, 0x4e, 0xb6, 0x11, 0x1c, 0x07, 0x45, 0xbb, 0xaa, 0x99, 0xf9, 0xb0, + 0x6d, 0xad, 0xb6, 0xc5, 0x0c, 0xc0, 0x6e, 0x79, 0x0e, 0xec, 0x44, 0x72, 0x6f, 0x99, 0x3b, 0xd6, + 0x99, 0xbb, 0x13, 0xe5, 0xb4, 0x4b, 0x3b, 0x5e, 0x75, 0x2a, 0xd9, 0xec, 0xcb, 0x79, 0x63, 0x31, + 0xa8, 0x41, 0x23, 0x62, 0x79, 0x7f, 0xb6, 0xdd, 0x34, 0xcb, 0x61, 0xc8, 0x8a, 0x06, 0xf6, 0xf1, + 0xbf, 0xb5, 0xea, 0xf2, 0x80, 0x9f, 0x32, 0xfd, 0xc8, 0xb8, 0xf5, 0x30, 0xb9, 0x60, 0xfa, 0x31, + 0xd6, 0xb8, 0x38, 0x69, 0x96, 0x3d, 0xef, 0xb1, 0xf9, 0x22, 0x05, 0xdf, 0x07, 0x50, 0x05, 0x58, + 0x8d, 0x10, 0x95, 0xcf, 0x44, 0x56, 0x67, 0x84, 0xc9, 0x85, 0xe9, 0x56, 0xf5, 0xfe, 0xae, 0x41, + 0x1e, 0x5b, 0xe0, 0x21, 0xb9, 0x80, 0x3f, 0x80, 0x37, 0x26, 0xa6, 0x08, 0xe2, 0x82, 0xb2, 0x4b, + 0x77, 0xc3, 0x04, 0xf8, 0xd1, 0x62, 0x57, 0x51, 0x91, 0xea, 0xf0, 0xb0, 0xc1, 0xbd, 0x5e, 0x9d, + 0x59, 0xdd, 0x8c, 0xb4, 0xfd, 0x14, 0x34, 0x66, 0x8f, 0x83, 0x25, 0xc6, 0x7a, 0x03, 0xac, 0xdb, + 0xb2, 0xae, 0x1a, 0xdc, 0x7e, 0x9d, 0x7c, 0xf7, 0xe2, 0xaa, 0xe5, 0xbc, 0xbc, 0x6a, 0x39, 0x7f, + 0x5e, 0xb5, 0x9c, 0xdf, 0xae, 0x5b, 0x2b, 0x2f, 0xaf, 0x5b, 0x2b, 0x7f, 0x5c, 0xb7, 0x56, 0x9e, + 0x3e, 0x18, 0x72, 0x3d, 0x4a, 0x06, 0x1e, 0x91, 0xa1, 0x4f, 0xa4, 0x0a, 0xa5, 0xf2, 0x6f, 0xb2, + 0xfa, 0xa0, 0x7c, 0xa6, 0xa4, 0xf7, 0xfd, 0xcb, 0xc9, 0x37, 0x91, 0x1e, 0x47, 0x4c, 0x0d, 0xd6, + 0xcd, 0x4b, 0xe4, 0xfe, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x4d, 0xe2, 0xfe, 0x45, 0xd8, 0x09, + 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { @@ -413,6 +434,34 @@ func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.ExportedVscSendTimestamps) > 0 { + for iNdEx := len(m.ExportedVscSendTimestamps) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ExportedVscSendTimestamps[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x6a + } + } + if len(m.InitTimeoutTimestamps) > 0 { + for iNdEx := len(m.InitTimeoutTimestamps) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.InitTimeoutTimestamps[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x62 + } + } if len(m.ConsumerAddrsToPrune) > 0 { for iNdEx := len(m.ConsumerAddrsToPrune) - 1; iNdEx >= 0; iNdEx-- { { @@ -758,6 +807,18 @@ func (m *GenesisState) Size() (n int) { n += 1 + l + sovGenesis(uint64(l)) } } + if len(m.InitTimeoutTimestamps) > 0 { + for _, e := range m.InitTimeoutTimestamps { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + if len(m.ExportedVscSendTimestamps) > 0 { + for _, e := range m.ExportedVscSendTimestamps { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } return n } @@ -1215,6 +1276,74 @@ func (m *GenesisState) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InitTimeoutTimestamps", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.InitTimeoutTimestamps = append(m.InitTimeoutTimestamps, InitTimeoutTimestamp{}) + if err := m.InitTimeoutTimestamps[len(m.InitTimeoutTimestamps)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExportedVscSendTimestamps", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ExportedVscSendTimestamps = append(m.ExportedVscSendTimestamps, ExportedVscSendTimestamp{}) + if err := m.ExportedVscSendTimestamps[len(m.ExportedVscSendTimestamps)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenesis(dAtA[iNdEx:]) diff --git a/x/ccv/provider/types/genesis_test.go b/x/ccv/provider/types/genesis_test.go index dbff6a1c2f..c4b5002f07 100644 --- a/x/ccv/provider/types/genesis_test.go +++ b/x/ccv/provider/types/genesis_test.go @@ -41,6 +41,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), true, }, @@ -63,6 +65,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), true, }, @@ -82,6 +86,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), true, }, @@ -101,6 +107,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -120,6 +128,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -139,6 +149,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -164,6 +176,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -189,6 +203,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -214,6 +230,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -239,6 +257,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -264,6 +284,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -289,6 +311,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -314,6 +338,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -339,6 +365,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -356,6 +384,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -373,6 +403,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -390,6 +422,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -407,6 +441,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -427,6 +463,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -448,6 +486,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -469,6 +509,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -494,6 +536,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -519,6 +563,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -544,6 +590,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -578,6 +626,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -624,6 +674,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -644,6 +696,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -663,6 +717,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, @@ -682,6 +738,8 @@ func TestValidateGenesisState(t *testing.T) { nil, nil, nil, + nil, + nil, ), false, }, diff --git a/x/ccv/provider/types/provider.pb.go b/x/ccv/provider/types/provider.pb.go index e651a5415c..30dba16cdc 100644 --- a/x/ccv/provider/types/provider.pb.go +++ b/x/ccv/provider/types/provider.pb.go @@ -971,6 +971,59 @@ func (m *VscSendTimestamp) GetTimestamp() time.Time { return time.Time{} } +// ExportedVscSendTimestamps is VscSendTimestamp with chainID info for exporting to genesis +type ExportedVscSendTimestamp struct { + ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + VscSendTimestamps []VscSendTimestamp `protobuf:"bytes,2,rep,name=vsc_send_timestamps,json=vscSendTimestamps,proto3" json:"vsc_send_timestamps"` +} + +func (m *ExportedVscSendTimestamp) Reset() { *m = ExportedVscSendTimestamp{} } +func (m *ExportedVscSendTimestamp) String() string { return proto.CompactTextString(m) } +func (*ExportedVscSendTimestamp) ProtoMessage() {} +func (*ExportedVscSendTimestamp) Descriptor() ([]byte, []int) { + return fileDescriptor_f22ec409a72b7b72, []int{15} +} +func (m *ExportedVscSendTimestamp) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ExportedVscSendTimestamp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ExportedVscSendTimestamp.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 *ExportedVscSendTimestamp) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExportedVscSendTimestamp.Merge(m, src) +} +func (m *ExportedVscSendTimestamp) XXX_Size() int { + return m.Size() +} +func (m *ExportedVscSendTimestamp) XXX_DiscardUnknown() { + xxx_messageInfo_ExportedVscSendTimestamp.DiscardUnknown(m) +} + +var xxx_messageInfo_ExportedVscSendTimestamp proto.InternalMessageInfo + +func (m *ExportedVscSendTimestamp) GetChainId() string { + if m != nil { + return m.ChainId + } + return "" +} + +func (m *ExportedVscSendTimestamp) GetVscSendTimestamps() []VscSendTimestamp { + if m != nil { + return m.VscSendTimestamps + } + return nil +} + type KeyAssignmentReplacement struct { ProviderAddr []byte `protobuf:"bytes,1,opt,name=provider_addr,json=providerAddr,proto3" json:"provider_addr,omitempty"` PrevCKey *crypto.PublicKey `protobuf:"bytes,2,opt,name=prev_c_key,json=prevCKey,proto3" json:"prev_c_key,omitempty"` @@ -981,7 +1034,7 @@ func (m *KeyAssignmentReplacement) Reset() { *m = KeyAssignmentReplaceme func (m *KeyAssignmentReplacement) String() string { return proto.CompactTextString(m) } func (*KeyAssignmentReplacement) ProtoMessage() {} func (*KeyAssignmentReplacement) Descriptor() ([]byte, []int) { - return fileDescriptor_f22ec409a72b7b72, []int{15} + return fileDescriptor_f22ec409a72b7b72, []int{16} } func (m *KeyAssignmentReplacement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1044,7 +1097,7 @@ func (m *ValidatorConsumerPubKey) Reset() { *m = ValidatorConsumerPubKey func (m *ValidatorConsumerPubKey) String() string { return proto.CompactTextString(m) } func (*ValidatorConsumerPubKey) ProtoMessage() {} func (*ValidatorConsumerPubKey) Descriptor() ([]byte, []int) { - return fileDescriptor_f22ec409a72b7b72, []int{16} + return fileDescriptor_f22ec409a72b7b72, []int{17} } func (m *ValidatorConsumerPubKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1107,7 +1160,7 @@ func (m *ValidatorByConsumerAddr) Reset() { *m = ValidatorByConsumerAddr func (m *ValidatorByConsumerAddr) String() string { return proto.CompactTextString(m) } func (*ValidatorByConsumerAddr) ProtoMessage() {} func (*ValidatorByConsumerAddr) Descriptor() ([]byte, []int) { - return fileDescriptor_f22ec409a72b7b72, []int{17} + return fileDescriptor_f22ec409a72b7b72, []int{18} } func (m *ValidatorByConsumerAddr) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1169,7 +1222,7 @@ func (m *ConsumerAddrsToPrune) Reset() { *m = ConsumerAddrsToPrune{} } func (m *ConsumerAddrsToPrune) String() string { return proto.CompactTextString(m) } func (*ConsumerAddrsToPrune) ProtoMessage() {} func (*ConsumerAddrsToPrune) Descriptor() ([]byte, []int) { - return fileDescriptor_f22ec409a72b7b72, []int{18} + return fileDescriptor_f22ec409a72b7b72, []int{19} } func (m *ConsumerAddrsToPrune) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1235,6 +1288,7 @@ func init() { proto.RegisterType((*UnbondingOp)(nil), "interchain_security.ccv.provider.v1.UnbondingOp") proto.RegisterType((*InitTimeoutTimestamp)(nil), "interchain_security.ccv.provider.v1.InitTimeoutTimestamp") proto.RegisterType((*VscSendTimestamp)(nil), "interchain_security.ccv.provider.v1.VscSendTimestamp") + proto.RegisterType((*ExportedVscSendTimestamp)(nil), "interchain_security.ccv.provider.v1.ExportedVscSendTimestamp") proto.RegisterType((*KeyAssignmentReplacement)(nil), "interchain_security.ccv.provider.v1.KeyAssignmentReplacement") proto.RegisterType((*ValidatorConsumerPubKey)(nil), "interchain_security.ccv.provider.v1.ValidatorConsumerPubKey") proto.RegisterType((*ValidatorByConsumerAddr)(nil), "interchain_security.ccv.provider.v1.ValidatorByConsumerAddr") @@ -1246,107 +1300,110 @@ func init() { } var fileDescriptor_f22ec409a72b7b72 = []byte{ - // 1598 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x57, 0x4b, 0x73, 0xdc, 0xc6, - 0x11, 0x26, 0xb8, 0x7c, 0xed, 0x2c, 0x1f, 0x12, 0x44, 0x59, 0x4b, 0x85, 0x59, 0xae, 0xe0, 0xc4, - 0xc5, 0x94, 0xcb, 0xd8, 0x90, 0xba, 0xa4, 0x54, 0x71, 0xb9, 0xc8, 0x95, 0x65, 0xd1, 0x8c, 0xad, - 0x35, 0xc8, 0x50, 0x95, 0xe4, 0x80, 0x1a, 0x0c, 0x5a, 0xbb, 0x53, 0x04, 0x30, 0xd0, 0xcc, 0x00, - 0xd2, 0x5e, 0x72, 0xce, 0xd1, 0xb9, 0xb9, 0x92, 0x8b, 0xf3, 0x0b, 0xf2, 0x37, 0x7c, 0xf4, 0x31, - 0x27, 0x3b, 0x45, 0x1d, 0x72, 0xc8, 0x9f, 0x48, 0xcd, 0xe0, 0xcd, 0x87, 0xb3, 0xaa, 0xc4, 0x37, - 0xcc, 0x4c, 0xf7, 0xd7, 0xdd, 0xd3, 0xdd, 0x5f, 0x0f, 0xd0, 0x3e, 0x8d, 0x24, 0x70, 0x32, 0xc1, - 0x34, 0x72, 0x05, 0x90, 0x84, 0x53, 0x39, 0x1d, 0x10, 0x92, 0x0e, 0x62, 0xce, 0x52, 0xea, 0x03, - 0x1f, 0xa4, 0x7b, 0xe5, 0xb7, 0x1d, 0x73, 0x26, 0x99, 0xf9, 0xee, 0x35, 0x3a, 0x36, 0x21, 0xa9, - 0x5d, 0xca, 0xa5, 0x7b, 0xf7, 0x37, 0xc7, 0x6c, 0xcc, 0xb4, 0xfc, 0x40, 0x7d, 0x65, 0xaa, 0xf7, - 0x77, 0xc6, 0x8c, 0x8d, 0x03, 0x18, 0xe8, 0x95, 0x97, 0xbc, 0x18, 0x48, 0x1a, 0x82, 0x90, 0x38, - 0x8c, 0x73, 0x81, 0xde, 0x65, 0x01, 0x3f, 0xe1, 0x58, 0x52, 0x16, 0x15, 0x00, 0xd4, 0x23, 0x03, - 0xc2, 0x38, 0x0c, 0x48, 0x40, 0x21, 0x92, 0xca, 0xbd, 0xec, 0x2b, 0x17, 0x18, 0x28, 0x81, 0x80, - 0x8e, 0x27, 0x32, 0xdb, 0x16, 0x03, 0x09, 0x91, 0x0f, 0x3c, 0xa4, 0x99, 0x70, 0xb5, 0xca, 0x15, - 0xb6, 0x6b, 0xe7, 0x84, 0x4f, 0x63, 0xc9, 0x06, 0xe7, 0x30, 0x15, 0xf9, 0xe9, 0x7b, 0x84, 0x89, - 0x90, 0x89, 0x01, 0xa8, 0xc0, 0x22, 0x02, 0x83, 0x74, 0xcf, 0x03, 0x89, 0xf7, 0xca, 0x8d, 0xc2, - 0xef, 0x5c, 0xce, 0xc3, 0xa2, 0x92, 0x21, 0x8c, 0xe6, 0x7e, 0x5b, 0xdf, 0x2f, 0xa1, 0xee, 0x90, - 0x45, 0x22, 0x09, 0x81, 0x1f, 0xf8, 0x3e, 0x55, 0x21, 0x8d, 0x38, 0x8b, 0x99, 0xc0, 0x81, 0xb9, - 0x89, 0x16, 0x25, 0x95, 0x01, 0x74, 0x8d, 0xbe, 0xb1, 0xdb, 0x76, 0xb2, 0x85, 0xd9, 0x47, 0x1d, - 0x1f, 0x04, 0xe1, 0x34, 0x56, 0xc2, 0xdd, 0x79, 0x7d, 0x56, 0xdf, 0x32, 0xb7, 0xd0, 0x4a, 0x96, - 0x05, 0xea, 0x77, 0x5b, 0xfa, 0x78, 0x59, 0xaf, 0x8f, 0x7c, 0xf3, 0x13, 0xb4, 0x4e, 0x23, 0x2a, - 0x29, 0x0e, 0xdc, 0x09, 0xa8, 0xdb, 0xe8, 0x2e, 0xf4, 0x8d, 0xdd, 0xce, 0xfe, 0x7d, 0x9b, 0x7a, - 0xc4, 0x56, 0x17, 0x68, 0xe7, 0xd7, 0x96, 0xee, 0xd9, 0x4f, 0xb5, 0xc4, 0xe1, 0xc2, 0x37, 0xdf, - 0xed, 0xcc, 0x39, 0x6b, 0xb9, 0x5e, 0xb6, 0x69, 0x3e, 0x40, 0xab, 0x63, 0x88, 0x40, 0x50, 0xe1, - 0x4e, 0xb0, 0x98, 0x74, 0x17, 0xfb, 0xc6, 0xee, 0xaa, 0xd3, 0xc9, 0xf7, 0x9e, 0x62, 0x31, 0x31, - 0x77, 0x50, 0xc7, 0xa3, 0x11, 0xe6, 0xd3, 0x4c, 0x62, 0x49, 0x4b, 0xa0, 0x6c, 0x4b, 0x0b, 0x0c, - 0x11, 0x12, 0x31, 0x7e, 0x15, 0xb9, 0x2a, 0xdb, 0xdd, 0xe5, 0xdc, 0x91, 0x2c, 0xd3, 0x76, 0x91, - 0x69, 0xfb, 0xb4, 0x28, 0x85, 0xc3, 0x15, 0xe5, 0xc8, 0x97, 0xdf, 0xef, 0x18, 0x4e, 0x5b, 0xeb, - 0xa9, 0x13, 0xf3, 0x73, 0x74, 0x2b, 0x89, 0x3c, 0x16, 0xf9, 0x34, 0x1a, 0xbb, 0x31, 0x70, 0xca, - 0xfc, 0xee, 0x8a, 0x86, 0xda, 0xba, 0x02, 0xf5, 0x38, 0x2f, 0x9a, 0x0c, 0xe9, 0x2b, 0x85, 0xb4, - 0x51, 0x2a, 0x8f, 0xb4, 0xae, 0xf9, 0x05, 0x32, 0x09, 0x49, 0xb5, 0x4b, 0x2c, 0x91, 0x05, 0x62, - 0x7b, 0x76, 0xc4, 0x5b, 0x84, 0xa4, 0xa7, 0x99, 0x76, 0x0e, 0xf9, 0x07, 0x74, 0x4f, 0x72, 0x1c, - 0x89, 0x17, 0xc0, 0x2f, 0xe3, 0xa2, 0xd9, 0x71, 0xef, 0x16, 0x18, 0x4d, 0xf0, 0xa7, 0xa8, 0x4f, - 0xf2, 0x02, 0x72, 0x39, 0xf8, 0x54, 0x48, 0x4e, 0xbd, 0x44, 0xe9, 0xba, 0x2f, 0x38, 0x26, 0xba, - 0x46, 0x3a, 0xba, 0x08, 0x7a, 0x85, 0x9c, 0xd3, 0x10, 0x7b, 0x92, 0x4b, 0x99, 0xcf, 0xd0, 0xcf, - 0xbc, 0x80, 0x91, 0x73, 0xa1, 0x9c, 0x73, 0x1b, 0x48, 0xda, 0x74, 0x48, 0x85, 0x50, 0x68, 0xab, - 0x7d, 0x63, 0xb7, 0xe5, 0x3c, 0xc8, 0x64, 0x47, 0xc0, 0x1f, 0xd7, 0x24, 0x4f, 0x6b, 0x82, 0xe6, - 0x07, 0xc8, 0x9c, 0x50, 0x21, 0x19, 0xa7, 0x04, 0x07, 0x2e, 0x44, 0x92, 0x53, 0x10, 0xdd, 0x35, - 0xad, 0x7e, 0xbb, 0x3a, 0xf9, 0x38, 0x3b, 0x30, 0x3f, 0x45, 0x0f, 0x6e, 0x34, 0xea, 0x92, 0x09, - 0x8e, 0x22, 0x08, 0xba, 0xeb, 0x3a, 0x94, 0x1d, 0xff, 0x06, 0x9b, 0xc3, 0x4c, 0xec, 0xd1, 0xca, - 0x9f, 0xbe, 0xde, 0x99, 0xfb, 0xea, 0xeb, 0x9d, 0x39, 0xeb, 0xef, 0x06, 0xba, 0x37, 0x2c, 0x03, - 0x0f, 0x59, 0x8a, 0x83, 0x1f, 0xb3, 0xc1, 0x0e, 0x50, 0x5b, 0x48, 0x16, 0x67, 0x25, 0xbd, 0xf0, - 0x16, 0x25, 0xbd, 0xa2, 0xd4, 0xd4, 0x81, 0xf5, 0x57, 0x03, 0x6d, 0x7e, 0xfc, 0x32, 0xa1, 0x29, - 0x23, 0xf8, 0xff, 0xc2, 0x07, 0xc7, 0x68, 0x0d, 0x6a, 0x78, 0xa2, 0xdb, 0xea, 0xb7, 0x76, 0x3b, - 0xfb, 0x3f, 0xb7, 0x33, 0x72, 0xb2, 0x4b, 0xce, 0xca, 0x09, 0xca, 0xae, 0x5b, 0x77, 0x9a, 0xba, - 0xd6, 0xbf, 0x0d, 0x74, 0xeb, 0x93, 0x80, 0x79, 0x38, 0x38, 0x09, 0xb0, 0x98, 0xa8, 0xe4, 0x4d, - 0x55, 0xd4, 0x1c, 0xf2, 0xae, 0xd1, 0xde, 0xcd, 0x1c, 0xb5, 0x52, 0xd3, 0x7d, 0xfc, 0x11, 0xba, - 0x5d, 0xd6, 0x71, 0x79, 0xb9, 0x3a, 0x98, 0xc3, 0x3b, 0x17, 0xdf, 0xed, 0x6c, 0x14, 0x39, 0x1c, - 0xea, 0x8b, 0x7e, 0xec, 0x6c, 0x90, 0xc6, 0x86, 0x6f, 0xf6, 0x50, 0x87, 0x7a, 0xc4, 0x15, 0xf0, - 0xd2, 0x8d, 0x92, 0x50, 0xe7, 0x65, 0xc1, 0x69, 0x53, 0x8f, 0x9c, 0xc0, 0xcb, 0xcf, 0x93, 0xd0, - 0x7c, 0x88, 0xde, 0x29, 0x06, 0x91, 0x9b, 0xe2, 0xc0, 0x55, 0xfa, 0x2e, 0xf6, 0x7d, 0xae, 0xd3, - 0xb4, 0xea, 0xdc, 0x29, 0x4e, 0xcf, 0x70, 0xa0, 0x8c, 0x1d, 0xf8, 0x3e, 0xb7, 0xfe, 0xb5, 0x88, - 0x96, 0x46, 0x98, 0xe3, 0x50, 0x98, 0xa7, 0x68, 0x43, 0x42, 0x18, 0x07, 0x58, 0x82, 0x9b, 0x71, - 0x64, 0x1e, 0xe9, 0xfb, 0x9a, 0x3b, 0xeb, 0xb3, 0xc5, 0xae, 0x4d, 0x93, 0x74, 0xcf, 0x1e, 0xea, - 0xdd, 0x13, 0x89, 0x25, 0x38, 0xeb, 0x05, 0x46, 0xb6, 0x69, 0xfe, 0x0a, 0x75, 0x25, 0x4f, 0x84, - 0xac, 0xd8, 0xab, 0x6a, 0xdb, 0x2c, 0x95, 0xef, 0x14, 0xe7, 0x59, 0xc3, 0x97, 0xed, 0x7a, 0x3d, - 0x51, 0xb5, 0xfe, 0x17, 0xa2, 0x3a, 0x41, 0x77, 0x14, 0xcb, 0x5f, 0xc6, 0x5c, 0x98, 0x1d, 0xf3, - 0xb6, 0xd2, 0x6f, 0x82, 0x7e, 0x81, 0xcc, 0x54, 0x90, 0xcb, 0x98, 0x8b, 0x6f, 0xe1, 0x67, 0x2a, - 0x48, 0x13, 0xd2, 0x47, 0xdb, 0x42, 0x15, 0x9f, 0x1b, 0x82, 0xd4, 0xb4, 0x17, 0x07, 0x10, 0x51, - 0x31, 0x29, 0xc0, 0x97, 0x66, 0x07, 0xdf, 0xd2, 0x40, 0x9f, 0x29, 0x1c, 0xa7, 0x80, 0xc9, 0xad, - 0x0c, 0x51, 0xef, 0x7a, 0x2b, 0x65, 0x82, 0x96, 0x75, 0x82, 0x7e, 0x72, 0x0d, 0x44, 0x99, 0xa5, - 0x7d, 0x74, 0x37, 0xc4, 0xaf, 0x5d, 0x39, 0xe1, 0x4c, 0xca, 0x00, 0x7c, 0x37, 0xc6, 0xe4, 0x1c, - 0xa4, 0xd0, 0x33, 0xaa, 0xe5, 0xdc, 0x09, 0xf1, 0xeb, 0xd3, 0xe2, 0x6c, 0x94, 0x1d, 0x99, 0x02, - 0xbd, 0x57, 0xa3, 0xf4, 0x57, 0x98, 0xfb, 0xae, 0x0f, 0x11, 0x0b, 0x5d, 0x0e, 0x63, 0xc5, 0x7b, - 0x38, 0x63, 0x77, 0x80, 0x72, 0x2c, 0xe5, 0x8d, 0xac, 0x5e, 0x19, 0x65, 0x13, 0x0f, 0x19, 0x8d, - 0xf2, 0xd9, 0x6d, 0x55, 0xcc, 0xaf, 0xd0, 0x1e, 0x2b, 0x30, 0xa7, 0x86, 0xf5, 0x04, 0xc0, 0xf2, - 0xd0, 0xed, 0xa7, 0x38, 0xf2, 0xc5, 0x04, 0x9f, 0xc3, 0x67, 0x20, 0xb1, 0x8f, 0x25, 0x6e, 0xf4, - 0xcc, 0x0b, 0x00, 0x37, 0x66, 0x2c, 0xc8, 0x7a, 0x26, 0xa3, 0xa0, 0xb2, 0x67, 0x9e, 0x00, 0x8c, - 0x18, 0x0b, 0x54, 0xcf, 0x98, 0x5d, 0xb4, 0x9c, 0x02, 0x17, 0x55, 0x05, 0x17, 0x4b, 0xeb, 0x17, - 0xa8, 0xad, 0x49, 0xe3, 0x80, 0x9c, 0x0b, 0x73, 0x1b, 0xb5, 0x15, 0x12, 0x08, 0x01, 0xa2, 0x6b, - 0xf4, 0x5b, 0xbb, 0x6d, 0xa7, 0xda, 0xb0, 0x24, 0xda, 0xba, 0xe9, 0x5d, 0x24, 0xcc, 0xe7, 0x68, - 0x39, 0x06, 0x3d, 0xb4, 0xb5, 0x62, 0x67, 0xff, 0x43, 0x7b, 0x86, 0xb7, 0xa7, 0x7d, 0x13, 0xa0, - 0x53, 0xa0, 0x59, 0xbc, 0x7a, 0x8d, 0x5d, 0x9a, 0x15, 0xc2, 0x3c, 0xbb, 0x6c, 0xf4, 0xd7, 0x6f, - 0x65, 0xf4, 0x12, 0x5e, 0x65, 0xf3, 0x7d, 0xd4, 0x39, 0xc8, 0xc2, 0xfe, 0x0d, 0x15, 0xf2, 0xea, - 0xb5, 0xac, 0xd6, 0xaf, 0xe5, 0x53, 0xb4, 0x9e, 0x8f, 0xb8, 0x53, 0xa6, 0x89, 0xcf, 0xfc, 0x29, - 0x42, 0xf9, 0x6c, 0x54, 0x84, 0x99, 0xa5, 0xa5, 0x9d, 0xef, 0x1c, 0xf9, 0x8d, 0x51, 0x35, 0xdf, - 0x18, 0x55, 0x96, 0x83, 0x36, 0xce, 0x04, 0xf9, 0x6d, 0xf1, 0xfe, 0x79, 0x16, 0x0b, 0xf3, 0x2e, - 0x5a, 0x52, 0xbd, 0x9a, 0x03, 0x2d, 0x38, 0x8b, 0xa9, 0x20, 0x47, 0xbe, 0xb9, 0x5b, 0x7f, 0x63, - 0xb1, 0xd8, 0xa5, 0xbe, 0xe8, 0xce, 0xf7, 0x5b, 0xbb, 0x0b, 0xce, 0x7a, 0x52, 0xa9, 0x1f, 0xf9, - 0xc2, 0xfa, 0x1d, 0xea, 0xd4, 0x00, 0xcd, 0x75, 0x34, 0x5f, 0x62, 0xcd, 0x53, 0xdf, 0x7c, 0x84, - 0xb6, 0x2a, 0xa0, 0x26, 0xdd, 0x67, 0x88, 0x6d, 0xe7, 0x5e, 0x29, 0xd0, 0x60, 0x7c, 0x61, 0x3d, - 0x43, 0x9b, 0x47, 0x15, 0xb9, 0x94, 0xc3, 0xa4, 0x11, 0xa1, 0xd1, 0x1c, 0xc6, 0xdb, 0xa8, 0x5d, - 0xfe, 0x48, 0xe8, 0xe8, 0x17, 0x9c, 0x6a, 0xc3, 0x0a, 0xd1, 0xad, 0x33, 0x41, 0x4e, 0x20, 0xf2, - 0x2b, 0xb0, 0x1b, 0x2e, 0xe0, 0xf0, 0x32, 0xd0, 0xcc, 0x0f, 0xd5, 0xca, 0xdc, 0x9f, 0x0d, 0xd4, - 0x3d, 0x86, 0xe9, 0x81, 0x10, 0x74, 0x1c, 0x85, 0x10, 0x49, 0x45, 0x16, 0x98, 0x80, 0xfa, 0x34, - 0xdf, 0x45, 0x6b, 0x65, 0xa3, 0x95, 0xfd, 0xb5, 0xea, 0xac, 0x16, 0x9b, 0xba, 0xb1, 0x1e, 0x21, - 0x14, 0x73, 0x48, 0x5d, 0xe2, 0x9e, 0xc3, 0x34, 0x77, 0x63, 0xbb, 0x3e, 0x6b, 0xb2, 0xff, 0x14, - 0x7b, 0x94, 0x78, 0x01, 0x25, 0xc7, 0x30, 0x75, 0x56, 0x94, 0xfc, 0xf0, 0x18, 0xa6, 0xea, 0xed, - 0x10, 0xb3, 0x57, 0xc0, 0xf5, 0x80, 0x68, 0x39, 0xd9, 0xc2, 0xfa, 0x8b, 0x81, 0xee, 0x9d, 0xe1, - 0x80, 0xfa, 0x58, 0x32, 0x5e, 0xdc, 0xf7, 0x28, 0xf1, 0x94, 0xc6, 0x0f, 0xdc, 0xeb, 0x15, 0x6f, - 0xe7, 0xaf, 0xf1, 0xf6, 0x23, 0xb4, 0x5a, 0x66, 0x58, 0xf9, 0xdb, 0x9a, 0xc1, 0xdf, 0x4e, 0xa1, - 0x71, 0x0c, 0x53, 0xeb, 0x8f, 0x35, 0xdf, 0x0e, 0xa7, 0xb5, 0xe6, 0xe5, 0xff, 0xc5, 0xb7, 0xd2, - 0x6c, 0xdd, 0x37, 0x52, 0xd7, 0xbf, 0x12, 0x40, 0xeb, 0x6a, 0x00, 0xd6, 0xdf, 0x0c, 0xb4, 0x59, - 0xb7, 0x2a, 0x4e, 0xd9, 0x88, 0x27, 0x11, 0xfc, 0x90, 0xf5, 0xaa, 0x7e, 0xe6, 0xeb, 0xf5, 0xf3, - 0x1c, 0xad, 0x37, 0x9c, 0x12, 0xf9, 0x6d, 0xfc, 0x72, 0x26, 0x0a, 0xa9, 0xd1, 0x83, 0xb3, 0x56, - 0x8f, 0x43, 0x1c, 0x3e, 0xff, 0xe6, 0xa2, 0x67, 0x7c, 0x7b, 0xd1, 0x33, 0xfe, 0x79, 0xd1, 0x33, - 0xbe, 0x7c, 0xd3, 0x9b, 0xfb, 0xf6, 0x4d, 0x6f, 0xee, 0x1f, 0x6f, 0x7a, 0x73, 0xbf, 0xff, 0x70, - 0x4c, 0xe5, 0x24, 0xf1, 0x6c, 0xc2, 0xc2, 0x41, 0xfe, 0x13, 0x5a, 0xd9, 0xfa, 0xa0, 0xfc, 0xa7, - 0x4f, 0x1f, 0x0e, 0x5e, 0x37, 0x7f, 0xec, 0xe5, 0x34, 0x06, 0xe1, 0x2d, 0xe9, 0xb2, 0x7e, 0xf8, - 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x73, 0xaf, 0xd0, 0x18, 0x09, 0x10, 0x00, 0x00, + // 1645 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0x4d, 0x73, 0x1b, 0xc7, + 0xd1, 0xe6, 0x12, 0xfc, 0xc2, 0x80, 0x1f, 0xe2, 0x92, 0xb2, 0x96, 0x7a, 0xf9, 0x82, 0xd0, 0x3a, + 0x71, 0x31, 0xe5, 0xf2, 0x22, 0xa4, 0x2a, 0x55, 0x29, 0x55, 0x5c, 0x2e, 0x12, 0x92, 0x2c, 0x9a, + 0xb1, 0x05, 0x2f, 0x19, 0xaa, 0x92, 0x1c, 0xb6, 0x66, 0x67, 0x5b, 0xc0, 0x14, 0x77, 0x77, 0x56, + 0x33, 0x83, 0x95, 0x70, 0xc9, 0x39, 0x47, 0xe7, 0xe6, 0x4a, 0x2e, 0x4e, 0xfe, 0x40, 0xfe, 0x86, + 0x8f, 0x3e, 0xe6, 0x64, 0xa7, 0xa4, 0x43, 0x0e, 0xf9, 0x13, 0xa9, 0x99, 0xfd, 0x04, 0x48, 0x2a, + 0x50, 0x25, 0xb9, 0xed, 0xf4, 0x74, 0x3f, 0xdd, 0x3d, 0xd3, 0xfd, 0xf4, 0x00, 0xe8, 0x90, 0xc6, + 0x12, 0x38, 0x19, 0x62, 0x1a, 0x7b, 0x02, 0xc8, 0x88, 0x53, 0x39, 0xee, 0x12, 0x92, 0x76, 0x13, + 0xce, 0x52, 0x1a, 0x00, 0xef, 0xa6, 0x07, 0xe5, 0xb7, 0x93, 0x70, 0x26, 0x99, 0xf9, 0xfe, 0x35, + 0x36, 0x0e, 0x21, 0xa9, 0x53, 0xea, 0xa5, 0x07, 0x77, 0xb7, 0x07, 0x6c, 0xc0, 0xb4, 0x7e, 0x57, + 0x7d, 0x65, 0xa6, 0x77, 0xf7, 0x06, 0x8c, 0x0d, 0x42, 0xe8, 0xea, 0x95, 0x3f, 0x7a, 0xde, 0x95, + 0x34, 0x02, 0x21, 0x71, 0x94, 0xe4, 0x0a, 0xed, 0x69, 0x85, 0x60, 0xc4, 0xb1, 0xa4, 0x2c, 0x2e, + 0x00, 0xa8, 0x4f, 0xba, 0x84, 0x71, 0xe8, 0x92, 0x90, 0x42, 0x2c, 0x55, 0x78, 0xd9, 0x57, 0xae, + 0xd0, 0x55, 0x0a, 0x21, 0x1d, 0x0c, 0x65, 0x26, 0x16, 0x5d, 0x09, 0x71, 0x00, 0x3c, 0xa2, 0x99, + 0x72, 0xb5, 0xca, 0x0d, 0x76, 0x6b, 0xfb, 0x84, 0x8f, 0x13, 0xc9, 0xba, 0x97, 0x30, 0x16, 0xf9, + 0xee, 0x07, 0x84, 0x89, 0x88, 0x89, 0x2e, 0xa8, 0xc4, 0x62, 0x02, 0xdd, 0xf4, 0xc0, 0x07, 0x89, + 0x0f, 0x4a, 0x41, 0x11, 0x77, 0xae, 0xe7, 0x63, 0x51, 0xe9, 0x10, 0x46, 0xf3, 0xb8, 0xed, 0x1f, + 0x96, 0x90, 0xd5, 0x63, 0xb1, 0x18, 0x45, 0xc0, 0x8f, 0x82, 0x80, 0xaa, 0x94, 0xfa, 0x9c, 0x25, + 0x4c, 0xe0, 0xd0, 0xdc, 0x46, 0x8b, 0x92, 0xca, 0x10, 0x2c, 0xa3, 0x63, 0xec, 0x37, 0xdd, 0x6c, + 0x61, 0x76, 0x50, 0x2b, 0x00, 0x41, 0x38, 0x4d, 0x94, 0xb2, 0x35, 0xaf, 0xf7, 0xea, 0x22, 0x73, + 0x07, 0xad, 0x64, 0xb7, 0x40, 0x03, 0xab, 0xa1, 0xb7, 0x97, 0xf5, 0xfa, 0x24, 0x30, 0x3f, 0x45, + 0xeb, 0x34, 0xa6, 0x92, 0xe2, 0xd0, 0x1b, 0x82, 0x3a, 0x0d, 0x6b, 0xa1, 0x63, 0xec, 0xb7, 0x0e, + 0xef, 0x3a, 0xd4, 0x27, 0x8e, 0x3a, 0x40, 0x27, 0x3f, 0xb6, 0xf4, 0xc0, 0x79, 0xa2, 0x35, 0x8e, + 0x17, 0xbe, 0xfd, 0x7e, 0x6f, 0xce, 0x5d, 0xcb, 0xed, 0x32, 0xa1, 0x79, 0x0f, 0xad, 0x0e, 0x20, + 0x06, 0x41, 0x85, 0x37, 0xc4, 0x62, 0x68, 0x2d, 0x76, 0x8c, 0xfd, 0x55, 0xb7, 0x95, 0xcb, 0x9e, + 0x60, 0x31, 0x34, 0xf7, 0x50, 0xcb, 0xa7, 0x31, 0xe6, 0xe3, 0x4c, 0x63, 0x49, 0x6b, 0xa0, 0x4c, + 0xa4, 0x15, 0x7a, 0x08, 0x89, 0x04, 0xbf, 0x8c, 0x3d, 0x75, 0xdb, 0xd6, 0x72, 0x1e, 0x48, 0x76, + 0xd3, 0x4e, 0x71, 0xd3, 0xce, 0x79, 0x51, 0x0a, 0xc7, 0x2b, 0x2a, 0x90, 0xaf, 0x7e, 0xd8, 0x33, + 0xdc, 0xa6, 0xb6, 0x53, 0x3b, 0xe6, 0x17, 0xe8, 0xd6, 0x28, 0xf6, 0x59, 0x1c, 0xd0, 0x78, 0xe0, + 0x25, 0xc0, 0x29, 0x0b, 0xac, 0x15, 0x0d, 0xb5, 0x73, 0x05, 0xea, 0x61, 0x5e, 0x34, 0x19, 0xd2, + 0xd7, 0x0a, 0x69, 0xa3, 0x34, 0xee, 0x6b, 0x5b, 0xf3, 0x4b, 0x64, 0x12, 0x92, 0xea, 0x90, 0xd8, + 0x48, 0x16, 0x88, 0xcd, 0xd9, 0x11, 0x6f, 0x11, 0x92, 0x9e, 0x67, 0xd6, 0x39, 0xe4, 0x6f, 0xd1, + 0x1d, 0xc9, 0x71, 0x2c, 0x9e, 0x03, 0x9f, 0xc6, 0x45, 0xb3, 0xe3, 0xde, 0x2e, 0x30, 0x26, 0xc1, + 0x9f, 0xa0, 0x0e, 0xc9, 0x0b, 0xc8, 0xe3, 0x10, 0x50, 0x21, 0x39, 0xf5, 0x47, 0xca, 0xd6, 0x7b, + 0xce, 0x31, 0xd1, 0x35, 0xd2, 0xd2, 0x45, 0xd0, 0x2e, 0xf4, 0xdc, 0x09, 0xb5, 0xc7, 0xb9, 0x96, + 0xf9, 0x14, 0xfd, 0xc8, 0x0f, 0x19, 0xb9, 0x14, 0x2a, 0x38, 0x6f, 0x02, 0x49, 0xbb, 0x8e, 0xa8, + 0x10, 0x0a, 0x6d, 0xb5, 0x63, 0xec, 0x37, 0xdc, 0x7b, 0x99, 0x6e, 0x1f, 0xf8, 0xc3, 0x9a, 0xe6, + 0x79, 0x4d, 0xd1, 0xfc, 0x08, 0x99, 0x43, 0x2a, 0x24, 0xe3, 0x94, 0xe0, 0xd0, 0x83, 0x58, 0x72, + 0x0a, 0xc2, 0x5a, 0xd3, 0xe6, 0x9b, 0xd5, 0xce, 0xa3, 0x6c, 0xc3, 0xfc, 0x0c, 0xdd, 0xbb, 0xd1, + 0xa9, 0x47, 0x86, 0x38, 0x8e, 0x21, 0xb4, 0xd6, 0x75, 0x2a, 0x7b, 0xc1, 0x0d, 0x3e, 0x7b, 0x99, + 0xda, 0x83, 0x95, 0xdf, 0x7f, 0xb3, 0x37, 0xf7, 0xf5, 0x37, 0x7b, 0x73, 0xf6, 0x5f, 0x0d, 0x74, + 0xa7, 0x57, 0x26, 0x1e, 0xb1, 0x14, 0x87, 0xff, 0xcb, 0x06, 0x3b, 0x42, 0x4d, 0x21, 0x59, 0x92, + 0x95, 0xf4, 0xc2, 0x3b, 0x94, 0xf4, 0x8a, 0x32, 0x53, 0x1b, 0xf6, 0x9f, 0x0c, 0xb4, 0xfd, 0xe8, + 0xc5, 0x88, 0xa6, 0x8c, 0xe0, 0xff, 0x0a, 0x1f, 0x9c, 0xa2, 0x35, 0xa8, 0xe1, 0x09, 0xab, 0xd1, + 0x69, 0xec, 0xb7, 0x0e, 0x7f, 0xec, 0x64, 0xe4, 0xe4, 0x94, 0x9c, 0x95, 0x13, 0x94, 0x53, 0xf7, + 0xee, 0x4e, 0xda, 0xda, 0xff, 0x34, 0xd0, 0xad, 0x4f, 0x43, 0xe6, 0xe3, 0xf0, 0x2c, 0xc4, 0x62, + 0xa8, 0x2e, 0x6f, 0xac, 0xb2, 0xe6, 0x90, 0x77, 0x8d, 0x8e, 0x6e, 0xe6, 0xac, 0x95, 0x99, 0xee, + 0xe3, 0x4f, 0xd0, 0x66, 0x59, 0xc7, 0xe5, 0xe1, 0xea, 0x64, 0x8e, 0xb7, 0x5e, 0x7f, 0xbf, 0xb7, + 0x51, 0xdc, 0x61, 0x4f, 0x1f, 0xf4, 0x43, 0x77, 0x83, 0x4c, 0x08, 0x02, 0xb3, 0x8d, 0x5a, 0xd4, + 0x27, 0x9e, 0x80, 0x17, 0x5e, 0x3c, 0x8a, 0xf4, 0xbd, 0x2c, 0xb8, 0x4d, 0xea, 0x93, 0x33, 0x78, + 0xf1, 0xc5, 0x28, 0x32, 0xef, 0xa3, 0xf7, 0x8a, 0x41, 0xe4, 0xa5, 0x38, 0xf4, 0x94, 0xbd, 0x87, + 0x83, 0x80, 0xeb, 0x6b, 0x5a, 0x75, 0xb7, 0x8a, 0xdd, 0x0b, 0x1c, 0x2a, 0x67, 0x47, 0x41, 0xc0, + 0xed, 0x7f, 0x2c, 0xa2, 0xa5, 0x3e, 0xe6, 0x38, 0x12, 0xe6, 0x39, 0xda, 0x90, 0x10, 0x25, 0x21, + 0x96, 0xe0, 0x65, 0x1c, 0x99, 0x67, 0xfa, 0xa1, 0xe6, 0xce, 0xfa, 0x6c, 0x71, 0x6a, 0xd3, 0x24, + 0x3d, 0x70, 0x7a, 0x5a, 0x7a, 0x26, 0xb1, 0x04, 0x77, 0xbd, 0xc0, 0xc8, 0x84, 0xe6, 0xcf, 0x91, + 0x25, 0xf9, 0x48, 0xc8, 0x8a, 0xbd, 0xaa, 0xb6, 0xcd, 0xae, 0xf2, 0xbd, 0x62, 0x3f, 0x6b, 0xf8, + 0xb2, 0x5d, 0xaf, 0x27, 0xaa, 0xc6, 0x7f, 0x42, 0x54, 0x67, 0x68, 0x4b, 0xb1, 0xfc, 0x34, 0xe6, + 0xc2, 0xec, 0x98, 0x9b, 0xca, 0x7e, 0x12, 0xf4, 0x4b, 0x64, 0xa6, 0x82, 0x4c, 0x63, 0x2e, 0xbe, + 0x43, 0x9c, 0xa9, 0x20, 0x93, 0x90, 0x01, 0xda, 0x15, 0xaa, 0xf8, 0xbc, 0x08, 0xa4, 0xa6, 0xbd, + 0x24, 0x84, 0x98, 0x8a, 0x61, 0x01, 0xbe, 0x34, 0x3b, 0xf8, 0x8e, 0x06, 0xfa, 0x5c, 0xe1, 0xb8, + 0x05, 0x4c, 0xee, 0xa5, 0x87, 0xda, 0xd7, 0x7b, 0x29, 0x2f, 0x68, 0x59, 0x5f, 0xd0, 0xff, 0x5d, + 0x03, 0x51, 0xde, 0xd2, 0x21, 0xba, 0x1d, 0xe1, 0x57, 0x9e, 0x1c, 0x72, 0x26, 0x65, 0x08, 0x81, + 0x97, 0x60, 0x72, 0x09, 0x52, 0xe8, 0x19, 0xd5, 0x70, 0xb7, 0x22, 0xfc, 0xea, 0xbc, 0xd8, 0xeb, + 0x67, 0x5b, 0xa6, 0x40, 0x1f, 0xd4, 0x28, 0xfd, 0x25, 0xe6, 0x81, 0x17, 0x40, 0xcc, 0x22, 0x8f, + 0xc3, 0x40, 0xf1, 0x1e, 0xce, 0xd8, 0x1d, 0xa0, 0x1c, 0x4b, 0x79, 0x23, 0xab, 0x57, 0x46, 0xd9, + 0xc4, 0x3d, 0x46, 0xe3, 0x7c, 0x76, 0xdb, 0x15, 0xf3, 0x2b, 0xb4, 0x87, 0x0a, 0xcc, 0xad, 0x61, + 0x3d, 0x06, 0xb0, 0x7d, 0xb4, 0xf9, 0x04, 0xc7, 0x81, 0x18, 0xe2, 0x4b, 0xf8, 0x1c, 0x24, 0x0e, + 0xb0, 0xc4, 0x13, 0x3d, 0xf3, 0x1c, 0xc0, 0x4b, 0x18, 0x0b, 0xb3, 0x9e, 0xc9, 0x28, 0xa8, 0xec, + 0x99, 0xc7, 0x00, 0x7d, 0xc6, 0x42, 0xd5, 0x33, 0xa6, 0x85, 0x96, 0x53, 0xe0, 0xa2, 0xaa, 0xe0, + 0x62, 0x69, 0xff, 0x04, 0x35, 0x35, 0x69, 0x1c, 0x91, 0x4b, 0x61, 0xee, 0xa2, 0xa6, 0x42, 0x02, + 0x21, 0x40, 0x58, 0x46, 0xa7, 0xb1, 0xdf, 0x74, 0x2b, 0x81, 0x2d, 0xd1, 0xce, 0x4d, 0xef, 0x22, + 0x61, 0x3e, 0x43, 0xcb, 0x09, 0xe8, 0xa1, 0xad, 0x0d, 0x5b, 0x87, 0x1f, 0x3b, 0x33, 0xbc, 0x3d, + 0x9d, 0x9b, 0x00, 0xdd, 0x02, 0xcd, 0xe6, 0xd5, 0x6b, 0x6c, 0x6a, 0x56, 0x08, 0xf3, 0x62, 0xda, + 0xe9, 0x2f, 0xde, 0xc9, 0xe9, 0x14, 0x5e, 0xe5, 0xf3, 0x43, 0xd4, 0x3a, 0xca, 0xd2, 0xfe, 0x25, + 0x15, 0xf2, 0xea, 0xb1, 0xac, 0xd6, 0x8f, 0xe5, 0x33, 0xb4, 0x9e, 0x8f, 0xb8, 0x73, 0xa6, 0x89, + 0xcf, 0xfc, 0x7f, 0x84, 0xf2, 0xd9, 0xa8, 0x08, 0x33, 0xbb, 0x96, 0x66, 0x2e, 0x39, 0x09, 0x26, + 0x46, 0xd5, 0xfc, 0xc4, 0xa8, 0xb2, 0x5d, 0xb4, 0x71, 0x21, 0xc8, 0xaf, 0x8a, 0xf7, 0xcf, 0xd3, + 0x44, 0x98, 0xb7, 0xd1, 0x92, 0xea, 0xd5, 0x1c, 0x68, 0xc1, 0x5d, 0x4c, 0x05, 0x39, 0x09, 0xcc, + 0xfd, 0xfa, 0x1b, 0x8b, 0x25, 0x1e, 0x0d, 0x84, 0x35, 0xdf, 0x69, 0xec, 0x2f, 0xb8, 0xeb, 0xa3, + 0xca, 0xfc, 0x24, 0x10, 0xf6, 0xaf, 0x51, 0xab, 0x06, 0x68, 0xae, 0xa3, 0xf9, 0x12, 0x6b, 0x9e, + 0x06, 0xe6, 0x03, 0xb4, 0x53, 0x01, 0x4d, 0xd2, 0x7d, 0x86, 0xd8, 0x74, 0xef, 0x94, 0x0a, 0x13, + 0x8c, 0x2f, 0xec, 0xa7, 0x68, 0xfb, 0xa4, 0x22, 0x97, 0x72, 0x98, 0x4c, 0x64, 0x68, 0x4c, 0x0e, + 0xe3, 0x5d, 0xd4, 0x2c, 0x7f, 0x48, 0xe8, 0xec, 0x17, 0xdc, 0x4a, 0x60, 0x47, 0xe8, 0xd6, 0x85, + 0x20, 0x67, 0x10, 0x07, 0x15, 0xd8, 0x0d, 0x07, 0x70, 0x3c, 0x0d, 0x34, 0xf3, 0x43, 0xb5, 0x72, + 0xf7, 0x17, 0x03, 0x59, 0x8f, 0x5e, 0x25, 0x8c, 0x4b, 0x08, 0xae, 0xf8, 0x7d, 0x4b, 0x12, 0x97, + 0x68, 0x4b, 0x85, 0x24, 0x20, 0x0e, 0xbc, 0x12, 0x2d, 0x3b, 0xad, 0xd6, 0xe1, 0xcf, 0x66, 0xaa, + 0xc1, 0x69, 0x77, 0x39, 0x2d, 0x6c, 0xa6, 0x53, 0x72, 0x61, 0xff, 0xc1, 0x40, 0xd6, 0x29, 0x8c, + 0x8f, 0x84, 0xa0, 0x83, 0x38, 0x82, 0x58, 0x2a, 0x46, 0xc3, 0x04, 0xd4, 0xa7, 0xf9, 0x3e, 0x5a, + 0x2b, 0xd9, 0xa0, 0x24, 0x81, 0x55, 0x77, 0xb5, 0x10, 0xea, 0xee, 0x7f, 0x80, 0x50, 0xc2, 0x21, + 0xf5, 0x88, 0x77, 0x09, 0xe3, 0xfc, 0xac, 0x76, 0xeb, 0x03, 0x31, 0xfb, 0x31, 0xe5, 0xf4, 0x47, + 0x7e, 0x48, 0xc9, 0x29, 0x8c, 0xdd, 0x15, 0xa5, 0xdf, 0x3b, 0x85, 0xb1, 0x7a, 0xe0, 0x24, 0xec, + 0x25, 0x70, 0x3d, 0xc5, 0x1a, 0x6e, 0xb6, 0xb0, 0xff, 0x68, 0xa0, 0x3b, 0x17, 0x38, 0xa4, 0x01, + 0x96, 0x8c, 0x17, 0x45, 0xd1, 0x1f, 0xf9, 0xca, 0xe2, 0x2d, 0xe7, 0x76, 0x25, 0xda, 0xf9, 0x6b, + 0xa2, 0xfd, 0x04, 0xad, 0x96, 0x65, 0xa8, 0xe2, 0x6d, 0xcc, 0x10, 0x6f, 0xab, 0xb0, 0x38, 0x85, + 0xb1, 0xfd, 0xbb, 0x5a, 0x6c, 0xc7, 0xe3, 0x1a, 0xc3, 0xf0, 0x7f, 0x13, 0x5b, 0xe9, 0xb6, 0x1e, + 0x1b, 0xa9, 0xdb, 0x5f, 0x49, 0xa0, 0x71, 0x35, 0x01, 0xfb, 0xcf, 0x06, 0xda, 0xae, 0x7b, 0x15, + 0xe7, 0xac, 0xcf, 0x47, 0x31, 0xbc, 0xcd, 0x7b, 0x55, 0xe4, 0xf3, 0xf5, 0x22, 0x7f, 0x86, 0xd6, + 0x27, 0x82, 0x12, 0xf9, 0x69, 0xfc, 0x74, 0xa6, 0x1a, 0xab, 0x71, 0x98, 0xbb, 0x56, 0xcf, 0x43, + 0x1c, 0x3f, 0xfb, 0xf6, 0x75, 0xdb, 0xf8, 0xee, 0x75, 0xdb, 0xf8, 0xfb, 0xeb, 0xb6, 0xf1, 0xd5, + 0x9b, 0xf6, 0xdc, 0x77, 0x6f, 0xda, 0x73, 0x7f, 0x7b, 0xd3, 0x9e, 0xfb, 0xcd, 0xc7, 0x03, 0x2a, + 0x87, 0x23, 0xdf, 0x21, 0x2c, 0xea, 0xe6, 0xbf, 0x94, 0x2b, 0x5f, 0x1f, 0x95, 0x7f, 0x3c, 0xa4, + 0xf7, 0xbb, 0xaf, 0x26, 0xff, 0x7d, 0x90, 0xe3, 0x04, 0x84, 0xbf, 0xa4, 0x7b, 0xef, 0xfe, 0xbf, + 0x02, 0x00, 0x00, 0xff, 0xff, 0x2b, 0x34, 0xfa, 0x5d, 0xae, 0x10, 0x00, 0x00, } func (m *ConsumerAdditionProposal) Marshal() (dAtA []byte, err error) { @@ -2088,6 +2145,50 @@ func (m *VscSendTimestamp) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ExportedVscSendTimestamp) 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 *ExportedVscSendTimestamp) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ExportedVscSendTimestamp) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.VscSendTimestamps) > 0 { + for iNdEx := len(m.VscSendTimestamps) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.VscSendTimestamps[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProvider(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.ChainId) > 0 { + i -= len(m.ChainId) + copy(dAtA[i:], m.ChainId) + i = encodeVarintProvider(dAtA, i, uint64(len(m.ChainId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *KeyAssignmentReplacement) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -2602,6 +2703,25 @@ func (m *VscSendTimestamp) Size() (n int) { return n } +func (m *ExportedVscSendTimestamp) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ChainId) + if l > 0 { + n += 1 + l + sovProvider(uint64(l)) + } + if len(m.VscSendTimestamps) > 0 { + for _, e := range m.VscSendTimestamps { + l = e.Size() + n += 1 + l + sovProvider(uint64(l)) + } + } + return n +} + func (m *KeyAssignmentReplacement) Size() (n int) { if m == nil { return 0 @@ -5009,6 +5129,122 @@ func (m *VscSendTimestamp) Unmarshal(dAtA []byte) error { } return nil } +func (m *ExportedVscSendTimestamp) 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 ErrIntOverflowProvider + } + 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: ExportedVscSendTimestamp: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ExportedVscSendTimestamp: 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 ErrIntOverflowProvider + } + 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 ErrInvalidLengthProvider + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthProvider + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VscSendTimestamps", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProvider + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProvider + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProvider + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.VscSendTimestamps = append(m.VscSendTimestamps, VscSendTimestamp{}) + if err := m.VscSendTimestamps[len(m.VscSendTimestamps)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipProvider(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProvider + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *KeyAssignmentReplacement) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 From 7484dbceb66ceafad05d34d46c6b4e4f145cb022 Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Wed, 19 Jul 2023 09:04:35 -0700 Subject: [PATCH 095/108] tests: regression tests for types sent over wire as json (#1160) * tests * linting is the most important part of programming --------- Co-authored-by: Marius Poke --- x/ccv/consumer/keeper/relay_test.go | 12 ++- x/ccv/types/ccv.go | 12 +-- x/ccv/types/ccv_test.go | 131 ++++++++++++++++++++++++++++ 3 files changed, 143 insertions(+), 12 deletions(-) diff --git a/x/ccv/consumer/keeper/relay_test.go b/x/ccv/consumer/keeper/relay_test.go index 6dbebe273f..ed6771900e 100644 --- a/x/ccv/consumer/keeper/relay_test.go +++ b/x/ccv/consumer/keeper/relay_test.go @@ -234,13 +234,21 @@ func TestOnAcknowledgementPacket(t *testing.T) { // Set an established provider channel for later in test consumerKeeper.SetProviderChannel(ctx, channelIDToProvider) - packetData := types.NewSlashPacketData( + slashPacketData := types.NewSlashPacketData( abci.Validator{Address: bytes.HexBytes{}, Power: int64(1)}, uint64(1), stakingtypes.Infraction_INFRACTION_DOWNTIME, ) + // The type that'd be JSON marshaled and sent over the wire + consumerPacketData := types.NewConsumerPacketData( + types.SlashPacket, + &types.ConsumerPacketData_SlashPacketData{ + SlashPacketData: slashPacketData, + }, + ) + // AcknowledgePacket is in reference to a packet originally sent from this (consumer) module. packet := channeltypes.NewPacket( - packetData.GetBytes(), + consumerPacketData.GetBytes(), 1, types.ConsumerPortID, // Source port channelIDToDestChain, // Source channel diff --git a/x/ccv/types/ccv.go b/x/ccv/types/ccv.go index 91175eab5d..70921704f7 100644 --- a/x/ccv/types/ccv.go +++ b/x/ccv/types/ccv.go @@ -29,6 +29,8 @@ func (vsc ValidatorSetChangePacketData) ValidateBasic() error { return nil } +// GetBytes marshals the ValidatorSetChangePacketData into JSON string bytes +// to be sent over the wire with IBC. func (vsc ValidatorSetChangePacketData) GetBytes() []byte { valUpdateBytes := ModuleCdc.MustMarshalJSON(&vsc) return valUpdateBytes @@ -48,11 +50,6 @@ func (mat VSCMaturedPacketData) ValidateBasic() error { return nil } -func (mat VSCMaturedPacketData) GetBytes() []byte { - bytes := ModuleCdc.MustMarshalJSON(&mat) - return bytes -} - func NewSlashPacketData(validator abci.Validator, valUpdateId uint64, infractionType stakingtypes.Infraction) *SlashPacketData { return &SlashPacketData{ Validator: validator, @@ -90,11 +87,6 @@ func (vdt SlashPacketData) ValidateBasic() error { return nil } -func (vdt SlashPacketData) GetBytes() []byte { - valDowntimeBytes := ModuleCdc.MustMarshalJSON(&vdt) - return valDowntimeBytes -} - func (vdt SlashPacketData) ToV1() *SlashPacketDataV1 { return NewSlashPacketDataV1(vdt.Validator, vdt.ValsetUpdateId, vdt.Infraction) } diff --git a/x/ccv/types/ccv_test.go b/x/ccv/types/ccv_test.go index 596967b199..50164fcf73 100644 --- a/x/ccv/types/ccv_test.go +++ b/x/ccv/types/ccv_test.go @@ -1,15 +1,18 @@ package types_test import ( + "strings" "testing" "github.com/stretchr/testify/require" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" abci "github.com/cometbft/cometbft/abci/types" + "github.com/cosmos/interchain-security/v3/testutil/crypto" "github.com/cosmos/interchain-security/v3/x/ccv/types" ) @@ -93,3 +96,131 @@ func TestMarshalPacketData(t *testing.T) { require.Nil(t, err) require.Equal(t, vpd, recovered, "unmarshaled packet data does not equal original value") } + +// TestVSCPacketDataWireBytes is a regression test that the JSON schema +// for ValidatorSetChangePacketData (sent over the wire) does not change. +func TestVSCPacketDataWireBytes(t *testing.T) { + cId1 := crypto.NewCryptoIdentityFromIntSeed(4732894) + cId2 := crypto.NewCryptoIdentityFromIntSeed(4732895) + + pd := types.NewValidatorSetChangePacketData( + []abci.ValidatorUpdate{ + { + PubKey: cId1.TMProtoCryptoPublicKey(), + Power: 30, + }, + { + PubKey: cId2.TMProtoCryptoPublicKey(), + Power: 20, + }, + }, + 73, + []string{"slash", "acks", "example"}, + ) + + jsonBz := pd.GetBytes() + str := string(jsonBz) + + // Expected string formatted for human readability + expectedStr := `{ + "validator_updates": [ + { + "pub_key": { + "ed25519": "SMxP2pXAuxQC7FmBn4dh4Kt5eYdQFWC/wN7oWobZKds=" + }, + "power": "30" + }, + { + "pub_key": { + "ed25519": "J/nGy0vCXhgVbr8S71B4ZgHi4fsMqtDxDlERZ+gG238=" + }, + "power": "20" + } + ], + "valset_update_id": "73", + "slash_acks": ["slash", "acks", "example"] + }` + + // Remove newlines, tabs, and spaces for comparison + expectedStr = strings.ReplaceAll(expectedStr, "\n", "") + expectedStr = strings.ReplaceAll(expectedStr, "\t", "") + expectedStr = strings.ReplaceAll(expectedStr, " ", "") + + require.Equal(t, expectedStr, str) +} + +// TestSlashPacketDataWireBytes is a regression test that the JSON schema +// for SlashPacketData (sent over the wire) does not change. +func TestSlashPacketDataWireBytes(t *testing.T) { + // Construct consumer packet data wrapping slash packet data + cId := crypto.NewCryptoIdentityFromIntSeed(4732894342) + slashPacketData := types.NewSlashPacketData( + abci.Validator{ + Address: cId.SDKValConsAddress(), + Power: int64(4328), + }, + uint64(894732), + stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN, + ) + + // The type that'd be JSON marshaled and sent over the wire + cpd := types.NewConsumerPacketData( + types.SlashPacket, + &types.ConsumerPacketData_SlashPacketData{ + SlashPacketData: slashPacketData, + }, + ) + + jsonBz := cpd.GetBytes() + str := string(jsonBz) + + // Expected string formatted for human readability + expectedStr := `{ + "type": "CONSUMER_PACKET_TYPE_SLASH", + "slashPacketData": { + "validator": { + "address": "BP9q4oXCgubvoujOKyxIxd+3IwM=", + "power": "4328" + }, + "valset_update_id": "894732", + "infraction": "INFRACTION_TYPE_DOUBLE_SIGN" + } + }` + + // Remove newlines, tabs, and spaces for comparison + expectedStr = strings.ReplaceAll(expectedStr, "\n", "") + expectedStr = strings.ReplaceAll(expectedStr, "\t", "") + expectedStr = strings.ReplaceAll(expectedStr, " ", "") + + require.Equal(t, expectedStr, str) +} + +// TestVSCMaturedPacketDataWireBytes is a regression test that the JSON schema +// for VSCMaturedPacketData (sent over the wire) does not change. +func TestVSCMaturedPacketDataWireBytes(t *testing.T) { + // Construct consumer packet data wrapping vsc matured packet data + cpd := types.ConsumerPacketData{ + Type: types.VscMaturedPacket, + Data: &types.ConsumerPacketData_VscMaturedPacketData{ + VscMaturedPacketData: types.NewVSCMaturedPacketData(84923), + }, + } + + jsonBz := cpd.GetBytes() + str := string(jsonBz) + + // Expected string formatted for human readability + expectedStr := `{ + "type": "CONSUMER_PACKET_TYPE_VSCM", + "vscMaturedPacketData": { + "valset_update_id": "84923" + } + }` + + // Remove newlines, tabs, and spaces for comparison + expectedStr = strings.ReplaceAll(expectedStr, "\n", "") + expectedStr = strings.ReplaceAll(expectedStr, "\t", "") + expectedStr = strings.ReplaceAll(expectedStr, " ", "") + + require.Equal(t, expectedStr, str) +} From 5e5e2fa7508b69e7242ec007347cabe8ea676f79 Mon Sep 17 00:00:00 2001 From: Philip Offtermatt <57488781+p-offtermatt@users.noreply.github.com> Date: Tue, 1 Aug 2023 13:29:57 +0200 Subject: [PATCH 096/108] test: Fix mismatching code/comment and use WaitTime instead of sleep (#1174) Fix mismatching comment and use WaitTime instead of sleep --- tests/e2e/actions.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/e2e/actions.go b/tests/e2e/actions.go index 3dd8fb704e..8faca43c0a 100644 --- a/tests/e2e/actions.go +++ b/tests/e2e/actions.go @@ -1655,8 +1655,8 @@ type unjailValidatorAction struct { // Sends an unjail transaction to the provider chain func (tr TestRun) unjailValidator(action unjailValidatorAction, verbose bool) { - // wait a block to be sure downtime_jail_duration has elapsed - time.Sleep(61 * time.Second) + // wait until downtime_jail_duration has elapsed, to make sure the validator can be unjailed + tr.WaitTime(61 * time.Second) //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. cmd := exec.Command("docker", "exec", From b72ad0d62832043675b8148727def24925b0eb9a Mon Sep 17 00:00:00 2001 From: karolos Date: Wed, 2 Aug 2023 15:02:42 +0200 Subject: [PATCH 097/108] docs: remove an obsolete comment before setting the order of EndBlockers (#1081) Remove the whole comment because the described order does not constitute an interchain security requirement. --- app/provider/app.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/app/provider/app.go b/app/provider/app.go index a25e3f4ab6..c054f4a00b 100644 --- a/app/provider/app.go +++ b/app/provider/app.go @@ -530,12 +530,7 @@ func New( vestingtypes.ModuleName, providertypes.ModuleName, ) - // Interchain Security requirements - // - provider.EndBlock gets validator updates from the staking module; - // thus, staking.EndBlock must be executed before provider.EndBlock; - // - creating a new consumer chain requires the following order, - // CreateChildClient(), staking.EndBlock, provider.EndBlock; - // thus, gov.EndBlock must be executed before staking.EndBlock + app.MM.SetOrderEndBlockers( crisistypes.ModuleName, govtypes.ModuleName, From c49651332ff824235e75fb3ae32df43858c34fb4 Mon Sep 17 00:00:00 2001 From: Philip Offtermatt <57488781+p-offtermatt@users.noreply.github.com> Date: Wed, 2 Aug 2023 17:52:57 +0200 Subject: [PATCH 098/108] chore: Migrate containers to informalsystems repos (#1172) * Migrate containers to informalsystems repos and fix versions * Remove fixed shas from container images --- Dockerfile | 4 ++-- tests/e2e/testnet-scripts/start-chain.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index dee88dae7c..7c45187034 100644 --- a/Dockerfile +++ b/Dockerfile @@ -32,10 +32,10 @@ RUN make install FROM ghcr.io/informalsystems/hermes:1.4.1 AS hermes-builder # Get CometMock -FROM informalofftermatt/cometmock:latest as cometmock-builder +FROM ghcr.io/informalsystems/cometmock:v0.37.x as cometmock-builder # Get GoRelayer -FROM informalofftermatt/gorelayer:nogas AS gorelayer-builder +FROM ghcr.io/informalsystems/relayer-no-gas-sim:v2.3.0-rc4-no-gas-sim AS gorelayer-builder FROM --platform=linux/amd64 fedora:36 RUN dnf update -y diff --git a/tests/e2e/testnet-scripts/start-chain.sh b/tests/e2e/testnet-scripts/start-chain.sh index a3609acf73..88c8455e51 100644 --- a/tests/e2e/testnet-scripts/start-chain.sh +++ b/tests/e2e/testnet-scripts/start-chain.sh @@ -362,7 +362,7 @@ NODE_HOMES=${NODE_HOMES%?} # CometMock takes the role of the query node if [[ "$USE_COMETMOCK" == "true" ]]; then sleep 2 - ip netns exec $QUERY_NET_NAMESPACE_NAME cometmock $NODE_LISTEN_ADDR_STR /$CHAIN_ID/genesis.json tcp://$CHAIN_IP_PREFIX.$QUERY_IP_SUFFIX:26658 $NODE_HOMES &> cometmock_${CHAIN_ID}_out.log & + ip netns exec $QUERY_NET_NAMESPACE_NAME cometmock $NODE_LISTEN_ADDR_STR /$CHAIN_ID/genesis.json tcp://$CHAIN_IP_PREFIX.$QUERY_IP_SUFFIX:26658 $NODE_HOMES grpc &> cometmock_${CHAIN_ID}_out.log & sleep 3 fi From c0d8314490bf403363968c131a5e9e6f399390a1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Aug 2023 17:56:56 +0200 Subject: [PATCH 099/108] build(deps): bump github.com/tidwall/gjson from 1.14.4 to 1.15.0 (#1171) Bumps [github.com/tidwall/gjson](https://github.com/tidwall/gjson) from 1.14.4 to 1.15.0. - [Commits](https://github.com/tidwall/gjson/compare/v1.14.4...v1.15.0) --- updated-dependencies: - dependency-name: github.com/tidwall/gjson dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 7947a36e66..7ee8399acc 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/spf13/cast v1.5.1 github.com/spf13/cobra v1.6.1 github.com/stretchr/testify v1.8.4 - github.com/tidwall/gjson v1.14.4 + github.com/tidwall/gjson v1.15.0 golang.org/x/crypto v0.11.0 // indirect golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc golang.org/x/net v0.12.0 // indirect diff --git a/go.sum b/go.sum index 26ceadb4ea..5377f849fa 100644 --- a/go.sum +++ b/go.sum @@ -1115,8 +1115,8 @@ github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg= github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.14.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM= -github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.15.0 h1:5n/pM+v3r5ujuNl4YLZLsQ+UE5jlkLVm7jMzT5Mpolw= +github.com/tidwall/gjson v1.15.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= From 8c40f32869936bfe9b4a1dee9a44b3a6b8f8f484 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Aug 2023 08:45:34 -0700 Subject: [PATCH 100/108] build(deps): bump google.golang.org/grpc from 1.56.2 to 1.57.0 (#1170) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.56.2 to 1.57.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.56.2...v1.57.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 11 ++++++++--- go.sum | 14 ++++++++++---- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 7ee8399acc..ff38553879 100644 --- a/go.mod +++ b/go.mod @@ -26,8 +26,8 @@ require ( golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc golang.org/x/net v0.12.0 // indirect golang.org/x/sys v0.10.0 // indirect - google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 - google.golang.org/grpc v1.56.2 + google.golang.org/genproto v0.0.0-20230629202037-9506855d4529 // indirect + google.golang.org/grpc v1.57.0 google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -165,13 +165,18 @@ require ( sigs.k8s.io/yaml v1.3.0 // indirect ) -require github.com/spf13/viper v1.15.0 +require ( + github.com/spf13/viper v1.15.0 + google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e +) require ( cosmossdk.io/log v1.1.0 // indirect github.com/go-playground/locales v0.14.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/rs/zerolog v1.29.1 // indirect + golang.org/x/sync v0.1.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130 // indirect ) // following versions might cause unexpected behavior diff --git a/go.sum b/go.sum index 5377f849fa..4a93323e50 100644 --- a/go.sum +++ b/go.sum @@ -1362,6 +1362,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1747,8 +1749,12 @@ google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqw google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/genproto v0.0.0-20230629202037-9506855d4529 h1:9JucMWR7sPvCxUFd6UsOUNmA5kCcWOfORaT3tpAsKQs= +google.golang.org/genproto v0.0.0-20230629202037-9506855d4529/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e h1:AZX1ra8YbFMSb7+1pI8S9v4rrgRR7jU1FmuFSSjTVcQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130 h1:2FZP5XuJY9zQyGM5N0rtovnoXjiMUEIUMvw0m9wlpLc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1790,8 +1796,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.56.2 h1:fVRFRnXvU+x6C4IlHZewvJOVHoOv1TUuQyoRsYnB4bI= -google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= +google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= From 006680a60bfe7fc48ee142bb0107a3e82e076470 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Aug 2023 18:05:04 +0200 Subject: [PATCH 101/108] build(deps): bump bufbuild/buf-setup-action from 1.25.0 to 1.25.1 (#1187) Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.25.0 to 1.25.1. - [Release notes](https://github.com/bufbuild/buf-setup-action/releases) - [Commits](https://github.com/bufbuild/buf-setup-action/compare/v1.25.0...v1.25.1) --- updated-dependencies: - dependency-name: bufbuild/buf-setup-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/proto-registry.yml | 2 +- .github/workflows/proto.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/proto-registry.yml b/.github/workflows/proto-registry.yml index 9764edd806..a3291cec36 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@v3 - - uses: bufbuild/buf-setup-action@v1.25.0 + - uses: bufbuild/buf-setup-action@v1.25.1 - uses: bufbuild/buf-push-action@v1 with: input: "proto" diff --git a/.github/workflows/proto.yml b/.github/workflows/proto.yml index 8f80957d92..deb110dad0 100644 --- a/.github/workflows/proto.yml +++ b/.github/workflows/proto.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: bufbuild/buf-setup-action@v1.25.0 + - uses: bufbuild/buf-setup-action@v1.25.1 - uses: bufbuild/buf-breaking-action@v1 with: input: "proto" From aaa545dc936cb3b56adebdef327dbedc45066315 Mon Sep 17 00:00:00 2001 From: yaruwangway <69694322+yaruwangway@users.noreply.github.com> Date: Wed, 9 Aug 2023 10:45:26 +0200 Subject: [PATCH 102/108] feat: add provider info query (#1164) * feat: add provider info query * feat: refactor query providerInfo * feat: query provider info * feat: query all provider info * feat: add provider info query cli * feat: add consumer info to provider info query * feat: add consumer chain-id to provider info query * fix: return err when client, channel not found * fix: lint * chore: fix lint * chore: lint fix * chore: add nonlint * chore: add nonlint to the right place * chore: add nolint nolintlint * chore: nolint all * chore: nolint:golint * chore: fix package import order * chore: update queryProviderChainInfo to queryProviderInfo * chore: update proto * update query.go * docs: update changelog --- CHANGELOG.md | 1 + .../ccv/consumer/v1/query.proto | 18 + testutil/keeper/mocks.go | 10 + x/ccv/consumer/client/cli/query.go | 32 +- x/ccv/consumer/keeper/grpc_query.go | 17 +- x/ccv/consumer/keeper/provider_info.go | 54 ++ x/ccv/consumer/types/query.pb.go | 780 +++++++++++++++++- x/ccv/consumer/types/query.pb.gw.go | 65 ++ x/ccv/types/expected_keepers.go | 1 + 9 files changed, 940 insertions(+), 38 deletions(-) create mode 100644 x/ccv/consumer/keeper/provider_info.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 818bdca374..5003260943 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ Add an entry to the unreleased section whenever merging a PR to main that is not * (fix!) revert consumer packet data changes from #1037 [#1150](https://github.com/cosmos/interchain-security/pull/1150) * (fix!) proper deletion of pending packets [#1146](https://github.com/cosmos/interchain-security/pull/1146) * (feat!) optimize pending packets storage on consumer, with migration! [#1037](https://github.com/cosmos/interchain-security/pull/1037) +* (feat) introduce the gRPC query `/interchain_security/ccv/consumer/provider-info` and CLI command `interchain-security-cd q ccvconsumer provider-info`to retrieve provider info from the consumer chain. ## v3.1.0 diff --git a/proto/interchain_security/ccv/consumer/v1/query.proto b/proto/interchain_security/ccv/consumer/v1/query.proto index df90b1d0aa..43a7b0bccc 100644 --- a/proto/interchain_security/ccv/consumer/v1/query.proto +++ b/proto/interchain_security/ccv/consumer/v1/query.proto @@ -19,6 +19,10 @@ service Query { rpc QueryParams(QueryParamsRequest) returns (QueryParamsResponse) { option (google.api.http).get = "/interchain_security/ccv/consumer/params"; } + + rpc QueryProviderInfo(QueryProviderInfoRequest) returns (QueryProviderInfoResponse) { + option (google.api.http).get = "/interchain_security/ccv/consumer/provider-info"; + } } // NextFeeDistributionEstimate holds information about next fee distribution @@ -52,3 +56,17 @@ message QueryParamsResponse { // params holds all the parameters of this module. Params params = 1 [ (gogoproto.nullable) = false ]; } + +message QueryProviderInfoRequest {} + +message QueryProviderInfoResponse { + ChainInfo consumer = 1 [ (gogoproto.nullable) = false ]; + ChainInfo provider = 2 [ (gogoproto.nullable) = false ]; +} + +message ChainInfo { + string chainID = 1; + string clientID = 2; + string connectionID = 3; + string channelID = 4; +} diff --git a/testutil/keeper/mocks.go b/testutil/keeper/mocks.go index fea83079d3..b075819cc4 100644 --- a/testutil/keeper/mocks.go +++ b/testutil/keeper/mocks.go @@ -564,6 +564,16 @@ func (m *MockChannelKeeper) GetChannel(ctx types0.Context, srcPort, srcChan stri return ret0, ret1 } +func (m *MockChannelKeeper) GetChannelConnection(ctx types0.Context, portID, channelID string) (string, exported.ConnectionI, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetChannelConnection", ctx, portID, channelID) + ret0, _ := ret[0].(string) + ret1, _ := ret[0].(exported.ConnectionI) + ret2, _ := ret[1].(error) + + return ret0, ret1, ret2 +} + // GetChannel indicates an expected call of GetChannel. func (mr *MockChannelKeeperMockRecorder) GetChannel(ctx, srcPort, srcChan interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() diff --git a/x/ccv/consumer/client/cli/query.go b/x/ccv/consumer/client/cli/query.go index a961b9642c..dc1ecfc2f4 100644 --- a/x/ccv/consumer/client/cli/query.go +++ b/x/ccv/consumer/client/cli/query.go @@ -19,7 +19,10 @@ func NewQueryCmd() *cobra.Command { RunE: client.ValidateCmd, } - cmd.AddCommand(CmdNextFeeDistribution()) + cmd.AddCommand( + CmdNextFeeDistribution(), + CmdProviderInfo(), + ) return cmd } @@ -50,3 +53,30 @@ func CmdNextFeeDistribution() *cobra.Command { return cmd } + +func CmdProviderInfo() *cobra.Command { + cmd := &cobra.Command{ + Use: "provider-info", + Short: "Query provider info", + 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.QueryProviderInfoRequest{} + res, err := queryClient.QueryProviderInfo(cmd.Context(), req) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/ccv/consumer/keeper/grpc_query.go b/x/ccv/consumer/keeper/grpc_query.go index 174f591497..80e6b695a9 100644 --- a/x/ccv/consumer/keeper/grpc_query.go +++ b/x/ccv/consumer/keeper/grpc_query.go @@ -11,9 +11,9 @@ import ( "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" ) -var _ types.QueryServer = Keeper{} +var _ types.QueryServer = Keeper{} //nolint:golint -func (k Keeper) QueryNextFeeDistribution(c context.Context, +func (k Keeper) QueryNextFeeDistribution(c context.Context, //nolint:golint req *types.QueryNextFeeDistributionEstimateRequest, ) (*types.QueryNextFeeDistributionEstimateResponse, error) { ctx := sdk.UnwrapSDKContext(c) @@ -27,7 +27,7 @@ func (k Keeper) QueryNextFeeDistribution(c context.Context, return &types.QueryNextFeeDistributionEstimateResponse{Data: &nextDist}, nil } -func (k Keeper) QueryParams(c context.Context, +func (k Keeper) QueryParams(c context.Context, //nolint:golint req *types.QueryParamsRequest, ) (*types.QueryParamsResponse, error) { ctx := sdk.UnwrapSDKContext(c) @@ -40,3 +40,14 @@ func (k Keeper) QueryParams(c context.Context, return &types.QueryParamsResponse{Params: p}, nil } + +func (k Keeper) QueryProviderInfo(c context.Context, //nolint:golint + req *types.QueryProviderInfoRequest, +) (*types.QueryProviderInfoResponse, error) { + ctx := sdk.UnwrapSDKContext(c) + if req == nil { + return nil, status.Errorf(codes.InvalidArgument, "empty request") + } + + return k.GetProviderInfo(ctx) +} diff --git a/x/ccv/consumer/keeper/provider_info.go b/x/ccv/consumer/keeper/provider_info.go new file mode 100644 index 0000000000..d8dfef100a --- /dev/null +++ b/x/ccv/consumer/keeper/provider_info.go @@ -0,0 +1,54 @@ +package keeper + +import ( + ibctm "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" //nolint:golint + + 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" +) + +func (k Keeper) GetProviderInfo(ctx sdk.Context) (*types.QueryProviderInfoResponse, error) { //nolint:golint + consumerChannelID, found := k.GetProviderChannel(ctx) + if !found { + return nil, ccvtypes.ErrChannelNotFound + } + consumerChannel, found := k.channelKeeper.GetChannel(ctx, ccvtypes.ConsumerPortID, consumerChannelID) + if !found { + return nil, ccvtypes.ErrChannelNotFound + } + + // from channel get connection + consumerConnectionID, consumerConnection, err := k.channelKeeper.GetChannelConnection(ctx, ccvtypes.ConsumerPortID, consumerChannelID) + if err != nil { + return nil, err + } + + providerChannelID := consumerChannel.GetCounterparty().GetChannelID() + providerConnection := consumerConnection.GetCounterparty() + + consumerClientState, found := k.clientKeeper.GetClientState(ctx, consumerConnection.GetClientID()) + if !found { + return nil, ccvtypes.ErrClientNotFound + } + providerChainID := consumerClientState.(*ibctm.ClientState).ChainId + + resp := types.QueryProviderInfoResponse{ + Consumer: types.ChainInfo{ + ChainID: ctx.ChainID(), + ClientID: consumerConnection.GetClientID(), + ConnectionID: consumerConnectionID, + ChannelID: consumerChannelID, + }, + + Provider: types.ChainInfo{ + ChainID: providerChainID, + ClientID: providerConnection.GetClientID(), + ConnectionID: providerConnection.GetConnectionID(), + ChannelID: providerChannelID, + }, + } + + return &resp, nil +} diff --git a/x/ccv/consumer/types/query.pb.go b/x/ccv/consumer/types/query.pb.go index 5b9c52d962..effe4757ef 100644 --- a/x/ccv/consumer/types/query.pb.go +++ b/x/ccv/consumer/types/query.pb.go @@ -295,12 +295,171 @@ func (m *QueryParamsResponse) GetParams() Params { return Params{} } +type QueryProviderInfoRequest struct { +} + +func (m *QueryProviderInfoRequest) Reset() { *m = QueryProviderInfoRequest{} } +func (m *QueryProviderInfoRequest) String() string { return proto.CompactTextString(m) } +func (*QueryProviderInfoRequest) ProtoMessage() {} +func (*QueryProviderInfoRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_f627751d3cc10225, []int{5} +} +func (m *QueryProviderInfoRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryProviderInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryProviderInfoRequest.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 *QueryProviderInfoRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryProviderInfoRequest.Merge(m, src) +} +func (m *QueryProviderInfoRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryProviderInfoRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryProviderInfoRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryProviderInfoRequest proto.InternalMessageInfo + +type QueryProviderInfoResponse struct { + Consumer ChainInfo `protobuf:"bytes,1,opt,name=consumer,proto3" json:"consumer"` + Provider ChainInfo `protobuf:"bytes,2,opt,name=provider,proto3" json:"provider"` +} + +func (m *QueryProviderInfoResponse) Reset() { *m = QueryProviderInfoResponse{} } +func (m *QueryProviderInfoResponse) String() string { return proto.CompactTextString(m) } +func (*QueryProviderInfoResponse) ProtoMessage() {} +func (*QueryProviderInfoResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_f627751d3cc10225, []int{6} +} +func (m *QueryProviderInfoResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryProviderInfoResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryProviderInfoResponse.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 *QueryProviderInfoResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryProviderInfoResponse.Merge(m, src) +} +func (m *QueryProviderInfoResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryProviderInfoResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryProviderInfoResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryProviderInfoResponse proto.InternalMessageInfo + +func (m *QueryProviderInfoResponse) GetConsumer() ChainInfo { + if m != nil { + return m.Consumer + } + return ChainInfo{} +} + +func (m *QueryProviderInfoResponse) GetProvider() ChainInfo { + if m != nil { + return m.Provider + } + return ChainInfo{} +} + +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"` + ConnectionID string `protobuf:"bytes,3,opt,name=connectionID,proto3" json:"connectionID,omitempty"` + ChannelID string `protobuf:"bytes,4,opt,name=channelID,proto3" json:"channelID,omitempty"` +} + +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} +} +func (m *ChainInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ChainInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ChainInfo.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 *ChainInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_ChainInfo.Merge(m, src) +} +func (m *ChainInfo) XXX_Size() int { + return m.Size() +} +func (m *ChainInfo) XXX_DiscardUnknown() { + xxx_messageInfo_ChainInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_ChainInfo proto.InternalMessageInfo + +func (m *ChainInfo) GetChainID() string { + if m != nil { + return m.ChainID + } + return "" +} + +func (m *ChainInfo) GetClientID() string { + if m != nil { + return m.ClientID + } + return "" +} + +func (m *ChainInfo) GetConnectionID() string { + if m != nil { + return m.ConnectionID + } + return "" +} + +func (m *ChainInfo) GetChannelID() string { + if m != nil { + return m.ChannelID + } + return "" +} + func init() { proto.RegisterType((*NextFeeDistributionEstimate)(nil), "interchain_security.ccv.consumer.v1.NextFeeDistributionEstimate") proto.RegisterType((*QueryNextFeeDistributionEstimateRequest)(nil), "interchain_security.ccv.consumer.v1.QueryNextFeeDistributionEstimateRequest") proto.RegisterType((*QueryNextFeeDistributionEstimateResponse)(nil), "interchain_security.ccv.consumer.v1.QueryNextFeeDistributionEstimateResponse") proto.RegisterType((*QueryParamsRequest)(nil), "interchain_security.ccv.consumer.v1.QueryParamsRequest") 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((*ChainInfo)(nil), "interchain_security.ccv.consumer.v1.ChainInfo") } func init() { @@ -308,40 +467,49 @@ func init() { } var fileDescriptor_f627751d3cc10225 = []byte{ - // 521 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0xcf, 0x8b, 0xd3, 0x40, - 0x14, 0x6e, 0xfa, 0x4b, 0x9c, 0xc5, 0xcb, 0x58, 0x21, 0x54, 0x89, 0x4b, 0x15, 0xac, 0x4a, 0x33, - 0x6e, 0x7b, 0x58, 0x3d, 0x88, 0xb2, 0xea, 0xa2, 0xa0, 0xb2, 0x16, 0x41, 0xf0, 0xb2, 0x4e, 0xa7, - 0x6f, 0xd3, 0x81, 0x26, 0x93, 0x9d, 0x99, 0x84, 0xf6, 0x26, 0xfe, 0x01, 0x22, 0xf8, 0x9f, 0x78, - 0xf1, 0x5f, 0xd8, 0xe3, 0x82, 0x17, 0x4f, 0x22, 0xad, 0x7f, 0x84, 0x47, 0xc9, 0x24, 0x59, 0x53, - 0xd0, 0x6d, 0x04, 0x6f, 0xd3, 0xef, 0x7b, 0xef, 0x7b, 0xdf, 0x7c, 0xf3, 0x1a, 0x44, 0x78, 0xa0, - 0x41, 0xb2, 0x09, 0xe5, 0xc1, 0xbe, 0x02, 0x16, 0x49, 0xae, 0xe7, 0x84, 0xb1, 0x98, 0x30, 0x11, - 0xa8, 0xc8, 0x07, 0x49, 0xe2, 0x2d, 0x72, 0x18, 0x81, 0x9c, 0xbb, 0xa1, 0x14, 0x5a, 0xe0, 0x2b, - 0x7f, 0x68, 0x70, 0x19, 0x8b, 0xdd, 0xbc, 0xc1, 0x8d, 0xb7, 0xda, 0x2d, 0x4f, 0x78, 0xc2, 0xd4, - 0x93, 0xe4, 0x94, 0xb6, 0xb6, 0x2f, 0x79, 0x42, 0x78, 0x53, 0x20, 0x34, 0xe4, 0x84, 0x06, 0x81, - 0xd0, 0x54, 0x73, 0x11, 0xa8, 0x8c, 0xed, 0x97, 0x71, 0x72, 0x32, 0xc4, 0xf4, 0x74, 0xde, 0x57, - 0xd1, 0xc5, 0xe7, 0x30, 0xd3, 0xbb, 0x00, 0x0f, 0xb9, 0xd2, 0x92, 0x8f, 0xa2, 0x44, 0xf2, 0x91, - 0xd2, 0xdc, 0xa7, 0x1a, 0xf0, 0x55, 0x74, 0x8e, 0x45, 0x52, 0x42, 0xa0, 0x1f, 0x03, 0xf7, 0x26, - 0xda, 0xb6, 0x36, 0xad, 0x6e, 0x6d, 0xb8, 0x0a, 0x62, 0x07, 0xa1, 0x29, 0x55, 0x79, 0x49, 0xd5, - 0x94, 0x14, 0x90, 0x84, 0x0f, 0x60, 0x96, 0xf3, 0xb5, 0x94, 0xff, 0x8d, 0xe0, 0x01, 0xba, 0x30, - 0x2e, 0x4c, 0xdf, 0x3f, 0x90, 0x94, 0x25, 0x07, 0xbb, 0xbe, 0x69, 0x75, 0xcf, 0x0e, 0x5b, 0x45, - 0x72, 0x37, 0xe3, 0x70, 0x0b, 0x35, 0xb4, 0xd0, 0x74, 0x6a, 0x37, 0x4c, 0x51, 0xfa, 0x23, 0x19, - 0xa5, 0xc5, 0x9e, 0x14, 0x31, 0x1f, 0x83, 0xb4, 0x9b, 0x86, 0x2a, 0x20, 0x29, 0xff, 0x20, 0x0b, - 0xc1, 0x3e, 0x93, 0xf3, 0x39, 0xd2, 0xb9, 0x8e, 0xae, 0xbd, 0x48, 0x1e, 0xeb, 0x94, 0x50, 0x86, - 0x70, 0x18, 0x81, 0xd2, 0x9d, 0xb7, 0x16, 0xea, 0xae, 0xaf, 0x55, 0xa1, 0x08, 0x14, 0xe0, 0x97, - 0xa8, 0x3e, 0xa6, 0x9a, 0x9a, 0xfc, 0x36, 0xfa, 0xf7, 0xdd, 0x12, 0x4b, 0xe0, 0x9e, 0xa6, 0x6b, - 0xd4, 0x3a, 0x2d, 0x84, 0x8d, 0x83, 0x3d, 0x2a, 0xa9, 0xaf, 0x72, 0x63, 0x6f, 0xd0, 0xf9, 0x15, - 0x34, 0xb3, 0xf0, 0x04, 0x35, 0x43, 0x83, 0x64, 0x26, 0x6e, 0x96, 0x32, 0x91, 0x8a, 0xec, 0xd4, - 0x8f, 0xbe, 0x5d, 0xae, 0x0c, 0x33, 0x81, 0xfe, 0xe7, 0x1a, 0x6a, 0x98, 0x11, 0xf8, 0xa7, 0x85, - 0xec, 0xbf, 0x85, 0x80, 0x9f, 0x96, 0x9a, 0x50, 0x32, 0xef, 0xf6, 0xb3, 0xff, 0xa4, 0x96, 0xc6, - 0xd1, 0xb9, 0xf7, 0xee, 0xcb, 0x8f, 0x8f, 0xd5, 0x3b, 0x78, 0x7b, 0xfd, 0x3f, 0x38, 0x59, 0xd5, - 0xde, 0x01, 0x40, 0xaf, 0xb8, 0x88, 0xf8, 0x93, 0x85, 0x36, 0x0a, 0x39, 0xe3, 0xed, 0xf2, 0xfe, - 0x56, 0xde, 0xab, 0x7d, 0xfb, 0xdf, 0x1b, 0xb3, 0x3b, 0xdc, 0x32, 0x77, 0xb8, 0x81, 0xbb, 0xeb, - 0xef, 0x90, 0xbe, 0xdc, 0xce, 0xab, 0xa3, 0x85, 0x63, 0x1d, 0x2f, 0x1c, 0xeb, 0xfb, 0xc2, 0xb1, - 0x3e, 0x2c, 0x9d, 0xca, 0xf1, 0xd2, 0xa9, 0x7c, 0x5d, 0x3a, 0x95, 0xd7, 0x77, 0x3d, 0xae, 0x27, - 0xd1, 0xc8, 0x65, 0xc2, 0x27, 0x4c, 0x28, 0x5f, 0xa8, 0x82, 0x68, 0xef, 0x44, 0x34, 0x1e, 0x90, - 0xd9, 0xaa, 0xb2, 0x9e, 0x87, 0xa0, 0x46, 0x4d, 0xf3, 0x41, 0x19, 0xfc, 0x0a, 0x00, 0x00, 0xff, - 0xff, 0xcc, 0x57, 0x2e, 0xd6, 0x10, 0x05, 0x00, 0x00, + // 672 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0x41, 0x6b, 0x13, 0x4f, + 0x14, 0xcf, 0xa6, 0x4d, 0xdb, 0xbc, 0xfe, 0xff, 0x07, 0xc7, 0x08, 0xeb, 0x5a, 0xd6, 0xb2, 0x0a, + 0x46, 0x25, 0xbb, 0xb6, 0x3d, 0x54, 0x0f, 0x55, 0xb1, 0xb1, 0x18, 0x50, 0xa9, 0x8b, 0x20, 0x78, + 0xa9, 0xd3, 0xe9, 0x34, 0x19, 0x48, 0x66, 0xd2, 0x9d, 0xd9, 0xd0, 0xde, 0x44, 0xf1, 0x2a, 0x82, + 0xdf, 0xc4, 0x2f, 0xe0, 0xb5, 0xe0, 0xa5, 0xe0, 0xc5, 0x93, 0x48, 0xeb, 0x87, 0xf0, 0x28, 0x3b, + 0x3b, 0x9b, 0x6e, 0x68, 0x69, 0xb7, 0xea, 0x6d, 0xe7, 0xfd, 0xde, 0xfb, 0xbd, 0xdf, 0x7b, 0xf3, + 0xde, 0x2c, 0x04, 0x8c, 0x2b, 0x1a, 0x91, 0x0e, 0x66, 0x7c, 0x4d, 0x52, 0x12, 0x47, 0x4c, 0xed, + 0x04, 0x84, 0x0c, 0x02, 0x22, 0xb8, 0x8c, 0x7b, 0x34, 0x0a, 0x06, 0x73, 0xc1, 0x56, 0x4c, 0xa3, + 0x1d, 0xbf, 0x1f, 0x09, 0x25, 0xd0, 0x95, 0x63, 0x02, 0x7c, 0x42, 0x06, 0x7e, 0x16, 0xe0, 0x0f, + 0xe6, 0x9c, 0x5a, 0x5b, 0xb4, 0x85, 0xf6, 0x0f, 0x92, 0xaf, 0x34, 0xd4, 0x99, 0x69, 0x0b, 0xd1, + 0xee, 0xd2, 0x00, 0xf7, 0x59, 0x80, 0x39, 0x17, 0x0a, 0x2b, 0x26, 0xb8, 0x34, 0xe8, 0x7c, 0x11, + 0x25, 0xc3, 0x24, 0x3a, 0xc6, 0x7b, 0x5f, 0x86, 0x4b, 0x4f, 0xe9, 0xb6, 0x5a, 0xa1, 0xb4, 0xc9, + 0xa4, 0x8a, 0xd8, 0x7a, 0x9c, 0x50, 0x3e, 0x94, 0x8a, 0xf5, 0xb0, 0xa2, 0xe8, 0x2a, 0xfc, 0x4f, + 0xe2, 0x28, 0xa2, 0x5c, 0x3d, 0xa2, 0xac, 0xdd, 0x51, 0xb6, 0x35, 0x6b, 0xd5, 0xc7, 0xc2, 0x51, + 0x23, 0x72, 0x01, 0xba, 0x58, 0x66, 0x2e, 0x65, 0xed, 0x92, 0xb3, 0x24, 0x38, 0xa7, 0xdb, 0x19, + 0x3e, 0x96, 0xe2, 0x87, 0x16, 0xb4, 0x00, 0x17, 0x36, 0x72, 0xd9, 0xd7, 0x36, 0x23, 0x4c, 0x92, + 0x0f, 0x7b, 0x7c, 0xd6, 0xaa, 0x57, 0xc3, 0x5a, 0x1e, 0x5c, 0x31, 0x18, 0xaa, 0x41, 0x45, 0x09, + 0x85, 0xbb, 0x76, 0x45, 0x3b, 0xa5, 0x87, 0x24, 0x95, 0x12, 0xab, 0x91, 0x18, 0xb0, 0x0d, 0x1a, + 0xd9, 0x13, 0x1a, 0xca, 0x59, 0x52, 0x7c, 0xd9, 0x34, 0xc1, 0x9e, 0xcc, 0xf0, 0xcc, 0xe2, 0x5d, + 0x87, 0x6b, 0xcf, 0x92, 0xcb, 0x3a, 0xa1, 0x29, 0x21, 0xdd, 0x8a, 0xa9, 0x54, 0xde, 0x6b, 0x0b, + 0xea, 0xa7, 0xfb, 0xca, 0xbe, 0xe0, 0x92, 0xa2, 0xe7, 0x30, 0xbe, 0x81, 0x15, 0xd6, 0xfd, 0x9b, + 0x9e, 0xbf, 0xef, 0x17, 0x18, 0x02, 0xff, 0x24, 0x5e, 0xcd, 0xe6, 0xd5, 0x00, 0x69, 0x05, 0xab, + 0x38, 0xc2, 0x3d, 0x99, 0x09, 0x7b, 0x05, 0xe7, 0x47, 0xac, 0x46, 0x42, 0x0b, 0x26, 0xfa, 0xda, + 0x62, 0x44, 0xdc, 0x2c, 0x24, 0x22, 0x25, 0x79, 0x30, 0xbe, 0xfb, 0xfd, 0x72, 0x29, 0x34, 0x04, + 0x9e, 0x03, 0x76, 0x9a, 0xc1, 0xb4, 0xb5, 0xc5, 0x37, 0x45, 0x96, 0xfd, 0xb3, 0x05, 0x17, 0x8f, + 0x01, 0x8d, 0x88, 0x55, 0x98, 0xca, 0xd8, 0x8d, 0x0c, 0xbf, 0x90, 0x8c, 0xe5, 0x04, 0x4e, 0x98, + 0x8c, 0x92, 0x21, 0x4b, 0xc2, 0xd8, 0xcf, 0xee, 0xbb, 0xfc, 0x37, 0x8c, 0x19, 0x8b, 0xf7, 0xd6, + 0x82, 0xea, 0x10, 0x45, 0x36, 0x4c, 0x6a, 0xa6, 0x56, 0x53, 0x0b, 0xae, 0x86, 0xd9, 0x11, 0x39, + 0x30, 0x45, 0xba, 0x8c, 0x72, 0xd5, 0x6a, 0xea, 0xcc, 0xd5, 0x70, 0x78, 0x46, 0x1e, 0xfc, 0x47, + 0x04, 0xe7, 0x54, 0xcf, 0x6a, 0xab, 0xa9, 0x87, 0xbe, 0x1a, 0x8e, 0xd8, 0xd0, 0x0c, 0x54, 0x49, + 0x07, 0x73, 0x4e, 0xbb, 0xad, 0xa6, 0x19, 0xf5, 0x43, 0xc3, 0xfc, 0xbb, 0x0a, 0x54, 0x74, 0x1f, + 0xd1, 0x2f, 0xcb, 0xb4, 0xfb, 0x98, 0x81, 0x40, 0x8f, 0x0b, 0x15, 0x5b, 0x70, 0xa6, 0x9d, 0x27, + 0xff, 0x88, 0x2d, 0xbd, 0x6d, 0xef, 0xde, 0x9b, 0xaf, 0x3f, 0x3f, 0x96, 0xef, 0xa0, 0xc5, 0xd3, + 0x5f, 0xc9, 0xe4, 0x39, 0x68, 0x6c, 0x52, 0xda, 0xc8, 0x2f, 0x3b, 0xfa, 0x64, 0xc1, 0x74, 0x6e, + 0x96, 0xd1, 0x62, 0x71, 0x7d, 0x23, 0x3b, 0xe1, 0xdc, 0x3e, 0x7b, 0xa0, 0xa9, 0xe1, 0x96, 0xae, + 0xe1, 0x06, 0xaa, 0x9f, 0x5e, 0x43, 0xba, 0x1d, 0xe8, 0x8b, 0x05, 0xe7, 0x8e, 0x6c, 0x00, 0x5a, + 0x3a, 0x83, 0x82, 0xa3, 0x6b, 0xe5, 0xdc, 0xfd, 0xd3, 0x70, 0x53, 0xc6, 0xa2, 0x2e, 0x63, 0x0e, + 0x05, 0x05, 0xca, 0x30, 0xf1, 0x0d, 0x96, 0x6c, 0xc7, 0x8b, 0xdd, 0x7d, 0xd7, 0xda, 0xdb, 0x77, + 0xad, 0x1f, 0xfb, 0xae, 0xf5, 0xe1, 0xc0, 0x2d, 0xed, 0x1d, 0xb8, 0xa5, 0x6f, 0x07, 0x6e, 0xe9, + 0xe5, 0x52, 0x9b, 0xa9, 0x4e, 0xbc, 0xee, 0x13, 0xd1, 0x0b, 0x88, 0x90, 0x3d, 0x21, 0x73, 0xdc, + 0x8d, 0x21, 0xf7, 0x60, 0x21, 0xd8, 0x1e, 0x4d, 0xa0, 0x76, 0xfa, 0x54, 0xae, 0x4f, 0xe8, 0x5f, + 0xd0, 0xc2, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0x73, 0x9f, 0x0e, 0x42, 0x07, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -361,6 +529,7 @@ type QueryClient interface { QueryNextFeeDistribution(ctx context.Context, in *QueryNextFeeDistributionEstimateRequest, opts ...grpc.CallOption) (*QueryNextFeeDistributionEstimateResponse, error) // 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) } type queryClient struct { @@ -389,6 +558,15 @@ func (c *queryClient) QueryParams(ctx context.Context, in *QueryParamsRequest, o return out, nil } +func (c *queryClient) QueryProviderInfo(ctx context.Context, in *QueryProviderInfoRequest, opts ...grpc.CallOption) (*QueryProviderInfoResponse, error) { + out := new(QueryProviderInfoResponse) + err := c.cc.Invoke(ctx, "/interchain_security.ccv.consumer.v1.Query/QueryProviderInfo", 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 @@ -396,6 +574,7 @@ type QueryServer interface { QueryNextFeeDistribution(context.Context, *QueryNextFeeDistributionEstimateRequest) (*QueryNextFeeDistributionEstimateResponse, error) // QueryParams queries the ccv/consumer module parameters. QueryParams(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) + QueryProviderInfo(context.Context, *QueryProviderInfoRequest) (*QueryProviderInfoResponse, error) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. @@ -408,6 +587,9 @@ func (*UnimplementedQueryServer) QueryNextFeeDistribution(ctx context.Context, r func (*UnimplementedQueryServer) QueryParams(ctx context.Context, req *QueryParamsRequest) (*QueryParamsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method QueryParams not implemented") } +func (*UnimplementedQueryServer) QueryProviderInfo(ctx context.Context, req *QueryProviderInfoRequest) (*QueryProviderInfoResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method QueryProviderInfo not implemented") +} func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) @@ -449,6 +631,24 @@ func _Query_QueryParams_Handler(srv interface{}, ctx context.Context, dec func(i return interceptor(ctx, in, info, handler) } +func _Query_QueryProviderInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryProviderInfoRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).QueryProviderInfo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/interchain_security.ccv.consumer.v1.Query/QueryProviderInfo", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).QueryProviderInfo(ctx, req.(*QueryProviderInfoRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "interchain_security.ccv.consumer.v1.Query", HandlerType: (*QueryServer)(nil), @@ -461,6 +661,10 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "QueryParams", Handler: _Query_QueryParams_Handler, }, + { + MethodName: "QueryProviderInfo", + Handler: _Query_QueryProviderInfo_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "interchain_security/ccv/consumer/v1/query.proto", @@ -646,6 +850,123 @@ func (m *QueryParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *QueryProviderInfoRequest) 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 *QueryProviderInfoRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryProviderInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryProviderInfoResponse) 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 *QueryProviderInfoResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryProviderInfoResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Provider.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Consumer.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) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ChainInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ChainInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ChannelID) > 0 { + i -= len(m.ChannelID) + copy(dAtA[i:], m.ChannelID) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ChannelID))) + i-- + dAtA[i] = 0x22 + } + if len(m.ConnectionID) > 0 { + i -= len(m.ConnectionID) + copy(dAtA[i:], m.ConnectionID) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ConnectionID))) + i-- + dAtA[i] = 0x1a + } + if len(m.ClientID) > 0 { + i -= len(m.ClientID) + copy(dAtA[i:], m.ClientID) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ClientID))) + i-- + dAtA[i] = 0x12 + } + 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 encodeVarintQuery(dAtA []byte, offset int, v uint64) int { offset -= sovQuery(v) base := offset @@ -733,6 +1054,53 @@ func (m *QueryParamsResponse) Size() (n int) { return n } +func (m *QueryProviderInfoRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryProviderInfoResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Consumer.Size() + n += 1 + l + sovQuery(uint64(l)) + l = m.Provider.Size() + n += 1 + l + sovQuery(uint64(l)) + return n +} + +func (m *ChainInfo) 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)) + } + l = len(m.ClientID) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + l = len(m.ConnectionID) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + l = len(m.ChannelID) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + func sovQuery(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -1243,6 +1611,350 @@ func (m *QueryParamsResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *QueryProviderInfoRequest) 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: QueryProviderInfoRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryProviderInfoRequest: 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 *QueryProviderInfoResponse) 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: QueryProviderInfoResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryProviderInfoResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Consumer", 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.Consumer.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Provider", 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.Provider.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 + 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: ChainInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ChainInfo: 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 != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientID", 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.ClientID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionID", 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.ConnectionID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChannelID", 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.ChannelID = 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 skipQuery(dAtA []byte) (n int, err 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 2aaa7d4b49..1151ab0b60 100644 --- a/x/ccv/consumer/types/query.pb.gw.go +++ b/x/ccv/consumer/types/query.pb.gw.go @@ -69,6 +69,24 @@ func local_request_Query_QueryParams_0(ctx context.Context, marshaler runtime.Ma } +func request_Query_QueryProviderInfo_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryProviderInfoRequest + var metadata runtime.ServerMetadata + + msg, err := client.QueryProviderInfo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_QueryProviderInfo_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryProviderInfoRequest + var metadata runtime.ServerMetadata + + msg, err := server.QueryProviderInfo(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. @@ -121,6 +139,29 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + mux.Handle("GET", pattern_Query_QueryProviderInfo_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_QueryProviderInfo_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_QueryProviderInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -202,6 +243,26 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + mux.Handle("GET", pattern_Query_QueryProviderInfo_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_QueryProviderInfo_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_QueryProviderInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -209,10 +270,14 @@ var ( pattern_Query_QueryNextFeeDistribution_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"interchain_security", "ccv", "consumer", "next-fee-distribution"}, "", runtime.AssumeColonVerbOpt(false))) 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))) ) var ( forward_Query_QueryNextFeeDistribution_0 = runtime.ForwardResponseMessage forward_Query_QueryParams_0 = runtime.ForwardResponseMessage + + forward_Query_QueryProviderInfo_0 = runtime.ForwardResponseMessage ) diff --git a/x/ccv/types/expected_keepers.go b/x/ccv/types/expected_keepers.go index 2a82561cf0..2f203a47ea 100644 --- a/x/ccv/types/expected_keepers.go +++ b/x/ccv/types/expected_keepers.go @@ -82,6 +82,7 @@ type ChannelKeeper interface { ) (sequence uint64, err error) WriteAcknowledgement(ctx sdk.Context, chanCap *capabilitytypes.Capability, packet ibcexported.PacketI, acknowledgement ibcexported.Acknowledgement) error ChanCloseInit(ctx sdk.Context, portID, channelID string, chanCap *capabilitytypes.Capability) error + GetChannelConnection(ctx sdk.Context, portID, channelID string) (string, ibcexported.ConnectionI, error) } // PortKeeper defines the expected IBC port keeper From 3f4c54cd79c4e708f1c8d4b14ab4a84ff87432e1 Mon Sep 17 00:00:00 2001 From: bernd-m <43466467+bermuell@users.noreply.github.com> Date: Wed, 9 Aug 2023 11:43:12 +0200 Subject: [PATCH 103/108] test: Fix failing e2e test (#1186) * Tests: Fix failing e2e tests * Update tests/e2e/actions.go Co-authored-by: MSalopek * chore: appease lint rules * added check error message --------- Co-authored-by: MSalopek --- tests/e2e/actions.go | 12 +++++++++--- tests/e2e/steps_start_chains.go | 2 ++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/tests/e2e/actions.go b/tests/e2e/actions.go index 8faca43c0a..faad8cb6f8 100644 --- a/tests/e2e/actions.go +++ b/tests/e2e/actions.go @@ -1813,14 +1813,16 @@ type assignConsumerPubKeyAction struct { // reconfigureNode will change keys the node uses and restart reconfigureNode bool // executing the action should raise an error - expectError bool + expectError bool + expectedError string } func (tr TestRun) assignConsumerPubKey(action assignConsumerPubKeyAction, verbose bool) { valCfg := tr.validatorConfigs[action.validator] + // Note: to get error response reported back from this command '--gas auto' needs to be set. assignKey := fmt.Sprintf( - `%s tx provider assign-consensus-key %s '%s' --from validator%s --chain-id %s --home %s --node %s --gas 90000 --keyring-backend test -y -o json`, + `%s tx provider assign-consensus-key %s '%s' --from validator%s --chain-id %s --home %s --node %s --gas auto --keyring-backend test -y -o json`, tr.chainConfigs[chainID("provi")].binaryName, string(tr.chainConfigs[action.chain].chainId), action.consumerPubkey, @@ -1847,8 +1849,12 @@ func (tr TestRun) assignConsumerPubKey(action assignConsumerPubKeyAction, verbos } if action.expectError { + if err == nil || !strings.Contains(string(bz), action.expectedError) { + log.Fatalf("expected error not raised: expected: '%s', got '%s'", action.expectedError, (bz)) + } + if verbose { - fmt.Printf("got expected error during key assignment | err: %s \n", err.Error()) + fmt.Printf("got expected error during key assignment | err: %s | output: %s \n", err, string(bz)) } } diff --git a/tests/e2e/steps_start_chains.go b/tests/e2e/steps_start_chains.go index 15d0045760..6017a22641 100644 --- a/tests/e2e/steps_start_chains.go +++ b/tests/e2e/steps_start_chains.go @@ -88,6 +88,7 @@ func stepsStartConsumerChain(consumerName string, proposalIndex, chainIndex uint consumerPubkey: `{"@type":"/cosmos.crypto.ed25519.PubKey","key":"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is="}`, reconfigureNode: false, expectError: true, + expectedError: "a validator has assigned the consumer key already: consumer key is already in use by a validator", }, state: State{}, }, @@ -100,6 +101,7 @@ func stepsStartConsumerChain(consumerName string, proposalIndex, chainIndex uint consumerPubkey: `{"@type":"/cosmos.crypto.ed25519.PubKey","key":"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is="}`, reconfigureNode: false, expectError: true, + expectedError: "a validator has assigned the consumer key already: consumer key is already in use by a validator", }, state: State{ chainID(consumerName): ChainState{ From 4045b6a8fc9664c06156bdb4b98fb04aa8aa513f Mon Sep 17 00:00:00 2001 From: MSalopek Date: Wed, 9 Aug 2023 12:56:28 +0200 Subject: [PATCH 104/108] test: use cometmock in CI; run parallel jobs (#1181) * test: reduce number of happyPath steps * test: reduce number of happyPath steps * test: update steps after opt-out * test: update steps and fix lint * tests: add cometmock tests * chore: Fix and enable CometMock in e2e tests (#1184) * Add make time.sleep WaitTime and wait block after waiting time * Uncomment verbose error check * Fix spacing * Make format * Add make target for CometMock e2e tests * Add CometMock job to automated tests * tests: revert reducing happyPath steps count * tests: revert reducing happyPath steps count * Fix --gas auto with CometMock --------- Co-authored-by: Philip Offtermatt <57488781+p-offtermatt@users.noreply.github.com> Co-authored-by: Philip Offtermatt --- .github/workflows/automated-tests.yml | 26 ++++++++++++++++++++++++++ Makefile | 5 +++++ tests/e2e/actions.go | 15 ++++++++++++--- 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/.github/workflows/automated-tests.yml b/.github/workflows/automated-tests.yml index d48b8ef817..a9b594f53d 100644 --- a/.github/workflows/automated-tests.yml +++ b/.github/workflows/automated-tests.yml @@ -28,5 +28,31 @@ jobs: run: make proto-check - name: Unit, integration and difference tests run: go test ./... + E2E_Tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + lfs: true + - name: Checkout LFS objects + run: git lfs checkout + - name: Setup Go + uses: actions/setup-go@v4 + with: + go-version: "1.20" - name: E2E tests run: make test-e2e-short + Cometmock_Tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + lfs: true + - name: Checkout LFS objects + run: git lfs checkout + - name: Setup Go + uses: actions/setup-go@v4 + with: + go-version: "1.20" + - name: E2E tests + run: make test-e2e-short-cometmock diff --git a/Makefile b/Makefile index 28c02f7c85..7ab6a4fa24 100644 --- a/Makefile +++ b/Makefile @@ -33,6 +33,11 @@ test-diff: test-e2e-short: go run ./tests/e2e/... --happy-path-only +# run only happy path E2E tests with cometmock +# this set of traces does not test equivocation but it does check downtime +test-e2e-short-cometmock: + go run ./tests/e2e/... --short-happy-path --use-cometmock --use-gorelayer + # run full E2E tests in sequence (including multiconsumer) test-e2e-multi-consumer: go run ./tests/e2e/... --include-multi-consumer diff --git a/tests/e2e/actions.go b/tests/e2e/actions.go index faad8cb6f8..2cae615f70 100644 --- a/tests/e2e/actions.go +++ b/tests/e2e/actions.go @@ -538,7 +538,7 @@ func (tr *TestRun) voteGovProposal( wg.Wait() // wait for inclusion in a block -> '--broadcast-mode block' is deprecated tr.waitBlocks(action.chain, 1, 10*time.Second) - time.Sleep(time.Duration(tr.chainConfigs[action.chain].votingWaitTime) * time.Second) + tr.WaitTime(time.Duration(tr.chainConfigs[action.chain].votingWaitTime) * time.Second) } type startConsumerChainAction struct { @@ -1821,8 +1821,13 @@ func (tr TestRun) assignConsumerPubKey(action assignConsumerPubKeyAction, verbos valCfg := tr.validatorConfigs[action.validator] // Note: to get error response reported back from this command '--gas auto' needs to be set. + gas := "auto" + // Unfortunately, --gas auto does not work with CometMock. so when using CometMock, just use --gas 9000000 then + if tr.useCometmock { + gas = "9000000" + } assignKey := fmt.Sprintf( - `%s tx provider assign-consensus-key %s '%s' --from validator%s --chain-id %s --home %s --node %s --gas auto --keyring-backend test -y -o json`, + `%s tx provider assign-consensus-key %s '%s' --from validator%s --chain-id %s --home %s --node %s --gas %s --keyring-backend test -y -o json`, tr.chainConfigs[chainID("provi")].binaryName, string(tr.chainConfigs[action.chain].chainId), action.consumerPubkey, @@ -1830,6 +1835,7 @@ func (tr TestRun) assignConsumerPubKey(action assignConsumerPubKeyAction, verbos tr.chainConfigs[chainID("provi")].chainId, tr.getValidatorHome(chainID("provi"), action.validator), tr.getValidatorNode(chainID("provi"), action.validator), + gas, ) //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. @@ -1848,7 +1854,7 @@ func (tr TestRun) assignConsumerPubKey(action assignConsumerPubKeyAction, verbos log.Fatalf("unexpected error during key assignment - output: %s, err: %s", string(bz), err) } - if action.expectError { + if action.expectError && !tr.useCometmock { // error report ony works with --gas auto, which does not work with CometMock, so ignore if err == nil || !strings.Contains(string(bz), action.expectedError) { log.Fatalf("expected error not raised: expected: '%s', got '%s'", action.expectedError, (bz)) } @@ -1972,6 +1978,8 @@ func (tr TestRun) GetPathNameForGorelayer(chainA, chainB chainID) string { } // WaitTime waits for the given duration. +// To make sure that the new timestamp is visible on-chain, it also waits until at least one block has been +// produced on each chain after waiting. // The CometMock version of this takes a pointer to the TestRun as it needs to manipulate // information in the testrun that stores how much each chain has waited, to keep times in sync. // Be careful that all functions calling WaitTime should therefore also take a pointer to the TestRun. @@ -1985,6 +1993,7 @@ func (tr *TestRun) WaitTime(duration time.Duration) { continue } tr.AdvanceTimeForChain(chain, duration) + tr.waitBlocks(chain, 1, 2*time.Second) } } } From 5cb2ffaec2771b2a52f7916c05c6014a42accdcd Mon Sep 17 00:00:00 2001 From: Philip Offtermatt <57488781+p-offtermatt@users.noreply.github.com> Date: Thu, 10 Aug 2023 12:23:11 +0200 Subject: [PATCH 105/108] chore: Add integration for equivocation with CometMock (#1192) Add support for equivocation --- Makefile | 2 +- tests/e2e/actions.go | 58 +++++++++++++++++++++++++++++--------------- tests/e2e/main.go | 11 ++++----- tests/e2e/steps.go | 4 ++- 4 files changed, 47 insertions(+), 28 deletions(-) diff --git a/Makefile b/Makefile index 7ab6a4fa24..edbacbc0e0 100644 --- a/Makefile +++ b/Makefile @@ -36,7 +36,7 @@ test-e2e-short: # run only happy path E2E tests with cometmock # this set of traces does not test equivocation but it does check downtime test-e2e-short-cometmock: - go run ./tests/e2e/... --short-happy-path --use-cometmock --use-gorelayer + go run ./tests/e2e/... --cometmock-happy-path --use-cometmock --use-gorelayer # run full E2E tests in sequence (including multiconsumer) test-e2e-multi-consumer: diff --git a/tests/e2e/actions.go b/tests/e2e/actions.go index 2cae615f70..e5ac465aa0 100644 --- a/tests/e2e/actions.go +++ b/tests/e2e/actions.go @@ -1604,18 +1604,7 @@ func (tr TestRun) setValidatorDowntime(chain chainID, validator validatorID, dow if tr.useCometmock { // send set_signing_status either to down or up for validator - var validatorAddress string - if chain == chainID("provi") { - validatorAddress = tr.getValidatorKeyAddressFromString(tr.validatorConfigs[validator].privValidatorKey) - } else { - var valAddressString string - if tr.validatorConfigs[validator].useConsumerKey { - valAddressString = tr.validatorConfigs[validator].consumerPrivValidatorKey - } else { - valAddressString = tr.validatorConfigs[validator].privValidatorKey - } - validatorAddress = tr.getValidatorKeyAddressFromString(valAddressString) - } + validatorAddress := tr.GetValidatorAddress(chain, validator) method := "set_signing_status" params := fmt.Sprintf(`{"private_key_address":"%s","status":"%s"}`, validatorAddress, lastArg) @@ -1648,6 +1637,22 @@ func (tr TestRun) setValidatorDowntime(chain chainID, validator validatorID, dow } } +func (tr TestRun) GetValidatorAddress(chain chainID, validator validatorID) string { + var validatorAddress string + if chain == chainID("provi") { + validatorAddress = tr.getValidatorKeyAddressFromString(tr.validatorConfigs[validator].privValidatorKey) + } else { + var valAddressString string + if tr.validatorConfigs[validator].useConsumerKey { + valAddressString = tr.validatorConfigs[validator].consumerPrivValidatorKey + } else { + valAddressString = tr.validatorConfigs[validator].privValidatorKey + } + validatorAddress = tr.getValidatorKeyAddressFromString(valAddressString) + } + return validatorAddress +} + type unjailValidatorAction struct { provider chainID validator validatorID @@ -1795,15 +1800,28 @@ func (tr TestRun) invokeDoublesignSlash( action doublesignSlashAction, verbose bool, ) { - chainConfig := tr.chainConfigs[action.chain] - //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. - bz, err := exec.Command("docker", "exec", tr.containerConfig.instanceName, "/bin/bash", - "/testnet-scripts/cause-doublesign.sh", chainConfig.binaryName, string(action.validator), - string(chainConfig.chainId), chainConfig.ipPrefix).CombinedOutput() - if err != nil { - log.Fatal(err, "\n", string(bz)) + if !tr.useCometmock { + chainConfig := tr.chainConfigs[action.chain] + //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. + bz, err := exec.Command("docker", "exec", tr.containerConfig.instanceName, "/bin/bash", + "/testnet-scripts/cause-doublesign.sh", chainConfig.binaryName, string(action.validator), + string(chainConfig.chainId), chainConfig.ipPrefix).CombinedOutput() + if err != nil { + log.Fatal(err, "\n", string(bz)) + } + tr.waitBlocks("provi", 10, 2*time.Minute) + } else { // tr.useCometMock + validatorAddress := tr.GetValidatorAddress(action.chain, action.validator) + + method := "cause_double_sign" + params := fmt.Sprintf(`{"private_key_address":"%s"}`, validatorAddress) + + address := tr.getQueryNodeRPCAddress(action.chain) + + tr.curlJsonRPCRequest(method, params, address) + tr.waitBlocks(action.chain, 1, 10*time.Second) + return } - tr.waitBlocks("provi", 10, 2*time.Minute) } type assignConsumerPubKeyAction struct { diff --git a/tests/e2e/main.go b/tests/e2e/main.go index 9943d6f9bd..58bb065c26 100644 --- a/tests/e2e/main.go +++ b/tests/e2e/main.go @@ -16,12 +16,11 @@ import ( ) var ( - verbose = flag.Bool("verbose", false, "turn verbose logging on/off") - happyPathOnly = flag.Bool("happy-path-only", false, "run happy path tests only") - shortHappyPathOnly = flag.Bool("short-happy-path", false, `run abridged happy path tests only. + verbose = flag.Bool("verbose", false, "turn verbose logging on/off") + happyPathOnly = flag.Bool("happy-path-only", false, "run happy path tests only") + cometmockCompatibleHappyPath = flag.Bool("cometmock-happy-path", false, `run cometmock compatible happy path tests only. This is like the happy path, but skips steps that involve starting or stopping nodes for the same chain outside of the chain setup or teardown. -In particular, this skips steps related to downtime and double signing. This is suited for CometMock+Gorelayer testing`) includeMultiConsumer = flag.Bool("include-multi-consumer", false, "include multiconsumer tests in run") parallel = flag.Bool("parallel", false, "run all tests in parallel") @@ -42,10 +41,10 @@ var ( func main() { flag.Parse() - if shortHappyPathOnly != nil && *shortHappyPathOnly { + if cometmockCompatibleHappyPath != nil && *cometmockCompatibleHappyPath { fmt.Println("=============== running short happy path only ===============") tr := DefaultTestRun() - tr.Run(shortHappyPathSteps, *localSdkPath, *useGaia, *gaiaTag) + tr.Run(cometmockCompatibleHappyPathSteps, *localSdkPath, *useGaia, *gaiaTag) return } diff --git a/tests/e2e/steps.go b/tests/e2e/steps.go index aa08426103..770ac45dda 100644 --- a/tests/e2e/steps.go +++ b/tests/e2e/steps.go @@ -31,12 +31,14 @@ var happyPathSteps = concatSteps( stepsStopChain("consu", 4), // stop chain ) -var shortHappyPathSteps = concatSteps( +var cometmockCompatibleHappyPathSteps = concatSteps( stepsStartChains([]string{"consu"}, false), stepsDelegate("consu"), stepsUnbond("consu"), stepsRedelegateShort("consu"), stepsDowntime("consu"), + stepsRejectEquivocationProposal("consu", 2), // prop to tombstone bob is rejected + stepsDoubleSignOnProviderAndConsumer("consu"), // carol double signs on provider, bob double signs on consumer stepsStartRelayer(), stepsConsumerRemovalPropNotPassing("consu", 2), // submit removal prop but vote no on it - chain should stay stepsStopChain("consu", 3), // stop chain From fbbac82181dc43d76193aab694dd595079117cbb Mon Sep 17 00:00:00 2001 From: Shawn <44221603+smarshall-spitzbart@users.noreply.github.com> Date: Thu, 10 Aug 2023 09:08:17 -0700 Subject: [PATCH 106/108] feat!: throttle with retries, consumer changes (#1024) * wip * wip * bouncing slash constructor and nits * UT * define cross chain ack enum * wip * tests * tests * update genesis tests * comments * migration and changelog * migration test * lints * merge fixes * clean * Update ccv.pb.go * add to ADR * address some PR comments * rebuild protos * v3s * lint * regen pbs * refactor for simplicity * comment * changes with slash record type * wip * Update ccv.pb.go * Update ccv.pb.go * update SendPackets and test * test packet sending permitted * test for OnAckPacket * note on FSM design * CRUD UT * packet sending permitted UT * nits * Update throttle_retry.go * v1 result and change tests * Update relay.go * expectation func * reg test * Update CHANGELOG.md * lints * doc on upgrade order * small updates * vsc matured handled res * handle vsc matured acks * adjust TestSendPacketsDeletion * Update relay_test.go * fix integration test * fix send slash packet deletion test * fix TestConsumerPacketSendExpiredClient * lint * fix more tests * final test fixes * disable diff tests * smalls * Update steps_downtime.go * Update slashing.go * Update CHANGELOG.md * Update x/ccv/consumer/keeper/throttle_retry.go Co-authored-by: Marius Poke * Update throttle_retry.go * Update x/ccv/consumer/keeper/throttle_retry.go Co-authored-by: Marius Poke * docstrings * comment * DeleteHeadOfPendingPackets unit tests * fix dup deletion * better comment * const * rm todo and unneeded call * linting is very important * break instead of return * return instead of just print * fix test * fix slashing test * comment * camel case * FSM event explanation --------- Co-authored-by: Marius Poke --- CHANGELOG.md | 1 + docs/docs/adrs/adr-008-throttle-retries.md | 9 +- .../ccv/consumer/v1/consumer.proto | 8 + tests/difference/core/driver/core_test.go | 10 +- tests/e2e/steps_downtime.go | 43 ++- tests/integration/expired_client.go | 24 +- tests/integration/slashing.go | 72 +++- tests/integration/throttle_retry.go | 150 +++++++++ testutil/integration/debug_test.go | 8 + x/ccv/consumer/keeper/keeper.go | 11 + x/ccv/consumer/keeper/keeper_test.go | 27 ++ x/ccv/consumer/keeper/relay.go | 49 ++- x/ccv/consumer/keeper/relay_test.go | 225 +++++++++++-- x/ccv/consumer/keeper/throttle_retry.go | 112 ++++++ x/ccv/consumer/keeper/throttle_retry_test.go | 91 +++++ x/ccv/consumer/types/consumer.pb.go | 318 +++++++++++++++--- x/ccv/consumer/types/keys.go | 8 + x/ccv/consumer/types/keys_test.go | 2 + x/ccv/consumer/types/throttle_retry.go | 11 + x/ccv/provider/keeper/relay.go | 6 +- x/ccv/types/ccv.go | 14 + 21 files changed, 1077 insertions(+), 122 deletions(-) create mode 100644 tests/integration/throttle_retry.go create mode 100644 x/ccv/consumer/keeper/throttle_retry.go create mode 100644 x/ccv/consumer/keeper/throttle_retry_test.go create mode 100644 x/ccv/consumer/types/throttle_retry.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 5003260943..f5c4d215d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ Add an entry to the unreleased section whenever merging a PR to main that is not targeted at a specific release. These entries will eventually be included in a release. * `[x/ccv/provider]` (fix) [#1076](https://github.com/cosmos/interchain-security/pull/1076) Add `InitTimeoutTimestamps` and `ExportedVscSendTimestamps` to exported genesis. +* (feat!) [#1024](https://github.com/cosmos/interchain-security/pull/1024) throttle with retries, consumer changes * (fix!) revert consumer packet data changes from #1037 [#1150](https://github.com/cosmos/interchain-security/pull/1150) * (fix!) proper deletion of pending packets [#1146](https://github.com/cosmos/interchain-security/pull/1146) * (feat!) optimize pending packets storage on consumer, with migration! [#1037](https://github.com/cosmos/interchain-security/pull/1037) diff --git a/docs/docs/adrs/adr-008-throttle-retries.md b/docs/docs/adrs/adr-008-throttle-retries.md index 134214fffb..1faf7bd7ee 100644 --- a/docs/docs/adrs/adr-008-throttle-retries.md +++ b/docs/docs/adrs/adr-008-throttle-retries.md @@ -9,6 +9,7 @@ title: Throttle with retries * 6/9/23: Initial draft * 6/22/23: added note on consumer pending packets storage optimization +* 7/14/23: Added note on upgrade order ## Status @@ -47,6 +48,8 @@ With the behavior described, we maintain very similar behavior to the current th In the normal case, when no or a few slash packets are being sent, the VSCMaturedPackets will not be delayed, and hence unbonding will not be delayed. +For implementation of this design, see [throttle_retry.go](../../../x/ccv/consumer/keeper/throttle_retry.go). + ### Consumer pending packets storage optimization In addition to the mentioned consumer changes above. An optimization will need to be made to the consumer's pending packets storage to properly implement the feature from this ADR. @@ -86,9 +89,11 @@ If a consumer sends VSCMatured packets too leniently: The consumer is malicious If a consumer blocks the sending of VSCMatured packets: The consumer is malicious and blocking vsc matured packets that should have been sent. This will block unbonding only up until the VSC timeout period has elapsed. At that time, the consumer is removed. Again the malicious behavior only creates a negative outcome for the chain that is being malicious. -### Splitting of PRs +### Splitting of PRs and Upgrade Order + +This feature will implement consumer changes in [#1024](https://github.com/cosmos/interchain-security/pull/1024). Note these changes should be deployed to prod for all consumers before the provider changes are deployed to prod. That is the consumer changes in #1024 are compatible with the current ("v1") provider implementation of throttling that's running on the Cosmos Hub as of July 2023. -We could split this feature into two PRs, one affecting the consumer and one affecting the provider, along with a third PR which could setup a clever way to upgrade the provider in multiple steps, ensuring that queued slash packets at upgrade time are handled properly. +Once all consumers have deployed the changes in #1024, the provider changes from (TBD) can be deployed to prod, fully enabling v2 throttling. ## Consequences diff --git a/proto/interchain_security/ccv/consumer/v1/consumer.proto b/proto/interchain_security/ccv/consumer/v1/consumer.proto index 97ba14f6da..2b4b6f88c3 100644 --- a/proto/interchain_security/ccv/consumer/v1/consumer.proto +++ b/proto/interchain_security/ccv/consumer/v1/consumer.proto @@ -89,3 +89,11 @@ message MaturingVSCPacket { google.protobuf.Timestamp maturity_time = 2 [ (gogoproto.stdtime) = true, (gogoproto.nullable) = false ]; } + +// A record storing the state of a slash packet sent to the provider chain +// which may bounce back and forth until handled by the provider. +message SlashRecord { + bool waiting_on_reply = 1; + google.protobuf.Timestamp send_time = 2 + [ (gogoproto.stdtime) = true, (gogoproto.nullable) = false ]; +} \ No newline at end of file diff --git a/tests/difference/core/driver/core_test.go b/tests/difference/core/driver/core_test.go index 12192eb8e4..ec97fbf9c1 100644 --- a/tests/difference/core/driver/core_test.go +++ b/tests/difference/core/driver/core_test.go @@ -2,7 +2,6 @@ package core import ( "fmt" - "testing" "time" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" @@ -331,9 +330,12 @@ func (s *CoreSuite) TestTraces() { fmt.Println("Shortest [traceIx, actionIx]:", shortest, shortestLen) } -func TestCoreSuite(t *testing.T) { - suite.Run(t, new(CoreSuite)) -} +// TODO: diff tests will eventually be replaced by quint tests, and all this code could then be deleted. +// Until that decision is finalized, we'll just comment out the top-level test. + +// func TestCoreSuite(t *testing.T) { +// suite.Run(t, new(CoreSuite)) +// } // SetupTest sets up the test suite in a 'zero' state which matches // the initial state in the model. diff --git a/tests/e2e/steps_downtime.go b/tests/e2e/steps_downtime.go index 74cb349000..e6d320bec1 100644 --- a/tests/e2e/steps_downtime.go +++ b/tests/e2e/steps_downtime.go @@ -278,7 +278,7 @@ func stepsThrottledDowntime(consumerName string) []Step { validator: validatorID("bob"), }, state: State{ - // powers not affected on either chain yet + // slash packet queued on consumer, but powers not affected on either chain yet chainID("provi"): ChainState{ ValPowers: &map[validatorID]uint{ validatorID("alice"): 511, @@ -295,6 +295,39 @@ func stepsThrottledDowntime(consumerName string) []Step { }, }, }, + // Relay packets so bob is jailed on provider, + // and consumer receives ack that provider recv the downtime slash. + // The latter is necessary for the consumer to send the second downtime slash. + { + action: relayPacketsAction{ + chainA: chainID("provi"), + chainB: chainID(consumerName), + port: "provider", + channel: 0, + }, + state: State{ + chainID("provi"): ChainState{ + ValPowers: &map[validatorID]uint{ + validatorID("alice"): 511, + 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 + ValPowers: &map[validatorID]uint{ + validatorID("alice"): 511, + validatorID("bob"): 500, + validatorID("carol"): 500, + }, + }, + }, + }, { action: downtimeSlashAction{ chain: chainID(consumerName), @@ -305,11 +338,12 @@ func stepsThrottledDowntime(consumerName string) []Step { chainID("provi"): ChainState{ ValPowers: &map[validatorID]uint{ validatorID("alice"): 511, - validatorID("bob"): 500, + validatorID("bob"): 0, validatorID("carol"): 500, }, }, chainID(consumerName): ChainState{ + // VSC packet applying jailing is not yet relayed to consumer ValPowers: &map[validatorID]uint{ validatorID("alice"): 511, validatorID("bob"): 500, @@ -338,10 +372,9 @@ func stepsThrottledDowntime(consumerName string) []Step { }, }, chainID(consumerName): ChainState{ - // no updates received on consumer ValPowers: &map[validatorID]uint{ validatorID("alice"): 511, - validatorID("bob"): 500, + validatorID("bob"): 0, validatorID("carol"): 500, }, }, @@ -373,7 +406,7 @@ func stepsThrottledDowntime(consumerName string) []Step { // no updates received on consumer ValPowers: &map[validatorID]uint{ validatorID("alice"): 511, - validatorID("bob"): 500, + validatorID("bob"): 0, validatorID("carol"): 500, }, }, diff --git a/tests/integration/expired_client.go b/tests/integration/expired_client.go index 53863d2881..2a8babacfa 100644 --- a/tests/integration/expired_client.go +++ b/tests/integration/expired_client.go @@ -139,20 +139,34 @@ func (s *CCVTestSuite) TestConsumerPacketSendExpiredClient() { // check that the packets were added to the list of pending data packets consumerPackets = consumerKeeper.GetPendingPackets(s.consumerCtx()) s.Require().NotEmpty(consumerPackets) + // At this point we expect 4 packets, two vsc matured packets and two trailing slash packets s.Require().Len(consumerPackets, 4, "unexpected number of pending data packets") // upgrade expired client to the consumer upgradeExpiredClient(s, Provider) - // go to next block to trigger SendPendingDataPackets + // go to next block to trigger SendPendingPackets s.consumerChain.NextBlock() - // check that the list of pending data packets is emptied + // Check that the leading vsc matured packets were sent and no longer pending consumerPackets = consumerKeeper.GetPendingPackets(s.consumerCtx()) - s.Require().Empty(consumerPackets) + s.Require().Len(consumerPackets, 2, "unexpected number of pending data packets") + + // relay committed packets from consumer to provider, first slash packet should be committed + relayAllCommittedPackets(s, s.consumerChain, s.path, ccv.ConsumerPortID, s.path.EndpointA.ChannelID, 3) // two vsc matured + one slash + + // First slash has been acked, now only the second slash packet should remain as pending + consumerPackets = consumerKeeper.GetPendingPackets(s.consumerCtx()) + s.Require().Len(consumerPackets, 1, "unexpected number of pending data packets") - // relay all packet from consumer to provider - relayAllCommittedPackets(s, s.consumerChain, s.path, ccv.ConsumerPortID, s.path.EndpointA.ChannelID, 4) + // go to next block to trigger SendPendingPackets + s.consumerChain.NextBlock() + + // relay committed packets from consumer to provider, only second slash packet should be committed + relayAllCommittedPackets(s, s.consumerChain, s.path, ccv.ConsumerPortID, s.path.EndpointA.ChannelID, 1) // one slash + + consumerPackets = consumerKeeper.GetPendingPackets(s.consumerCtx()) + s.Require().Empty(consumerPackets, "pending data packets found") // check that everything works // - bond more tokens on provider to change validator powers diff --git a/tests/integration/slashing.go b/tests/integration/slashing.go index 2bc960fd03..1ce7d11db8 100644 --- a/tests/integration/slashing.go +++ b/tests/integration/slashing.go @@ -247,14 +247,34 @@ func (s *CCVTestSuite) TestSlashPacketAcknowledgement() { s.SetupCCVChannel(s.path) s.SetupTransferChannel() - packet := channeltypes.NewPacket([]byte{}, 1, ccv.ConsumerPortID, s.path.EndpointA.ChannelID, + // Mock a proper slash packet from consumer + spd := keepertestutil.GetNewSlashPacketData() + + // We don't want truly randomized fields, infraction needs to be specified + if spd.Infraction == stakingtypes.Infraction_INFRACTION_UNSPECIFIED { + spd.Infraction = stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN + } + cpd := ccv.NewConsumerPacketData(ccv.SlashPacket, + &ccv.ConsumerPacketData_SlashPacketData{ + SlashPacketData: &spd, + }, + ) + packet := channeltypes.NewPacket(cpd.GetBytes(), // Consumer always sends v1 packet data + 1, ccv.ConsumerPortID, s.path.EndpointA.ChannelID, ccv.ProviderPortID, s.path.EndpointB.ChannelID, clienttypes.Height{}, 0) - ack := providerKeeper.OnRecvSlashPacket(s.providerCtx(), packet, - keepertestutil.GetNewSlashPacketData()) - s.Require().NotNil(ack) + // Map infraction height on provider so validation passes and provider returns valid ack result + providerKeeper.SetValsetUpdateBlockHeight(s.providerCtx(), spd.ValsetUpdateId, 47923) + + exportedAck := providerKeeper.OnRecvSlashPacket(s.providerCtx(), packet, spd) + s.Require().NotNil(exportedAck) - err := consumerKeeper.OnAcknowledgementPacket(s.consumerCtx(), packet, channeltypes.NewResultAcknowledgement(ack.Acknowledgement())) + // Unmarshal ack to struct that's compatible with consumer. IBC does this automatically + ack := channeltypes.Acknowledgement{} + err := channeltypes.SubModuleCdc.UnmarshalJSON(exportedAck.Acknowledgement(), &ack) + s.Require().NoError(err) + + err = consumerKeeper.OnAcknowledgementPacket(s.consumerCtx(), packet, ack) s.Require().NoError(err) err = consumerKeeper.OnAcknowledgementPacket(s.consumerCtx(), packet, ccv.NewErrorAcknowledgementWithLog(s.consumerCtx(), fmt.Errorf("another error"))) @@ -492,9 +512,15 @@ func (suite *CCVTestSuite) TestValidatorDowntime() { // clear queue, commit packets suite.consumerApp.GetConsumerKeeper().SendPackets(ctx) - // check queue was cleared + // Check slash record is created + slashRecord, found := suite.consumerApp.GetConsumerKeeper().GetSlashRecord(suite.consumerCtx()) + suite.Require().True(found, "slash record not found") + suite.Require().True(slashRecord.WaitingOnReply) + suite.Require().Equal(slashRecord.SendTime, suite.consumerCtx().BlockTime()) + + // check queue is not cleared, since no ack has been received from provider pendingPackets = suite.consumerApp.GetConsumerKeeper().GetPendingPackets(ctx) - suite.Require().Empty(pendingPackets, "pending packets NOT empty") + suite.Require().Len(pendingPackets, 1, "pending packets len should be 1 is %d", len(pendingPackets)) // verify that the slash packet was sent gotCommit := consumerIBCKeeper.ChannelKeeper.GetPacketCommitment(ctx, ccv.ConsumerPortID, channelID, seq) @@ -579,9 +605,15 @@ func (suite *CCVTestSuite) TestValidatorDoubleSigning() { // clear queue, commit packets suite.consumerApp.GetConsumerKeeper().SendPackets(ctx) - // check queue was cleared + // Check slash record is created + slashRecord, found := suite.consumerApp.GetConsumerKeeper().GetSlashRecord(suite.consumerCtx()) + suite.Require().True(found, "slash record not found") + suite.Require().True(slashRecord.WaitingOnReply) + suite.Require().Equal(slashRecord.SendTime, suite.consumerCtx().BlockTime()) + + // check queue is not cleared, since no ack has been received from provider pendingPackets = suite.consumerApp.GetConsumerKeeper().GetPendingPackets(ctx) - suite.Require().Empty(pendingPackets, "pending packets NOT empty") + suite.Require().Len(pendingPackets, 1, "pending packets len should be 1 is %d", len(pendingPackets)) // check slash packet is sent gotCommit := suite.consumerApp.GetIBCKeeper().ChannelKeeper.GetPacketCommitment(ctx, ccv.ConsumerPortID, channelID, seq) @@ -644,10 +676,12 @@ func (suite *CCVTestSuite) TestQueueAndSendSlashPacket() { // establish ccv channel by sending an empty VSC packet to consumer endpoint suite.SendEmptyVSCPacket() - // check that each pending data packet is sent once + // check that each pending data packet is sent once, as long as the prev slash packet was relayed/acked. + // Note that consumer throttling blocks packet sending until a slash packet is successfully acked by the provider. for i := 0; i < 12; i++ { commit := consumerIBCKeeper.ChannelKeeper.GetPacketCommitment(ctx, ccv.ConsumerPortID, channelID, seq+uint64(i)) suite.Require().NotNil(commit) + relayAllCommittedPackets(suite, suite.consumerChain, suite.path, ccv.ConsumerPortID, channelID, 1) } // check that outstanding downtime flags @@ -657,8 +691,8 @@ func (suite *CCVTestSuite) TestQueueAndSendSlashPacket() { suite.Require().True(consumerKeeper.OutstandingDowntime(ctx, consAddr)) } - // send all pending packets - only slash packets should be queued in this test - consumerKeeper.SendPackets(ctx) + // SendPackets method should have already been called during + // endblockers in relayAllCommittedPackets above // check that pending data packets got cleared dataPackets = consumerKeeper.GetPendingPackets(ctx) @@ -676,6 +710,10 @@ func (suite *CCVTestSuite) TestCISBeforeCCVEstablished() { pendingPackets := consumerKeeper.GetPendingPackets(suite.consumerCtx()) suite.Require().Len(pendingPackets, 0) + // No slash record found (no slash sent) + _, found := consumerKeeper.GetSlashRecord(suite.consumerCtx()) + suite.Require().False(found) + consumerKeeper.SlashWithInfractionReason(suite.consumerCtx(), []byte{0x01, 0x02, 0x3}, 66, 4324, sdk.MustNewDecFromStr("0.05"), stakingtypes.Infraction_INFRACTION_DOWNTIME) @@ -683,6 +721,10 @@ func (suite *CCVTestSuite) TestCISBeforeCCVEstablished() { pendingPackets = consumerKeeper.GetPendingPackets(suite.consumerCtx()) suite.Require().Len(pendingPackets, 1) + // but slash packet is not yet sent + _, found = consumerKeeper.GetSlashRecord(suite.consumerCtx()) + suite.Require().False(found) + // Pass 5 blocks, confirming the consumer doesn't panic for i := 0; i < 5; i++ { suite.consumerChain.NextBlock() @@ -698,6 +740,8 @@ func (suite *CCVTestSuite) TestCISBeforeCCVEstablished() { // Pass one more block, and confirm the packet is sent now that ccv channel is established suite.consumerChain.NextBlock() - pendingPackets = consumerKeeper.GetPendingPackets(suite.consumerCtx()) - suite.Require().Len(pendingPackets, 0) + + // Slash record should now be found (slash sent) + _, found = consumerKeeper.GetSlashRecord(suite.consumerCtx()) + suite.Require().True(found) } diff --git a/tests/integration/throttle_retry.go b/tests/integration/throttle_retry.go new file mode 100644 index 0000000000..ae15aac977 --- /dev/null +++ b/tests/integration/throttle_retry.go @@ -0,0 +1,150 @@ +package integration + +import ( + 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. +func (s *CCVTestSuite) TestSlashRetries() { + s.SetupAllCCVChannels() + 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 + providerStakingKeeper := s.providerApp.GetTestStakingKeeper() + vals := providerStakingKeeper.GetAllValidators(s.providerCtx()) + for _, val := range vals { + s.Require().False(val.IsJailed()) + } + // Setup signing info for jailings + s.setDefaultValSigningInfo(*s.providerChain.Vals.Validators[1]) + + // + // Consumer setup + // + consumerKeeper := s.consumerApp.GetConsumerKeeper() + // Assert no slash record exists + _, found := consumerKeeper.GetSlashRecord(s.consumerCtx()) + s.Require().False(found) + + // + // Test section: See FSM explanation in throttle_retry.go + // + + // Construct a mock slash packet from consumer + tmval1 := s.providerChain.Vals.Validators[1] + packet1 := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval1, stakingtypes.Infraction_INFRACTION_DOWNTIME, 1) + + // Mock the sending of the packet on consumer + consumerKeeper.AppendPendingPacket(s.consumerCtx(), ccvtypes.SlashPacket, + &ccvtypes.ConsumerPacketData_SlashPacketData{ + SlashPacketData: &ccvtypes.SlashPacketData{}, + }, + ) + consumerKeeper.UpdateSlashRecordOnSend(s.consumerCtx()) + slashRecord, found := consumerKeeper.GetSlashRecord(s.consumerCtx()) + s.Require().True(found) + s.Require().True(slashRecord.WaitingOnReply) + 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()) + + // 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()) + 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)) + + // 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) + s.Require().NoError(err) + + // 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())) + + // 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] + packet2 := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval2, stakingtypes.Infraction_INFRACTION_DOWNTIME, 1) + + consumerKeeper.AppendPendingPacket(s.consumerCtx(), ccvtypes.SlashPacket, + &ccvtypes.ConsumerPacketData_SlashPacketData{ + SlashPacketData: &ccvtypes.SlashPacketData{}, + }, + ) + consumerKeeper.UpdateSlashRecordOnSend(s.consumerCtx()) + slashRecord, found = consumerKeeper.GetSlashRecord(s.consumerCtx()) + s.Require().True(found) + s.Require().True(slashRecord.WaitingOnReply) + 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()) + + // 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()) + 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)) + + // Apply ack on consumer + ackForConsumer = expectedv1Ack + err = consumerKeeper.OnAcknowledgementPacket(s.consumerCtx(), packet2, ackForConsumer) + 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. + + // 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())) +} diff --git a/testutil/integration/debug_test.go b/testutil/integration/debug_test.go index 077f33cde3..828c9b6810 100644 --- a/testutil/integration/debug_test.go +++ b/testutil/integration/debug_test.go @@ -252,3 +252,11 @@ func TestQueueAndSendVSCMaturedPackets(t *testing.T) { func TestRecycleTransferChannel(t *testing.T) { runCCVTestByName(t, "TestRecycleTransferChannel") } + +// +// Throttle retry tests +// + +func TestSlashRetries(t *testing.T) { + runCCVTestByName(t, "TestSlashRetries") +} diff --git a/x/ccv/consumer/keeper/keeper.go b/x/ccv/consumer/keeper/keeper.go index e8b1cb793e..94d5c790fd 100644 --- a/x/ccv/consumer/keeper/keeper.go +++ b/x/ccv/consumer/keeper/keeper.go @@ -606,6 +606,17 @@ func (k Keeper) getAndIncrementPendingPacketsIdx(ctx sdk.Context) (toReturn uint return toReturn } +// DeleteHeadOfPendingPackets deletes the head of the pending packets queue. +func (k Keeper) DeleteHeadOfPendingPackets(ctx sdk.Context) { + store := ctx.KVStore(k.storeKey) + iterator := sdk.KVStorePrefixIterator(store, []byte{types.PendingDataPacketsBytePrefix}) + defer iterator.Close() + if !iterator.Valid() { + return + } + store.Delete(iterator.Key()) +} + // GetPendingPackets returns ALL the pending CCV packets from the store without indexes. func (k Keeper) GetPendingPackets(ctx sdk.Context) []ccv.ConsumerPacketData { ppWithIndexes := k.GetAllPendingPacketsWithIdx(ctx) diff --git a/x/ccv/consumer/keeper/keeper_test.go b/x/ccv/consumer/keeper/keeper_test.go index 269c60d9c5..06fdeae082 100644 --- a/x/ccv/consumer/keeper/keeper_test.go +++ b/x/ccv/consumer/keeper/keeper_test.go @@ -579,3 +579,30 @@ func TestPrevStandaloneChainFlag(t *testing.T) { ck.MarkAsPrevStandaloneChain(ctx) require.True(t, ck.IsPrevStandaloneChain(ctx)) } + +func TestDeleteHeadOfPendingPackets(t *testing.T) { + consumerKeeper, ctx, ctrl, _ := testkeeper.GetConsumerKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) + defer ctrl.Finish() + + // append some pending packets + consumerKeeper.AppendPendingPacket(ctx, ccv.VscMaturedPacket, &ccv.ConsumerPacketData_VscMaturedPacketData{}) + consumerKeeper.AppendPendingPacket(ctx, ccv.SlashPacket, &ccv.ConsumerPacketData_SlashPacketData{}) + consumerKeeper.AppendPendingPacket(ctx, ccv.VscMaturedPacket, &ccv.ConsumerPacketData_VscMaturedPacketData{}) + + // Check there's 3 pending packets, vsc matured at head + pp := consumerKeeper.GetPendingPackets(ctx) + require.Len(t, pp, 3) + require.Equal(t, pp[0].Type, ccv.VscMaturedPacket) + + // Delete the head, confirm slash packet is now at head + consumerKeeper.DeleteHeadOfPendingPackets(ctx) + pp = consumerKeeper.GetPendingPackets(ctx) + require.Len(t, pp, 2) + require.Equal(t, pp[0].Type, ccv.SlashPacket) + + // Delete the head, confirm vsc matured packet is now at head + consumerKeeper.DeleteHeadOfPendingPackets(ctx) + pp = consumerKeeper.GetPendingPackets(ctx) + require.Len(t, pp, 1) + require.Equal(t, pp[0].Type, ccv.VscMaturedPacket) +} diff --git a/x/ccv/consumer/keeper/relay.go b/x/ccv/consumer/keeper/relay.go index 376110f26d..060aadff20 100644 --- a/x/ccv/consumer/keeper/relay.go +++ b/x/ccv/consumer/keeper/relay.go @@ -188,8 +188,11 @@ func (k Keeper) SendPackets(ctx sdk.Context) { pending := k.GetAllPendingPacketsWithIdx(ctx) idxsForDeletion := []uint64{} for _, p := range pending { + if !k.PacketSendingPermitted(ctx) { + break + } - // send packet over IBC + // Send packet over IBC err := ccv.SendIBCPacket( ctx, k.scopedKeeper, @@ -213,6 +216,16 @@ func (k Keeper) SendPackets(ctx sdk.Context) { k.Logger(ctx).Error("cannot send IBC packet; leaving packet data stored:", "type", p.Type.String(), "err", err.Error()) break } + // If the packet that was just sent was a Slash packet, set the waiting on slash reply flag. + // This flag will be toggled false again when consumer hears back from provider. See OnAcknowledgementPacket below. + if p.Type == ccv.SlashPacket { + k.UpdateSlashRecordOnSend(ctx) + // Break so slash stays at head of queue. + // This blocks the sending of any other packet until the leading slash packet is handled. + // Also see OnAcknowledgementPacket below which will eventually delete the leading slash packet. + break + } + // Otherwise the vsc matured will be deleted idxsForDeletion = append(idxsForDeletion, p.Idx) } // Delete pending packets that were successfully sent and did not return an error from SendIBCPacket @@ -223,6 +236,40 @@ func (k Keeper) SendPackets(ctx sdk.Context) { // in conjunction with the ibc module's execution of "acknowledgePacket", // according to https://github.com/cosmos/ibc/tree/main/spec/core/ics-004-channel-and-packet-semantics#processing-acknowledgements func (k Keeper) OnAcknowledgementPacket(ctx sdk.Context, packet channeltypes.Packet, ack channeltypes.Acknowledgement) error { + if res := ack.GetResult(); res != nil { + if len(res) != 1 { + return fmt.Errorf("acknowledgement result length must be 1, got %d", len(res)) + } + + // Unmarshal into V1 consumer packet data type. We trust data is formed correctly + // as it was originally marshalled by this module, and consumers must trust the provider + // did not tamper with the data. Note ConsumerPacketData.GetBytes() always JSON marshals to the + // ConsumerPacketDataV1 type which is sent over the wire. + var consumerPacket ccv.ConsumerPacketDataV1 + ccv.ModuleCdc.MustUnmarshalJSON(packet.GetData(), &consumerPacket) + // If this ack is regarding a provider handling a vsc matured packet, there's nothing to do. + // As vsc matured packets are popped from the consumer pending packets queue on send. + if consumerPacket.Type == ccv.VscMaturedPacket { + return nil + } + + // Otherwise we handle the result of the slash packet acknowledgement. + switch res[0] { + // We treat a v1 result as the provider successfully queuing the slash packet w/o need for retry. + case ccv.V1Result[0]: + k.ClearSlashRecord(ctx) // Clears slash record state, unblocks sending of pending packets. + k.DeleteHeadOfPendingPackets(ctx) // Remove slash from head of queue. It's been handled. + case ccv.SlashPacketHandledResult[0]: + k.ClearSlashRecord(ctx) // Clears slash record state, unblocks sending of pending packets. + k.DeleteHeadOfPendingPackets(ctx) // Remove slash from head of queue. It's been handled. + case ccv.SlashPacketBouncedResult[0]: + k.UpdateSlashRecordOnBounce(ctx) + // Note slash is still at head of queue and will now be retried after appropriate delay period. + default: + return fmt.Errorf("unrecognized acknowledgement result: %c", res[0]) + } + } + if err := ack.GetError(); err != "" { // Reasons for ErrorAcknowledgment // - packet data could not be successfully decoded diff --git a/x/ccv/consumer/keeper/relay_test.go b/x/ccv/consumer/keeper/relay_test.go index ed6771900e..09cf987fc0 100644 --- a/x/ccv/consumer/keeper/relay_test.go +++ b/x/ccv/consumer/keeper/relay_test.go @@ -14,6 +14,7 @@ import ( cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + sdk "github.com/cosmos/cosmos-sdk/types" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -22,6 +23,7 @@ import ( "github.com/cosmos/interchain-security/v3/testutil/crypto" testkeeper "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" "github.com/cosmos/interchain-security/v3/x/ccv/types" ) @@ -210,10 +212,105 @@ func TestOnRecvVSCPacketDuplicateUpdates(t *testing.T) { require.Equal(t, valUpdates[1], gotPendingChanges.ValidatorUpdates[0]) // Only latest update should be kept } -// TestOnAcknowledgementPacket tests application logic for acknowledgments of sent VSCMatured and Slash packets +// TestSendPackets tests the SendPackets method failing +func TestSendPacketsFailure(t *testing.T) { + // Keeper setup + consumerKeeper, ctx, ctrl, mocks := testkeeper.GetConsumerKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) + defer ctrl.Finish() + consumerKeeper.SetProviderChannel(ctx, "consumerCCVChannelID") + consumerKeeper.SetParams(ctx, consumertypes.DefaultParams()) + + // Set some pending packets + consumerKeeper.AppendPendingPacket(ctx, types.VscMaturedPacket, &types.ConsumerPacketData_VscMaturedPacketData{}) + consumerKeeper.AppendPendingPacket(ctx, types.SlashPacket, &types.ConsumerPacketData_SlashPacketData{}) + consumerKeeper.AppendPendingPacket(ctx, types.VscMaturedPacket, &types.ConsumerPacketData_VscMaturedPacketData{}) + + // Mock the channel keeper to return an error + gomock.InOrder( + mocks.MockChannelKeeper.EXPECT().GetChannel(ctx, types.ConsumerPortID, + "consumerCCVChannelID").Return(channeltypes.Channel{}, false).Times(1), + ) + + // No panic should occur, pending packets should not be cleared + consumerKeeper.SendPackets(ctx) + require.Equal(t, 3, len(consumerKeeper.GetPendingPackets(ctx))) +} + +func TestSendPackets(t *testing.T) { + // Keeper setup + consumerKeeper, ctx, ctrl, mocks := testkeeper.GetConsumerKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) + consumerKeeper.SetProviderChannel(ctx, "consumerCCVChannelID") + consumerKeeper.SetParams(ctx, consumertypes.DefaultParams()) + + // No slash record should exist + _, found := consumerKeeper.GetSlashRecord(ctx) + require.False(t, found) + require.True(t, consumerKeeper.PacketSendingPermitted(ctx)) + + // Queue up two vsc matured, followed by slash, followed by vsc matured + consumerKeeper.AppendPendingPacket(ctx, types.VscMaturedPacket, &types.ConsumerPacketData_VscMaturedPacketData{ + VscMaturedPacketData: &types.VSCMaturedPacketData{ + ValsetUpdateId: 77, + }, + }) + consumerKeeper.AppendPendingPacket(ctx, types.VscMaturedPacket, &types.ConsumerPacketData_VscMaturedPacketData{ + VscMaturedPacketData: &types.VSCMaturedPacketData{ + ValsetUpdateId: 90, + }, + }) + consumerKeeper.AppendPendingPacket(ctx, types.SlashPacket, &types.ConsumerPacketData_SlashPacketData{ + SlashPacketData: &types.SlashPacketData{ + Validator: abci.Validator{}, + ValsetUpdateId: 88, + Infraction: stakingtypes.Infraction_INFRACTION_DOWNTIME, + }, + }) + consumerKeeper.AppendPendingPacket(ctx, types.VscMaturedPacket, &types.ConsumerPacketData_VscMaturedPacketData{ + VscMaturedPacketData: &types.VSCMaturedPacketData{ + ValsetUpdateId: 99, + }, + }) + + // First two vsc matured and slash should be sent, 3 total + gomock.InAnyOrder( + testkeeper.GetMocksForSendIBCPacket(ctx, mocks, "consumerCCVChannelID", 3), + ) + consumerKeeper.SendPackets(ctx) + ctrl.Finish() + + // First two packets should be deleted, slash should be at head of queue + pendingPackets := consumerKeeper.GetPendingPackets(ctx) + require.Equal(t, 2, len(pendingPackets)) + require.Equal(t, types.SlashPacket, pendingPackets[0].Type) + require.Equal(t, types.VscMaturedPacket, pendingPackets[1].Type) + + // Packet sending not permitted + require.False(t, consumerKeeper.PacketSendingPermitted(ctx)) + + // Now delete slash record as would be done by a recv SlashPacketHandledResult + // then confirm last vsc matured is sent + consumerKeeper.ClearSlashRecord(ctx) + consumerKeeper.DeleteHeadOfPendingPackets(ctx) + + // Packet sending permitted + require.True(t, consumerKeeper.PacketSendingPermitted(ctx)) + + gomock.InAnyOrder( + testkeeper.GetMocksForSendIBCPacket(ctx, mocks, "consumerCCVChannelID", 1), + ) + + consumerKeeper.SendPackets(ctx) + ctrl.Finish() + + // No packets should be left + pendingPackets = consumerKeeper.GetPendingPackets(ctx) + require.Equal(t, 0, len(pendingPackets)) +} + +// TestOnAcknowledgementPacketError tests application logic for ERROR acknowledgments of sent VSCMatured and Slash packets // in conjunction with the ibc module's execution of "acknowledgePacket", // according to https://github.com/cosmos/ibc/tree/main/spec/core/ics-004-channel-and-packet-semantics#processing-acknowledgements -func TestOnAcknowledgementPacket(t *testing.T) { +func TestOnAcknowledgementPacketError(t *testing.T) { // Channel ID to some dest chain that's not the established provider channelIDToDestChain := "channelIDToDestChain" @@ -258,12 +355,6 @@ func TestOnAcknowledgementPacket(t *testing.T) { uint64(time.Now().Add(60*time.Second).UnixNano()), ) - ack := channeltypes.NewResultAcknowledgement([]byte{1}) - - // expect no error returned from OnAcknowledgementPacket, no input error with ack - err := consumerKeeper.OnAcknowledgementPacket(ctx, packet, ack) - require.Nil(t, err) - // Still expect no error returned from OnAcknowledgementPacket, // but the input error ack will be handled with appropriate ChanCloseInit calls dummyCap := &capabilitytypes.Capability{} @@ -287,33 +378,91 @@ func TestOnAcknowledgementPacket(t *testing.T) { ).Return(nil).Times(1), ) - ack = types.NewErrorAcknowledgementWithLog(ctx, fmt.Errorf("error")) - err = consumerKeeper.OnAcknowledgementPacket(ctx, packet, ack) + ack := types.NewErrorAcknowledgementWithLog(ctx, fmt.Errorf("error")) + err := consumerKeeper.OnAcknowledgementPacket(ctx, packet, ack) require.Nil(t, err) } -// TestSendPackets tests the SendPackets method failing -func TestSendPacketsFailure(t *testing.T) { - // Keeper setup - consumerKeeper, ctx, ctrl, mocks := testkeeper.GetConsumerKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) +// TestOnAcknowledgementPacketResult tests application logic for RESULT acknowledgments of sent VSCMatured and Slash packets +// in conjunction with the ibc module's execution of "acknowledgePacket", +func TestOnAcknowledgementPacketResult(t *testing.T) { + // Setup + consumerKeeper, ctx, ctrl, _ := testkeeper.GetConsumerKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) defer ctrl.Finish() - consumerKeeper.SetProviderChannel(ctx, "consumerCCVChannelID") - consumerKeeper.SetParams(ctx, consumertypes.DefaultParams()) - // Set some pending packets - consumerKeeper.AppendPendingPacket(ctx, types.VscMaturedPacket, &types.ConsumerPacketData_VscMaturedPacketData{}) - consumerKeeper.AppendPendingPacket(ctx, types.SlashPacket, &types.ConsumerPacketData_SlashPacketData{}) - consumerKeeper.AppendPendingPacket(ctx, types.VscMaturedPacket, &types.ConsumerPacketData_VscMaturedPacketData{}) + setupSlashBeforeVscMatured(ctx, &consumerKeeper) - // Mock the channel keeper to return an error - gomock.InOrder( - mocks.MockChannelKeeper.EXPECT().GetChannel(ctx, types.ConsumerPortID, - "consumerCCVChannelID").Return(channeltypes.Channel{}, false).Times(1), - ) + // Slash record found, 2 pending packets, slash is at head of queue + _, found := consumerKeeper.GetSlashRecord(ctx) + require.True(t, found) + pendingPackets := consumerKeeper.GetPendingPackets(ctx) + require.Len(t, pendingPackets, 2) + require.Equal(t, types.SlashPacket, pendingPackets[0].Type) - // No panic should occur, pending packets should not be cleared - consumerKeeper.SendPackets(ctx) - require.Equal(t, 3, len(consumerKeeper.GetPendingPackets(ctx))) + // v1 result should delete slash record and head of pending packets. Vsc matured remains + ack := channeltypes.NewResultAcknowledgement(types.V1Result) + packet := channeltypes.Packet{Data: pendingPackets[0].GetBytes()} + err := consumerKeeper.OnAcknowledgementPacket(ctx, packet, ack) + require.Nil(t, err) + _, found = consumerKeeper.GetSlashRecord(ctx) + require.False(t, found) + require.Len(t, consumerKeeper.GetPendingPackets(ctx), 1) + require.Equal(t, types.VscMaturedPacket, consumerKeeper.GetPendingPackets(ctx)[0].Type) + + // refresh state + setupSlashBeforeVscMatured(ctx, &consumerKeeper) + pendingPackets = consumerKeeper.GetPendingPackets(ctx) + packet = channeltypes.Packet{Data: pendingPackets[0].GetBytes()} + + // Slash packet handled result should delete slash record and head of pending packets + ack = channeltypes.NewResultAcknowledgement(types.SlashPacketHandledResult) + err = consumerKeeper.OnAcknowledgementPacket(ctx, packet, ack) + require.Nil(t, err) + _, found = consumerKeeper.GetSlashRecord(ctx) + require.False(t, found) + require.Len(t, consumerKeeper.GetPendingPackets(ctx), 1) + require.Equal(t, types.VscMaturedPacket, consumerKeeper.GetPendingPackets(ctx)[0].Type) + + // refresh state + setupSlashBeforeVscMatured(ctx, &consumerKeeper) + pendingPackets = consumerKeeper.GetPendingPackets(ctx) + packet = channeltypes.Packet{Data: pendingPackets[0].GetBytes()} + + slashRecordBefore, found := consumerKeeper.GetSlashRecord(ctx) + require.True(t, found) + require.True(t, slashRecordBefore.WaitingOnReply) + + // Slash packet bounced result should update slash record + ack = channeltypes.NewResultAcknowledgement(types.SlashPacketBouncedResult) + err = consumerKeeper.OnAcknowledgementPacket(ctx, packet, ack) + require.Nil(t, err) + slashRecordAfter, found := consumerKeeper.GetSlashRecord(ctx) + require.True(t, found) + require.False(t, slashRecordAfter.WaitingOnReply) // waiting on reply toggled false + require.Equal(t, slashRecordAfter.SendTime.UnixNano(), + slashRecordBefore.SendTime.UnixNano()) // send time NOT updated. Bounce result shouldn't affect that +} + +func setupSlashBeforeVscMatured(ctx sdk.Context, k *consumerkeeper.Keeper) { + // clear old state + k.ClearSlashRecord(ctx) + k.DeleteAllPendingDataPackets(ctx) + + // Set some related state to test against + k.SetSlashRecord(ctx, consumertypes.SlashRecord{WaitingOnReply: true, SendTime: time.Now()}) + // Slash packet before VSCMatured packet + k.AppendPendingPacket(ctx, types.SlashPacket, &types.ConsumerPacketData_SlashPacketData{ // Slash appears first + SlashPacketData: &types.SlashPacketData{ + Validator: abci.Validator{}, + ValsetUpdateId: 88, + Infraction: stakingtypes.Infraction_INFRACTION_DOWNTIME, + }, + }) + k.AppendPendingPacket(ctx, types.VscMaturedPacket, &types.ConsumerPacketData_VscMaturedPacketData{ + VscMaturedPacketData: &types.VSCMaturedPacketData{ + ValsetUpdateId: 90, + }, + }) } // Regression test for https://github.com/cosmos/interchain-security/issues/1145 @@ -324,7 +473,12 @@ func TestSendPacketsDeletion(t *testing.T) { consumerKeeper.SetProviderChannel(ctx, "consumerCCVChannelID") consumerKeeper.SetParams(ctx, consumertypes.DefaultParams()) - // Queue two pending packets + // Queue two pending packets, vsc matured first + consumerKeeper.AppendPendingPacket(ctx, types.VscMaturedPacket, &types.ConsumerPacketData_VscMaturedPacketData{ + VscMaturedPacketData: &types.VSCMaturedPacketData{ + ValsetUpdateId: 90, + }, + }) consumerKeeper.AppendPendingPacket(ctx, types.SlashPacket, &types.ConsumerPacketData_SlashPacketData{ // Slash appears first SlashPacketData: &types.SlashPacketData{ Validator: abci.Validator{}, @@ -332,15 +486,10 @@ func TestSendPacketsDeletion(t *testing.T) { Infraction: stakingtypes.Infraction_INFRACTION_DOWNTIME, }, }) - consumerKeeper.AppendPendingPacket(ctx, types.VscMaturedPacket, &types.ConsumerPacketData_VscMaturedPacketData{ - VscMaturedPacketData: &types.VSCMaturedPacketData{ - ValsetUpdateId: 90, - }, - }) - // Get mocks for a successful SendPacket call that does NOT return an error + // Get mocks for the (first) successful SendPacket call that does NOT return an error expectations := testkeeper.GetMocksForSendIBCPacket(ctx, mocks, "consumerCCVChannelID", 1) - // Append mocks for a failed SendPacket call, which returns an error + // Append mocks for the (second) failed SendPacket call, which returns an error expectations = append(expectations, mocks.MockChannelKeeper.EXPECT().GetChannel(ctx, types.ConsumerPortID, "consumerCCVChannelID").Return(channeltypes.Channel{}, false).Times(1)) gomock.InOrder(expectations...) @@ -349,5 +498,7 @@ func TestSendPacketsDeletion(t *testing.T) { // Expect the first successfully sent packet to be popped from queue require.Equal(t, 1, len(consumerKeeper.GetPendingPackets(ctx))) - require.Equal(t, types.VscMaturedPacket, consumerKeeper.GetPendingPackets(ctx)[0].Type) + + // Expect the slash packet to remain + require.Equal(t, types.SlashPacket, consumerKeeper.GetPendingPackets(ctx)[0].Type) } diff --git a/x/ccv/consumer/keeper/throttle_retry.go b/x/ccv/consumer/keeper/throttle_retry.go new file mode 100644 index 0000000000..4c4585cb1d --- /dev/null +++ b/x/ccv/consumer/keeper/throttle_retry.go @@ -0,0 +1,112 @@ +package keeper + +import ( + "fmt" + "time" + + sdktypes "github.com/cosmos/cosmos-sdk/types" + + consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" +) + +// +// Throttling with retries follows a finite-state machine design: +// +// 2 states: "No Slash" and "Standby". +// Initial State: "No Slash" +// Transition Event: ("No Slash", Slash packet sent) => ("Standby") +// Transition Event: ("Standby", V1Result ack received) => ("No Slash") +// Transition Event: ("Standby", Slash packet successfully handled) => ("No Slash") +// Internal Transition Event: ("Standby", Slash packet bounced) => ("Standby", with SlashRecord.WaitingOnReply = false) +// Transition Event: ("Standby", Retry sent) => ("Standby", new cycle) +// +// Description in words: +// +// 1. "No slash": If no slash record exists, the consumer is permitted to send packets from the pending packets queue. +// The consumer starts in this state from genesis. +// +// 2. On the event that a slash packet is obtained from the head of the pending packets queue and sent, +// a consumer transitions from "No Slash" to "Standby". A slash record is created upon entry to this state, +// and the consumer is now restricted from sending anymore packets. +// +// The slash packet remains at the head of the pending packets queue within the "Standby" state. +// +// - If the consumer receives a V1Result ack from the provider, +// OR if the consumer receives an ack from the provider that the slash packet was successfully handled, +// the consumer transitions from "Standby" to "No Slash". +// The slash record is cleared upon this transition, and the slash packet is popped from the pending packets queue. +// +// - Else if the consumer receives an ack from the provider that the slash packet was bounced (not handled), +// then SlashRecord.WaitingOnReply is set false, and the consumer retries sending the slash packet after a delay period. +// +// Once a retry is sent, the consumer enters a new cycle of the "Standby" state and the process repeats. +// +// 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 { + record, found := k.GetSlashRecord(ctx) + if !found { + // no slash record exists, send is permitted + return true + } + if record.WaitingOnReply { + // We are waiting on a reply from provider, block sending + return false + } + // If retry delay period has elapsed, we can send again + return ctx.BlockTime().After(record.SendTime.Add(RetryDelayPeriod)) +} + +func (k Keeper) UpdateSlashRecordOnSend(ctx sdktypes.Context) { + record := consumertypes.NewSlashRecord( + ctx.BlockTime(), // sendTime + true, // waitingOnReply + ) + // We don't mind overwriting here, since this is either a retry or the first time we send a slash + k.SetSlashRecord(ctx, record) +} + +func (k Keeper) UpdateSlashRecordOnBounce(ctx sdktypes.Context) { + record, found := k.GetSlashRecord(ctx) + if !found { + // This should never happen + panic("could not find slash record, but reply was received from provider") + } + record.WaitingOnReply = false + k.SetSlashRecord(ctx, record) +} + +func (k Keeper) GetSlashRecord(ctx sdktypes.Context) (record consumertypes.SlashRecord, found bool) { + store := ctx.KVStore(k.storeKey) + bz := store.Get(consumertypes.SlashRecordKey()) + if bz == nil { + return record, false + } + err := record.Unmarshal(bz) + if err != nil { + // This should never happen + panic(fmt.Sprintf("could not unmarshal slash record: %v", err)) + } + return record, true +} + +func (k Keeper) SetSlashRecord(ctx sdktypes.Context, record consumertypes.SlashRecord) { + store := ctx.KVStore(k.storeKey) + bz, err := record.Marshal() + if err != nil { + // This should never happen + panic(fmt.Sprintf("could not marshal slash record: %v", err)) + } + store.Set(consumertypes.SlashRecordKey(), bz) +} + +func (k Keeper) ClearSlashRecord(ctx sdktypes.Context) { + store := ctx.KVStore(k.storeKey) + store.Delete(consumertypes.SlashRecordKey()) +} diff --git a/x/ccv/consumer/keeper/throttle_retry_test.go b/x/ccv/consumer/keeper/throttle_retry_test.go new file mode 100644 index 0000000000..cc14ce3cdd --- /dev/null +++ b/x/ccv/consumer/keeper/throttle_retry_test.go @@ -0,0 +1,91 @@ +package keeper_test + +import ( + "testing" + "time" + + "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" +) + +func TestPacketSendingPermitted(t *testing.T) { + consumerKeeper, ctx, ctrl, _ := testutil.GetConsumerKeeperAndCtx(t, testutil.NewInMemKeeperParams(t)) + defer ctrl.Finish() + + ctx = ctx.WithBlockTime(time.Now()) + + // No slash record exists, send is permitted + slashRecord, found := consumerKeeper.GetSlashRecord(ctx) + require.False(t, found) + require.Zero(t, slashRecord) + require.True(t, consumerKeeper.PacketSendingPermitted(ctx)) + + // Update slash record on sending of slash packet + consumerKeeper.UpdateSlashRecordOnSend(ctx) + slashRecord, found = consumerKeeper.GetSlashRecord(ctx) + require.True(t, found) + require.True(t, slashRecord.WaitingOnReply) + + // Packet sending not permitted since we're waiting on a reply from provider + require.False(t, consumerKeeper.PacketSendingPermitted(ctx)) + + // Call update that happens when provider bounces slash packet + consumerKeeper.UpdateSlashRecordOnBounce(ctx) + slashRecord, found = consumerKeeper.GetSlashRecord(ctx) + require.True(t, found) + require.False(t, slashRecord.WaitingOnReply) + + // Packet sending still not permitted since retry delay period has not elapsed + require.False(t, consumerKeeper.PacketSendingPermitted(ctx)) + + // Elapse retry delay period + ctx = ctx.WithBlockTime(ctx.BlockTime().Add(2 * consumerkeeper.RetryDelayPeriod)) + + // Now packet sending is permitted again + require.True(t, consumerKeeper.PacketSendingPermitted(ctx)) +} + +func TestThrottleRetryCRUD(t *testing.T) { + consumerKeeper, ctx, ctrl, _ := testutil.GetConsumerKeeperAndCtx(t, testutil.NewInMemKeeperParams(t)) + defer ctrl.Finish() + + slashRecord, found := consumerKeeper.GetSlashRecord(ctx) + require.False(t, found) + require.Zero(t, slashRecord) + + consumerKeeper.SetSlashRecord(ctx, consumertypes.SlashRecord{ + WaitingOnReply: true, + SendTime: ctx.BlockTime(), + }) + + slashRecord, found = consumerKeeper.GetSlashRecord(ctx) + require.True(t, found) + require.True(t, slashRecord.WaitingOnReply) + require.Equal(t, ctx.BlockTime(), slashRecord.SendTime) + + // UpdateSlashRecordOnBounce should set WaitingOnReply to false, and leave SendTime unchanged + oldBlocktime := ctx.BlockTime() + ctx = ctx.WithBlockTime(ctx.BlockTime().Add(time.Hour)) + consumerKeeper.UpdateSlashRecordOnBounce(ctx) + slashRecord, found = consumerKeeper.GetSlashRecord(ctx) + require.True(t, found) + require.False(t, slashRecord.WaitingOnReply) + require.Equal(t, oldBlocktime, slashRecord.SendTime) // Old SendTime expected + + // UpdateSlashRecordOnSend should replace slash record with WaitingOnReply set to true, and new SendTime + ctx = ctx.WithBlockTime(ctx.BlockTime().Add(time.Hour)) + consumerKeeper.UpdateSlashRecordOnSend(ctx) + slashRecord, found = consumerKeeper.GetSlashRecord(ctx) + require.True(t, found) + require.True(t, slashRecord.WaitingOnReply) + require.Equal(t, ctx.BlockTime(), slashRecord.SendTime) // New SendTime expected + require.Equal(t, oldBlocktime.Add(2*time.Hour), slashRecord.SendTime) // Sanity check + + consumerKeeper.ClearSlashRecord(ctx) + slashRecord, found = consumerKeeper.GetSlashRecord(ctx) + require.False(t, found) + require.Zero(t, slashRecord) +} diff --git a/x/ccv/consumer/types/consumer.pb.go b/x/ccv/consumer/types/consumer.pb.go index 90d5d6e12b..b16b561b7b 100644 --- a/x/ccv/consumer/types/consumer.pb.go +++ b/x/ccv/consumer/types/consumer.pb.go @@ -354,11 +354,66 @@ func (m *MaturingVSCPacket) GetMaturityTime() time.Time { return time.Time{} } +// A record storing the state of a slash packet sent to the provider chain +// which may bounce back and forth until handled by the provider. +type SlashRecord struct { + WaitingOnReply bool `protobuf:"varint,1,opt,name=waiting_on_reply,json=waitingOnReply,proto3" json:"waiting_on_reply,omitempty"` + SendTime time.Time `protobuf:"bytes,2,opt,name=send_time,json=sendTime,proto3,stdtime" json:"send_time"` +} + +func (m *SlashRecord) Reset() { *m = SlashRecord{} } +func (m *SlashRecord) String() string { return proto.CompactTextString(m) } +func (*SlashRecord) ProtoMessage() {} +func (*SlashRecord) Descriptor() ([]byte, []int) { + return fileDescriptor_5b27a82b276e7f93, []int{4} +} +func (m *SlashRecord) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SlashRecord) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SlashRecord.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 *SlashRecord) XXX_Merge(src proto.Message) { + xxx_messageInfo_SlashRecord.Merge(m, src) +} +func (m *SlashRecord) XXX_Size() int { + return m.Size() +} +func (m *SlashRecord) XXX_DiscardUnknown() { + xxx_messageInfo_SlashRecord.DiscardUnknown(m) +} + +var xxx_messageInfo_SlashRecord proto.InternalMessageInfo + +func (m *SlashRecord) GetWaitingOnReply() bool { + if m != nil { + return m.WaitingOnReply + } + return false +} + +func (m *SlashRecord) GetSendTime() time.Time { + if m != nil { + return m.SendTime + } + return time.Time{} +} + func init() { proto.RegisterType((*Params)(nil), "interchain_security.ccv.consumer.v1.Params") proto.RegisterType((*LastTransmissionBlockHeight)(nil), "interchain_security.ccv.consumer.v1.LastTransmissionBlockHeight") proto.RegisterType((*CrossChainValidator)(nil), "interchain_security.ccv.consumer.v1.CrossChainValidator") proto.RegisterType((*MaturingVSCPacket)(nil), "interchain_security.ccv.consumer.v1.MaturingVSCPacket") + proto.RegisterType((*SlashRecord)(nil), "interchain_security.ccv.consumer.v1.SlashRecord") } func init() { @@ -366,57 +421,60 @@ func init() { } var fileDescriptor_5b27a82b276e7f93 = []byte{ - // 786 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0xcf, 0x6e, 0xdb, 0x36, - 0x18, 0x8f, 0x96, 0xd6, 0x4d, 0x98, 0x14, 0x6b, 0x59, 0x2f, 0x55, 0x33, 0x40, 0x76, 0xdd, 0x1e, - 0x7c, 0x89, 0x84, 0x26, 0xdb, 0xa5, 0xc0, 0x0e, 0xb5, 0xb3, 0xa2, 0xdd, 0xbf, 0x78, 0xaa, 0xd1, - 0x01, 0xdb, 0x81, 0xa0, 0x28, 0x5a, 0x22, 0x22, 0x91, 0x02, 0x49, 0xa9, 0xd3, 0x7d, 0x0f, 0xd0, - 0xe3, 0x1e, 0x61, 0x0f, 0xb0, 0x87, 0x28, 0x76, 0xea, 0x71, 0xa7, 0x6e, 0x48, 0xde, 0x60, 0x4f, - 0x30, 0x90, 0x92, 0x5c, 0x3b, 0x6d, 0x80, 0xdc, 0xf8, 0xe9, 0xf7, 0xfb, 0x7e, 0xfa, 0xfe, 0x83, - 0x43, 0xc6, 0x35, 0x95, 0x24, 0xc5, 0x8c, 0x23, 0x45, 0x49, 0x29, 0x99, 0xae, 0x03, 0x42, 0xaa, - 0x80, 0x08, 0xae, 0xca, 0x9c, 0xca, 0xa0, 0x7a, 0xb4, 0x7c, 0xfb, 0x85, 0x14, 0x5a, 0xc0, 0x07, - 0x1f, 0xf1, 0xf1, 0x09, 0xa9, 0xfc, 0x25, 0xaf, 0x7a, 0xb4, 0xff, 0xf0, 0x32, 0x61, 0xa3, 0x47, - 0xaa, 0x46, 0x6a, 0xff, 0x5e, 0x22, 0x44, 0x92, 0xd1, 0xc0, 0x5a, 0x51, 0xb9, 0x08, 0x30, 0xaf, - 0x5b, 0xa8, 0x9f, 0x88, 0x44, 0xd8, 0x67, 0x60, 0x5e, 0x9d, 0x03, 0x11, 0x2a, 0x17, 0x0a, 0x35, - 0x40, 0x63, 0xb4, 0x90, 0x77, 0x51, 0x2b, 0x2e, 0x25, 0xd6, 0x4c, 0xf0, 0x16, 0x1f, 0x5c, 0xc4, - 0x35, 0xcb, 0xa9, 0xd2, 0x38, 0x2f, 0x1a, 0xc2, 0xe8, 0xb7, 0x1e, 0xe8, 0xcd, 0xb0, 0xc4, 0xb9, - 0x82, 0x2e, 0xb8, 0x41, 0x39, 0x8e, 0x32, 0x1a, 0xbb, 0xce, 0xd0, 0x19, 0x6f, 0x85, 0x9d, 0x09, - 0x4f, 0xc0, 0xc3, 0x28, 0x13, 0xe4, 0x54, 0xa1, 0x82, 0x4a, 0x14, 0x33, 0xa5, 0x25, 0x8b, 0x4a, - 0xf3, 0x1b, 0xa4, 0x25, 0xe6, 0x2a, 0x67, 0x4a, 0x31, 0xc1, 0xdd, 0x4f, 0x86, 0xce, 0x78, 0x33, - 0xbc, 0xdf, 0x70, 0x67, 0x54, 0x1e, 0xaf, 0x30, 0xe7, 0x2b, 0x44, 0xf8, 0x0d, 0xb8, 0x7f, 0xa9, - 0x0a, 0x22, 0x29, 0xe6, 0x9c, 0x66, 0xee, 0xe6, 0xd0, 0x19, 0x6f, 0x87, 0x83, 0xf8, 0x12, 0x91, - 0x69, 0x43, 0x83, 0x8f, 0xc1, 0x7e, 0x21, 0x45, 0xc5, 0x62, 0x2a, 0xd1, 0x82, 0x52, 0x54, 0x08, - 0x91, 0x21, 0x1c, 0xc7, 0x12, 0x29, 0x2d, 0xdd, 0x6b, 0x56, 0x64, 0xaf, 0x63, 0x3c, 0xa5, 0x74, - 0x26, 0x44, 0xf6, 0x24, 0x8e, 0xe5, 0x0b, 0x2d, 0xe1, 0x8f, 0x00, 0x12, 0x52, 0x21, 0x53, 0x14, - 0x51, 0x6a, 0x93, 0x1d, 0x13, 0xb1, 0x7b, 0x7d, 0xe8, 0x8c, 0x77, 0x0e, 0xef, 0xf9, 0x4d, 0xed, - 0xfc, 0xae, 0x76, 0xfe, 0x71, 0x5b, 0xdb, 0xc9, 0xd6, 0x9b, 0x77, 0x83, 0x8d, 0xdf, 0xff, 0x19, - 0x38, 0xe1, 0x2d, 0x42, 0xaa, 0x79, 0xe3, 0x3d, 0xb3, 0xce, 0xf0, 0x17, 0x70, 0xd7, 0x66, 0xb3, - 0xa0, 0xf2, 0xa2, 0x6e, 0xef, 0xea, 0xba, 0x9f, 0x75, 0x1a, 0xeb, 0xe2, 0xcf, 0xc0, 0xb0, 0x9b, - 0x37, 0x24, 0xe9, 0x5a, 0x09, 0x17, 0x12, 0x13, 0xf3, 0x70, 0x6f, 0xd8, 0x8c, 0xbd, 0x8e, 0x17, - 0xae, 0xd1, 0x9e, 0xb6, 0x2c, 0x78, 0x00, 0x60, 0xca, 0x94, 0x16, 0x92, 0x11, 0x9c, 0x21, 0xca, - 0xb5, 0x64, 0x54, 0xb9, 0x5b, 0xb6, 0x81, 0xb7, 0xdf, 0x23, 0x5f, 0x37, 0x00, 0xfc, 0x01, 0xdc, - 0x2a, 0x79, 0x24, 0x78, 0xcc, 0x78, 0xd2, 0xa5, 0xb3, 0x7d, 0xf5, 0x74, 0x3e, 0x5d, 0x3a, 0xb7, - 0x89, 0x1c, 0x81, 0x3d, 0x25, 0x16, 0x1a, 0x89, 0x42, 0x23, 0x53, 0x21, 0x9d, 0x4a, 0xaa, 0x52, - 0x91, 0xc5, 0x2e, 0xb0, 0xe1, 0xdf, 0x31, 0xe8, 0x49, 0xa1, 0x4f, 0x4a, 0x3d, 0xef, 0x20, 0xf8, - 0x00, 0xdc, 0x94, 0xf4, 0x15, 0x96, 0x31, 0x8a, 0x29, 0x17, 0xb9, 0x72, 0x77, 0x86, 0x9b, 0xe3, - 0xed, 0x70, 0xb7, 0xf9, 0x78, 0x6c, 0xbf, 0xc1, 0x2f, 0xc0, 0xb2, 0xd9, 0x68, 0x9d, 0xbd, 0x6b, - 0xd9, 0xfd, 0x0e, 0x0d, 0x57, 0xbc, 0x46, 0x5f, 0x82, 0xcf, 0xbf, 0xc3, 0x4a, 0xaf, 0xce, 0xd7, - 0xc4, 0x4c, 0xf1, 0x33, 0xca, 0x92, 0x54, 0xc3, 0x3d, 0xd0, 0x4b, 0xed, 0xcb, 0x6e, 0xc6, 0x66, - 0xd8, 0x5a, 0xa3, 0x3f, 0x1c, 0x70, 0x67, 0x2a, 0x85, 0x52, 0x53, 0xb3, 0xf3, 0x2f, 0x71, 0xc6, - 0x62, 0xac, 0x85, 0x34, 0xab, 0x64, 0x26, 0x90, 0x2a, 0x65, 0x1d, 0x76, 0xc3, 0xce, 0x84, 0x7d, - 0x70, 0xbd, 0x10, 0xaf, 0xa8, 0x6c, 0x77, 0xa5, 0x31, 0x20, 0x06, 0xbd, 0xa2, 0x8c, 0x4e, 0x69, - 0x6d, 0x87, 0x7e, 0xe7, 0xb0, 0xff, 0x41, 0x51, 0x9f, 0xf0, 0x7a, 0x72, 0xf4, 0xdf, 0xbb, 0xc1, - 0xdd, 0x1a, 0xe7, 0xd9, 0xe3, 0x91, 0xe9, 0x2e, 0xe5, 0xaa, 0x54, 0xa8, 0xf1, 0x1b, 0xfd, 0xf5, - 0xe7, 0x41, 0xbf, 0xbd, 0x0c, 0x44, 0xd6, 0x85, 0x16, 0xfe, 0xac, 0x8c, 0xbe, 0xa5, 0x75, 0xd8, - 0x0a, 0x8f, 0x34, 0xb8, 0xfd, 0x3d, 0xd6, 0xa5, 0x64, 0x3c, 0x79, 0xf9, 0x62, 0x3a, 0xc3, 0xe4, - 0x94, 0x6a, 0x13, 0x4d, 0xa5, 0xc8, 0xf3, 0x66, 0xe1, 0xaf, 0x85, 0x8d, 0x01, 0x9f, 0x83, 0x9b, - 0xb9, 0xa5, 0xea, 0xda, 0x8e, 0xb0, 0x8d, 0x75, 0xe7, 0x70, 0xff, 0x83, 0xa0, 0xe6, 0xdd, 0x31, - 0x69, 0x5a, 0xfd, 0xda, 0xb4, 0x7a, 0xb7, 0x73, 0x35, 0xe0, 0xe4, 0xa7, 0x37, 0x67, 0x9e, 0xf3, - 0xf6, 0xcc, 0x73, 0xfe, 0x3d, 0xf3, 0x9c, 0xd7, 0xe7, 0xde, 0xc6, 0xdb, 0x73, 0x6f, 0xe3, 0xef, - 0x73, 0x6f, 0xe3, 0xe7, 0xaf, 0x12, 0xa6, 0xd3, 0x32, 0xf2, 0x89, 0xc8, 0xdb, 0x93, 0x16, 0xbc, - 0xbf, 0x9e, 0x07, 0xcb, 0xeb, 0x59, 0x1d, 0x05, 0xbf, 0xae, 0xdf, 0x66, 0x5d, 0x17, 0x54, 0x45, - 0x3d, 0x1b, 0xc4, 0xd1, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x26, 0xe0, 0xb8, 0xdf, 0xcc, 0x05, - 0x00, 0x00, + // 836 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x55, 0xcf, 0x6e, 0xdb, 0x36, + 0x18, 0x8f, 0x96, 0xd6, 0x4d, 0xe8, 0x74, 0x4b, 0x59, 0x2f, 0x55, 0x33, 0xc0, 0x76, 0xdd, 0x1e, + 0x7c, 0x89, 0x8d, 0x26, 0xdb, 0xa5, 0xc0, 0x0e, 0xf9, 0xb3, 0xa2, 0xdd, 0xbf, 0x78, 0x4a, 0xd0, + 0x01, 0xdb, 0x81, 0xa0, 0xa8, 0xcf, 0x16, 0x11, 0x89, 0x14, 0x48, 0x4a, 0x99, 0x76, 0xde, 0x03, + 0xf4, 0xb8, 0x47, 0xd8, 0x03, 0xec, 0x21, 0x8a, 0x9d, 0x7a, 0xdc, 0xa9, 0x1b, 0x92, 0x37, 0xd8, + 0x13, 0x0c, 0xa4, 0x24, 0xd7, 0x4e, 0x17, 0xa0, 0xbb, 0xf1, 0xe3, 0xef, 0x8f, 0xf8, 0x7d, 0xfc, + 0xf8, 0x09, 0xed, 0x72, 0x61, 0x40, 0xb1, 0x98, 0x72, 0x41, 0x34, 0xb0, 0x5c, 0x71, 0x53, 0x8e, + 0x19, 0x2b, 0xc6, 0x4c, 0x0a, 0x9d, 0xa7, 0xa0, 0xc6, 0xc5, 0xe3, 0xf9, 0x7a, 0x94, 0x29, 0x69, + 0x24, 0x7e, 0xf8, 0x1f, 0x9a, 0x11, 0x63, 0xc5, 0x68, 0xce, 0x2b, 0x1e, 0x6f, 0x3f, 0xba, 0xce, + 0xd8, 0xfa, 0xb1, 0xa2, 0xb2, 0xda, 0xbe, 0x3f, 0x93, 0x72, 0x96, 0xc0, 0xd8, 0x45, 0x61, 0x3e, + 0x1d, 0x53, 0x51, 0xd6, 0x50, 0x67, 0x26, 0x67, 0xd2, 0x2d, 0xc7, 0x76, 0xd5, 0x08, 0x98, 0xd4, + 0xa9, 0xd4, 0xa4, 0x02, 0xaa, 0xa0, 0x86, 0xba, 0x57, 0xbd, 0xa2, 0x5c, 0x51, 0xc3, 0xa5, 0xa8, + 0xf1, 0xde, 0x55, 0xdc, 0xf0, 0x14, 0xb4, 0xa1, 0x69, 0x56, 0x11, 0x06, 0xbf, 0xb4, 0x50, 0x6b, + 0x42, 0x15, 0x4d, 0x35, 0xf6, 0xd1, 0x2d, 0x10, 0x34, 0x4c, 0x20, 0xf2, 0xbd, 0xbe, 0x37, 0x5c, + 0x0b, 0x9a, 0x10, 0x1f, 0xa3, 0x47, 0x61, 0x22, 0xd9, 0x99, 0x26, 0x19, 0x28, 0x12, 0x71, 0x6d, + 0x14, 0x0f, 0x73, 0xfb, 0x19, 0x62, 0x14, 0x15, 0x3a, 0xe5, 0x5a, 0x73, 0x29, 0xfc, 0x0f, 0xfa, + 0xde, 0x70, 0x35, 0x78, 0x50, 0x71, 0x27, 0xa0, 0x8e, 0x16, 0x98, 0xa7, 0x0b, 0x44, 0xfc, 0x25, + 0x7a, 0x70, 0xad, 0x0b, 0x61, 0x31, 0x15, 0x02, 0x12, 0x7f, 0xb5, 0xef, 0x0d, 0xd7, 0x83, 0x5e, + 0x74, 0x8d, 0xc9, 0x61, 0x45, 0xc3, 0x4f, 0xd0, 0x76, 0xa6, 0x64, 0xc1, 0x23, 0x50, 0x64, 0x0a, + 0x40, 0x32, 0x29, 0x13, 0x42, 0xa3, 0x48, 0x11, 0x6d, 0x94, 0x7f, 0xc3, 0x99, 0x6c, 0x35, 0x8c, + 0xa7, 0x00, 0x13, 0x29, 0x93, 0xfd, 0x28, 0x52, 0x27, 0x46, 0xe1, 0xef, 0x10, 0x66, 0xac, 0x20, + 0xb6, 0x28, 0x32, 0x37, 0x36, 0x3b, 0x2e, 0x23, 0xff, 0x66, 0xdf, 0x1b, 0xb6, 0x77, 0xef, 0x8f, + 0xaa, 0xda, 0x8d, 0x9a, 0xda, 0x8d, 0x8e, 0xea, 0xda, 0x1e, 0xac, 0xbd, 0x7a, 0xd3, 0x5b, 0xf9, + 0xf5, 0xaf, 0x9e, 0x17, 0x6c, 0x32, 0x56, 0x9c, 0x56, 0xea, 0x89, 0x13, 0xe3, 0x1f, 0xd1, 0x3d, + 0x97, 0xcd, 0x14, 0xd4, 0x55, 0xdf, 0xd6, 0xfb, 0xfb, 0x7e, 0xdc, 0x78, 0x2c, 0x9b, 0x3f, 0x43, + 0xfd, 0xa6, 0xdf, 0x88, 0x82, 0xa5, 0x12, 0x4e, 0x15, 0x65, 0x76, 0xe1, 0xdf, 0x72, 0x19, 0x77, + 0x1b, 0x5e, 0xb0, 0x44, 0x7b, 0x5a, 0xb3, 0xf0, 0x0e, 0xc2, 0x31, 0xd7, 0x46, 0x2a, 0xce, 0x68, + 0x42, 0x40, 0x18, 0xc5, 0x41, 0xfb, 0x6b, 0xee, 0x02, 0xef, 0xbc, 0x45, 0xbe, 0xa8, 0x00, 0xfc, + 0x2d, 0xda, 0xcc, 0x45, 0x28, 0x45, 0xc4, 0xc5, 0xac, 0x49, 0x67, 0xfd, 0xfd, 0xd3, 0xf9, 0x68, + 0x2e, 0xae, 0x13, 0xd9, 0x43, 0x5b, 0x5a, 0x4e, 0x0d, 0x91, 0x99, 0x21, 0xb6, 0x42, 0x26, 0x56, + 0xa0, 0x63, 0x99, 0x44, 0x3e, 0x72, 0xc7, 0xbf, 0x6b, 0xd1, 0xe3, 0xcc, 0x1c, 0xe7, 0xe6, 0xb4, + 0x81, 0xf0, 0x43, 0x74, 0x5b, 0xc1, 0x39, 0x55, 0x11, 0x89, 0x40, 0xc8, 0x54, 0xfb, 0xed, 0xfe, + 0xea, 0x70, 0x3d, 0xd8, 0xa8, 0x36, 0x8f, 0xdc, 0x1e, 0xfe, 0x14, 0xcd, 0x2f, 0x9b, 0x2c, 0xb3, + 0x37, 0x1c, 0xbb, 0xd3, 0xa0, 0xc1, 0x82, 0x6a, 0xf0, 0x19, 0xfa, 0xe4, 0x6b, 0xaa, 0xcd, 0x62, + 0x7f, 0x1d, 0xd8, 0x2e, 0x7e, 0x06, 0x7c, 0x16, 0x1b, 0xbc, 0x85, 0x5a, 0xb1, 0x5b, 0xb9, 0x97, + 0xb1, 0x1a, 0xd4, 0xd1, 0xe0, 0x37, 0x0f, 0xdd, 0x3d, 0x54, 0x52, 0xeb, 0x43, 0xfb, 0xe6, 0x5f, + 0xd0, 0x84, 0x47, 0xd4, 0x48, 0x65, 0x9f, 0x92, 0xed, 0x40, 0xd0, 0xda, 0x09, 0x36, 0x82, 0x26, + 0xc4, 0x1d, 0x74, 0x33, 0x93, 0xe7, 0xa0, 0xea, 0xb7, 0x52, 0x05, 0x98, 0xa2, 0x56, 0x96, 0x87, + 0x67, 0x50, 0xba, 0xa6, 0x6f, 0xef, 0x76, 0xde, 0x29, 0xea, 0xbe, 0x28, 0x0f, 0xf6, 0xfe, 0x79, + 0xd3, 0xbb, 0x57, 0xd2, 0x34, 0x79, 0x32, 0xb0, 0xb7, 0x0b, 0x42, 0xe7, 0x9a, 0x54, 0xba, 0xc1, + 0x1f, 0xbf, 0xef, 0x74, 0xea, 0xc9, 0xc0, 0x54, 0x99, 0x19, 0x39, 0x9a, 0xe4, 0xe1, 0x57, 0x50, + 0x06, 0xb5, 0xf1, 0xc0, 0xa0, 0x3b, 0xdf, 0x50, 0x93, 0x2b, 0x2e, 0x66, 0x2f, 0x4e, 0x0e, 0x27, + 0x94, 0x9d, 0x81, 0xb1, 0xa7, 0x29, 0x34, 0x7b, 0x5e, 0x3d, 0xf8, 0x1b, 0x41, 0x15, 0xe0, 0xe7, + 0xe8, 0x76, 0xea, 0xa8, 0xa6, 0x74, 0x2d, 0xec, 0xce, 0xda, 0xde, 0xdd, 0x7e, 0xe7, 0x50, 0xa7, + 0xcd, 0x30, 0xa9, 0xae, 0xfa, 0xa5, 0xbd, 0xea, 0x8d, 0x46, 0x6a, 0xc1, 0xc1, 0xcf, 0xa8, 0x7d, + 0x92, 0x50, 0x1d, 0x07, 0xc0, 0xa4, 0x8a, 0xf0, 0x10, 0x6d, 0x9e, 0x53, 0x6e, 0x6c, 0x13, 0x49, + 0x41, 0x14, 0x64, 0x49, 0x59, 0xcf, 0x9a, 0x0f, 0xeb, 0xfd, 0x63, 0x11, 0xd8, 0x5d, 0xbc, 0x8f, + 0xd6, 0x35, 0x88, 0xe8, 0xff, 0x7f, 0x7f, 0xcd, 0xca, 0x2c, 0x70, 0xf0, 0xfd, 0xab, 0x8b, 0xae, + 0xf7, 0xfa, 0xa2, 0xeb, 0xfd, 0x7d, 0xd1, 0xf5, 0x5e, 0x5e, 0x76, 0x57, 0x5e, 0x5f, 0x76, 0x57, + 0xfe, 0xbc, 0xec, 0xae, 0xfc, 0xf0, 0xf9, 0x8c, 0x9b, 0x38, 0x0f, 0x47, 0x4c, 0xa6, 0xf5, 0x38, + 0x1d, 0xbf, 0x9d, 0xdc, 0x3b, 0xf3, 0xc9, 0x5d, 0xec, 0x8d, 0x7f, 0x5a, 0xfe, 0x2f, 0x98, 0x32, + 0x03, 0x1d, 0xb6, 0xdc, 0x01, 0xf6, 0xfe, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x61, 0xb7, 0xcd, 0x97, + 0x48, 0x06, 0x00, 0x00, } func (m *Params) Marshal() (dAtA []byte, err error) { @@ -643,6 +701,47 @@ func (m *MaturingVSCPacket) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *SlashRecord) 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 *SlashRecord) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SlashRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + n6, err6 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.SendTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.SendTime):]) + if err6 != nil { + return 0, err6 + } + i -= n6 + i = encodeVarintConsumer(dAtA, i, uint64(n6)) + i-- + dAtA[i] = 0x12 + if m.WaitingOnReply { + i-- + if m.WaitingOnReply { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func encodeVarintConsumer(dAtA []byte, offset int, v uint64) int { offset -= sovConsumer(v) base := offset @@ -752,6 +851,20 @@ func (m *MaturingVSCPacket) Size() (n int) { return n } +func (m *SlashRecord) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.WaitingOnReply { + n += 2 + } + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.SendTime) + n += 1 + l + sovConsumer(uint64(l)) + return n +} + func sovConsumer(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -1467,6 +1580,109 @@ func (m *MaturingVSCPacket) Unmarshal(dAtA []byte) error { } return nil } +func (m *SlashRecord) 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 ErrIntOverflowConsumer + } + 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: SlashRecord: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SlashRecord: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field WaitingOnReply", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowConsumer + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.WaitingOnReply = bool(v != 0) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SendTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowConsumer + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthConsumer + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthConsumer + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.SendTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipConsumer(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthConsumer + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipConsumer(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/ccv/consumer/types/keys.go b/x/ccv/consumer/types/keys.go index 8b792419ef..b755cf9f5a 100644 --- a/x/ccv/consumer/types/keys.go +++ b/x/ccv/consumer/types/keys.go @@ -102,6 +102,9 @@ const ( // This index is used for implementing a FIFO queue of pending packets in the KV store. PendingPacketsIndexByteKey + // SlashRecordByteKey is the single byte key storing the consumer's slash record. + SlashRecordByteKey + // NOTE: DO NOT ADD NEW BYTE PREFIXES HERE WITHOUT ADDING THEM TO getAllKeyPrefixes() IN keys_test.go ) @@ -218,6 +221,11 @@ func PendingPacketsIndexKey() []byte { return []byte{PendingPacketsIndexByteKey} } +// SlashRecordKey returns the key storing the consumer's slash record. +func SlashRecordKey() []byte { + return []byte{SlashRecordByteKey} +} + // NOTE: DO NOT ADD FULLY DEFINED KEY FUNCTIONS WITHOUT ADDING THEM TO getAllFullyDefinedKeys() IN keys_test.go // diff --git a/x/ccv/consumer/types/keys_test.go b/x/ccv/consumer/types/keys_test.go index 5290dd3599..a8cebee284 100644 --- a/x/ccv/consumer/types/keys_test.go +++ b/x/ccv/consumer/types/keys_test.go @@ -42,6 +42,7 @@ func getAllKeyPrefixes() []byte { StandaloneTransferChannelIDByteKey, PrevStandaloneChainByteKey, PendingPacketsIndexByteKey, + SlashRecordByteKey, } } @@ -79,5 +80,6 @@ func getAllFullyDefinedKeys() [][]byte { StandaloneTransferChannelIDKey(), PrevStandaloneChainKey(), PendingPacketsIndexKey(), + SlashRecordKey(), } } diff --git a/x/ccv/consumer/types/throttle_retry.go b/x/ccv/consumer/types/throttle_retry.go new file mode 100644 index 0000000000..9ea179ffe4 --- /dev/null +++ b/x/ccv/consumer/types/throttle_retry.go @@ -0,0 +1,11 @@ +package types + +import time "time" + +// NewSlashRecord creates a new slash record +func NewSlashRecord(sendTime time.Time, waitingOnReply bool) (record SlashRecord) { + return SlashRecord{ + SendTime: sendTime, + WaitingOnReply: true, + } +} diff --git a/x/ccv/provider/keeper/relay.go b/x/ccv/provider/keeper/relay.go index df4fdb98ce..d63594dad1 100644 --- a/x/ccv/provider/keeper/relay.go +++ b/x/ccv/provider/keeper/relay.go @@ -44,7 +44,7 @@ func (k Keeper) OnRecvVSCMaturedPacket( "vscID", data.ValsetUpdateId, ) - ack := channeltypes.NewResultAcknowledgement([]byte{byte(1)}) + ack := channeltypes.NewResultAcknowledgement(ccv.V1Result) return ack } @@ -355,7 +355,7 @@ func (k Keeper) OnRecvSlashPacket(ctx sdk.Context, packet channeltypes.Packet, d // return successful ack, as an error would result // in the consumer closing the CCV channel - return channeltypes.NewResultAcknowledgement([]byte{byte(1)}) + return channeltypes.NewResultAcknowledgement(ccv.V1Result) } // Queue a slash entry to the global queue, which will be seen by the throttling logic @@ -379,7 +379,7 @@ func (k Keeper) OnRecvSlashPacket(ctx sdk.Context, packet channeltypes.Packet, d "infractionType", data.Infraction, ) - return channeltypes.NewResultAcknowledgement([]byte{byte(1)}) + return channeltypes.NewResultAcknowledgement(ccv.V1Result) } // ValidateSlashPacket validates a recv slash packet before it is diff --git a/x/ccv/types/ccv.go b/x/ccv/types/ccv.go index 70921704f7..5b4e57994f 100644 --- a/x/ccv/types/ccv.go +++ b/x/ccv/types/ccv.go @@ -157,6 +157,20 @@ func (vdt1 SlashPacketDataV1) FromV1() *SlashPacketData { } } +type PacketAckResult []byte + +var ( // slice types can't be const + + // The result ack that has historically been sent from the provider. + // A provider with v1 throttling sends these acks for all successfully recv packets. + V1Result = PacketAckResult([]byte{byte(1)}) + // Slash packet handled result ack, sent by a throttling v2 provider to indicate that a slash packet was handled. + SlashPacketHandledResult = PacketAckResult([]byte{byte(2)}) + // Slash packet bounced result ack, sent by a throttling v2 provider to indicate that a slash packet was NOT handled + // and should eventually be retried. + SlashPacketBouncedResult = PacketAckResult([]byte{byte(3)}) +) + // An exported wrapper around the auto generated isConsumerPacketData_Data interface, only for // AppendPendingPacket to accept the interface as an argument. type ExportedIsConsumerPacketData_Data interface { From 64d860d10d6055950dd0672f7c3b8b2790d0f0a5 Mon Sep 17 00:00:00 2001 From: bernd-m <43466467+bermuell@users.noreply.github.com> Date: Fri, 11 Aug 2023 11:38:51 +0200 Subject: [PATCH 107/108] Tests: 1175 ci refactor e2e (#1191) * Refactor E2E Tests * Update docstring for short-happy-path The old docstring was outdated and since modified on main --------- Co-authored-by: Philip Offtermatt <57488781+p-offtermatt@users.noreply.github.com> --- .github/workflows/manual-e2e.yml | 91 ++++++++++++++-- .github/workflows/nightly-e2e.yml | 104 ++++++++++++++++-- Makefile | 12 +-- tests/e2e/main.go | 172 +++++++++++++++++++++--------- tests/e2e/steps.go | 2 +- 5 files changed, 311 insertions(+), 70 deletions(-) diff --git a/.github/workflows/manual-e2e.yml b/.github/workflows/manual-e2e.yml index 899e4ba230..388a19f0f5 100644 --- a/.github/workflows/manual-e2e.yml +++ b/.github/workflows/manual-e2e.yml @@ -5,22 +5,99 @@ on: workflow_dispatch: jobs: - manual-integration-main: + happy-path-test: runs-on: ubuntu-latest - timeout-minutes: 60 + timeout-minutes: 20 steps: - uses: actions/setup-go@v4 with: go-version: "1.20" - uses: actions/checkout@v3 - - name: Checkout LFS objects run: git lfs checkout - - name: Setup Go uses: actions/setup-go@v4 with: go-version: "1.20" # The Go version to download (if necessary) and use. - - - name: E2E tests - run: make test-e2e + - name: E2E happy-path test + run: go run ./tests/e2e/... --tc happy-path + changeover-test: + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/setup-go@v4 + with: + go-version: "1.20" + - uses: actions/checkout@v3 + - name: Checkout LFS objects + run: git lfs checkout + - name: Setup Go + uses: actions/setup-go@v4 + with: + go-version: "1.20" # The Go version to download (if necessary) and use. + - name: E2E changeover test + run: go run ./tests/e2e/... --tc changeover + democracy-reward-test: + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/setup-go@v4 + with: + go-version: "1.20" + - uses: actions/checkout@v3 + - name: Checkout LFS objects + run: git lfs checkout + - name: Setup Go + uses: actions/setup-go@v4 + with: + go-version: "1.20" # The Go version to download (if necessary) and use. + - name: E2E democracy-reward tests + run: go run ./tests/e2e/... --tc democracy-reward + democracy-test: + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/setup-go@v4 + with: + go-version: "1.20" + - uses: actions/checkout@v3 + - name: Checkout LFS objects + run: git lfs checkout + - name: Setup Go + uses: actions/setup-go@v4 + with: + go-version: "1.20" # The Go version to download (if necessary) and use. + - name: E2E democracy tests + run: go run ./tests/e2e/... --tc democracy + slash-throttle-test: + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/setup-go@v4 + with: + go-version: "1.20" + - uses: actions/checkout@v3 + - name: Checkout LFS objects + run: git lfs checkout + - name: Setup Go + uses: actions/setup-go@v4 + with: + go-version: "1.20" # The Go version to download (if necessary) and use. + - name: E2E slash-throttle tests + run: go run ./tests/e2e/... --tc slash-throttle + multiconsumer-test: + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/setup-go@v4 + with: + go-version: "1.20" + - uses: actions/checkout@v3 + - name: Checkout LFS objects + run: git lfs checkout + - name: Setup Go + uses: actions/setup-go@v4 + with: + go-version: "1.20" # The Go version to download (if necessary) and use. + - name: E2E multi-consumer tests + run: go run ./tests/e2e/... --tc multiconsumer diff --git a/.github/workflows/nightly-e2e.yml b/.github/workflows/nightly-e2e.yml index f69125e6b8..cd7f155e12 100644 --- a/.github/workflows/nightly-e2e.yml +++ b/.github/workflows/nightly-e2e.yml @@ -18,21 +18,111 @@ on: - cron: "0 3 * * *" jobs: - nightly-test: + happy-path-test: runs-on: ubuntu-latest - timeout-minutes: 60 + timeout-minutes: 20 steps: - uses: actions/setup-go@v4 with: go-version: "1.20" - - uses: actions/checkout@v3 - - - name: E2E tests - run: make test-e2e + - name: Checkout LFS objects + run: git lfs checkout + - name: Setup Go + uses: actions/setup-go@v4 + with: + go-version: "1.20" # The Go version to download (if necessary) and use. + - name: E2E happy-path test + run: go run ./tests/e2e/... --tc happy-path + changeover-test: + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/setup-go@v4 + with: + go-version: "1.20" + - uses: actions/checkout@v3 + - name: Checkout LFS objects + run: git lfs checkout + - name: Setup Go + uses: actions/setup-go@v4 + with: + go-version: "1.20" # The Go version to download (if necessary) and use. + - name: E2E changeover test + run: go run ./tests/e2e/... --tc changeover + democracy-reward-test: + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/setup-go@v4 + with: + go-version: "1.20" + - uses: actions/checkout@v3 + - name: Checkout LFS objects + run: git lfs checkout + - name: Setup Go + uses: actions/setup-go@v4 + with: + go-version: "1.20" # The Go version to download (if necessary) and use. + - name: E2E democracy-reward tests + run: go run ./tests/e2e/... --tc democracy-reward + democracy-test: + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/setup-go@v4 + with: + go-version: "1.20" + - uses: actions/checkout@v3 + - name: Checkout LFS objects + run: git lfs checkout + - name: Setup Go + uses: actions/setup-go@v4 + with: + go-version: "1.20" # The Go version to download (if necessary) and use. + - name: E2E democracy tests + run: go run ./tests/e2e/... --tc democracy + slash-throttle-test: + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/setup-go@v4 + with: + go-version: "1.20" + - uses: actions/checkout@v3 + - name: Checkout LFS objects + run: git lfs checkout + - name: Setup Go + uses: actions/setup-go@v4 + with: + go-version: "1.20" # The Go version to download (if necessary) and use. + - name: E2E slash-throttle tests + run: go run ./tests/e2e/... --tc slash-throttle + multiconsumer-test: + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/setup-go@v4 + with: + go-version: "1.20" + - uses: actions/checkout@v3 + - name: Checkout LFS objects + run: git lfs checkout + - name: Setup Go + uses: actions/setup-go@v4 + with: + go-version: "1.20" # The Go version to download (if necessary) and use. + - name: E2E multi-consumer tests + run: go run ./tests/e2e/... --tc multiconsumer nightly-test-fail: - needs: nightly-test + needs: + - happy-path-test + - changeover-test + - democracy-reward-test + - democracy-test + - slash-throttle-test + - multiconsumer-test if: ${{ failure() }} runs-on: ubuntu-latest steps: diff --git a/Makefile b/Makefile index edbacbc0e0..ac7c38f068 100644 --- a/Makefile +++ b/Makefile @@ -10,8 +10,8 @@ install: go.sum go install $(BUILD_FLAGS) ./cmd/interchain-security-sd # run all tests: unit, integration, diff, and E2E -test: - go test ./... && go run ./tests/e2e/... +test: + go test ./... && go run ./tests/e2e/... # run all unit tests test-unit: @@ -31,12 +31,12 @@ test-diff: # run only happy path E2E tests test-e2e-short: - go run ./tests/e2e/... --happy-path-only + go run ./tests/e2e/... --tc happy-path # run only happy path E2E tests with cometmock # this set of traces does not test equivocation but it does check downtime test-e2e-short-cometmock: - go run ./tests/e2e/... --cometmock-happy-path --use-cometmock --use-gorelayer + go run ./tests/e2e/... --tc happy-path-short --use-cometmock --use-gorelayer # run full E2E tests in sequence (including multiconsumer) test-e2e-multi-consumer: @@ -52,7 +52,7 @@ test-gaia-e2e: # run only happy path E2E tests using latest tagged gaia test-gaia-e2e-short: - go run ./tests/e2e/... --happy-path-only --use-gaia + go run ./tests/e2e/... --tc happy-path --use-gaia # run full E2E tests in parallel (including multiconsumer) using latest tagged gaia test-gaia-e2e-parallel: @@ -66,7 +66,7 @@ test-gaia-e2e-tagged: # run only happy path E2E tests using latest tagged gaia # usage: GAIA_TAG=v9.0.0 make test-gaia-e2e-short-tagged test-gaia-e2e-short-tagged: - go run ./tests/e2e/... --happy-path-only --use-gaia --gaia-tag $(GAIA_TAG) + go run ./tests/e2e/... --tc happy-path --use-gaia --gaia-tag $(GAIA_TAG) # run full E2E tests in parallel (including multiconsumer) using specific tagged version of gaia # usage: GAIA_TAG=v9.0.0 make test-gaia-e2e-parallel-tagged diff --git a/tests/e2e/main.go b/tests/e2e/main.go index 58bb065c26..e9336422ae 100644 --- a/tests/e2e/main.go +++ b/tests/e2e/main.go @@ -15,13 +15,26 @@ import ( "github.com/kylelemons/godebug/pretty" ) +// The list of test cases to be executed +type TestSet []string + +func (t *TestSet) Set(value string) (err error) { + // Check and skip duplicates + for _, v := range *t { + if v == value { + return + } + } + *t = append(*t, value) + return +} + +func (t *TestSet) String() string { + return fmt.Sprint(*t) +} + var ( - verbose = flag.Bool("verbose", false, "turn verbose logging on/off") - happyPathOnly = flag.Bool("happy-path-only", false, "run happy path tests only") - cometmockCompatibleHappyPath = flag.Bool("cometmock-happy-path", false, `run cometmock compatible happy path tests only. -This is like the happy path, but skips steps -that involve starting or stopping nodes for the same chain outside of the chain setup or teardown. -This is suited for CometMock+Gorelayer testing`) + verbose = flag.Bool("verbose", false, "turn verbose logging on/off") includeMultiConsumer = flag.Bool("include-multi-consumer", false, "include multiconsumer tests in run") parallel = flag.Bool("parallel", false, "run all tests in parallel") localSdkPath = flag.String("local-sdk-path", "", @@ -35,59 +48,119 @@ var ( gaiaTag = flag.String("gaia-tag", "", "gaia tag to use - default is latest") ) -// runs E2E tests -// all docker containers are built sequentially to avoid race conditions when using local cosmos-sdk -// after building docker containers, all tests are run in parallel using their respective docker containers -func main() { - flag.Parse() - - if cometmockCompatibleHappyPath != nil && *cometmockCompatibleHappyPath { - fmt.Println("=============== running short happy path only ===============") - tr := DefaultTestRun() - tr.Run(cometmockCompatibleHappyPathSteps, *localSdkPath, *useGaia, *gaiaTag) - return - } - - if happyPathOnly != nil && *happyPathOnly { - fmt.Println("=============== running happy path only ===============") - tr := DefaultTestRun() - tr.Run(happyPathSteps, *localSdkPath, *useGaia, *gaiaTag) - return - } - - testRuns := []testRunWithSteps{ - {ChangeoverTestRun(), changeoverSteps}, - {DefaultTestRun(), happyPathSteps}, - {DemocracyTestRun(true), democracySteps}, - {DemocracyTestRun(false), rewardDenomConsumerSteps}, - {SlashThrottleTestRun(), slashThrottleSteps}, - } - if includeMultiConsumer != nil && *includeMultiConsumer { - testRuns = append(testRuns, testRunWithSteps{MultiConsumerTestRun(), multipleConsumers}) +var ( + testSelection TestSet + testMap map[string]*testRunWithSteps = map[string]*testRunWithSteps{ + "happy-path-short": { + testRun: DefaultTestRun(), steps: shortHappyPathSteps, + description: `This is like the happy path, but skips steps +that involve starting or stopping nodes for the same chain outside of the chain setup or teardown. +This is suited for CometMock+Gorelayer testing`, + }, + "happy-path": {testRun: DefaultTestRun(), steps: happyPathSteps, description: "happy path tests"}, + "changeover": {testRun: ChangeoverTestRun(), steps: changeoverSteps, description: "changeover tests"}, + "democracy-reward": {testRun: DemocracyTestRun(true), steps: democracySteps, description: "democracy tests allowing rewards"}, + "democracy": {testRun: DemocracyTestRun(false), steps: rewardDenomConsumerSteps, description: "democracy tests"}, + "slash-throttle": {testRun: SlashThrottleTestRun(), steps: slashThrottleSteps, description: "slash throttle tests"}, + "multiconsumer": {testRun: MultiConsumerTestRun(), steps: multipleConsumers, description: "multi consumer tests"}, } +) - start := time.Now() +func executeTests(tests []testRunWithSteps) (err error) { if parallel != nil && *parallel { fmt.Println("=============== running all tests in parallel ===============") - var wg sync.WaitGroup - for _, run := range testRuns { + } + + var wg sync.WaitGroup + for _, testCase := range tests { + if parallel != nil && *parallel { wg.Add(1) go func(run testRunWithSteps) { defer wg.Done() - tr := run.testRun - tr.Run(run.steps, *localSdkPath, *useGaia, *gaiaTag) - }(run) + run.testRun.Run(run.steps, *localSdkPath, *useGaia, *gaiaTag) + }(testCase) + } else { + log.Printf("=============== running %s ===============\n", testCase.testRun.name) + testCase.testRun.Run(testCase.steps, *localSdkPath, *useGaia, *gaiaTag) } + } + + if parallel != nil && *parallel { wg.Wait() - fmt.Printf("TOTAL TIME ELAPSED: %v\n", time.Since(start)) - return + } + return +} + +func parseArguments() (err error) { + flag.Var(&testSelection, "tc", + fmt.Sprintf("Selection of test cases to be executed:\n%s,\n%s", + func() string { + var keys []string + for k, v := range testMap { + keys = append(keys, fmt.Sprintf("- %s : %s", k, v.description)) + } + return strings.Join(keys, "\n") + }(), + "Example: -tc multiconsumer -tc happy-path ")) + flag.Parse() + + // Enforce go-relayer in case of cometmock as hermes is not yet supported + if useCometmock != nil && *useCometmock && (useGorelayer == nil || !*useGorelayer) { + fmt.Println("Enforcing go-relayer as cometmock is requested") + if err = flag.Set("use-gorelayer", "true"); err != nil { + return + } + } + // check if specified test case exists + for _, tc := range testSelection { + if _, hasKey := testMap[tc]; !hasKey { + err := fmt.Errorf("unknown test case '%s'", tc) + return err + } + } + return +} + +func getTestCases(selection TestSet) (tests []testRunWithSteps) { + // Run default tests if no test cases were selected + if len(selection) == 0 { + selection = TestSet{ + "changeover", "happy-path", + "democracy-reward", "democracy", "slash-throttle", + } + if includeMultiConsumer != nil && *includeMultiConsumer { + selection = append(selection, "multiconsumer") + } + } + + // Get tests from selection + tests = []testRunWithSteps{} + for _, tc := range selection { + if _, exists := testMap[tc]; !exists { + log.Fatalf("Test case '%s' not found", tc) + } + tests = append(tests, *testMap[tc]) + } + return +} + +// runs E2E tests +// all docker containers are built sequentially to avoid race conditions when using local cosmos-sdk +// after building docker containers, all tests are run in parallel using their respective docker containers +func main() { + if err := parseArguments(); err != nil { + flag.Usage() + log.Fatalf("Error parsing command arguments %s\n", err) } - for _, run := range testRuns { - tr := run.testRun - tr.Run(run.steps, *localSdkPath, *useGaia, *gaiaTag) + testCases := getTestCases(testSelection) + + start := time.Now() + err := executeTests(testCases) + if err != nil { + log.Fatalf("Test execution failed '%s'", err) } - fmt.Printf("TOTAL TIME ELAPSED: %v\n", time.Since(start)) + log.Printf("TOTAL TIME ELAPSED: %v\n", time.Since(start)) } // Run sets up docker container and executes the steps in the test run. @@ -104,8 +177,9 @@ func (tr *TestRun) Run(steps []Step, localSdkPath string, useGaia bool, gaiaTag } type testRunWithSteps struct { - testRun TestRun - steps []Step + testRun TestRun + steps []Step + description string } func (tr *TestRun) runStep(step Step, verbose bool) { diff --git a/tests/e2e/steps.go b/tests/e2e/steps.go index 770ac45dda..b33d19783a 100644 --- a/tests/e2e/steps.go +++ b/tests/e2e/steps.go @@ -31,7 +31,7 @@ var happyPathSteps = concatSteps( stepsStopChain("consu", 4), // stop chain ) -var cometmockCompatibleHappyPathSteps = concatSteps( +var shortHappyPathSteps = concatSteps( stepsStartChains([]string{"consu"}, false), stepsDelegate("consu"), stepsUnbond("consu"), From ec0c46aa3b2705707f0f6793329ea618c24957ea Mon Sep 17 00:00:00 2001 From: Marius Poke Date: Mon, 14 Aug 2023 18:01:13 +0200 Subject: [PATCH 108/108] deps!: bump IBC to v7.2.0 (#1196) * bump IBC to v7.2.0 * add changelog entry --- CHANGELOG.md | 3 ++- go.mod | 15 ++++++++------- go.sum | 37 +++++++++++++++++++++---------------- 3 files changed, 31 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f5c4d215d8..9c019b885c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,8 +3,9 @@ ## [Unreleased] Add an entry to the unreleased section whenever merging a PR to main that is not targeted at a specific release. These entries will eventually be included in a release. -* `[x/ccv/provider]` (fix) [#1076](https://github.com/cosmos/interchain-security/pull/1076) Add `InitTimeoutTimestamps` and `ExportedVscSendTimestamps` to exported genesis. +* (deps!) [#1196](https://github.com/cosmos/interchain-security/pull/1196) Bump [ibc-go](https://github.com/cosmos/ibc-go) to [v7.2.0](https://github.com/cosmos/ibc-go/releases/tag/v7.2.0). +* `[x/ccv/provider]` (fix) [#1076](https://github.com/cosmos/interchain-security/pull/1076) Add `InitTimeoutTimestamps` and `ExportedVscSendTimestamps` to exported genesis. * (feat!) [#1024](https://github.com/cosmos/interchain-security/pull/1024) throttle with retries, consumer changes * (fix!) revert consumer packet data changes from #1037 [#1150](https://github.com/cosmos/interchain-security/pull/1150) * (fix!) proper deletion of pending packets [#1146](https://github.com/cosmos/interchain-security/pull/1146) diff --git a/go.mod b/go.mod index ff38553879..4e769eee32 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/cometbft/cometbft-db v0.8.0 github.com/cosmos/cosmos-sdk v0.47.3 github.com/cosmos/gogoproto v1.4.10 - github.com/cosmos/ibc-go/v7 v7.1.0 + github.com/cosmos/ibc-go/v7 v7.2.0 github.com/cosmos/ics23/go v0.10.0 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.3 @@ -19,7 +19,7 @@ require ( github.com/oxyno-zeta/gomock-extra-matcher v1.1.0 github.com/rakyll/statik v0.1.7 // indirect github.com/spf13/cast v1.5.1 - github.com/spf13/cobra v1.6.1 + github.com/spf13/cobra v1.7.0 github.com/stretchr/testify v1.8.4 github.com/tidwall/gjson v1.15.0 golang.org/x/crypto v0.11.0 // indirect @@ -92,7 +92,7 @@ require ( github.com/google/orderedcode v0.0.1 // indirect github.com/google/uuid v1.3.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.7.1 // indirect + github.com/googleapis/gax-go/v2 v2.8.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect @@ -127,7 +127,7 @@ require ( github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mtibben/percent v0.2.1 // indirect - github.com/pelletier/go-toml/v2 v2.0.7 // indirect + github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect @@ -138,7 +138,7 @@ require ( github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rs/cors v1.8.3 // indirect github.com/sasha-s/go-deadlock v0.3.1 // indirect - github.com/spf13/afero v1.9.3 // indirect + github.com/spf13/afero v1.9.5 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.4.2 // indirect @@ -156,7 +156,7 @@ require ( golang.org/x/term v0.10.0 // indirect golang.org/x/text v0.11.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.114.0 // indirect + google.golang.org/api v0.122.0 // indirect google.golang.org/appengine v1.6.7 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect @@ -166,13 +166,14 @@ require ( ) require ( - github.com/spf13/viper v1.15.0 + github.com/spf13/viper v1.16.0 google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e ) require ( cosmossdk.io/log v1.1.0 // indirect github.com/go-playground/locales v0.14.0 // indirect + github.com/google/s2a-go v0.1.3 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/rs/zerolog v1.29.1 // indirect golang.org/x/sync v0.1.0 // indirect diff --git a/go.sum b/go.sum index 4a93323e50..98f6b92736 100644 --- a/go.sum +++ b/go.sum @@ -393,8 +393,8 @@ github.com/cosmos/gogoproto v1.4.10 h1:QH/yT8X+c0F4ZDacDv3z+xE3WU1P1Z3wQoLMBRJoK github.com/cosmos/gogoproto v1.4.10/go.mod h1:3aAZzeRWpAwr+SS/LLkICX2/kDFyaYVzckBDzygIxek= github.com/cosmos/iavl v0.20.0 h1:fTVznVlepH0KK8NyKq8w+U7c2L6jofa27aFX6YGlm38= github.com/cosmos/iavl v0.20.0/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XHcl7A= -github.com/cosmos/ibc-go/v7 v7.1.0 h1:SCLgs7tqVnzdIDO5MRLgovAnc696vTTKl+8qsTu8IMM= -github.com/cosmos/ibc-go/v7 v7.1.0/go.mod h1:7MptlWeIyqmDiuJeRAFqBvXKY8Hybd+rF8vMSmGd2zg= +github.com/cosmos/ibc-go/v7 v7.2.0 h1:dx0DLUl7rxdyZ8NiT6UsrbzKOJx/w7s+BOaewFRH6cg= +github.com/cosmos/ibc-go/v7 v7.2.0/go.mod h1:OOcjKIRku/j1Xs1RgKK0yvKRrJ5iFuZYMetR1n3yMlc= github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= github.com/cosmos/ledger-cosmos-go v0.12.2 h1:/XYaBlE2BJxtvpkHiBm97gFGSGmYGKunKyF3nNqAXZA= @@ -645,6 +645,8 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.3 h1:FAgZmpLl/SXurPEZyCMPBIiiYeTbqfjlbdnCNTAkbGE= +github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -665,8 +667,8 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99 github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.8.0 h1:UBtEZqx1bjXtOQ5BVTkuYghXrr3N4V123VKJK67vJZc= +github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -754,7 +756,6 @@ github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1: github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= @@ -964,8 +965,8 @@ github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144T github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml/v2 v2.0.7 h1:muncTPStnKRos5dpVKULv2FVd4bMOhNePj9CjgDb8Us= -github.com/pelletier/go-toml/v2 v2.0.7/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= @@ -1065,15 +1066,15 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasO github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= -github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= -github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -1082,8 +1083,8 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= -github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= +github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= +github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= @@ -1103,6 +1104,7 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= @@ -1207,7 +1209,8 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1307,6 +1310,7 @@ golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -1489,6 +1493,7 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= @@ -1628,8 +1633,8 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.122.0 h1:zDobeejm3E7pEG1mNHvdxvjs5XJoCMzyNH+CmwL94Es= +google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=