diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 381bb7eaae9..cecb537ecc9 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -43,7 +43,7 @@ write a little note why.
- [ ] Targeted PR against correct branch (see [CONTRIBUTING.md](https://github.com/cosmos/ibc-go/blob/master/CONTRIBUTING.md#pr-targeting)).
- [ ] Linked to Github issue with discussion and accepted design OR link to spec that describes this work.
-- [ ] Code follows the [module structure standards](https://github.com/cosmos/cosmos-sdk/blob/main/docs/docs/building-modules/10-structure.md) and [Go style guide](../docs/dev/go-style-guide.md).
+- [ ] Code follows the [module structure standards](https://github.com/cosmos/cosmos-sdk/blob/main/docs/docs/building-modules/11-structure.md) and [Go style guide](../docs/dev/go-style-guide.md).
- [ ] Wrote unit and integration [tests](https://github.com/cosmos/ibc-go/blob/master/CONTRIBUTING.md#testing).
- [ ] Updated relevant documentation (`docs/`) or specification (`x//spec/`).
- [ ] Added relevant `godoc` [comments](https://blog.golang.org/godoc-documenting-go-code).
diff --git a/.github/workflows/build-simd-image-from-tag.yml b/.github/workflows/build-simd-image-from-tag.yml
deleted file mode 100644
index fb3d481d6cd..00000000000
--- a/.github/workflows/build-simd-image-from-tag.yml
+++ /dev/null
@@ -1,37 +0,0 @@
-name: Build Simd Image
-on:
- workflow_dispatch:
- inputs:
- tag:
- description: 'The tag of the image to build'
- required: true
- type: string
-
-env:
- REGISTRY: ghcr.io
- ORG: cosmos
- IMAGE_NAME: ibc-go-simd
- GIT_TAG: "${{ inputs.tag }}"
-
-jobs:
- build-image-at-tag:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v3
- with:
- ref: "${{ env.GIT_TAG }}"
- fetch-depth: 0
- - name: Log in to the Container registry
- uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
- with:
- registry: ${{ env.REGISTRY }}
- username: ${{ github.actor }}
- password: ${{ secrets.GITHUB_TOKEN }}
- - name: Fetch latest Dockerfile
- run: curl https://raw.githubusercontent.com/cosmos/ibc-go/main/Dockerfile -o Dockerfile
- - name: Build image
- run: |
- # remove any `/` characters from the docker tag and replace them with a -
- docker_tag="$(echo $GIT_TAG | sed 's/\//-/')"
- docker build . -t "${REGISTRY}/${ORG}/${IMAGE_NAME}:${docker_tag}"
- docker push "${REGISTRY}/${ORG}/${IMAGE_NAME}:${docker_tag}"
diff --git a/.github/workflows/e2e-compatibility-unreleased.yaml b/.github/workflows/e2e-compatibility-unreleased.yaml
deleted file mode 100644
index 19be796dd9f..00000000000
--- a/.github/workflows/e2e-compatibility-unreleased.yaml
+++ /dev/null
@@ -1,49 +0,0 @@
-name: Compatibility E2E (Unreleased)
-on:
- workflow_dispatch:
- inputs:
- release-branch:
- description: 'Select unreleased to run all release branches against each other'
- required: true
- type: choice
- options:
- - unreleased
-
-env:
- REGISTRY: ghcr.io
- ORG: cosmos
- IMAGE_NAME: ibc-go-simd
- RELEASE_BRANCH: '${{ inputs.release-branch }}'
-
-jobs:
- transfer:
- needs:
- - build-release-images
- uses: ./.github/workflows/e2e-compatibility-workflow-call.yaml
- with:
- test-file-directory: "unreleased"
- test-suite: "transfer"
-
- connection:
- needs:
- - build-release-images
- uses: ./.github/workflows/e2e-compatibility-workflow-call.yaml
- with:
- test-file-directory: "unreleased"
- test-suite: "connection"
-
- client:
- needs:
- - build-release-images
- uses: ./.github/workflows/e2e-compatibility-workflow-call.yaml
- with:
- test-file-directory: "unreleased"
- test-suite: "client"
-
- incentivized-transfer:
- needs:
- - build-release-images
- uses: ./.github/workflows/e2e-compatibility-workflow-call.yaml
- with:
- test-file-directory: "unreleased"
- test-suite: "incentivized-transfer"
\ No newline at end of file
diff --git a/.github/workflows/e2e-compatibility-workflow-call.yaml b/.github/workflows/e2e-compatibility-workflow-call.yaml
deleted file mode 100644
index 84f7a0da70f..00000000000
--- a/.github/workflows/e2e-compatibility-workflow-call.yaml
+++ /dev/null
@@ -1,55 +0,0 @@
-on:
- workflow_call:
- inputs:
- test-file-directory:
- description: 'Directory containing compatibility matrices'
- required: true
- type: string
- test-suite:
- description: "Test suite to run"
- required: true
- type: string
-
-jobs:
- load-test-matrix:
- outputs:
- test-matrix: ${{ steps.set-test-matrix.outputs.test-matrix }}
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v3
- - uses: andstor/file-existence-action@v2
- with:
- files: ".github/compatibility-test-matrices/${{ inputs.test-file-directory }}/${{ inputs.test-suite }}.json"
- - run: |
- # use jq -c to put the full json contents on a single line. This is required when using the json body
- # to create the matrix in the following job.
- test_matrix="$(cat .github/compatibility-test-matrices/${{ inputs.test-file-directory }}/${{ inputs.test-suite }}.json | jq -c)"
- echo $test_matrix
- echo "test-matrix=$test_matrix" >> $GITHUB_OUTPUT
- id: set-test-matrix
-
- e2e:
- runs-on: ubuntu-latest
- needs: load-test-matrix
- if: needs.load-test-matrix.outputs.test-matrix
- strategy:
- fail-fast: false
- matrix: ${{ fromJSON(needs.load-test-matrix.outputs.test-matrix) }}
- steps:
- - name: Checkout the ibc-go repo
- uses: actions/checkout@v3
- with:
- repository: cosmos/ibc-go
- - uses: actions/setup-go@v3
- with:
- go-version: 1.19
- - name: Run e2e Test
- run: |
- cd e2e
- make e2e-test entrypoint=${{ matrix.entrypoint }} test=${{ matrix.test }}
- env:
- # each test has its own set of variables to specify which images are used.
- CHAIN_IMAGE: "${{ matrix.chain-image }}"
- CHAIN_A_TAG: "${{ matrix.chain-a }}"
- CHAIN_B_TAG: "${{ matrix.chain-b }}"
- CHAIN_BINARY: "${{ matrix.chain-binary }}"
diff --git a/.github/workflows/e2e-compatibility.yaml b/.github/workflows/e2e-compatibility.yaml
deleted file mode 100644
index 2d2c1dec237..00000000000
--- a/.github/workflows/e2e-compatibility.yaml
+++ /dev/null
@@ -1,184 +0,0 @@
-name: Compatibility E2E
-on:
- workflow_dispatch:
- inputs:
- release-branch:
- description: 'Release branch to test'
- required: true
- type: choice
- options:
- - release/v2.5.x
- - release/v3.4.x
- - release/v4.2.x
- - release/v4.3.x
- - release/v5.2.x
- - release/v6.1.x
- - main
-
-env:
- REGISTRY: ghcr.io
- ORG: cosmos
- IMAGE_NAME: ibc-go-simd
- RELEASE_BRANCH: '${{ inputs.release-branch }}'
-
-jobs:
- determine-test-directory:
- runs-on: ubuntu-latest
- outputs:
- test-directory: ${{ steps.set-test-dir.outputs.test-directory }}
- steps:
- - run: |
- test_dir="$(echo $RELEASE_BRANCH | sed 's/\//-/')"
- echo $test_dir
- echo "test-directory=$test_dir" >> $GITHUB_OUTPUT
- id: set-test-dir
-
- # build-release-images builds all docker images that are relevant for the compatibility tests. If a single release
- # branch is specified, only that image will be built, e.g. release-v6.0.x.
- build-release-images:
- runs-on: ubuntu-latest
- strategy:
- matrix:
- release-branch:
- - release/v2.5.x
- - release/v3.4.x
- - release/v4.2.x
- - release/v4.3.x
- - release/v5.2.x
- - release/v6.1.x
- - main
- steps:
- - uses: actions/checkout@v3
- if: env.RELEASE_BRANCH == matrix.release-branch
- with:
- ref: "${{ matrix.release-branch }}"
- fetch-depth: 0
- - name: Log in to the Container registry
- if: env.RELEASE_BRANCH == matrix.release-branch
- uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
- with:
- registry: ${{ env.REGISTRY }}
- username: ${{ github.actor }}
- password: ${{ secrets.GITHUB_TOKEN }}
- - name: Fetch Makefile dependencies
- if: env.RELEASE_BRANCH == matrix.release-branch
- run: |
- mkdir -p contrib/devtools
- curl https://raw.githubusercontent.com/cosmos/ibc-go/main/contrib/devtools/Makefile -o contrib/devtools/Makefile
- - name: Fetch latest Dockerfile
- if: env.RELEASE_BRANCH == matrix.release-branch
- run: curl https://raw.githubusercontent.com/cosmos/ibc-go/main/Dockerfile -o Dockerfile
- - name: Build image
- if: env.RELEASE_BRANCH == matrix.release-branch
- run: |
- docker_tag="$(echo ${{ matrix.release-branch }} | sed 's/\//-/')"
- docker build . -t "${REGISTRY}/${ORG}/${IMAGE_NAME}:$docker_tag"
- docker push "${REGISTRY}/${ORG}/${IMAGE_NAME}:$docker_tag"
-
- transfer-chain-a:
- needs:
- - build-release-images
- - determine-test-directory
- uses: ./.github/workflows/e2e-compatibility-workflow-call.yaml
- with:
- test-file-directory: "${{ needs.determine-test-directory.outputs.test-directory }}"
- test-suite: "transfer-chain-a"
-
- transfer-chain-b:
- needs:
- - build-release-images
- - determine-test-directory
- uses: ./.github/workflows/e2e-compatibility-workflow-call.yaml
- with:
- test-file-directory: "${{ needs.determine-test-directory.outputs.test-directory }}"
- test-suite: "transfer-chain-b"
-
- connection-chain-a:
- needs:
- - build-release-images
- - determine-test-directory
- uses: ./.github/workflows/e2e-compatibility-workflow-call.yaml
- with:
- test-file-directory: "${{ needs.determine-test-directory.outputs.test-directory }}"
- test-suite: "connection-chain-a"
-
- connection-chain-b:
- needs:
- - build-release-images
- - determine-test-directory
- uses: ./.github/workflows/e2e-compatibility-workflow-call.yaml
- with:
- test-file-directory: "${{ needs.determine-test-directory.outputs.test-directory }}"
- test-suite: "connection-chain-b"
-
- client-chain-a:
- needs:
- - build-release-images
- - determine-test-directory
- uses: ./.github/workflows/e2e-compatibility-workflow-call.yaml
- with:
- test-file-directory: "${{ needs.determine-test-directory.outputs.test-directory }}"
- test-suite: "client-chain-a"
-
- client-chain-b:
- needs:
- - build-release-images
- - determine-test-directory
- uses: ./.github/workflows/e2e-compatibility-workflow-call.yaml
- with:
- test-file-directory: "${{ needs.determine-test-directory.outputs.test-directory }}"
- test-suite: "client-chain-b"
-
- incentivized-transfer-chain-a:
- needs:
- - build-release-images
- - determine-test-directory
- uses: ./.github/workflows/e2e-compatibility-workflow-call.yaml
- with:
- test-file-directory: "${{ needs.determine-test-directory.outputs.test-directory }}"
- test-suite: "incentivized-transfer-chain-a"
-
- incentivized-transfer-chain-b:
- needs:
- - build-release-images
- - determine-test-directory
- uses: ./.github/workflows/e2e-compatibility-workflow-call.yaml
- with:
- test-file-directory: "${{ needs.determine-test-directory.outputs.test-directory }}"
- test-suite: "incentivized-transfer-chain-b"
-
- ica-chain-a:
- needs:
- - build-release-images
- - determine-test-directory
- uses: ./.github/workflows/e2e-compatibility-workflow-call.yaml
- with:
- test-file-directory: "${{ needs.determine-test-directory.outputs.test-directory }}"
- test-suite: "ica-chain-a"
-
- incentivized-ica-chain-a:
- needs:
- - build-release-images
- - determine-test-directory
- uses: ./.github/workflows/e2e-compatibility-workflow-call.yaml
- with:
- test-file-directory: "${{ needs.determine-test-directory.outputs.test-directory }}"
- test-suite: "incentivized-ica-chain-a"
-
- ica-groups-chain-a:
- needs:
- - build-release-images
- - determine-test-directory
- uses: ./.github/workflows/e2e-compatibility-workflow-call.yaml
- with:
- test-file-directory: "${{ needs.determine-test-directory.outputs.test-directory }}"
- test-suite: "ica-groups-chain-a"
-
- ica-gov-chain-a:
- needs:
- - build-release-images
- - determine-test-directory
- uses: ./.github/workflows/e2e-compatibility-workflow-call.yaml
- with:
- test-file-directory: "${{ needs.determine-test-directory.outputs.test-directory }}"
- test-suite: "ica-gov-chain-a"
diff --git a/.github/workflows/e2e-fork.yml b/.github/workflows/e2e-fork.yml
deleted file mode 100644
index b559110257c..00000000000
--- a/.github/workflows/e2e-fork.yml
+++ /dev/null
@@ -1,51 +0,0 @@
-name: Tests / E2E Fork
-on:
- workflow_dispatch:
- pull_request:
- branches:
- - main
- paths-ignore:
- - "docs/**"
- - "**.md"
- - "LICENSE"
-
-jobs:
- # dynamically build a matrix of test/test suite pairs to run
- build-test-matrix:
- if: ${{ github.event.pull_request.head.repo.fork || github.actor == 'dependabot[bot]' || github.event_name == 'workflow_dispatch' }}
- runs-on: ubuntu-latest
- outputs:
- matrix: ${{ steps.set-matrix.outputs.matrix }}
- steps:
- - uses: actions/checkout@v3
- - uses: actions/setup-go@v3
- with:
- go-version: 1.19
- - id: set-matrix
- run: echo "matrix=$(go run cmd/build_test_matrix/main.go)" >> $GITHUB_OUTPUT
- env:
- TEST_EXCLUSIONS: "TestInterTxTestSuite,TestIncentivizedInterTxTestSuite,TestUpgradeTestSuite"
-
- e2e:
- env:
- CHAIN_A_TAG: latest
- CHAIN_IMAGE: ibc-go-simd
- if: ${{ github.event.pull_request.head.repo.fork || github.actor == 'dependabot[bot]' || github.event_name == 'workflow_dispatch' }}
- needs:
- - build-test-matrix
- runs-on: ubuntu-latest
- strategy:
- fail-fast: false
- matrix: ${{ fromJSON(needs.build-test-matrix.outputs.matrix) }}
- steps:
- - uses: actions/checkout@v3
- - name: Docker Build
- run: docker build . -t "${CHAIN_IMAGE}:${CHAIN_A_TAG}"
- - name: Setup Go
- uses: actions/setup-go@v3
- with:
- go-version: 1.19
- - name: Run e2e Test
- run: |
- cd e2e
- make e2e-test entrypoint=${{ matrix.entrypoint }} test=${{ matrix.test }}
diff --git a/.github/workflows/e2e-manual-icad.yaml b/.github/workflows/e2e-manual-icad.yaml
deleted file mode 100644
index dfb980c494f..00000000000
--- a/.github/workflows/e2e-manual-icad.yaml
+++ /dev/null
@@ -1,59 +0,0 @@
-name: Manual E2E (Icad)
-on:
- # when https://github.com/community/community/discussions/11795 is resolved
- # we will be able to dynamically build up the list of valid inputs.
- # for now this needs to be manual.
- workflow_dispatch:
- inputs:
- test-entry-point:
- description: 'Test entry point'
- required: true
- type: choice
- options:
- - TestInterTxTestSuite
- - TestIncentivizedInterTxTestSuite
- - TestUpgradeTestSuite
- chain-image:
- description: 'The image to use for chain A'
- required: true
- type: string
- default: "ghcr.io/cosmos/ibc-go-icad"
- chain-a-tag:
- description: 'The tag to use for chain A'
- required: true
- type: choice
- default: master
- options:
- - master
- - v0.4.3
- - v0.3.6
- - v0.2.5
- - v0.1.7
- chain-b-tag:
- default: master
- description: 'The tag to use for chain B'
- required: true
- type: choice
- options:
- - master
- - v0.4.3
- - v0.3.6
- - v0.2.5
- - v0.1.7
- relayer-tag:
- description: 'The tag to use for the relayer'
- required: true
- default: "v2.1.2"
- type: string
-
-
-jobs:
- e2e-manual:
- uses: ./.github/workflows/e2e-test-workflow-call.yml
- with:
- chain-image: "${{ github.event.inputs.chain-image }}"
- chain-a-tag: "${{ github.event.inputs.chain-a-tag }}"
- chain-b-tag: "${{ github.event.inputs.chain-b-tag }}"
- relayer-tag: "${{ github.event.inputs.relayer-tag }}"
- test-entry-point: "${{ github.event.inputs.test-entry-point }}"
- chain-binary: "icad"
diff --git a/.github/workflows/e2e-manual-simd.yaml b/.github/workflows/e2e-manual-simd.yaml
deleted file mode 100644
index 5fd0176e835..00000000000
--- a/.github/workflows/e2e-manual-simd.yaml
+++ /dev/null
@@ -1,71 +0,0 @@
-name: Manual E2E (Simd)
-on:
- # when https://github.com/community/community/discussions/11795 is resolved
- # we will be able to dynamically build up the list of valid inputs.
- # for now this needs to be manual.
- workflow_dispatch:
- inputs:
- test-entry-point:
- description: 'Test entry point'
- required: true
- type: choice
- options:
- - TestTransferTestSuite
- - TestIncentivizedTransferTestSuite
- - TestConnectionTestSuite
- - TestInterchainAccountsTestSuite
- - TestInterchainAccountsGroupsTestSuite
- - TestInterchainAccountsGovTestSuite
- - TestIncentivizedInterchainAccountsTestSuite
- chain-image:
- description: 'The image to use for chain A'
- required: true
- type: string
- default: "ghcr.io/cosmos/ibc-go-simd"
- chain-a-tag:
- description: 'The tag to use for chain A'
- required: true
- type: choice
- default: main
- options:
- - main
- - v6.1.0
- - v5.2.0
- - v4.2.0
- - v4.1.1
- - v3.4.0
- - v3.3.1
- - v2.5.0
- - v2.4.2
- chain-b-tag:
- default: v6.0.0
- description: 'The tag to use for chain B'
- required: true
- type: choice
- options:
- - main
- - v6.1.0
- - v5.2.0
- - v4.2.0
- - v4.1.1
- - v3.4.0
- - v3.3.1
- - v2.5.0
- - v2.4.2
- relayer-tag:
- description: 'The tag to use for the relayer'
- required: true
- default: "v2.1.2"
- type: string
-
-
-jobs:
- e2e-manual:
- uses: ./.github/workflows/e2e-test-workflow-call.yml
- with:
- chain-image: "${{ github.event.inputs.chain-image }}"
- chain-a-tag: "${{ github.event.inputs.chain-a-tag }}"
- chain-b-tag: "${{ github.event.inputs.chain-b-tag }}"
- relayer-tag: "${{ github.event.inputs.relayer-tag }}"
- test-entry-point: "${{ github.event.inputs.test-entry-point }}"
- chain-binary: "simd"
diff --git a/.github/workflows/e2e-test-workflow-call.yml b/.github/workflows/e2e-test-workflow-call.yml
deleted file mode 100644
index 1967eaa20fe..00000000000
--- a/.github/workflows/e2e-test-workflow-call.yml
+++ /dev/null
@@ -1,131 +0,0 @@
-on:
- workflow_call:
- inputs:
- test-entry-point:
- description: "Test entry point"
- required: false
- type: string
- default: "" # empty string means run all tests
- test-exclusions:
- description: "Comma separated list of tests to skip"
- required: false
- type: string
- default: "" # empty string means don't skip any test.
- chain-image:
- description: "The image to use for chains"
- required: true
- type: string
- default: "ghcr.io/cosmos/ibc-go-simd"
- chain-a-tag:
- description: "The tag to use for chain A"
- required: true
- type: string
- default: main
- chain-b-tag:
- default: v4.0.0
- description: "The tag to use for chain B"
- required: true
- type: string
- chain-binary:
- default: "simd"
- description: "The chain binary"
- required: false
- type: string
- relayer-tag:
- description: "The tag to use for the relayer"
- required: false
- default: "v2.1.2"
- type: string
- build-and-push-docker-image:
- description: "Flag to specify if the docker image should be built and pushed beforehand"
- required: false
- type: boolean
- default: false
-
-env:
- REGISTRY: ghcr.io
- IMAGE_NAME: ibc-go-simd
-
-jobs:
- test-details:
- runs-on: ubuntu-latest
- steps:
- - name: Display Inputs
- run: |
- echo "Chain Image: ${{ inputs.chain-image }}"
- echo "Chain A Tag: ${{ inputs.chain-a-tag }}"
- echo "Chain B Tag: ${{ inputs.chain-b-tag }}"
- echo "Relayer Tag: ${{ inputs.relayer-tag }}"
- echo "Test Entry Point: ${{ inputs.test-entry-point }}"
-
- # we skip individual steps rather than the full job as e2e-tests will not run if this task
- # is skipped. But will run if every individual task is skipped. There is no current way of conditionally needing
- # a job.
- docker-build:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v3
- if: ${{ inputs.build-and-push-docker-image }}
- - name: Log in to the Container registry
- if: ${{ inputs.build-and-push-docker-image }}
- uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
- with:
- registry: ${{ env.REGISTRY }}
- username: ${{ github.actor }}
- password: ${{ secrets.GITHUB_TOKEN }}
-
- - name: Extract metadata (tags, labels) for Docker
- if: ${{ inputs.build-and-push-docker-image }}
- id: meta
- uses: docker/metadata-action@507c2f2dc502c992ad446e3d7a5dfbe311567a96
- with:
- images: ${{ env.REGISTRY }}/cosmos/${{ env.IMAGE_NAME }}
-
- - name: Build and push Docker image
- if: ${{ inputs.build-and-push-docker-image }}
- uses: docker/build-push-action@37abcedcc1da61a57767b7588cb9d03eb57e28b3
- with:
- context: .
- push: true
- tags: ${{ steps.meta.outputs.tags }}
- labels: ${{ steps.meta.outputs.labels }}
-
- # dynamically build a matrix of test/test suite pairs to run
- build-test-matrix:
- runs-on: ubuntu-latest
- outputs:
- matrix: ${{ steps.set-matrix.outputs.matrix }}
- steps:
- - uses: actions/checkout@v3
- - uses: actions/setup-go@v3
- with:
- go-version: 1.19
- - id: set-matrix
- run: echo "matrix=$(go run cmd/build_test_matrix/main.go)" >> $GITHUB_OUTPUT
- env:
- TEST_ENTRYPOINT: "${{ inputs.test-entry-point }}"
- TEST_EXCLUSIONS: "${{ inputs.test-exclusions }}"
-
- e2e-tests:
- runs-on: ubuntu-latest
- needs:
- - build-test-matrix
- - docker-build
- env:
- CHAIN_IMAGE: "${{ inputs.chain-image }}"
- CHAIN_A_TAG: "${{ inputs.chain-a-tag }}"
- CHAIN_B_TAG: "${{ inputs.chain-b-tag }}"
- RLY_TAG: "${{ inputs.relayer-tag }}"
- CHAIN_BINARY: "${{ inputs.chain-binary }}"
- strategy:
- fail-fast: false
- matrix: ${{ fromJSON(needs.build-test-matrix.outputs.matrix) }}
- steps:
- - uses: actions/checkout@v3
- - uses: actions/setup-go@v3
- with:
- go-version: 1.19
- - name: Run e2e Test
- run: |
- cd e2e
- make e2e-test entrypoint=${{ matrix.entrypoint }} test=${{ matrix.test }}
diff --git a/.github/workflows/e2e-upgrade.yaml b/.github/workflows/e2e-upgrade.yaml
deleted file mode 100644
index bfcd2db0e66..00000000000
--- a/.github/workflows/e2e-upgrade.yaml
+++ /dev/null
@@ -1,42 +0,0 @@
-name: Tests / E2E Upgrade
-on: workflow_dispatch
-
-jobs:
- upgrade-tests:
- runs-on: ubuntu-latest
- strategy:
- fail-fast: false
- matrix:
- include:
- - test: TestV4ToV5ChainUpgrade
- chain-image: ghcr.io/cosmos/ibc-go-simd
- chain-a-tag: v4.2.0
- chain-b-tag: v4.2.0
- chain-upgrade-tag: v5.1.0
- - test: TestV5ToV6ChainUpgrade
- chain-image: ghcr.io/cosmos/ibc-go-icad
- chain-binary: icad
- chain-a-tag: v0.3.5
- chain-b-tag: v0.3.5
- chain-upgrade-tag: v0.4.1
- - test: TestV6ToV7ChainUpgrade
- chain-image: ghcr.io/cosmos/ibc-go-simd
- chain-binary: simd
- chain-a-tag: v6.0.0
- chain-b-tag: v6.0.0
- chain-upgrade-tag: v7.0.0
- steps:
- - uses: actions/checkout@v3
- - uses: actions/setup-go@v3
- with:
- go-version: 1.19
- - name: Run e2e upgrade test
- run: |
- cd e2e
- make e2e-test entrypoint=TestUpgradeTestSuite test=${{ matrix.test }}
- env:
- CHAIN_IMAGE: ${{ matrix.chain-image }}
- CHAIN_BINARY: ${{ matrix.chain-binary }}
- CHAIN_A_TAG: ${{ matrix.chain-a-tag }}
- CHAIN_B_TAG: ${{ matrix.chain-b-tag }}
- CHAIN_UPGRADE_TAG: ${{ matrix.chain-upgrade-tag }}
diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml
deleted file mode 100644
index 64a459b9415..00000000000
--- a/.github/workflows/e2e.yaml
+++ /dev/null
@@ -1,51 +0,0 @@
-name: Tests / E2E
-on:
- workflow_dispatch:
- pull_request:
- paths-ignore:
- - "docs/**"
- - "**.md"
- - "LICENSE"
- push:
- branches:
- - main
- paths-ignore:
- - "docs/**"
- - "**.md"
- - "LICENSE"
-
-jobs:
- determine-image-tag:
- if: ${{ !github.event.pull_request.head.repo.fork && github.actor != 'dependabot[bot]' }}
- runs-on: ubuntu-latest
- outputs:
- simd-tag: ${{ steps.get-tag.outputs.simd-tag }}
- steps:
- - uses: actions/checkout@v3
- - uses: actions/setup-go@v3
- with:
- go-version: 1.18
- - id: get-tag
- run: |
- if [ -z "${{ github.event.pull_request.number }}" ]
- then
- echo "simd-tag=main" >> $GITHUB_OUTPUT
- else
- tag="pr-${{ github.event.pull_request.number }}"
- echo "Using tag $tag"
- echo "simd-tag=$tag" >> $GITHUB_OUTPUT
- fi
- e2e:
- if: ${{ !github.event.pull_request.head.repo.fork && github.actor != 'dependabot[bot]' }}
- needs:
- - determine-image-tag
- uses: ./.github/workflows/e2e-test-workflow-call.yml
- secrets: inherit
- with:
- build-and-push-docker-image: true
- chain-image: ghcr.io/cosmos/ibc-go-simd
- chain-a-tag: "${{ needs.determine-image-tag.outputs.simd-tag }}"
- chain-b-tag: "${{ needs.determine-image-tag.outputs.simd-tag }}"
- chain-binary: "simd"
- # on regular PRs we won't run interchain account or upgrade tests.
- test-exclusions: "TestInterTxTestSuite,TestIncentivizedInterTxTestSuite,TestUpgradeTestSuite"
diff --git a/.github/workflows/golangci.yml b/.github/workflows/golangci.yml
index 9d08d91ad50..f329737cd8f 100644
--- a/.github/workflows/golangci.yml
+++ b/.github/workflows/golangci.yml
@@ -22,5 +22,5 @@ jobs:
- name: golangci-lint
uses: golangci/golangci-lint-action@v3.3.1
with:
- version: latest
+ version: v1.51.2
args: --timeout 5m
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 85961bfc954..5c71af9b5fc 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -21,7 +21,7 @@ jobs:
- uses: actions/setup-go@v3
with:
- go-version: '1.18'
+ go-version: '1.19'
- name: Release
uses: goreleaser/goreleaser-action@v4
@@ -51,4 +51,5 @@ jobs:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
- labels: ${{ steps.meta.outputs.labels }}
+ build-args: |
+ IBC_GO_VERSION=${{ github.ref_name }}
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 16f7fb5a421..55253585d34 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -51,14 +51,13 @@ jobs:
go.sum
- name: Build ibc-go
run: GOARCH=${{ matrix.go-arch }} LEDGER_ENABLED=false make build
- - name: Build e2e
- run: |
- cd e2e
- test_dirs="$(ls -A tests)"
- for td in $test_dirs
- do
- GOARCH=${{ matrix.go-arch }} go test -c "./tests/${td}"
- done
+
+ docker-build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - name: Docker Build
+ run: docker build . --no-cache --build-arg IBC_GO_VERSION=v7.0.0
split-test-files:
runs-on: ubuntu-latest
diff --git a/.gitignore b/.gitignore
index e821f35d7e7..3d4c189b8ce 100644
--- a/.gitignore
+++ b/.gitignore
@@ -32,6 +32,7 @@ mytestnet
coverage.txt
profile.out
sim_log_file
+e2e
# Vagrant
.vagrant/
diff --git a/.golangci.yml b/.golangci.yml
index 15f140f2025..76204d5471c 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -29,7 +29,7 @@ linters:
issues:
exclude-rules:
- - text: "SA1019: suite.chainA.GetSimApp().ICAControllerKeeper.SendTx is deprecated: this is a legacy API that is only intended to function correctly in workflows where an underlying application has been set. Prior to to v6.x.x of ibc-go, the controller module was only functional as middleware, with authentication performed by the underlying application. For a full summary of the changes in v6.x.x, please see ADR009. This API will be removed in later releases."
+ - text: "SA1019:"
linters:
- staticcheck
- text: "Use of weak random number generator"
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 35bdb13851c..38f520e985a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -34,11 +34,44 @@ Ref: https://keepachangelog.com/en/1.0.0/
# Changelog
-## [Unreleased]
+## [v7.2.0](https://github.com/cosmos/ibc-go/releases/tag/v7.2.0) - 2023-06-22
### Dependencies
-* [\#2999](https://github.com/cosmos/ibc-go/pull/2999) Bump Cosmos SDK to v0.46.7 and Tendermint to v0.34.24.
+* [\#3810](https://github.com/cosmos/ibc-go/pull/3810) Update Cosmos SDK to v0.47.3.
+* [\#3862](https://github.com/cosmos/ibc-go/pull/3862) Update CometBFT to v0.37.2.
+
+### State Machine Breaking
+
+* [\#3907](https://github.com/cosmos/ibc-go/pull/3907) Re-implemented missing functions of `LegacyMsg` interface to fix transaction signing with ledger.
+
+## [v7.1.0](https://github.com/cosmos/ibc-go/releases/tag/v7.1.0) - 2023-06-09
+
+### Dependencies
+
+* [\#3542](https://github.com/cosmos/ibc-go/pull/3542) Update Cosmos SDK to v0.47.2 and CometBFT to v0.37.1.
+* [\#3457](https://github.com/cosmos/ibc-go/pull/3457) Update to ics23 v0.10.0.
+
+### Improvements
+
+* (apps/transfer) [\#3454](https://github.com/cosmos/ibc-go/pull/3454) Support transfer authorization unlimited spending when the max `uint256` value is provided as limit.
+
+### Features
+
+* (light-clients/09-localhost) [\#3229](https://github.com/cosmos/ibc-go/pull/3229) Implementation of v2 of localhost loopback client.
+* (apps/transfer) [\#3019](https://github.com/cosmos/ibc-go/pull/3019) Add state entry to keep track of total amount of tokens in escrow.
+
+### Bug Fixes
+
+* (core/04-channel) [\#3346](https://github.com/cosmos/ibc-go/pull/3346) Properly handle ordered channels in `UnreceivedPackets` query.
+* (core/04-channel) [\#3593](https://github.com/cosmos/ibc-go/pull/3593) `SendPacket` now correctly returns `ErrClientNotFound` in favour of `ErrConsensusStateNotFound`.
+
+## [v7.0.0](https://github.com/cosmos/ibc-go/releases/tag/v6.1.0) - 2023-03-17
+
+### Dependencies
+
+* [#2672](https://github.com/cosmos/ibc-go/issues/2672) Update to cosmos-sdk v0.47.
+* [#3175](https://github.com/cosmos/ibc-go/issues/3175) Migrate to cometbft v0.37.
### API Breaking
@@ -59,15 +92,21 @@ Ref: https://keepachangelog.com/en/1.0.0/
* (07-tendermint) [\#1896](https://github.com/cosmos/ibc-go/pull/1896) Remove error return from `IterateConsensusStateAscending` in `07-tendermint`.
* (apps/27-interchain-accounts) [\#2638](https://github.com/cosmos/ibc-go/pull/2638) Interchain accounts host and controller Keepers now expects a keeper which fulfills the expected `exported.ScopedKeeper` interface for the capability keeper.
* (06-solomachine) [\#2761](https://github.com/cosmos/ibc-go/pull/2761) Removed deprecated `ClientId` field from `Misbehaviour` and `allow_update_after_proposal` field from `ClientState`.
-
+* (apps) [\#3154](https://github.com/cosmos/ibc-go/pull/3154) Remove unused `ProposalContents` function.
+* (apps) [#3149](https://github.com/cosmos/ibc-go/pull/3149) Remove legacy interface function `RandomizedParams`, which is no longer used.
+* (light-clients/06-solomachine) [#2941](https://github.com/cosmos/ibc-go/pull/2941) Remove solomachine header sequence.
+* (core) [#2982](https://github.com/cosmos/ibc-go/pull/2982) Moved the ibc module name into the exported package.
+
### State Machine Breaking
* (06-solomachine) [\#2744](https://github.com/cosmos/ibc-go/pull/2744) `Misbehaviour.ValidateBasic()` now only enforces that signature data does not match when the signature paths are different.
* (06-solomachine) [\#2748](https://github.com/cosmos/ibc-go/pull/2748) Adding sentinel value for header path in 06-solomachine.
* (apps/29-fee) [\#2942](https://github.com/cosmos/ibc-go/pull/2942) Check `x/bank` send enabled before escrowing fees.
+* (core/04-channel) [#3009](https://github.com/cosmos/ibc-go/pull/3009) Change check to disallow optimistic sends.
### Improvements
+* (core) [\#3082](https://github.com/cosmos/ibc-go/pull/3082) Add `HasConnection` and `HasChannel` methods.
* (tests) [\#2926](https://github.com/cosmos/ibc-go/pull/2926) Lint tests
* (apps/transfer) [\#2643](https://github.com/cosmos/ibc-go/pull/2643) Add amount, denom, and memo to transfer event emission.
* (core) [\#2746](https://github.com/cosmos/ibc-go/pull/2746) Allow proof height to be zero for all core IBC `sdk.Msg` types that contain proofs.
@@ -76,13 +115,13 @@ Ref: https://keepachangelog.com/en/1.0.0/
* (modules/core/02-client) [\#1188](https://github.com/cosmos/ibc-go/pull/1188/files) Routing `MsgSubmitMisbehaviour` to `UpdateClient` keeper function. Deprecating `SubmitMisbehaviour` endpoint.
* (modules/core/02-client) [\#1208](https://github.com/cosmos/ibc-go/pull/1208) Replace `CheckHeaderAndUpdateState` usage in 02-client with calls to `VerifyClientMessage`, `CheckForMisbehaviour`, `UpdateStateOnMisbehaviour` and `UpdateState`.
* (modules/light-clients/09-localhost) [\#1187](https://github.com/cosmos/ibc-go/pull/1187/) Removing localhost light client implementation as it is not functional. An upgrade handler is provided in `modules/migrations/v5` to prune `09-localhost` clients and consensus states from the store.
-* [\#1186](https://github.com/cosmos/ibc-go/pull/1186/files) Removing `GetRoot` function from ConsensusState interface in `02-client`. `GetRoot` is unused by core IBC.
+* (modules/core/02-client) [\#1186](https://github.com/cosmos/ibc-go/pull/1186) Removing `GetRoot` function from ConsensusState interface in `02-client`. `GetRoot` is unused by core IBC.
* (modules/core/02-client) [\#1196](https://github.com/cosmos/ibc-go/pull/1196) Adding VerifyClientMessage to ClientState interface.
* (modules/core/02-client) [\#1198](https://github.com/cosmos/ibc-go/pull/1198) Adding UpdateStateOnMisbehaviour to ClientState interface.
* (modules/core/02-client) [\#1170](https://github.com/cosmos/ibc-go/pull/1170) Updating `ClientUpdateProposal` to set client state in lightclient implementations `CheckSubstituteAndUpdateState` methods.
* (modules/core/02-client) [\#1197](https://github.com/cosmos/ibc-go/pull/1197) Adding `CheckForMisbehaviour` to `ClientState` interface.
-* (modules/core/02-client) [\#1195](https://github.com/cosmos/ibc-go/pull/1210) Removing `CheckHeaderAndUpdateState` from `ClientState` interface & associated light client implementations.
-* (modules/core/02-client) [\#1189](https://github.com/cosmos/ibc-go/pull/1212) Removing `CheckMisbehaviourAndUpdateState` from `ClientState` interface & associated light client implementations.
+* (modules/core/02-client) [\#1210](https://github.com/cosmos/ibc-go/pull/1210) Removing `CheckHeaderAndUpdateState` from `ClientState` interface & associated light client implementations.
+* (modules/core/02-client) [\#1212](https://github.com/cosmos/ibc-go/pull/1212) Removing `CheckMisbehaviourAndUpdateState` from `ClientState` interface & associated light client implementations.
* (modules/core/exported) [\#1206](https://github.com/cosmos/ibc-go/pull/1206) Adding new method `UpdateState` to `ClientState` interface.
* (modules/core/02-client) [\#1741](https://github.com/cosmos/ibc-go/pull/1741) Emitting a new `upgrade_chain` event upon setting upgrade consensus state.
* (client) [\#724](https://github.com/cosmos/ibc-go/pull/724) `IsRevisionFormat` and `IsClientIDFormat` have been updated to disallow newlines before the dash used to separate the chainID and revision number, and the client type and client sequence.
@@ -90,11 +129,17 @@ Ref: https://keepachangelog.com/en/1.0.0/
* (06-solomachine) [\#1972](https://github.com/cosmos/ibc-go/pull/1972) Solo machine implementation of `ZeroCustomFields` fn now panics as the fn is only used for upgrades which solo machine does not support.
* (light-clients/06-solomachine) Moving `verifyMisbehaviour` function from update.go to misbehaviour_handle.go.
* [\#2434](https://github.com/cosmos/ibc-go/pull/2478) Removed all `TypeMsg` constants
-* (modules/core/exported) [#1689] (https://github.com/cosmos/ibc-go/pull/2539) Removing `GetVersions` from `ConnectionI` interface.
+* (modules/core/exported) [#2539] (https://github.com/cosmos/ibc-go/pull/2539) Removing `GetVersions` from `ConnectionI` interface.
* (core/02-connection) [#2419](https://github.com/cosmos/ibc-go/pull/2419) Add optional proof data to proto definitions of `MsgConnectionOpenTry` and `MsgConnectionOpenAck` for host state machines that are unable to introspect their own consensus state.
+* (light-clients/07-tendermint) [#3046](https://github.com/cosmos/ibc-go/pull/3046) Moved non-verification misbehaviour checks to `CheckForMisbehaviour`.
+* (apps/29-fee) [#2975](https://github.com/cosmos/ibc-go/pull/2975) Adding distribute fee events to ics29.
+* (light-clients/07-tendermint) [#2965](https://github.com/cosmos/ibc-go/pull/2965) Prune expired `07-tendermint` consensus states on duplicate header updates.
+* (light-clients) [#2736](https://github.com/cosmos/ibc-go/pull/2736) Updating `VerifyMembership` and `VerifyNonMembership` methods to use `Path` interface.
+* (light-clients) [#3113](https://github.com/cosmos/ibc-go/pull/3113) Align light client module names.
### Features
+* (apps/transfer) [#3079](https://github.com/cosmos/ibc-go/pull/3079) Added authz support for ics20.
* (core/02-client) [\#2824](https://github.com/cosmos/ibc-go/pull/2824) Add genesis migrations for v6 to v7. The migration migrates the solo machine client state definition, removes all solo machine consensus states and removes the localhost client.
* (core/24-host) [\#2856](https://github.com/cosmos/ibc-go/pull/2856) Add `PrefixedClientStorePath` and `PrefixedClientStoreKey` functions to 24-host
* (core/02-client) [\#2819](https://github.com/cosmos/ibc-go/pull/2819) Add automatic in-place store migrations to remove the localhost client and migrate existing solo machine definitions.
@@ -107,10 +152,28 @@ Ref: https://keepachangelog.com/en/1.0.0/
### Bug Fixes
-* (light-clients/solomachine) [#1839](https://github.com/cosmos/ibc-go/issues/1839) Fixed usage of the new diversifier in validation of changing diversifiers for the solo machine. The current diversifier must sign over the new diversifier.
+* (testing) [\#3295](https://github.com/cosmos/ibc-go/pull/3295) The function `SetupWithGenesisValSet` will set the baseapp chainID before running `InitChain`
+* (light-clients/solomachine) [#1839](https://github.com/cosmos/ibc-go/pull/1839) Fixed usage of the new diversifier in validation of changing diversifiers for the solo machine. The current diversifier must sign over the new diversifier.
* (light-clients/07-tendermint) [\#1674](https://github.com/cosmos/ibc-go/pull/1674) Submitted ClientState is zeroed out before checking the proof in order to prevent the proposal from containing information governance is not actually voting on.
* (modules/core/02-client)[\#1676](https://github.com/cosmos/ibc-go/pull/1676) ClientState must be zeroed out for `UpgradeProposals` to pass validation. This prevents a proposal containing information governance is not actually voting on.
* (core/02-client) [\#2510](https://github.com/cosmos/ibc-go/pull/2510) Fix client ID validation regex to conform closer to spec.
+* (apps/transfer) [#3045](https://github.com/cosmos/ibc-go/pull/3045) Allow value with slashes in URL template.
+* (apps/27-interchain-accounts) [#2601](https://github.com/cosmos/ibc-go/pull/2601) Remove bech32 check from owner address on ICA controller msgs RegisterInterchainAccount and SendTx.
+* (apps/transfer) [#2651](https://github.com/cosmos/ibc-go/pull/2651) Skip emission of unpopulated memo field in ics20.
+* (apps/27-interchain-accounts) [#2682](https://github.com/cosmos/ibc-go/pull/2682) Avoid race conditions in ics27 handshakes.
+* (light-clients/06-solomachine) [#2741](https://github.com/cosmos/ibc-go/pull/2741) Added check for empty path in 06-solomachine.
+* (light-clients/07-tendermint) [#3022](https://github.com/cosmos/ibc-go/pull/3022) Correctly close iterator in `07-tendermint` store.
+* (core/02-client) [#3010](https://github.com/cosmos/ibc-go/pull/3010) Update `Paginate` to use `FilterPaginate` in `ClientStates` and `ConnectionChannels` grpc queries.
+
+## [v6.1.0](https://github.com/cosmos/ibc-go/releases/tag/v6.1.0) - 2022-12-20
+
+### Dependencies
+
+* [\#2945](https://github.com/cosmos/ibc-go/pull/2945) Bump Cosmos SDK to v0.46.7 and Tendermint to v0.34.24.
+
+### State Machine Breaking
+
+* (apps/29-fee) [\#2942](https://github.com/cosmos/ibc-go/pull/2942) Check `x/bank` send enabled before escrowing fees.
## [v6.0.0](https://github.com/cosmos/ibc-go/releases/tag/v4.0.0) - 2022-12-09
diff --git a/Dockerfile b/Dockerfile
index ffad721277c..0969f245d09 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,26 +1,34 @@
FROM golang:1.19 as builder
+ARG IBC_GO_VERSION
+
ENV GOPATH=""
ENV GOMODULE="on"
+# ensure the ibc go version is being specified for this image.
+RUN test -n "${IBC_GO_VERSION}"
+
COPY go.mod .
COPY go.sum .
RUN go mod download
-# TODO: add specific Dockerfile to each branch adding only the required directories.
-#ADD internal internal
-#ADD testing testing
-#ADD modules modules
-#ADD LICENSE LICENSE
-#COPY contrib/devtools/Makefile contrib/devtools/Makefile
-#COPY Makefile .
+ADD internal internal
+ADD testing testing
+ADD modules modules
+ADD LICENSE LICENSE
+
+COPY contrib/devtools/Makefile contrib/devtools/Makefile
+COPY Makefile .
-ADD . .
RUN make build
-FROM ubuntu:20.04
+FROM ubuntu:22.04
+
+ARG IBC_GO_VERSION
+
+LABEL "org.cosmos.ibc-go" "${IBC_GO_VERSION}"
COPY --from=builder /go/build/simd /bin/simd
diff --git a/MAINTAINERSHIP.md b/MAINTAINERSHIP.md
index 0e2fa56da79..e22c2235308 100644
--- a/MAINTAINERSHIP.md
+++ b/MAINTAINERSHIP.md
@@ -66,7 +66,7 @@ Once the spec has been given initial approval, `ibc-go` engineering will coordin
The code that is presented should adhere to our [code contributor guidelines](https://github.com/cosmos/ibc-go/blob/main/CONTRIBUTING.md).
-More details on what code walkthrough should cover will be provided by the `ibc-go` engineering team on a case by case basis. However, the code should be sufficiently unit and [E2E tested](https://github.com/cosmos/ibc-go/blob/main/e2e/README.md). Think about preparing for this process similarly to submitting a codebase for audit :)
+More details on what code walkthrough should cover will be provided by the `ibc-go` engineering team on a case by case basis. However, the code should be sufficiently unit and E2E tested. Think about preparing for this process similarly to submitting a codebase for audit :)
Please indicate the expected contribution of your team maintainership, if any. This contribution should also include ideas about devrels support and support for product on social media.
diff --git a/Makefile b/Makefile
index a8ed6ad1b74..9d773217e43 100644
--- a/Makefile
+++ b/Makefile
@@ -306,7 +306,7 @@ format:
### Protobuf ###
###############################################################################
-protoVer=0.11.5
+protoVer=0.11.6
protoImageName=ghcr.io/cosmos/proto-builder:$(protoVer)
protoImage=$(DOCKER) run --rm -v $(CURDIR):/workspace --workdir /workspace $(protoImageName)
diff --git a/RELEASES.md b/RELEASES.md
index 8618bd78b34..9034c756c54 100644
--- a/RELEASES.md
+++ b/RELEASES.md
@@ -11,7 +11,7 @@ This is visually explained in the following decision tree:
-When bumping the dependencies of [Cosmos SDK](https://github.com/cosmos/cosmos-sdk) and [Tendermint](https://github.com/tendermint/tendermint) we will only treat patch releases as non state-machine breaking.
+When bumping the dependencies of [Cosmos SDK](https://github.com/cosmos/cosmos-sdk) and [CometBFT](https://github.com/cometbft/cometbft) we will only treat patch releases as non state-machine breaking.
## Backwards compatibility
diff --git a/SECURITY.md b/SECURITY.md
index adc0d5f08e5..b6efa42748b 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -12,7 +12,7 @@ See the policy linked above for more details on submissions and rewards and read
this [blog post](https://blog.cosmos.network/bug-bounty-program-for-tendermint-cosmos-833c67693586) for the program scope.
The following is a list of examples of the kinds of bugs we're most interested
-in for the IBC Golang repository. Please refer to the corresponding repositories for vulnerabilities on the [Cosmos SDK](https://github.com/cosmos/cosmos-sdk/blob/master/SECURITY.md) and [Tendermint](https://github.com/tendermint/tendermint/blob/master/SECURITY.md) repositories.
+in for the IBC Golang repository. Please refer to the corresponding repositories for vulnerabilities on the [Cosmos SDK](https://github.com/cosmos/cosmos-sdk/blob/master/SECURITY.md) and [CometBFT](https://github.com/cometbft/cometbft/blob/master/SECURITY.md) repositories.
### IBC Core
diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js
index c34ab01f54f..4d3a1357c63 100644
--- a/docs/.vuepress/config.js
+++ b/docs/.vuepress/config.js
@@ -211,6 +211,11 @@ module.exports = {
directory: false,
path: "/roadmap/roadmap.html",
},
+ {
+ title: "Troubleshooting",
+ directory: false,
+ path: "/ibc/troubleshooting.html",
+ },
],
},
{
@@ -325,6 +330,16 @@ module.exports = {
directory: false,
path: "/apps/transfer/params.html",
},
+ {
+ title: "Authorizations",
+ directory: false,
+ path: "/apps/transfer/authorizations.html",
+ },
+ {
+ title: "Client",
+ directory: false,
+ path: "/apps/transfer/client.html",
+ },
],
},
],
@@ -343,29 +358,24 @@ module.exports = {
path: "/ibc/light-clients/overview.html",
},
{
- title: "ClientState",
+ title: "Client State interface",
directory: false,
path: "/ibc/light-clients/client-state.html",
},
{
- title: "ConsensusState",
+ title: "Consensus State interface",
directory: false,
path: "/ibc/light-clients/consensus-state.html",
},
{
- title: "Setup",
+ title: "Handling Updates and Misbehaviour",
directory: false,
- path: "/ibc/light-clients/setup.html",
- },
- {
- title: "Updates Handling",
- directory: false,
- path: "/ibc/light-clients/update.html",
+ path: "/ibc/light-clients/updates-and-misbehaviour.html",
},
{
- title: "Misbehaviour Handling",
+ title: "Handling Upgrades",
directory: false,
- path: "/ibc/light-clients/misbehaviour.html",
+ path: "/ibc/light-clients/upgrades.html",
},
{
title: "Existence/Non-Existence Proofs",
@@ -373,22 +383,54 @@ module.exports = {
path: "/ibc/light-clients/proofs.html",
},
{
- title: "Upgrades Handling",
+ title: "Handling Proposals",
directory: false,
- path: "/ibc/light-clients/upgrade.html",
+ path: "/ibc/light-clients/proposals.html",
},
{
- title: "Proposal Handling",
+ title: "Handling Genesis",
directory: false,
- path: "/ibc/light-clients/proposal.html",
+ path: "/ibc/light-clients/genesis.html",
},
{
- title: "Genesis Handling",
+ title: "Setup",
directory: false,
- path: "/ibc/light-clients/genesis.html",
+ path: "/ibc/light-clients/setup.html",
},
]
},
+ {
+ title: "Localhost",
+ directory: true,
+ path: "/ibc/light-clients/localhost",
+ children: [
+ {
+ title: "Overview",
+ directory: false,
+ path: "/ibc/light-clients/localhost/overview.html",
+ },
+ {
+ title: "Integration",
+ directory: false,
+ path: "/ibc/light-clients/localhost/integration.html",
+ },
+ {
+ title: "ClientState",
+ directory: false,
+ path: "/ibc/light-clients/localhost/client-state.html",
+ },
+ {
+ title: "Connection",
+ directory: false,
+ path: "/ibc/light-clients/localhost/connection.html",
+ },
+ {
+ title: "State Verification",
+ directory: false,
+ path: "/ibc/light-clients/localhost/state-verification.html",
+ },
+ ],
+ },
{
title: "Solomachine",
directory: true,
@@ -504,6 +546,11 @@ module.exports = {
directory: false,
path: "/migrations/v6-to-v7.html",
},
+ {
+ title: "IBC-Go v7 to v7.1",
+ directory: false,
+ path: "/migrations/v7-to-v7_1.html",
+ },
],
},
{
diff --git a/docs/apps/interchain-accounts/messages.md b/docs/apps/interchain-accounts/messages.md
index 9424bbcf77f..a2f8b3f7e87 100644
--- a/docs/apps/interchain-accounts/messages.md
+++ b/docs/apps/interchain-accounts/messages.md
@@ -29,10 +29,11 @@ If the `Version` string is omitted, the controller submodule will construct a de
```go
type MsgRegisterInterchainAccountResponse struct {
ChannelID string
+ PortId string
}
```
-The `ChannelID` is returned in the message response.
+The `ChannelID` and `PortID` are returned in the message response.
## `MsgSendTx`
diff --git a/docs/apps/transfer/authorizations.md b/docs/apps/transfer/authorizations.md
new file mode 100644
index 00000000000..ea18133b095
--- /dev/null
+++ b/docs/apps/transfer/authorizations.md
@@ -0,0 +1,51 @@
+
+
+# `TransferAuthorization`
+
+`TransferAuthorization` implements the `Authorization` interface for `ibc.applications.transfer.v1.MsgTransfer`. It allows a granter to grant a grantee the privilege to submit `MsgTransfer` on its behalf. Please see the [Cosmos SDK docs](https://docs.cosmos.network/v0.47/modules/authz) for more details on granting privileges via the `x/authz` module.
+
+More specifically, the granter allows the grantee to transfer funds that belong to the granter over a specified channel.
+
+For the specified channel, the granter must be able to specify a spend limit of a specific denomination they wish to allow the grantee to be able to transfer.
+
+The granter may be able to specify the list of addresses that they allow to receive funds. If empty, then all addresses are allowed.
+
+
+It takes:
+
+- a `SourcePort` and a `SourceChannel` which together comprise the unique transfer channel identifier over which authorized funds can be transferred.
+
+- a `SpendLimit` that specifies the maximum amount of tokens the grantee can transfer. The `SpendLimit` is updated as the tokens are transfered, unless the sentinel value of the maximum value for a 256-bit unsigned integer (i.e. 2^256 - 1) is used for the amount, in which case the `SpendLimit` will not be updated (please be aware that using this sentinel value will grant the grantee the privilege to transfer **all** the tokens of a given denomination available at the granter's account). The helper function `UnboundedSpendLimit` in the `types` package of the `transfer` module provides the sentinel value that can be used. This `SpendLimit` may also be updated to increase or decrease the limit as the granter wishes.
+
+- an `AllowList` list that specifies the list of addresses that are allowed to receive funds. If this list is empty, then all addresses are allowed to receive funds from the `TransferAuthorization`.
+
+Setting a `TransferAuthorization` is expected to fail if:
+- the spend limit is nil
+- the denomination of the spend limit is an invalid coin type
+- the source port ID is invalid
+- the source channel ID is invalid
+- there are duplicate entries in the `AllowList`
+
+Below is the `TransferAuthorization` message:
+
+```go
+func NewTransferAuthorization(allocations ...Allocation) *TransferAuthorization {
+ return &TransferAuthorization{
+ Allocations: allocations,
+ }
+}
+
+type Allocation struct {
+ // the port on which the packet will be sent
+ SourcePort string
+ // the channel by which the packet will be sent
+ SourceChannel string
+ // spend limitation on the channel
+ SpendLimit sdk.Coins
+ // allow list of receivers, an empty allow list permits any receiver address
+ AllowList []string
+}
+
+```
diff --git a/docs/apps/transfer/client.md b/docs/apps/transfer/client.md
new file mode 100644
index 00000000000..515fad57d5c
--- /dev/null
+++ b/docs/apps/transfer/client.md
@@ -0,0 +1,66 @@
+
+
+# Client
+
+## CLI
+
+A user can query and interact with the `transfer` module using the CLI. Use the `--help` flag to discover the available commands:
+
+### Query
+
+The `query` commands allow users to query `transfer` state.
+
+```shell
+simd query ibc-transfer --help
+```
+
+#### `total-escrow`
+
+The `total-escrow` command allows users to query the total amount in escrow for a particular coin denomination regardless of the transfer channel from where the coins were sent out.
+
+```shell
+simd query ibc-transfer total-escrow [denom] [flags]
+```
+
+Example:
+
+```shell
+simd query ibc-transfer total-escrow samoleans
+```
+
+Example Output:
+
+```shell
+amount: "100"
+```
+
+## gRPC
+
+A user can query the `transfer` module using gRPC endpoints.
+
+### `TotalEscrowForDenom`
+
+The `TotalEscrowForDenom` endpoint allows users to query the total amount in escrow for a particular coin denomination regardless of the transfer channel from where the coins were sent out.
+
+```shell
+ibc.applications.transfer.v1.Query/TotalEscrowForDenom
+```
+
+Example:
+
+```shell
+grpcurl -plaintext \
+ -d '{"denom":"samoleans"}' \
+ localhost:9090 \
+ ibc.applications.transfer.v1.Query/TotalEscrowForDenom
+```
+
+Example output:
+
+```shell
+{
+ "amount": "100"
+}
+```
\ No newline at end of file
diff --git a/docs/architecture/README.md b/docs/architecture/README.md
index edfbea4f0c8..9249aea1bfc 100644
--- a/docs/architecture/README.md
+++ b/docs/architecture/README.md
@@ -31,6 +31,11 @@ To suggest an ADR, please make use of the [ADR template](./adr-template.md) prov
| [002](./adr-002-go-module-versioning.md) | Go module versioning | Accepted |
| [003](./adr-003-ics27-acknowledgement.md) | ICS27 acknowledgement format | Accepted |
| [004](./adr-004-ics29-lock-fee-module.md) | ICS29 module locking upon escrow out of balance | Accepted |
+| [005](./adr-005-consensus-height-events.md) | `UpdateClient` events - `ClientState` consensus heights | Accepted |
+| [006](./adr-006-02-client-refactor.md) | ICS02 client refactor | Accepted |
+| [007](./adr-007-solomachine-signbytes.md) | ICS06 Solo machine sign bytes |
+| [009](./adr-009-v6-ics27-msgserver.md) | ICS27 message server addition | Accepted |
+| [011](./adr-011-transfer-total-escrow-state-entry.md) | ICS20 state entry for total amount of tokens in escrow | Accepted |
| [015](./adr-015-ibc-packet-receiver.md) | IBC Packet Routing | Accepted |
| [025](./adr-025-ibc-passive-channels.md) | IBC passive channels | Deprecated |
| [026](./adr-026-ibc-client-recovery-mechanisms.md) | IBC client recovery mechansisms | Accepted |
diff --git a/docs/architecture/adr-001-coin-source-tracing.md b/docs/architecture/adr-001-coin-source-tracing.md
index 4aeb59aecab..94a9c86de63 100644
--- a/docs/architecture/adr-001-coin-source-tracing.md
+++ b/docs/architecture/adr-001-coin-source-tracing.md
@@ -114,7 +114,7 @@ trace the token back to the originating chain, as specified on ICS20.
The new proposed format will be the following:
-```golang
+```go
ibcDenom = "ibc/" + hash(trace path + "/" + base denom)
```
@@ -133,7 +133,7 @@ message DenomTrace {
The `IBCDenom` function constructs the `Coin` denomination used when creating the ICS20 fungible token packet data:
-```golang
+```go
// Hash returns the hex bytes of the SHA256 hash of the DenomTrace fields using the following formula:
//
// hash = sha256(tracePath + "/" + baseDenom)
@@ -157,7 +157,7 @@ In order to retrieve the trace information from an IBC denomination, a lookup ta
added to the `ibc-transfer` module. These values need to also be persisted between upgrades, meaning
that a new `[]DenomTrace` `GenesisState` field state needs to be added to the module:
-```golang
+```go
// GetDenomTrace retrieves the full identifiers trace and base denomination from the store.
func (k Keeper) GetDenomTrace(ctx Context, denomTraceHash []byte) (DenomTrace, bool) {
store := ctx.KVStore(k.storeKey)
@@ -188,14 +188,14 @@ func (k Keeper) SetDenomTrace(ctx Context, denomTrace DenomTrace) {
The `MsgTransfer` will validate that the `Coin` denomination from the `Token` field contains a valid
hash, if the trace info is provided, or that the base denominations matches:
-```golang
+```go
func (msg MsgTransfer) ValidateBasic() error {
// ...
return ValidateIBCDenom(msg.Token.Denom)
}
```
-```golang
+```go
// ValidateIBCDenom validates that the given denomination is either:
//
// - A valid base denomination (eg: 'uatom')
@@ -226,7 +226,7 @@ The denomination trace info only needs to be updated when token is received:
- Receiver is **source** chain: The receiver created the token and must have the trace lookup already stored (if necessary _ie_ native token case wouldn't need a lookup).
- Receiver is **not source** chain: Store the received info. For example, during step 1, when chain `B` receives `transfer/channelToA/denom`.
-```golang
+```go
// SendTransfer
// ...
@@ -245,7 +245,7 @@ if types.SenderChainIsSource(sourcePort, sourceChannel, fullDenomPath) {
//...
```
-```golang
+```go
// DenomPathFromHash returns the full denomination path prefix from an ibc denom with a hash
// component.
func (k Keeper) DenomPathFromHash(ctx sdk.Context, denom string) (string, error) {
@@ -266,7 +266,7 @@ func (k Keeper) DenomPathFromHash(ctx sdk.Context, denom string) (string, error)
```
-```golang
+```go
// OnRecvPacket
// ...
@@ -322,7 +322,7 @@ return k.bankKeeper.SendCoinsFromModuleToAccount(
)
```
-```golang
+```go
func NewDenomTraceFromRawDenom(denom string) DenomTrace{
denomSplit := strings.Split(denom, "/")
trace := ""
diff --git a/docs/architecture/adr-011-transfer-total-escrow-state-entry.md b/docs/architecture/adr-011-transfer-total-escrow-state-entry.md
new file mode 100644
index 00000000000..18241965386
--- /dev/null
+++ b/docs/architecture/adr-011-transfer-total-escrow-state-entry.md
@@ -0,0 +1,145 @@
+# ADR 011: ICS-20 transfer state entry for total amount of tokens in escrow
+
+## Changelog
+
+* 2023-05-24: Initial draft
+
+## Status
+
+Accepted and applied in v7.1 of ibc-go
+
+## Context
+
+Every ICS-20 transfer channel has its own escrow bank account. This account is used to lock tokens that are transferred out of a chain that acts as the source of the tokens (i.e. when the tokens being transferred have not returned to the originating chain). This design makes it easy to query the balance of the escrow accounts and find out the total amount of tokens in escrow in a particular channel. However, there are use cases where it would be useful to determine the total escrowed amount of a given denomination across all channels where those tokens have been transferred out.
+
+For example: assuming that there are three channels between Cosmos Hub to Osmosis and 10 ATOM have been transferred from the Cosmos Hub to Osmosis on each of those channels, then we would like to know that 30 ATOM have been transferred (i.e. are locked in the escrow accounts of each channel) without needing to iterate over each escrow account to add up the balances of each.
+
+For a sample use case where this feature would be useful, please refer to Osmosis' rate limiting use case described in [#2664](https://github.com/cosmos/ibc-go/issues/2664).
+
+## Decision
+
+### State entry denom -> amount
+
+The total amount of tokens in escrow (across all transfer channels) for a given denomination is stored in state in an entry keyed by the denomination: `totalEscrowForDenom/{denom}`.
+
+### Panic if amount is negative
+
+If a negative amount is ever attempted to be stored, then the keeper function will panic:
+
+```go
+if coin.Amount.IsNegative() {
+ panic(fmt.Sprintf("amount cannot be negative: %s", coin.Amount))
+}
+```
+
+### Delete state entry if amount is zero
+
+When setting the amount for a particular denomination, the value might be zero if all tokens that were transferred out of the chain have been transferred back. If this happens, then the state entry for this particular denomination will be deleted, since Cosmos SDK's `x/bank` module prunes any non-zero balances:
+
+```go
+if coin.Amount.IsZero() {
+ store.Delete(key) // delete the key since Cosmos SDK x/bank module will prune any non-zero balances
+ return
+}
+```
+
+### Bundle escrow/unescrow with setting state entry
+
+Two new functions are implemented that bundle together the operations of escrowing/unescrowing and setting the total escrow amount in state, since these operations need to be executed together.
+
+For escrowing tokens:
+
+```go
+// escrowToken will send the given token from the provided sender to the escrow address. It will also
+// update the total escrowed amount by adding the escrowed token to the current total escrow.
+func (k Keeper) escrowToken(ctx sdk.Context, sender, escrowAddress sdk.AccAddress, token sdk.Coin) error {
+ if err := k.bankKeeper.SendCoins(ctx, sender, escrowAddress, sdk.NewCoins(token)); err != nil {
+ // failure is expected for insufficient balances
+ return err
+ }
+
+ // track the total amount in escrow keyed by denomination to allow for efficient iteration
+ currentTotalEscrow := k.GetTotalEscrowForDenom(ctx, token.GetDenom())
+ newTotalEscrow := currentTotalEscrow.Add(token)
+ k.SetTotalEscrowForDenom(ctx, newTotalEscrow)
+
+ return nil
+}
+```
+
+For unescrowing tokens:
+
+```go
+// unescrowToken will send the given token from the escrow address to the provided receiver. It will also
+// update the total escrow by deducting the unescrowed token from the current total escrow.
+func (k Keeper) unescrowToken(ctx sdk.Context, escrowAddress, receiver sdk.AccAddress, token sdk.Coin) error {
+ if err := k.bankKeeper.SendCoins(ctx, escrowAddress, receiver, sdk.NewCoins(token)); err != nil {
+ // NOTE: this error is only expected to occur given an unexpected bug or a malicious
+ // counterparty module. The bug may occur in bank or any part of the code that allows
+ // the escrow address to be drained. A malicious counterparty module could drain the
+ // escrow address by allowing more tokens to be sent back then were escrowed.
+ return errorsmod.Wrap(err, "unable to unescrow tokens, this may be caused by a malicious counterparty module or a bug: please open an issue on counterparty module")
+ }
+
+ // track the total amount in escrow keyed by denomination to allow for efficient iteration
+ currentTotalEscrow := k.GetTotalEscrowForDenom(ctx, token.GetDenom())
+ newTotalEscrow := currentTotalEscrow.Sub(token)
+ k.SetTotalEscrowForDenom(ctx, newTotalEscrow)
+
+ return nil
+}
+```
+
+When tokens need to be escrowed in `sendTransfer`, then `escrowToken` is called; when tokens need to be unescrowed on execution of the `OnRecvPacket`, `OnAcknowledgementPacket` or `OnTimeoutPacket` callbacks, then `unescrowToken` is called.
+
+### gRPC query endpoint and CLI to retrieve amount
+
+A gRPC query endpoint is added so that it is possible to retrieve the total amount for a given denomination:
+
+```proto
+// TotalEscrowForDenom returns the total amount of tokens in escrow based on the denom.
+rpc TotalEscrowForDenom(QueryTotalEscrowForDenomRequest) returns (QueryTotalEscrowForDenomResponse) {
+ option (google.api.http).get = "/ibc/apps/transfer/v1/denoms/{denom=**}/total_escrow";
+}
+
+// QueryTotalEscrowForDenomRequest is the request type for TotalEscrowForDenom RPC method.
+message QueryTotalEscrowForDenomRequest {
+ string denom = 1;
+}
+
+// QueryTotalEscrowForDenomResponse is the response type for TotalEscrowForDenom RPC method.
+message QueryTotalEscrowForDenomResponse {
+ cosmos.base.v1beta1.Coin amount = 1 [(gogoproto.nullable) = false];
+}
+```
+
+And a CLI query is also available to retrieve the total amount via the command line:
+
+```shell
+query ibc-transfer total-escrow [denom]
+```
+
+## Consequences
+
+### Positive
+
+* Possibility to retrieve the total amount of a particular denomination in escrow across all transfer channels without iteration.
+
+### Negative
+
+No notable consequences
+
+### Neutral
+
+* A new entry is added to state for every denomination that is transferred out of the chain.
+
+## References
+
+Issues:
+
+* [#2664](https://github.com/cosmos/ibc-go/issues/2664)
+
+PRs:
+
+* [#3019](https://github.com/cosmos/ibc-go/pull/3019)
+* [#3558](https://github.com/cosmos/ibc-go/pull/3558)
\ No newline at end of file
diff --git a/docs/client/swagger-ui/swagger.yaml b/docs/client/swagger-ui/swagger.yaml
index e4159acdf8a..decf9f6dc16 100644
--- a/docs/client/swagger-ui/swagger.yaml
+++ b/docs/client/swagger-ui/swagger.yaml
@@ -306,6 +306,65 @@ paths:
type: string
tags:
- Query
+ /ibc/apps/transfer/v1/denoms/{denom}/total_escrow:
+ get:
+ summary: >-
+ TotalEscrowForDenom returns the total amount of tokens in escrow based
+ on the denom.
+ operationId: TotalEscrowForDenom
+ responses:
+ '200':
+ description: A successful response.
+ schema:
+ type: object
+ properties:
+ amount:
+ type: object
+ properties:
+ denom:
+ type: string
+ amount:
+ type: string
+ description: >-
+ 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.
+ description: >-
+ QueryTotalEscrowForDenomResponse is the response type for
+ TotalEscrowForDenom RPC method.
+ default:
+ description: An unexpected error response.
+ schema:
+ type: object
+ properties:
+ error:
+ type: string
+ code:
+ type: integer
+ format: int32
+ message:
+ type: string
+ details:
+ type: array
+ items:
+ type: object
+ properties:
+ type_url:
+ type: string
+ value:
+ type: string
+ format: byte
+ parameters:
+ - name: denom
+ in: path
+ required: true
+ type: string
+ tags:
+ - Query
/ibc/apps/transfer/v1/params:
get:
summary: Params queries all parameters of the ibc-transfer module.
@@ -640,7 +699,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -650,7 +709,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -681,7 +740,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -965,7 +1023,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -975,7 +1033,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -1006,7 +1064,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -1250,7 +1307,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -1260,7 +1317,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -1291,7 +1348,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -1471,7 +1527,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -1481,7 +1537,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -1512,7 +1568,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -1793,7 +1848,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -1803,7 +1858,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -1834,7 +1889,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -2043,7 +2097,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -2053,7 +2107,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -2084,7 +2138,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -2287,7 +2340,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -2297,7 +2350,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -2328,7 +2381,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -2531,7 +2583,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -2541,7 +2593,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -2572,7 +2624,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -2770,7 +2821,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -2780,7 +2831,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -2811,7 +2862,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -3149,7 +3199,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -3159,7 +3209,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -3190,7 +3240,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -3411,7 +3460,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -3421,7 +3470,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -3452,7 +3501,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the
regular
@@ -3645,7 +3693,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -3655,7 +3703,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -3686,7 +3734,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -3891,7 +3938,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -3901,7 +3948,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -3932,7 +3979,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -4122,7 +4168,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -4132,7 +4178,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -4163,7 +4209,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -4339,7 +4384,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -4349,7 +4394,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -4380,7 +4425,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -4571,7 +4615,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -4581,7 +4625,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -4612,7 +4656,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the
regular
@@ -4804,7 +4847,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -4814,7 +4857,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -4845,7 +4888,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -5142,7 +5184,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -5152,7 +5194,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -5183,7 +5225,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -5397,7 +5438,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -5407,7 +5448,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -5438,7 +5479,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -5633,7 +5673,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -5643,7 +5683,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -5674,7 +5714,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -5760,7 +5799,13 @@ paths:
type: string
description: >-
allowed_clients defines the list of allowed client state
- types.
+ types which can be created
+
+ and interacted with. If a client type is removed from the
+ allowed clients list, usage
+
+ of this client will be disabled until it is added again to
+ the list.
description: >-
QueryClientParamsResponse is the response type for the
Query/ClientParams RPC
@@ -5880,7 +5925,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -5890,7 +5935,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -5921,7 +5966,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -6069,7 +6113,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -6079,7 +6123,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -6110,7 +6154,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -6262,7 +6305,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -6272,7 +6315,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -6303,7 +6346,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -6451,7 +6493,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -6461,7 +6503,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -6492,7 +6534,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -6644,7 +6685,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -6654,7 +6695,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -6685,7 +6726,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -6891,7 +6931,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -6901,7 +6941,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -6932,7 +6972,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -7251,7 +7290,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -7261,7 +7300,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -7292,7 +7331,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -7646,7 +7684,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -7656,7 +7694,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -7687,7 +7725,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -7851,7 +7888,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -7861,7 +7898,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -7892,7 +7929,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -8085,7 +8121,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -8095,7 +8131,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -8126,7 +8162,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -8282,7 +8317,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -8292,7 +8327,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -8323,7 +8358,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -8511,7 +8545,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -8521,7 +8555,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -8552,7 +8586,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -8750,7 +8783,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -8760,7 +8793,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -8791,7 +8824,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -9095,7 +9127,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -9105,7 +9137,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -9136,7 +9168,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -9471,7 +9502,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -9481,7 +9512,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -9512,7 +9543,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -9683,7 +9713,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -9693,7 +9723,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -9724,7 +9754,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -9917,7 +9946,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -9927,7 +9956,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -9958,7 +9987,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -10119,7 +10147,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -10129,7 +10157,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -10160,7 +10188,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -10348,7 +10375,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -10358,7 +10385,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -10389,7 +10416,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -10617,7 +10643,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -10627,7 +10653,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -10658,7 +10684,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -10926,7 +10951,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -10936,7 +10961,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -10967,7 +10992,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -11250,7 +11274,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -11260,7 +11284,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -11291,7 +11315,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -11563,7 +11586,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -11573,7 +11596,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -11604,7 +11627,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -11876,7 +11898,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -11886,7 +11908,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -11917,7 +11939,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -12143,7 +12164,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -12153,7 +12174,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -12184,7 +12205,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -12413,7 +12433,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -12423,7 +12443,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -12454,7 +12474,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -12682,7 +12701,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -12692,7 +12711,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -12723,7 +12742,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -13046,7 +13064,7 @@ paths:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -13056,7 +13074,7 @@ paths:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -13087,7 +13105,6 @@ paths:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -13266,6 +13283,18 @@ definitions:
repeated Bar results = 1;
PageResponse page = 2;
}
+ cosmos.base.v1beta1.Coin:
+ type: object
+ properties:
+ denom:
+ type: string
+ amount:
+ type: string
+ description: |-
+ 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.
google.protobuf.Any:
type: object
properties:
@@ -13355,7 +13384,7 @@ definitions:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -13365,7 +13394,7 @@ definitions:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -13392,7 +13421,6 @@ definitions:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -13532,7 +13560,7 @@ definitions:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -13542,7 +13570,7 @@ definitions:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -13569,7 +13597,6 @@ definitions:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -13757,6 +13784,24 @@ definitions:
chain.
description: QueryParamsResponse is the response type for the Query/Params RPC method.
+ ibc.applications.transfer.v1.QueryTotalEscrowForDenomResponse:
+ type: object
+ properties:
+ amount:
+ type: object
+ properties:
+ denom:
+ type: string
+ amount:
+ type: string
+ description: |-
+ 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.
+ description: >-
+ QueryTotalEscrowForDenomResponse is the response type for
+ TotalEscrowForDenom RPC method.
ibc.applications.interchain_accounts.controller.v1.Params:
type: object
properties:
@@ -13819,18 +13864,6 @@ definitions:
allow_messages defines a list of sdk message typeURLs allowed to
be executed on a host chain.
description: QueryParamsResponse is the response type for the Query/Params RPC method.
- cosmos.base.v1beta1.Coin:
- type: object
- properties:
- denom:
- type: string
- amount:
- type: string
- description: |-
- 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.
ibc.applications.fee.v1.Fee:
type: object
properties:
@@ -14645,7 +14678,7 @@ definitions:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -14655,7 +14688,7 @@ definitions:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -14682,7 +14715,6 @@ definitions:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -14845,7 +14877,7 @@ definitions:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -14855,7 +14887,7 @@ definitions:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -14882,7 +14914,6 @@ definitions:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -14924,7 +14955,14 @@ definitions:
type: array
items:
type: string
- description: allowed_clients defines the list of allowed client state types.
+ description: >-
+ allowed_clients defines the list of allowed client state types which
+ can be created
+
+ and interacted with. If a client type is removed from the allowed
+ clients list, usage
+
+ of this client will be disabled until it is added again to the list.
description: Params defines the set of IBC light client parameters.
ibc.core.client.v1.QueryClientParamsResponse:
type: object
@@ -14937,7 +14975,15 @@ definitions:
type: array
items:
type: string
- description: allowed_clients defines the list of allowed client state types.
+ description: >-
+ allowed_clients defines the list of allowed client state types
+ which can be created
+
+ and interacted with. If a client type is removed from the allowed
+ clients list, usage
+
+ of this client will be disabled until it is added again to the
+ list.
description: >-
QueryClientParamsResponse is the response type for the Query/ClientParams
RPC
@@ -15039,7 +15085,7 @@ definitions:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -15049,7 +15095,7 @@ definitions:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -15076,7 +15122,6 @@ definitions:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -15259,7 +15304,7 @@ definitions:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -15269,7 +15314,7 @@ definitions:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -15299,7 +15344,6 @@ definitions:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -15547,7 +15591,7 @@ definitions:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -15557,7 +15601,7 @@ definitions:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -15584,7 +15628,6 @@ definitions:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -15798,7 +15841,7 @@ definitions:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -15808,7 +15851,7 @@ definitions:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -15838,7 +15881,6 @@ definitions:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -16004,7 +16046,7 @@ definitions:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -16014,7 +16056,7 @@ definitions:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -16041,7 +16083,6 @@ definitions:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -16173,7 +16214,7 @@ definitions:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -16183,7 +16224,7 @@ definitions:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -16210,7 +16251,6 @@ definitions:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -16620,7 +16660,7 @@ definitions:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -16630,7 +16670,7 @@ definitions:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -16658,7 +16698,6 @@ definitions:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -16826,7 +16865,7 @@ definitions:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -16836,7 +16875,7 @@ definitions:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -16863,7 +16902,6 @@ definitions:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -17550,7 +17588,7 @@ definitions:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -17560,7 +17598,7 @@ definitions:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -17588,7 +17626,6 @@ definitions:
JSON
- ====
The JSON representation of an `Any` value uses the regular
@@ -17756,7 +17793,7 @@ definitions:
foo = any.unpack(Foo.class);
}
- Example 3: Pack and unpack a message in Python.
+ Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
@@ -17766,7 +17803,7 @@ definitions:
any.Unpack(foo)
...
- Example 4: Pack and unpack a message in Go
+ Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
@@ -17793,7 +17830,6 @@ definitions:
JSON
- ====
The JSON representation of an `Any` value uses the regular
diff --git a/docs/dev/go-style-guide.md b/docs/dev/go-style-guide.md
index f481c4bcd32..f56ea1b3a52 100644
--- a/docs/dev/go-style-guide.md
+++ b/docs/dev/go-style-guide.md
@@ -71,20 +71,20 @@ Perhaps more key for code readability than good commenting is having the right s
- Use [goimports](https://godoc.org/golang.org/x/tools/cmd/goimports).
- Separate imports into blocks: one for the standard lib, one for external libs and one for application libs. For example:
- ```golang
- import (
- // standard library imports
- "fmt"
- "testing"
-
- // external library imports
- "github.com/stretchr/testify/require"
- abci "github.com/tendermint/tendermint/abci/types"
-
- // ibc-go library imports
- "github.com/cosmos/ibc-go/modules/core/23-commitment/types"
- )
- ```
+```go
+import (
+ // standard library imports
+ "fmt"
+ "testing"
+
+ // external library imports
+ "github.com/stretchr/testify/require"
+ abci "github.com/cometbft/cometbft/abci/types"
+
+ // ibc-go library imports
+ "github.com/cosmos/ibc-go/modules/core/23-commitment/types"
+)
+```
## Dependencies
@@ -105,11 +105,11 @@ Perhaps more key for code readability than good commenting is having the right s
- Panic is appropriate when an internal invariant of a system is broken, while all other cases (in particular, incorrect or invalid usage) should return errors.
- Error messages should be formatted as following:
- ```golang
+ ```go
sdkerrors.Wrapf(
,
"expected %s, got %s",
,
)
- ```
\ No newline at end of file
+ ```
diff --git a/docs/dev/project-structure.md b/docs/dev/project-structure.md
index c207b927079..828e896c5a1 100644
--- a/docs/dev/project-structure.md
+++ b/docs/dev/project-structure.md
@@ -1,6 +1,6 @@
# Project structure
-If you're not familiar with the overall module structure from the SDK modules, please check this [document](https://github.com/cosmos/cosmos-sdk/blob/main/docs/docs/building-modules/10-structure.md) as prerequisite reading.
+If you're not familiar with the overall module structure from the SDK modules, please check this [document](https://github.com/cosmos/cosmos-sdk/blob/main/docs/docs/building-modules/11-structure.md) as prerequisite reading.
Every Interchain Standard (ICS) has been developed in its own package. The development team separated the IBC TAO (Transport, Authentication, Ordering) ICS specifications from the IBC application level specification. The following sections describe the architecture of the most relevant directories that comprise this repository.
@@ -40,7 +40,3 @@ This folder contains all the Protobuf files used for
## `testing`
This package contains the implementation of the testing package used in unit and integration tests. Please read the [package's documentation](../../testing/README.md) for more information.
-
-## `e2e`
-
-This folder contains all the e2e tests of ibc-go. Please read the [module's documentation](../../e2e/README.md) for more information.
diff --git a/docs/ibc/events.md b/docs/ibc/events.md
index 2c584302566..1a49b433a5f 100644
--- a/docs/ibc/events.md
+++ b/docs/ibc/events.md
@@ -185,64 +185,90 @@ callbacks to IBC applications.
### SendPacket (application module call)
-| Type | Attribute Key | Attribute Value |
-|-------------|--------------------------|----------------------------------|
-| send_packet | packet_data | {data} |
-| send_packet | packet_timeout_height | {timeoutHeight} |
-| send_packet | packet_timeout_timestamp | {timeoutTimestamp} |
-| send_packet | packet_sequence | {sequence} |
-| send_packet | packet_src_port | {sourcePort} |
-| send_packet | packet_src_channel | {sourceChannel} |
-| send_packet | packet_dst_port | {destinationPort} |
-| send_packet | packet_dst_channel | {destinationChannel} |
-| send_packet | packet_channel_ordering | {channel.Ordering} |
-| message | action | application-module-defined-field |
-| message | module | ibc-channel |
+| Type | Attribute Key | Attribute Value | Status |
+|-------------|--------------------------|----------------------------------|------------|
+| send_packet | packet_data | {data} | Deprecated |
+| send_packet | packet_data_hex | {hex.Encode(data)} | |
+| send_packet | packet_timeout_height | {timeoutHeight} | |
+| send_packet | packet_timeout_timestamp | {timeoutTimestamp} | |
+| send_packet | packet_sequence | {sequence} | |
+| send_packet | packet_src_port | {sourcePort} | |
+| send_packet | packet_src_channel | {sourceChannel} | |
+| send_packet | packet_dst_port | {destinationPort} | |
+| send_packet | packet_dst_channel | {destinationChannel} | |
+| send_packet | packet_channel_ordering | {channel.Ordering} | |
+| send_packet | packet_connection | {channel.ConnectionHops[0]} | Deprecated |
+| send_packet | connection_id | {channel.ConnectionHops[0]} | |
+| message | action | application-module-defined-field | |
+| message | module | ibc-channel | |
### MsgRecvPacket
-| Type | Attribute Key | Attribute Value |
-|-------------|--------------------------|----------------------|
-| recv_packet | packet_data | {data} |
-| recv_packet | packet_ack | {acknowledgement} |
-| recv_packet | packet_timeout_height | {timeoutHeight} |
-| recv_packet | packet_timeout_timestamp | {timeoutTimestamp} |
-| recv_packet | packet_sequence | {sequence} |
-| recv_packet | packet_src_port | {sourcePort} |
-| recv_packet | packet_src_channel | {sourceChannel} |
-| recv_packet | packet_dst_port | {destinationPort} |
-| recv_packet | packet_dst_channel | {destinationChannel} |
-| recv_packet | packet_channel_ordering | {channel.Ordering} |
-| message | action | recv_packet |
-| message | module | ibc-channel |
+| Type | Attribute Key | Attribute Value | Status |
+|-------------|--------------------------|-------------------------------|------------|
+| recv_packet | packet_data | {data} | Deprecated |
+| recv_packet | packet_data_hex | {hex.Encode(data)} | |
+| recv_packet | packet_timeout_height | {timeoutHeight} | |
+| recv_packet | packet_timeout_timestamp | {timeoutTimestamp} | |
+| recv_packet | packet_sequence | {sequence} | |
+| recv_packet | packet_src_port | {sourcePort} | |
+| recv_packet | packet_src_channel | {sourceChannel} | |
+| recv_packet | packet_dst_port | {destinationPort} | |
+| recv_packet | packet_dst_channel | {destinationChannel} | |
+| recv_packet | packet_channel_ordering | {channel.Ordering} | |
+| recv_packet | packet_connection | {channel.ConnectionHops[0]} | Deprecated |
+| recv_packet | connection_id | {channel.ConnectionHops[0]} | |
+| message | action | recv_packet | |
+| message | module | ibc-channel | |
+
+| Type | Attribute Key | Attribute Value | Status |
+|-----------------------|--------------------------|-------------------------------|------------|
+| write_acknowledgement | packet_data | {data} | Deprecated |
+| write_acknowledgement | packet_data_hex | {hex.Encode(data)} | |
+| write_acknowledgement | packet_timeout_height | {timeoutHeight} | |
+| write_acknowledgement | packet_timeout_timestamp | {timeoutTimestamp} | |
+| write_acknowledgement | packet_sequence | {sequence} | |
+| write_acknowledgement | packet_src_port | {sourcePort} | |
+| write_acknowledgement | packet_src_channel | {sourceChannel} | |
+| write_acknowledgement | packet_dst_port | {destinationPort} | |
+| write_acknowledgement | packet_dst_channel | {destinationChannel} | |
+| write_acknowledgement | packet_ack | {ack} | Deprecated |
+| write_acknowledgement | packet_ack_hex | {hex.Encode(ack)} | |
+| write_acknowledgement | packet_channel_ordering | {channel.Ordering} | |
+| write_acknowledgement | packet_connection | {channel.ConnectionHops[0]} | Deprecated |
+| write_acknowledgement | connection_id | {channel.ConnectionHops[0]} | |
+| message | action | write_acknowledgement | |
+| message | module | ibc-channel | |
### MsgAcknowledgePacket
-| Type | Attribute Key | Attribute Value |
-|--------------------|--------------------------|----------------------|
-| acknowledge_packet | packet_timeout_height | {timeoutHeight} |
-| acknowledge_packet | packet_timeout_timestamp | {timeoutTimestamp} |
-| acknowledge_packet | packet_sequence | {sequence} |
-| acknowledge_packet | packet_src_port | {sourcePort} |
-| acknowledge_packet | packet_src_channel | {sourceChannel} |
-| acknowledge_packet | packet_dst_port | {destinationPort} |
-| acknowledge_packet | packet_dst_channel | {destinationChannel} |
-| acknowledge_packet | packet_channel_ordering | {channel.Ordering} |
-| message | action | acknowledge_packet |
-| message | module | ibc-channel |
+| Type | Attribute Key | Attribute Value | Status |
+|--------------------|--------------------------|-------------------------------|------------|
+| acknowledge_packet | packet_timeout_height | {timeoutHeight} | |
+| acknowledge_packet | packet_timeout_timestamp | {timeoutTimestamp} | |
+| acknowledge_packet | packet_sequence | {sequence} | |
+| acknowledge_packet | packet_src_port | {sourcePort} | |
+| acknowledge_packet | packet_src_channel | {sourceChannel} | |
+| acknowledge_packet | packet_dst_port | {destinationPort} | |
+| acknowledge_packet | packet_dst_channel | {destinationChannel} | |
+| acknowledge_packet | packet_channel_ordering | {channel.Ordering} | |
+| acknowledge_packet | packet_connection | {channel.ConnectionHops[0]} | Deprecated |
+| acknowledge_packet | connection_id | {channel.ConnectionHops[0]} | |
+| message | action | acknowledge_packet | |
+| message | module | ibc-channel | |
### MsgTimeoutPacket & MsgTimeoutOnClose
-| Type | Attribute Key | Attribute Value |
-|----------------|--------------------------|----------------------|
-| timeout_packet | packet_timeout_height | {timeoutHeight} |
-| timeout_packet | packet_timeout_timestamp | {timeoutTimestamp} |
-| timeout_packet | packet_sequence | {sequence} |
-| timeout_packet | packet_src_port | {sourcePort} |
-| timeout_packet | packet_src_channel | {sourceChannel} |
-| timeout_packet | packet_dst_port | {destinationPort} |
-| timeout_packet | packet_dst_channel | {destinationChannel} |
-| timeout_packet | packet_channel_ordering | {channel.Ordering} |
-| message | action | timeout_packet |
-| message | module | ibc-channel |
-
+| Type | Attribute Key | Attribute Value |
+|----------------|--------------------------|-------------------------------|
+| timeout_packet | packet_timeout_height | {timeoutHeight} |
+| timeout_packet | packet_timeout_timestamp | {timeoutTimestamp} |
+| timeout_packet | packet_sequence | {sequence} |
+| timeout_packet | packet_src_port | {sourcePort} |
+| timeout_packet | packet_src_channel | {sourceChannel} |
+| timeout_packet | packet_dst_port | {destinationPort} |
+| timeout_packet | packet_dst_channel | {destinationChannel} |
+| timeout_packet | packet_channel_ordering | {channel.Ordering} |
+| timeout_packet | connection_id | {channel.ConnectionHops[0]} |
+| message | action | timeout_packet |
+| message | module | ibc-channel |
diff --git a/docs/ibc/integration.md b/docs/ibc/integration.md
index 61c2510588f..e9d871ec5e1 100644
--- a/docs/ibc/integration.md
+++ b/docs/ibc/integration.md
@@ -16,7 +16,7 @@ Integrating the IBC module to your SDK-based application is straighforward. The
- Add required modules to the `module.BasicManager`
- Define additional `Keeper` fields for the new modules on the `App` type
-- Add the module's `StoreKeys` and initialize their `Keepers`
+- Add the module's `StoreKey`s and initialize their `Keeper`s
- Set up corresponding routers and routes for the `ibc` module
- Add the modules to the module `Manager`
- Add modules to `Begin/EndBlockers` and `InitGenesis`
@@ -28,10 +28,10 @@ The first step is to add the following modules to the `BasicManager`: `x/capabil
and `x/ibc-transfer`. After that, we need to grant `Minter` and `Burner` permissions to
the `ibc-transfer` `ModuleAccount` to mint and burn relayed tokens.
-### Integrating Light Clients
+### Integrating light clients
> Note that from v7 onwards, all light clients have to be explicitly registered in a chain's app.go and follow the steps listed below.
- This is in contrast to earlier versions of ibc-go when 07-tendermint and 06-solomachine were added out of the box.
+ This is in contrast to earlier versions of ibc-go when `07-tendermint` and `06-solomachine` were added out of the box.
All light clients must be registered with `module.BasicManager` in a chain's app.go file.
@@ -40,9 +40,9 @@ The following code example shows how to register the existing `ibctm.AppModuleBa
```diff
import (
- ...
-+ ibctm "github.com/cosmos/ibc-go/v6/modules/light-clients/07-tendermint"
- ...
+ ...
++ ibctm "github.com/cosmos/ibc-go/v6/modules/light-clients/07-tendermint"
+ ...
)
// app.go
@@ -55,7 +55,7 @@ var (
transfer.AppModuleBasic{}, // i.e ibc-transfer module
// register light clients on IBC
-+ ibctm.AppModuleBasic{},
++ ibctm.AppModuleBasic{},
)
// module account permissions
@@ -63,6 +63,7 @@ var (
// other module accounts permissions
// ...
ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner},
+ }
)
```
@@ -158,7 +159,7 @@ func NewApp(...args) *App {
### Module Managers
-In order to use IBC, we need to add the new modules to the module `Manager` and to the `SimulationManager` in case your application supports [simulations](https://github.com/cosmos/cosmos-sdk/blob/main/docs/docs/building-modules/13-simulator.md).
+In order to use IBC, we need to add the new modules to the module `Manager` and to the `SimulationManager` in case your application supports [simulations](https://github.com/cosmos/cosmos-sdk/blob/main/docs/docs/building-modules/14-simulator.md).
```go
// app.go
diff --git a/docs/ibc/light-clients/client-state.md b/docs/ibc/light-clients/client-state.md
index 9ecfe891323..bd74762e562 100644
--- a/docs/ibc/light-clients/client-state.md
+++ b/docs/ibc/light-clients/client-state.md
@@ -4,7 +4,7 @@ order: 2
# Implementing the `ClientState` interface
-Learn how to implement the [`ClientState`](https://github.com/cosmos/ibc-go/blob/v6.0.0/modules/core/exported/client.go#L40) interface.
+Learn how to implement the [`ClientState`](https://github.com/cosmos/ibc-go/blob/v6.0.0/modules/core/exported/client.go#L40) interface. This list of methods described here does not include all methods of the interface. Some methods are explained in detail in the relevant sections of the guide.
## `ClientType` method
@@ -18,27 +18,27 @@ The format is created as follows: `ClientType-{N}` where `{N}` is the unique glo
## `Validate` method
`Validate` should validate every client state field and should return an error if any value is invalid. The light client
-implementer is in charge of determining which checks are required. See the [tendermint light client implementation](https://github.com/cosmos/ibc-go/blob/v6.0.0/modules/light-clients/07-tendermint/types/client_state.go#L101) as a reference.
+implementer is in charge of determining which checks are required. See the [Tendermint light client implementation](https://github.com/cosmos/ibc-go/blob/v6.0.0/modules/light-clients/07-tendermint/types/client_state.go#L101) as a reference.
## `Status` method
`Status` must return the status of the client.
- An `Active` status indicates that clients are allowed to process packets.
-- A `Frozen` status indicates that a client is not allowed to be used.
-- An `Expired` status indicates that a client is not allowed to be used.
+- A `Frozen` status indicates that misbehaviour was detected in the counterparty chain and the client is not allowed to be used.
+- An `Expired` status indicates that a client is not allowed to be used because it was not updated for longer than the trusting period.
- An `Unknown` status indicates that there was an error in determining the status of a client.
-All possible Status types can be found [here](https://github.com/cosmos/ibc-go/blob/v6.0.0/modules/core/exported/client.go#L26-L36).
+All possible `Status` types can be found [here](https://github.com/cosmos/ibc-go/blob/v6.0.0/modules/core/exported/client.go#L26-L36).
-This field is returned by the gRPC [QueryClientStatusResponse](https://github.com/cosmos/ibc-go/blob/v6.0.0/modules/core/02-client/types/query.pb.go#L665) endpoint.
+This field is returned in the response of the gRPC [`ibc.core.client.v1.Query/ClientStatus`](https://github.com/cosmos/ibc-go/blob/v6.0.0/modules/core/02-client/types/query.pb.go#L665) endpoint.
## `ZeroCustomFields` method
`ZeroCustomFields` should return a copy of the light client with all client customizable fields with their zero value. It should not mutate the fields of the light client.
This method is used when [scheduling upgrades](https://github.com/cosmos/ibc-go/blob/v6.0.0/modules/core/02-client/keeper/proposal.go#L89). Upgrades are used to upgrade chain specific fields.
-In the tendermint case, this may be the chainID or the unbonding period.
-For more information about client upgrades see [the developer guide](../upgrades/developer-guide.md).
+In the tendermint case, this may be the chain ID or the unbonding period.
+For more information about client upgrades see the [Handling upgrades](./upgrades.md) section.
## `GetTimestampAtHeight` method
@@ -54,22 +54,22 @@ Clients may also store any necessary client-specific metadata.
## `VerifyMembership` method
-`VerifyMembership` must verify the existence of a value at a given CommitmentPath at the specified height. For more information about membership proofs
-see [the proof docs](./proofs.md).
+`VerifyMembership` must verify the existence of a value at a given commitment path at the specified height. For more information about membership proofs
+see the [Existence and non-existence proofs section](./proofs.md).
## `VerifyNonMembership` method
-`VerifyNonMembership` must verify the absence of a value at a given CommitmentPath at a specified height. For more information about non membership proofs
-see [the proof docs](./proofs.md).
+`VerifyNonMembership` must verify the absence of a value at a given commitment path at a specified height. For more information about non-membership proofs
+see the [Existence and non-existence proofs section](./proofs.md).
## `VerifyClientMessage` method
-VerifyClientMessage must verify a ClientMessage. A ClientMessage could be a Header, Misbehaviour, or batch update.
-It must handle each type of ClientMessage appropriately. Calls to CheckForMisbehaviour, UpdateState, and UpdateStateOnMisbehaviour
-will assume that the content of the ClientMessage has been verified and can be trusted. An error should be returned
+`VerifyClientMessage` must verify a `ClientMessage`. A `ClientMessage` could be a `Header`, `Misbehaviour`, or batch update.
+It must handle each type of `ClientMessage` appropriately. Calls to `CheckForMisbehaviour`, `UpdateState`, and `UpdateStateOnMisbehaviour`
+will assume that the content of the `ClientMessage` has been verified and can be trusted. An error should be returned
if the ClientMessage fails to verify.
## `CheckForMisbehaviour` method
-Checks for evidence of a misbehaviour in Header or Misbehaviour type. It assumes the ClientMessage
+Checks for evidence of a misbehaviour in `Header` or `Misbehaviour` type. It assumes the `ClientMessage`
has already been verified.
diff --git a/docs/ibc/light-clients/consensus-state.md b/docs/ibc/light-clients/consensus-state.md
index ebde1e8cbbe..51ce29eac62 100644
--- a/docs/ibc/light-clients/consensus-state.md
+++ b/docs/ibc/light-clients/consensus-state.md
@@ -4,7 +4,9 @@ order: 3
# Implementing the `ConsensusState` interface
-A `ConsensusState` is the snapshot of the counterparty chain that an IBC client uses to verify proofs (e.g. a block). The further development of multiple types of IBC light clients and the difficulties presented by this generalization problem (see [ADR-006](https://github.com/cosmos/ibc-go/blob/main/docs/architecture/adr-006-02-client-refactor.md) for more information about this historical context) led to the design decision of each client keeping track of and set its own `ClientState` and `ConsensusState`, as well as the simplification of client `ConsensusState` updates through the generalized `ClientMessage` interface.
+A `ConsensusState` is the snapshot of the counterparty chain, that an IBC client uses to verify proofs (e.g. a block).
+
+The further development of multiple types of IBC light clients and the difficulties presented by this generalization problem (see [ADR-006](https://github.com/cosmos/ibc-go/blob/main/docs/architecture/adr-006-02-client-refactor.md) for more information about this historical context) led to the design decision of each client keeping track of and set its own `ClientState` and `ConsensusState`, as well as the simplification of client `ConsensusState` updates through the generalized `ClientMessage` interface.
The below [`ConsensusState`](https://github.com/cosmos/ibc-go/blob/main/modules/core/exported/client.go#L134) interface is a generalized interface for the types of information a `ConsensusState` could contain. For a reference `ConsensusState` implementation, please see the [Tendermint light client `ConsensusState`](https://github.com/cosmos/ibc-go/blob/main/modules/light-clients/07-tendermint/consensus_state.go).
diff --git a/docs/ibc/light-clients/genesis.md b/docs/ibc/light-clients/genesis.md
index 8b5d697cc9e..21825865183 100644
--- a/docs/ibc/light-clients/genesis.md
+++ b/docs/ibc/light-clients/genesis.md
@@ -1,18 +1,18 @@
-# Genesis Metadata
+# Genesis metadata
Learn how to implement the `ExportMetadata` interface {synopsis}
-## Pre-requisite Readings
+## Pre-requisite readings
- [Cosmos SDK module genesis](https://docs.cosmos.network/v0.47/building-modules/genesis) {prereq}
`ClientState` instances are provided their own isolated and namespaced client store upon initialisation. `ClientState` implementations may choose to store any amount of arbitrary metadata in order to verify counterparty consensus state and perform light client updates correctly.
-The `ExportMetadata` method of the `ClientState` interface provides light client modules with the ability to persist metadata in genesis exports.
+The `ExportMetadata` method of the [`ClientState` interface](https://github.com/cosmos/ibc-go/blob/e650be91614ced7be687c30eb42714787a3bbc59/modules/core/exported/client.go) provides light client modules with the ability to persist metadata in genesis exports.
```go
ExportMetadata(clientStore sdk.KVStore) []GenesisMetadata
@@ -22,14 +22,15 @@ ExportMetadata(clientStore sdk.KVStore) []GenesisMetadata
```go
type GenesisMetadata interface {
- // return store key that contains metadata without clientID-prefix
- GetKey() []byte
- // returns metadata value
- GetValue() []byte
+ // return store key that contains metadata without clientID-prefix
+ GetKey() []byte
+ // returns metadata value
+ GetValue() []byte
}
```
-This allows `ClientState` instances to retrieve and export any number of key-value pairs which are maintained within the store in their raw `[]byte` form.
+This allows `ClientState` instances to retrieve and export any number of key-value pairs which are maintained within the store in their raw `[]byte` form.
+
When a chain is started with a `genesis.json` file which contains `ClientState` metadata (for example, when performing manual upgrades using an exported `genesis.json`) the `02-client` submodule of core IBC will handle setting the key-value pairs within their respective client stores. [See `02-client` `InitGenesis`](https://github.com/cosmos/ibc-go/blob/02-client-refactor-beta1/modules/core/02-client/genesis.go#L18-L22).
-Please refer to the [`07-tendermint` implementation](https://github.com/cosmos/ibc-go/blob/02-client-refactor-beta1/modules/light-clients/07-tendermint/genesis.go#L12) as an example.
+Please refer to the [Tendermint light client implementation](https://github.com/cosmos/ibc-go/blob/02-client-refactor-beta1/modules/light-clients/07-tendermint/genesis.go#L12) for an example.
diff --git a/docs/ibc/light-clients/localhost/client-state.md b/docs/ibc/light-clients/localhost/client-state.md
new file mode 100644
index 00000000000..15c6e1c4b8a
--- /dev/null
+++ b/docs/ibc/light-clients/localhost/client-state.md
@@ -0,0 +1,60 @@
+
+
+# `ClientState`
+
+The 09-localhost `ClientState` maintains a single field used to track the latest sequence of the state machine i.e. the height of the blockchain.
+
+```go
+type ClientState struct {
+ // the latest height of the blockchain
+ LatestHeight clienttypes.Height
+}
+```
+
+The 09-localhost `ClientState` is instantiated in the `InitGenesis` handler of the 02-client submodule in core IBC.
+It calls `CreateLocalhostClient`, declaring a new `ClientState` and initializing it with its own client prefixed store.
+
+```go
+func (k Keeper) CreateLocalhostClient(ctx sdk.Context) error {
+ var clientState localhost.ClientState
+ return clientState.Initialize(ctx, k.cdc, k.ClientStore(ctx, exported.LocalhostClientID), nil)
+}
+```
+
+It is possible to disable the localhost client by removing the `09-localhost` entry from the `allowed_clients` list through governance.
+
+## Client updates
+
+The latest height is updated periodically through the ABCI [`BeginBlock`](https://docs.cosmos.network/v0.47/building-modules/beginblock-endblock) interface of the 02-client submodule in core IBC.
+
+[See `BeginBlocker` in abci.go.](https://github.com/cosmos/ibc-go/blob/09-localhost/modules/core/02-client/abci.go#L12)
+
+```go
+func BeginBlocker(ctx sdk.Context, k keeper.Keeper) {
+ // ...
+
+ if clientState, found := k.GetClientState(ctx, exported.Localhost); found {
+ if k.GetClientStatus(ctx, clientState, exported.Localhost) == exported.Active {
+ k.UpdateLocalhostClient(ctx, clientState)
+ }
+ }
+}
+```
+
+The above calls into the the 09-localhost `UpdateState` method of the `ClientState` .
+It retrieves the current block height from the application context and sets the `LatestHeight` of the 09-localhost client.
+
+```go
+func (cs ClientState) UpdateState(ctx sdk.Context, cdc codec.BinaryCodec, clientStore sdk.KVStore, clientMsg exported.ClientMessage) []exported.Height {
+ height := clienttypes.GetSelfHeight(ctx)
+ cs.LatestHeight = height
+
+ clientStore.Set(host.ClientStateKey(), clienttypes.MustMarshalClientState(cdc, &cs))
+
+ return []exported.Height{height}
+}
+```
+
+Note that the 09-localhost `ClientState` is not updated through the 02-client interface leveraged by conventional IBC light clients.
diff --git a/docs/ibc/light-clients/localhost/connection.md b/docs/ibc/light-clients/localhost/connection.md
new file mode 100644
index 00000000000..33251bde432
--- /dev/null
+++ b/docs/ibc/light-clients/localhost/connection.md
@@ -0,0 +1,25 @@
+
+
+# Localhost connections
+
+The 09-localhost light client module integrates with core IBC through a single sentinel localhost connection.
+The sentinel `ConnectionEnd` is stored by default in the core IBC store.
+
+This enables channel handshakes to be initiated out of the box by supplying the localhost connection identifier (`connection-localhost`) in the `connectionHops` parameter of `MsgChannelOpenInit`.
+
+The `ConnectionEnd` is created and set in store via the `InitGenesis` handler of the 03-connection submodule in core IBC.
+The `ConnectionEnd` and its `Counterparty` both reference the `09-localhost` client identifier, and share the localhost connection identifier `connection-localhost`.
+
+```go
+// CreateSentinelLocalhostConnection creates and sets the sentinel localhost connection end in the IBC store.
+func (k Keeper) CreateSentinelLocalhostConnection(ctx sdk.Context) {
+ counterparty := types.NewCounterparty(exported.LocalhostClientID, exported.LocalhostConnectionID, commitmenttypes.NewMerklePrefix(k.GetCommitmentPrefix().Bytes()))
+ connectionEnd := types.NewConnectionEnd(types.OPEN, exported.LocalhostClientID, counterparty, types.ExportedVersionsToProto(types.GetCompatibleVersions()), 0)
+
+ k.SetConnection(ctx, exported.LocalhostConnectionID, connectionEnd)
+}
+```
+
+Note that connection handshakes are disallowed when using the `09-localhost` client type.
diff --git a/docs/ibc/light-clients/localhost/integration.md b/docs/ibc/light-clients/localhost/integration.md
new file mode 100644
index 00000000000..a818507f1fd
--- /dev/null
+++ b/docs/ibc/light-clients/localhost/integration.md
@@ -0,0 +1,16 @@
+
+
+# Integration
+
+The 09-localhost light client module registers codec types within the core IBC module. This differs from other light client module implementations which are expected to register codec types using the `AppModuleBasic` interface.
+
+The localhost client is added to the 02-client submodule param [`allowed_clients`](https://github.com/cosmos/ibc-go/blob/v7.0.0-rc0/proto/ibc/core/client/v1/client.proto#L102) by default in ibc-go.
+
+```go
+var (
+ // DefaultAllowedClients are the default clients for the AllowedClients parameter.
+ DefaultAllowedClients = []string{exported.Solomachine, exported.Tendermint, exported.Localhost}
+)
+```
\ No newline at end of file
diff --git a/docs/ibc/light-clients/localhost/overview.md b/docs/ibc/light-clients/localhost/overview.md
new file mode 100644
index 00000000000..eca758e0221
--- /dev/null
+++ b/docs/ibc/light-clients/localhost/overview.md
@@ -0,0 +1,40 @@
+
+
+# `09-localhost`
+
+## Overview
+
+Learn about the 09-localhost light client module. {synopsis}
+
+The 09-localhost light client module implements a localhost loopback client with the ability to send and receive IBC packets to and from the same state machine.
+
+### Context
+
+In a multichain environment, application developers will be used to developing cross-chain applications through IBC. From their point of view, whether or not they are interacting with multiple modules on the same chain or on different chains should not matter. The localhost client module enables a unified interface to interact with different applications on a single chain, using the familiar IBC application layer semantics.
+
+### Implementation
+
+There exists a [single sentinel `ClientState`](./client-state.md) instance with the client identifier `09-localhost`.
+
+To supplement this, a [sentinel `ConnectionEnd` is stored in core IBC](./connection.md) state with the connection identifier `connection-localhost`. This enables IBC applications to create channels directly on top of the sentinel connection which leverage the 09-localhost loopback functionality.
+
+[State verification](./state-verification.md) for channel state in handshakes or processing packets is reduced in complexity, the `09-localhost` client can simply compare bytes stored under the standardized key paths.
+
+### Localhost vs *regular* client
+
+The localhost client aims to provide a unified approach to interacting with applications on a single chain, as the IBC application layer provides for cross-chain interactions. To achieve this unified interface though, there are a number of differences under the hood compared to a 'regular' IBC client (excluding `06-solomachine` and `09-localhost` itself).
+
+The table below lists some important differences:
+
+| | Regular client | Localhost |
+| -------------------------------------------- | --------------------------------------------------------------------------- | --------- |
+| Number of clients | Many instances of a client *type* corresponding to different counterparties | A single sentinel client with the client identifier `09-localhost`|
+| Client creation | Relayer (permissionless) | `ClientState` is instantiated in the `InitGenesis` handler of the 02-client submodule in core IBC |
+| Client updates | Relayer submits headers using `MsgUpdateClient` | Latest height is updated periodically through the ABCI [`BeginBlock`](https://docs.cosmos.network/v0.47/building-modules/beginblock-endblock) interface of the 02-client submodule in core IBC |
+| Number of connections | Many connections, 1 (or more) per client | A single sentinel connection with the connection identifier `connection-localhost` |
+| Connection creation | Connection handshake, provided underlying client | Sentinel `ConnectionEnd` is created and set in store in the `InitGenesis` handler of the 03-connection submodule in core IBC |
+| Counterparty | Underlying client, representing another chain | Client with identifier `09-localhost` in same chain |
+| `VerifyMembership` and `VerifyNonMembership` | Performs proof verification using consensus state roots | Performs state verification using key-value lookups in the core IBC store |
+| Integration | Expected to register codec types using the `AppModuleBasic` interface | Registers codec types within the core IBC module |
diff --git a/docs/ibc/light-clients/localhost/state-verification.md b/docs/ibc/light-clients/localhost/state-verification.md
new file mode 100644
index 00000000000..a208c8734c3
--- /dev/null
+++ b/docs/ibc/light-clients/localhost/state-verification.md
@@ -0,0 +1,18 @@
+
+
+# State verification
+
+The localhost client handles state verification through the `ClientState` interface methods `VerifyMembership` and `VerifyNonMembership` by performing read-only operations directly on the core IBC store.
+
+When verifying channel state in handshakes or processing packets the `09-localhost` client can simply compare bytes stored under the standardized key paths defined by [ICS-24](https://github.com/cosmos/ibc/tree/main/spec/core/ics-024-host-requirements).
+
+For existence proofs via `VerifyMembership` the 09-localhost client will retrieve the value stored under the provided key path and compare it against the value provided by the caller. In contrast, non-existence proofs via `VerifyNonMembership` assert the absence of a value at the provided key path.
+
+Relayers are expected to provide a sentinel proof when sending IBC messages. Submission of nil or empty proofs is disallowed in core IBC messaging.
+The 09-localhost light client module defines a `SentinelProof` as a single byte. Localhost client state verification will fail if the sentintel proof value is not provided.
+
+```go
+var SentinelProof = []byte{0x01}
+```
diff --git a/docs/ibc/light-clients/overview.md b/docs/ibc/light-clients/overview.md
index c8505603d21..9eae03f7a43 100644
--- a/docs/ibc/light-clients/overview.md
+++ b/docs/ibc/light-clients/overview.md
@@ -14,7 +14,7 @@ Learn how to build IBC light client modules and fulfill the interfaces required
IBC uses light clients in order to provide trust-minimized interoperability between sovereign blockchains. Light clients operate under a strict set of rules which provide security guarantees for state updates and facilitate the ability to verify the state of a remote blockchain using merkle proofs.
-The following aims to provide a high level IBC light client module developer guide. Access to IBC light clients are gated by the core IBC `MsgServer` which utilizes the abstractions set by the `02-client` submodule to call into a light client module. A light client module developer is only required to implement a set interfaces as defined in the `core/modules/exported` package of ibc-go.
+The following aims to provide a high level IBC light client module developer guide. Access to IBC light clients are gated by the core IBC `MsgServer` which utilizes the abstractions set by the `02-client` submodule to call into a light client module. A light client module developer is only required to implement a set interfaces as defined in the `modules/core/exported` package of ibc-go.
A light client module developer should be concerned with three main interfaces:
@@ -26,9 +26,9 @@ Throughout this guide the `07-tendermint` light client module may be referred to
## Concepts and vocabulary
-### ClientState
+### `ClientState`
-ClientState is a term used to define the data structure which encapsulates opaque light client state. The `ClientState` contains all the information needed to verify a `ClientMessage` and perform membership and non-membership proof verification of counterparty state. This includes properties that refer to the remote state machine, the light client type and the specific light client instance.
+`ClientState` is a term used to define the data structure which encapsulates opaque light client state. The `ClientState` contains all the information needed to verify a `ClientMessage` and perform membership and non-membership proof verification of counterparty state. This includes properties that refer to the remote state machine, the light client type and the specific light client instance.
For example:
@@ -40,25 +40,25 @@ For example:
The `ClientState` type maintained within the light client module *must* implement the [`ClientState`](https://github.com/cosmos/ibc-go/tree/02-client-refactor-beta1/modules/core/exported/client.go#L36) interface defined in `core/modules/exported/client.go`.
The methods which make up this interface are detailed at a more granular level in the [ClientState section of this guide](./client-state.md).
-Please refer to the `07-tendermint` light client module's [`ClientState` defintion](https://github.com/cosmos/ibc-go/tree/02-client-refactor-beta1/proto/ibc/lightclients/tendermint/v1/tendermint.proto#L18) containing information such as chain ID, status, latest height, unbonding period and proof specifications.
+Please refer to the `07-tendermint` light client module's [`ClientState` definition](https://github.com/cosmos/ibc-go/tree/02-client-refactor-beta1/proto/ibc/lightclients/tendermint/v1/tendermint.proto#L18) containing information such as chain ID, status, latest height, unbonding period and proof specifications.
-### ConsensusState
+### `ConsensusState`
-ConsensusState is a term used to define the data structure which encapsulates consensus data at a particular point in time, i.e. a unique height or sequence number of a state machine. There must exist a single trusted `ConsensusState` for each height. `ConsensusState` generally contains a trusted root, validator set information and timestamp.
+`ConsensusState` is a term used to define the data structure which encapsulates consensus data at a particular point in time, i.e. a unique height or sequence number of a state machine. There must exist a single trusted `ConsensusState` for each height. `ConsensusState` generally contains a trusted root, validator set information and timestamp.
For example, the `ConsensusState` of the `07-tendermint` light client module defines a trusted root which is used by the `ClientState` to perform verification of membership and non-membership commitment proofs, as well as the next validator set hash used for verifying headers can be trusted in client updates.
-The `ConsensusState` type maintained within the light client module *must* implement the [`ConsensusState`](https://github.com/cosmos/ibc-go/tree/02-client-refactor-beta1/modules/core/exported/client.go#L134) interface defined in `core/modules/exported/client.go`.
-The methods which make up this interface are detailed at a more granular level in the [ConsensusState section of this guide](./consensus-state.md).
+The `ConsensusState` type maintained within the light client module *must* implement the [`ConsensusState`](https://github.com/cosmos/ibc-go/tree/02-client-refactor-beta1/modules/core/exported/client.go#L134) interface defined in `modules/core/exported/client.go`.
+The methods which make up this interface are detailed at a more granular level in the [`ConsensusState` section of this guide](./consensus-state.md).
-### Height
+### `Height`
-Height defines a monotonically increasing sequence number which provides ordering of consensus state data persisted through client updates.
-IBC light client module developers are expected to use the [concrete type](https://github.com/cosmos/ibc-go/tree/02-client-refactor-beta1/proto/ibc/core/client/v1/client.proto#L89) provided by the `02-client` submodule. This implements the expectations required by the `Height` interface defined in `core/modules/exported/client.go`.
+`Height` defines a monotonically increasing sequence number which provides ordering of consensus state data persisted through client updates.
+IBC light client module developers are expected to use the [concrete type](https://github.com/cosmos/ibc-go/tree/02-client-refactor-beta1/proto/ibc/core/client/v1/client.proto#L89) provided by the `02-client` submodule. This implements the expectations required by the [`Height`](https://github.com/cosmos/ibc-go/blob/02-client-refactor-beta1/modules/core/exported/client.go#L157) interface defined in `modules/core/exported/client.go`.
-### ClientMessage
+### `ClientMessage`
-ClientMessage refers to the interface type [`ClientMessage`](https://github.com/cosmos/ibc-go/tree/02-client-refactor-beta1/modules/core/exported/client.go#L148) used for performing updates to a `ClientState` stored on chain.
+`ClientMessage` refers to the interface type [`ClientMessage`](https://github.com/cosmos/ibc-go/tree/02-client-refactor-beta1/modules/core/exported/client.go#L148) used for performing updates to a `ClientState` stored on chain.
This may be any concrete type which produces a change in state to the IBC client when verified.
The following are considered as valid update scenarios:
@@ -67,4 +67,4 @@ The following are considered as valid update scenarios:
- A batch of block headers which when verified inserts `N` `ConsensusState` instances for `N` unique heights.
- Evidence of misbehaviour provided by two conflicting block headers.
-Learn more in the [handling client updates](./update.md) and [handling misbehaviour](./updates-and-misbehaviour.md) sections.
+Learn more in the [Handling update and misbehaviour](./updates-and-misbehaviour.md) section.
diff --git a/docs/ibc/light-clients/proofs.md b/docs/ibc/light-clients/proofs.md
index 585511d9aee..91ddc2c03fd 100644
--- a/docs/ibc/light-clients/proofs.md
+++ b/docs/ibc/light-clients/proofs.md
@@ -1,35 +1,62 @@
-# Existence and Non-Existence Proofs
+# Existence and non-existence proofs
-IBC uses merkle proofs in order to verify the state of a remote counterparty state machine given a trusted root, and [ICS23](https://github.com/cosmos/ics23/tree/master/go) is a general approach for verifying merkle trees which is used in `ibc-go`.
+IBC uses merkle proofs in order to verify the state of a remote counterparty state machine given a trusted root, and [ICS-23](https://github.com/cosmos/ics23/tree/master/go) is a general approach for verifying merkle trees which is used in ibc-go.
-Currently, all Cosmos SDK modules contain their own stores, which maintain the state of the application module in an IAVL (immutable AVL) binary merkle tree format. Specifically with regard to IBC, core IBC maintains its own IAVL store, and IBC apps (e.g. transfer) maintain their own dedicated stores. The Cosmos SDK multistore therefore creates a simple merkle tree of all of these IAVL trees, and from each of these individual IAVL tree root hashes derives a root hash for the application state tree as a whole (the apphash).
+Currently, all Cosmos SDK modules contain their own stores, which maintain the state of the application module in an IAVL (immutable AVL) binary merkle tree format. Specifically with regard to IBC, core IBC maintains its own IAVL store, and IBC apps (e.g. transfer) maintain their own dedicated stores. The Cosmos SDK multistore therefore creates a simple merkle tree of all of these IAVL trees, and from each of these individual IAVL tree root hashes it derives a root hash for the application state tree as a whole (the `AppHash`).
-For the purposes of `ibc-go`, there are two types of proofs which are important: existence and non-existence proofs, terms which have been used interchangeably with membership and non-membership proofs. For the purposes of this guide, we will stick with 'existence' and 'non-existence'.
+For the purposes of ibc-go, there are two types of proofs which are important: existence and non-existence proofs, terms which have been used interchangeably with membership and non-membership proofs. For the purposes of this guide, we will stick with "existence" and "non-existence".
-## Existence Proofs
+## Existence proofs
Existence proofs are used in IBC transactions which involve verification of counterparty state for transactions which will result in the writing of provable state. For example, this includes verification of IBC store state for handshakes and packets.
Put simply, existence proofs prove that a particular key and value exists in the tree. Under the hood, an IBC existence proof comprises of two proofs: an IAVL proof that the key exists in IBC store/IBC root hash, and a proof that the IBC root hash exists in the multistore root hash.
-## Non-Existence Proofs
+## Non-existence proofs
Non-existence proofs verify the absence of data stored within counterparty state and are used to prove that a key does NOT exist in state. As stated above, these types of proofs can be used to timeout packets by proving that the counterparty has not written a packet receipt into the store, meaning that a token transfer has NOT successfully occurred.
-Some trees (e.g. SMT) may have a sentinel empty child for nonexistent keys. In this case, the ICS23 proof spec should include this `EmptyChild` so that ICS23 handles the nonexistence proof correctly.
+Some trees (e.g. SMT) may have a sentinel empty child for non-existent keys. In this case, the ICS-23 proof spec should include this `EmptyChild` so that ICS-23 handles the non-existence proof correctly.
In some cases, there is a necessity to "mock" non-existence proofs if the counterparty does not have ability to prove absence. Since the verification method is designed to give complete control to client implementations, clients can support chains that do not provide absence proofs by verifying the existence of a non-empty sentinel `ABSENCE` value. In these special cases, the proof provided will be an ICS-23 `Existence` proof, and the client will verify that the `ABSENCE` value is stored under the given path for the given height.
-## State Verification Methods: `VerifyMembership` and `VerifyNonMembership`
+## State verification methods: `VerifyMembership` and `VerifyNonMembership`
The state verification functions for all IBC data types have been consolidated into two generic methods, `VerifyMembership` and `VerifyNonMembership`.
-For more information about how to implement `VerifyMembership`, please see the `ClientState` [implementation guide](https://github.com/cosmos/ibc-go/blob/02-client-refactor-beta1/docs/ibc/light-clients/client-state.md#verifymembership-method).
-
-For more information about how to implement `VerifyNonMembership`, please see the `ClientState` [implementation guide](https://github.com/cosmos/ibc-go/blob/02-client-refactor-beta1/docs/ibc/light-clients/client-state.md#verifynonmembership-method).
-
-Both are expected to be provided with a standardised key path, `exported.Path`, as defined in [ICS-24 host requirements](https://github.com/cosmos/ibc/tree/main/spec/core/ics-024-host-requirements). Membership verification requires callers to provide the marshalled value `[]byte`. Delay period values should be zero for non-packet processing verification. A zero proof height is now allowed by core IBC and may be passed into `VerifyMembership` and `VerifyNonMembership`. Light clients are responsible for returning an error if a zero proof height is invalid behaviour.
\ No newline at end of file
+From the [`ClientState` interface definition](https://github.com/cosmos/ibc-go/blob/e650be91614ced7be687c30eb42714787a3bbc59/modules/core/exported/client.go#L68-L91), we find:
+
+```go
+VerifyMembership(
+ ctx sdk.Context,
+ clientStore sdk.KVStore,
+ cdc codec.BinaryCodec,
+ height Height,
+ delayTimePeriod uint64,
+ delayBlockPeriod uint64,
+ proof []byte,
+ path Path,
+ value []byte,
+) error
+
+// VerifyNonMembership is a generic proof verification method which verifies the absence of a given CommitmentPath at a specified height.
+// The caller is expected to construct the full CommitmentPath from a CommitmentPrefix and a standardized path (as defined in ICS 24).
+VerifyNonMembership(
+ ctx sdk.Context,
+ clientStore sdk.KVStore,
+ cdc codec.BinaryCodec,
+ height Height,
+ delayTimePeriod uint64,
+ delayBlockPeriod uint64,
+ proof []byte,
+ path Path,
+) error
+```
+
+Both are expected to be provided with a standardised key path, `exported.Path`, as defined in [ICS-24 host requirements](https://github.com/cosmos/ibc/tree/main/spec/core/ics-024-host-requirements). Membership verification requires callers to provide the value marshalled as `[]byte`. Delay period values should be zero for non-packet processing verification. A zero proof height is now allowed by core IBC and may be passed into `VerifyMembership` and `VerifyNonMembership`. Light clients are responsible for returning an error if a zero proof height is invalid behaviour.
+
+Please refer to the [ICS-23 implementation](https://github.com/cosmos/ibc-go/blob/e093d85b533ab3572b32a7de60b88a0816bed4af/modules/core/23-commitment/types/merkle.go#L131-L205) for a concrete example.
diff --git a/docs/ibc/light-clients/proposal.md b/docs/ibc/light-clients/proposal.md
deleted file mode 100644
index 74abe182fbf..00000000000
--- a/docs/ibc/light-clients/proposal.md
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-# Implementing `CheckSubstituteAndUpdateState`
-
-`CheckSubstituteAndUpdateState` will try to update the client with the state of the substitute client. [This type of governance proposal](https://ibc.cosmos.network/main/ibc/proposals.html) is typically used to recover an expired and frozen client, as it can recover the entire state and therefore all existing channels built on top of the client.
-
-Prior to updating, this function must verify that:
-- the substitute client is the same type as the subject client. For a reference implementation, please see the [Tendermint light client](https://github.com/cosmos/ibc-go/blob/02-client-refactor-beta1/modules/light-clients/07-tendermint/proposal_handle.go#L32).
-- the provided substitute may be used to update the subject client. This may mean that certain parameters must remain unaltered. For example, a [valid substitute Tendermint light client](https://github.com/cosmos/ibc-go/blob/02-client-refactor-beta1/modules/light-clients/07-tendermint/proposal_handle.go#L84) must NOT change the chain ID, trust level, max clock drift, unbonding period, proof specs or upgrade path. Please note that `AllowUpdateAfterMisbehaviour` and `AllowUpdateAfterExpiry` have been deprecated (see ADR 026 for more information).
-
-After these checks are performed, the function must [set the updated client and consensus states](https://github.com/cosmos/ibc-go/blob/02-client-refactor-beta1/modules/light-clients/07-tendermint/proposal_handle.go#L77) within the clientStore for the subject client.
\ No newline at end of file
diff --git a/docs/ibc/light-clients/proposals.md b/docs/ibc/light-clients/proposals.md
new file mode 100644
index 00000000000..abd27b8aad5
--- /dev/null
+++ b/docs/ibc/light-clients/proposals.md
@@ -0,0 +1,32 @@
+
+
+# Handling proposals
+
+It is possible to update the client with the state of the substitute client through a governance proposal. [This type of governance proposal](https://ibc.cosmos.network/main/ibc/proposals.html) is typically used to recover an expired or frozen client, as it can recover the entire state and therefore all existing channels built on top of the client. `CheckSubstituteAndUpdateState` should be implemented to handle the proposal.
+
+## Implementing `CheckSubstituteAndUpdateState`
+
+In the [`ClientState`interface](https://github.com/cosmos/ibc-go/blob/e650be91614ced7be687c30eb42714787a3bbc59/modules/core/exported/client.go), we find:
+
+```go
+// CheckSubstituteAndUpdateState must verify that the provided substitute may be used to update the subject client.
+// The light client must set the updated client and consensus states within the clientStore for the subject client.
+CheckSubstituteAndUpdateState(
+ ctx sdk.Context,
+ cdc codec.BinaryCodec,
+ subjectClientStore,
+ substituteClientStore sdk.KVStore,
+ substituteClient ClientState)
+ error
+```
+
+Prior to updating, this function must verify that:
+
+- the substitute client is the same type as the subject client. For a reference implementation, please see the [Tendermint light client](https://github.com/cosmos/ibc-go/blob/02-client-refactor-beta1/modules/light-clients/07-tendermint/proposal_handle.go#L32).
+- the provided substitute may be used to update the subject client. This may mean that certain parameters must remain unaltered. For example, a [valid substitute Tendermint light client](https://github.com/cosmos/ibc-go/blob/02-client-refactor-beta1/modules/light-clients/07-tendermint/proposal_handle.go#L84) must NOT change the chain ID, trust level, max clock drift, unbonding period, proof specs or upgrade path. Please note that `AllowUpdateAfterMisbehaviour` and `AllowUpdateAfterExpiry` have been deprecated (see ADR 026 for more information).
+
+After these checks are performed, the function must [set the updated client and consensus states](https://github.com/cosmos/ibc-go/blob/02-client-refactor-beta1/modules/light-clients/07-tendermint/proposal_handle.go#L77) within the client store for the subject client.
+
+Please refer to the [Tendermint light client implementation](https://github.com/cosmos/ibc-go/blob/02-client-refactor-beta1/modules/light-clients/07-tendermint/proposal_handle.go#L27) for reference.
diff --git a/docs/ibc/light-clients/setup.md b/docs/ibc/light-clients/setup.md
index 8bb85b234af..b04a73c1258 100644
--- a/docs/ibc/light-clients/setup.md
+++ b/docs/ibc/light-clients/setup.md
@@ -1,14 +1,18 @@
# Setup
Learn how to configure light client modules and create clients using core IBC and the `02-client` submodule. {synopsis}
+A last step to finish the development of the light client, is to implement the `AppModuleBasic` interface to allow it to be added to the chain's `app.go` alongside other light client types the chain enables.
+
+Finally, a succinct rundown is given of the remaining steps to make the light client operational, getting the light client type passed through governance and creating the clients.
+
## Configuring a light client module
-An IBC light client module must implement the [`AppModuleBasic`](https://github.com/cosmos/cosmos-sdk/blob/main/types/module/module.go#L50) interface in order to register its concrete types against the core IBC interfaces defined in `modules/core/exported`. This is accomplished via the `RegisterInterfaces` method which provides the light client module with the opportunity to register codec types using the chain's `InterfaceRegistery`. Please refer to the [`07-tendermint` codec registration](https://github.com/cosmos/ibc-go/blob/02-client-refactor-beta1/modules/light-clients/07-tendermint/codec.go#L11).
+An IBC light client module must implement the [`AppModuleBasic`](https://github.com/cosmos/cosmos-sdk/blob/main/types/module/module.go#L50) interface in order to register its concrete types against the core IBC interfaces defined in `modules/core/exported`. This is accomplished via the `RegisterInterfaces` method which provides the light client module with the opportunity to register codec types using the chain's `InterfaceRegistry`. Please refer to the [`07-tendermint` codec registration](https://github.com/cosmos/ibc-go/blob/02-client-refactor-beta1/modules/light-clients/07-tendermint/codec.go#L11).
The `AppModuleBasic` interface may also be leveraged to install custom CLI handlers for light client module users. Light client modules can safely no-op for interface methods which it does not wish to implement.
@@ -26,7 +30,7 @@ type AppModuleBasic struct{}
// Name returns the tendermint module name.
func (AppModuleBasic) Name() string {
- return ModuleName
+ return ModuleName
}
// RegisterLegacyAminoCodec performs a no-op. The Tendermint client does not support amino.
@@ -35,17 +39,17 @@ func (AppModuleBasic) RegisterLegacyAminoCodec(*codec.LegacyAmino) {}
// RegisterInterfaces registers module concrete types into protobuf Any. This allows core IBC
// to unmarshal tendermint light client types.
func (AppModuleBasic) RegisterInterfaces(registry codectypes.InterfaceRegistry) {
- RegisterInterfaces(registry)
+ RegisterInterfaces(registry)
}
// DefaultGenesis performs a no-op. Genesis is not supported for the tendermint light client.
func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage {
- return nil
+ return nil
}
// ValidateGenesis performs a no-op. Genesis is not supported for the tendermint light cilent.
func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config client.TxEncodingConfig, bz json.RawMessage) error {
- return nil
+ return nil
}
// RegisterGRPCGatewayRoutes performs a no-op.
@@ -53,19 +57,19 @@ func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *r
// GetTxCmd performs a no-op. Please see the 02-client cli commands.
func (AppModuleBasic) GetTxCmd() *cobra.Command {
- return nil
+ return nil
}
// GetQueryCmd performs a no-op. Please see the 02-client cli commands.
func (AppModuleBasic) GetQueryCmd() *cobra.Command {
- return nil
+ return nil
}
```
## Creating clients
A client is created by executing a new `MsgCreateClient` transaction composed with a valid `ClientState` and initial `ConsensusState` encoded as protobuf `Any`s.
-Generally, this is normally done by an off-chain process known as an [IBC relayer](https://github.com/cosmos/ibc/tree/main/spec/relayer/ics-018-relayer-algorithms) however, this is not a strict requirement.
+Generally, this is performed by an off-chain process known as an [IBC relayer](https://github.com/cosmos/ibc/tree/main/spec/relayer/ics-018-relayer-algorithms) however, this is not a strict requirement.
See below for a list of IBC relayer implementations:
@@ -95,7 +99,7 @@ Leveraging protobuf `Any` encoding allows core IBC to [unpack](https://github.co
Within the `02-client` submodule, the [`ClientState` is then initialized](https://github.com/cosmos/ibc-go/blob/02-client-refactor-beta1/modules/core/02-client/keeper/client.go#L30-L34) with its own isolated key-value store, namespaced using a unique client identifier.
-In order to successfully create an IBC client using a new client type it [must be supported](https://github.com/cosmos/ibc-go/blob/02-client-refactor-beta1/modules/core/02-client/keeper/client.go#L18-L24). Light client support in IBC is gated by on-chain governance. The allow list may be updated by submitting a new governance proposal to update the `02-client` parameter `AllowedClients`.
+In order to successfully create an IBC client using a new client type, it [must be supported](https://github.com/cosmos/ibc-go/blob/02-client-refactor-beta1/modules/core/02-client/keeper/client.go#L18-L24). Light client support in IBC is gated by on-chain governance. The allow list may be updated by submitting a new governance proposal to update the `02-client` parameter `AllowedClients`.
See below for example:
-```
+```shell
$ %s tx gov submit-proposal param-change --from=
-Where proposal.json contains:
+```
+
+where `proposal.json` contains:
+
+```json
{
"title": "IBC Clients Param Change",
"description": "Update allowed clients",
diff --git a/docs/ibc/light-clients/update.md b/docs/ibc/light-clients/update.md
deleted file mode 100644
index 504cfca7c5c..00000000000
--- a/docs/ibc/light-clients/update.md
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-# Implementing the `ClientMessage` interface
-
-As mentioned before in the documentation about [implementing the `ConsensusState` interface](./consensus-state.md), [`ClientMessage`](https://github.com/cosmos/ibc-go/blob/main/modules/core/exported/client.go#L145) is an interface used to update an IBC client. This update may be done by a single header, a batch of headers, misbehaviour, or any type which when verified produces a change to the consensus state of the IBC client. This interface has been purposefully kept generic in order to give the maximum amount of flexibility to the light client implementer.
-
-```golang
-type ClientMessage interface {
- proto.Message
-
- ClientType() string
- ValidateBasic() error
-}
-```
-
-The `ClientMessage` will be passed to the client to be used in [`UpdateClient`](https://github.com/cosmos/ibc-go/blob/57da75a70145409247e85365b64a4b2fc6ddad2f/modules/core/02-client/keeper/client.go#L53), which will handle a number of cases including misbehaviour and/or updating the consensus state. However, this `UpdateClient` function will always reference the specific functions determined by the relevant `ClientState`. This is because `UpdateClient` retrieves the client state by client ID (available in `MsgUpdateClient`). This client state implements the `ClientState` interface for a specific client type (e.g. Tendermint). The functions called on the client state instance in `UpdateClient` will be the specific implementations of `VerifyClientMessage`, `CheckForMisbehaviour`, `UpdateStateOnMisbehaviour` and `UpdateState` functions of the `ClientState` interface for that particular client type.
\ No newline at end of file
diff --git a/docs/ibc/light-clients/updates-and-misbehaviour.md b/docs/ibc/light-clients/updates-and-misbehaviour.md
index 715a876ea43..1a503ca7983 100644
--- a/docs/ibc/light-clients/updates-and-misbehaviour.md
+++ b/docs/ibc/light-clients/updates-and-misbehaviour.md
@@ -1,16 +1,51 @@
-# Handling Updates and Misbehaviour
+# Handling `ClientMessage`s: updates and misbehaviour
+
+As mentioned before in the documentation about [implementing the `ConsensusState` interface](./consensus-state.md), [`ClientMessage`](https://github.com/cosmos/ibc-go/blob/main/modules/core/exported/client.go#L145) is an interface used to update an IBC client. This update may be performed by:
+
++ a single header
++ a batch of headers
++ evidence of misbehaviour,
++ or any type which when verified produces a change to the consensus state of the IBC client.
+
+This interface has been purposefully kept generic in order to give the maximum amount of flexibility to the light client implementer.
+
+## Implementing the `ClientMessage` interface
+
+Find the `ClientMessage`interface in `modules/core/exported`:
+
+```go
+type ClientMessage interface {
+ proto.Message
+
+ ClientType() string
+ ValidateBasic() error
+}
+```
+
+The `ClientMessage` will be passed to the client to be used in [`UpdateClient`](https://github.com/cosmos/ibc-go/blob/57da75a70145409247e85365b64a4b2fc6ddad2f/modules/core/02-client/keeper/client.go#L53), which retrieves the `ClientState` by client ID (available in `MsgUpdateClient`). This `ClientState` implements the [`ClientState` interface](./client-state.md) for its specific consenus type (e.g. Tendermint).
+
+`UpdateClient` will then handle a number of cases including misbehaviour and/or updating the consensus state, utilizing the specific methods defined in the relevant `ClientState`.
+
+```go
+VerifyClientMessage(ctx sdk.Context, cdc codec.BinaryCodec, clientStore sdk.KVStore, clientMsg ClientMessage) error
+CheckForMisbehaviour(ctx sdk.Context, cdc codec.BinaryCodec, clientStore sdk.KVStore, clientMsg ClientMessage) bool
+UpdateStateOnMisbehaviour(ctx sdk.Context, cdc codec.BinaryCodec, clientStore sdk.KVStore, clientMsg ClientMessage)
+UpdateState(ctx sdk.Context, cdc codec.BinaryCodec, clientStore sdk.KVStore, clientMsg ClientMessage) []Height
+```
+
+## Handling updates and misbehaviour
The functions for handling updates to a light client and evidence of misbehaviour are all found in the [`ClientState`](https://github.com/cosmos/ibc-go/blob/v6.0.0/modules/core/exported/client.go#L40) interface, and will be discussed below.
-It is important to note that `Misbehaviour` in this particular context is referring to misbehaviour on the chain level intended to fool the light client. This will be defined by each light client.
+> It is important to note that `Misbehaviour` in this particular context is referring to misbehaviour on the chain level intended to fool the light client. This will be defined by each light client.
## `VerifyClientMessage`
-`VerifyClientMessage` must verify a `ClientMessage`. A `ClientMessage` could be a `Header`, `Misbehaviour`, or batch update. To understand how to implement a `ClientMessage`, please refer to the [documentation](./update.md)
+`VerifyClientMessage` must verify a `ClientMessage`. A `ClientMessage` could be a `Header`, `Misbehaviour`, or batch update. To understand how to implement a `ClientMessage`, please refer to the [Implementing the `ClientMessage` interface](#implementing-the-clientmessage-interface) section.
It must handle each type of `ClientMessage` appropriately. Calls to `CheckForMisbehaviour`, `UpdateState`, and `UpdateStateOnMisbehaviour` will assume that the content of the `ClientMessage` has been verified and can be trusted. An error should be returned if the `ClientMessage` fails to verify.
@@ -22,11 +57,11 @@ Checks for evidence of a misbehaviour in `Header` or `Misbehaviour` type. It ass
For an example of a `CheckForMisbehaviour` implementation, please check the [Tendermint light client](https://github.com/cosmos/ibc-go/blob/main/modules/light-clients/07-tendermint/misbehaviour_handle.go#L18).
-> The Tendermint light client [defines `Misbehaviour`](https://github.com/cosmos/ibc-go/blob/main/modules/light-clients/07-tendermint/misbehaviour.go) as two different types of situations: a situation where two conflicting `Headers` with the same height have been submitted to update a client's `ConsensusState` within the same trusting period, or that the two conflicting `Headers` have been submitted at different heights but the consensus states are not in the correct monotonic time ordering (BFT time violation). More explicitly, updating to a new height must have a timestamp greater than the previous consensus state, or, if inserting a consensus at a past height, then time must be less than those heights which come after and greater than heights which come before.
+> The Tendermint light client [defines `Misbehaviour`](https://github.com/cosmos/ibc-go/blob/main/modules/light-clients/07-tendermint/misbehaviour.go) as two different types of situations: a situation where two conflicting `Header`s with the same height have been submitted to update a client's `ConsensusState` within the same trusting period, or that the two conflicting `Header`s have been submitted at different heights but the consensus states are not in the correct monotonic time ordering (BFT time violation). More explicitly, updating to a new height must have a timestamp greater than the previous consensus state, or, if inserting a consensus at a past height, then time must be less than those heights which come after and greater than heights which come before.
## `UpdateStateOnMisbehaviour`
-`UpdateStateOnMisbehaviour` should perform appropriate state changes on a client state given that misbehaviour has been detected and verified. This method should only be called when misbehaviour is detected, as it does not perform any misbehaviour checks. Notably, it should freeze the client so that calling the `Status()` function on the associated client state no longer returns `Active`.
+`UpdateStateOnMisbehaviour` should perform appropriate state changes on a client state given that misbehaviour has been detected and verified. This method should only be called when misbehaviour is detected, as it does not perform any misbehaviour checks. Notably, it should freeze the client so that calling the `Status` function on the associated client state no longer returns `Active`.
For an example of a `UpdateStateOnMisbehaviour` implementation, please check the [Tendermint light client](https://github.com/cosmos/ibc-go/blob/main/modules/light-clients/07-tendermint/update.go#L197).
@@ -40,22 +75,21 @@ For an example of a `UpdateState` implementation, please check the [Tendermint l
## Putting it all together
-The `02-client Keeper` module in ibc-go offers a reference as to how these functions will be used to [update the client](https://github.com/cosmos/ibc-go/blob/main/modules/core/02-client/keeper/client.go#L48).
+The `02-client` `Keeper` module in ibc-go offers a reference as to how these functions will be used to [update the client](https://github.com/cosmos/ibc-go/blob/main/modules/core/02-client/keeper/client.go#L48).
-```golang
+```go
if err := clientState.VerifyClientMessage(clientMessage); err != nil {
- return err
- }
-
- foundMisbehaviour := clientState.CheckForMisbehaviour(clientMessage)
- if foundMisbehaviour {
- clientState.UpdateStateOnMisbehaviour(clientMessage)
- // emit misbehaviour event
- return
- }
-
- clientState.UpdateState(clientMessage) // expects no-op on duplicate header
- // emit update event
- return
+ return err
}
+foundMisbehaviour := clientState.CheckForMisbehaviour(clientMessage)
+if foundMisbehaviour {
+ clientState.UpdateStateOnMisbehaviour(clientMessage)
+ // emit misbehaviour event
+ return
+}
+
+clientState.UpdateState(clientMessage) // expects no-op on duplicate header
+ // emit update event
+ return
+}
diff --git a/docs/ibc/light-clients/upgrade.md b/docs/ibc/light-clients/upgrades.md
similarity index 50%
rename from docs/ibc/light-clients/upgrade.md
rename to docs/ibc/light-clients/upgrades.md
index 6426757dc93..49c1503ae59 100644
--- a/docs/ibc/light-clients/upgrade.md
+++ b/docs/ibc/light-clients/upgrades.md
@@ -1,51 +1,62 @@
-# Implementing `VerifyUpgradeAndUpdateState`
+# Handling upgrades
It is vital that high-value IBC clients can upgrade along with their underlying chains to avoid disruption to the IBC ecosystem. Thus, IBC client developers will want to implement upgrade functionality to enable clients to maintain connections and channels even across chain upgrades.
-The IBC protocol allows client implementations to provide a path to upgrading clients given the upgraded client state, upgraded consensus state and proofs for each. This path is provided in the `VerifyUpgradeAndUpdateState` function:
+## Implementing `VerifyUpgradeAndUpdateState`
-```golang
+The IBC protocol allows client implementations to provide a path to upgrading clients given the upgraded `ClientState`, upgraded `ConsensusState` and proofs for each. This path is provided in the `VerifyUpgradeAndUpdateState` method:
+
+```go
// NOTE: proof heights are not included as upgrade to a new revision is expected to pass only on the last height committed by the current revision. Clients are responsible for ensuring that the planned last height of the current revision is somehow encoded in the proof verification process.
// This is to ensure that no premature upgrades occur, since upgrade plans committed to by the counterparty may be cancelled or modified before the last planned height.
// If the upgrade is verified, the upgraded client and consensus states must be set in the client store.
-VerifyUpgradeAndUpdateState(
- ctx sdk.Context,
- cdc codec.BinaryCodec,
- store sdk.KVStore,
- newClient ClientState,
- newConsState ConsensusState,
- proofUpgradeClient,
- proofUpgradeConsState []byte,
+func (cs ClientState) VerifyUpgradeAndUpdateState(
+ ctx sdk.Context,
+ cdc codec.BinaryCodec,
+ store sdk.KVStore,
+ newClient ClientState,
+ newConsState ConsensusState,
+ proofUpgradeClient,
+ proofUpgradeConsState []byte,
) error
```
-It is important to note that light clients **must** handle all management of client and consensus states including the setting of updated client state and consensus state in the client store. This can include verifying that the submitted upgraded `ClientState` is of a valid `ClientState` type, that the height of the upgraded client is not greater than the height of the current client (in order to preserve BFT monotonic time), or that certain parameters which should not be changed have not been altered in the upgraded client state.
+> Please refer to the [Tendermint light client implementation](https://github.com/cosmos/ibc-go/blob/02-client-refactor-beta1/modules/light-clients/07-tendermint/upgrade.go#L27) as an example for implementation.
-Note that the clients should have prior knowledge of the merkle path that the upgraded client and upgraded consensus states will use. The height at which the upgrade has occurred should also be encoded in the proof. The Tendermint client implementation accomplishes this by including an `UpgradePath` in the ClientState itself, which is used along with the upgrade height to construct the merkle path under which the client state and consensus state are committed.
+It is important to note that light clients **must** handle all management of client and consensus states including the setting of updated `ClientState` and `ConsensusState` in the client store. This can include verifying that the submitted upgraded `ClientState` is of a valid `ClientState` type, that the height of the upgraded client is not greater than the height of the current client (in order to preserve BFT monotonic time), or that certain parameters which should not be changed have not been altered in the upgraded `ClientState`.
-Developers must ensure that the `UpgradeClientMsg` does not pass until the last height of the old chain has been committed, and after the chain upgrades, the `UpgradeClientMsg` should pass once and only once on all counterparty clients.
+Developers must ensure that the `MsgUpgradeClient` does not pass until the last height of the old chain has been committed, and after the chain upgrades, the `MsgUpgradeClient` should pass once and only once on all counterparty clients.
-Developers must ensure that the new client adopts all of the new Client parameters that must be uniform across every valid light client of a chain (chain-chosen parameters), while maintaining the Client parameters that are customizable by each individual client (client-chosen parameters) from the previous version of the client.
+### Upgrade path
-Upgrades must adhere to the IBC Security Model. IBC does not rely on the assumption of honest relayers for correctness. Thus users should not have to rely on relayers to maintain client correctness and security (though honest relayers must exist to maintain relayer liveness). While relayers may choose any set of client parameters while creating a new `ClientState`, this still holds under the security model since users can always choose a relayer-created client that suits their security and correctness needs or create a Client with their desired parameters if no such client exists.
+Clients should have **prior knowledge of the merkle path** that the upgraded client and upgraded consensus states will use. The height at which the upgrade has occurred should also be encoded in the proof.
+> The Tendermint client implementation accomplishes this by including an `UpgradePath` in the `ClientState` itself, which is used along with the upgrade height to construct the merkle path under which the client state and consensus state are committed.
-However, when upgrading an existing client, one must keep in mind that there are already many users who depend on this client's particular parameters. We cannot give the upgrading relayer free choice over these parameters once they have already been chosen. This would violate the security model since users who rely on the client would have to rely on the upgrading relayer to maintain the same level of security. Thus, developers must make sure that their upgrade mechanism allows clients to upgrade the chain-specified parameters whenever a chain upgrade changes these parameters (examples in the Tendermint client include `UnbondingPeriod`, `TrustingPeriod`, `ChainID`, `UpgradePath`, etc.), while ensuring that the relayer submitting the `UpgradeClientMsg` cannot alter the client-chosen parameters that the users are relying upon (examples in Tendermint client include `TrustLevel`, `MaxClockDrift`, etc).
+## Chain specific vs client specific client parameters
-Developers should maintain the distinction between Client parameters that are uniform across every valid light client of a chain (chain-chosen parameters), and Client parameters that are customizable by each individual client (client-chosen parameters); since this distinction is necessary to implement the `ZeroCustomFields` method in the `ClientState` interface:
+Developers should maintain the distinction between client parameters that are uniform across every valid light client of a chain (chain-chosen parameters), and client parameters that are customizable by each individual client (client-chosen parameters); since this distinction is necessary to implement the `ZeroCustomFields` method in the [`ClientState` interface](./client-state.md):
```go
// Utility function that zeroes out any client customizable fields in client state
// Ledger enforced fields are maintained while all custom fields are zero values
// Used to verify upgrades
-ZeroCustomFields() ClientState
+func (cs ClientState) ZeroCustomFields() ClientState
```
-Counterparty clients can upgrade securely by using all of the chain-chosen parameters from the chain-committed `UpgradedClient` and preserving all of the old client-chosen parameters. This enables chains to securely upgrade without relying on an honest relayer, however it can in some cases lead to an invalid final `ClientState` if the new chain-chosen parameters clash with the old client-chosen parameter. This can happen in the Tendermint client case if the upgrading chain lowers the `UnbondingPeriod` (chain-chosen) to a duration below that of a counterparty client's `TrustingPeriod` (client-chosen). Such cases should be clearly documented by developers, so that chains know which upgrades should be avoided to prevent this problem. The final upgraded client should also be validated in `VerifyUpgradeAndUpdateState` before returning to ensure that the client does not upgrade to an invalid `ClientState`.
+Developers must ensure that the new client adopts all of the new client parameters that must be uniform across every valid light client of a chain (chain-chosen parameters), while maintaining the client parameters that are customizable by each individual client (client-chosen parameters) from the previous version of the client. `ZeroCustomFields` is a useful utility function to ensure only chain specific fields are updated during upgrades.
+
+## Security
+
+Upgrades must adhere to the IBC Security Model. IBC does not rely on the assumption of honest relayers for correctness. Thus users should not have to rely on relayers to maintain client correctness and security (though honest relayers must exist to maintain relayer liveness). While relayers may choose any set of client parameters while creating a new `ClientState`, this still holds under the security model since users can always choose a relayer-created client that suits their security and correctness needs or create a client with their desired parameters if no such client exists.
-## Putting it all together
+However, when upgrading an existing client, one must keep in mind that there are already many users who depend on this client's particular parameters. **We cannot give the upgrading relayer free choice over these parameters once they have already been chosen. This would violate the security model** since users who rely on the client would have to rely on the upgrading relayer to maintain the same level of security.
-Please refer to the [`07-tendermint` implementation](https://github.com/cosmos/ibc-go/blob/02-client-refactor-beta1/modules/light-clients/07-tendermint/upgrade.go#L27) as an example for implementation.
\ No newline at end of file
+Thus, developers must make sure that their upgrade mechanism allows clients to upgrade the chain-specified parameters whenever a chain upgrade changes these parameters (examples in the Tendermint client include `UnbondingPeriod`, `TrustingPeriod`, `ChainID`, `UpgradePath`, etc), while ensuring that the relayer submitting the `MsgUpgradeClient` cannot alter the client-chosen parameters that the users are relying upon (examples in Tendermint client include `TrustLevel`, `MaxClockDrift`, etc). The previous paragraph discusses how `ZeroCustomFields` helps achieve this.
+
+### Document potential client parameter conflicts during upgrades
+
+Counterparty clients can upgrade securely by using all of the chain-chosen parameters from the chain-committed `UpgradedClient` and preserving all of the old client-chosen parameters. This enables chains to securely upgrade without relying on an honest relayer, however it can in some cases lead to an invalid final `ClientState` if the new chain-chosen parameters clash with the old client-chosen parameter. This can happen in the Tendermint client case if the upgrading chain lowers the `UnbondingPeriod` (chain-chosen) to a duration below that of a counterparty client's `TrustingPeriod` (client-chosen). Such cases should be clearly documented by developers, so that chains know which upgrades should be avoided to prevent this problem. The final upgraded client should also be validated in `VerifyUpgradeAndUpdateState` before returning to ensure that the client does not upgrade to an invalid `ClientState`.
diff --git a/docs/ibc/params.md b/docs/ibc/params.md
index 3040eea50b7..dcf60692695 100644
--- a/docs/ibc/params.md
+++ b/docs/ibc/params.md
@@ -10,7 +10,7 @@ The 02-client submodule contains the following parameters:
| Key | Type | Default Value |
|------------------|------|---------------|
-| `AllowedClients` | []string | `"06-solomachine","07-tendermint"` |
+| `AllowedClients` | []string | `"06-solomachine","07-tendermint","09-localhost"` |
### AllowedClients
diff --git a/docs/ibc/proto-docs.md b/docs/ibc/proto-docs.md
index 91154efa20b..bdb94310050 100644
--- a/docs/ibc/proto-docs.md
+++ b/docs/ibc/proto-docs.md
@@ -1,5421 +1,7 @@
-
-# Protobuf Documentation
-
+
-## Table of Contents
-
-- [ibc/applications/fee/v1/ack.proto](#ibc/applications/fee/v1/ack.proto)
- - [IncentivizedAcknowledgement](#ibc.applications.fee.v1.IncentivizedAcknowledgement)
-
-- [ibc/core/client/v1/client.proto](#ibc/core/client/v1/client.proto)
- - [ClientConsensusStates](#ibc.core.client.v1.ClientConsensusStates)
- - [ClientUpdateProposal](#ibc.core.client.v1.ClientUpdateProposal)
- - [ConsensusStateWithHeight](#ibc.core.client.v1.ConsensusStateWithHeight)
- - [Height](#ibc.core.client.v1.Height)
- - [IdentifiedClientState](#ibc.core.client.v1.IdentifiedClientState)
- - [Params](#ibc.core.client.v1.Params)
- - [UpgradeProposal](#ibc.core.client.v1.UpgradeProposal)
-
-- [ibc/core/channel/v1/channel.proto](#ibc/core/channel/v1/channel.proto)
- - [Acknowledgement](#ibc.core.channel.v1.Acknowledgement)
- - [Channel](#ibc.core.channel.v1.Channel)
- - [Counterparty](#ibc.core.channel.v1.Counterparty)
- - [IdentifiedChannel](#ibc.core.channel.v1.IdentifiedChannel)
- - [Packet](#ibc.core.channel.v1.Packet)
- - [PacketId](#ibc.core.channel.v1.PacketId)
- - [PacketState](#ibc.core.channel.v1.PacketState)
-
- - [Order](#ibc.core.channel.v1.Order)
- - [State](#ibc.core.channel.v1.State)
-
-- [ibc/applications/fee/v1/fee.proto](#ibc/applications/fee/v1/fee.proto)
- - [Fee](#ibc.applications.fee.v1.Fee)
- - [IdentifiedPacketFees](#ibc.applications.fee.v1.IdentifiedPacketFees)
- - [PacketFee](#ibc.applications.fee.v1.PacketFee)
- - [PacketFees](#ibc.applications.fee.v1.PacketFees)
-
-- [ibc/applications/fee/v1/genesis.proto](#ibc/applications/fee/v1/genesis.proto)
- - [FeeEnabledChannel](#ibc.applications.fee.v1.FeeEnabledChannel)
- - [ForwardRelayerAddress](#ibc.applications.fee.v1.ForwardRelayerAddress)
- - [GenesisState](#ibc.applications.fee.v1.GenesisState)
- - [RegisteredCounterpartyPayee](#ibc.applications.fee.v1.RegisteredCounterpartyPayee)
- - [RegisteredPayee](#ibc.applications.fee.v1.RegisteredPayee)
-
-- [ibc/applications/fee/v1/metadata.proto](#ibc/applications/fee/v1/metadata.proto)
- - [Metadata](#ibc.applications.fee.v1.Metadata)
-
-- [ibc/applications/fee/v1/query.proto](#ibc/applications/fee/v1/query.proto)
- - [QueryCounterpartyPayeeRequest](#ibc.applications.fee.v1.QueryCounterpartyPayeeRequest)
- - [QueryCounterpartyPayeeResponse](#ibc.applications.fee.v1.QueryCounterpartyPayeeResponse)
- - [QueryFeeEnabledChannelRequest](#ibc.applications.fee.v1.QueryFeeEnabledChannelRequest)
- - [QueryFeeEnabledChannelResponse](#ibc.applications.fee.v1.QueryFeeEnabledChannelResponse)
- - [QueryFeeEnabledChannelsRequest](#ibc.applications.fee.v1.QueryFeeEnabledChannelsRequest)
- - [QueryFeeEnabledChannelsResponse](#ibc.applications.fee.v1.QueryFeeEnabledChannelsResponse)
- - [QueryIncentivizedPacketRequest](#ibc.applications.fee.v1.QueryIncentivizedPacketRequest)
- - [QueryIncentivizedPacketResponse](#ibc.applications.fee.v1.QueryIncentivizedPacketResponse)
- - [QueryIncentivizedPacketsForChannelRequest](#ibc.applications.fee.v1.QueryIncentivizedPacketsForChannelRequest)
- - [QueryIncentivizedPacketsForChannelResponse](#ibc.applications.fee.v1.QueryIncentivizedPacketsForChannelResponse)
- - [QueryIncentivizedPacketsRequest](#ibc.applications.fee.v1.QueryIncentivizedPacketsRequest)
- - [QueryIncentivizedPacketsResponse](#ibc.applications.fee.v1.QueryIncentivizedPacketsResponse)
- - [QueryPayeeRequest](#ibc.applications.fee.v1.QueryPayeeRequest)
- - [QueryPayeeResponse](#ibc.applications.fee.v1.QueryPayeeResponse)
- - [QueryTotalAckFeesRequest](#ibc.applications.fee.v1.QueryTotalAckFeesRequest)
- - [QueryTotalAckFeesResponse](#ibc.applications.fee.v1.QueryTotalAckFeesResponse)
- - [QueryTotalRecvFeesRequest](#ibc.applications.fee.v1.QueryTotalRecvFeesRequest)
- - [QueryTotalRecvFeesResponse](#ibc.applications.fee.v1.QueryTotalRecvFeesResponse)
- - [QueryTotalTimeoutFeesRequest](#ibc.applications.fee.v1.QueryTotalTimeoutFeesRequest)
- - [QueryTotalTimeoutFeesResponse](#ibc.applications.fee.v1.QueryTotalTimeoutFeesResponse)
-
- - [Query](#ibc.applications.fee.v1.Query)
-
-- [ibc/applications/fee/v1/tx.proto](#ibc/applications/fee/v1/tx.proto)
- - [MsgPayPacketFee](#ibc.applications.fee.v1.MsgPayPacketFee)
- - [MsgPayPacketFeeAsync](#ibc.applications.fee.v1.MsgPayPacketFeeAsync)
- - [MsgPayPacketFeeAsyncResponse](#ibc.applications.fee.v1.MsgPayPacketFeeAsyncResponse)
- - [MsgPayPacketFeeResponse](#ibc.applications.fee.v1.MsgPayPacketFeeResponse)
- - [MsgRegisterCounterpartyPayee](#ibc.applications.fee.v1.MsgRegisterCounterpartyPayee)
- - [MsgRegisterCounterpartyPayeeResponse](#ibc.applications.fee.v1.MsgRegisterCounterpartyPayeeResponse)
- - [MsgRegisterPayee](#ibc.applications.fee.v1.MsgRegisterPayee)
- - [MsgRegisterPayeeResponse](#ibc.applications.fee.v1.MsgRegisterPayeeResponse)
-
- - [Msg](#ibc.applications.fee.v1.Msg)
-
-- [ibc/applications/interchain_accounts/controller/v1/controller.proto](#ibc/applications/interchain_accounts/controller/v1/controller.proto)
- - [Params](#ibc.applications.interchain_accounts.controller.v1.Params)
-
-- [ibc/applications/interchain_accounts/controller/v1/query.proto](#ibc/applications/interchain_accounts/controller/v1/query.proto)
- - [QueryInterchainAccountRequest](#ibc.applications.interchain_accounts.controller.v1.QueryInterchainAccountRequest)
- - [QueryInterchainAccountResponse](#ibc.applications.interchain_accounts.controller.v1.QueryInterchainAccountResponse)
- - [QueryParamsRequest](#ibc.applications.interchain_accounts.controller.v1.QueryParamsRequest)
- - [QueryParamsResponse](#ibc.applications.interchain_accounts.controller.v1.QueryParamsResponse)
-
- - [Query](#ibc.applications.interchain_accounts.controller.v1.Query)
-
-- [ibc/applications/interchain_accounts/v1/packet.proto](#ibc/applications/interchain_accounts/v1/packet.proto)
- - [CosmosTx](#ibc.applications.interchain_accounts.v1.CosmosTx)
- - [InterchainAccountPacketData](#ibc.applications.interchain_accounts.v1.InterchainAccountPacketData)
-
- - [Type](#ibc.applications.interchain_accounts.v1.Type)
-
-- [ibc/applications/interchain_accounts/controller/v1/tx.proto](#ibc/applications/interchain_accounts/controller/v1/tx.proto)
- - [MsgRegisterInterchainAccount](#ibc.applications.interchain_accounts.controller.v1.MsgRegisterInterchainAccount)
- - [MsgRegisterInterchainAccountResponse](#ibc.applications.interchain_accounts.controller.v1.MsgRegisterInterchainAccountResponse)
- - [MsgSendTx](#ibc.applications.interchain_accounts.controller.v1.MsgSendTx)
- - [MsgSendTxResponse](#ibc.applications.interchain_accounts.controller.v1.MsgSendTxResponse)
-
- - [Msg](#ibc.applications.interchain_accounts.controller.v1.Msg)
-
-- [ibc/applications/interchain_accounts/host/v1/host.proto](#ibc/applications/interchain_accounts/host/v1/host.proto)
- - [Params](#ibc.applications.interchain_accounts.host.v1.Params)
-
-- [ibc/applications/interchain_accounts/genesis/v1/genesis.proto](#ibc/applications/interchain_accounts/genesis/v1/genesis.proto)
- - [ActiveChannel](#ibc.applications.interchain_accounts.genesis.v1.ActiveChannel)
- - [ControllerGenesisState](#ibc.applications.interchain_accounts.genesis.v1.ControllerGenesisState)
- - [GenesisState](#ibc.applications.interchain_accounts.genesis.v1.GenesisState)
- - [HostGenesisState](#ibc.applications.interchain_accounts.genesis.v1.HostGenesisState)
- - [RegisteredInterchainAccount](#ibc.applications.interchain_accounts.genesis.v1.RegisteredInterchainAccount)
-
-- [ibc/applications/interchain_accounts/host/v1/query.proto](#ibc/applications/interchain_accounts/host/v1/query.proto)
- - [QueryParamsRequest](#ibc.applications.interchain_accounts.host.v1.QueryParamsRequest)
- - [QueryParamsResponse](#ibc.applications.interchain_accounts.host.v1.QueryParamsResponse)
-
- - [Query](#ibc.applications.interchain_accounts.host.v1.Query)
-
-- [ibc/applications/interchain_accounts/v1/account.proto](#ibc/applications/interchain_accounts/v1/account.proto)
- - [InterchainAccount](#ibc.applications.interchain_accounts.v1.InterchainAccount)
-
-- [ibc/applications/interchain_accounts/v1/metadata.proto](#ibc/applications/interchain_accounts/v1/metadata.proto)
- - [Metadata](#ibc.applications.interchain_accounts.v1.Metadata)
-
-- [ibc/applications/transfer/v1/transfer.proto](#ibc/applications/transfer/v1/transfer.proto)
- - [DenomTrace](#ibc.applications.transfer.v1.DenomTrace)
- - [Params](#ibc.applications.transfer.v1.Params)
-
-- [ibc/applications/transfer/v1/genesis.proto](#ibc/applications/transfer/v1/genesis.proto)
- - [GenesisState](#ibc.applications.transfer.v1.GenesisState)
-
-- [ibc/applications/transfer/v1/query.proto](#ibc/applications/transfer/v1/query.proto)
- - [QueryDenomHashRequest](#ibc.applications.transfer.v1.QueryDenomHashRequest)
- - [QueryDenomHashResponse](#ibc.applications.transfer.v1.QueryDenomHashResponse)
- - [QueryDenomTraceRequest](#ibc.applications.transfer.v1.QueryDenomTraceRequest)
- - [QueryDenomTraceResponse](#ibc.applications.transfer.v1.QueryDenomTraceResponse)
- - [QueryDenomTracesRequest](#ibc.applications.transfer.v1.QueryDenomTracesRequest)
- - [QueryDenomTracesResponse](#ibc.applications.transfer.v1.QueryDenomTracesResponse)
- - [QueryEscrowAddressRequest](#ibc.applications.transfer.v1.QueryEscrowAddressRequest)
- - [QueryEscrowAddressResponse](#ibc.applications.transfer.v1.QueryEscrowAddressResponse)
- - [QueryParamsRequest](#ibc.applications.transfer.v1.QueryParamsRequest)
- - [QueryParamsResponse](#ibc.applications.transfer.v1.QueryParamsResponse)
-
- - [Query](#ibc.applications.transfer.v1.Query)
-
-- [ibc/applications/transfer/v1/tx.proto](#ibc/applications/transfer/v1/tx.proto)
- - [MsgTransfer](#ibc.applications.transfer.v1.MsgTransfer)
- - [MsgTransferResponse](#ibc.applications.transfer.v1.MsgTransferResponse)
-
- - [Msg](#ibc.applications.transfer.v1.Msg)
-
-- [ibc/applications/transfer/v2/packet.proto](#ibc/applications/transfer/v2/packet.proto)
- - [FungibleTokenPacketData](#ibc.applications.transfer.v2.FungibleTokenPacketData)
-
-- [ibc/core/channel/v1/genesis.proto](#ibc/core/channel/v1/genesis.proto)
- - [GenesisState](#ibc.core.channel.v1.GenesisState)
- - [PacketSequence](#ibc.core.channel.v1.PacketSequence)
-
-- [ibc/core/channel/v1/query.proto](#ibc/core/channel/v1/query.proto)
- - [QueryChannelClientStateRequest](#ibc.core.channel.v1.QueryChannelClientStateRequest)
- - [QueryChannelClientStateResponse](#ibc.core.channel.v1.QueryChannelClientStateResponse)
- - [QueryChannelConsensusStateRequest](#ibc.core.channel.v1.QueryChannelConsensusStateRequest)
- - [QueryChannelConsensusStateResponse](#ibc.core.channel.v1.QueryChannelConsensusStateResponse)
- - [QueryChannelRequest](#ibc.core.channel.v1.QueryChannelRequest)
- - [QueryChannelResponse](#ibc.core.channel.v1.QueryChannelResponse)
- - [QueryChannelsRequest](#ibc.core.channel.v1.QueryChannelsRequest)
- - [QueryChannelsResponse](#ibc.core.channel.v1.QueryChannelsResponse)
- - [QueryConnectionChannelsRequest](#ibc.core.channel.v1.QueryConnectionChannelsRequest)
- - [QueryConnectionChannelsResponse](#ibc.core.channel.v1.QueryConnectionChannelsResponse)
- - [QueryNextSequenceReceiveRequest](#ibc.core.channel.v1.QueryNextSequenceReceiveRequest)
- - [QueryNextSequenceReceiveResponse](#ibc.core.channel.v1.QueryNextSequenceReceiveResponse)
- - [QueryPacketAcknowledgementRequest](#ibc.core.channel.v1.QueryPacketAcknowledgementRequest)
- - [QueryPacketAcknowledgementResponse](#ibc.core.channel.v1.QueryPacketAcknowledgementResponse)
- - [QueryPacketAcknowledgementsRequest](#ibc.core.channel.v1.QueryPacketAcknowledgementsRequest)
- - [QueryPacketAcknowledgementsResponse](#ibc.core.channel.v1.QueryPacketAcknowledgementsResponse)
- - [QueryPacketCommitmentRequest](#ibc.core.channel.v1.QueryPacketCommitmentRequest)
- - [QueryPacketCommitmentResponse](#ibc.core.channel.v1.QueryPacketCommitmentResponse)
- - [QueryPacketCommitmentsRequest](#ibc.core.channel.v1.QueryPacketCommitmentsRequest)
- - [QueryPacketCommitmentsResponse](#ibc.core.channel.v1.QueryPacketCommitmentsResponse)
- - [QueryPacketReceiptRequest](#ibc.core.channel.v1.QueryPacketReceiptRequest)
- - [QueryPacketReceiptResponse](#ibc.core.channel.v1.QueryPacketReceiptResponse)
- - [QueryUnreceivedAcksRequest](#ibc.core.channel.v1.QueryUnreceivedAcksRequest)
- - [QueryUnreceivedAcksResponse](#ibc.core.channel.v1.QueryUnreceivedAcksResponse)
- - [QueryUnreceivedPacketsRequest](#ibc.core.channel.v1.QueryUnreceivedPacketsRequest)
- - [QueryUnreceivedPacketsResponse](#ibc.core.channel.v1.QueryUnreceivedPacketsResponse)
-
- - [Query](#ibc.core.channel.v1.Query)
-
-- [ibc/core/channel/v1/tx.proto](#ibc/core/channel/v1/tx.proto)
- - [MsgAcknowledgement](#ibc.core.channel.v1.MsgAcknowledgement)
- - [MsgAcknowledgementResponse](#ibc.core.channel.v1.MsgAcknowledgementResponse)
- - [MsgChannelCloseConfirm](#ibc.core.channel.v1.MsgChannelCloseConfirm)
- - [MsgChannelCloseConfirmResponse](#ibc.core.channel.v1.MsgChannelCloseConfirmResponse)
- - [MsgChannelCloseInit](#ibc.core.channel.v1.MsgChannelCloseInit)
- - [MsgChannelCloseInitResponse](#ibc.core.channel.v1.MsgChannelCloseInitResponse)
- - [MsgChannelOpenAck](#ibc.core.channel.v1.MsgChannelOpenAck)
- - [MsgChannelOpenAckResponse](#ibc.core.channel.v1.MsgChannelOpenAckResponse)
- - [MsgChannelOpenConfirm](#ibc.core.channel.v1.MsgChannelOpenConfirm)
- - [MsgChannelOpenConfirmResponse](#ibc.core.channel.v1.MsgChannelOpenConfirmResponse)
- - [MsgChannelOpenInit](#ibc.core.channel.v1.MsgChannelOpenInit)
- - [MsgChannelOpenInitResponse](#ibc.core.channel.v1.MsgChannelOpenInitResponse)
- - [MsgChannelOpenTry](#ibc.core.channel.v1.MsgChannelOpenTry)
- - [MsgChannelOpenTryResponse](#ibc.core.channel.v1.MsgChannelOpenTryResponse)
- - [MsgRecvPacket](#ibc.core.channel.v1.MsgRecvPacket)
- - [MsgRecvPacketResponse](#ibc.core.channel.v1.MsgRecvPacketResponse)
- - [MsgTimeout](#ibc.core.channel.v1.MsgTimeout)
- - [MsgTimeoutOnClose](#ibc.core.channel.v1.MsgTimeoutOnClose)
- - [MsgTimeoutOnCloseResponse](#ibc.core.channel.v1.MsgTimeoutOnCloseResponse)
- - [MsgTimeoutResponse](#ibc.core.channel.v1.MsgTimeoutResponse)
-
- - [ResponseResultType](#ibc.core.channel.v1.ResponseResultType)
-
- - [Msg](#ibc.core.channel.v1.Msg)
-
-- [ibc/core/client/v1/genesis.proto](#ibc/core/client/v1/genesis.proto)
- - [GenesisMetadata](#ibc.core.client.v1.GenesisMetadata)
- - [GenesisState](#ibc.core.client.v1.GenesisState)
- - [IdentifiedGenesisMetadata](#ibc.core.client.v1.IdentifiedGenesisMetadata)
-
-- [ibc/core/client/v1/query.proto](#ibc/core/client/v1/query.proto)
- - [QueryClientStateRequest](#ibc.core.client.v1.QueryClientStateRequest)
- - [QueryClientStateResponse](#ibc.core.client.v1.QueryClientStateResponse)
- - [QueryClientStatesRequest](#ibc.core.client.v1.QueryClientStatesRequest)
- - [QueryClientStatesResponse](#ibc.core.client.v1.QueryClientStatesResponse)
- - [QueryClientStatusRequest](#ibc.core.client.v1.QueryClientStatusRequest)
- - [QueryClientStatusResponse](#ibc.core.client.v1.QueryClientStatusResponse)
- - [QueryConsensusStateHeightsRequest](#ibc.core.client.v1.QueryConsensusStateHeightsRequest)
- - [QueryConsensusStateHeightsResponse](#ibc.core.client.v1.QueryConsensusStateHeightsResponse)
- - [QueryConsensusStateRequest](#ibc.core.client.v1.QueryConsensusStateRequest)
- - [QueryConsensusStateResponse](#ibc.core.client.v1.QueryConsensusStateResponse)
- - [QueryConsensusStatesRequest](#ibc.core.client.v1.QueryConsensusStatesRequest)
- - [QueryConsensusStatesResponse](#ibc.core.client.v1.QueryConsensusStatesResponse)
- - [QueryParamsRequest](#ibc.core.client.v1.QueryParamsRequest)
- - [QueryParamsResponse](#ibc.core.client.v1.QueryParamsResponse)
- - [QueryUpgradedClientStateRequest](#ibc.core.client.v1.QueryUpgradedClientStateRequest)
- - [QueryUpgradedClientStateResponse](#ibc.core.client.v1.QueryUpgradedClientStateResponse)
- - [QueryUpgradedConsensusStateRequest](#ibc.core.client.v1.QueryUpgradedConsensusStateRequest)
- - [QueryUpgradedConsensusStateResponse](#ibc.core.client.v1.QueryUpgradedConsensusStateResponse)
-
- - [Query](#ibc.core.client.v1.Query)
-
-- [ibc/core/client/v1/tx.proto](#ibc/core/client/v1/tx.proto)
- - [MsgCreateClient](#ibc.core.client.v1.MsgCreateClient)
- - [MsgCreateClientResponse](#ibc.core.client.v1.MsgCreateClientResponse)
- - [MsgSubmitMisbehaviour](#ibc.core.client.v1.MsgSubmitMisbehaviour)
- - [MsgSubmitMisbehaviourResponse](#ibc.core.client.v1.MsgSubmitMisbehaviourResponse)
- - [MsgUpdateClient](#ibc.core.client.v1.MsgUpdateClient)
- - [MsgUpdateClientResponse](#ibc.core.client.v1.MsgUpdateClientResponse)
- - [MsgUpgradeClient](#ibc.core.client.v1.MsgUpgradeClient)
- - [MsgUpgradeClientResponse](#ibc.core.client.v1.MsgUpgradeClientResponse)
-
- - [Msg](#ibc.core.client.v1.Msg)
-
-- [ibc/core/commitment/v1/commitment.proto](#ibc/core/commitment/v1/commitment.proto)
- - [MerklePath](#ibc.core.commitment.v1.MerklePath)
- - [MerklePrefix](#ibc.core.commitment.v1.MerklePrefix)
- - [MerkleProof](#ibc.core.commitment.v1.MerkleProof)
- - [MerkleRoot](#ibc.core.commitment.v1.MerkleRoot)
-
-- [ibc/core/connection/v1/connection.proto](#ibc/core/connection/v1/connection.proto)
- - [ClientPaths](#ibc.core.connection.v1.ClientPaths)
- - [ConnectionEnd](#ibc.core.connection.v1.ConnectionEnd)
- - [ConnectionPaths](#ibc.core.connection.v1.ConnectionPaths)
- - [Counterparty](#ibc.core.connection.v1.Counterparty)
- - [IdentifiedConnection](#ibc.core.connection.v1.IdentifiedConnection)
- - [Params](#ibc.core.connection.v1.Params)
- - [Version](#ibc.core.connection.v1.Version)
-
- - [State](#ibc.core.connection.v1.State)
-
-- [ibc/core/connection/v1/genesis.proto](#ibc/core/connection/v1/genesis.proto)
- - [GenesisState](#ibc.core.connection.v1.GenesisState)
-
-- [ibc/core/connection/v1/query.proto](#ibc/core/connection/v1/query.proto)
- - [QueryClientConnectionsRequest](#ibc.core.connection.v1.QueryClientConnectionsRequest)
- - [QueryClientConnectionsResponse](#ibc.core.connection.v1.QueryClientConnectionsResponse)
- - [QueryConnectionClientStateRequest](#ibc.core.connection.v1.QueryConnectionClientStateRequest)
- - [QueryConnectionClientStateResponse](#ibc.core.connection.v1.QueryConnectionClientStateResponse)
- - [QueryConnectionConsensusStateRequest](#ibc.core.connection.v1.QueryConnectionConsensusStateRequest)
- - [QueryConnectionConsensusStateResponse](#ibc.core.connection.v1.QueryConnectionConsensusStateResponse)
- - [QueryConnectionRequest](#ibc.core.connection.v1.QueryConnectionRequest)
- - [QueryConnectionResponse](#ibc.core.connection.v1.QueryConnectionResponse)
- - [QueryConnectionsRequest](#ibc.core.connection.v1.QueryConnectionsRequest)
- - [QueryConnectionsResponse](#ibc.core.connection.v1.QueryConnectionsResponse)
-
- - [Query](#ibc.core.connection.v1.Query)
-
-- [ibc/core/connection/v1/tx.proto](#ibc/core/connection/v1/tx.proto)
- - [MsgConnectionOpenAck](#ibc.core.connection.v1.MsgConnectionOpenAck)
- - [MsgConnectionOpenAckResponse](#ibc.core.connection.v1.MsgConnectionOpenAckResponse)
- - [MsgConnectionOpenConfirm](#ibc.core.connection.v1.MsgConnectionOpenConfirm)
- - [MsgConnectionOpenConfirmResponse](#ibc.core.connection.v1.MsgConnectionOpenConfirmResponse)
- - [MsgConnectionOpenInit](#ibc.core.connection.v1.MsgConnectionOpenInit)
- - [MsgConnectionOpenInitResponse](#ibc.core.connection.v1.MsgConnectionOpenInitResponse)
- - [MsgConnectionOpenTry](#ibc.core.connection.v1.MsgConnectionOpenTry)
- - [MsgConnectionOpenTryResponse](#ibc.core.connection.v1.MsgConnectionOpenTryResponse)
-
- - [Msg](#ibc.core.connection.v1.Msg)
-
-- [ibc/core/types/v1/genesis.proto](#ibc/core/types/v1/genesis.proto)
- - [GenesisState](#ibc.core.types.v1.GenesisState)
-
-- [ibc/lightclients/solomachine/v1/solomachine.proto](#ibc/lightclients/solomachine/v1/solomachine.proto)
- - [ChannelStateData](#ibc.lightclients.solomachine.v1.ChannelStateData)
- - [ClientState](#ibc.lightclients.solomachine.v1.ClientState)
- - [ClientStateData](#ibc.lightclients.solomachine.v1.ClientStateData)
- - [ConnectionStateData](#ibc.lightclients.solomachine.v1.ConnectionStateData)
- - [ConsensusState](#ibc.lightclients.solomachine.v1.ConsensusState)
- - [ConsensusStateData](#ibc.lightclients.solomachine.v1.ConsensusStateData)
- - [Header](#ibc.lightclients.solomachine.v1.Header)
- - [HeaderData](#ibc.lightclients.solomachine.v1.HeaderData)
- - [Misbehaviour](#ibc.lightclients.solomachine.v1.Misbehaviour)
- - [NextSequenceRecvData](#ibc.lightclients.solomachine.v1.NextSequenceRecvData)
- - [PacketAcknowledgementData](#ibc.lightclients.solomachine.v1.PacketAcknowledgementData)
- - [PacketCommitmentData](#ibc.lightclients.solomachine.v1.PacketCommitmentData)
- - [PacketReceiptAbsenceData](#ibc.lightclients.solomachine.v1.PacketReceiptAbsenceData)
- - [SignBytes](#ibc.lightclients.solomachine.v1.SignBytes)
- - [SignatureAndData](#ibc.lightclients.solomachine.v1.SignatureAndData)
- - [TimestampedSignatureData](#ibc.lightclients.solomachine.v1.TimestampedSignatureData)
-
- - [DataType](#ibc.lightclients.solomachine.v1.DataType)
-
-- [ibc/lightclients/solomachine/v2/solomachine.proto](#ibc/lightclients/solomachine/v2/solomachine.proto)
- - [ChannelStateData](#ibc.lightclients.solomachine.v2.ChannelStateData)
- - [ClientState](#ibc.lightclients.solomachine.v2.ClientState)
- - [ClientStateData](#ibc.lightclients.solomachine.v2.ClientStateData)
- - [ConnectionStateData](#ibc.lightclients.solomachine.v2.ConnectionStateData)
- - [ConsensusState](#ibc.lightclients.solomachine.v2.ConsensusState)
- - [ConsensusStateData](#ibc.lightclients.solomachine.v2.ConsensusStateData)
- - [Header](#ibc.lightclients.solomachine.v2.Header)
- - [HeaderData](#ibc.lightclients.solomachine.v2.HeaderData)
- - [Misbehaviour](#ibc.lightclients.solomachine.v2.Misbehaviour)
- - [NextSequenceRecvData](#ibc.lightclients.solomachine.v2.NextSequenceRecvData)
- - [PacketAcknowledgementData](#ibc.lightclients.solomachine.v2.PacketAcknowledgementData)
- - [PacketCommitmentData](#ibc.lightclients.solomachine.v2.PacketCommitmentData)
- - [PacketReceiptAbsenceData](#ibc.lightclients.solomachine.v2.PacketReceiptAbsenceData)
- - [SignBytes](#ibc.lightclients.solomachine.v2.SignBytes)
- - [SignatureAndData](#ibc.lightclients.solomachine.v2.SignatureAndData)
- - [TimestampedSignatureData](#ibc.lightclients.solomachine.v2.TimestampedSignatureData)
-
- - [DataType](#ibc.lightclients.solomachine.v2.DataType)
-
-- [ibc/lightclients/solomachine/v3/solomachine.proto](#ibc/lightclients/solomachine/v3/solomachine.proto)
- - [ClientState](#ibc.lightclients.solomachine.v3.ClientState)
- - [ConsensusState](#ibc.lightclients.solomachine.v3.ConsensusState)
- - [Header](#ibc.lightclients.solomachine.v3.Header)
- - [HeaderData](#ibc.lightclients.solomachine.v3.HeaderData)
- - [Misbehaviour](#ibc.lightclients.solomachine.v3.Misbehaviour)
- - [SignBytes](#ibc.lightclients.solomachine.v3.SignBytes)
- - [SignatureAndData](#ibc.lightclients.solomachine.v3.SignatureAndData)
- - [TimestampedSignatureData](#ibc.lightclients.solomachine.v3.TimestampedSignatureData)
-
-- [ibc/lightclients/tendermint/v1/tendermint.proto](#ibc/lightclients/tendermint/v1/tendermint.proto)
- - [ClientState](#ibc.lightclients.tendermint.v1.ClientState)
- - [ConsensusState](#ibc.lightclients.tendermint.v1.ConsensusState)
- - [Fraction](#ibc.lightclients.tendermint.v1.Fraction)
- - [Header](#ibc.lightclients.tendermint.v1.Header)
- - [Misbehaviour](#ibc.lightclients.tendermint.v1.Misbehaviour)
-
-- [Scalar Value Types](#scalar-value-types)
-
-
-
-
-Top
-
-## ibc/applications/fee/v1/ack.proto
-
-
-
-
-
-### IncentivizedAcknowledgement
-IncentivizedAcknowledgement is the acknowledgement format to be used by applications wrapped in the fee middleware
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `app_acknowledgement` | [bytes](#bytes) | | the underlying app acknowledgement bytes |
-| `forward_relayer_address` | [string](#string) | | the relayer address which submits the recv packet message |
-| `underlying_app_success` | [bool](#bool) | | success flag of the base application callback |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## ibc/core/client/v1/client.proto
-
-
-
-
-
-### ClientConsensusStates
-ClientConsensusStates defines all the stored consensus states for a given
-client.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_id` | [string](#string) | | client identifier |
-| `consensus_states` | [ConsensusStateWithHeight](#ibc.core.client.v1.ConsensusStateWithHeight) | repeated | consensus states and their heights associated with the client |
-
-
-
-
-
-
-
-
-### ClientUpdateProposal
-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).
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `title` | [string](#string) | | the title of the update proposal |
-| `description` | [string](#string) | | the description of the proposal |
-| `subject_client_id` | [string](#string) | | the client identifier for the client to be updated if the proposal passes |
-| `substitute_client_id` | [string](#string) | | the substitute client identifier for the client standing in for the subject client |
-
-
-
-
-
-
-
-
-### ConsensusStateWithHeight
-ConsensusStateWithHeight defines a consensus state with an additional height
-field.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `height` | [Height](#ibc.core.client.v1.Height) | | consensus state height |
-| `consensus_state` | [google.protobuf.Any](#google.protobuf.Any) | | consensus state |
-
-
-
-
-
-
-
-
-### Height
-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
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `revision_number` | [uint64](#uint64) | | the revision that the client is currently on |
-| `revision_height` | [uint64](#uint64) | | the height within the given revision |
-
-
-
-
-
-
-
-
-### IdentifiedClientState
-IdentifiedClientState defines a client state with an additional client
-identifier field.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_id` | [string](#string) | | client identifier |
-| `client_state` | [google.protobuf.Any](#google.protobuf.Any) | | client state |
-
-
-
-
-
-
-
-
-### Params
-Params defines the set of IBC light client parameters.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `allowed_clients` | [string](#string) | repeated | allowed_clients defines the list of allowed client state types. |
-
-
-
-
-
-
-
-
-### UpgradeProposal
-UpgradeProposal is a gov Content type for initiating an IBC breaking
-upgrade.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `title` | [string](#string) | | |
-| `description` | [string](#string) | | |
-| `plan` | [cosmos.upgrade.v1beta1.Plan](#cosmos.upgrade.v1beta1.Plan) | | |
-| `upgraded_client_state` | [google.protobuf.Any](#google.protobuf.Any) | | 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 |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## ibc/core/channel/v1/channel.proto
-
-
-
-
-
-### Acknowledgement
-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/ibc/tree/master/spec/core/ics-004-channel-and-packet-semantics#acknowledgement-envelope
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `result` | [bytes](#bytes) | | |
-| `error` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### Channel
-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.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `state` | [State](#ibc.core.channel.v1.State) | | current state of the channel end |
-| `ordering` | [Order](#ibc.core.channel.v1.Order) | | whether the channel is ordered or unordered |
-| `counterparty` | [Counterparty](#ibc.core.channel.v1.Counterparty) | | counterparty channel end |
-| `connection_hops` | [string](#string) | repeated | list of connection identifiers, in order, along which packets sent on this channel will travel |
-| `version` | [string](#string) | | opaque channel version, which is agreed upon during the handshake |
-
-
-
-
-
-
-
-
-### Counterparty
-Counterparty defines a channel end counterparty
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | port on the counterparty chain which owns the other end of the channel. |
-| `channel_id` | [string](#string) | | channel end on the counterparty chain |
-
-
-
-
-
-
-
-
-### IdentifiedChannel
-IdentifiedChannel defines a channel with additional port and channel
-identifier fields.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `state` | [State](#ibc.core.channel.v1.State) | | current state of the channel end |
-| `ordering` | [Order](#ibc.core.channel.v1.Order) | | whether the channel is ordered or unordered |
-| `counterparty` | [Counterparty](#ibc.core.channel.v1.Counterparty) | | counterparty channel end |
-| `connection_hops` | [string](#string) | repeated | list of connection identifiers, in order, along which packets sent on this channel will travel |
-| `version` | [string](#string) | | opaque channel version, which is agreed upon during the handshake |
-| `port_id` | [string](#string) | | port identifier |
-| `channel_id` | [string](#string) | | channel identifier |
-
-
-
-
-
-
-
-
-### Packet
-Packet defines a type that carries data across different chains through IBC
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `sequence` | [uint64](#uint64) | | 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. |
-| `source_port` | [string](#string) | | identifies the port on the sending chain. |
-| `source_channel` | [string](#string) | | identifies the channel end on the sending chain. |
-| `destination_port` | [string](#string) | | identifies the port on the receiving chain. |
-| `destination_channel` | [string](#string) | | identifies the channel end on the receiving chain. |
-| `data` | [bytes](#bytes) | | actual opaque bytes transferred directly to the application module |
-| `timeout_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | block height after which the packet times out |
-| `timeout_timestamp` | [uint64](#uint64) | | block timestamp (in nanoseconds) after which the packet times out |
-
-
-
-
-
-
-
-
-### PacketId
-PacketId is an identifer for a unique Packet
-Source chains refer to packets by source port/channel
-Destination chains refer to packets by destination port/channel
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | channel port identifier |
-| `channel_id` | [string](#string) | | channel unique identifier |
-| `sequence` | [uint64](#uint64) | | packet sequence |
-
-
-
-
-
-
-
-
-### PacketState
-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.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | channel port identifier. |
-| `channel_id` | [string](#string) | | channel unique identifier. |
-| `sequence` | [uint64](#uint64) | | packet sequence. |
-| `data` | [bytes](#bytes) | | embedded data that represents packet state. |
-
-
-
-
-
-
-
-
-
-
-### Order
-Order defines if a channel is ORDERED or UNORDERED
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| ORDER_NONE_UNSPECIFIED | 0 | zero-value for channel ordering |
-| ORDER_UNORDERED | 1 | packets can be delivered in any order, which may differ from the order in which they were sent. |
-| ORDER_ORDERED | 2 | packets are delivered exactly in the order which they were sent |
-
-
-
-
-
-### State
-State defines if a channel is in one of the following states:
-CLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED.
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| STATE_UNINITIALIZED_UNSPECIFIED | 0 | Default State |
-| STATE_INIT | 1 | A channel has just started the opening handshake. |
-| STATE_TRYOPEN | 2 | A channel has acknowledged the handshake step on the counterparty chain. |
-| STATE_OPEN | 3 | A channel has completed the handshake. Open channels are ready to send and receive packets. |
-| STATE_CLOSED | 4 | A channel has been closed and can no longer be used to send or receive packets. |
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## ibc/applications/fee/v1/fee.proto
-
-
-
-
-
-### Fee
-Fee defines the ICS29 receive, acknowledgement and timeout fees
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `recv_fee` | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | repeated | the packet receive fee |
-| `ack_fee` | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | repeated | the packet acknowledgement fee |
-| `timeout_fee` | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | repeated | the packet timeout fee |
-
-
-
-
-
-
-
-
-### IdentifiedPacketFees
-IdentifiedPacketFees contains a list of type PacketFee and associated PacketId
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `packet_id` | [ibc.core.channel.v1.PacketId](#ibc.core.channel.v1.PacketId) | | unique packet identifier comprised of the channel ID, port ID and sequence |
-| `packet_fees` | [PacketFee](#ibc.applications.fee.v1.PacketFee) | repeated | list of packet fees |
-
-
-
-
-
-
-
-
-### PacketFee
-PacketFee contains ICS29 relayer fees, refund address and optional list of permitted relayers
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `fee` | [Fee](#ibc.applications.fee.v1.Fee) | | fee encapsulates the recv, ack and timeout fees associated with an IBC packet |
-| `refund_address` | [string](#string) | | the refund address for unspent fees |
-| `relayers` | [string](#string) | repeated | optional list of relayers permitted to receive fees |
-
-
-
-
-
-
-
-
-### PacketFees
-PacketFees contains a list of type PacketFee
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `packet_fees` | [PacketFee](#ibc.applications.fee.v1.PacketFee) | repeated | list of packet fees |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## ibc/applications/fee/v1/genesis.proto
-
-
-
-
-
-### FeeEnabledChannel
-FeeEnabledChannel contains the PortID & ChannelID for a fee enabled channel
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | unique port identifier |
-| `channel_id` | [string](#string) | | unique channel identifier |
-
-
-
-
-
-
-
-
-### ForwardRelayerAddress
-ForwardRelayerAddress contains the forward relayer address and PacketId used for async acknowledgements
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `address` | [string](#string) | | the forward relayer address |
-| `packet_id` | [ibc.core.channel.v1.PacketId](#ibc.core.channel.v1.PacketId) | | unique packet identifer comprised of the channel ID, port ID and sequence |
-
-
-
-
-
-
-
-
-### GenesisState
-GenesisState defines the ICS29 fee middleware genesis state
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `identified_fees` | [IdentifiedPacketFees](#ibc.applications.fee.v1.IdentifiedPacketFees) | repeated | list of identified packet fees |
-| `fee_enabled_channels` | [FeeEnabledChannel](#ibc.applications.fee.v1.FeeEnabledChannel) | repeated | list of fee enabled channels |
-| `registered_payees` | [RegisteredPayee](#ibc.applications.fee.v1.RegisteredPayee) | repeated | list of registered payees |
-| `registered_counterparty_payees` | [RegisteredCounterpartyPayee](#ibc.applications.fee.v1.RegisteredCounterpartyPayee) | repeated | list of registered counterparty payees |
-| `forward_relayers` | [ForwardRelayerAddress](#ibc.applications.fee.v1.ForwardRelayerAddress) | repeated | list of forward relayer addresses |
-
-
-
-
-
-
-
-
-### RegisteredCounterpartyPayee
-RegisteredCounterpartyPayee contains the relayer address and counterparty payee address for a specific channel (used
-for recv fee distribution)
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `channel_id` | [string](#string) | | unique channel identifier |
-| `relayer` | [string](#string) | | the relayer address |
-| `counterparty_payee` | [string](#string) | | the counterparty payee address |
-
-
-
-
-
-
-
-
-### RegisteredPayee
-RegisteredPayee contains the relayer address and payee address for a specific channel
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `channel_id` | [string](#string) | | unique channel identifier |
-| `relayer` | [string](#string) | | the relayer address |
-| `payee` | [string](#string) | | the payee address |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## ibc/applications/fee/v1/metadata.proto
-
-
-
-
-
-### Metadata
-Metadata defines the ICS29 channel specific metadata encoded into the channel version bytestring
-See ICS004: https://github.com/cosmos/ibc/tree/master/spec/core/ics-004-channel-and-packet-semantics#Versioning
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `fee_version` | [string](#string) | | fee_version defines the ICS29 fee version |
-| `app_version` | [string](#string) | | app_version defines the underlying application version, which may or may not be a JSON encoded bytestring |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## ibc/applications/fee/v1/query.proto
-
-
-
-
-
-### QueryCounterpartyPayeeRequest
-QueryCounterpartyPayeeRequest defines the request type for the CounterpartyPayee rpc
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `channel_id` | [string](#string) | | unique channel identifier |
-| `relayer` | [string](#string) | | the relayer address to which the counterparty is registered |
-
-
-
-
-
-
-
-
-### QueryCounterpartyPayeeResponse
-QueryCounterpartyPayeeResponse defines the response type for the CounterpartyPayee rpc
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `counterparty_payee` | [string](#string) | | the counterparty payee address used to compensate forward relaying |
-
-
-
-
-
-
-
-
-### QueryFeeEnabledChannelRequest
-QueryFeeEnabledChannelRequest defines the request type for the FeeEnabledChannel rpc
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | unique port identifier |
-| `channel_id` | [string](#string) | | unique channel identifier |
-
-
-
-
-
-
-
-
-### QueryFeeEnabledChannelResponse
-QueryFeeEnabledChannelResponse defines the response type for the FeeEnabledChannel rpc
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `fee_enabled` | [bool](#bool) | | boolean flag representing the fee enabled channel status |
-
-
-
-
-
-
-
-
-### QueryFeeEnabledChannelsRequest
-QueryFeeEnabledChannelsRequest defines the request type for the FeeEnabledChannels rpc
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `pagination` | [cosmos.base.query.v1beta1.PageRequest](#cosmos.base.query.v1beta1.PageRequest) | | pagination defines an optional pagination for the request. |
-| `query_height` | [uint64](#uint64) | | block height at which to query |
-
-
-
-
-
-
-
-
-### QueryFeeEnabledChannelsResponse
-QueryFeeEnabledChannelsResponse defines the response type for the FeeEnabledChannels rpc
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `fee_enabled_channels` | [FeeEnabledChannel](#ibc.applications.fee.v1.FeeEnabledChannel) | repeated | list of fee enabled channels |
-
-
-
-
-
-
-
-
-### QueryIncentivizedPacketRequest
-QueryIncentivizedPacketRequest defines the request type for the IncentivizedPacket rpc
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `packet_id` | [ibc.core.channel.v1.PacketId](#ibc.core.channel.v1.PacketId) | | unique packet identifier comprised of channel ID, port ID and sequence |
-| `query_height` | [uint64](#uint64) | | block height at which to query |
-
-
-
-
-
-
-
-
-### QueryIncentivizedPacketResponse
-QueryIncentivizedPacketsResponse defines the response type for the IncentivizedPacket rpc
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `incentivized_packet` | [IdentifiedPacketFees](#ibc.applications.fee.v1.IdentifiedPacketFees) | | the identified fees for the incentivized packet |
-
-
-
-
-
-
-
-
-### QueryIncentivizedPacketsForChannelRequest
-QueryIncentivizedPacketsForChannelRequest defines the request type for querying for all incentivized packets
-for a specific channel
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `pagination` | [cosmos.base.query.v1beta1.PageRequest](#cosmos.base.query.v1beta1.PageRequest) | | pagination defines an optional pagination for the request. |
-| `port_id` | [string](#string) | | |
-| `channel_id` | [string](#string) | | |
-| `query_height` | [uint64](#uint64) | | Height to query at |
-
-
-
-
-
-
-
-
-### QueryIncentivizedPacketsForChannelResponse
-QueryIncentivizedPacketsResponse defines the response type for the incentivized packets RPC
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `incentivized_packets` | [IdentifiedPacketFees](#ibc.applications.fee.v1.IdentifiedPacketFees) | repeated | Map of all incentivized_packets |
-
-
-
-
-
-
-
-
-### QueryIncentivizedPacketsRequest
-QueryIncentivizedPacketsRequest defines the request type for the IncentivizedPackets rpc
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `pagination` | [cosmos.base.query.v1beta1.PageRequest](#cosmos.base.query.v1beta1.PageRequest) | | pagination defines an optional pagination for the request. |
-| `query_height` | [uint64](#uint64) | | block height at which to query |
-
-
-
-
-
-
-
-
-### QueryIncentivizedPacketsResponse
-QueryIncentivizedPacketsResponse defines the response type for the IncentivizedPackets rpc
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `incentivized_packets` | [IdentifiedPacketFees](#ibc.applications.fee.v1.IdentifiedPacketFees) | repeated | list of identified fees for incentivized packets |
-
-
-
-
-
-
-
-
-### QueryPayeeRequest
-QueryPayeeRequest defines the request type for the Payee rpc
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `channel_id` | [string](#string) | | unique channel identifier |
-| `relayer` | [string](#string) | | the relayer address to which the distribution address is registered |
-
-
-
-
-
-
-
-
-### QueryPayeeResponse
-QueryPayeeResponse defines the response type for the Payee rpc
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `payee_address` | [string](#string) | | the payee address to which packet fees are paid out |
-
-
-
-
-
-
-
-
-### QueryTotalAckFeesRequest
-QueryTotalAckFeesRequest defines the request type for the TotalAckFees rpc
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `packet_id` | [ibc.core.channel.v1.PacketId](#ibc.core.channel.v1.PacketId) | | the packet identifier for the associated fees |
-
-
-
-
-
-
-
-
-### QueryTotalAckFeesResponse
-QueryTotalAckFeesResponse defines the response type for the TotalAckFees rpc
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `ack_fees` | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | repeated | the total packet acknowledgement fees |
-
-
-
-
-
-
-
-
-### QueryTotalRecvFeesRequest
-QueryTotalRecvFeesRequest defines the request type for the TotalRecvFees rpc
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `packet_id` | [ibc.core.channel.v1.PacketId](#ibc.core.channel.v1.PacketId) | | the packet identifier for the associated fees |
-
-
-
-
-
-
-
-
-### QueryTotalRecvFeesResponse
-QueryTotalRecvFeesResponse defines the response type for the TotalRecvFees rpc
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `recv_fees` | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | repeated | the total packet receive fees |
-
-
-
-
-
-
-
-
-### QueryTotalTimeoutFeesRequest
-QueryTotalTimeoutFeesRequest defines the request type for the TotalTimeoutFees rpc
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `packet_id` | [ibc.core.channel.v1.PacketId](#ibc.core.channel.v1.PacketId) | | the packet identifier for the associated fees |
-
-
-
-
-
-
-
-
-### QueryTotalTimeoutFeesResponse
-QueryTotalTimeoutFeesResponse defines the response type for the TotalTimeoutFees rpc
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `timeout_fees` | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | repeated | the total packet timeout fees |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-### Query
-Query defines the ICS29 gRPC querier service.
-
-| Method Name | Request Type | Response Type | Description | HTTP Verb | Endpoint |
-| ----------- | ------------ | ------------- | ------------| ------- | -------- |
-| `IncentivizedPackets` | [QueryIncentivizedPacketsRequest](#ibc.applications.fee.v1.QueryIncentivizedPacketsRequest) | [QueryIncentivizedPacketsResponse](#ibc.applications.fee.v1.QueryIncentivizedPacketsResponse) | IncentivizedPackets returns all incentivized packets and their associated fees | GET|/ibc/apps/fee/v1/incentivized_packets|
-| `IncentivizedPacket` | [QueryIncentivizedPacketRequest](#ibc.applications.fee.v1.QueryIncentivizedPacketRequest) | [QueryIncentivizedPacketResponse](#ibc.applications.fee.v1.QueryIncentivizedPacketResponse) | IncentivizedPacket returns all packet fees for a packet given its identifier | GET|/ibc/apps/fee/v1/channels/{packet_id.channel_id}/ports/{packet_id.port_id}/sequences/{packet_id.sequence}/incentivized_packet|
-| `IncentivizedPacketsForChannel` | [QueryIncentivizedPacketsForChannelRequest](#ibc.applications.fee.v1.QueryIncentivizedPacketsForChannelRequest) | [QueryIncentivizedPacketsForChannelResponse](#ibc.applications.fee.v1.QueryIncentivizedPacketsForChannelResponse) | Gets all incentivized packets for a specific channel | GET|/ibc/apps/fee/v1/channels/{channel_id}/ports/{port_id}/incentivized_packets|
-| `TotalRecvFees` | [QueryTotalRecvFeesRequest](#ibc.applications.fee.v1.QueryTotalRecvFeesRequest) | [QueryTotalRecvFeesResponse](#ibc.applications.fee.v1.QueryTotalRecvFeesResponse) | TotalRecvFees returns the total receive fees for a packet given its identifier | GET|/ibc/apps/fee/v1/channels/{packet_id.channel_id}/ports/{packet_id.port_id}/sequences/{packet_id.sequence}/total_recv_fees|
-| `TotalAckFees` | [QueryTotalAckFeesRequest](#ibc.applications.fee.v1.QueryTotalAckFeesRequest) | [QueryTotalAckFeesResponse](#ibc.applications.fee.v1.QueryTotalAckFeesResponse) | TotalAckFees returns the total acknowledgement fees for a packet given its identifier | GET|/ibc/apps/fee/v1/channels/{packet_id.channel_id}/ports/{packet_id.port_id}/sequences/{packet_id.sequence}/total_ack_fees|
-| `TotalTimeoutFees` | [QueryTotalTimeoutFeesRequest](#ibc.applications.fee.v1.QueryTotalTimeoutFeesRequest) | [QueryTotalTimeoutFeesResponse](#ibc.applications.fee.v1.QueryTotalTimeoutFeesResponse) | TotalTimeoutFees returns the total timeout fees for a packet given its identifier | GET|/ibc/apps/fee/v1/channels/{packet_id.channel_id}/ports/{packet_id.port_id}/sequences/{packet_id.sequence}/total_timeout_fees|
-| `Payee` | [QueryPayeeRequest](#ibc.applications.fee.v1.QueryPayeeRequest) | [QueryPayeeResponse](#ibc.applications.fee.v1.QueryPayeeResponse) | Payee returns the registered payee address for a specific channel given the relayer address | GET|/ibc/apps/fee/v1/channels/{channel_id}/relayers/{relayer}/payee|
-| `CounterpartyPayee` | [QueryCounterpartyPayeeRequest](#ibc.applications.fee.v1.QueryCounterpartyPayeeRequest) | [QueryCounterpartyPayeeResponse](#ibc.applications.fee.v1.QueryCounterpartyPayeeResponse) | CounterpartyPayee returns the registered counterparty payee for forward relaying | GET|/ibc/apps/fee/v1/channels/{channel_id}/relayers/{relayer}/counterparty_payee|
-| `FeeEnabledChannels` | [QueryFeeEnabledChannelsRequest](#ibc.applications.fee.v1.QueryFeeEnabledChannelsRequest) | [QueryFeeEnabledChannelsResponse](#ibc.applications.fee.v1.QueryFeeEnabledChannelsResponse) | FeeEnabledChannels returns a list of all fee enabled channels | GET|/ibc/apps/fee/v1/fee_enabled|
-| `FeeEnabledChannel` | [QueryFeeEnabledChannelRequest](#ibc.applications.fee.v1.QueryFeeEnabledChannelRequest) | [QueryFeeEnabledChannelResponse](#ibc.applications.fee.v1.QueryFeeEnabledChannelResponse) | FeeEnabledChannel returns true if the provided port and channel identifiers belong to a fee enabled channel | GET|/ibc/apps/fee/v1/channels/{channel_id}/ports/{port_id}/fee_enabled|
-
-
-
-
-
-
-Top
-
-## ibc/applications/fee/v1/tx.proto
-
-
-
-
-
-### MsgPayPacketFee
-MsgPayPacketFee defines the request type for the PayPacketFee rpc
-This Msg can be used to pay for a packet at the next sequence send & should be combined with the Msg that will be
-paid for
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `fee` | [Fee](#ibc.applications.fee.v1.Fee) | | fee encapsulates the recv, ack and timeout fees associated with an IBC packet |
-| `source_port_id` | [string](#string) | | the source port unique identifier |
-| `source_channel_id` | [string](#string) | | the source channel unique identifer |
-| `signer` | [string](#string) | | account address to refund fee if necessary |
-| `relayers` | [string](#string) | repeated | optional list of relayers permitted to the receive packet fees |
-
-
-
-
-
-
-
-
-### MsgPayPacketFeeAsync
-MsgPayPacketFeeAsync defines the request type for the PayPacketFeeAsync rpc
-This Msg can be used to pay for a packet at a specified sequence (instead of the next sequence send)
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `packet_id` | [ibc.core.channel.v1.PacketId](#ibc.core.channel.v1.PacketId) | | unique packet identifier comprised of the channel ID, port ID and sequence |
-| `packet_fee` | [PacketFee](#ibc.applications.fee.v1.PacketFee) | | the packet fee associated with a particular IBC packet |
-
-
-
-
-
-
-
-
-### MsgPayPacketFeeAsyncResponse
-MsgPayPacketFeeAsyncResponse defines the response type for the PayPacketFeeAsync rpc
-
-
-
-
-
-
-
-
-### MsgPayPacketFeeResponse
-MsgPayPacketFeeResponse defines the response type for the PayPacketFee rpc
-
-
-
-
-
-
-
-
-### MsgRegisterCounterpartyPayee
-MsgRegisterCounterpartyPayee defines the request type for the RegisterCounterpartyPayee rpc
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | unique port identifier |
-| `channel_id` | [string](#string) | | unique channel identifier |
-| `relayer` | [string](#string) | | the relayer address |
-| `counterparty_payee` | [string](#string) | | the counterparty payee address |
-
-
-
-
-
-
-
-
-### MsgRegisterCounterpartyPayeeResponse
-MsgRegisterCounterpartyPayeeResponse defines the response type for the RegisterCounterpartyPayee rpc
-
-
-
-
-
-
-
-
-### MsgRegisterPayee
-MsgRegisterPayee defines the request type for the RegisterPayee rpc
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | unique port identifier |
-| `channel_id` | [string](#string) | | unique channel identifier |
-| `relayer` | [string](#string) | | the relayer address |
-| `payee` | [string](#string) | | the payee address |
-
-
-
-
-
-
-
-
-### MsgRegisterPayeeResponse
-MsgRegisterPayeeResponse defines the response type for the RegisterPayee rpc
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-### Msg
-Msg defines the ICS29 Msg service.
-
-| Method Name | Request Type | Response Type | Description | HTTP Verb | Endpoint |
-| ----------- | ------------ | ------------- | ------------| ------- | -------- |
-| `RegisterPayee` | [MsgRegisterPayee](#ibc.applications.fee.v1.MsgRegisterPayee) | [MsgRegisterPayeeResponse](#ibc.applications.fee.v1.MsgRegisterPayeeResponse) | RegisterPayee defines a rpc handler method for MsgRegisterPayee RegisterPayee is called by the relayer on each channelEnd and allows them to set an optional payee to which reverse and timeout relayer packet fees will be paid out. The payee should be registered on the source chain from which packets originate as this is where fee distribution takes place. This function may be called more than once by a relayer, in which case, the latest payee is always used. | |
-| `RegisterCounterpartyPayee` | [MsgRegisterCounterpartyPayee](#ibc.applications.fee.v1.MsgRegisterCounterpartyPayee) | [MsgRegisterCounterpartyPayeeResponse](#ibc.applications.fee.v1.MsgRegisterCounterpartyPayeeResponse) | RegisterCounterpartyPayee defines a rpc handler method for MsgRegisterCounterpartyPayee RegisterCounterpartyPayee is called by the relayer on each channelEnd and allows them to specify the counterparty payee address before relaying. This ensures they will be properly compensated for forward relaying since the destination chain must include the registered counterparty payee address in the acknowledgement. This function may be called more than once by a relayer, in which case, the latest counterparty payee address is always used. | |
-| `PayPacketFee` | [MsgPayPacketFee](#ibc.applications.fee.v1.MsgPayPacketFee) | [MsgPayPacketFeeResponse](#ibc.applications.fee.v1.MsgPayPacketFeeResponse) | PayPacketFee defines a rpc handler method for MsgPayPacketFee PayPacketFee is an open callback that may be called by any module/user that wishes to escrow funds in order to incentivize the relaying of the packet at the next sequence NOTE: This method is intended to be used within a multi msg transaction, where the subsequent msg that follows initiates the lifecycle of the incentivized packet | |
-| `PayPacketFeeAsync` | [MsgPayPacketFeeAsync](#ibc.applications.fee.v1.MsgPayPacketFeeAsync) | [MsgPayPacketFeeAsyncResponse](#ibc.applications.fee.v1.MsgPayPacketFeeAsyncResponse) | PayPacketFeeAsync defines a rpc handler method for MsgPayPacketFeeAsync PayPacketFeeAsync is an open callback that may be called by any module/user that wishes to escrow funds in order to incentivize the relaying of a known packet (i.e. at a particular sequence) | |
-
-
-
-
-
-
-Top
-
-## ibc/applications/interchain_accounts/controller/v1/controller.proto
-
-
-
-
-
-### Params
-Params defines the set of on-chain interchain accounts parameters.
-The following parameters may be used to disable the controller submodule.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `controller_enabled` | [bool](#bool) | | controller_enabled enables or disables the controller submodule. |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## ibc/applications/interchain_accounts/controller/v1/query.proto
-
-
-
-
-
-### QueryInterchainAccountRequest
-QueryInterchainAccountRequest is the request type for the Query/InterchainAccount RPC method.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `owner` | [string](#string) | | |
-| `connection_id` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### QueryInterchainAccountResponse
-QueryInterchainAccountResponse the response type for the Query/InterchainAccount RPC method.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `address` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### QueryParamsRequest
-QueryParamsRequest is the request type for the Query/Params RPC method.
-
-
-
-
-
-
-
-
-### QueryParamsResponse
-QueryParamsResponse is the response type for the Query/Params RPC method.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `params` | [Params](#ibc.applications.interchain_accounts.controller.v1.Params) | | params defines the parameters of the module. |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-### Query
-Query provides defines the gRPC querier service.
-
-| Method Name | Request Type | Response Type | Description | HTTP Verb | Endpoint |
-| ----------- | ------------ | ------------- | ------------| ------- | -------- |
-| `InterchainAccount` | [QueryInterchainAccountRequest](#ibc.applications.interchain_accounts.controller.v1.QueryInterchainAccountRequest) | [QueryInterchainAccountResponse](#ibc.applications.interchain_accounts.controller.v1.QueryInterchainAccountResponse) | InterchainAccount returns the interchain account address for a given owner address on a given connection | GET|/ibc/apps/interchain_accounts/controller/v1/owners/{owner}/connections/{connection_id}|
-| `Params` | [QueryParamsRequest](#ibc.applications.interchain_accounts.controller.v1.QueryParamsRequest) | [QueryParamsResponse](#ibc.applications.interchain_accounts.controller.v1.QueryParamsResponse) | Params queries all parameters of the ICA controller submodule. | GET|/ibc/apps/interchain_accounts/controller/v1/params|
-
-
-
-
-
-
-Top
-
-## ibc/applications/interchain_accounts/v1/packet.proto
-
-
-
-
-
-### CosmosTx
-CosmosTx contains a list of sdk.Msg's. It should be used when sending transactions to an SDK host chain.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `messages` | [google.protobuf.Any](#google.protobuf.Any) | repeated | |
-
-
-
-
-
-
-
-
-### InterchainAccountPacketData
-InterchainAccountPacketData is comprised of a raw transaction, type of transaction and optional memo field.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `type` | [Type](#ibc.applications.interchain_accounts.v1.Type) | | |
-| `data` | [bytes](#bytes) | | |
-| `memo` | [string](#string) | | |
-
-
-
-
-
-
-
-
-
-
-### Type
-Type defines a classification of message issued from a controller chain to its associated interchain accounts
-host
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| TYPE_UNSPECIFIED | 0 | Default zero value enumeration |
-| TYPE_EXECUTE_TX | 1 | Execute a transaction on an interchain accounts host chain |
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## ibc/applications/interchain_accounts/controller/v1/tx.proto
-
-
-
-
-
-### MsgRegisterInterchainAccount
-MsgRegisterInterchainAccount defines the payload for Msg/RegisterAccount
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `owner` | [string](#string) | | |
-| `connection_id` | [string](#string) | | |
-| `version` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### MsgRegisterInterchainAccountResponse
-MsgRegisterInterchainAccountResponse defines the response for Msg/RegisterAccount
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `channel_id` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### MsgSendTx
-MsgSendTx defines the payload for Msg/SendTx
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `owner` | [string](#string) | | |
-| `connection_id` | [string](#string) | | |
-| `packet_data` | [ibc.applications.interchain_accounts.v1.InterchainAccountPacketData](#ibc.applications.interchain_accounts.v1.InterchainAccountPacketData) | | |
-| `relative_timeout` | [uint64](#uint64) | | Relative timeout timestamp provided will be added to the current block time during transaction execution. The timeout timestamp must be non-zero. |
-
-
-
-
-
-
-
-
-### MsgSendTxResponse
-MsgSendTxResponse defines the response for MsgSendTx
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `sequence` | [uint64](#uint64) | | |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-### Msg
-Msg defines the 27-interchain-accounts/controller Msg service.
-
-| Method Name | Request Type | Response Type | Description | HTTP Verb | Endpoint |
-| ----------- | ------------ | ------------- | ------------| ------- | -------- |
-| `RegisterInterchainAccount` | [MsgRegisterInterchainAccount](#ibc.applications.interchain_accounts.controller.v1.MsgRegisterInterchainAccount) | [MsgRegisterInterchainAccountResponse](#ibc.applications.interchain_accounts.controller.v1.MsgRegisterInterchainAccountResponse) | RegisterInterchainAccount defines a rpc handler for MsgRegisterInterchainAccount. | |
-| `SendTx` | [MsgSendTx](#ibc.applications.interchain_accounts.controller.v1.MsgSendTx) | [MsgSendTxResponse](#ibc.applications.interchain_accounts.controller.v1.MsgSendTxResponse) | SendTx defines a rpc handler for MsgSendTx. | |
-
-
-
-
-
-
-Top
-
-## ibc/applications/interchain_accounts/host/v1/host.proto
-
-
-
-
-
-### Params
-Params defines the set of on-chain interchain accounts parameters.
-The following parameters may be used to disable the host submodule.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `host_enabled` | [bool](#bool) | | host_enabled enables or disables the host submodule. |
-| `allow_messages` | [string](#string) | repeated | allow_messages defines a list of sdk message typeURLs allowed to be executed on a host chain. |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## ibc/applications/interchain_accounts/genesis/v1/genesis.proto
-
-
-
-
-
-### ActiveChannel
-ActiveChannel contains a connection ID, port ID and associated active channel ID, as well as a boolean flag to
-indicate if the channel is middleware enabled
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `connection_id` | [string](#string) | | |
-| `port_id` | [string](#string) | | |
-| `channel_id` | [string](#string) | | |
-| `is_middleware_enabled` | [bool](#bool) | | |
-
-
-
-
-
-
-
-
-### ControllerGenesisState
-ControllerGenesisState defines the interchain accounts controller genesis state
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `active_channels` | [ActiveChannel](#ibc.applications.interchain_accounts.genesis.v1.ActiveChannel) | repeated | |
-| `interchain_accounts` | [RegisteredInterchainAccount](#ibc.applications.interchain_accounts.genesis.v1.RegisteredInterchainAccount) | repeated | |
-| `ports` | [string](#string) | repeated | |
-| `params` | [ibc.applications.interchain_accounts.controller.v1.Params](#ibc.applications.interchain_accounts.controller.v1.Params) | | |
-
-
-
-
-
-
-
-
-### GenesisState
-GenesisState defines the interchain accounts genesis state
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `controller_genesis_state` | [ControllerGenesisState](#ibc.applications.interchain_accounts.genesis.v1.ControllerGenesisState) | | |
-| `host_genesis_state` | [HostGenesisState](#ibc.applications.interchain_accounts.genesis.v1.HostGenesisState) | | |
-
-
-
-
-
-
-
-
-### HostGenesisState
-HostGenesisState defines the interchain accounts host genesis state
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `active_channels` | [ActiveChannel](#ibc.applications.interchain_accounts.genesis.v1.ActiveChannel) | repeated | |
-| `interchain_accounts` | [RegisteredInterchainAccount](#ibc.applications.interchain_accounts.genesis.v1.RegisteredInterchainAccount) | repeated | |
-| `port` | [string](#string) | | |
-| `params` | [ibc.applications.interchain_accounts.host.v1.Params](#ibc.applications.interchain_accounts.host.v1.Params) | | |
-
-
-
-
-
-
-
-
-### RegisteredInterchainAccount
-RegisteredInterchainAccount contains a connection ID, port ID and associated interchain account address
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `connection_id` | [string](#string) | | |
-| `port_id` | [string](#string) | | |
-| `account_address` | [string](#string) | | |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## ibc/applications/interchain_accounts/host/v1/query.proto
-
-
-
-
-
-### QueryParamsRequest
-QueryParamsRequest is the request type for the Query/Params RPC method.
-
-
-
-
-
-
-
-
-### QueryParamsResponse
-QueryParamsResponse is the response type for the Query/Params RPC method.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `params` | [Params](#ibc.applications.interchain_accounts.host.v1.Params) | | params defines the parameters of the module. |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-### Query
-Query provides defines the gRPC querier service.
-
-| Method Name | Request Type | Response Type | Description | HTTP Verb | Endpoint |
-| ----------- | ------------ | ------------- | ------------| ------- | -------- |
-| `Params` | [QueryParamsRequest](#ibc.applications.interchain_accounts.host.v1.QueryParamsRequest) | [QueryParamsResponse](#ibc.applications.interchain_accounts.host.v1.QueryParamsResponse) | Params queries all parameters of the ICA host submodule. | GET|/ibc/apps/interchain_accounts/host/v1/params|
-
-
-
-
-
-
-Top
-
-## ibc/applications/interchain_accounts/v1/account.proto
-
-
-
-
-
-### InterchainAccount
-An InterchainAccount is defined as a BaseAccount & the address of the account owner on the controller chain
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `base_account` | [cosmos.auth.v1beta1.BaseAccount](#cosmos.auth.v1beta1.BaseAccount) | | |
-| `account_owner` | [string](#string) | | |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## ibc/applications/interchain_accounts/v1/metadata.proto
-
-
-
-
-
-### Metadata
-Metadata defines a set of protocol specific data encoded into the ICS27 channel version bytestring
-See ICS004: https://github.com/cosmos/ibc/tree/master/spec/core/ics-004-channel-and-packet-semantics#Versioning
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `version` | [string](#string) | | version defines the ICS27 protocol version |
-| `controller_connection_id` | [string](#string) | | controller_connection_id is the connection identifier associated with the controller chain |
-| `host_connection_id` | [string](#string) | | host_connection_id is the connection identifier associated with the host chain |
-| `address` | [string](#string) | | address defines the interchain account address to be fulfilled upon the OnChanOpenTry handshake step NOTE: the address field is empty on the OnChanOpenInit handshake step |
-| `encoding` | [string](#string) | | encoding defines the supported codec format |
-| `tx_type` | [string](#string) | | tx_type defines the type of transactions the interchain account can execute |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## ibc/applications/transfer/v1/transfer.proto
-
-
-
-
-
-### DenomTrace
-DenomTrace contains the base denomination for ICS20 fungible tokens and the
-source tracing information path.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `path` | [string](#string) | | path defines the chain of port/channel identifiers used for tracing the source of the fungible token. |
-| `base_denom` | [string](#string) | | base denomination of the relayed fungible token. |
-
-
-
-
-
-
-
-
-### Params
-Params defines the set of IBC transfer parameters.
-NOTE: To prevent a single token from being transferred, set the
-TransfersEnabled parameter to true and then set the bank module's SendEnabled
-parameter for the denomination to false.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `send_enabled` | [bool](#bool) | | send_enabled enables or disables all cross-chain token transfers from this chain. |
-| `receive_enabled` | [bool](#bool) | | receive_enabled enables or disables all cross-chain token transfers to this chain. |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## ibc/applications/transfer/v1/genesis.proto
-
-
-
-
-
-### GenesisState
-GenesisState defines the ibc-transfer genesis state
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | |
-| `denom_traces` | [DenomTrace](#ibc.applications.transfer.v1.DenomTrace) | repeated | |
-| `params` | [Params](#ibc.applications.transfer.v1.Params) | | |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## ibc/applications/transfer/v1/query.proto
-
-
-
-
-
-### QueryDenomHashRequest
-QueryDenomHashRequest is the request type for the Query/DenomHash RPC
-method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `trace` | [string](#string) | | The denomination trace ([port_id]/[channel_id])+/[denom] |
-
-
-
-
-
-
-
-
-### QueryDenomHashResponse
-QueryDenomHashResponse is the response type for the Query/DenomHash RPC
-method.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `hash` | [string](#string) | | hash (in hex format) of the denomination trace information. |
-
-
-
-
-
-
-
-
-### QueryDenomTraceRequest
-QueryDenomTraceRequest is the request type for the Query/DenomTrace RPC
-method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `hash` | [string](#string) | | hash (in hex format) or denom (full denom with ibc prefix) of the denomination trace information. |
-
-
-
-
-
-
-
-
-### QueryDenomTraceResponse
-QueryDenomTraceResponse is the response type for the Query/DenomTrace RPC
-method.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `denom_trace` | [DenomTrace](#ibc.applications.transfer.v1.DenomTrace) | | denom_trace returns the requested denomination trace information. |
-
-
-
-
-
-
-
-
-### QueryDenomTracesRequest
-QueryConnectionsRequest is the request type for the Query/DenomTraces RPC
-method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `pagination` | [cosmos.base.query.v1beta1.PageRequest](#cosmos.base.query.v1beta1.PageRequest) | | pagination defines an optional pagination for the request. |
-
-
-
-
-
-
-
-
-### QueryDenomTracesResponse
-QueryConnectionsResponse is the response type for the Query/DenomTraces RPC
-method.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `denom_traces` | [DenomTrace](#ibc.applications.transfer.v1.DenomTrace) | repeated | denom_traces returns all denominations trace information. |
-| `pagination` | [cosmos.base.query.v1beta1.PageResponse](#cosmos.base.query.v1beta1.PageResponse) | | pagination defines the pagination in the response. |
-
-
-
-
-
-
-
-
-### QueryEscrowAddressRequest
-QueryEscrowAddressRequest is the request type for the EscrowAddress RPC method.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | unique port identifier |
-| `channel_id` | [string](#string) | | unique channel identifier |
-
-
-
-
-
-
-
-
-### QueryEscrowAddressResponse
-QueryEscrowAddressResponse is the response type of the EscrowAddress RPC method.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `escrow_address` | [string](#string) | | the escrow account address |
-
-
-
-
-
-
-
-
-### QueryParamsRequest
-QueryParamsRequest is the request type for the Query/Params RPC method.
-
-
-
-
-
-
-
-
-### QueryParamsResponse
-QueryParamsResponse is the response type for the Query/Params RPC method.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `params` | [Params](#ibc.applications.transfer.v1.Params) | | params defines the parameters of the module. |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-### Query
-Query provides defines the gRPC querier service.
-
-| Method Name | Request Type | Response Type | Description | HTTP Verb | Endpoint |
-| ----------- | ------------ | ------------- | ------------| ------- | -------- |
-| `DenomTrace` | [QueryDenomTraceRequest](#ibc.applications.transfer.v1.QueryDenomTraceRequest) | [QueryDenomTraceResponse](#ibc.applications.transfer.v1.QueryDenomTraceResponse) | DenomTrace queries a denomination trace information. | GET|/ibc/apps/transfer/v1/denom_traces/{hash}|
-| `DenomTraces` | [QueryDenomTracesRequest](#ibc.applications.transfer.v1.QueryDenomTracesRequest) | [QueryDenomTracesResponse](#ibc.applications.transfer.v1.QueryDenomTracesResponse) | DenomTraces queries all denomination traces. | GET|/ibc/apps/transfer/v1/denom_traces|
-| `Params` | [QueryParamsRequest](#ibc.applications.transfer.v1.QueryParamsRequest) | [QueryParamsResponse](#ibc.applications.transfer.v1.QueryParamsResponse) | Params queries all parameters of the ibc-transfer module. | GET|/ibc/apps/transfer/v1/params|
-| `DenomHash` | [QueryDenomHashRequest](#ibc.applications.transfer.v1.QueryDenomHashRequest) | [QueryDenomHashResponse](#ibc.applications.transfer.v1.QueryDenomHashResponse) | DenomHash queries a denomination hash information. | GET|/ibc/apps/transfer/v1/denom_hashes/{trace}|
-| `EscrowAddress` | [QueryEscrowAddressRequest](#ibc.applications.transfer.v1.QueryEscrowAddressRequest) | [QueryEscrowAddressResponse](#ibc.applications.transfer.v1.QueryEscrowAddressResponse) | EscrowAddress returns the escrow address for a particular port and channel id. | GET|/ibc/apps/transfer/v1/channels/{channel_id}/ports/{port_id}/escrow_address|
-
-
-
-
-
-
-Top
-
-## ibc/applications/transfer/v1/tx.proto
-
-
-
-
-
-### MsgTransfer
-MsgTransfer defines a msg to transfer fungible tokens (i.e Coins) between
-ICS20 enabled chains. See ICS Spec here:
-https://github.com/cosmos/ibc/tree/master/spec/app/ics-020-fungible-token-transfer#data-structures
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `source_port` | [string](#string) | | the port on which the packet will be sent |
-| `source_channel` | [string](#string) | | the channel by which the packet will be sent |
-| `token` | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | | the tokens to be transferred |
-| `sender` | [string](#string) | | the sender address |
-| `receiver` | [string](#string) | | the recipient address on the destination chain |
-| `timeout_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | Timeout height relative to the current block height. The timeout is disabled when set to 0. |
-| `timeout_timestamp` | [uint64](#uint64) | | Timeout timestamp in absolute nanoseconds since unix epoch. The timeout is disabled when set to 0. |
-| `memo` | [string](#string) | | optional memo |
-
-
-
-
-
-
-
-
-### MsgTransferResponse
-MsgTransferResponse defines the Msg/Transfer response type.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `sequence` | [uint64](#uint64) | | sequence number of the transfer packet sent |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-### Msg
-Msg defines the ibc/transfer Msg service.
-
-| Method Name | Request Type | Response Type | Description | HTTP Verb | Endpoint |
-| ----------- | ------------ | ------------- | ------------| ------- | -------- |
-| `Transfer` | [MsgTransfer](#ibc.applications.transfer.v1.MsgTransfer) | [MsgTransferResponse](#ibc.applications.transfer.v1.MsgTransferResponse) | Transfer defines a rpc handler method for MsgTransfer. | |
-
-
-
-
-
-
-Top
-
-## ibc/applications/transfer/v2/packet.proto
-
-
-
-
-
-### FungibleTokenPacketData
-FungibleTokenPacketData defines a struct for the packet payload
-See FungibleTokenPacketData spec:
-https://github.com/cosmos/ibc/tree/master/spec/app/ics-020-fungible-token-transfer#data-structures
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `denom` | [string](#string) | | the token denomination to be transferred |
-| `amount` | [string](#string) | | the token amount to be transferred |
-| `sender` | [string](#string) | | the sender address |
-| `receiver` | [string](#string) | | the recipient address on the destination chain |
-| `memo` | [string](#string) | | optional memo |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## ibc/core/channel/v1/genesis.proto
-
-
-
-
-
-### GenesisState
-GenesisState defines the ibc channel submodule's genesis state.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `channels` | [IdentifiedChannel](#ibc.core.channel.v1.IdentifiedChannel) | repeated | |
-| `acknowledgements` | [PacketState](#ibc.core.channel.v1.PacketState) | repeated | |
-| `commitments` | [PacketState](#ibc.core.channel.v1.PacketState) | repeated | |
-| `receipts` | [PacketState](#ibc.core.channel.v1.PacketState) | repeated | |
-| `send_sequences` | [PacketSequence](#ibc.core.channel.v1.PacketSequence) | repeated | |
-| `recv_sequences` | [PacketSequence](#ibc.core.channel.v1.PacketSequence) | repeated | |
-| `ack_sequences` | [PacketSequence](#ibc.core.channel.v1.PacketSequence) | repeated | |
-| `next_channel_sequence` | [uint64](#uint64) | | the sequence for the next generated channel identifier |
-
-
-
-
-
-
-
-
-### PacketSequence
-PacketSequence defines the genesis type necessary to retrieve and store
-next send and receive sequences.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | |
-| `channel_id` | [string](#string) | | |
-| `sequence` | [uint64](#uint64) | | |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## ibc/core/channel/v1/query.proto
-
-
-
-
-
-### QueryChannelClientStateRequest
-QueryChannelClientStateRequest is the request type for the Query/ClientState
-RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | port unique identifier |
-| `channel_id` | [string](#string) | | channel unique identifier |
-
-
-
-
-
-
-
-
-### QueryChannelClientStateResponse
-QueryChannelClientStateResponse is the Response type for the
-Query/QueryChannelClientState RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `identified_client_state` | [ibc.core.client.v1.IdentifiedClientState](#ibc.core.client.v1.IdentifiedClientState) | | client state associated with the channel |
-| `proof` | [bytes](#bytes) | | merkle proof of existence |
-| `proof_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | height at which the proof was retrieved |
-
-
-
-
-
-
-
-
-### QueryChannelConsensusStateRequest
-QueryChannelConsensusStateRequest is the request type for the
-Query/ConsensusState RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | port unique identifier |
-| `channel_id` | [string](#string) | | channel unique identifier |
-| `revision_number` | [uint64](#uint64) | | revision number of the consensus state |
-| `revision_height` | [uint64](#uint64) | | revision height of the consensus state |
-
-
-
-
-
-
-
-
-### QueryChannelConsensusStateResponse
-QueryChannelClientStateResponse is the Response type for the
-Query/QueryChannelClientState RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `consensus_state` | [google.protobuf.Any](#google.protobuf.Any) | | consensus state associated with the channel |
-| `client_id` | [string](#string) | | client ID associated with the consensus state |
-| `proof` | [bytes](#bytes) | | merkle proof of existence |
-| `proof_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | height at which the proof was retrieved |
-
-
-
-
-
-
-
-
-### QueryChannelRequest
-QueryChannelRequest is the request type for the Query/Channel RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | port unique identifier |
-| `channel_id` | [string](#string) | | channel unique identifier |
-
-
-
-
-
-
-
-
-### QueryChannelResponse
-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.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `channel` | [Channel](#ibc.core.channel.v1.Channel) | | channel associated with the request identifiers |
-| `proof` | [bytes](#bytes) | | merkle proof of existence |
-| `proof_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | height at which the proof was retrieved |
-
-
-
-
-
-
-
-
-### QueryChannelsRequest
-QueryChannelsRequest is the request type for the Query/Channels RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `pagination` | [cosmos.base.query.v1beta1.PageRequest](#cosmos.base.query.v1beta1.PageRequest) | | pagination request |
-
-
-
-
-
-
-
-
-### QueryChannelsResponse
-QueryChannelsResponse is the response type for the Query/Channels RPC method.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `channels` | [IdentifiedChannel](#ibc.core.channel.v1.IdentifiedChannel) | repeated | list of stored channels of the chain. |
-| `pagination` | [cosmos.base.query.v1beta1.PageResponse](#cosmos.base.query.v1beta1.PageResponse) | | pagination response |
-| `height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | query block height |
-
-
-
-
-
-
-
-
-### QueryConnectionChannelsRequest
-QueryConnectionChannelsRequest is the request type for the
-Query/QueryConnectionChannels RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `connection` | [string](#string) | | connection unique identifier |
-| `pagination` | [cosmos.base.query.v1beta1.PageRequest](#cosmos.base.query.v1beta1.PageRequest) | | pagination request |
-
-
-
-
-
-
-
-
-### QueryConnectionChannelsResponse
-QueryConnectionChannelsResponse is the Response type for the
-Query/QueryConnectionChannels RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `channels` | [IdentifiedChannel](#ibc.core.channel.v1.IdentifiedChannel) | repeated | list of channels associated with a connection. |
-| `pagination` | [cosmos.base.query.v1beta1.PageResponse](#cosmos.base.query.v1beta1.PageResponse) | | pagination response |
-| `height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | query block height |
-
-
-
-
-
-
-
-
-### QueryNextSequenceReceiveRequest
-QueryNextSequenceReceiveRequest is the request type for the
-Query/QueryNextSequenceReceiveRequest RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | port unique identifier |
-| `channel_id` | [string](#string) | | channel unique identifier |
-
-
-
-
-
-
-
-
-### QueryNextSequenceReceiveResponse
-QuerySequenceResponse is the request type for the
-Query/QueryNextSequenceReceiveResponse RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `next_sequence_receive` | [uint64](#uint64) | | next sequence receive number |
-| `proof` | [bytes](#bytes) | | merkle proof of existence |
-| `proof_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | height at which the proof was retrieved |
-
-
-
-
-
-
-
-
-### QueryPacketAcknowledgementRequest
-QueryPacketAcknowledgementRequest is the request type for the
-Query/PacketAcknowledgement RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | port unique identifier |
-| `channel_id` | [string](#string) | | channel unique identifier |
-| `sequence` | [uint64](#uint64) | | packet sequence |
-
-
-
-
-
-
-
-
-### QueryPacketAcknowledgementResponse
-QueryPacketAcknowledgementResponse defines the client query response for a
-packet which also includes a proof and the height from which the
-proof was retrieved
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `acknowledgement` | [bytes](#bytes) | | packet associated with the request fields |
-| `proof` | [bytes](#bytes) | | merkle proof of existence |
-| `proof_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | height at which the proof was retrieved |
-
-
-
-
-
-
-
-
-### QueryPacketAcknowledgementsRequest
-QueryPacketAcknowledgementsRequest is the request type for the
-Query/QueryPacketCommitments RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | port unique identifier |
-| `channel_id` | [string](#string) | | channel unique identifier |
-| `pagination` | [cosmos.base.query.v1beta1.PageRequest](#cosmos.base.query.v1beta1.PageRequest) | | pagination request |
-| `packet_commitment_sequences` | [uint64](#uint64) | repeated | list of packet sequences |
-
-
-
-
-
-
-
-
-### QueryPacketAcknowledgementsResponse
-QueryPacketAcknowledgemetsResponse is the request type for the
-Query/QueryPacketAcknowledgements RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `acknowledgements` | [PacketState](#ibc.core.channel.v1.PacketState) | repeated | |
-| `pagination` | [cosmos.base.query.v1beta1.PageResponse](#cosmos.base.query.v1beta1.PageResponse) | | pagination response |
-| `height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | query block height |
-
-
-
-
-
-
-
-
-### QueryPacketCommitmentRequest
-QueryPacketCommitmentRequest is the request type for the
-Query/PacketCommitment RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | port unique identifier |
-| `channel_id` | [string](#string) | | channel unique identifier |
-| `sequence` | [uint64](#uint64) | | packet sequence |
-
-
-
-
-
-
-
-
-### QueryPacketCommitmentResponse
-QueryPacketCommitmentResponse defines the client query response for a packet
-which also includes a proof and the height from which the proof was
-retrieved
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `commitment` | [bytes](#bytes) | | packet associated with the request fields |
-| `proof` | [bytes](#bytes) | | merkle proof of existence |
-| `proof_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | height at which the proof was retrieved |
-
-
-
-
-
-
-
-
-### QueryPacketCommitmentsRequest
-QueryPacketCommitmentsRequest is the request type for the
-Query/QueryPacketCommitments RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | port unique identifier |
-| `channel_id` | [string](#string) | | channel unique identifier |
-| `pagination` | [cosmos.base.query.v1beta1.PageRequest](#cosmos.base.query.v1beta1.PageRequest) | | pagination request |
-
-
-
-
-
-
-
-
-### QueryPacketCommitmentsResponse
-QueryPacketCommitmentsResponse is the request type for the
-Query/QueryPacketCommitments RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `commitments` | [PacketState](#ibc.core.channel.v1.PacketState) | repeated | |
-| `pagination` | [cosmos.base.query.v1beta1.PageResponse](#cosmos.base.query.v1beta1.PageResponse) | | pagination response |
-| `height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | query block height |
-
-
-
-
-
-
-
-
-### QueryPacketReceiptRequest
-QueryPacketReceiptRequest is the request type for the
-Query/PacketReceipt RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | port unique identifier |
-| `channel_id` | [string](#string) | | channel unique identifier |
-| `sequence` | [uint64](#uint64) | | packet sequence |
-
-
-
-
-
-
-
-
-### QueryPacketReceiptResponse
-QueryPacketReceiptResponse defines the client query response for a packet
-receipt which also includes a proof, and the height from which the proof was
-retrieved
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `received` | [bool](#bool) | | success flag for if receipt exists |
-| `proof` | [bytes](#bytes) | | merkle proof of existence |
-| `proof_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | height at which the proof was retrieved |
-
-
-
-
-
-
-
-
-### QueryUnreceivedAcksRequest
-QueryUnreceivedAcks is the request type for the
-Query/UnreceivedAcks RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | port unique identifier |
-| `channel_id` | [string](#string) | | channel unique identifier |
-| `packet_ack_sequences` | [uint64](#uint64) | repeated | list of acknowledgement sequences |
-
-
-
-
-
-
-
-
-### QueryUnreceivedAcksResponse
-QueryUnreceivedAcksResponse is the response type for the
-Query/UnreceivedAcks RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `sequences` | [uint64](#uint64) | repeated | list of unreceived acknowledgement sequences |
-| `height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | query block height |
-
-
-
-
-
-
-
-
-### QueryUnreceivedPacketsRequest
-QueryUnreceivedPacketsRequest is the request type for the
-Query/UnreceivedPackets RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | port unique identifier |
-| `channel_id` | [string](#string) | | channel unique identifier |
-| `packet_commitment_sequences` | [uint64](#uint64) | repeated | list of packet sequences |
-
-
-
-
-
-
-
-
-### QueryUnreceivedPacketsResponse
-QueryUnreceivedPacketsResponse is the response type for the
-Query/UnreceivedPacketCommitments RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `sequences` | [uint64](#uint64) | repeated | list of unreceived packet sequences |
-| `height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | query block height |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-### Query
-Query provides defines the gRPC querier service
-
-| Method Name | Request Type | Response Type | Description | HTTP Verb | Endpoint |
-| ----------- | ------------ | ------------- | ------------| ------- | -------- |
-| `Channel` | [QueryChannelRequest](#ibc.core.channel.v1.QueryChannelRequest) | [QueryChannelResponse](#ibc.core.channel.v1.QueryChannelResponse) | Channel queries an IBC Channel. | GET|/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}|
-| `Channels` | [QueryChannelsRequest](#ibc.core.channel.v1.QueryChannelsRequest) | [QueryChannelsResponse](#ibc.core.channel.v1.QueryChannelsResponse) | Channels queries all the IBC channels of a chain. | GET|/ibc/core/channel/v1/channels|
-| `ConnectionChannels` | [QueryConnectionChannelsRequest](#ibc.core.channel.v1.QueryConnectionChannelsRequest) | [QueryConnectionChannelsResponse](#ibc.core.channel.v1.QueryConnectionChannelsResponse) | ConnectionChannels queries all the channels associated with a connection end. | GET|/ibc/core/channel/v1/connections/{connection}/channels|
-| `ChannelClientState` | [QueryChannelClientStateRequest](#ibc.core.channel.v1.QueryChannelClientStateRequest) | [QueryChannelClientStateResponse](#ibc.core.channel.v1.QueryChannelClientStateResponse) | ChannelClientState queries for the client state for the channel associated with the provided channel identifiers. | GET|/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/client_state|
-| `ChannelConsensusState` | [QueryChannelConsensusStateRequest](#ibc.core.channel.v1.QueryChannelConsensusStateRequest) | [QueryChannelConsensusStateResponse](#ibc.core.channel.v1.QueryChannelConsensusStateResponse) | ChannelConsensusState queries for the consensus state for the channel associated with the provided channel identifiers. | GET|/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/consensus_state/revision/{revision_number}/height/{revision_height}|
-| `PacketCommitment` | [QueryPacketCommitmentRequest](#ibc.core.channel.v1.QueryPacketCommitmentRequest) | [QueryPacketCommitmentResponse](#ibc.core.channel.v1.QueryPacketCommitmentResponse) | PacketCommitment queries a stored packet commitment hash. | GET|/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_commitments/{sequence}|
-| `PacketCommitments` | [QueryPacketCommitmentsRequest](#ibc.core.channel.v1.QueryPacketCommitmentsRequest) | [QueryPacketCommitmentsResponse](#ibc.core.channel.v1.QueryPacketCommitmentsResponse) | PacketCommitments returns all the packet commitments hashes associated with a channel. | GET|/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_commitments|
-| `PacketReceipt` | [QueryPacketReceiptRequest](#ibc.core.channel.v1.QueryPacketReceiptRequest) | [QueryPacketReceiptResponse](#ibc.core.channel.v1.QueryPacketReceiptResponse) | PacketReceipt queries if a given packet sequence has been received on the queried chain | GET|/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_receipts/{sequence}|
-| `PacketAcknowledgement` | [QueryPacketAcknowledgementRequest](#ibc.core.channel.v1.QueryPacketAcknowledgementRequest) | [QueryPacketAcknowledgementResponse](#ibc.core.channel.v1.QueryPacketAcknowledgementResponse) | PacketAcknowledgement queries a stored packet acknowledgement hash. | GET|/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_acks/{sequence}|
-| `PacketAcknowledgements` | [QueryPacketAcknowledgementsRequest](#ibc.core.channel.v1.QueryPacketAcknowledgementsRequest) | [QueryPacketAcknowledgementsResponse](#ibc.core.channel.v1.QueryPacketAcknowledgementsResponse) | PacketAcknowledgements returns all the packet acknowledgements associated with a channel. | GET|/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_acknowledgements|
-| `UnreceivedPackets` | [QueryUnreceivedPacketsRequest](#ibc.core.channel.v1.QueryUnreceivedPacketsRequest) | [QueryUnreceivedPacketsResponse](#ibc.core.channel.v1.QueryUnreceivedPacketsResponse) | UnreceivedPackets returns all the unreceived IBC packets associated with a channel and sequences. | GET|/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_commitments/{packet_commitment_sequences}/unreceived_packets|
-| `UnreceivedAcks` | [QueryUnreceivedAcksRequest](#ibc.core.channel.v1.QueryUnreceivedAcksRequest) | [QueryUnreceivedAcksResponse](#ibc.core.channel.v1.QueryUnreceivedAcksResponse) | UnreceivedAcks returns all the unreceived IBC acknowledgements associated with a channel and sequences. | GET|/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/packet_commitments/{packet_ack_sequences}/unreceived_acks|
-| `NextSequenceReceive` | [QueryNextSequenceReceiveRequest](#ibc.core.channel.v1.QueryNextSequenceReceiveRequest) | [QueryNextSequenceReceiveResponse](#ibc.core.channel.v1.QueryNextSequenceReceiveResponse) | NextSequenceReceive returns the next receive sequence for a given channel. | GET|/ibc/core/channel/v1/channels/{channel_id}/ports/{port_id}/next_sequence|
-
-
-
-
-
-
-Top
-
-## ibc/core/channel/v1/tx.proto
-
-
-
-
-
-### MsgAcknowledgement
-MsgAcknowledgement receives incoming IBC acknowledgement
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `packet` | [Packet](#ibc.core.channel.v1.Packet) | | |
-| `acknowledgement` | [bytes](#bytes) | | |
-| `proof_acked` | [bytes](#bytes) | | |
-| `proof_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | |
-| `signer` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### MsgAcknowledgementResponse
-MsgAcknowledgementResponse defines the Msg/Acknowledgement response type.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `result` | [ResponseResultType](#ibc.core.channel.v1.ResponseResultType) | | |
-
-
-
-
-
-
-
-
-### MsgChannelCloseConfirm
-MsgChannelCloseConfirm defines a msg sent by a Relayer to Chain B
-to acknowledge the change of channel state to CLOSED on Chain A.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | |
-| `channel_id` | [string](#string) | | |
-| `proof_init` | [bytes](#bytes) | | |
-| `proof_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | |
-| `signer` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### MsgChannelCloseConfirmResponse
-MsgChannelCloseConfirmResponse defines the Msg/ChannelCloseConfirm response
-type.
-
-
-
-
-
-
-
-
-### MsgChannelCloseInit
-MsgChannelCloseInit defines a msg sent by a Relayer to Chain A
-to close a channel with Chain B.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | |
-| `channel_id` | [string](#string) | | |
-| `signer` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### MsgChannelCloseInitResponse
-MsgChannelCloseInitResponse defines the Msg/ChannelCloseInit response type.
-
-
-
-
-
-
-
-
-### MsgChannelOpenAck
-MsgChannelOpenAck defines a msg sent by a Relayer to Chain A to acknowledge
-the change of channel state to TRYOPEN on Chain B.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | |
-| `channel_id` | [string](#string) | | |
-| `counterparty_channel_id` | [string](#string) | | |
-| `counterparty_version` | [string](#string) | | |
-| `proof_try` | [bytes](#bytes) | | |
-| `proof_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | |
-| `signer` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### MsgChannelOpenAckResponse
-MsgChannelOpenAckResponse defines the Msg/ChannelOpenAck response type.
-
-
-
-
-
-
-
-
-### MsgChannelOpenConfirm
-MsgChannelOpenConfirm defines a msg sent by a Relayer to Chain B to
-acknowledge the change of channel state to OPEN on Chain A.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | |
-| `channel_id` | [string](#string) | | |
-| `proof_ack` | [bytes](#bytes) | | |
-| `proof_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | |
-| `signer` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### MsgChannelOpenConfirmResponse
-MsgChannelOpenConfirmResponse defines the Msg/ChannelOpenConfirm response
-type.
-
-
-
-
-
-
-
-
-### MsgChannelOpenInit
-MsgChannelOpenInit defines an sdk.Msg to initialize a channel handshake. It
-is called by a relayer on Chain A.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | |
-| `channel` | [Channel](#ibc.core.channel.v1.Channel) | | |
-| `signer` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### MsgChannelOpenInitResponse
-MsgChannelOpenInitResponse defines the Msg/ChannelOpenInit response type.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `channel_id` | [string](#string) | | |
-| `version` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### MsgChannelOpenTry
-MsgChannelOpenInit defines a msg sent by a Relayer to try to open a channel
-on Chain B. The version field within the Channel field has been deprecated. Its
-value will be ignored by core IBC.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `port_id` | [string](#string) | | |
-| `previous_channel_id` | [string](#string) | | **Deprecated.** Deprecated: this field is unused. Crossing hello's are no longer supported in core IBC. |
-| `channel` | [Channel](#ibc.core.channel.v1.Channel) | | NOTE: the version field within the channel has been deprecated. Its value will be ignored by core IBC. |
-| `counterparty_version` | [string](#string) | | |
-| `proof_init` | [bytes](#bytes) | | |
-| `proof_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | |
-| `signer` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### MsgChannelOpenTryResponse
-MsgChannelOpenTryResponse defines the Msg/ChannelOpenTry response type.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `version` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### MsgRecvPacket
-MsgRecvPacket receives incoming IBC packet
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `packet` | [Packet](#ibc.core.channel.v1.Packet) | | |
-| `proof_commitment` | [bytes](#bytes) | | |
-| `proof_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | |
-| `signer` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### MsgRecvPacketResponse
-MsgRecvPacketResponse defines the Msg/RecvPacket response type.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `result` | [ResponseResultType](#ibc.core.channel.v1.ResponseResultType) | | |
-
-
-
-
-
-
-
-
-### MsgTimeout
-MsgTimeout receives timed-out packet
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `packet` | [Packet](#ibc.core.channel.v1.Packet) | | |
-| `proof_unreceived` | [bytes](#bytes) | | |
-| `proof_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | |
-| `next_sequence_recv` | [uint64](#uint64) | | |
-| `signer` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### MsgTimeoutOnClose
-MsgTimeoutOnClose timed-out packet upon counterparty channel closure.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `packet` | [Packet](#ibc.core.channel.v1.Packet) | | |
-| `proof_unreceived` | [bytes](#bytes) | | |
-| `proof_close` | [bytes](#bytes) | | |
-| `proof_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | |
-| `next_sequence_recv` | [uint64](#uint64) | | |
-| `signer` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### MsgTimeoutOnCloseResponse
-MsgTimeoutOnCloseResponse defines the Msg/TimeoutOnClose response type.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `result` | [ResponseResultType](#ibc.core.channel.v1.ResponseResultType) | | |
-
-
-
-
-
-
-
-
-### MsgTimeoutResponse
-MsgTimeoutResponse defines the Msg/Timeout response type.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `result` | [ResponseResultType](#ibc.core.channel.v1.ResponseResultType) | | |
-
-
-
-
-
-
-
-
-
-
-### ResponseResultType
-ResponseResultType defines the possible outcomes of the execution of a message
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| RESPONSE_RESULT_TYPE_UNSPECIFIED | 0 | Default zero value enumeration |
-| RESPONSE_RESULT_TYPE_NOOP | 1 | The message did not call the IBC application callbacks (because, for example, the packet had already been relayed) |
-| RESPONSE_RESULT_TYPE_SUCCESS | 2 | The message was executed successfully |
-
-
-
-
-
-
-
-
-
-### Msg
-Msg defines the ibc/channel Msg service.
-
-| Method Name | Request Type | Response Type | Description | HTTP Verb | Endpoint |
-| ----------- | ------------ | ------------- | ------------| ------- | -------- |
-| `ChannelOpenInit` | [MsgChannelOpenInit](#ibc.core.channel.v1.MsgChannelOpenInit) | [MsgChannelOpenInitResponse](#ibc.core.channel.v1.MsgChannelOpenInitResponse) | ChannelOpenInit defines a rpc handler method for MsgChannelOpenInit. | |
-| `ChannelOpenTry` | [MsgChannelOpenTry](#ibc.core.channel.v1.MsgChannelOpenTry) | [MsgChannelOpenTryResponse](#ibc.core.channel.v1.MsgChannelOpenTryResponse) | ChannelOpenTry defines a rpc handler method for MsgChannelOpenTry. | |
-| `ChannelOpenAck` | [MsgChannelOpenAck](#ibc.core.channel.v1.MsgChannelOpenAck) | [MsgChannelOpenAckResponse](#ibc.core.channel.v1.MsgChannelOpenAckResponse) | ChannelOpenAck defines a rpc handler method for MsgChannelOpenAck. | |
-| `ChannelOpenConfirm` | [MsgChannelOpenConfirm](#ibc.core.channel.v1.MsgChannelOpenConfirm) | [MsgChannelOpenConfirmResponse](#ibc.core.channel.v1.MsgChannelOpenConfirmResponse) | ChannelOpenConfirm defines a rpc handler method for MsgChannelOpenConfirm. | |
-| `ChannelCloseInit` | [MsgChannelCloseInit](#ibc.core.channel.v1.MsgChannelCloseInit) | [MsgChannelCloseInitResponse](#ibc.core.channel.v1.MsgChannelCloseInitResponse) | ChannelCloseInit defines a rpc handler method for MsgChannelCloseInit. | |
-| `ChannelCloseConfirm` | [MsgChannelCloseConfirm](#ibc.core.channel.v1.MsgChannelCloseConfirm) | [MsgChannelCloseConfirmResponse](#ibc.core.channel.v1.MsgChannelCloseConfirmResponse) | ChannelCloseConfirm defines a rpc handler method for MsgChannelCloseConfirm. | |
-| `RecvPacket` | [MsgRecvPacket](#ibc.core.channel.v1.MsgRecvPacket) | [MsgRecvPacketResponse](#ibc.core.channel.v1.MsgRecvPacketResponse) | RecvPacket defines a rpc handler method for MsgRecvPacket. | |
-| `Timeout` | [MsgTimeout](#ibc.core.channel.v1.MsgTimeout) | [MsgTimeoutResponse](#ibc.core.channel.v1.MsgTimeoutResponse) | Timeout defines a rpc handler method for MsgTimeout. | |
-| `TimeoutOnClose` | [MsgTimeoutOnClose](#ibc.core.channel.v1.MsgTimeoutOnClose) | [MsgTimeoutOnCloseResponse](#ibc.core.channel.v1.MsgTimeoutOnCloseResponse) | TimeoutOnClose defines a rpc handler method for MsgTimeoutOnClose. | |
-| `Acknowledgement` | [MsgAcknowledgement](#ibc.core.channel.v1.MsgAcknowledgement) | [MsgAcknowledgementResponse](#ibc.core.channel.v1.MsgAcknowledgementResponse) | Acknowledgement defines a rpc handler method for MsgAcknowledgement. | |
-
-
-
-
-
-
-Top
-
-## ibc/core/client/v1/genesis.proto
-
-
-
-
-
-### GenesisMetadata
-GenesisMetadata defines the genesis type for metadata that clients may return
-with ExportMetadata
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `key` | [bytes](#bytes) | | store key of metadata without clientID-prefix |
-| `value` | [bytes](#bytes) | | metadata value |
-
-
-
-
-
-
-
-
-### GenesisState
-GenesisState defines the ibc client submodule's genesis state.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `clients` | [IdentifiedClientState](#ibc.core.client.v1.IdentifiedClientState) | repeated | client states with their corresponding identifiers |
-| `clients_consensus` | [ClientConsensusStates](#ibc.core.client.v1.ClientConsensusStates) | repeated | consensus states from each client |
-| `clients_metadata` | [IdentifiedGenesisMetadata](#ibc.core.client.v1.IdentifiedGenesisMetadata) | repeated | metadata from each client |
-| `params` | [Params](#ibc.core.client.v1.Params) | | |
-| `create_localhost` | [bool](#bool) | | create localhost on initialization |
-| `next_client_sequence` | [uint64](#uint64) | | the sequence for the next generated client identifier |
-
-
-
-
-
-
-
-
-### IdentifiedGenesisMetadata
-IdentifiedGenesisMetadata has the client metadata with the corresponding
-client id.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_id` | [string](#string) | | |
-| `client_metadata` | [GenesisMetadata](#ibc.core.client.v1.GenesisMetadata) | repeated | |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## ibc/core/client/v1/query.proto
-
-
-
-
-
-### QueryClientStateRequest
-QueryClientStateRequest is the request type for the Query/ClientState RPC
-method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_id` | [string](#string) | | client state unique identifier |
-
-
-
-
-
-
-
-
-### QueryClientStateResponse
-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.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_state` | [google.protobuf.Any](#google.protobuf.Any) | | client state associated with the request identifier |
-| `proof` | [bytes](#bytes) | | merkle proof of existence |
-| `proof_height` | [Height](#ibc.core.client.v1.Height) | | height at which the proof was retrieved |
-
-
-
-
-
-
-
-
-### QueryClientStatesRequest
-QueryClientStatesRequest is the request type for the Query/ClientStates RPC
-method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `pagination` | [cosmos.base.query.v1beta1.PageRequest](#cosmos.base.query.v1beta1.PageRequest) | | pagination request |
-
-
-
-
-
-
-
-
-### QueryClientStatesResponse
-QueryClientStatesResponse is the response type for the Query/ClientStates RPC
-method.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_states` | [IdentifiedClientState](#ibc.core.client.v1.IdentifiedClientState) | repeated | list of stored ClientStates of the chain. |
-| `pagination` | [cosmos.base.query.v1beta1.PageResponse](#cosmos.base.query.v1beta1.PageResponse) | | pagination response |
-
-
-
-
-
-
-
-
-### QueryClientStatusRequest
-QueryClientStatusRequest is the request type for the Query/ClientStatus RPC
-method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_id` | [string](#string) | | client unique identifier |
-
-
-
-
-
-
-
-
-### QueryClientStatusResponse
-QueryClientStatusResponse is the response type for the Query/ClientStatus RPC
-method. It returns the current status of the IBC client.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `status` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### QueryConsensusStateHeightsRequest
-QueryConsensusStateHeightsRequest is the request type for Query/ConsensusStateHeights
-RPC method.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_id` | [string](#string) | | client identifier |
-| `pagination` | [cosmos.base.query.v1beta1.PageRequest](#cosmos.base.query.v1beta1.PageRequest) | | pagination request |
-
-
-
-
-
-
-
-
-### QueryConsensusStateHeightsResponse
-QueryConsensusStateHeightsResponse is the response type for the
-Query/ConsensusStateHeights RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `consensus_state_heights` | [Height](#ibc.core.client.v1.Height) | repeated | consensus state heights |
-| `pagination` | [cosmos.base.query.v1beta1.PageResponse](#cosmos.base.query.v1beta1.PageResponse) | | pagination response |
-
-
-
-
-
-
-
-
-### QueryConsensusStateRequest
-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.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_id` | [string](#string) | | client identifier |
-| `revision_number` | [uint64](#uint64) | | consensus state revision number |
-| `revision_height` | [uint64](#uint64) | | consensus state revision height |
-| `latest_height` | [bool](#bool) | | latest_height overrrides the height field and queries the latest stored ConsensusState |
-
-
-
-
-
-
-
-
-### QueryConsensusStateResponse
-QueryConsensusStateResponse is the response type for the Query/ConsensusState
-RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `consensus_state` | [google.protobuf.Any](#google.protobuf.Any) | | consensus state associated with the client identifier at the given height |
-| `proof` | [bytes](#bytes) | | merkle proof of existence |
-| `proof_height` | [Height](#ibc.core.client.v1.Height) | | height at which the proof was retrieved |
-
-
-
-
-
-
-
-
-### QueryConsensusStatesRequest
-QueryConsensusStatesRequest is the request type for the Query/ConsensusStates
-RPC method.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_id` | [string](#string) | | client identifier |
-| `pagination` | [cosmos.base.query.v1beta1.PageRequest](#cosmos.base.query.v1beta1.PageRequest) | | pagination request |
-
-
-
-
-
-
-
-
-### QueryConsensusStatesResponse
-QueryConsensusStatesResponse is the response type for the
-Query/ConsensusStates RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `consensus_states` | [ConsensusStateWithHeight](#ibc.core.client.v1.ConsensusStateWithHeight) | repeated | consensus states associated with the identifier |
-| `pagination` | [cosmos.base.query.v1beta1.PageResponse](#cosmos.base.query.v1beta1.PageResponse) | | pagination response |
-
-
-
-
-
-
-
-
-### QueryParamsRequest
-QueryParamsRequest is the request type for the Query/Params RPC
-method.
-
-
-
-
-
-
-
-
-### QueryParamsResponse
-QueryParamsResponse is the response type for the Query/Params RPC
-method.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `params` | [Params](#ibc.core.client.v1.Params) | | params defines the parameters of the module. |
-
-
-
-
-
-
-
-
-### QueryUpgradedClientStateRequest
-QueryUpgradedClientStateRequest is the request type for the
-Query/UpgradedClientState RPC method
-
-
-
-
-
-
-
-
-### QueryUpgradedClientStateResponse
-QueryUpgradedClientStateResponse is the response type for the
-Query/UpgradedClientState RPC method.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `upgraded_client_state` | [google.protobuf.Any](#google.protobuf.Any) | | client state associated with the request identifier |
-
-
-
-
-
-
-
-
-### QueryUpgradedConsensusStateRequest
-QueryUpgradedConsensusStateRequest is the request type for the
-Query/UpgradedConsensusState RPC method
-
-
-
-
-
-
-
-
-### QueryUpgradedConsensusStateResponse
-QueryUpgradedConsensusStateResponse is the response type for the
-Query/UpgradedConsensusState RPC method.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `upgraded_consensus_state` | [google.protobuf.Any](#google.protobuf.Any) | | Consensus state associated with the request identifier |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-### Query
-Query provides defines the gRPC querier service
-
-| Method Name | Request Type | Response Type | Description | HTTP Verb | Endpoint |
-| ----------- | ------------ | ------------- | ------------| ------- | -------- |
-| `ClientState` | [QueryClientStateRequest](#ibc.core.client.v1.QueryClientStateRequest) | [QueryClientStateResponse](#ibc.core.client.v1.QueryClientStateResponse) | ClientState queries an IBC light client. | GET|/ibc/core/client/v1/client_states/{client_id}|
-| `ClientStates` | [QueryClientStatesRequest](#ibc.core.client.v1.QueryClientStatesRequest) | [QueryClientStatesResponse](#ibc.core.client.v1.QueryClientStatesResponse) | ClientStates queries all the IBC light clients of a chain. | GET|/ibc/core/client/v1/client_states|
-| `ConsensusState` | [QueryConsensusStateRequest](#ibc.core.client.v1.QueryConsensusStateRequest) | [QueryConsensusStateResponse](#ibc.core.client.v1.QueryConsensusStateResponse) | ConsensusState queries a consensus state associated with a client state at a given height. | GET|/ibc/core/client/v1/consensus_states/{client_id}/revision/{revision_number}/height/{revision_height}|
-| `ConsensusStates` | [QueryConsensusStatesRequest](#ibc.core.client.v1.QueryConsensusStatesRequest) | [QueryConsensusStatesResponse](#ibc.core.client.v1.QueryConsensusStatesResponse) | ConsensusStates queries all the consensus state associated with a given client. | GET|/ibc/core/client/v1/consensus_states/{client_id}|
-| `ConsensusStateHeights` | [QueryConsensusStateHeightsRequest](#ibc.core.client.v1.QueryConsensusStateHeightsRequest) | [QueryConsensusStateHeightsResponse](#ibc.core.client.v1.QueryConsensusStateHeightsResponse) | ConsensusStateHeights queries the height of every consensus states associated with a given client. | GET|/ibc/core/client/v1/consensus_states/{client_id}/heights|
-| `ClientStatus` | [QueryClientStatusRequest](#ibc.core.client.v1.QueryClientStatusRequest) | [QueryClientStatusResponse](#ibc.core.client.v1.QueryClientStatusResponse) | Status queries the status of an IBC client. | GET|/ibc/core/client/v1/client_status/{client_id}|
-| `Params` | [QueryParamsRequest](#ibc.core.client.v1.QueryParamsRequest) | [QueryParamsResponse](#ibc.core.client.v1.QueryParamsResponse) | Params queries all parameters of the ibc client. | GET|/ibc/core/client/v1/params|
-| `UpgradedClientState` | [QueryUpgradedClientStateRequest](#ibc.core.client.v1.QueryUpgradedClientStateRequest) | [QueryUpgradedClientStateResponse](#ibc.core.client.v1.QueryUpgradedClientStateResponse) | UpgradedClientState queries an Upgraded IBC light client. | GET|/ibc/core/client/v1/upgraded_client_states|
-| `UpgradedConsensusState` | [QueryUpgradedConsensusStateRequest](#ibc.core.client.v1.QueryUpgradedConsensusStateRequest) | [QueryUpgradedConsensusStateResponse](#ibc.core.client.v1.QueryUpgradedConsensusStateResponse) | UpgradedConsensusState queries an Upgraded IBC consensus state. | GET|/ibc/core/client/v1/upgraded_consensus_states|
-
-
-
-
-
-
-Top
-
-## ibc/core/client/v1/tx.proto
-
-
-
-
-
-### MsgCreateClient
-MsgCreateClient defines a message to create an IBC client
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_state` | [google.protobuf.Any](#google.protobuf.Any) | | light client state |
-| `consensus_state` | [google.protobuf.Any](#google.protobuf.Any) | | consensus state associated with the client that corresponds to a given height. |
-| `signer` | [string](#string) | | signer address |
-
-
-
-
-
-
-
-
-### MsgCreateClientResponse
-MsgCreateClientResponse defines the Msg/CreateClient response type.
-
-
-
-
-
-
-
-
-### MsgSubmitMisbehaviour
-MsgSubmitMisbehaviour defines an sdk.Msg type that submits Evidence for
-light client misbehaviour.
-Warning: DEPRECATED
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_id` | [string](#string) | | **Deprecated.** client unique identifier |
-| `misbehaviour` | [google.protobuf.Any](#google.protobuf.Any) | | **Deprecated.** misbehaviour used for freezing the light client |
-| `signer` | [string](#string) | | **Deprecated.** signer address |
-
-
-
-
-
-
-
-
-### MsgSubmitMisbehaviourResponse
-MsgSubmitMisbehaviourResponse defines the Msg/SubmitMisbehaviour response
-type.
-
-
-
-
-
-
-
-
-### MsgUpdateClient
-MsgUpdateClient defines an sdk.Msg to update a IBC client state using
-the given client message.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_id` | [string](#string) | | client unique identifier |
-| `client_message` | [google.protobuf.Any](#google.protobuf.Any) | | client message to update the light client |
-| `signer` | [string](#string) | | signer address |
-
-
-
-
-
-
-
-
-### MsgUpdateClientResponse
-MsgUpdateClientResponse defines the Msg/UpdateClient response type.
-
-
-
-
-
-
-
-
-### MsgUpgradeClient
-MsgUpgradeClient defines an sdk.Msg to upgrade an IBC client to a new client
-state
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_id` | [string](#string) | | client unique identifier |
-| `client_state` | [google.protobuf.Any](#google.protobuf.Any) | | upgraded client state |
-| `consensus_state` | [google.protobuf.Any](#google.protobuf.Any) | | upgraded consensus state, only contains enough information to serve as a basis of trust in update logic |
-| `proof_upgrade_client` | [bytes](#bytes) | | proof that old chain committed to new client |
-| `proof_upgrade_consensus_state` | [bytes](#bytes) | | proof that old chain committed to new consensus state |
-| `signer` | [string](#string) | | signer address |
-
-
-
-
-
-
-
-
-### MsgUpgradeClientResponse
-MsgUpgradeClientResponse defines the Msg/UpgradeClient response type.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-### Msg
-Msg defines the ibc/client Msg service.
-
-| Method Name | Request Type | Response Type | Description | HTTP Verb | Endpoint |
-| ----------- | ------------ | ------------- | ------------| ------- | -------- |
-| `CreateClient` | [MsgCreateClient](#ibc.core.client.v1.MsgCreateClient) | [MsgCreateClientResponse](#ibc.core.client.v1.MsgCreateClientResponse) | CreateClient defines a rpc handler method for MsgCreateClient. | |
-| `UpdateClient` | [MsgUpdateClient](#ibc.core.client.v1.MsgUpdateClient) | [MsgUpdateClientResponse](#ibc.core.client.v1.MsgUpdateClientResponse) | UpdateClient defines a rpc handler method for MsgUpdateClient. | |
-| `UpgradeClient` | [MsgUpgradeClient](#ibc.core.client.v1.MsgUpgradeClient) | [MsgUpgradeClientResponse](#ibc.core.client.v1.MsgUpgradeClientResponse) | UpgradeClient defines a rpc handler method for MsgUpgradeClient. | |
-| `SubmitMisbehaviour` | [MsgSubmitMisbehaviour](#ibc.core.client.v1.MsgSubmitMisbehaviour) | [MsgSubmitMisbehaviourResponse](#ibc.core.client.v1.MsgSubmitMisbehaviourResponse) | SubmitMisbehaviour defines a rpc handler method for MsgSubmitMisbehaviour. | |
-
-
-
-
-
-
-Top
-
-## ibc/core/commitment/v1/commitment.proto
-
-
-
-
-
-### MerklePath
-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
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `key_path` | [string](#string) | repeated | |
-
-
-
-
-
-
-
-
-### MerklePrefix
-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...))
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `key_prefix` | [bytes](#bytes) | | |
-
-
-
-
-
-
-
-
-### MerkleProof
-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
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `proofs` | [ics23.CommitmentProof](#ics23.CommitmentProof) | repeated | |
-
-
-
-
-
-
-
-
-### MerkleRoot
-MerkleRoot defines a merkle root hash.
-In the Cosmos SDK, the AppHash of a block header becomes the root.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `hash` | [bytes](#bytes) | | |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## ibc/core/connection/v1/connection.proto
-
-
-
-
-
-### ClientPaths
-ClientPaths define all the connection paths for a client state.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `paths` | [string](#string) | repeated | list of connection paths |
-
-
-
-
-
-
-
-
-### ConnectionEnd
-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.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_id` | [string](#string) | | client associated with this connection. |
-| `versions` | [Version](#ibc.core.connection.v1.Version) | repeated | IBC version which can be utilised to determine encodings or protocols for channels or packets utilising this connection. |
-| `state` | [State](#ibc.core.connection.v1.State) | | current state of the connection end. |
-| `counterparty` | [Counterparty](#ibc.core.connection.v1.Counterparty) | | counterparty chain associated with this connection. |
-| `delay_period` | [uint64](#uint64) | | 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. |
-
-
-
-
-
-
-
-
-### ConnectionPaths
-ConnectionPaths define all the connection paths for a given client state.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_id` | [string](#string) | | client state unique identifier |
-| `paths` | [string](#string) | repeated | list of connection paths |
-
-
-
-
-
-
-
-
-### Counterparty
-Counterparty defines the counterparty chain associated with a connection end.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_id` | [string](#string) | | identifies the client on the counterparty chain associated with a given connection. |
-| `connection_id` | [string](#string) | | identifies the connection end on the counterparty chain associated with a given connection. |
-| `prefix` | [ibc.core.commitment.v1.MerklePrefix](#ibc.core.commitment.v1.MerklePrefix) | | commitment merkle prefix of the counterparty chain. |
-
-
-
-
-
-
-
-
-### IdentifiedConnection
-IdentifiedConnection defines a connection with additional connection
-identifier field.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `id` | [string](#string) | | connection identifier. |
-| `client_id` | [string](#string) | | client associated with this connection. |
-| `versions` | [Version](#ibc.core.connection.v1.Version) | repeated | IBC version which can be utilised to determine encodings or protocols for channels or packets utilising this connection |
-| `state` | [State](#ibc.core.connection.v1.State) | | current state of the connection end. |
-| `counterparty` | [Counterparty](#ibc.core.connection.v1.Counterparty) | | counterparty chain associated with this connection. |
-| `delay_period` | [uint64](#uint64) | | delay period associated with this connection. |
-
-
-
-
-
-
-
-
-### Params
-Params defines the set of Connection parameters.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `max_expected_time_per_block` | [uint64](#uint64) | | 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. |
-
-
-
-
-
-
-
-
-### Version
-Version defines the versioning scheme used to negotiate the IBC verison in
-the connection handshake.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `identifier` | [string](#string) | | unique version identifier |
-| `features` | [string](#string) | repeated | list of features compatible with the specified identifier |
-
-
-
-
-
-
-
-
-
-
-### State
-State defines if a connection is in one of the following states:
-INIT, TRYOPEN, OPEN or UNINITIALIZED.
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| STATE_UNINITIALIZED_UNSPECIFIED | 0 | Default State |
-| STATE_INIT | 1 | A connection end has just started the opening handshake. |
-| STATE_TRYOPEN | 2 | A connection end has acknowledged the handshake step on the counterparty chain. |
-| STATE_OPEN | 3 | A connection end has completed the handshake. |
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## ibc/core/connection/v1/genesis.proto
-
-
-
-
-
-### GenesisState
-GenesisState defines the ibc connection submodule's genesis state.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `connections` | [IdentifiedConnection](#ibc.core.connection.v1.IdentifiedConnection) | repeated | |
-| `client_connection_paths` | [ConnectionPaths](#ibc.core.connection.v1.ConnectionPaths) | repeated | |
-| `next_connection_sequence` | [uint64](#uint64) | | the sequence for the next generated connection identifier |
-| `params` | [Params](#ibc.core.connection.v1.Params) | | |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## ibc/core/connection/v1/query.proto
-
-
-
-
-
-### QueryClientConnectionsRequest
-QueryClientConnectionsRequest is the request type for the
-Query/ClientConnections RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_id` | [string](#string) | | client identifier associated with a connection |
-
-
-
-
-
-
-
-
-### QueryClientConnectionsResponse
-QueryClientConnectionsResponse is the response type for the
-Query/ClientConnections RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `connection_paths` | [string](#string) | repeated | slice of all the connection paths associated with a client. |
-| `proof` | [bytes](#bytes) | | merkle proof of existence |
-| `proof_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | height at which the proof was generated |
-
-
-
-
-
-
-
-
-### QueryConnectionClientStateRequest
-QueryConnectionClientStateRequest is the request type for the
-Query/ConnectionClientState RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `connection_id` | [string](#string) | | connection identifier |
-
-
-
-
-
-
-
-
-### QueryConnectionClientStateResponse
-QueryConnectionClientStateResponse is the response type for the
-Query/ConnectionClientState RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `identified_client_state` | [ibc.core.client.v1.IdentifiedClientState](#ibc.core.client.v1.IdentifiedClientState) | | client state associated with the channel |
-| `proof` | [bytes](#bytes) | | merkle proof of existence |
-| `proof_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | height at which the proof was retrieved |
-
-
-
-
-
-
-
-
-### QueryConnectionConsensusStateRequest
-QueryConnectionConsensusStateRequest is the request type for the
-Query/ConnectionConsensusState RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `connection_id` | [string](#string) | | connection identifier |
-| `revision_number` | [uint64](#uint64) | | |
-| `revision_height` | [uint64](#uint64) | | |
-
-
-
-
-
-
-
-
-### QueryConnectionConsensusStateResponse
-QueryConnectionConsensusStateResponse is the response type for the
-Query/ConnectionConsensusState RPC method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `consensus_state` | [google.protobuf.Any](#google.protobuf.Any) | | consensus state associated with the channel |
-| `client_id` | [string](#string) | | client ID associated with the consensus state |
-| `proof` | [bytes](#bytes) | | merkle proof of existence |
-| `proof_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | height at which the proof was retrieved |
-
-
-
-
-
-
-
-
-### QueryConnectionRequest
-QueryConnectionRequest is the request type for the Query/Connection RPC
-method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `connection_id` | [string](#string) | | connection unique identifier |
-
-
-
-
-
-
-
-
-### QueryConnectionResponse
-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.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `connection` | [ConnectionEnd](#ibc.core.connection.v1.ConnectionEnd) | | connection associated with the request identifier |
-| `proof` | [bytes](#bytes) | | merkle proof of existence |
-| `proof_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | height at which the proof was retrieved |
-
-
-
-
-
-
-
-
-### QueryConnectionsRequest
-QueryConnectionsRequest is the request type for the Query/Connections RPC
-method
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `pagination` | [cosmos.base.query.v1beta1.PageRequest](#cosmos.base.query.v1beta1.PageRequest) | | |
-
-
-
-
-
-
-
-
-### QueryConnectionsResponse
-QueryConnectionsResponse is the response type for the Query/Connections RPC
-method.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `connections` | [IdentifiedConnection](#ibc.core.connection.v1.IdentifiedConnection) | repeated | list of stored connections of the chain. |
-| `pagination` | [cosmos.base.query.v1beta1.PageResponse](#cosmos.base.query.v1beta1.PageResponse) | | pagination response |
-| `height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | query block height |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-### Query
-Query provides defines the gRPC querier service
-
-| Method Name | Request Type | Response Type | Description | HTTP Verb | Endpoint |
-| ----------- | ------------ | ------------- | ------------| ------- | -------- |
-| `Connection` | [QueryConnectionRequest](#ibc.core.connection.v1.QueryConnectionRequest) | [QueryConnectionResponse](#ibc.core.connection.v1.QueryConnectionResponse) | Connection queries an IBC connection end. | GET|/ibc/core/connection/v1/connections/{connection_id}|
-| `Connections` | [QueryConnectionsRequest](#ibc.core.connection.v1.QueryConnectionsRequest) | [QueryConnectionsResponse](#ibc.core.connection.v1.QueryConnectionsResponse) | Connections queries all the IBC connections of a chain. | GET|/ibc/core/connection/v1/connections|
-| `ClientConnections` | [QueryClientConnectionsRequest](#ibc.core.connection.v1.QueryClientConnectionsRequest) | [QueryClientConnectionsResponse](#ibc.core.connection.v1.QueryClientConnectionsResponse) | ClientConnections queries the connection paths associated with a client state. | GET|/ibc/core/connection/v1/client_connections/{client_id}|
-| `ConnectionClientState` | [QueryConnectionClientStateRequest](#ibc.core.connection.v1.QueryConnectionClientStateRequest) | [QueryConnectionClientStateResponse](#ibc.core.connection.v1.QueryConnectionClientStateResponse) | ConnectionClientState queries the client state associated with the connection. | GET|/ibc/core/connection/v1/connections/{connection_id}/client_state|
-| `ConnectionConsensusState` | [QueryConnectionConsensusStateRequest](#ibc.core.connection.v1.QueryConnectionConsensusStateRequest) | [QueryConnectionConsensusStateResponse](#ibc.core.connection.v1.QueryConnectionConsensusStateResponse) | ConnectionConsensusState queries the consensus state associated with the connection. | GET|/ibc/core/connection/v1/connections/{connection_id}/consensus_state/revision/{revision_number}/height/{revision_height}|
-
-
-
-
-
-
-Top
-
-## ibc/core/connection/v1/tx.proto
-
-
-
-
-
-### MsgConnectionOpenAck
-MsgConnectionOpenAck defines a msg sent by a Relayer to Chain A to
-acknowledge the change of connection state to TRYOPEN on Chain B.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `connection_id` | [string](#string) | | |
-| `counterparty_connection_id` | [string](#string) | | |
-| `version` | [Version](#ibc.core.connection.v1.Version) | | |
-| `client_state` | [google.protobuf.Any](#google.protobuf.Any) | | |
-| `proof_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | |
-| `proof_try` | [bytes](#bytes) | | proof of the initialization the connection on Chain B: `UNITIALIZED -> TRYOPEN` |
-| `proof_client` | [bytes](#bytes) | | proof of client state included in message |
-| `proof_consensus` | [bytes](#bytes) | | proof of client consensus state |
-| `consensus_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | |
-| `signer` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### MsgConnectionOpenAckResponse
-MsgConnectionOpenAckResponse defines the Msg/ConnectionOpenAck response type.
-
-
-
-
-
-
-
-
-### MsgConnectionOpenConfirm
-MsgConnectionOpenConfirm defines a msg sent by a Relayer to Chain B to
-acknowledge the change of connection state to OPEN on Chain A.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `connection_id` | [string](#string) | | |
-| `proof_ack` | [bytes](#bytes) | | proof for the change of the connection state on Chain A: `INIT -> OPEN` |
-| `proof_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | |
-| `signer` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### MsgConnectionOpenConfirmResponse
-MsgConnectionOpenConfirmResponse defines the Msg/ConnectionOpenConfirm
-response type.
-
-
-
-
-
-
-
-
-### MsgConnectionOpenInit
-MsgConnectionOpenInit defines the msg sent by an account on Chain A to
-initialize a connection with Chain B.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_id` | [string](#string) | | |
-| `counterparty` | [Counterparty](#ibc.core.connection.v1.Counterparty) | | |
-| `version` | [Version](#ibc.core.connection.v1.Version) | | |
-| `delay_period` | [uint64](#uint64) | | |
-| `signer` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### MsgConnectionOpenInitResponse
-MsgConnectionOpenInitResponse defines the Msg/ConnectionOpenInit response
-type.
-
-
-
-
-
-
-
-
-### MsgConnectionOpenTry
-MsgConnectionOpenTry defines a msg sent by a Relayer to try to open a
-connection on Chain B.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_id` | [string](#string) | | |
-| `previous_connection_id` | [string](#string) | | **Deprecated.** Deprecated: this field is unused. Crossing hellos are no longer supported in core IBC. |
-| `client_state` | [google.protobuf.Any](#google.protobuf.Any) | | |
-| `counterparty` | [Counterparty](#ibc.core.connection.v1.Counterparty) | | |
-| `delay_period` | [uint64](#uint64) | | |
-| `counterparty_versions` | [Version](#ibc.core.connection.v1.Version) | repeated | |
-| `proof_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | |
-| `proof_init` | [bytes](#bytes) | | proof of the initialization the connection on Chain A: `UNITIALIZED -> INIT` |
-| `proof_client` | [bytes](#bytes) | | proof of client state included in message |
-| `proof_consensus` | [bytes](#bytes) | | proof of client consensus state |
-| `consensus_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | |
-| `signer` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### MsgConnectionOpenTryResponse
-MsgConnectionOpenTryResponse defines the Msg/ConnectionOpenTry response type.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-### Msg
-Msg defines the ibc/connection Msg service.
-
-| Method Name | Request Type | Response Type | Description | HTTP Verb | Endpoint |
-| ----------- | ------------ | ------------- | ------------| ------- | -------- |
-| `ConnectionOpenInit` | [MsgConnectionOpenInit](#ibc.core.connection.v1.MsgConnectionOpenInit) | [MsgConnectionOpenInitResponse](#ibc.core.connection.v1.MsgConnectionOpenInitResponse) | ConnectionOpenInit defines a rpc handler method for MsgConnectionOpenInit. | |
-| `ConnectionOpenTry` | [MsgConnectionOpenTry](#ibc.core.connection.v1.MsgConnectionOpenTry) | [MsgConnectionOpenTryResponse](#ibc.core.connection.v1.MsgConnectionOpenTryResponse) | ConnectionOpenTry defines a rpc handler method for MsgConnectionOpenTry. | |
-| `ConnectionOpenAck` | [MsgConnectionOpenAck](#ibc.core.connection.v1.MsgConnectionOpenAck) | [MsgConnectionOpenAckResponse](#ibc.core.connection.v1.MsgConnectionOpenAckResponse) | ConnectionOpenAck defines a rpc handler method for MsgConnectionOpenAck. | |
-| `ConnectionOpenConfirm` | [MsgConnectionOpenConfirm](#ibc.core.connection.v1.MsgConnectionOpenConfirm) | [MsgConnectionOpenConfirmResponse](#ibc.core.connection.v1.MsgConnectionOpenConfirmResponse) | ConnectionOpenConfirm defines a rpc handler method for MsgConnectionOpenConfirm. | |
-
-
-
-
-
-
-Top
-
-## ibc/core/types/v1/genesis.proto
-
-
-
-
-
-### GenesisState
-GenesisState defines the ibc module's genesis state.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_genesis` | [ibc.core.client.v1.GenesisState](#ibc.core.client.v1.GenesisState) | | ICS002 - Clients genesis state |
-| `connection_genesis` | [ibc.core.connection.v1.GenesisState](#ibc.core.connection.v1.GenesisState) | | ICS003 - Connections genesis state |
-| `channel_genesis` | [ibc.core.channel.v1.GenesisState](#ibc.core.channel.v1.GenesisState) | | ICS004 - Channel genesis state |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## ibc/lightclients/solomachine/v1/solomachine.proto
-
-
-
-
-
-### ChannelStateData
-ChannelStateData returns the SignBytes data for channel state
-verification.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `path` | [bytes](#bytes) | | |
-| `channel` | [ibc.core.channel.v1.Channel](#ibc.core.channel.v1.Channel) | | |
-
-
-
-
-
-
-
-
-### ClientState
-ClientState defines a solo machine client that tracks the current consensus
-state and if the client is frozen.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `sequence` | [uint64](#uint64) | | latest sequence of the client state |
-| `frozen_sequence` | [uint64](#uint64) | | frozen sequence of the solo machine |
-| `consensus_state` | [ConsensusState](#ibc.lightclients.solomachine.v1.ConsensusState) | | |
-| `allow_update_after_proposal` | [bool](#bool) | | when set to true, will allow governance to update a solo machine client. The client will be unfrozen if it is frozen. |
-
-
-
-
-
-
-
-
-### ClientStateData
-ClientStateData returns the SignBytes data for client state verification.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `path` | [bytes](#bytes) | | |
-| `client_state` | [google.protobuf.Any](#google.protobuf.Any) | | |
-
-
-
-
-
-
-
-
-### ConnectionStateData
-ConnectionStateData returns the SignBytes data for connection state
-verification.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `path` | [bytes](#bytes) | | |
-| `connection` | [ibc.core.connection.v1.ConnectionEnd](#ibc.core.connection.v1.ConnectionEnd) | | |
-
-
-
-
-
-
-
-
-### ConsensusState
-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.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `public_key` | [google.protobuf.Any](#google.protobuf.Any) | | public key of the solo machine |
-| `diversifier` | [string](#string) | | diversifier allows the same public key to be re-used across different solo machine clients (potentially on different chains) without being considered misbehaviour. |
-| `timestamp` | [uint64](#uint64) | | |
-
-
-
-
-
-
-
-
-### ConsensusStateData
-ConsensusStateData returns the SignBytes data for consensus state
-verification.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `path` | [bytes](#bytes) | | |
-| `consensus_state` | [google.protobuf.Any](#google.protobuf.Any) | | |
-
-
-
-
-
-
-
-
-### Header
-Header defines a solo machine consensus header
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `sequence` | [uint64](#uint64) | | sequence to update solo machine public key at |
-| `timestamp` | [uint64](#uint64) | | |
-| `signature` | [bytes](#bytes) | | |
-| `new_public_key` | [google.protobuf.Any](#google.protobuf.Any) | | |
-| `new_diversifier` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### HeaderData
-HeaderData returns the SignBytes data for update verification.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `new_pub_key` | [google.protobuf.Any](#google.protobuf.Any) | | header public key |
-| `new_diversifier` | [string](#string) | | header diversifier |
-
-
-
-
-
-
-
-
-### Misbehaviour
-Misbehaviour defines misbehaviour for a solo machine which consists
-of a sequence and two signatures over different messages at that sequence.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_id` | [string](#string) | | |
-| `sequence` | [uint64](#uint64) | | |
-| `signature_one` | [SignatureAndData](#ibc.lightclients.solomachine.v1.SignatureAndData) | | |
-| `signature_two` | [SignatureAndData](#ibc.lightclients.solomachine.v1.SignatureAndData) | | |
-
-
-
-
-
-
-
-
-### NextSequenceRecvData
-NextSequenceRecvData returns the SignBytes data for verification of the next
-sequence to be received.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `path` | [bytes](#bytes) | | |
-| `next_seq_recv` | [uint64](#uint64) | | |
-
-
-
-
-
-
-
-
-### PacketAcknowledgementData
-PacketAcknowledgementData returns the SignBytes data for acknowledgement
-verification.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `path` | [bytes](#bytes) | | |
-| `acknowledgement` | [bytes](#bytes) | | |
-
-
-
-
-
-
-
-
-### PacketCommitmentData
-PacketCommitmentData returns the SignBytes data for packet commitment
-verification.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `path` | [bytes](#bytes) | | |
-| `commitment` | [bytes](#bytes) | | |
-
-
-
-
-
-
-
-
-### PacketReceiptAbsenceData
-PacketReceiptAbsenceData returns the SignBytes data for
-packet receipt absence verification.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `path` | [bytes](#bytes) | | |
-
-
-
-
-
-
-
-
-### SignBytes
-SignBytes defines the signed bytes used for signature verification.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `sequence` | [uint64](#uint64) | | |
-| `timestamp` | [uint64](#uint64) | | |
-| `diversifier` | [string](#string) | | |
-| `data_type` | [DataType](#ibc.lightclients.solomachine.v1.DataType) | | type of the data used |
-| `data` | [bytes](#bytes) | | marshaled data |
-
-
-
-
-
-
-
-
-### SignatureAndData
-SignatureAndData contains a signature and the data signed over to create that
-signature.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `signature` | [bytes](#bytes) | | |
-| `data_type` | [DataType](#ibc.lightclients.solomachine.v1.DataType) | | |
-| `data` | [bytes](#bytes) | | |
-| `timestamp` | [uint64](#uint64) | | |
-
-
-
-
-
-
-
-
-### TimestampedSignatureData
-TimestampedSignatureData contains the signature data and the timestamp of the
-signature.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `signature_data` | [bytes](#bytes) | | |
-| `timestamp` | [uint64](#uint64) | | |
-
-
-
-
-
-
-
-
-
-
-### DataType
-DataType defines the type of solo machine proof being created. This is done
-to preserve uniqueness of different data sign byte encodings.
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| DATA_TYPE_UNINITIALIZED_UNSPECIFIED | 0 | Default State |
-| DATA_TYPE_CLIENT_STATE | 1 | Data type for client state verification |
-| DATA_TYPE_CONSENSUS_STATE | 2 | Data type for consensus state verification |
-| DATA_TYPE_CONNECTION_STATE | 3 | Data type for connection state verification |
-| DATA_TYPE_CHANNEL_STATE | 4 | Data type for channel state verification |
-| DATA_TYPE_PACKET_COMMITMENT | 5 | Data type for packet commitment verification |
-| DATA_TYPE_PACKET_ACKNOWLEDGEMENT | 6 | Data type for packet acknowledgement verification |
-| DATA_TYPE_PACKET_RECEIPT_ABSENCE | 7 | Data type for packet receipt absence verification |
-| DATA_TYPE_NEXT_SEQUENCE_RECV | 8 | Data type for next sequence recv verification |
-| DATA_TYPE_HEADER | 9 | Data type for header verification |
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## ibc/lightclients/solomachine/v2/solomachine.proto
-
-
-
-
-
-### ChannelStateData
-ChannelStateData returns the SignBytes data for channel state
-verification.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `path` | [bytes](#bytes) | | |
-| `channel` | [ibc.core.channel.v1.Channel](#ibc.core.channel.v1.Channel) | | |
-
-
-
-
-
-
-
-
-### ClientState
-ClientState defines a solo machine client that tracks the current consensus
-state and if the client is frozen.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `sequence` | [uint64](#uint64) | | latest sequence of the client state |
-| `is_frozen` | [bool](#bool) | | frozen sequence of the solo machine |
-| `consensus_state` | [ConsensusState](#ibc.lightclients.solomachine.v2.ConsensusState) | | |
-| `allow_update_after_proposal` | [bool](#bool) | | when set to true, will allow governance to update a solo machine client. The client will be unfrozen if it is frozen. |
-
-
-
-
-
-
-
-
-### ClientStateData
-ClientStateData returns the SignBytes data for client state verification.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `path` | [bytes](#bytes) | | |
-| `client_state` | [google.protobuf.Any](#google.protobuf.Any) | | |
-
-
-
-
-
-
-
-
-### ConnectionStateData
-ConnectionStateData returns the SignBytes data for connection state
-verification.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `path` | [bytes](#bytes) | | |
-| `connection` | [ibc.core.connection.v1.ConnectionEnd](#ibc.core.connection.v1.ConnectionEnd) | | |
-
-
-
-
-
-
-
-
-### ConsensusState
-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.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `public_key` | [google.protobuf.Any](#google.protobuf.Any) | | public key of the solo machine |
-| `diversifier` | [string](#string) | | diversifier allows the same public key to be re-used across different solo machine clients (potentially on different chains) without being considered misbehaviour. |
-| `timestamp` | [uint64](#uint64) | | |
-
-
-
-
-
-
-
-
-### ConsensusStateData
-ConsensusStateData returns the SignBytes data for consensus state
-verification.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `path` | [bytes](#bytes) | | |
-| `consensus_state` | [google.protobuf.Any](#google.protobuf.Any) | | |
-
-
-
-
-
-
-
-
-### Header
-Header defines a solo machine consensus header
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `sequence` | [uint64](#uint64) | | sequence to update solo machine public key at |
-| `timestamp` | [uint64](#uint64) | | |
-| `signature` | [bytes](#bytes) | | |
-| `new_public_key` | [google.protobuf.Any](#google.protobuf.Any) | | |
-| `new_diversifier` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### HeaderData
-HeaderData returns the SignBytes data for update verification.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `new_pub_key` | [google.protobuf.Any](#google.protobuf.Any) | | header public key |
-| `new_diversifier` | [string](#string) | | header diversifier |
-
-
-
-
-
-
-
-
-### Misbehaviour
-Misbehaviour defines misbehaviour for a solo machine which consists
-of a sequence and two signatures over different messages at that sequence.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_id` | [string](#string) | | |
-| `sequence` | [uint64](#uint64) | | |
-| `signature_one` | [SignatureAndData](#ibc.lightclients.solomachine.v2.SignatureAndData) | | |
-| `signature_two` | [SignatureAndData](#ibc.lightclients.solomachine.v2.SignatureAndData) | | |
-
-
-
-
-
-
-
-
-### NextSequenceRecvData
-NextSequenceRecvData returns the SignBytes data for verification of the next
-sequence to be received.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `path` | [bytes](#bytes) | | |
-| `next_seq_recv` | [uint64](#uint64) | | |
-
-
-
-
-
-
-
-
-### PacketAcknowledgementData
-PacketAcknowledgementData returns the SignBytes data for acknowledgement
-verification.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `path` | [bytes](#bytes) | | |
-| `acknowledgement` | [bytes](#bytes) | | |
-
-
-
-
-
-
-
-
-### PacketCommitmentData
-PacketCommitmentData returns the SignBytes data for packet commitment
-verification.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `path` | [bytes](#bytes) | | |
-| `commitment` | [bytes](#bytes) | | |
-
-
-
-
-
-
-
-
-### PacketReceiptAbsenceData
-PacketReceiptAbsenceData returns the SignBytes data for
-packet receipt absence verification.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `path` | [bytes](#bytes) | | |
-
-
-
-
-
-
-
-
-### SignBytes
-SignBytes defines the signed bytes used for signature verification.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `sequence` | [uint64](#uint64) | | |
-| `timestamp` | [uint64](#uint64) | | |
-| `diversifier` | [string](#string) | | |
-| `data_type` | [DataType](#ibc.lightclients.solomachine.v2.DataType) | | type of the data used |
-| `data` | [bytes](#bytes) | | marshaled data |
-
-
-
-
-
-
-
-
-### SignatureAndData
-SignatureAndData contains a signature and the data signed over to create that
-signature.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `signature` | [bytes](#bytes) | | |
-| `data_type` | [DataType](#ibc.lightclients.solomachine.v2.DataType) | | |
-| `data` | [bytes](#bytes) | | |
-| `timestamp` | [uint64](#uint64) | | |
-
-
-
-
-
-
-
-
-### TimestampedSignatureData
-TimestampedSignatureData contains the signature data and the timestamp of the
-signature.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `signature_data` | [bytes](#bytes) | | |
-| `timestamp` | [uint64](#uint64) | | |
-
-
-
-
-
-
-
-
-
-
-### DataType
-DataType defines the type of solo machine proof being created. This is done
-to preserve uniqueness of different data sign byte encodings.
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| DATA_TYPE_UNINITIALIZED_UNSPECIFIED | 0 | Default State |
-| DATA_TYPE_CLIENT_STATE | 1 | Data type for client state verification |
-| DATA_TYPE_CONSENSUS_STATE | 2 | Data type for consensus state verification |
-| DATA_TYPE_CONNECTION_STATE | 3 | Data type for connection state verification |
-| DATA_TYPE_CHANNEL_STATE | 4 | Data type for channel state verification |
-| DATA_TYPE_PACKET_COMMITMENT | 5 | Data type for packet commitment verification |
-| DATA_TYPE_PACKET_ACKNOWLEDGEMENT | 6 | Data type for packet acknowledgement verification |
-| DATA_TYPE_PACKET_RECEIPT_ABSENCE | 7 | Data type for packet receipt absence verification |
-| DATA_TYPE_NEXT_SEQUENCE_RECV | 8 | Data type for next sequence recv verification |
-| DATA_TYPE_HEADER | 9 | Data type for header verification |
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## ibc/lightclients/solomachine/v3/solomachine.proto
-
-
-
-
-
-### ClientState
-ClientState defines a solo machine client that tracks the current consensus
-state and if the client is frozen.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `sequence` | [uint64](#uint64) | | latest sequence of the client state |
-| `is_frozen` | [bool](#bool) | | frozen sequence of the solo machine |
-| `consensus_state` | [ConsensusState](#ibc.lightclients.solomachine.v3.ConsensusState) | | |
-| `allow_update_after_proposal` | [bool](#bool) | | when set to true, will allow governance to update a solo machine client. The client will be unfrozen if it is frozen. |
-
-
-
-
-
-
-
-
-### ConsensusState
-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.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `public_key` | [google.protobuf.Any](#google.protobuf.Any) | | public key of the solo machine |
-| `diversifier` | [string](#string) | | diversifier allows the same public key to be re-used across different solo machine clients (potentially on different chains) without being considered misbehaviour. |
-| `timestamp` | [uint64](#uint64) | | |
-
-
-
-
-
-
-
-
-### Header
-Header defines a solo machine consensus header
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `sequence` | [uint64](#uint64) | | sequence to update solo machine public key at |
-| `timestamp` | [uint64](#uint64) | | |
-| `signature` | [bytes](#bytes) | | |
-| `new_public_key` | [google.protobuf.Any](#google.protobuf.Any) | | |
-| `new_diversifier` | [string](#string) | | |
-
-
-
-
-
-
-
-
-### HeaderData
-HeaderData returns the SignBytes data for update verification.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `new_pub_key` | [google.protobuf.Any](#google.protobuf.Any) | | header public key |
-| `new_diversifier` | [string](#string) | | header diversifier |
-
-
-
-
-
-
-
-
-### Misbehaviour
-Misbehaviour defines misbehaviour for a solo machine which consists
-of a sequence and two signatures over different messages at that sequence.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_id` | [string](#string) | | **Deprecated.** ClientID is deprecated |
-| `sequence` | [uint64](#uint64) | | |
-| `signature_one` | [SignatureAndData](#ibc.lightclients.solomachine.v3.SignatureAndData) | | |
-| `signature_two` | [SignatureAndData](#ibc.lightclients.solomachine.v3.SignatureAndData) | | |
-
-
-
-
-
-
-
-
-### SignBytes
-SignBytes defines the signed bytes used for signature verification.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `sequence` | [uint64](#uint64) | | the sequence number |
-| `timestamp` | [uint64](#uint64) | | the proof timestamp |
-| `diversifier` | [string](#string) | | the public key diversifier |
-| `path` | [bytes](#bytes) | | the standardised path bytes |
-| `data` | [bytes](#bytes) | | the marshaled data bytes |
-
-
-
-
-
-
-
-
-### SignatureAndData
-SignatureAndData contains a signature and the data signed over to create that
-signature.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `signature` | [bytes](#bytes) | | |
-| `path` | [bytes](#bytes) | | |
-| `data` | [bytes](#bytes) | | |
-| `timestamp` | [uint64](#uint64) | | |
-
-
-
-
-
-
-
-
-### TimestampedSignatureData
-TimestampedSignatureData contains the signature data and the timestamp of the
-signature.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `signature_data` | [bytes](#bytes) | | |
-| `timestamp` | [uint64](#uint64) | | |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## ibc/lightclients/tendermint/v1/tendermint.proto
-
-
-
-
-
-### ClientState
-ClientState from Tendermint tracks the current validator set, latest height,
-and a possible frozen height.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `chain_id` | [string](#string) | | |
-| `trust_level` | [Fraction](#ibc.lightclients.tendermint.v1.Fraction) | | |
-| `trusting_period` | [google.protobuf.Duration](#google.protobuf.Duration) | | duration of the period since the LastestTimestamp during which the submitted headers are valid for upgrade |
-| `unbonding_period` | [google.protobuf.Duration](#google.protobuf.Duration) | | duration of the staking unbonding period |
-| `max_clock_drift` | [google.protobuf.Duration](#google.protobuf.Duration) | | defines how much new (untrusted) header's Time can drift into the future. |
-| `frozen_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | Block height when the client was frozen due to a misbehaviour |
-| `latest_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | Latest height the client was updated to |
-| `proof_specs` | [ics23.ProofSpec](#ics23.ProofSpec) | repeated | Proof specifications used in verifying counterparty state |
-| `upgrade_path` | [string](#string) | repeated | 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"}` |
-| `allow_update_after_expiry` | [bool](#bool) | | **Deprecated.** allow_update_after_expiry is deprecated |
-| `allow_update_after_misbehaviour` | [bool](#bool) | | **Deprecated.** allow_update_after_misbehaviour is deprecated |
-
-
-
-
-
-
-
-
-### ConsensusState
-ConsensusState defines the consensus state from Tendermint.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `timestamp` | [google.protobuf.Timestamp](#google.protobuf.Timestamp) | | timestamp that corresponds to the block height in which the ConsensusState was stored. |
-| `root` | [ibc.core.commitment.v1.MerkleRoot](#ibc.core.commitment.v1.MerkleRoot) | | commitment root (i.e app hash) |
-| `next_validators_hash` | [bytes](#bytes) | | |
-
-
-
-
-
-
-
-
-### Fraction
-Fraction defines the protobuf message type for tmmath.Fraction that only
-supports positive values.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `numerator` | [uint64](#uint64) | | |
-| `denominator` | [uint64](#uint64) | | |
-
-
-
-
-
-
-
-
-### Header
-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.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `signed_header` | [tendermint.types.SignedHeader](#tendermint.types.SignedHeader) | | |
-| `validator_set` | [tendermint.types.ValidatorSet](#tendermint.types.ValidatorSet) | | |
-| `trusted_height` | [ibc.core.client.v1.Height](#ibc.core.client.v1.Height) | | |
-| `trusted_validators` | [tendermint.types.ValidatorSet](#tendermint.types.ValidatorSet) | | |
-
-
-
-
-
-
-
-
-### Misbehaviour
-Misbehaviour is a wrapper over two conflicting Headers
-that implements Misbehaviour interface expected by ICS-02
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| `client_id` | [string](#string) | | **Deprecated.** ClientID is deprecated |
-| `header_1` | [Header](#ibc.lightclients.tendermint.v1.Header) | | |
-| `header_2` | [Header](#ibc.lightclients.tendermint.v1.Header) | | |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-## Scalar Value Types
-
-| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby |
-| ----------- | ----- | --- | ---- | ------ | -- | -- | --- | ---- |
-| double | | double | double | float | float64 | double | float | Float |
-| float | | float | float | float | float32 | float | float | Float |
-| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) |
-| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum |
-| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) |
-| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) |
-| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) |
-| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum |
-| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) |
-| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum |
-| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) |
-| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum |
-| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass |
-| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) |
-| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) |
+# Protobuf documentation
+See [ibc-go Buf Protobuf documentation](https://buf.build/cosmos/ibc/tags/main).
\ No newline at end of file
diff --git a/docs/ibc/troubleshooting.md b/docs/ibc/troubleshooting.md
new file mode 100644
index 00000000000..95576752e73
--- /dev/null
+++ b/docs/ibc/troubleshooting.md
@@ -0,0 +1,8 @@
+# Troubleshooting
+
+### Unauthorized client states
+
+If it is being reported that a client state is unauthorized, this is due to the client type not being present
+in the [`AllowedClients`](https://github.com/cosmos/ibc-go/blob/v6.0.0/modules/core/02-client/types/client.pb.go#L345) array.
+
+Unless the client type is present in this array, all usage of clients of this type will be prevented.
diff --git a/docs/ibc/upgrades/developer-guide.md b/docs/ibc/upgrades/developer-guide.md
index 73a19b93664..671ff4a64d2 100644
--- a/docs/ibc/upgrades/developer-guide.md
+++ b/docs/ibc/upgrades/developer-guide.md
@@ -6,45 +6,4 @@ order: 2
Learn how to implement upgrade functionality for your custom IBC client. {synopsis}
-As mentioned in the [README](./README.md), it is vital that high-value IBC clients can upgrade along with their underlying chains to avoid disruption to the IBC ecosystem. Thus, IBC client developers will want to implement upgrade functionality to enable clients to maintain connections and channels even across chain upgrades.
-
-The IBC protocol allows client implementations to provide a path to upgrading clients given the upgraded client state, upgraded consensus state and proofs for each.
-
-```go
-// Upgrade functions
-// NOTE: proof heights are not included as upgrade to a new revision is expected to pass only on the last
-// height committed by the current revision. Clients are responsible for ensuring that the planned last
-// height of the current revision is somehow encoded in the proof verification process.
-// This is to ensure that no premature upgrades occur, since upgrade plans committed to by the counterparty
-// may be cancelled or modified before the last planned height.
-VerifyUpgradeAndUpdateState(
- ctx sdk.Context,
- cdc codec.BinaryCodec,
- store sdk.KVStore,
- newClient ClientState,
- newConsState ConsensusState,
- proofUpgradeClient,
- proofUpgradeConsState []byte,
-) (upgradedClient ClientState, upgradedConsensus ConsensusState, err error)
-```
-
-Note that the clients should have prior knowledge of the merkle path that the upgraded client and upgraded consensus states will use. The height at which the upgrade has occurred should also be encoded in the proof. The Tendermint client implementation accomplishes this by including an `UpgradePath` in the ClientState itself, which is used along with the upgrade height to construct the merkle path under which the client state and consensus state are committed.
-
-Developers must ensure that the `UpgradeClientMsg` does not pass until the last height of the old chain has been committed, and after the chain upgrades, the `UpgradeClientMsg` should pass once and only once on all counterparty clients.
-
-Developers must ensure that the new client adopts all of the new Client parameters that must be uniform across every valid light client of a chain (chain-chosen parameters), while maintaining the Client parameters that are customizable by each individual client (client-chosen parameters) from the previous version of the client.
-
-Upgrades must adhere to the IBC Security Model. IBC does not rely on the assumption of honest relayers for correctness. Thus users should not have to rely on relayers to maintain client correctness and security (though honest relayers must exist to maintain relayer liveness). While relayers may choose any set of client parameters while creating a new `ClientState`, this still holds under the security model since users can always choose a relayer-created client that suits their security and correctness needs or create a Client with their desired parameters if no such client exists.
-
-However, when upgrading an existing client, one must keep in mind that there are already many users who depend on this client's particular parameters. We cannot give the upgrading relayer free choice over these parameters once they have already been chosen. This would violate the security model since users who rely on the client would have to rely on the upgrading relayer to maintain the same level of security. Thus, developers must make sure that their upgrade mechanism allows clients to upgrade the chain-specified parameters whenever a chain upgrade changes these parameters (examples in the Tendermint client include `UnbondingPeriod`, `TrustingPeriod`, `ChainID`, `UpgradePath`, etc.), while ensuring that the relayer submitting the `UpgradeClientMsg` cannot alter the client-chosen parameters that the users are relying upon (examples in Tendermint client include `TrustLevel`, `MaxClockDrift`, etc).
-
-Developers should maintain the distinction between Client parameters that are uniform across every valid light client of a chain (chain-chosen parameters), and Client parameters that are customizable by each individual client (client-chosen parameters); since this distinction is necessary to implement the `ZeroCustomFields` method in the `ClientState` interface:
-
-```go
-// Utility function that zeroes out any client customizable fields in client state
-// Ledger enforced fields are maintained while all custom fields are zero values
-// Used to verify upgrades
-ZeroCustomFields() ClientState
-```
-
-Counterparty clients can upgrade securely by using all of the chain-chosen parameters from the chain-committed `UpgradedClient` and preserving all of the old client-chosen parameters. This enables chains to securely upgrade without relying on an honest relayer, however it can in some cases lead to an invalid final `ClientState` if the new chain-chosen parameters clash with the old client-chosen parameter. This can happen in the Tendermint client case if the upgrading chain lowers the `UnbondingPeriod` (chain-chosen) to a duration below that of a counterparty client's `TrustingPeriod` (client-chosen). Such cases should be clearly documented by developers, so that chains know which upgrades should be avoided to prevent this problem. The final upgraded client should also be validated in `VerifyUpgradeAndUpdateState` before returning to ensure that the client does not upgrade to an invalid `ClientState`.
+Please see the section [Handling upgrades](../light-clients/upgrades.md) from the light client developer guide for more information.
\ No newline at end of file
diff --git a/docs/migrations/v6-to-v7.md b/docs/migrations/v6-to-v7.md
index 26953fc751d..2778057deb0 100644
--- a/docs/migrations/v6-to-v7.md
+++ b/docs/migrations/v6-to-v7.md
@@ -168,11 +168,11 @@ if err := clientState.VerifyMembership(
The `GetRoot` function has been removed from consensus state interface since it was not used by core IBC.
-### Client Keeper
+### Client keeper
Keeper function `CheckMisbehaviourAndUpdateState` has been removed since function `UpdateClient` can now handle updating `ClientState` on `ClientMessage` type which can be any `Misbehaviour` implementations.
-### SDK Message
+### SDK message
`MsgSubmitMisbehaviour` is deprecated since `MsgUpdateClient` can now submit a `ClientMessage` type which can be any `Misbehaviour` implementations.
@@ -290,4 +290,62 @@ import (
- host.RouterKey
+ ibcexported.RouterKey
-```
\ No newline at end of file
+```
+
+## 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. IBC protobuf definitions are now packaged and published to [buf.build/cosmos/ibc](https://buf.build/cosmos/ibc) 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 ibc-go 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"
+ // ...
+)
+```
diff --git a/docs/migrations/v7-to-v7_1.md b/docs/migrations/v7-to-v7_1.md
new file mode 100644
index 00000000000..e6518861749
--- /dev/null
+++ b/docs/migrations/v7-to-v7_1.md
@@ -0,0 +1,61 @@
+# Migrating from v7 to v7.1
+
+This guide provides instructions for migrating to version `v7.1.0` of ibc-go.
+
+There are four sections based on the four potential user groups of this document:
+
+- [Migrating from v7 to v7.1](#migrating-from-v7-to-v71)
+ - [Chains](#chains)
+ - [IBC Apps](#ibc-apps)
+ - [Relayers](#relayers)
+ - [IBC Light Clients](#ibc-light-clients)
+
+**Note:** ibc-go supports golang semantic versioning and therefore all imports must be updated on major version releases.
+
+## Chains
+
+### 09-localhost migration
+
+In the previous release of ibc-go, the localhost `v1` light client module was deprecated and removed. The ibc-go `v7.1.0` release introduces `v2` of the 09-localhost light client module.
+
+An [automatic migration handler](https://github.com/cosmos/ibc-go/blob/v7.1.0-rc0/modules/core/module.go#L127-L145) is configured in the core IBC module to set the localhost `ClientState` and sentinel `ConnectionEnd` in state.
+
+In order to use the 09-localhost client chains must update the `AllowedClients` parameter in the 02-client submodule of core IBC. This can be configured directly in the application upgrade handler or alternatively updated via the legacy governance parameter change proposal.
+We __strongly__ recommend chains to perform this action so that intra-ledger communication can be carried out using the familiar IBC interfaces.
+
+See the upgrade handler code sample provided below or [follow this link](https://github.com/cosmos/ibc-go/blob/v7.1.0-rc0/testing/simapp/upgrades/upgrades.go#L85) for the upgrade handler used by the ibc-go simapp.
+
+```go
+func CreateV7LocalhostUpgradeHandler(
+ mm *module.Manager,
+ configurator module.Configurator,
+ clientKeeper clientkeeper.Keeper,
+) upgradetypes.UpgradeHandler {
+ return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) {
+ // explicitly update the IBC 02-client params, adding the localhost client type
+ params := clientKeeper.GetParams(ctx)
+ params.AllowedClients = append(params.AllowedClients, exported.Localhost)
+ clientKeeper.SetParams(ctx, params)
+
+ return mm.RunMigrations(ctx, configurator, vm)
+ }
+}
+```
+
+### Transfer migration
+
+An [automatic migration handler](https://github.com/cosmos/ibc-go/blob/v7.1.0-rc0/modules/apps/transfer/module.go#L111-L113) is configured in the transfer module to set the total amount in escrow for all denominations of coins that have been sent out. For each denomination a state entry is added with the total amount of coins in escrow regardless of the channel from which they were transferred.
+
+## IBC Apps
+
+- No relevant changes were made in this release.
+
+## Relayers
+
+The event attribute `packet_connection` (`connectiontypes.AttributeKeyConnection`) has been deprecated.
+Please use the `connection_id` attribute (`connectiontypes.AttributeKeyConnectionID`) which is emitted by all channel events.
+Only send packet, receive packet, write acknowledgement, and acknowledge packet events used `packet_connection` previously.
+
+## IBC Light Clients
+
+- No relevant changes were made in this release.
diff --git a/e2e/Makefile b/e2e/Makefile
deleted file mode 100644
index 0b9802d06e1..00000000000
--- a/e2e/Makefile
+++ /dev/null
@@ -1,16 +0,0 @@
-DOCKER := $(shell which docker)
-TEST_CONTAINERS=$(shell docker ps --filter "label=ibc-test" -a -q)
-
-cleanup-ibc-test-containers:
- for id in $(TEST_CONTAINERS) ; do \
- $(DOCKER) stop $$id ; \
- $(DOCKER) rm $$id ; \
- done
-
-e2e-test: cleanup-ibc-test-containers
- ./scripts/run-e2e.sh $(entrypoint) $(test)
-
-compatibility-tests:
- ./scripts/run-compatibility-tests.sh $(release_branch)
-
-.PHONY: cleanup-ibc-test-containers e2e-test compatibility-tests
diff --git a/e2e/README.md b/e2e/README.md
deleted file mode 100644
index 070b1773252..00000000000
--- a/e2e/README.md
+++ /dev/null
@@ -1,367 +0,0 @@
-
-## Table of Contents
-1. [How to write tests](#how-to-write-tests)
- - a. [Adding a new test](#adding-a-new-test)
- - b. [Running the tests with custom images](#running-tests-with-custom-images)
- - b. [Code samples](#code-samples)
- - [Setup](#setup)
- - [Creating test users](#creating-test-users)
- - [Waiting](#waiting)
- - [Query wallet balances](#query-wallet-balances)
- - [Broadcasting messages](#broadcasting-messages)
- - [Starting the relayer](#starting-the-relayer)
- - [Arbitrary commands](#arbitrary-commands)
- - [IBC transfer](#ibc-transfer)
-2. [Test design](#test-design)
- - a. [ibctest](#ibctest)
- - b. [CI configuration](#ci-configuration)
-3. [Github Workflows](#github-workflows)
-4. [Running Compatibility Tests](#running-compatibility-tests)
-5. [Troubleshooting](#troubleshooting)
-
-
-## How to write tests
-
-### Adding a new test
-
-All tests should go under the [e2e](https://github.com/cosmos/ibc-go/tree/main/e2e) directory. When adding a new test, either add a new test function
-to an existing test suite **_in the same file_**, or create a new test suite in a new file and add test functions there.
-New test files should follow the convention of `module_name_test.go`.
-
-New test suites should be composed of `testsuite.E2ETestSuite`. This type has lots of useful helper functionality that will
-be quite common in most tests.
-
-> Note: see [here](#how-tests-are-run) for details about these requirements.
-
-
-### Running tests with custom images
-
-Tests can be run using a Makefile target under the e2e directory. `e2e/Makefile`
-
-There are several envinronment variables that alter the behaviour of the make target.
-
-| Environment Variable | Description | Default Value |
-|----------------------|------------------------------------------|---------------|
-| CHAIN_IMAGE | The image that will be used for the chain | ibc-go-simd |
-| CHAIN_A_TAG | The tag used for chain B | latest |
-| CHAIN_B_TAG | The tag used for chain A | latest |
-| CHAIN_BINARY | The binary used in the container | simd |
-| RLY_TAG | The tag used for the go relayer | main |
-
-
-> Note: when running tests locally, **no images are pushed** to the `ghcr.io/cosmos/ibc-go-simd` registry.
-The images which are used only exist on your machine.
-
-These environment variables allow us to run tests with arbitrary verions (from branches or released) of simd
-and the go relayer.
-
-Every time changes are pushed to a branch or to `main`, a new `simd` image is built and pushed [here](https://github.com/cosmos/ibc-go/pkgs/container/ibc-go-simd).
-
-
-#### Example Command:
-
-```sh
-export CHAIN_IMAGE="ghcr.io/cosmos/ibc-go-simd"
-export CHAIN_A_TAG="main"
-export CHAIN_BINARY="simd"
-
-# We can also specify different values for the chains if needed.
-# they will default to the same as chain a.
-# export CHAIN_B_TAG="main"
-# export CHAIN_BINARY="icad"
-
-export RLY_TAG="v2.0.0"
-make e2e-test entrypoint=TestInterchainAccountsTestSuite test=TestMsgSubmitTx_SuccessfulTransfer
-```
-
-
-> Note: sometimes it can be useful to make changes to [ibctest](https://github.com/strangelove-ventures/ibctest) when running tests locally. In order to do this, add the following line to
-e2e/go.mod
-
-`replace github.com/strangelove-ventures/ibctest => ../ibctest`
-
-Or point it to any local checkout you have.
-
-#### Running tests in CI
-
-To run tests in CI, you can checkout the ibc-go repo and provide these environment variables
-to the CI task.
-
-[This repo](https://github.com/chatton/ibc-go-e2e-demo) contains an example of how to do this with Github Actions.
-
-### Code samples
-
-#### Setup
-
-Every standard test will start with this. This creates two chains and a relayer,
-initializes relayer accounts on both chains, establishes a connection and a channel
-between the chains.
-
-Both chains have started, but the relayer is not yet started.
-
-The relayer should be started as part of the test if required. See [Starting the Relayer](#starting-the-relayer)
-
-```go
-relayer, channelA := s.SetupChainsRelayerAndChannel(ctx, feeMiddlewareChannelOptions())
-chainA, chainB := s.GetChains()
-```
-
-#### Creating test users
-
-There are helper functions to easily create users on both chains.
-
-```go
-chainAWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
-chainBWallet := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount)
-```
-
-#### Waiting
-
-We can wait for some number of blocks on the specified chains if required.
-
-```go
-chainA, chainB := s.GetChains()
-err := test.WaitForBlocks(ctx, 1, chainA, chainB)
-s.Require().NoError(err)
-```
-
-#### Query wallet balances
-
-We can fetch balances of wallets on specific chains.
-
-```go
-chainABalance, err := s.GetChainANativeBalance(ctx, chainAWallet)
-s.Require().NoError(err)
-```
-
-#### Broadcasting messages
-
-We can broadcast arbitrary messages which are signed on behalf of users created in the test.
-
-This example shows a multi message transaction being broadcast on chainA and signed on behalf of chainAWallet.
-
-```go
-relayer, channelA := s.SetupChainsRelayerAndChannel(ctx, feeMiddlewareChannelOptions())
-chainA, chainB := s.GetChains()
-
-chainAWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
-chainBWallet := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount)
-
-t.Run("broadcast multi message transaction", func(t *testing.T){
- payPacketFeeMsg := feetypes.NewMsgPayPacketFee(testFee, channelA.PortID, channelA.ChannelID, chainAWallet.Bech32Address(chainA.Config().Bech32Prefix), nil)
- transferMsg := transfertypes.NewMsgTransfer(channelA.PortID, channelA.ChannelID, transferAmount, chainAWallet.Bech32Address(chainA.Config().Bech32Prefix), chainBWallet.Bech32Address(chainB.Config().Bech32Prefix), clienttypes.NewHeight(1, 1000), 0)
- resp, err := s.BroadcastMessages(ctx, chainA, chainAWallet, payPacketFeeMsg, transferMsg)
-
- s.AssertValidTxResponse(resp)
- s.Require().NoError(err)
-})
-```
-
-#### Starting the relayer
-
-The relayer can be started with the following.
-
-```go
-t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
-})
-```
-
-#### Arbitrary commands
-
-Arbitrary commands can be executed on a given chain.
-
-> Note: these commands will be fully configured to run on the chain executed on (home directory, ports configured etc.)
-
-However, it is preferable to [broadcast messages](#broadcasting-messages) or use a gRPC query if possible.
-
-```go
-stdout, stderr, err := chainA.Exec(ctx, []string{"tx", "..."}, nil)
-```
-
-#### IBC transfer
-
-It is possible to send an IBC transfer in two ways.
-
-Use the ibctest `Chain` interface (this ultimately does a docker exec)
-
-```go
-t.Run("send IBC transfer", func(t *testing.T) {
- chainATx, err = chainA.SendIBCTransfer(ctx, channelA.ChannelID, chainAWallet.KeyName, walletAmount, nil)
- s.Require().NoError(err)
- s.Require().NoError(chainATx.Validate(), "chain-a ibc transfer tx is invalid")
-})
-```
-
-Broadcast a `MsgTransfer`.
-
-```go
-t.Run("send IBC transfer", func(t *testing.T){
- transferMsg := transfertypes.NewMsgTransfer(channelA.PortID, channelA.ChannelID, transferAmount, chainAWallet.Bech32Address(chainA.Config().Bech32Prefix), chainBWallet.Bech32Address(chainB.Config().Bech32Prefix), clienttypes.NewHeight(1, 1000), 0)
- resp, err := s.BroadcastMessages(ctx, chainA, chainAWallet, transferMsg)
- s.AssertValidTxResponse(resp)
- s.Require().NoError(err)
-})
-```
-
-## Test design
-
-
-#### ibctest
-
-These E2E tests use the [ibctest framework](https://github.com/strangelove-ventures/ibctest). This framework creates chains and relayers in containers and allows for arbitrary commands to be executed in the chain containers,
-as well as allowing us to broadcast arbitrary messages which are signed on behalf of a user created in the test.
-
-
-#### CI configuration
-
-There are two main github actions for e2e tests.
-
-[e2e.yaml](https://github.com/cosmos/ibc-go/blob/main/.github/workflows/e2e.yaml) which runs when collaborators create branches.
-
-[e2e-fork.yaml](https://github.com/cosmos/ibc-go/blob/main/.github/workflows/e2e-fork.yml) which runs when forks are created.
-
-In `e2e.yaml`, the `simd` image is built and pushed to [a registry](https://github.com/cosmos/ibc-go/pkgs/container/ibc-go-simd) and every test
-that is run uses the image that was built.
-
-In `e2e-fork.yaml`, images are not pushed to this registry, but instead remain local to the host runner.
-
-
-### How tests are run
-
-The tests use the `matrix` feature of Github Actions. The matrix is
-dynamically generated using [this command](https://github.com/cosmos/ibc-go/blob/main/cmd/build_test_matrix/main.go).
-
-> Note: there is currently a limitation that all tests belonging to a test suite must be in the same file.
-In order to support test functions spread in different files, we would either need to manually maintain a matrix
-or update the script to account for this. The script assumes there is a single test suite per test file to avoid an overly complex
-generation process.
-
-Which looks under the `e2e` directory, and creates a task for each test suite function.
-
-#### Example
-
-```go
-// e2e/file_one_test.go
-package e2e
-
-func TestFeeMiddlewareTestSuite(t *testing.T) {
- suite.Run(t, new(FeeMiddlewareTestSuite))
-}
-
-type FeeMiddlewareTestSuite struct {
- testsuite.E2ETestSuite
-}
-
-func (s *FeeMiddlewareTestSuite) TestA() {}
-func (s *FeeMiddlewareTestSuite) TestB() {}
-func (s *FeeMiddlewareTestSuite) TestC() {}
-
-```
-
-```go
-// e2e/file_two_test.go
-package e2e
-
-func TestTransferTestSuite(t *testing.T) {
- suite.Run(t, new(TransferTestSuite))
-}
-
-type TransferTestSuite struct {
- testsuite.E2ETestSuite
-}
-
-func (s *TransferTestSuite) TestD() {}
-func (s *TransferTestSuite) TestE() {}
-func (s *TransferTestSuite) TestF() {}
-
-```
-
-In the above example, the following would be generated.
-
-```json
-{
- "include": [
- {
- "entrypoint": "TestFeeMiddlewareTestSuite",
- "test": "TestA"
- },
- {
- "entrypoint": "TestFeeMiddlewareTestSuite",
- "test": "TestB"
- },
- {
- "entrypoint": "TestFeeMiddlewareTestSuite",
- "test": "TestC"
- },
- {
- "entrypoint": "TestTransferTestSuite",
- "test": "TestD"
- },
- {
- "entrypoint": "TestTransferTestSuite",
- "test": "TestE"
- },
- {
- "entrypoint": "TestTransferTestSuite",
- "test": "TestF"
- }
- ]
-}
-```
-
-This string is used to generate a test matrix in the Github Action that runs the E2E tests.
-
-All tests will be run on different hosts.
-
-
-#### Misceleneous:
-
-* Gas fees are set to zero to simply calcuations when asserting account balances.
-* When upgrading from e.g. v4 -> v5, in ibc-go, we cannot upgrade the go.mod under `e2e` since v5 will not yet exist. We need to upgrade it in a follow up PR.
-
-
-### GitHub Workflows
-
-#### Building and pushing a `simd` image.
-
-If we ever need to manually build and push an image, we can do so with the [Build Simd Image](../.github/workflows/build-simd-image-from-tag.yml) GitHub workflow.
-
-This can be triggered manually from the UI by navigating to
-
-`Actions` -> `Build Simd Image` -> `Run Workflow`
-
-And providing the git tag.
-
-Alternatively, the [gh](https://cli.github.com/) CLI tool can be used to trigger this workflow.
-
-```bash
-gh workflow run "Build Simd Image" -f tag=v3.0.0
-```
-
-### Running Compatibility Tests
-
-To trigger the compatibility tests for a release branch, you can use the following command.
-
-```bash
-make compatibility-tests release_branch=release/v5.0.x
-```
-
-This will build an image from the tip of the release branch and run all tests specified in the corresponding
-json matrix files under .github/compatibility-test-matrices and is equivalent to going to the Github UI and navigating to
-
-`Actions` -> `Compatibility E2E` -> `Run Workflow` -> `release/v5.0.x`
-
-
-### Troubleshooting
-
-* On Mac, after running a lot of tests, it can happen that containers start failing. To fix this, you can try clearing existing containers and restarting the docker daemon.
-
- This generally manifests itself as relayer or simd containers timing out during setup stages of the test. This doesn't happen in CI.
- ```bash
- # delete all images
- docker system prune -af
- ```
- This issue doesn't seem to occur on other operating systems.
-
-
diff --git a/e2e/go.mod b/e2e/go.mod
deleted file mode 100644
index 83ee43b00c1..00000000000
--- a/e2e/go.mod
+++ /dev/null
@@ -1,238 +0,0 @@
-module github.com/cosmos/ibc-go/e2e
-
-go 1.19
-
-require (
- github.com/cosmos/cosmos-sdk v0.47.0-rc1
- github.com/cosmos/gogoproto v1.4.3
- github.com/cosmos/ibc-go/v7 v7.0.0-20230120105519-ae96bf3d5ee9
- github.com/cosmos/interchain-accounts v0.4.1-0.20230116203650-08d2a4529a5d
- github.com/docker/docker v20.10.19+incompatible
- github.com/strangelove-ventures/ibctest/v7 v7.0.0-20230124162348-0fcd87d2151a
- github.com/stretchr/testify v1.8.1
- go.uber.org/zap v1.23.0
- golang.org/x/mod v0.6.0
- google.golang.org/grpc v1.52.1
-)
-
-require (
- cloud.google.com/go v0.105.0 // indirect
- cloud.google.com/go/compute v1.14.0 // indirect
- cloud.google.com/go/compute/metadata v0.2.3 // indirect
- cloud.google.com/go/iam v0.8.0 // indirect
- cloud.google.com/go/storage v1.27.0 // indirect
- cosmossdk.io/api v0.2.6 // indirect
- cosmossdk.io/core v0.3.2 // indirect
- cosmossdk.io/depinject v1.0.0-alpha.3 // indirect
- cosmossdk.io/errors v1.0.0-beta.7 // indirect
- cosmossdk.io/math v1.0.0-beta.4 // indirect
- cosmossdk.io/tools/rosetta v0.2.0 // indirect
- 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/BurntSushi/toml v1.2.1 // indirect
- github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect
- github.com/ChainSafe/go-schnorrkel/1 v0.0.0-00010101000000-000000000000 // indirect
- github.com/Microsoft/go-winio v0.6.0 // indirect
- github.com/StirlingMarketingGroup/go-namecase v1.0.0 // indirect
- github.com/armon/go-metrics v0.4.1 // indirect
- github.com/avast/retry-go/v4 v4.0.4 // indirect
- github.com/aws/aws-sdk-go v1.40.45 // indirect
- github.com/benbjohnson/clock v1.3.0 // 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.0 // indirect
- github.com/btcsuite/btcd v0.22.3 // indirect
- github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect
- github.com/cenkalti/backoff/v4 v4.1.3 // indirect
- github.com/centrifuge/go-substrate-rpc-client/v4 v4.0.10 // indirect
- github.com/cespare/xxhash v1.1.0 // indirect
- github.com/cespare/xxhash/v2 v2.1.2 // indirect
- github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirect
- github.com/cockroachdb/apd/v2 v2.0.2 // 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.1 // indirect
- github.com/cosmos/go-bip39 v1.0.0 // indirect
- github.com/cosmos/gogogateway v1.2.0 // indirect
- github.com/cosmos/gorocksdb v1.2.0 // indirect
- github.com/cosmos/iavl v0.19.4 // indirect
- github.com/cosmos/ics23/go v0.9.1-0.20221207100636-b1abd8678aab // indirect
- github.com/cosmos/ledger-cosmos-go v0.12.1 // indirect
- github.com/cosmos/rosetta-sdk-go v0.9.0 // indirect
- github.com/creachadair/taskgroup v0.3.2 // indirect
- github.com/danieljoos/wincred v1.1.2 // indirect
- github.com/davecgh/go-spew v1.1.1 // indirect
- github.com/deckarep/golang-set v1.8.0 // indirect
- github.com/decred/base58 v1.0.4 // indirect
- github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect
- github.com/decred/dcrd/dcrec/secp256k1/v2 v2.0.0 // 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.1 // indirect
- github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect
- github.com/docker/distribution v2.8.1+incompatible // indirect
- github.com/docker/go-connections v0.4.0 // indirect
- github.com/docker/go-units v0.5.0 // indirect
- github.com/dustin/go-humanize v1.0.0 // indirect
- github.com/dvsekhvalnov/jose2go v1.5.0 // indirect
- github.com/ethereum/go-ethereum v1.10.21 // indirect
- github.com/felixge/httpsnoop v1.0.2 // indirect
- github.com/fsnotify/fsnotify v1.6.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-stack/stack v1.8.1 // indirect
- github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect
- github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869 // indirect
- github.com/gogo/protobuf v1.3.3 // indirect
- github.com/golang/glog v1.0.0 // indirect
- github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
- github.com/golang/mock v1.6.0 // indirect
- github.com/golang/protobuf v1.5.2 // indirect
- github.com/golang/snappy v0.0.4 // indirect
- github.com/google/btree v1.1.2 // 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.1 // indirect
- github.com/googleapis/gax-go/v2 v2.7.0 // indirect
- github.com/gorilla/handlers v1.5.1 // indirect
- github.com/gorilla/mux v1.8.0 // indirect
- github.com/gorilla/websocket v1.5.0 // indirect
- github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect
- github.com/grpc-ecosystem/grpc-gateway v1.16.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.6.2 // indirect
- github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
- github.com/hashicorp/go-safetemp v1.0.0 // 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/huandu/skiplist v1.2.0 // indirect
- github.com/icza/dyno v0.0.0-20220812133438-f0b6f8a18845 // indirect
- github.com/improbable-eng/grpc-web v0.15.0 // indirect
- github.com/inconshreveable/mousetrap v1.0.1 // indirect
- github.com/ipfs/go-cid v0.0.7 // indirect
- github.com/jmespath/go-jmespath v0.4.0 // indirect
- github.com/jmhodges/levigo v1.0.0 // indirect
- github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
- github.com/klauspost/compress v1.15.12 // indirect
- github.com/klauspost/cpuid/v2 v2.0.9 // indirect
- github.com/lib/pq v1.10.7 // indirect
- github.com/libp2p/go-buffer-pool v0.1.0 // indirect
- github.com/libp2p/go-libp2p-core v0.15.1 // indirect
- github.com/libp2p/go-openssl v0.0.7 // indirect
- github.com/magiconair/properties v1.8.7 // indirect
- github.com/manifoldco/promptui v0.9.0 // 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/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b // indirect
- github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // indirect
- github.com/minio/highwayhash v1.0.2 // indirect
- github.com/minio/sha256-simd v1.0.0 // indirect
- github.com/mitchellh/go-homedir v1.1.0 // indirect
- github.com/mitchellh/go-testing-interface v1.0.0 // indirect
- github.com/mitchellh/mapstructure v1.5.0 // indirect
- github.com/mr-tron/base58 v1.2.0 // indirect
- github.com/mtibben/percent v0.2.1 // indirect
- github.com/multiformats/go-base32 v0.0.3 // indirect
- github.com/multiformats/go-base36 v0.1.0 // indirect
- github.com/multiformats/go-multiaddr v0.4.1 // indirect
- github.com/multiformats/go-multibase v0.0.3 // indirect
- github.com/multiformats/go-multicodec v0.4.1 // indirect
- github.com/multiformats/go-multihash v0.1.0 // indirect
- github.com/multiformats/go-varint v0.0.6 // indirect
- github.com/opencontainers/go-digest v1.0.0 // indirect
- github.com/opencontainers/image-spec v1.1.0-rc2 // indirect
- github.com/pelletier/go-toml/v2 v2.0.6 // indirect
- github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect
- github.com/pierrec/xxHash v0.1.5 // 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/rakyll/statik v0.1.7 // indirect
- github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
- github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect
- github.com/rs/cors v1.8.2 // indirect
- github.com/rs/zerolog v1.28.0 // indirect
- github.com/sasha-s/go-deadlock v0.3.1 // indirect
- github.com/sirupsen/logrus v1.9.0 // indirect
- github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 // indirect
- github.com/spaolacci/murmur3 v1.1.0 // indirect
- github.com/spf13/afero v1.9.3 // indirect
- github.com/spf13/cast v1.5.0 // indirect
- github.com/spf13/cobra v1.6.1 // indirect
- github.com/spf13/jwalterweatherman v1.1.0 // indirect
- github.com/spf13/pflag v1.0.5 // indirect
- github.com/spf13/viper v1.15.0 // indirect
- github.com/subosito/gotenv v1.4.2 // indirect
- github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect
- github.com/tendermint/btcd v0.1.1 // indirect
- github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 // indirect
- github.com/tendermint/go-amino v0.16.0 // indirect
- github.com/tendermint/tendermint v0.37.0-rc2 // indirect
- github.com/tendermint/tm-db v0.6.7 // indirect
- github.com/tidwall/btree v1.5.2 // indirect
- github.com/ulikunitz/xz v0.5.8 // indirect
- github.com/vedhavyas/go-subkey v1.0.3 // indirect
- github.com/zondax/hid v0.9.1 // indirect
- github.com/zondax/ledger-go v0.14.0 // indirect
- go.etcd.io/bbolt v1.3.6 // indirect
- go.opencensus.io v0.24.0 // indirect
- go.uber.org/atomic v1.10.0 // indirect
- go.uber.org/multierr v1.8.0 // indirect
- golang.org/x/crypto v0.4.0 // indirect
- golang.org/x/exp v0.0.0-20221019170559-20944726eadf // indirect
- golang.org/x/net v0.4.0 // indirect
- golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 // indirect
- golang.org/x/sync v0.1.0 // indirect
- golang.org/x/sys v0.3.0 // indirect
- golang.org/x/term v0.3.0 // indirect
- golang.org/x/text v0.5.0 // indirect
- golang.org/x/tools v0.2.0 // indirect
- golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
- google.golang.org/api v0.107.0 // indirect
- google.golang.org/appengine v1.6.7 // indirect
- google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef // indirect
- google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8 // indirect
- gopkg.in/ini.v1 v1.67.0 // indirect
- gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect
- gopkg.in/yaml.v2 v2.4.0 // indirect
- gopkg.in/yaml.v3 v3.0.1 // indirect
- lukechampine.com/blake3 v1.1.6 // indirect
- lukechampine.com/uint128 v1.1.1 // indirect
- modernc.org/cc/v3 v3.36.0 // indirect
- modernc.org/ccgo/v3 v3.16.6 // indirect
- modernc.org/libc v1.16.7 // indirect
- modernc.org/mathutil v1.4.1 // indirect
- modernc.org/memory v1.1.1 // indirect
- modernc.org/opt v0.1.1 // indirect
- modernc.org/sqlite v1.17.3 // indirect
- modernc.org/strutil v1.1.1 // indirect
- modernc.org/token v1.0.0 // indirect
- nhooyr.io/websocket v1.8.6 // indirect
- pgregory.net/rapid v0.5.3 // indirect
- sigs.k8s.io/yaml v1.3.0 // indirect
-)
-
-// TODO: using version v1.0.0 causes a build failure. This is the previous version which compiles successfully.
-replace (
- github.com/ChainSafe/go-schnorrkel => github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d
- github.com/ChainSafe/go-schnorrkel/1 => github.com/ChainSafe/go-schnorrkel v1.0.0
- github.com/vedhavyas/go-subkey => github.com/strangelove-ventures/go-subkey v1.0.7
-)
-
-// uncomment to use the local version of ibc-go, you will need to run `go mod tidy` in e2e directory.
-replace github.com/cosmos/ibc-go/v7 => ../
-
-replace github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1
diff --git a/e2e/go.sum b/e2e/go.sum
deleted file mode 100644
index d097554207e..00000000000
--- a/e2e/go.sum
+++ /dev/null
@@ -1,1430 +0,0 @@
-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.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
-cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
-cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
-cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
-cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
-cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
-cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
-cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
-cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
-cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
-cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
-cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
-cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
-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.105.0 h1:DNtEKRBAAzeS4KyIory52wWHuClNaXJ5x1F7xa4q+5Y=
-cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM=
-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/compute v1.14.0 h1:hfm2+FfxVmnRlh6LpB7cg1ZNU+5edAHmW679JePztk0=
-cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo=
-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/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/iam v0.8.0 h1:E2osAkZzxI/+8pZcxVLcDtAQx/u+hZXVryUaYQ5O0Kk=
-cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE=
-cloud.google.com/go/longrunning v0.3.0 h1:NjljC+FYPV3uh5/OwWT6pVU+doBqMg2x/rZlE+CamDs=
-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/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.27.0 h1:YOO045NZI9RKfCj1c5A/ZtuuENUc8OAW+gHdGnDgyMQ=
-cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s=
-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/core v0.3.2 h1:KlQIufpJHJvOs7YLGTZsZcCo1WlkencDXepsr8STKZQ=
-cosmossdk.io/core v0.3.2/go.mod h1:CO7vbe+evrBvHc0setFHL/u7nlY7HJGzdRSBkT/sirc=
-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/math v1.0.0-beta.4 h1:JtKedVLGzA0vv84xjYmZ75RKG35Kf2WwcFu8IjRkIIw=
-cosmossdk.io/math v1.0.0-beta.4/go.mod h1:An0MllWJY6PxibUpnwGk8jOm+a/qIxlKmL5Zyp9NnaM=
-cosmossdk.io/tools/rosetta v0.2.0 h1:Ae499UiZ9yPNCXvjOBO/R9I1pksCJfxoqWauEZgA/gs=
-cosmossdk.io/tools/rosetta v0.2.0/go.mod h1:3mn8QuE2wLUdTi77/gbDXdFqXZdBdiBJhgAWUTSXPv8=
-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=
-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/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/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=
-github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
-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/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
-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/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE=
-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/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 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8=
-github.com/StirlingMarketingGroup/go-namecase v1.0.0 h1:2CzaNtCzc4iNHirR+5ru9OzGg8rQp860gqLBFqRI02Y=
-github.com/StirlingMarketingGroup/go-namecase v1.0.0/go.mod h1:ZsoSKcafcAzuBx+sndbxHu/RjDcDTrEdT4UvhniHfio=
-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/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I=
-github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
-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=
-github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
-github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
-github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
-github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
-github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
-github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
-github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
-github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
-github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=
-github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=
-github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
-github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A=
-github.com/avast/retry-go/v4 v4.0.4 h1:38hLf0DsRXh+hOF6HbTni0+5QGTNdw9zbaMD7KAO830=
-github.com/avast/retry-go/v4 v4.0.4/go.mod h1:HqmLvS2VLdStPCGDFjSuZ9pzlTqVRldCI4w2dO4m1Ms=
-github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
-github.com/aws/aws-sdk-go v1.15.78/go.mod h1:E3/ieXAlvM0XWO57iftYVDLLvQ824smPP3ATZkfNZeM=
-github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
-github.com/aws/aws-sdk-go v1.40.45 h1:QN1nsY27ssD/JmW4s83qmSb+uL6DG4GmCDzjmJB4xUI=
-github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q=
-github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
-github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A=
-github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
-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 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY=
-github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
-github.com/btcsuite/btcd v0.22.3 h1:kYNaWFvOw6xvqP0vR20RP1Zq1DVMBxEO8QN5d1/EfNg=
-github.com/btcsuite/btcd v0.22.3/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y=
-github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U=
-github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04=
-github.com/btcsuite/btcd/btcutil v1.1.2 h1:XLMbX8JQEiwMcYft2EGi8zPUkoa0abKIU6/BJSRsjzQ=
-github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U=
-github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce h1:YtWJF7RHm2pYCvA5t0RPmAaLUhREsKuKd+SLhxFbFeQ=
-github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
-github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=
-github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
-github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
-github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4=
-github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
-github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/centrifuge/go-substrate-rpc-client/v4 v4.0.10 h1:HW3XP9G3mXr0gYPfxCAQLD29u+Ys0uIeotv9RWfnhrM=
-github.com/centrifuge/go-substrate-rpc-client/v4 v4.0.10/go.mod h1:5g1oM4Zu3BOaLpsKQ+O8PAv2kNuq+kPcA1VzFbsSqxE=
-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/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s=
-github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE=
-github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
-github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8=
-github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
-github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8=
-github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
-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/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-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/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
-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/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg=
-github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
-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/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
-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.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.47.0-rc1 h1:ptoLIOAqFGoqnZeqgec9KvC2JIZ6CVIyMHHjti9p6dQ=
-github.com/cosmos/cosmos-sdk v0.47.0-rc1/go.mod h1:yWd503ULBJ71Zuv7GD0/dYJuyeg4LGWAvjeI4wK/dfY=
-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/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.3 h1:RP3yyVREh9snv/lsOvmsAPQt8f44LgL281X0IOIhhcI=
-github.com/cosmos/gogoproto v1.4.3/go.mod h1:0hLIG5TR7IvV1fme1HCFKjfzW9X2x0Mo+RooWXCnOWU=
-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.4 h1:t82sN+Y0WeqxDLJRSpNd8YFX5URIrT+p8n6oJbJ2Dok=
-github.com/cosmos/iavl v0.19.4/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw=
-github.com/cosmos/ics23/go v0.9.1-0.20221207100636-b1abd8678aab h1:I9ialKTQo7248V827Bba4OuKPmk+FPzmTVHsLXaIJWw=
-github.com/cosmos/ics23/go v0.9.1-0.20221207100636-b1abd8678aab/go.mod h1:2CwqasX5dSD7Hbp/9b6lhK6BwoBDCBldx7gPKRukR60=
-github.com/cosmos/interchain-accounts v0.4.1-0.20230116203650-08d2a4529a5d h1:YR8OGEZKf0xveWZ2B/3+r9Q0dbtypXmwwAcolFNY8Fw=
-github.com/cosmos/interchain-accounts v0.4.1-0.20230116203650-08d2a4529a5d/go.mod h1:O4DXede5LGQ7ycy4JLjAksuiku6PsFbP2K/x0KgAcuk=
-github.com/cosmos/ledger-cosmos-go v0.12.1 h1:sMBxza5p/rNK/06nBSNmsI/WDqI0pVJFVNihy1Y984w=
-github.com/cosmos/ledger-cosmos-go v0.12.1/go.mod h1:dhO6kj+Y+AHIOgAe4L9HL/6NDdyyth4q238I9yFpD2g=
-github.com/cosmos/rosetta-sdk-go v0.9.0 h1:3mj2naR+GUhUXabtb96WWSsPFZDCYkdtp6r0jffgugg=
-github.com/cosmos/rosetta-sdk-go v0.9.0/go.mod h1:2v41yXL25xxAXrczVSnbDHcQH9CgildruDlGQGKW/JU=
-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/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
-github.com/cucumber/common/gherkin/go/v22 v22.0.0 h1:4K8NqptbvdOrjL9DEea6HFjSpbdT9+Q5kgLpmmsHYl0=
-github.com/cucumber/common/messages/go/v17 v17.1.1 h1:RNqopvIFyLWnKv0LfATh34SWBhXeoFTJnSrgm9cT/Ts=
-github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0=
-github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0=
-github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
-github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4=
-github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo=
-github.com/decred/base58 v1.0.4 h1:QJC6B0E0rXOPA8U/kw2rP+qiRJsUaE2Er+pYb3siUeA=
-github.com/decred/base58 v1.0.4/go.mod h1:jJswKPEdvpFpvf7dsDvFZyLT22xZ9lWqEByX38oGd9E=
-github.com/decred/dcrd/chaincfg/chainhash v1.0.2 h1:rt5Vlq/jM3ZawwiacWjPa+smINyLRN07EO0cNBV6DGU=
-github.com/decred/dcrd/chaincfg/chainhash v1.0.2/go.mod h1:BpbrGgrPTr3YJYRN3Bm+D9NuaFd+zGyNeIKgrhCXK60=
-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/v2 v2.0.0 h1:3GIJYXQDAKpLEFriGFN8SbSffak10UXHGdIcFaMPykY=
-github.com/decred/dcrd/dcrec/secp256k1/v2 v2.0.0/go.mod h1:3s92l0paYkZoIHuj4X93Teg/HB7eGM9x/zokGw+u4mY=
-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/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/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.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-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
-github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y=
-github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
-github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68=
-github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
-github.com/docker/docker v20.10.19+incompatible h1:lzEmjivyNHFHMNAFLXORMBXyGIhw/UP4DvJwvyKYq64=
-github.com/docker/docker v20.10.19+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
-github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
-github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
-github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
-github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
-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/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=
-github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
-github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
-github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
-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.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/ethereum/go-ethereum v1.10.21 h1:5lqsEx92ZaZzRyOqBEXux4/UR06m296RGzN3ol3teJY=
-github.com/ethereum/go-ethereum v1.10.21/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg=
-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/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
-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/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/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.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
-github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
-github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
-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/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
-github.com/gin-gonic/gin v1.7.0 h1:jGB9xAJQ12AIGNB4HguylppmDK1Am9ppF7XnGXXJuoU=
-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=
-github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-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-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E=
-github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
-github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
-github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
-github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
-github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
-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-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
-github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
-github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw=
-github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4=
-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=
-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/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=
-github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0=
-github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
-github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869 h1:kRpU4zq+Pzh4feET49aEWPOzwQy3U2SsbZEQ7QEcif0=
-github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c=
-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/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.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=
-github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0=
-github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
-github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
-github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
-github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
-github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
-github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
-github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
-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.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
-github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
-github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
-github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-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=
-github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
-github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-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.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
-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.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
-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 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ=
-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=
-github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-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-20210407192527-94a9f03dee38/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.2/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.2.1 h1:RY7tHKZcRlk788d5WSo/e83gOyyy742E8GSs771ySpg=
-github.com/googleapis/enterprise-certificate-proxy v0.2.1/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.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ=
-github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8=
-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=
-github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=
-github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=
-github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
-github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
-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.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
-github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
-github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI=
-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.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=
-github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU=
-github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0=
-github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s=
-github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is=
-github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s=
-github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc=
-github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o=
-github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
-github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
-github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
-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.6.2 h1:7jX7xcB+uVCliddZgeKyNxv0xoT7qL5KDtH7rU4IqIk=
-github.com/hashicorp/go-getter v1.6.2/go.mod h1:IZCrswsZPeWv9IkVnLElzRU/gz/QPi6pZHn4tv6vbwA=
-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=
-github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
-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=
-github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE=
-github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
-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=
-github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs=
-github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
-github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
-github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
-github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
-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/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/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/icza/dyno v0.0.0-20220812133438-f0b6f8a18845 h1:H+uM0Bv88eur3ZSsd2NGKg3YIiuXxwxtlN7HjE66UTU=
-github.com/icza/dyno v0.0.0-20220812133438-f0b6f8a18845/go.mod h1:c1tRKs5Tx7E2+uHGSyyncziFjvGpgv4H2HrqXeUQ/Uk=
-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 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc=
-github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
-github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
-github.com/ipfs/go-cid v0.0.7 h1:ysQJVJA3fNDF1qigJbsSQOdjhVLsOEoPdh0+R97k3jY=
-github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I=
-github.com/jhump/protoreflect v1.12.1-0.20220721211354-060cc04fc18b h1:izTof8BKh/nE1wrKOrloNA5q4odOarjf+Xpe+4qow98=
-github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
-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=
-github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
-github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
-github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
-github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-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/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
-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/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
-github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
-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/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
-github.com/klauspost/compress v1.11.2/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.12 h1:YClS/PImqYbn+UILDnqxQCZ3RehC9N318SU3kElDUEM=
-github.com/klauspost/compress v1.15.12/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
-github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4=
-github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-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.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
-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/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
-github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
-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/libp2p/go-libp2p-core v0.15.1 h1:0RY+Mi/ARK9DgG1g9xVQLb8dDaaU8tCePMtGALEfBnM=
-github.com/libp2p/go-libp2p-core v0.15.1/go.mod h1:agSaboYM4hzB1cWekgVReqV5M4g5M+2eNNejV+1EEhs=
-github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw=
-github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
-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/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.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
-github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
-github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA=
-github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg=
-github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
-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.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-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
-github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
-github.com/mattn/go-sqlite3 v1.14.12 h1:TJ1bhYJPV44phC+IMu1u2K/i5RriLTPe+yc68XDJ1Z0=
-github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
-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/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-20220103164710-9a04d6ca976b h1:QrHweqAtyJ9EwCaGHBu1fghwxIPiopAHV06JlXrMHjk=
-github.com/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b/go.mod h1:xxLb2ip6sSUts3g1irPVHyk/DGslwQsNOo9I7smJfNU=
-github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g=
-github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ=
-github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g=
-github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY=
-github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
-github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g=
-github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM=
-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 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0=
-github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
-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=
-github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
-github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
-github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc=
-github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
-github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
-github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
-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/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
-github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8=
-github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
-github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
-github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
-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=
-github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI=
-github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA=
-github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4=
-github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM=
-github.com/multiformats/go-multiaddr v0.4.1 h1:Pq37uLx3hsyNlTDir7FZyU8+cFCTqd5y1KiM2IzOutI=
-github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM=
-github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk=
-github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc=
-github.com/multiformats/go-multicodec v0.4.1 h1:BSJbf+zpghcZMZrwTYBGwy0CPcVZGWiC72Cp8bBd4R4=
-github.com/multiformats/go-multicodec v0.4.1/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ=
-github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc=
-github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc=
-github.com/multiformats/go-multihash v0.1.0 h1:CgAgwqk3//SVEw3T+6DqI4mWMyRuDwZtOWcJT0q9+EA=
-github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84=
-github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
-github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY=
-github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
-github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
-github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo=
-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.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w=
-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=
-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/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
-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.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
-github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
-github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
-github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
-github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
-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.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
-github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
-github.com/onsi/gomega v1.20.0 h1:8W0cWlwFkflGPLltQvLRB7ZVD5HuP6ng320w2IS245Q=
-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/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
-github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034=
-github.com/opencontainers/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ=
-github.com/opencontainers/runc v1.1.3 h1:vIXrkId+0/J2Ymu2m7VjGvbSlAId9XNRPhn2p4b+d8w=
-github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
-github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
-github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
-github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
-github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA=
-github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
-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/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
-github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
-github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=
-github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
-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.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU=
-github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek=
-github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
-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/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/pierrec/xxHash v0.1.5 h1:n/jBpwTHiER4xYvK3/CdPVnLDPchj8eTJFFLUb4QHBo=
-github.com/pierrec/xxHash v0.1.5/go.mod h1:w2waW5Zoa/Wc4Yqe0wgrIYAGKqRMf7czn2HNKXmuL+I=
-github.com/pierrre/gotestcover v0.0.0-20160517101806-924dca7d15f0/go.mod h1:4xpMLz7RBWyB+ElzHu8Llua96TRCB3YwX+l5EP1wmHk=
-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=
-github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
-github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
-github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
-github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
-github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
-github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
-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=
-github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
-github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
-github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
-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/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/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/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/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk=
-github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
-github.com/robertkrimen/godocdown v0.0.0-20130622164427-0bfa04905481/go.mod h1:C9WhFzY47SzYBIvzFqSvHIR6ROgDo4TtdTuRaOMjF/s=
-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.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg=
-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.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
-github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY=
-github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0=
-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/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/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
-github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU=
-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=
-github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
-github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
-github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
-github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
-github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
-github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
-github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
-github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
-github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
-github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU=
-github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc=
-github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
-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/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/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/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=
-github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
-github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
-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/strangelove-ventures/go-subkey v1.0.7 h1:cOP/Lajg3uxV/tvspu0m6+0Cu+DJgygkEAbx/s+f35I=
-github.com/strangelove-ventures/go-subkey v1.0.7/go.mod h1:E34izOIEm+sZ1YmYawYRquqBQWeZBjVB4pF7bMuhc1c=
-github.com/strangelove-ventures/ibctest/v7 v7.0.0-20230124162348-0fcd87d2151a h1:I68lhxUi40elS4/4OAA9r71yQM4UpkRNFlfCxD43rUQ=
-github.com/strangelove-ventures/ibctest/v7 v7.0.0-20230124162348-0fcd87d2151a/go.mod h1:hU36IqtAQslhbGcRqQCfZk52xkWwNAMujFxypvzS2Gg=
-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=
-github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
-github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-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.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
-github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
-github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
-github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-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.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
-github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
-github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
-github.com/stretchr/testify v1.8.1/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.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI=
-github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48=
-github.com/tendermint/btcd v0.1.1 h1:0VcxPfflS2zZ3RiOAHkBiFUcPvbtRj5O7zHmcJWHV7s=
-github.com/tendermint/btcd v0.1.1/go.mod h1:DC6/m53jtQzr/NFmMNEu0rxf18/ktVoVtMrnDD5pN+U=
-github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 h1:hqAk8riJvK4RMWx1aInLzndwxKalgi5rTqgfXxOxbEI=
-github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15/go.mod h1:z4YtwM70uOnk8h0pjJYlj3zdYwi9l03By6iAIF5j/Pk=
-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/tendermint v0.37.0-rc2 h1:2n1em+jfbhSv6QnBj8F6KHCpbIzZCB8KgcjidJUQNlY=
-github.com/tendermint/tendermint v0.37.0-rc2/go.mod h1:uYQO9DRNPeZROa9X3hJOZpYcVREDC2/HST+EiU5g2+A=
-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.2 h1:5eA83Gfki799V3d3bJo9sWk+yL2LRoTEah3O/SA6/8w=
-github.com/tidwall/btree v1.5.2/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY=
-github.com/tklauser/go-sysconf v0.3.5 h1:uu3Xl4nkLzQfXNsWn15rPc/HQCJKObbt1dKJeWp3vU4=
-github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA=
-github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
-github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
-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 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
-github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
-github.com/ulikunitz/xz v0.5.8 h1:ERv8V6GKqVi23rgu5cj9pVfVzJbOqAY2Ntl88O6c2nQ=
-github.com/ulikunitz/xz v0.5.8/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/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
-github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
-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.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
-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.0 h1:dlMC7aO8Wss1CxBq2I96kZ69Nh1ligzbs8UWOtq/AsA=
-github.com/zondax/ledger-go v0.14.0/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/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=
-go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
-go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
-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.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=
-go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
-go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ=
-go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
-go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
-go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
-go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
-go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=
-go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
-go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
-go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
-go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
-go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY=
-go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY=
-golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/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-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
-golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
-golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8=
-golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80=
-golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
-golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
-golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
-golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-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-20221019170559-20944726eadf h1:nFVjjKDgNY37+ZSYCJmtYf7tOlfQswHqplG2eosjOMg=
-golang.org/x/exp v0.0.0-20221019170559-20944726eadf/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
-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=
-golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
-golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
-golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
-golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
-golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
-golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
-golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
-golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-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.6.0 h1:b9gGHsz9/HhJ3HF5DHQytPpuwocVTChQJK3AvoLRD5I=
-golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI=
-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=
-golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-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-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=
-golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
-golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-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-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=
-golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-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-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
-golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
-golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/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-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU=
-golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
-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=
-golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-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-20210514164344-f6687ab2804c/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-20221014153046-6fdb5e3db783 h1:nt+Q6cXKz4MosCSpnbMtqiQ8Oz0pxTef2B4Vca2lvfk=
-golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
-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=
-golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-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.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=
-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=
-golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/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-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/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-20210615035016-665e8c7367d1/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-20210809222454-d867a43fc93e/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-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-20211107104306-e0b2ad06fe42/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-20220315194320-039c03cc5b86/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-20220517195934-5e4e11fc645e/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-20220715151400-c0bba94af5f8/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.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ=
-golang.org/x/sys v0.3.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.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI=
-golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
-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=
-golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
-golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-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.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM=
-golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-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.1.0 h1:xYY+Bajn2a7VBmTM5GikTmnK8ZuX8YgnQCqZpbBNtmA=
-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-20190114222345-bf090417da8b/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-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=
-golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
-golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
-golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
-golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-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-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/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.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
-golang.org/x/tools v0.2.0 h1:G6AHpWxTMGY1KyEYoAQ5WTtIekUUvDNjan3ugu60JvE=
-golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA=
-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-20220517211312-f3a8303e98df/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=
-google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
-google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
-google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
-google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
-google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
-google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
-google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
-google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
-google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
-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.107.0 h1:I2SlFjD8ZWabaIFOfeEDg3pf0BHJDh6iYQ1ic3Yu/UU=
-google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY=
-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-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=
-google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
-google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
-google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
-google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-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=
-google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
-google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
-google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-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-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E=
-google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef h1:uQ2vjV/sHTsWSqdKeLqmwitzgvjMl7o4IdtHwUDXSJY=
-google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
-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.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
-google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
-google.golang.org/grpc v1.52.1 h1:2NpOPk5g5Xtb0qebIEs7hNIa++PdtZLo2AQUpc1YnSU=
-google.golang.org/grpc v1.52.1/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY=
-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=
-google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
-google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
-google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
-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.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8 h1:KR8+MyP7/qOlV+8Af01LtjL04bu7on42eVsxT4EyBQk=
-google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8/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-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
-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/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
-gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
-gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU=
-gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c=
-gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
-gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
-gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
-gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
-gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
-gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-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-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=
-gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-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=
-honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
-honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-lukechampine.com/blake3 v1.1.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c=
-lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA=
-lukechampine.com/uint128 v1.1.1 h1:pnxCASz787iMf+02ssImqk6OLt+Z5QHMoZyUXR4z6JU=
-lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
-modernc.org/cc/v3 v3.36.0 h1:0kmRkTmqNidmu3c7BNDSdVHCxXCkWLmWmCIVX4LUboo=
-modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI=
-modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc=
-modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw=
-modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ=
-modernc.org/ccgo/v3 v3.16.6 h1:3l18poV+iUemQ98O3X5OMr97LOqlzis+ytivU4NqGhA=
-modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ=
-modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk=
-modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ=
-modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM=
-modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM=
-modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA=
-modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A=
-modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU=
-modernc.org/libc v1.16.7 h1:qzQtHhsZNpVPpeCu+aMIQldXeV1P0vRhSqCL0nOIJOA=
-modernc.org/libc v1.16.7/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU=
-modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
-modernc.org/mathutil v1.4.1 h1:ij3fYGe8zBF4Vu+g0oT7mB06r8sqGWKuJu1yXeR4by8=
-modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
-modernc.org/memory v1.1.1 h1:bDOL0DIDLQv7bWhP3gMvIrnoFw+Eo6F7a2QK9HPDiFU=
-modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw=
-modernc.org/opt v0.1.1 h1:/0RX92k9vwVeDXj+Xn23DKp2VJubL7k8qNffND6qn3A=
-modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
-modernc.org/sqlite v1.17.3 h1:iE+coC5g17LtByDYDWKpR6m2Z9022YrSh3bumwOnIrI=
-modernc.org/sqlite v1.17.3/go.mod h1:10hPVYar9C0kfXuTWGz8s0XtB8uAGymUy51ZzStYe3k=
-modernc.org/strutil v1.1.1 h1:xv+J1BXY3Opl2ALrBwyfEikFAj8pmqcpnfmuwUwcozs=
-modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw=
-modernc.org/tcl v1.13.1 h1:npxzTwFTZYM8ghWicVIX1cRWzj7Nd8i6AqqX2p+IYao=
-modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw=
-modernc.org/token v1.0.0 h1:a0jaWiNMDhDUtqOj09wvjWWAqd3q7WpBulmL9H2egsk=
-modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
-modernc.org/z v1.5.1 h1:RTNHdsrOpeoSeOF4FbzTo8gBYByaJ5xT7NgZ9ZqRiJM=
-modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8=
-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.3/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04=
-rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
-rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
-rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
-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/e2e/scripts/run-compatibility-tests.sh b/e2e/scripts/run-compatibility-tests.sh
deleted file mode 100755
index 76ef12a5e5d..00000000000
--- a/e2e/scripts/run-compatibility-tests.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/bash
-
-set -Eeou pipefail
-
-function run_full_compatibility_suite(){
- local release_branch="${1}"
- gh workflow run e2e-compatibility.yaml -f release-branch=${release_branch}
- sleep 5 # can take some time for the workflow to appear
- run_id="$(gh run list "--workflow=e2e-compatibility.yaml" | grep workflow_dispatch | grep -Eo "[0-9]{9,11}" | head -n 1)"
- gh run view ${run_id} --web
-}
-
-RELEASE_BRANCH="${1}"
-run_full_compatibility_suite "${RELEASE_BRANCH}"
diff --git a/e2e/scripts/run-e2e.sh b/e2e/scripts/run-e2e.sh
deleted file mode 100755
index 2703dd50e0d..00000000000
--- a/e2e/scripts/run-e2e.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/bash
-
-set -euo pipefail
-
-ENTRY_POINT="${1}"
-TEST="${2}"
-
-export CHAIN_A_TAG="${CHAIN_A_TAG:-latest}"
-export CHAIN_IMAGE="${CHAIN_IMAGE:-ibc-go-simd}"
-export CHAIN_BINARY="${CHAIN_BINARY:-simd}"
-
-# In CI, the docker images will be built separately.
-# context for building the image is one directory up.
-if [ "${CI:-}" != "true" ]
-then
- (cd ..; docker build . -t "${CHAIN_IMAGE}:${CHAIN_A_TAG}")
-fi
-
-go test -v ./tests/... --run ${ENTRY_POINT} -testify.m ^${TEST}$
diff --git a/e2e/semverutil/semver.go b/e2e/semverutil/semver.go
deleted file mode 100644
index c630a1b2dad..00000000000
--- a/e2e/semverutil/semver.go
+++ /dev/null
@@ -1,48 +0,0 @@
-package semverutil
-
-import (
- "golang.org/x/mod/semver"
-)
-
-// FeatureReleases contains the combination of versions the feature was released in.
-type FeatureReleases struct {
- // MajorVersion is the major version in the format including the v. E.g. "v6"
- MajorVersion string
- // MinorVersions contains a slice of versions including the v and excluding the patch version. E.g. v2.5
- MinorVersions []string
-}
-
-// IsSupported returns whether the version contains the feature.
-// This is true if the version is greater than or equal to the major version it was released in
-// or is greater than or equal to the list of minor releases it was included in.
-func (fr FeatureReleases) IsSupported(versionStr string) bool {
- // assume any non-semantic version formatted version supports the feature
- // this will be useful during development of the e2e test with the new feature
- if !semver.IsValid(versionStr) {
- return true
- }
-
- if semverGTE(versionStr, fr.MajorVersion) {
- return true
- }
-
- for _, mv := range fr.MinorVersions {
- mvMajor, versionStrMajor := semver.Major(mv), semver.Major(versionStr)
-
- if semverEqual(mvMajor, versionStrMajor) {
- return semverGTE(versionStr, mv)
- }
- }
-
- return false
-}
-
-// semverGTE returns true if versionA is greater than or equal to versionB.
-func semverGTE(versionA, versionB string) bool {
- return semver.Compare(versionA, versionB) >= 0
-}
-
-// semverEqual returns true if versionA is equal to versionB.
-func semverEqual(versionA, versionB string) bool {
- return semver.Compare(versionA, versionB) == 0
-}
diff --git a/e2e/semverutil/semver_test.go b/e2e/semverutil/semver_test.go
deleted file mode 100644
index b2b44f1d318..00000000000
--- a/e2e/semverutil/semver_test.go
+++ /dev/null
@@ -1,53 +0,0 @@
-package semverutil_test
-
-import (
- "testing"
-
- "github.com/stretchr/testify/require"
-
- "github.com/cosmos/ibc-go/e2e/semverutil"
-)
-
-func TestIsSupported(t *testing.T) {
- releases := semverutil.FeatureReleases{
- MajorVersion: "v6",
- MinorVersions: []string{
- "v2.5",
- "v3.4",
- "v4.2",
- "v5.1",
- },
- }
-
- testCases := []struct {
- name string
- version string
- expSupported bool
- }{
- {"non semantic version", "main", true},
- {"non semantic version starts with v", "v", true},
- {"non semantic version", "pr-155", true},
- {"non semantic version", "major.5.1", true},
- {"non semantic version", "1.minor.1", true},
- {"supported semantic version", "v2.5.0", true},
- {"supported semantic version", "v3.4.0", true},
- {"supported semantic version", "v4.2.0", true},
- {"supported semantic version", "v5.1.0", true},
- {"supported semantic version", "v6.0.0", true},
- {"supported semantic version", "v6.1.0", true},
- {"supported semantic version", "v7.1.0", true},
- {"supported semantic version", "v22.5.1", true},
- {"supported semantic version without v", "2.5.0", true},
- {"unsupported semantic version", "v1.5.0", false},
- {"unsupported semantic version", "v2.4.5", false},
- {"unsupported semantic version", "v3.1.0", false},
- {"unsupported semantic version", "v4.1.0", false},
- {"unsupported semantic version", "v5.0.0", false},
- {"unsupported semantic version on partially supported major line", "v2.4.0", false},
- }
-
- for _, tc := range testCases {
- supported := releases.IsSupported(tc.version)
- require.Equal(t, tc.expSupported, supported, tc.name)
- }
-}
diff --git a/e2e/testconfig/testconfig.go b/e2e/testconfig/testconfig.go
deleted file mode 100644
index 995eed84c83..00000000000
--- a/e2e/testconfig/testconfig.go
+++ /dev/null
@@ -1,287 +0,0 @@
-package testconfig
-
-import (
- "encoding/json"
- "fmt"
- "os"
-
- "github.com/cosmos/cosmos-sdk/codec"
- sdk "github.com/cosmos/cosmos-sdk/types"
- "github.com/cosmos/cosmos-sdk/types/module/testutil"
- 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"
- gogoproto "github.com/cosmos/gogoproto/proto"
- "github.com/strangelove-ventures/ibctest/v7/ibc"
-
- "github.com/cosmos/ibc-go/e2e/semverutil"
- "github.com/cosmos/ibc-go/e2e/testvalues"
-)
-
-const (
- // ChainImageEnv specifies the image that the chains will use. If left unspecified, it will
- // default to being determined based on the specified binary. E.g. ghcr.io/cosmos/ibc-go-simd
- ChainImageEnv = "CHAIN_IMAGE"
- // ChainATagEnv specifies the tag that Chain A will use.
- ChainATagEnv = "CHAIN_A_TAG"
- // ChainBTagEnv specifies the tag that Chain B will use. If unspecified
- // the value will default to the same value as Chain A.
- ChainBTagEnv = "CHAIN_B_TAG"
- // GoRelayerTagEnv specifies the go relayer version. Defaults to "main"
- GoRelayerTagEnv = "RLY_TAG"
- // ChainBinaryEnv binary is the binary that will be used for both chains.
- ChainBinaryEnv = "CHAIN_BINARY"
- // ChainUpgradeTagEnv specifies the upgrade version tag
- ChainUpgradeTagEnv = "CHAIN_UPGRADE_TAG"
- // defaultBinary is the default binary that will be used by the chains.
- defaultBinary = "simd"
- // defaultRlyTag is the tag that will be used if no relayer tag is specified.
- // all images are here https://github.com/cosmos/relayer/pkgs/container/relayer/versions
- defaultRlyTag = "v2.2.0-rc2"
- // defaultChainTag is the tag that will be used for the chains if none is specified.
- defaultChainTag = "main"
-)
-
-func getChainImage(binary string) string {
- if binary == "" {
- binary = defaultBinary
- }
- return fmt.Sprintf("ghcr.io/cosmos/ibc-go-%s", binary)
-}
-
-// TestConfig holds various fields used in the E2E tests.
-type TestConfig struct {
- ChainAConfig ChainConfig
- ChainBConfig ChainConfig
- RlyTag string
- UpgradeTag string
-}
-
-type ChainConfig struct {
- Image string
- Tag string
- Binary string
-}
-
-// FromEnv returns a TestConfig constructed from environment variables.
-func FromEnv() TestConfig {
- chainBinary, ok := os.LookupEnv(ChainBinaryEnv)
- if !ok {
- chainBinary = defaultBinary
- }
-
- chainATag, ok := os.LookupEnv(ChainATagEnv)
- if !ok {
- chainATag = defaultChainTag
- }
-
- chainBTag, ok := os.LookupEnv(ChainBTagEnv)
- if !ok {
- chainBTag = chainATag
- }
-
- rlyTag, ok := os.LookupEnv(GoRelayerTagEnv)
- if !ok {
- rlyTag = defaultRlyTag
- }
-
- // TODO: remove hard coded value
- rlyTag = "andrew-tendermint_v0.37"
-
- chainAImage := getChainImage(chainBinary)
- specifiedChainImage, ok := os.LookupEnv(ChainImageEnv)
- if ok {
- chainAImage = specifiedChainImage
- }
- chainBImage := chainAImage
-
- upgradeTag, ok := os.LookupEnv(ChainUpgradeTagEnv)
- if !ok {
- upgradeTag = ""
- }
-
- return TestConfig{
- ChainAConfig: ChainConfig{
- Image: chainAImage,
- Tag: chainATag,
- Binary: chainBinary,
- },
- ChainBConfig: ChainConfig{
- Image: chainBImage,
- Tag: chainBTag,
- Binary: chainBinary,
- },
- RlyTag: rlyTag,
- UpgradeTag: upgradeTag,
- }
-}
-
-func GetChainATag() string {
- chainATag, ok := os.LookupEnv(ChainATagEnv)
- if !ok {
- panic(fmt.Sprintf("no environment variable specified for %s", ChainATagEnv))
- }
- return chainATag
-}
-
-func GetChainBTag() string {
- chainBTag, ok := os.LookupEnv(ChainBTagEnv)
- if !ok {
- return GetChainATag()
- }
- return chainBTag
-}
-
-// ChainOptions stores chain configurations for the chains that will be
-// created for the tests. They can be modified by passing ChainOptionConfiguration
-// to E2ETestSuite.GetChains.
-type ChainOptions struct {
- ChainAConfig *ibc.ChainConfig
- ChainBConfig *ibc.ChainConfig
-}
-
-// ChainOptionConfiguration enables arbitrary configuration of ChainOptions.
-type ChainOptionConfiguration func(options *ChainOptions)
-
-// DefaultChainOptions returns the default configuration for the chains.
-// These options can be configured by passing configuration functions to E2ETestSuite.GetChains.
-func DefaultChainOptions() ChainOptions {
- tc := FromEnv()
- chainACfg := newDefaultSimappConfig(tc.ChainAConfig, "simapp-a", "chain-a", "atoma")
- chainBCfg := newDefaultSimappConfig(tc.ChainBConfig, "simapp-b", "chain-b", "atomb")
- return ChainOptions{
- ChainAConfig: &chainACfg,
- ChainBConfig: &chainBCfg,
- }
-}
-
-// newDefaultSimappConfig creates an ibc configuration for simd.
-func newDefaultSimappConfig(cc ChainConfig, name, chainID, denom string) ibc.ChainConfig {
- return ibc.ChainConfig{
- Type: "cosmos",
- Name: name,
- ChainID: chainID,
- Images: []ibc.DockerImage{
- {
- Repository: cc.Image,
- Version: cc.Tag,
- },
- },
- Bin: cc.Binary,
- Bech32Prefix: "cosmos",
- CoinType: fmt.Sprint(sdk.GetConfig().GetCoinType()),
- Denom: denom,
- GasPrices: fmt.Sprintf("0.00%s", denom),
- GasAdjustment: 1.3,
- TrustingPeriod: "508h",
- NoHostMount: false,
- ModifyGenesis: defaultModifyGenesis(),
- }
-}
-
-// govGenesisFeatureReleases represents the releases the governance module genesis
-// was upgraded from v1beta1 to v1.
-var govGenesisFeatureReleases = semverutil.FeatureReleases{
- MajorVersion: "v7",
-}
-
-// defaultModifyGenesis will only modify governance params to ensure the voting period and minimum deposit
-// are functional for e2e testing purposes.
-// Note: this function intentionally does not use the type defined here https://github.com/tendermint/tendermint/blob/v0.37.0-rc2/types/genesis.go#L38-L46
-// and uses a map[string]interface{} instead.
-// This approach prevents the field block.TimeIotaMs from being lost which happened when using the GenesisDoc type from tendermint version v0.37.0.
-// ibctest performs the following steps when creating the genesis.json file for chains.
-// - 1. Let the chain binary create its own genesis file.
-// - 2. Apply any provided functions to modify the bytes of the file.
-// - 3. Overwrite the file with the new contents.
-// This is a problem because when the tendermint types change, marshalling into the type will cause us to lose
-// values if the types have changed in between the version of the chain in the test and the version of tendermint
-// imported by the e2e tests.
-// By using a raw map[string]interface{} we preserve the values unknown to the e2e tests and can still change
-// the values we care about.
-// TODO: handle these genesis modifications in a way which is type safe and does not require us to rely on
-// map[string]interface{}
-func defaultModifyGenesis() func(ibc.ChainConfig, []byte) ([]byte, error) {
- const appStateKey = "app_state"
- return func(chainConfig ibc.ChainConfig, genbz []byte) ([]byte, error) {
- genesisDocMap := map[string]interface{}{}
- err := json.Unmarshal(genbz, &genesisDocMap)
- if err != nil {
- return nil, fmt.Errorf("failed to unmarshal genesis bytes into genesis doc: %w", err)
- }
-
- appStateMap, ok := genesisDocMap[appStateKey].(map[string]interface{})
- if !ok {
- return nil, fmt.Errorf("failed to extract to app_state")
- }
-
- govModuleBytes, err := json.Marshal(appStateMap[govtypes.ModuleName])
- if err != nil {
- return nil, fmt.Errorf("failed to extract gov genesis bytes: %s", err)
- }
-
- govModuleGenesisBytes, err := modifyGovAppState(chainConfig, govModuleBytes)
- if err != nil {
- return nil, err
- }
-
- govModuleGenesisMap := map[string]interface{}{}
- err = json.Unmarshal(govModuleGenesisBytes, &govModuleGenesisMap)
- if err != nil {
- return nil, fmt.Errorf("failed to unmarshal gov genesis bytes into map: %w", err)
- }
-
- appStateMap[govtypes.ModuleName] = govModuleGenesisMap
- genesisDocMap[appStateKey] = appStateMap
-
- finalGenesisDocBytes, err := json.MarshalIndent(genesisDocMap, "", " ")
- if err != nil {
- return nil, err
- }
-
- return finalGenesisDocBytes, nil
- }
-}
-
-// modifyGovAppState takes the existing gov app state and marshals it to either a govv1 GenesisState
-// or a govv1beta1 GenesisState depending on the simapp version.
-func modifyGovAppState(chainConfig ibc.ChainConfig, govAppState []byte) ([]byte, error) {
- cfg := testutil.MakeTestEncodingConfig()
-
- cdc := codec.NewProtoCodec(cfg.InterfaceRegistry)
- govv1.RegisterInterfaces(cfg.InterfaceRegistry)
- govv1beta1.RegisterInterfaces(cfg.InterfaceRegistry)
-
- shouldUseGovV1 := govGenesisFeatureReleases.IsSupported(chainConfig.Images[0].Version)
-
- var govGenesisState gogoproto.Message
- if shouldUseGovV1 {
- govGenesisState = &govv1.GenesisState{}
- } else {
- govGenesisState = &govv1beta1.GenesisState{}
- }
-
- if err := cdc.UnmarshalJSON(govAppState, govGenesisState); err != nil {
- return nil, fmt.Errorf("failed to unmarshal genesis bytes into gov genesis state: %w", err)
- }
-
- switch v := govGenesisState.(type) {
- case *govv1.GenesisState:
- if v.Params == nil {
- v.Params = &govv1.Params{}
- }
- // set correct minimum deposit using configured denom
- v.Params.MinDeposit = sdk.NewCoins(sdk.NewCoin(chainConfig.Denom, govv1beta1.DefaultMinDepositTokens))
- vp := testvalues.VotingPeriod
- v.Params.VotingPeriod = &vp
- case *govv1beta1.GenesisState:
- v.DepositParams.MinDeposit = sdk.NewCoins(sdk.NewCoin(chainConfig.Denom, govv1beta1.DefaultMinDepositTokens))
- v.VotingParams.VotingPeriod = testvalues.VotingPeriod
- }
- govGenBz, err := cdc.MarshalJSON(govGenesisState)
- if err != nil {
- return nil, fmt.Errorf("failed to marshal gov genesis state: %w", err)
- }
-
- return govGenBz, nil
-}
diff --git a/e2e/tests/core/03-connection/connection_test.go b/e2e/tests/core/03-connection/connection_test.go
deleted file mode 100644
index 7c5d452fb06..00000000000
--- a/e2e/tests/core/03-connection/connection_test.go
+++ /dev/null
@@ -1,132 +0,0 @@
-package connection
-
-import (
- "context"
- "fmt"
- "strconv"
- "strings"
- "testing"
- "time"
-
- paramsproposaltypes "github.com/cosmos/cosmos-sdk/x/params/types/proposal"
- "github.com/strangelove-ventures/ibctest/v7/ibc"
- test "github.com/strangelove-ventures/ibctest/v7/testutil"
- "github.com/stretchr/testify/suite"
-
- "github.com/cosmos/ibc-go/e2e/testsuite"
- "github.com/cosmos/ibc-go/e2e/testvalues"
- transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
- connectiontypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types"
- ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported"
- ibctesting "github.com/cosmos/ibc-go/v7/testing"
-)
-
-func TestConnectionTestSuite(t *testing.T) {
- suite.Run(t, new(ConnectionTestSuite))
-}
-
-type ConnectionTestSuite struct {
- testsuite.E2ETestSuite
-}
-
-// QueryMaxExpectedTimePerBlockParam queries the on-chain max expected time per block param for 03-connection
-func (s *ConnectionTestSuite) QueryMaxExpectedTimePerBlockParam(ctx context.Context, chain ibc.Chain) uint64 {
- queryClient := s.GetChainGRCPClients(chain).ParamsQueryClient
- res, err := queryClient.Params(ctx, ¶msproposaltypes.QueryParamsRequest{
- Subspace: ibcexported.ModuleName,
- Key: string(connectiontypes.KeyMaxExpectedTimePerBlock),
- })
- s.Require().NoError(err)
-
- // removing additional strings that are used for amino
- delay := strings.ReplaceAll(res.Param.Value, "\"", "")
- time, err := strconv.ParseUint(delay, 10, 64)
- s.Require().NoError(err)
-
- return time
-}
-
-// TestMaxExpectedTimePerBlockParam tests changing the MaxExpectedTimePerBlock param using a governance proposal
-func (s *ConnectionTestSuite) TestMaxExpectedTimePerBlockParam() {
- t := s.T()
- ctx := context.TODO()
-
- relayer, channelA := s.SetupChainsRelayerAndChannel(ctx, transferChannelOptions())
- chainA, chainB := s.GetChains()
-
- chainBDenom := chainB.Config().Denom
- chainAIBCToken := testsuite.GetIBCToken(chainBDenom, channelA.PortID, channelA.ChannelID)
-
- chainAWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
- chainAAddress := chainAWallet.FormattedAddress()
-
- chainBWallet := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount)
- chainBAddress := chainBWallet.FormattedAddress()
-
- s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB), "failed to wait for blocks")
-
- t.Run("ensure delay is set to the default of 30 seconds", func(t *testing.T) {
- expectedDelay := uint64(30 * time.Second)
- delay := s.QueryMaxExpectedTimePerBlockParam(ctx, chainA)
- s.Require().Equal(expectedDelay, delay)
- })
-
- t.Run("change the delay to 60 seconds", func(t *testing.T) {
- delay := fmt.Sprintf(`"%d"`, 1*time.Minute)
- changes := []paramsproposaltypes.ParamChange{
- paramsproposaltypes.NewParamChange(ibcexported.ModuleName, string(connectiontypes.KeyMaxExpectedTimePerBlock), delay),
- }
-
- proposal := paramsproposaltypes.NewParameterChangeProposal(ibctesting.Title, ibctesting.Description, changes)
- s.ExecuteGovProposal(ctx, chainA, chainAWallet, proposal)
- })
-
- t.Run("validate the param was successfully changed", func(t *testing.T) {
- expectedDelay := uint64(1 * time.Minute)
- delay := s.QueryMaxExpectedTimePerBlockParam(ctx, chainA)
- s.Require().Equal(expectedDelay, delay)
- })
-
- t.Run("ensure packets can be received, send from chainB to chainA", func(t *testing.T) {
- t.Run("send tokens from chainB to chainA", func(t *testing.T) {
- transferTxResp, err := s.Transfer(ctx, chainB, chainBWallet, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID, testvalues.DefaultTransferAmount(chainBDenom), chainBAddress, chainAAddress, s.GetTimeoutHeight(ctx, chainA), 0, "")
- s.Require().NoError(err)
- s.AssertValidTxResponse(transferTxResp)
- })
-
- t.Run("tokens are escrowed", func(t *testing.T) {
- actualBalance, err := s.GetChainBNativeBalance(ctx, chainBWallet)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - testvalues.IBCTransferAmount
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("packets are relayed", func(t *testing.T) {
- s.AssertPacketRelayed(ctx, chainA, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID, 1)
-
- actualBalance, err := chainA.GetBalance(ctx, chainAAddress, chainAIBCToken.IBCDenom())
- s.Require().NoError(err)
-
- expected := testvalues.IBCTransferAmount
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("stop relayer", func(t *testing.T) {
- s.StopRelayer(ctx, relayer)
- })
- })
-}
-
-// transferChannelOptions configures both of the chains to have non-incentivized transfer channels.
-func transferChannelOptions() func(options *ibc.CreateChannelOptions) {
- return func(opts *ibc.CreateChannelOptions) {
- opts.Version = transfertypes.Version
- opts.SourcePortName = transfertypes.PortID
- opts.DestPortName = transfertypes.PortID
- }
-}
diff --git a/e2e/tests/core/client_test.go b/e2e/tests/core/client_test.go
deleted file mode 100644
index a1facd0dd0a..00000000000
--- a/e2e/tests/core/client_test.go
+++ /dev/null
@@ -1,121 +0,0 @@
-package e2e
-
-import (
- "context"
- "fmt"
- "strings"
- "testing"
- "time"
-
- "github.com/strangelove-ventures/ibctest/v7/ibc"
- test "github.com/strangelove-ventures/ibctest/v7/testutil"
- "github.com/stretchr/testify/suite"
-
- "github.com/cosmos/ibc-go/e2e/testsuite"
- "github.com/cosmos/ibc-go/e2e/testvalues"
- clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
- ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported"
- ibctesting "github.com/cosmos/ibc-go/v7/testing"
-)
-
-func TestClientTestSuite(t *testing.T) {
- suite.Run(t, new(ClientTestSuite))
-}
-
-type ClientTestSuite struct {
- testsuite.E2ETestSuite
-}
-
-// Status queries the current status of the client
-func (s *ClientTestSuite) Status(ctx context.Context, chain ibc.Chain, clientID string) (string, error) {
- queryClient := s.GetChainGRCPClients(chain).ClientQueryClient
- res, err := queryClient.ClientStatus(ctx, &clienttypes.QueryClientStatusRequest{
- ClientId: clientID,
- })
- if err != nil {
- return "", err
- }
-
- return res.Status, nil
-}
-
-func (s *ClientTestSuite) TestClientUpdateProposal_Succeeds() {
- t := s.T()
- ctx := context.TODO()
-
- var (
- pathName string
- relayer ibc.Relayer
- subjectClientID string
- substituteClientID string
- badTrustingPeriod = time.Duration(time.Second)
- )
-
- t.Run("create substitute client with correct trusting period", func(t *testing.T) {
- relayer, _ = s.SetupChainsRelayerAndChannel(ctx)
-
- // TODO: update when client identifier created is accessible
- // currently assumes first client is 07-tendermint-0
- substituteClientID = clienttypes.FormatClientIdentifier(ibcexported.Tendermint, 0)
-
- // TODO: replace with better handling of path names
- pathName = fmt.Sprintf("%s-path-%d", s.T().Name(), 0)
- pathName = strings.ReplaceAll(pathName, "/", "-")
- })
-
- chainA, chainB := s.GetChains()
- chainAWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
-
- t.Run("create subject client with bad trusting period", func(t *testing.T) {
- createClientOptions := ibc.CreateClientOptions{
- TrustingPeriod: badTrustingPeriod.String(),
- }
-
- s.SetupClients(ctx, relayer, createClientOptions)
-
- // TODO: update when client identifier created is accessible
- // currently assumes second client is 07-tendermint-1
- subjectClientID = clienttypes.FormatClientIdentifier(ibcexported.Tendermint, 1)
- })
-
- time.Sleep(badTrustingPeriod)
-
- t.Run("update substitute client", func(t *testing.T) {
- s.UpdateClients(ctx, relayer, pathName)
- })
-
- s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB), "failed to wait for blocks")
-
- t.Run("check status of each client", func(t *testing.T) {
- t.Run("substitute should be active", func(t *testing.T) {
- status, err := s.Status(ctx, chainA, substituteClientID)
- s.Require().NoError(err)
- s.Require().Equal(ibcexported.Active.String(), status)
- })
-
- t.Run("subject should be expired", func(t *testing.T) {
- status, err := s.Status(ctx, chainA, subjectClientID)
- s.Require().NoError(err)
- s.Require().Equal(ibcexported.Expired.String(), status)
- })
- })
-
- t.Run("pass client update proposal", func(t *testing.T) {
- proposal := clienttypes.NewClientUpdateProposal(ibctesting.Title, ibctesting.Description, subjectClientID, substituteClientID)
- s.ExecuteGovProposal(ctx, chainA, chainAWallet, proposal)
- })
-
- t.Run("check status of each client", func(t *testing.T) {
- t.Run("substitute should be active", func(t *testing.T) {
- status, err := s.Status(ctx, chainA, substituteClientID)
- s.Require().NoError(err)
- s.Require().Equal(ibcexported.Active.String(), status)
- })
-
- t.Run("subject should be active", func(t *testing.T) {
- status, err := s.Status(ctx, chainA, subjectClientID)
- s.Require().NoError(err)
- s.Require().Equal(ibcexported.Active.String(), status)
- })
- })
-}
diff --git a/e2e/tests/interchain_accounts/base_test.go b/e2e/tests/interchain_accounts/base_test.go
deleted file mode 100644
index ac0acfdd817..00000000000
--- a/e2e/tests/interchain_accounts/base_test.go
+++ /dev/null
@@ -1,421 +0,0 @@
-package interchain_accounts
-
-import (
- "context"
- "testing"
- "time"
-
- "github.com/strangelove-ventures/ibctest/v7"
- "github.com/strangelove-ventures/ibctest/v7/chain/cosmos"
- "github.com/strangelove-ventures/ibctest/v7/ibc"
- test "github.com/strangelove-ventures/ibctest/v7/testutil"
- "github.com/stretchr/testify/suite"
- "golang.org/x/mod/semver"
-
- sdk "github.com/cosmos/cosmos-sdk/types"
- banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
- "github.com/cosmos/gogoproto/proto"
-
- "github.com/cosmos/ibc-go/e2e/testconfig"
- "github.com/cosmos/ibc-go/e2e/testsuite"
- "github.com/cosmos/ibc-go/e2e/testvalues"
- controllertypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/types"
- icatypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/types"
- channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types"
- ibctesting "github.com/cosmos/ibc-go/v7/testing"
-)
-
-func TestInterchainAccountsTestSuite(t *testing.T) {
- suite.Run(t, new(InterchainAccountsTestSuite))
-}
-
-type InterchainAccountsTestSuite struct {
- testsuite.E2ETestSuite
-}
-
-// getICAVersion returns the version which should be used in the MsgRegisterAccount broadcast from the
-// controller chain.
-func getICAVersion(chainAVersion, chainBVersion string) string {
- chainBIsGreaterThanOrEqualToChainA := semver.Compare(chainAVersion, chainBVersion) <= 0
- if chainBIsGreaterThanOrEqualToChainA {
- // allow version to be specified by the controller chain
- return ""
- }
- // explicitly set the version string because the host chain might not yet support incentivized channels.
- return icatypes.NewDefaultMetadataString(ibctesting.FirstConnectionID, ibctesting.FirstConnectionID)
-}
-
-// RegisterInterchainAccount will attempt to register an interchain account on the counterparty chain.
-func (s *InterchainAccountsTestSuite) RegisterInterchainAccount(ctx context.Context, chain *cosmos.CosmosChain, user ibc.Wallet, msgRegisterAccount *controllertypes.MsgRegisterInterchainAccount) {
- txResp, err := s.BroadcastMessages(ctx, chain, user, msgRegisterAccount)
- s.Require().NoError(err)
- s.AssertValidTxResponse(txResp)
-}
-
-func (s *InterchainAccountsTestSuite) TestMsgSendTx_SuccessfulTransfer() {
- t := s.T()
- ctx := context.TODO()
-
- // setup relayers and connection-0 between two chains
- // channel-0 is a transfer channel but it will not be used in this test case
- relayer, _ := s.SetupChainsRelayerAndChannel(ctx)
- chainA, chainB := s.GetChains()
-
- // setup 2 accounts: controller account on chain A, a second chain B account.
- // host account will be created when the ICA is registered
- controllerAccount := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
- controllerAddress := controllerAccount.FormattedAddress()
- chainBAccount := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount)
- var hostAccount string
-
- t.Run("broadcast MsgRegisterInterchainAccount", func(t *testing.T) {
- version := getICAVersion(testconfig.GetChainATag(), testconfig.GetChainBTag())
- msgRegisterAccount := controllertypes.NewMsgRegisterInterchainAccount(ibctesting.FirstConnectionID, controllerAddress, version)
-
- txResp, err := s.BroadcastMessages(ctx, chainA, controllerAccount, msgRegisterAccount)
- s.Require().NoError(err)
- s.AssertValidTxResponse(txResp)
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("verify interchain account", func(t *testing.T) {
- var err error
- hostAccount, err = s.QueryInterchainAccount(ctx, chainA, controllerAddress, ibctesting.FirstConnectionID)
- s.Require().NoError(err)
- s.Require().NotZero(len(hostAccount))
-
- channels, err := relayer.GetChannels(ctx, s.GetRelayerExecReporter(), chainA.Config().ChainID)
- s.Require().NoError(err)
- s.Require().Equal(len(channels), 2)
- })
-
- t.Run("interchain account executes a bank transfer on behalf of the corresponding owner account", func(t *testing.T) {
- t.Run("fund interchain account wallet", func(t *testing.T) {
- // fund the host account so it has some $$ to send
- err := chainB.SendFunds(ctx, ibctest.FaucetAccountKeyName, ibc.WalletAmount{
- Address: hostAccount,
- Amount: testvalues.StartingTokenAmount,
- Denom: chainB.Config().Denom,
- })
- s.Require().NoError(err)
- })
-
- t.Run("broadcast MsgSendTx", func(t *testing.T) {
- // assemble bank transfer message from host account to user account on host chain
- msgSend := &banktypes.MsgSend{
- FromAddress: hostAccount,
- ToAddress: chainBAccount.FormattedAddress(),
- Amount: sdk.NewCoins(testvalues.DefaultTransferAmount(chainB.Config().Denom)),
- }
-
- cdc := testsuite.Codec()
- bz, err := icatypes.SerializeCosmosTx(cdc, []proto.Message{msgSend})
- s.Require().NoError(err)
-
- packetData := icatypes.InterchainAccountPacketData{
- Type: icatypes.EXECUTE_TX,
- Data: bz,
- Memo: "e2e",
- }
-
- msgSendTx := controllertypes.NewMsgSendTx(controllerAccount.FormattedAddress(), ibctesting.FirstConnectionID, uint64(time.Hour.Nanoseconds()), packetData)
-
- resp, err := s.BroadcastMessages(
- ctx,
- chainA,
- controllerAccount,
- msgSendTx,
- )
-
- s.AssertValidTxResponse(resp)
- s.Require().NoError(err)
-
- s.Require().NoError(test.WaitForBlocks(ctx, 10, chainA, chainB))
- })
-
- t.Run("verify tokens transferred", func(t *testing.T) {
- balance, err := chainB.GetBalance(ctx, chainBAccount.FormattedAddress(), chainB.Config().Denom)
- s.Require().NoError(err)
-
- _, err = chainB.GetBalance(ctx, hostAccount, chainB.Config().Denom)
- s.Require().NoError(err)
-
- expected := testvalues.IBCTransferAmount + testvalues.StartingTokenAmount
- s.Require().Equal(expected, balance)
- })
- })
-}
-
-func (s *InterchainAccountsTestSuite) TestMsgSendTx_FailedTransfer_InsufficientFunds() {
- t := s.T()
- ctx := context.TODO()
-
- // setup relayers and connection-0 between two chains
- // channel-0 is a transfer channel but it will not be used in this test case
- relayer, _ := s.SetupChainsRelayerAndChannel(ctx)
- chainA, chainB := s.GetChains()
-
- // setup 2 accounts: controller account on chain A, a second chain B account.
- // host account will be created when the ICA is registered
- controllerAccount := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
- controllerAddress := controllerAccount.FormattedAddress()
- chainBAccount := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount)
- var hostAccount string
-
- t.Run("broadcast MsgRegisterInterchainAccount", func(t *testing.T) {
- version := getICAVersion(testconfig.GetChainATag(), testconfig.GetChainBTag())
- msgRegisterAccount := controllertypes.NewMsgRegisterInterchainAccount(ibctesting.FirstConnectionID, controllerAddress, version)
-
- txResp, err := s.BroadcastMessages(ctx, chainA, controllerAccount, msgRegisterAccount)
- s.Require().NoError(err)
- s.AssertValidTxResponse(txResp)
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("verify interchain account", func(t *testing.T) {
- var err error
- hostAccount, err = s.QueryInterchainAccount(ctx, chainA, controllerAddress, ibctesting.FirstConnectionID)
- s.Require().NoError(err)
- s.Require().NotZero(len(hostAccount))
-
- channels, err := relayer.GetChannels(ctx, s.GetRelayerExecReporter(), chainA.Config().ChainID)
- s.Require().NoError(err)
- s.Require().Equal(len(channels), 2)
- })
-
- t.Run("fail to execute bank transfer over ICA", func(t *testing.T) {
- t.Run("verify empty host wallet", func(t *testing.T) {
- hostAccountBalance, err := chainB.GetBalance(ctx, hostAccount, chainB.Config().Denom)
- s.Require().NoError(err)
- s.Require().Zero(hostAccountBalance)
- })
-
- t.Run("broadcast MsgSendTx", func(t *testing.T) {
- // assemble bank transfer message from host account to user account on host chain
- msgSend := &banktypes.MsgSend{
- FromAddress: hostAccount,
- ToAddress: chainBAccount.FormattedAddress(),
- Amount: sdk.NewCoins(testvalues.DefaultTransferAmount(chainB.Config().Denom)),
- }
-
- cdc := testsuite.Codec()
- bz, err := icatypes.SerializeCosmosTx(cdc, []proto.Message{msgSend})
- s.Require().NoError(err)
-
- packetData := icatypes.InterchainAccountPacketData{
- Type: icatypes.EXECUTE_TX,
- Data: bz,
- Memo: "e2e",
- }
-
- msgSendTx := controllertypes.NewMsgSendTx(controllerAddress, ibctesting.FirstConnectionID, uint64(time.Hour.Nanoseconds()), packetData)
-
- txResp, err := s.BroadcastMessages(
- ctx,
- chainA,
- controllerAccount,
- msgSendTx,
- )
-
- s.AssertValidTxResponse(txResp)
- s.Require().NoError(err)
-
- s.Require().NoError(test.WaitForBlocks(ctx, 10, chainA, chainB))
- })
-
- t.Run("verify balance is the same", func(t *testing.T) {
- balance, err := chainB.GetBalance(ctx, chainBAccount.FormattedAddress(), chainB.Config().Denom)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount
- s.Require().Equal(expected, balance)
- })
- })
-}
-
-func (s *InterchainAccountsTestSuite) TestMsgSubmitTx_SuccessfulTransfer_AfterReopeningICA() {
- t := s.T()
- ctx := context.TODO()
-
- // setup relayers and connection-0 between two chains
- // channel-0 is a transfer channel but it will not be used in this test case
- relayer, _ := s.SetupChainsRelayerAndChannel(ctx)
- chainA, chainB := s.GetChains()
-
- // setup 2 accounts: controller account on chain A, a second chain B account.
- // host account will be created when the ICA is registered
- controllerAccount := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
- controllerAddress := controllerAccount.FormattedAddress()
- chainBAccount := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount)
-
- var (
- portID string
- hostAccount string
-
- initialChannelID = "channel-1"
- channelIDAfterReopening = "channel-2"
- )
-
- t.Run("register interchain account", func(t *testing.T) {
- var err error
- version := getICAVersion(testconfig.GetChainATag(), testconfig.GetChainBTag())
- msgRegisterInterchainAccount := controllertypes.NewMsgRegisterInterchainAccount(ibctesting.FirstConnectionID, controllerAddress, version)
- s.RegisterInterchainAccount(ctx, chainA, controllerAccount, msgRegisterInterchainAccount)
- portID, err = icatypes.NewControllerPortID(controllerAddress)
- s.Require().NoError(err)
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("verify interchain account", func(t *testing.T) {
- var err error
- hostAccount, err = s.QueryInterchainAccount(ctx, chainA, controllerAddress, ibctesting.FirstConnectionID)
- s.Require().NoError(err)
- s.Require().NotZero(len(hostAccount))
-
- _, err = s.QueryChannel(ctx, chainA, portID, initialChannelID)
- s.Require().NoError(err)
- })
-
- // stop the relayer to let the submit tx message time out
- t.Run("stop relayer", func(t *testing.T) {
- s.StopRelayer(ctx, relayer)
- })
-
- t.Run("submit tx message with bank transfer message times out", func(t *testing.T) {
- t.Run("fund interchain account wallet", func(t *testing.T) {
- // fund the host account account so it has some $$ to send
- err := chainB.SendFunds(ctx, ibctest.FaucetAccountKeyName, ibc.WalletAmount{
- Address: hostAccount,
- Amount: testvalues.StartingTokenAmount,
- Denom: chainB.Config().Denom,
- })
- s.Require().NoError(err)
- })
-
- t.Run("broadcast MsgSendTx", func(t *testing.T) {
- // assemble bank transfer message from host account to user account on host chain
- msgSend := &banktypes.MsgSend{
- FromAddress: hostAccount,
- ToAddress: chainBAccount.FormattedAddress(),
- Amount: sdk.NewCoins(testvalues.DefaultTransferAmount(chainB.Config().Denom)),
- }
-
- cdc := testsuite.Codec()
-
- bz, err := icatypes.SerializeCosmosTx(cdc, []proto.Message{msgSend})
- s.Require().NoError(err)
-
- packetData := icatypes.InterchainAccountPacketData{
- Type: icatypes.EXECUTE_TX,
- Data: bz,
- Memo: "e2e",
- }
-
- msgSendTx := controllertypes.NewMsgSendTx(controllerAddress, ibctesting.FirstConnectionID, uint64(1), packetData)
-
- resp, err := s.BroadcastMessages(
- ctx,
- chainA,
- controllerAccount,
- msgSendTx,
- )
-
- s.AssertValidTxResponse(resp)
- s.Require().NoError(err)
-
- // this sleep is to allow the packet to timeout
- time.Sleep(1 * time.Second)
- })
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("verify channel is closed due to timeout on ordered channel", func(t *testing.T) {
- channel, err := s.QueryChannel(ctx, chainA, portID, initialChannelID)
- s.Require().NoError(err)
-
- s.Require().Equal(channeltypes.CLOSED, channel.State, "the channel was not in an expected state")
- })
-
- t.Run("verify tokens not transferred", func(t *testing.T) {
- balance, err := chainB.GetBalance(ctx, chainBAccount.FormattedAddress(), chainB.Config().Denom)
- s.Require().NoError(err)
-
- _, err = chainB.GetBalance(ctx, hostAccount, chainB.Config().Denom)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount
- s.Require().Equal(expected, balance)
- })
-
- // re-register interchain account to reopen the channel now that it has been closed due to timeout
- // on an ordered channel
- t.Run("register interchain account", func(t *testing.T) {
- version := getICAVersion(testconfig.GetChainATag(), testconfig.GetChainBTag())
- msgRegisterInterchainAccount := controllertypes.NewMsgRegisterInterchainAccount(ibctesting.FirstConnectionID, controllerAddress, version)
- s.RegisterInterchainAccount(ctx, chainA, controllerAccount, msgRegisterInterchainAccount)
-
- s.Require().NoError(test.WaitForBlocks(ctx, 10, chainA, chainB))
- })
-
- t.Run("verify new channel is now open and interchain account has been reregistered with the same portID", func(t *testing.T) {
- channel, err := s.QueryChannel(ctx, chainA, portID, channelIDAfterReopening)
- s.Require().NoError(err)
-
- s.Require().Equal(channeltypes.OPEN, channel.State, "the channel was not in an expected state")
- })
-
- t.Run("broadcast MsgSendTx", func(t *testing.T) {
- // assemble bank transfer message from host account to user account on host chain
- msgSend := &banktypes.MsgSend{
- FromAddress: hostAccount,
- ToAddress: chainBAccount.FormattedAddress(),
- Amount: sdk.NewCoins(testvalues.DefaultTransferAmount(chainB.Config().Denom)),
- }
-
- cdc := testsuite.Codec()
-
- bz, err := icatypes.SerializeCosmosTx(cdc, []proto.Message{msgSend})
- s.Require().NoError(err)
-
- packetData := icatypes.InterchainAccountPacketData{
- Type: icatypes.EXECUTE_TX,
- Data: bz,
- Memo: "e2e",
- }
-
- msgSendTx := controllertypes.NewMsgSendTx(controllerAddress, ibctesting.FirstConnectionID, uint64(5*time.Minute), packetData)
-
- resp, err := s.BroadcastMessages(
- ctx,
- chainA,
- controllerAccount,
- msgSendTx,
- )
-
- s.AssertValidTxResponse(resp)
- s.Require().NoError(err)
-
- // time for the packet to be relayed
- s.Require().NoError(test.WaitForBlocks(ctx, 5, chainA, chainB))
- })
-
- t.Run("verify tokens transferred", func(t *testing.T) {
- balance, err := chainB.GetBalance(ctx, chainBAccount.FormattedAddress(), chainB.Config().Denom)
- s.Require().NoError(err)
-
- expected := testvalues.IBCTransferAmount + testvalues.StartingTokenAmount
- s.Require().Equal(expected, balance)
- })
-}
diff --git a/e2e/tests/interchain_accounts/gov_test.go b/e2e/tests/interchain_accounts/gov_test.go
deleted file mode 100644
index 08da6cb046e..00000000000
--- a/e2e/tests/interchain_accounts/gov_test.go
+++ /dev/null
@@ -1,117 +0,0 @@
-package interchain_accounts
-
-import (
- "context"
- "testing"
- "time"
-
- sdk "github.com/cosmos/cosmos-sdk/types"
- banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
- govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
- "github.com/cosmos/gogoproto/proto"
-
- "github.com/strangelove-ventures/ibctest/v7"
- "github.com/strangelove-ventures/ibctest/v7/ibc"
- test "github.com/strangelove-ventures/ibctest/v7/testutil"
- "github.com/stretchr/testify/suite"
-
- "github.com/cosmos/ibc-go/e2e/testsuite"
- "github.com/cosmos/ibc-go/e2e/testvalues"
- controllertypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/types"
- icatypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/types"
- ibctesting "github.com/cosmos/ibc-go/v7/testing"
-)
-
-func TestInterchainAccountsGovTestSuite(t *testing.T) {
- suite.Run(t, new(InterchainAccountsGovTestSuite))
-}
-
-type InterchainAccountsGovTestSuite struct {
- testsuite.E2ETestSuite
-}
-
-func (s *InterchainAccountsGovTestSuite) TestInterchainAccountsGovIntegration() {
- t := s.T()
- ctx := context.TODO()
-
- // setup relayers and connection-0 between two chains
- // channel-0 is a transfer channel but it will not be used in this test case
- relayer, _ := s.SetupChainsRelayerAndChannel(ctx)
- chainA, chainB := s.GetChains()
- controllerAccount := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
-
- chainBAccount := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount)
- chainBAddress := chainBAccount.FormattedAddress()
-
- govModuleAddress, err := s.QueryModuleAccountAddress(ctx, govtypes.ModuleName, chainA)
- s.Require().NoError(err)
- s.Require().NotNil(govModuleAddress)
-
- t.Run("execute proposal for MsgRegisterInterchainAccount", func(t *testing.T) {
- version := icatypes.NewDefaultMetadataString(ibctesting.FirstConnectionID, ibctesting.FirstConnectionID)
- msgRegisterAccount := controllertypes.NewMsgRegisterInterchainAccount(ibctesting.FirstConnectionID, govModuleAddress.String(), version)
- s.ExecuteGovProposalV1(ctx, msgRegisterAccount, chainA, controllerAccount, 1)
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- s.Require().NoError(test.WaitForBlocks(ctx, 10, chainA, chainB))
-
- var interchainAccAddr string
- t.Run("verify interchain account registration success", func(t *testing.T) {
- var err error
- interchainAccAddr, err = s.QueryInterchainAccount(ctx, chainA, govModuleAddress.String(), ibctesting.FirstConnectionID)
- s.Require().NoError(err)
- s.Require().NotZero(len(interchainAccAddr))
-
- channels, err := relayer.GetChannels(ctx, s.GetRelayerExecReporter(), chainA.Config().ChainID)
- s.Require().NoError(err)
- s.Require().Equal(len(channels), 2)
- })
-
- t.Run("interchain account executes a bank transfer on behalf of the corresponding owner account", func(t *testing.T) {
- t.Run("fund interchain account wallet", func(t *testing.T) {
- // fund the host account, so it has some $$ to send
- err := chainB.SendFunds(ctx, ibctest.FaucetAccountKeyName, ibc.WalletAmount{
- Address: interchainAccAddr,
- Amount: testvalues.StartingTokenAmount,
- Denom: chainB.Config().Denom,
- })
- s.Require().NoError(err)
- })
-
- t.Run("execute proposal for MsgSendTx", func(t *testing.T) {
- msgBankSend := &banktypes.MsgSend{
- FromAddress: interchainAccAddr,
- ToAddress: chainBAddress,
- Amount: sdk.NewCoins(testvalues.DefaultTransferAmount(chainB.Config().Denom)),
- }
-
- cdc := testsuite.Codec()
- bz, err := icatypes.SerializeCosmosTx(cdc, []proto.Message{msgBankSend})
- s.Require().NoError(err)
-
- packetData := icatypes.InterchainAccountPacketData{
- Type: icatypes.EXECUTE_TX,
- Data: bz,
- Memo: "e2e",
- }
-
- msgSendTx := controllertypes.NewMsgSendTx(govModuleAddress.String(), ibctesting.FirstConnectionID, uint64(time.Hour.Nanoseconds()), packetData)
- s.ExecuteGovProposalV1(ctx, msgSendTx, chainA, controllerAccount, 2)
- })
-
- t.Run("verify tokens transferred", func(t *testing.T) {
- balance, err := chainB.GetBalance(ctx, chainBAccount.FormattedAddress(), chainB.Config().Denom)
- s.Require().NoError(err)
-
- _, err = chainB.GetBalance(ctx, interchainAccAddr, chainB.Config().Denom)
- s.Require().NoError(err)
-
- expected := testvalues.IBCTransferAmount + testvalues.StartingTokenAmount
- s.Require().Equal(expected, balance)
- })
- })
-}
diff --git a/e2e/tests/interchain_accounts/groups_test.go b/e2e/tests/interchain_accounts/groups_test.go
deleted file mode 100644
index 80ac49e3513..00000000000
--- a/e2e/tests/interchain_accounts/groups_test.go
+++ /dev/null
@@ -1,214 +0,0 @@
-package interchain_accounts
-
-import (
- "context"
- "testing"
- "time"
-
- sdk "github.com/cosmos/cosmos-sdk/types"
- banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
- grouptypes "github.com/cosmos/cosmos-sdk/x/group"
- "github.com/cosmos/gogoproto/proto"
- ibctest "github.com/strangelove-ventures/ibctest/v7"
- "github.com/strangelove-ventures/ibctest/v7/ibc"
- test "github.com/strangelove-ventures/ibctest/v7/testutil"
- "github.com/stretchr/testify/suite"
-
- "github.com/cosmos/ibc-go/e2e/testsuite"
- "github.com/cosmos/ibc-go/e2e/testvalues"
- controllertypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/types"
- icatypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/types"
- ibctesting "github.com/cosmos/ibc-go/v7/testing"
-)
-
-const (
- // DefaultGroupMemberWeight is the members voting weight.
- // A group members weight is used in the sum of `YES` votes required to meet a decision policy threshold.
- DefaultGroupMemberWeight = "1"
-
- // DefaultGroupThreshold is the minimum weighted sum of `YES` votes that must be met or
- // exceeded for a proposal to succeed.
- DefaultGroupThreshold = "1"
-
- // DefaultMetadata defines a resusable metadata string for testing purposes
- DefaultMetadata = "custom metadata"
-
- // DefaultMinExecutionPeriod is the minimum duration after the proposal submission
- // where members can start sending MsgExec. This means that the window for
- // sending a MsgExec transaction is:
- // `[ submission + min_execution_period ; submission + voting_period + max_execution_period]`
- // where max_execution_period is a app-specific config, defined in the keeper.
- // If not set, min_execution_period will default to 0.
- DefaultMinExecutionPeriod = time.Duration(0)
-
- // DefaultVotingPeriod is the duration from submission of a proposal to the end of voting period
- // Within this times votes can be submitted with MsgVote.
- DefaultVotingPeriod = time.Minute
-
- // InitialGroupID is the first group ID generated by x/group
- InitialGroupID = 1
-
- // InitialProposalID is the first group proposal ID generated by x/group
- InitialProposalID = 1
-)
-
-func TestInterchainAccountsGroupsTestSuite(t *testing.T) {
- suite.Run(t, new(InterchainAccountsGroupsTestSuite))
-}
-
-type InterchainAccountsGroupsTestSuite struct {
- testsuite.E2ETestSuite
-}
-
-func (s *InterchainAccountsGroupsTestSuite) QueryGroupPolicyAddress(ctx context.Context, chain ibc.Chain) string {
- queryClient := s.GetChainGRCPClients(chain).GroupsQueryClient
- res, err := queryClient.GroupPoliciesByGroup(ctx, &grouptypes.QueryGroupPoliciesByGroupRequest{
- GroupId: InitialGroupID, // always use the initial group id
- })
- s.Require().NoError(err)
-
- return res.GroupPolicies[0].Address
-}
-
-func (s *InterchainAccountsGroupsTestSuite) TestInterchainAccountsGroupsIntegration() {
- t := s.T()
- ctx := context.TODO()
-
- var (
- groupPolicyAddr string
- interchainAccAddr string
- err error
- )
-
- // setup relayers and connection-0 between two chains
- // channel-0 is a transfer channel but it will not be used in this test case
- relayer, _ := s.SetupChainsRelayerAndChannel(ctx)
- chainA, chainB := s.GetChains()
-
- chainAWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
- chainAAddress := chainAWallet.FormattedAddress()
-
- chainBWallet := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount)
- chainBAddress := chainBWallet.FormattedAddress()
-
- t.Run("create group with new threshold decision policy", func(t *testing.T) {
- members := []grouptypes.MemberRequest{
- {
- Address: chainAAddress,
- Weight: DefaultGroupMemberWeight,
- },
- }
-
- decisionPolicy := grouptypes.NewThresholdDecisionPolicy(DefaultGroupThreshold, DefaultVotingPeriod, DefaultMinExecutionPeriod)
- msgCreateGroupWithPolicy, err := grouptypes.NewMsgCreateGroupWithPolicy(chainAAddress, members, DefaultMetadata, DefaultMetadata, true, decisionPolicy)
- s.Require().NoError(err)
-
- txResp, err := s.BroadcastMessages(ctx, chainA, chainAWallet, msgCreateGroupWithPolicy)
- s.Require().NoError(err)
- s.AssertValidTxResponse(txResp)
- })
-
- t.Run("submit proposal for MsgRegisterInterchainAccount", func(t *testing.T) {
- groupPolicyAddr = s.QueryGroupPolicyAddress(ctx, chainA)
- msgRegisterAccount := controllertypes.NewMsgRegisterInterchainAccount(ibctesting.FirstConnectionID, groupPolicyAddr, icatypes.NewDefaultMetadataString(ibctesting.FirstConnectionID, ibctesting.FirstConnectionID))
-
- msgSubmitProposal, err := grouptypes.NewMsgSubmitProposal(groupPolicyAddr, []string{chainAAddress}, []sdk.Msg{msgRegisterAccount}, DefaultMetadata, grouptypes.Exec_EXEC_UNSPECIFIED, "e2e groups proposal: for MsgRegisterInterchainAccount", "e2e groups proposal: for MsgRegisterInterchainAccount")
- s.Require().NoError(err)
-
- txResp, err := s.BroadcastMessages(ctx, chainA, chainAWallet, msgSubmitProposal)
- s.Require().NoError(err)
- s.AssertValidTxResponse(txResp)
- })
-
- t.Run("vote and exec proposal", func(t *testing.T) {
- msgVote := &grouptypes.MsgVote{
- ProposalId: InitialProposalID,
- Voter: chainAAddress,
- Option: grouptypes.VOTE_OPTION_YES,
- Exec: grouptypes.Exec_EXEC_TRY,
- }
-
- txResp, err := s.BroadcastMessages(ctx, chainA, chainAWallet, msgVote)
- s.Require().NoError(err)
- s.AssertValidTxResponse(txResp)
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("verify interchain account registration success", func(t *testing.T) {
- interchainAccAddr, err = s.QueryInterchainAccount(ctx, chainA, groupPolicyAddr, ibctesting.FirstConnectionID)
- s.Require().NotEmpty(interchainAccAddr)
- s.Require().NoError(err)
-
- channels, err := relayer.GetChannels(ctx, s.GetRelayerExecReporter(), chainA.Config().ChainID)
- s.Require().NoError(err)
- s.Require().Equal(len(channels), 2) // 1 transfer (created by default), 1 interchain-accounts
- })
-
- t.Run("fund interchain account wallet", func(t *testing.T) {
- err := chainB.SendFunds(ctx, ibctest.FaucetAccountKeyName, ibc.WalletAmount{
- Address: interchainAccAddr,
- Amount: testvalues.StartingTokenAmount,
- Denom: chainB.Config().Denom,
- })
- s.Require().NoError(err)
- })
-
- t.Run("submit proposal for MsgSendTx", func(t *testing.T) {
- msgBankSend := &banktypes.MsgSend{
- FromAddress: interchainAccAddr,
- ToAddress: chainBAddress,
- Amount: sdk.NewCoins(testvalues.DefaultTransferAmount(chainB.Config().Denom)),
- }
-
- cdc := testsuite.Codec()
-
- bz, err := icatypes.SerializeCosmosTx(cdc, []proto.Message{msgBankSend})
- s.Require().NoError(err)
-
- packetData := icatypes.InterchainAccountPacketData{
- Type: icatypes.EXECUTE_TX,
- Data: bz,
- Memo: "e2e",
- }
-
- msgSubmitTx := controllertypes.NewMsgSendTx(groupPolicyAddr, ibctesting.FirstConnectionID, uint64(time.Hour.Nanoseconds()), packetData)
- msgSubmitProposal, err := grouptypes.NewMsgSubmitProposal(groupPolicyAddr, []string{chainAAddress}, []sdk.Msg{msgSubmitTx}, DefaultMetadata, grouptypes.Exec_EXEC_UNSPECIFIED, "e2e groups proposal: for MsgRegisterInterchainAccount", "e2e groups proposal: for MsgRegisterInterchainAccount")
- s.Require().NoError(err)
-
- txResp, err := s.BroadcastMessages(ctx, chainA, chainAWallet, msgSubmitProposal)
- s.Require().NoError(err)
- s.AssertValidTxResponse(txResp)
- })
-
- t.Run("vote and exec proposal", func(t *testing.T) {
- msgVote := &grouptypes.MsgVote{
- ProposalId: InitialProposalID + 1,
- Voter: chainAAddress,
- Option: grouptypes.VOTE_OPTION_YES,
- Exec: grouptypes.Exec_EXEC_TRY,
- }
-
- txResp, err := s.BroadcastMessages(ctx, chainA, chainAWallet, msgVote)
- s.Require().NoError(err)
- s.AssertValidTxResponse(txResp)
- })
-
- t.Run("verify tokens transferred", func(t *testing.T) {
- s.Require().NoError(test.WaitForBlocks(ctx, 10, chainA, chainB), "failed to wait for blocks")
-
- balance, err := chainB.GetBalance(ctx, chainBAddress, chainB.Config().Denom)
- s.Require().NoError(err)
-
- expected := testvalues.IBCTransferAmount + testvalues.StartingTokenAmount
- s.Require().Equal(expected, balance)
-
- balance, err = chainB.GetBalance(ctx, interchainAccAddr, chainB.Config().Denom)
- s.Require().NoError(err)
-
- expected = testvalues.StartingTokenAmount - testvalues.IBCTransferAmount
- s.Require().Equal(expected, balance)
- })
-}
diff --git a/e2e/tests/interchain_accounts/incentivized_test.go b/e2e/tests/interchain_accounts/incentivized_test.go
deleted file mode 100644
index 8675be1cbf1..00000000000
--- a/e2e/tests/interchain_accounts/incentivized_test.go
+++ /dev/null
@@ -1,393 +0,0 @@
-package interchain_accounts
-
-import (
- "context"
- "testing"
- "time"
-
- sdk "github.com/cosmos/cosmos-sdk/types"
- banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
- "github.com/cosmos/gogoproto/proto"
- ibctest "github.com/strangelove-ventures/ibctest/v7"
- "github.com/strangelove-ventures/ibctest/v7/chain/cosmos"
- "github.com/strangelove-ventures/ibctest/v7/ibc"
- test "github.com/strangelove-ventures/ibctest/v7/testutil"
- "github.com/stretchr/testify/suite"
-
- "github.com/cosmos/ibc-go/e2e/testconfig"
- "github.com/cosmos/ibc-go/e2e/testsuite"
- "github.com/cosmos/ibc-go/e2e/testvalues"
- controllertypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/types"
- icatypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/types"
- feetypes "github.com/cosmos/ibc-go/v7/modules/apps/29-fee/types"
- ibctesting "github.com/cosmos/ibc-go/v7/testing"
-)
-
-func TestIncentivizedInterchainAccountsTestSuite(t *testing.T) {
- suite.Run(t, new(IncentivizedInterchainAccountsTestSuite))
-}
-
-type IncentivizedInterchainAccountsTestSuite struct {
- InterchainAccountsTestSuite
-}
-
-// RegisterCounterPartyPayee broadcasts a MsgRegisterCounterpartyPayee message.
-func (s *IncentivizedInterchainAccountsTestSuite) RegisterCounterPartyPayee(ctx context.Context, chain *cosmos.CosmosChain,
- user ibc.Wallet, portID, channelID, relayerAddr, counterpartyPayeeAddr string,
-) (sdk.TxResponse, error) {
- msg := feetypes.NewMsgRegisterCounterpartyPayee(portID, channelID, relayerAddr, counterpartyPayeeAddr)
- return s.BroadcastMessages(ctx, chain, user, msg)
-}
-
-func (s *IncentivizedInterchainAccountsTestSuite) TestMsgSendTx_SuccessfulBankSend_Incentivized() {
- t := s.T()
- ctx := context.TODO()
-
- // setup relayers and connection-0 between two chains
- // channel-0 is a transfer channel but it will not be used in this test case
- relayer, _ := s.SetupChainsRelayerAndChannel(ctx)
- chainA, chainB := s.GetChains()
-
- var (
- chainADenom = chainA.Config().Denom
- interchainAcc = ""
- testFee = testvalues.DefaultFee(chainADenom)
- )
-
- t.Run("relayer wallets recovered", func(t *testing.T) {
- err := s.RecoverRelayerWallets(ctx, relayer)
- s.Require().NoError(err)
- })
-
- chainARelayerWallet, chainBRelayerWallet, err := s.GetRelayerWallets(relayer)
- t.Run("relayer wallets fetched", func(t *testing.T) {
- s.Require().NoError(err)
- })
-
- s.Require().NoError(test.WaitForBlocks(ctx, 5, chainA, chainB), "failed to wait for blocks")
-
- chainARelayerUser, chainBRelayerUser := s.GetRelayerUsers(ctx)
- relayerAStartingBalance, err := s.GetChainANativeBalance(ctx, chainARelayerUser)
- s.Require().NoError(err)
- t.Logf("relayer A user starting with balance: %d", relayerAStartingBalance)
-
- controllerAccount := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
- chainBAccount := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount)
-
- t.Run("broadcast MsgRegisterInterchainAccount", func(t *testing.T) {
- version := getICAVersion(testconfig.GetChainATag(), testconfig.GetChainBTag())
- msgRegisterAccount := controllertypes.NewMsgRegisterInterchainAccount(ibctesting.FirstConnectionID, controllerAccount.FormattedAddress(), version)
-
- txResp, err := s.BroadcastMessages(ctx, chainA, controllerAccount, msgRegisterAccount)
- s.Require().NoError(err)
- s.AssertValidTxResponse(txResp)
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- var channelOutput ibc.ChannelOutput
- t.Run("verify interchain account", func(t *testing.T) {
- var err error
- interchainAcc, err = s.QueryInterchainAccount(ctx, chainA, controllerAccount.FormattedAddress(), ibctesting.FirstConnectionID)
- s.Require().NoError(err)
- s.Require().NotZero(len(interchainAcc))
-
- channels, err := relayer.GetChannels(ctx, s.GetRelayerExecReporter(), chainA.Config().ChainID)
- s.Require().NoError(err)
- s.Require().Equal(len(channels), 2)
-
- // interchain accounts channel at index: 0
- channelOutput = channels[0]
-
- s.Require().NoError(test.WaitForBlocks(ctx, 2, chainA, chainB))
- })
-
- t.Run("execute interchain account bank send through controller", func(t *testing.T) {
- t.Run("fund interchain account wallet on host chainB", func(t *testing.T) {
- // fund the interchain account so it has some $$ to send
- err := chainB.SendFunds(ctx, ibctest.FaucetAccountKeyName, ibc.WalletAmount{
- Address: interchainAcc,
- Amount: testvalues.StartingTokenAmount,
- Denom: chainB.Config().Denom,
- })
- s.Require().NoError(err)
- })
-
- t.Run("register counterparty payee", func(t *testing.T) {
- resp, err := s.RegisterCounterPartyPayee(ctx, chainB, chainBRelayerUser, channelOutput.Counterparty.PortID, channelOutput.Counterparty.ChannelID, chainBRelayerWallet.FormattedAddress(), chainARelayerWallet.FormattedAddress())
- s.Require().NoError(err)
- s.AssertValidTxResponse(resp)
- })
-
- t.Run("verify counterparty payee", func(t *testing.T) {
- address, err := s.QueryCounterPartyPayee(ctx, chainB, chainBRelayerWallet.FormattedAddress(), channelOutput.Counterparty.ChannelID)
- s.Require().NoError(err)
- s.Require().Equal(chainARelayerWallet.FormattedAddress(), address)
- })
-
- t.Run("no incentivized packets", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelOutput.PortID, channelOutput.ChannelID)
- s.Require().NoError(err)
- s.Require().Empty(packets)
- })
-
- t.Run("stop relayer", func(t *testing.T) {
- s.StopRelayer(ctx, relayer)
- })
-
- t.Run("broadcast incentivized MsgSendTx", func(t *testing.T) {
- msgPayPacketFee := &feetypes.MsgPayPacketFee{
- Fee: testvalues.DefaultFee(chainADenom),
- SourcePortId: channelOutput.PortID,
- SourceChannelId: channelOutput.ChannelID,
- Signer: controllerAccount.FormattedAddress(),
- }
-
- msgSend := &banktypes.MsgSend{
- FromAddress: interchainAcc,
- ToAddress: chainBAccount.FormattedAddress(),
- Amount: sdk.NewCoins(testvalues.DefaultTransferAmount(chainB.Config().Denom)),
- }
-
- cdc := testsuite.Codec()
- bz, err := icatypes.SerializeCosmosTx(cdc, []proto.Message{msgSend})
- s.Require().NoError(err)
-
- packetData := icatypes.InterchainAccountPacketData{
- Type: icatypes.EXECUTE_TX,
- Data: bz,
- Memo: "e2e",
- }
-
- msgSendTx := controllertypes.NewMsgSendTx(controllerAccount.FormattedAddress(), ibctesting.FirstConnectionID, uint64(time.Hour.Nanoseconds()), packetData)
-
- resp, err := s.BroadcastMessages(ctx, chainA, controllerAccount, msgPayPacketFee, msgSendTx)
- s.AssertValidTxResponse(resp)
- s.Require().NoError(err)
-
- s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB))
- })
-
- t.Run("there should be incentivized packets", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelOutput.PortID, channelOutput.ChannelID)
- s.Require().NoError(err)
- s.Require().Len(packets, 1)
- actualFee := packets[0].PacketFees[0].Fee
-
- s.Require().True(actualFee.RecvFee.IsEqual(testFee.RecvFee))
- s.Require().True(actualFee.AckFee.IsEqual(testFee.AckFee))
- s.Require().True(actualFee.TimeoutFee.IsEqual(testFee.TimeoutFee))
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("packets are relayed", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelOutput.PortID, channelOutput.ChannelID)
- s.Require().NoError(err)
- s.Require().Empty(packets)
- })
-
- t.Run("verify interchain account sent tokens", func(t *testing.T) {
- balance, err := chainB.GetBalance(ctx, chainBAccount.FormattedAddress(), chainB.Config().Denom)
- s.Require().NoError(err)
-
- _, err = chainB.GetBalance(ctx, interchainAcc, chainB.Config().Denom)
- s.Require().NoError(err)
-
- expected := testvalues.IBCTransferAmount + testvalues.StartingTokenAmount
- s.Require().Equal(expected, balance)
- })
-
- t.Run("timeout fee is refunded", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, controllerAccount)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - testFee.AckFee.AmountOf(chainADenom).Int64() - testFee.RecvFee.AmountOf(chainADenom).Int64()
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("relayerA is paid ack and recv fee", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, chainARelayerUser)
- s.Require().NoError(err)
-
- expected := relayerAStartingBalance + testFee.AckFee.AmountOf(chainADenom).Int64() + testFee.RecvFee.AmountOf(chainADenom).Int64()
- s.Require().Equal(expected, actualBalance)
- })
- })
-}
-
-func (s *IncentivizedInterchainAccountsTestSuite) TestMsgSendTx_FailedBankSend_Incentivized() {
- t := s.T()
- ctx := context.TODO()
-
- // setup relayers and connection-0 between two chains
- // channel-0 is a transfer channel but it will not be used in this test case
- relayer, _ := s.SetupChainsRelayerAndChannel(ctx)
- chainA, chainB := s.GetChains()
-
- var (
- chainADenom = chainA.Config().Denom
- interchainAcc = ""
- testFee = testvalues.DefaultFee(chainADenom)
- )
-
- t.Run("relayer wallets recovered", func(t *testing.T) {
- err := s.RecoverRelayerWallets(ctx, relayer)
- s.Require().NoError(err)
- })
-
- chainARelayerWallet, chainBRelayerWallet, err := s.GetRelayerWallets(relayer)
- t.Run("relayer wallets fetched", func(t *testing.T) {
- s.Require().NoError(err)
- })
-
- s.Require().NoError(test.WaitForBlocks(ctx, 5, chainA, chainB), "failed to wait for blocks")
-
- chainARelayerUser, chainBRelayerUser := s.GetRelayerUsers(ctx)
- relayerAStartingBalance, err := s.GetChainANativeBalance(ctx, chainARelayerUser)
- s.Require().NoError(err)
- t.Logf("relayer A user starting with balance: %d", relayerAStartingBalance)
-
- controllerAccount := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
- chainBAccount := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount)
-
- t.Run("broadcast MsgRegisterInterchainAccount", func(t *testing.T) {
- version := getICAVersion(testconfig.GetChainATag(), testconfig.GetChainBTag())
- msgRegisterAccount := controllertypes.NewMsgRegisterInterchainAccount(ibctesting.FirstConnectionID, controllerAccount.FormattedAddress(), version)
-
- txResp, err := s.BroadcastMessages(ctx, chainA, controllerAccount, msgRegisterAccount)
- s.Require().NoError(err)
- s.AssertValidTxResponse(txResp)
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- var channelOutput ibc.ChannelOutput
- t.Run("verify interchain account", func(t *testing.T) {
- var err error
- interchainAcc, err = s.QueryInterchainAccount(ctx, chainA, controllerAccount.FormattedAddress(), ibctesting.FirstConnectionID)
- s.Require().NoError(err)
- s.Require().NotZero(len(interchainAcc))
-
- channels, err := relayer.GetChannels(ctx, s.GetRelayerExecReporter(), chainA.Config().ChainID)
- s.Require().NoError(err)
- s.Require().Equal(len(channels), 2)
-
- // interchain accounts channel at index: 0
- channelOutput = channels[0]
-
- s.Require().NoError(test.WaitForBlocks(ctx, 2, chainA, chainB))
- })
-
- t.Run("execute interchain account bank send through controller", func(t *testing.T) {
- t.Run("register counterparty payee", func(t *testing.T) {
- resp, err := s.RegisterCounterPartyPayee(ctx, chainB, chainBRelayerUser, channelOutput.Counterparty.PortID, channelOutput.Counterparty.ChannelID, chainBRelayerWallet.FormattedAddress(), chainARelayerWallet.FormattedAddress())
- s.Require().NoError(err)
- s.AssertValidTxResponse(resp)
- })
-
- t.Run("verify counterparty payee", func(t *testing.T) {
- address, err := s.QueryCounterPartyPayee(ctx, chainB, chainBRelayerWallet.FormattedAddress(), channelOutput.Counterparty.ChannelID)
- s.Require().NoError(err)
- s.Require().Equal(chainARelayerWallet.FormattedAddress(), address)
- })
-
- t.Run("no incentivized packets", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelOutput.PortID, channelOutput.ChannelID)
- s.Require().NoError(err)
- s.Require().Empty(packets)
- })
-
- t.Run("stop relayer", func(t *testing.T) {
- err := relayer.StopRelayer(ctx, s.GetRelayerExecReporter())
- s.Require().NoError(err)
- })
-
- t.Run("broadcast incentivized MsgSendTx", func(t *testing.T) {
- msgPayPacketFee := &feetypes.MsgPayPacketFee{
- Fee: testvalues.DefaultFee(chainADenom),
- SourcePortId: channelOutput.PortID,
- SourceChannelId: channelOutput.ChannelID,
- Signer: controllerAccount.FormattedAddress(),
- }
-
- msgSend := &banktypes.MsgSend{
- FromAddress: interchainAcc,
- ToAddress: chainBAccount.FormattedAddress(),
- Amount: sdk.NewCoins(testvalues.DefaultTransferAmount(chainB.Config().Denom)),
- }
-
- cdc := testsuite.Codec()
- bz, err := icatypes.SerializeCosmosTx(cdc, []proto.Message{msgSend})
- s.Require().NoError(err)
-
- packetData := icatypes.InterchainAccountPacketData{
- Type: icatypes.EXECUTE_TX,
- Data: bz,
- Memo: "e2e",
- }
-
- msgSendTx := controllertypes.NewMsgSendTx(controllerAccount.FormattedAddress(), ibctesting.FirstConnectionID, uint64(time.Hour.Nanoseconds()), packetData)
-
- resp, err := s.BroadcastMessages(ctx, chainA, controllerAccount, msgPayPacketFee, msgSendTx)
- s.AssertValidTxResponse(resp)
- s.Require().NoError(err)
-
- s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB))
- })
-
- t.Run("there should be incentivized packets", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelOutput.PortID, channelOutput.ChannelID)
- s.Require().NoError(err)
- s.Require().Len(packets, 1)
- actualFee := packets[0].PacketFees[0].Fee
-
- s.Require().True(actualFee.RecvFee.IsEqual(testFee.RecvFee))
- s.Require().True(actualFee.AckFee.IsEqual(testFee.AckFee))
- s.Require().True(actualFee.TimeoutFee.IsEqual(testFee.TimeoutFee))
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("packets are relayed", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelOutput.PortID, channelOutput.ChannelID)
- s.Require().NoError(err)
- s.Require().Empty(packets)
- })
-
- t.Run("verify interchain account did not send tokens", func(t *testing.T) {
- balance, err := chainB.GetBalance(ctx, chainBAccount.FormattedAddress(), chainB.Config().Denom)
- s.Require().NoError(err)
-
- _, err = chainB.GetBalance(ctx, interchainAcc, chainB.Config().Denom)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount
- s.Require().Equal(expected, balance, "tokens should not have been sent as interchain account was not funded")
- })
-
- t.Run("timeout fee is refunded", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, controllerAccount)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - testFee.AckFee.AmountOf(chainADenom).Int64() - testFee.RecvFee.AmountOf(chainADenom).Int64()
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("relayerA is paid ack and recv fee", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, chainARelayerUser)
- s.Require().NoError(err)
-
- expected := relayerAStartingBalance + testFee.AckFee.AmountOf(chainADenom).Int64() + testFee.RecvFee.AmountOf(chainADenom).Int64()
- s.Require().Equal(expected, actualBalance)
- })
- })
-}
diff --git a/e2e/tests/interchain_accounts/intertx_incentivized_test.go b/e2e/tests/interchain_accounts/intertx_incentivized_test.go
deleted file mode 100644
index 9464844fdca..00000000000
--- a/e2e/tests/interchain_accounts/intertx_incentivized_test.go
+++ /dev/null
@@ -1,355 +0,0 @@
-package interchain_accounts
-
-import (
- "context"
- "testing"
-
- sdk "github.com/cosmos/cosmos-sdk/types"
- banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
- intertxtypes "github.com/cosmos/interchain-accounts/x/inter-tx/types"
- "github.com/strangelove-ventures/ibctest/v7"
- "github.com/strangelove-ventures/ibctest/v7/ibc"
- test "github.com/strangelove-ventures/ibctest/v7/testutil"
- "github.com/stretchr/testify/suite"
-
- "github.com/cosmos/ibc-go/e2e/testvalues"
- feetypes "github.com/cosmos/ibc-go/v7/modules/apps/29-fee/types"
- ibctesting "github.com/cosmos/ibc-go/v7/testing"
-)
-
-func TestIncentivizedInterTxTestSuite(t *testing.T) {
- suite.Run(t, new(IncentivizedInterTxTestSuite))
-}
-
-type IncentivizedInterTxTestSuite struct {
- InterTxTestSuite
-}
-
-func (s *IncentivizedInterTxTestSuite) TestMsgSubmitTx_SuccessfulBankSend_Incentivized() {
- t := s.T()
- ctx := context.TODO()
-
- // setup relayers and connection-0 between two chains
- // channel-0 is a transfer channel but it will not be used in this test case
- relayer, _ := s.SetupChainsRelayerAndChannel(ctx)
- chainA, chainB := s.GetChains()
-
- var (
- chainADenom = chainA.Config().Denom
- interchainAcc = ""
- testFee = testvalues.DefaultFee(chainADenom)
- )
-
- t.Run("relayer wallets recovered", func(t *testing.T) {
- err := s.RecoverRelayerWallets(ctx, relayer)
- s.Require().NoError(err)
- })
-
- chainARelayerWallet, chainBRelayerWallet, err := s.GetRelayerWallets(relayer)
- t.Run("relayer wallets fetched", func(t *testing.T) {
- s.Require().NoError(err)
- })
-
- s.Require().NoError(test.WaitForBlocks(ctx, 5, chainA, chainB), "failed to wait for blocks")
-
- chainARelayerUser, chainBRelayerUser := s.GetRelayerUsers(ctx)
- relayerAStartingBalance, err := s.GetChainANativeBalance(ctx, chainARelayerUser)
- s.Require().NoError(err)
- t.Logf("relayer A user starting with balance: %d", relayerAStartingBalance)
-
- controllerAccount := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
- chainBAccount := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount)
-
- t.Run("register interchain account", func(t *testing.T) {
- version := "" // allow app to handle the version as appropriate.
- msgRegisterAccount := intertxtypes.NewMsgRegisterAccount(controllerAccount.FormattedAddress(), ibctesting.FirstConnectionID, version)
- err := s.RegisterInterchainAccount(ctx, chainA, controllerAccount, msgRegisterAccount)
- s.Require().NoError(err)
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- var channelOutput ibc.ChannelOutput
- t.Run("verify interchain account", func(t *testing.T) {
- var err error
- interchainAcc, err = s.QueryInterchainAccountLegacy(ctx, chainA, controllerAccount.FormattedAddress(), ibctesting.FirstConnectionID)
- s.Require().NoError(err)
- s.Require().NotZero(len(interchainAcc))
-
- channels, err := relayer.GetChannels(ctx, s.GetRelayerExecReporter(), chainA.Config().ChainID)
- s.Require().NoError(err)
- s.Require().Equal(len(channels), 2)
-
- // interchain accounts channel at index: 0
- channelOutput = channels[0]
- })
-
- t.Run("execute interchain account bank send through controller", func(t *testing.T) {
- t.Run("fund interchain account wallet on host chainB", func(t *testing.T) {
- // fund the interchain account so it has some $$ to send
- err := chainB.SendFunds(ctx, ibctest.FaucetAccountKeyName, ibc.WalletAmount{
- Address: interchainAcc,
- Amount: testvalues.StartingTokenAmount,
- Denom: chainB.Config().Denom,
- })
- s.Require().NoError(err)
- })
-
- t.Run("register counterparty payee", func(t *testing.T) {
- resp, err := s.RegisterCounterPartyPayee(ctx, chainB, chainBRelayerUser, channelOutput.Counterparty.PortID, channelOutput.Counterparty.ChannelID, chainBRelayerWallet.FormattedAddress(), chainARelayerWallet.FormattedAddress())
- s.Require().NoError(err)
- s.AssertValidTxResponse(resp)
- })
-
- t.Run("verify counterparty payee", func(t *testing.T) {
- address, err := s.QueryCounterPartyPayee(ctx, chainB, chainBRelayerWallet.FormattedAddress(), channelOutput.Counterparty.ChannelID)
- s.Require().NoError(err)
- s.Require().Equal(chainARelayerWallet.FormattedAddress(), address)
- })
-
- t.Run("no incentivized packets", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelOutput.PortID, channelOutput.ChannelID)
- s.Require().NoError(err)
- s.Require().Empty(packets)
- })
-
- t.Run("stop relayer", func(t *testing.T) {
- s.StopRelayer(ctx, relayer)
- })
-
- t.Run("broadcast incentivized MsgSubmitTx", func(t *testing.T) {
- msgPayPacketFee := &feetypes.MsgPayPacketFee{
- Fee: testvalues.DefaultFee(chainADenom),
- SourcePortId: channelOutput.PortID,
- SourceChannelId: channelOutput.ChannelID,
- Signer: controllerAccount.FormattedAddress(),
- }
-
- msgSend := &banktypes.MsgSend{
- FromAddress: interchainAcc,
- ToAddress: chainBAccount.FormattedAddress(),
- Amount: sdk.NewCoins(testvalues.DefaultTransferAmount(chainB.Config().Denom)),
- }
-
- msgSubmitTx, err := intertxtypes.NewMsgSubmitTx(msgSend, ibctesting.FirstConnectionID, controllerAccount.FormattedAddress())
- s.Require().NoError(err)
-
- resp, err := s.BroadcastMessages(ctx, chainA, controllerAccount, msgPayPacketFee, msgSubmitTx)
- s.AssertValidTxResponse(resp)
- s.Require().NoError(err)
-
- s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB))
- })
-
- t.Run("there should be incentivized packets", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelOutput.PortID, channelOutput.ChannelID)
- s.Require().NoError(err)
- s.Require().Len(packets, 1)
- actualFee := packets[0].PacketFees[0].Fee
-
- s.Require().True(actualFee.RecvFee.IsEqual(testFee.RecvFee))
- s.Require().True(actualFee.AckFee.IsEqual(testFee.AckFee))
- s.Require().True(actualFee.TimeoutFee.IsEqual(testFee.TimeoutFee))
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("packets are relayed", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelOutput.PortID, channelOutput.ChannelID)
- s.Require().NoError(err)
- s.Require().Empty(packets)
- })
-
- t.Run("verify interchain account sent tokens", func(t *testing.T) {
- balance, err := chainB.GetBalance(ctx, chainBAccount.FormattedAddress(), chainB.Config().Denom)
- s.Require().NoError(err)
-
- _, err = chainB.GetBalance(ctx, interchainAcc, chainB.Config().Denom)
- s.Require().NoError(err)
-
- expected := testvalues.IBCTransferAmount + testvalues.StartingTokenAmount
- s.Require().Equal(expected, balance)
- })
-
- t.Run("timeout fee is refunded", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, controllerAccount)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - testFee.AckFee.AmountOf(chainADenom).Int64() - testFee.RecvFee.AmountOf(chainADenom).Int64()
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("relayerA is paid ack and recv fee", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, chainARelayerUser)
- s.Require().NoError(err)
-
- expected := relayerAStartingBalance + testFee.AckFee.AmountOf(chainADenom).Int64() + testFee.RecvFee.AmountOf(chainADenom).Int64()
- s.Require().Equal(expected, actualBalance)
- })
- })
-}
-
-func (s *IncentivizedInterTxTestSuite) TestMsgSubmitTx_FailedBankSend_Incentivized() {
- t := s.T()
- ctx := context.TODO()
-
- // setup relayers and connection-0 between two chains
- // channel-0 is a transfer channel but it will not be used in this test case
- relayer, _ := s.SetupChainsRelayerAndChannel(ctx)
- chainA, chainB := s.GetChains()
-
- var (
- chainADenom = chainA.Config().Denom
- interchainAcc = ""
- testFee = testvalues.DefaultFee(chainADenom)
- )
-
- t.Run("relayer wallets recovered", func(t *testing.T) {
- err := s.RecoverRelayerWallets(ctx, relayer)
- s.Require().NoError(err)
- })
-
- chainARelayerWallet, chainBRelayerWallet, err := s.GetRelayerWallets(relayer)
- t.Run("relayer wallets fetched", func(t *testing.T) {
- s.Require().NoError(err)
- })
-
- s.Require().NoError(test.WaitForBlocks(ctx, 5, chainA, chainB), "failed to wait for blocks")
-
- chainARelayerUser, chainBRelayerUser := s.GetRelayerUsers(ctx)
- relayerAStartingBalance, err := s.GetChainANativeBalance(ctx, chainARelayerUser)
- s.Require().NoError(err)
- t.Logf("relayer A user starting with balance: %d", relayerAStartingBalance)
-
- controllerAccount := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
- chainBAccount := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount)
-
- t.Run("register interchain account", func(t *testing.T) {
- version := "" // allow app to handle the version as appropriate.
- msgRegisterAccount := intertxtypes.NewMsgRegisterAccount(controllerAccount.FormattedAddress(), ibctesting.FirstConnectionID, version)
- err := s.RegisterInterchainAccount(ctx, chainA, controllerAccount, msgRegisterAccount)
- s.Require().NoError(err)
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- var channelOutput ibc.ChannelOutput
- t.Run("verify interchain account", func(t *testing.T) {
- var err error
- interchainAcc, err = s.QueryInterchainAccountLegacy(ctx, chainA, controllerAccount.FormattedAddress(), ibctesting.FirstConnectionID)
- s.Require().NoError(err)
- s.Require().NotZero(len(interchainAcc))
-
- channels, err := relayer.GetChannels(ctx, s.GetRelayerExecReporter(), chainA.Config().ChainID)
- s.Require().NoError(err)
- s.Require().Equal(len(channels), 2)
-
- // interchain accounts channel at index: 0
- channelOutput = channels[0]
-
- s.Require().NoError(test.WaitForBlocks(ctx, 2, chainA, chainB))
- })
-
- t.Run("execute interchain account bank send through controller", func(t *testing.T) {
- t.Run("register counterparty payee", func(t *testing.T) {
- resp, err := s.RegisterCounterPartyPayee(ctx, chainB, chainBRelayerUser, channelOutput.Counterparty.PortID, channelOutput.Counterparty.ChannelID, chainBRelayerWallet.FormattedAddress(), chainARelayerWallet.FormattedAddress())
- s.Require().NoError(err)
- s.AssertValidTxResponse(resp)
- })
-
- t.Run("verify counterparty payee", func(t *testing.T) {
- address, err := s.QueryCounterPartyPayee(ctx, chainB, chainBRelayerWallet.FormattedAddress(), channelOutput.Counterparty.ChannelID)
- s.Require().NoError(err)
- s.Require().Equal(chainARelayerWallet.FormattedAddress(), address)
- })
-
- t.Run("no incentivized packets", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelOutput.PortID, channelOutput.ChannelID)
- s.Require().NoError(err)
- s.Require().Empty(packets)
- })
-
- t.Run("stop relayer", func(t *testing.T) {
- err := relayer.StopRelayer(ctx, s.GetRelayerExecReporter())
- s.Require().NoError(err)
- })
-
- t.Run("broadcast incentivized MsgSubmitTx", func(t *testing.T) {
- msgPayPacketFee := &feetypes.MsgPayPacketFee{
- Fee: testvalues.DefaultFee(chainADenom),
- SourcePortId: channelOutput.PortID,
- SourceChannelId: channelOutput.ChannelID,
- Signer: controllerAccount.FormattedAddress(),
- }
-
- msgSend := &banktypes.MsgSend{
- FromAddress: interchainAcc,
- ToAddress: chainBAccount.FormattedAddress(),
- Amount: sdk.NewCoins(testvalues.DefaultTransferAmount(chainB.Config().Denom)),
- }
-
- msgSubmitTx, err := intertxtypes.NewMsgSubmitTx(msgSend, ibctesting.FirstConnectionID, controllerAccount.FormattedAddress())
- s.Require().NoError(err)
-
- resp, err := s.BroadcastMessages(ctx, chainA, controllerAccount, msgPayPacketFee, msgSubmitTx)
- s.AssertValidTxResponse(resp)
- s.Require().NoError(err)
-
- s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB))
- })
-
- t.Run("there should be incentivized packets", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelOutput.PortID, channelOutput.ChannelID)
- s.Require().NoError(err)
- s.Require().Len(packets, 1)
- actualFee := packets[0].PacketFees[0].Fee
-
- s.Require().True(actualFee.RecvFee.IsEqual(testFee.RecvFee))
- s.Require().True(actualFee.AckFee.IsEqual(testFee.AckFee))
- s.Require().True(actualFee.TimeoutFee.IsEqual(testFee.TimeoutFee))
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("packets are relayed", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelOutput.PortID, channelOutput.ChannelID)
- s.Require().NoError(err)
- s.Require().Empty(packets)
- })
-
- t.Run("verify interchain account did not send tokens", func(t *testing.T) {
- balance, err := chainB.GetBalance(ctx, chainBAccount.FormattedAddress(), chainB.Config().Denom)
- s.Require().NoError(err)
-
- _, err = chainB.GetBalance(ctx, interchainAcc, chainB.Config().Denom)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount
- s.Require().Equal(expected, balance, "tokens should not have been sent as interchain account was not funded")
- })
-
- t.Run("timeout fee is refunded", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, controllerAccount)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - testFee.AckFee.AmountOf(chainADenom).Int64() - testFee.RecvFee.AmountOf(chainADenom).Int64()
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("relayerA is paid ack and recv fee", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, chainARelayerUser)
- s.Require().NoError(err)
-
- expected := relayerAStartingBalance + testFee.AckFee.AmountOf(chainADenom).Int64() + testFee.RecvFee.AmountOf(chainADenom).Int64()
- s.Require().Equal(expected, actualBalance)
- })
- })
-}
diff --git a/e2e/tests/interchain_accounts/intertx_test.go b/e2e/tests/interchain_accounts/intertx_test.go
deleted file mode 100644
index 9d2942cc810..00000000000
--- a/e2e/tests/interchain_accounts/intertx_test.go
+++ /dev/null
@@ -1,215 +0,0 @@
-package interchain_accounts
-
-import (
- "context"
- "testing"
-
- "github.com/strangelove-ventures/ibctest/v7"
- "github.com/strangelove-ventures/ibctest/v7/chain/cosmos"
- "github.com/strangelove-ventures/ibctest/v7/ibc"
- test "github.com/strangelove-ventures/ibctest/v7/testutil"
- "github.com/stretchr/testify/suite"
-
- sdk "github.com/cosmos/cosmos-sdk/types"
- banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
- intertxtypes "github.com/cosmos/interchain-accounts/x/inter-tx/types"
-
- "github.com/cosmos/ibc-go/e2e/testconfig"
- "github.com/cosmos/ibc-go/e2e/testsuite"
- "github.com/cosmos/ibc-go/e2e/testvalues"
-
- ibctesting "github.com/cosmos/ibc-go/v7/testing"
-)
-
-func TestInterTxTestSuite(t *testing.T) {
- suite.Run(t, new(InterTxTestSuite))
-}
-
-type InterTxTestSuite struct {
- testsuite.E2ETestSuite
-}
-
-// RegisterInterchainAccount will attempt to register an interchain account on the counterparty chain.
-func (s *InterTxTestSuite) RegisterInterchainAccount(ctx context.Context, chain *cosmos.CosmosChain, user ibc.Wallet, msgRegisterAccount *intertxtypes.MsgRegisterAccount) error {
- txResp, err := s.BroadcastMessages(ctx, chain, user, msgRegisterAccount)
- s.Require().NoError(err)
- s.AssertValidTxResponse(txResp)
- return err
-}
-
-func (s *InterTxTestSuite) TestMsgSubmitTx_SuccessfulTransfer() {
- t := s.T()
- ctx := context.TODO()
-
- // setup relayers and connection-0 between two chains
- // channel-0 is a transfer channel but it will not be used in this test case
- relayer, _ := s.SetupChainsRelayerAndChannel(ctx)
- chainA, chainB := s.GetChains()
-
- // setup 2 accounts: controller account on chain A, a second chain B account.
- // host account will be created when the ICA is registered
- controllerAccount := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
- chainBAccount := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount)
- var hostAccount string
-
- t.Run("register interchain account", func(t *testing.T) {
- version := getICAVersion(testconfig.GetChainATag(), testconfig.GetChainBTag())
- msgRegisterAccount := intertxtypes.NewMsgRegisterAccount(controllerAccount.FormattedAddress(), ibctesting.FirstConnectionID, version)
- err := s.RegisterInterchainAccount(ctx, chainA, controllerAccount, msgRegisterAccount)
- s.Require().NoError(err)
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("verify interchain account", func(t *testing.T) {
- var err error
- hostAccount, err = s.QueryInterchainAccountLegacy(ctx, chainA, controllerAccount.FormattedAddress(), ibctesting.FirstConnectionID)
- s.Require().NoError(err)
- s.Require().NotZero(len(hostAccount))
-
- channels, err := relayer.GetChannels(ctx, s.GetRelayerExecReporter(), chainA.Config().ChainID)
- s.Require().NoError(err)
- s.Require().Equal(len(channels), 2)
- })
-
- t.Run("interchain account executes a bank transfer on behalf of the corresponding owner account", func(t *testing.T) {
- t.Run("fund interchain account wallet", func(t *testing.T) {
- // fund the host account account so it has some $$ to send
- err := chainB.SendFunds(ctx, ibctest.FaucetAccountKeyName, ibc.WalletAmount{
- Address: hostAccount,
- Amount: testvalues.StartingTokenAmount,
- Denom: chainB.Config().Denom,
- })
- s.Require().NoError(err)
- })
-
- t.Run("broadcast MsgSubmitTx", func(t *testing.T) {
- // assemble bank transfer message from host account to user account on host chain
- msgSend := &banktypes.MsgSend{
- FromAddress: hostAccount,
- ToAddress: chainBAccount.FormattedAddress(),
- Amount: sdk.NewCoins(testvalues.DefaultTransferAmount(chainB.Config().Denom)),
- }
-
- // assemble submitMessage tx for intertx
- msgSubmitTx, err := intertxtypes.NewMsgSubmitTx(
- msgSend,
- ibctesting.FirstConnectionID,
- controllerAccount.FormattedAddress(),
- )
- s.Require().NoError(err)
-
- // broadcast submitMessage tx from controller account on chain A
- // this message should trigger the sending of an ICA packet over channel-1 (channel created between controller and host)
- // this ICA packet contains the assembled bank transfer message from above, which will be executed by the host account on the host chain.
- resp, err := s.BroadcastMessages(
- ctx,
- chainA,
- controllerAccount,
- msgSubmitTx,
- )
-
- s.AssertValidTxResponse(resp)
- s.Require().NoError(err)
-
- s.Require().NoError(test.WaitForBlocks(ctx, 10, chainA, chainB))
- })
-
- t.Run("verify tokens transferred", func(t *testing.T) {
- balance, err := chainB.GetBalance(ctx, chainBAccount.FormattedAddress(), chainB.Config().Denom)
- s.Require().NoError(err)
-
- _, err = chainB.GetBalance(ctx, hostAccount, chainB.Config().Denom)
- s.Require().NoError(err)
-
- expected := testvalues.IBCTransferAmount + testvalues.StartingTokenAmount
- s.Require().Equal(expected, balance)
- })
- })
-}
-
-func (s *InterTxTestSuite) TestMsgSubmitTx_FailedTransfer_InsufficientFunds() {
- t := s.T()
- ctx := context.TODO()
-
- // setup relayers and connection-0 between two chains
- // channel-0 is a transfer channel but it will not be used in this test case
- relayer, _ := s.SetupChainsRelayerAndChannel(ctx)
- chainA, chainB := s.GetChains()
-
- // setup 2 accounts: controller account on chain A, a second chain B account.
- // host account will be created when the ICA is registered
- controllerAccount := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
- chainBAccount := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount)
- var hostAccount string
-
- t.Run("register interchain account", func(t *testing.T) {
- version := getICAVersion(testconfig.GetChainATag(), testconfig.GetChainBTag())
- msgRegisterAccount := intertxtypes.NewMsgRegisterAccount(controllerAccount.FormattedAddress(), ibctesting.FirstConnectionID, version)
- err := s.RegisterInterchainAccount(ctx, chainA, controllerAccount, msgRegisterAccount)
- s.Require().NoError(err)
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("verify interchain account", func(t *testing.T) {
- var err error
- hostAccount, err = s.QueryInterchainAccountLegacy(ctx, chainA, controllerAccount.FormattedAddress(), ibctesting.FirstConnectionID)
- s.Require().NoError(err)
- s.Require().NotZero(len(hostAccount))
-
- channels, err := relayer.GetChannels(ctx, s.GetRelayerExecReporter(), chainA.Config().ChainID)
- s.Require().NoError(err)
- s.Require().Equal(len(channels), 2)
- })
-
- t.Run("fail to execute bank transfer over ICA", func(t *testing.T) {
- t.Run("verify empty host wallet", func(t *testing.T) {
- hostAccountBalance, err := chainB.GetBalance(ctx, hostAccount, chainB.Config().Denom)
- s.Require().NoError(err)
- s.Require().Zero(hostAccountBalance)
- })
-
- t.Run("broadcast MsgSubmitTx", func(t *testing.T) {
- // assemble bank transfer message from host account to user account on host chain
- transferMsg := &banktypes.MsgSend{
- FromAddress: hostAccount,
- ToAddress: chainBAccount.FormattedAddress(),
- Amount: sdk.NewCoins(testvalues.DefaultTransferAmount(chainB.Config().Denom)),
- }
-
- // assemble submitMessage tx for intertx
- submitMsg, err := intertxtypes.NewMsgSubmitTx(
- transferMsg,
- ibctesting.FirstConnectionID,
- controllerAccount.FormattedAddress(),
- )
- s.Require().NoError(err)
-
- // broadcast submitMessage tx from controller account on chain A
- // this message should trigger the sending of an ICA packet over channel-1 (channel created between controller and host)
- // this ICA packet contains the assembled bank transfer message from above, which will be executed by the host account on the host chain.
- resp, err := s.BroadcastMessages(
- ctx,
- chainA,
- controllerAccount,
- submitMsg,
- )
-
- s.AssertValidTxResponse(resp)
- s.Require().NoError(err)
- })
-
- t.Run("verify balance is the same", func(t *testing.T) {
- balance, err := chainB.GetBalance(ctx, chainBAccount.FormattedAddress(), chainB.Config().Denom)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount
- s.Require().Equal(expected, balance)
- })
- })
-}
diff --git a/e2e/tests/transfer/base_test.go b/e2e/tests/transfer/base_test.go
deleted file mode 100644
index 7c1a8be7051..00000000000
--- a/e2e/tests/transfer/base_test.go
+++ /dev/null
@@ -1,472 +0,0 @@
-package transfer
-
-import (
- "context"
- "strconv"
- "testing"
- "time"
-
- paramsproposaltypes "github.com/cosmos/cosmos-sdk/x/params/types/proposal"
- "github.com/strangelove-ventures/ibctest/v7/ibc"
- test "github.com/strangelove-ventures/ibctest/v7/testutil"
- "github.com/stretchr/testify/suite"
-
- "github.com/cosmos/ibc-go/e2e/semverutil"
- "github.com/cosmos/ibc-go/e2e/testsuite"
- "github.com/cosmos/ibc-go/e2e/testvalues"
- transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
- ibctesting "github.com/cosmos/ibc-go/v7/testing"
-)
-
-func TestTransferTestSuite(t *testing.T) {
- suite.Run(t, new(TransferTestSuite))
-}
-
-type TransferTestSuite struct {
- testsuite.E2ETestSuite
-}
-
-// QueryTransferSendEnabledParam queries the on-chain send enabled param for the transfer module
-func (s *TransferTestSuite) QueryTransferSendEnabledParam(ctx context.Context, chain ibc.Chain) bool {
- queryClient := s.GetChainGRCPClients(chain).ParamsQueryClient
- res, err := queryClient.Params(ctx, ¶msproposaltypes.QueryParamsRequest{
- Subspace: transfertypes.StoreKey,
- Key: string(transfertypes.KeySendEnabled),
- })
- s.Require().NoError(err)
-
- enabled, err := strconv.ParseBool(res.Param.Value)
- s.Require().NoError(err)
-
- return enabled
-}
-
-// QueryTransferReceiveEnabledParam queries the on-chain receive enabled param for the transfer module
-func (s *TransferTestSuite) QueryTransferReceiveEnabledParam(ctx context.Context, chain ibc.Chain) bool {
- queryClient := s.GetChainGRCPClients(chain).ParamsQueryClient
- res, err := queryClient.Params(ctx, ¶msproposaltypes.QueryParamsRequest{
- Subspace: transfertypes.StoreKey,
- Key: string(transfertypes.KeyReceiveEnabled),
- })
- s.Require().NoError(err)
-
- enabled, err := strconv.ParseBool(res.Param.Value)
- s.Require().NoError(err)
-
- return enabled
-}
-
-// TestMsgTransfer_Succeeds_Nonincentivized will test sending successful IBC transfers from chainA to chainB.
-// The transfer will occur over a basic transfer channel (non incentivized) and both native and non-native tokens
-// will be sent forwards and backwards in the IBC transfer timeline (both chains will act as source and receiver chains).
-func (s *TransferTestSuite) TestMsgTransfer_Succeeds_Nonincentivized() {
- t := s.T()
- ctx := context.TODO()
-
- relayer, channelA := s.SetupChainsRelayerAndChannel(ctx, transferChannelOptions())
- chainA, chainB := s.GetChains()
-
- chainADenom := chainA.Config().Denom
-
- chainAWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
- chainAAddress := chainAWallet.FormattedAddress()
-
- chainBWallet := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount)
- chainBAddress := chainBWallet.FormattedAddress()
-
- s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB), "failed to wait for blocks")
-
- t.Run("native IBC token transfer from chainA to chainB, sender is source of tokens", func(t *testing.T) {
- transferTxResp, err := s.Transfer(ctx, chainA, chainAWallet, channelA.PortID, channelA.ChannelID, testvalues.DefaultTransferAmount(chainADenom), chainAAddress, chainBAddress, s.GetTimeoutHeight(ctx, chainB), 0, "")
- s.Require().NoError(err)
- s.AssertValidTxResponse(transferTxResp)
- })
-
- t.Run("tokens are escrowed", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - testvalues.IBCTransferAmount
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- chainBIBCToken := testsuite.GetIBCToken(chainADenom, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID)
-
- t.Run("packets are relayed", func(t *testing.T) {
- s.AssertPacketRelayed(ctx, chainA, channelA.PortID, channelA.ChannelID, 1)
-
- actualBalance, err := chainB.GetBalance(ctx, chainBAddress, chainBIBCToken.IBCDenom())
- s.Require().NoError(err)
-
- expected := testvalues.IBCTransferAmount
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("non-native IBC token transfer from chainB to chainA, receiver is source of tokens", func(t *testing.T) {
- transferTxResp, err := s.Transfer(ctx, chainB, chainBWallet, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID, testvalues.DefaultTransferAmount(chainBIBCToken.IBCDenom()), chainBAddress, chainAAddress, s.GetTimeoutHeight(ctx, chainA), 0, "")
- s.Require().NoError(err)
- s.AssertValidTxResponse(transferTxResp)
- })
-
- t.Run("tokens are escrowed", func(t *testing.T) {
- actualBalance, err := chainB.GetBalance(ctx, chainBAddress, chainBIBCToken.IBCDenom())
- s.Require().NoError(err)
-
- s.Require().Equal(int64(0), actualBalance)
- })
-
- s.Require().NoError(test.WaitForBlocks(ctx, 5, chainA, chainB), "failed to wait for blocks")
-
- t.Run("packets are relayed", func(t *testing.T) {
- s.AssertPacketRelayed(ctx, chainB, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID, 1)
-
- actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount
- s.Require().Equal(expected, actualBalance)
- })
-}
-
-// TestMsgTransfer_Fails_InvalidAddress attempts to send an IBC transfer to an invalid address and ensures
-// that the tokens on the sending chain are unescrowed.
-func (s *TransferTestSuite) TestMsgTransfer_Fails_InvalidAddress() {
- t := s.T()
- ctx := context.TODO()
-
- relayer, channelA := s.SetupChainsRelayerAndChannel(ctx, transferChannelOptions())
- chainA, chainB := s.GetChains()
-
- chainADenom := chainA.Config().Denom
-
- chainAWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
- chainAAddress := chainAWallet.FormattedAddress()
-
- s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB), "failed to wait for blocks")
-
- t.Run("native IBC token transfer from chainA to invalid address", func(t *testing.T) {
- transferTxResp, err := s.Transfer(ctx, chainA, chainAWallet, channelA.PortID, channelA.ChannelID, testvalues.DefaultTransferAmount(chainADenom), chainAAddress, testvalues.InvalidAddress, s.GetTimeoutHeight(ctx, chainB), 0, "")
- s.Require().NoError(err)
- s.AssertValidTxResponse(transferTxResp)
- })
-
- t.Run("tokens are escrowed", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - testvalues.IBCTransferAmount
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("packets are relayed", func(t *testing.T) {
- s.AssertPacketRelayed(ctx, chainA, channelA.PortID, channelA.ChannelID, 1)
- })
-
- t.Run("token transfer amount unescrowed", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount
- s.Require().Equal(expected, actualBalance)
- })
-}
-
-func (s *TransferTestSuite) TestMsgTransfer_Timeout_Nonincentivized() {
- t := s.T()
- ctx := context.TODO()
-
- relayer, channelA := s.SetupChainsRelayerAndChannel(ctx, transferChannelOptions())
- chainA, _ := s.GetChains()
- chainAWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
- chainBWallet := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount)
-
- chainBWalletAmount := ibc.WalletAmount{
- Address: chainBWallet.FormattedAddress(), // destination address
- Denom: chainA.Config().Denom,
- Amount: testvalues.IBCTransferAmount,
- }
-
- t.Run("IBC transfer packet timesout", func(t *testing.T) {
- tx, err := chainA.SendIBCTransfer(ctx, channelA.ChannelID, chainAWallet.KeyName(), chainBWalletAmount, ibc.TransferOptions{Timeout: testvalues.ImmediatelyTimeout()})
- s.Require().NoError(err)
- s.Require().NoError(tx.Validate(), "source ibc transfer tx is invalid")
- time.Sleep(time.Nanosecond * 1) // want it to timeout immediately
- })
-
- t.Run("tokens are escrowed", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - testvalues.IBCTransferAmount
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("ensure escrowed tokens have been refunded to sender due to timeout", func(t *testing.T) {
- // ensure destination address did not receive any tokens
- bal, err := s.GetChainBNativeBalance(ctx, chainBWallet)
- s.Require().NoError(err)
- s.Require().Equal(testvalues.StartingTokenAmount, bal)
-
- // ensure that the sender address has been successfully refunded the full amount
- bal, err = s.GetChainANativeBalance(ctx, chainAWallet)
- s.Require().NoError(err)
- s.Require().Equal(testvalues.StartingTokenAmount, bal)
- })
-}
-
-// TestSendEnabledParam tests changing ics20 SendEnabled parameter
-func (s *TransferTestSuite) TestSendEnabledParam() {
- t := s.T()
- ctx := context.TODO()
-
- _, channelA := s.SetupChainsRelayerAndChannel(ctx, transferChannelOptions())
- chainA, chainB := s.GetChains()
-
- chainADenom := chainA.Config().Denom
-
- chainAWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
- chainAAddress := chainAWallet.FormattedAddress()
-
- chainBWallet := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount)
- chainBAddress := chainBWallet.FormattedAddress()
-
- s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB), "failed to wait for blocks")
-
- t.Run("ensure transfer sending is enabled", func(t *testing.T) {
- enabled := s.QueryTransferSendEnabledParam(ctx, chainA)
- s.Require().True(enabled)
- })
-
- t.Run("ensure packets can be sent", func(t *testing.T) {
- transferTxResp, err := s.Transfer(ctx, chainA, chainAWallet, channelA.PortID, channelA.ChannelID, testvalues.DefaultTransferAmount(chainADenom), chainAAddress, chainBAddress, s.GetTimeoutHeight(ctx, chainB), 0, "")
- s.Require().NoError(err)
- s.AssertValidTxResponse(transferTxResp)
- })
-
- t.Run("change send enabled parameter to disabled", func(t *testing.T) {
- changes := []paramsproposaltypes.ParamChange{
- paramsproposaltypes.NewParamChange(transfertypes.StoreKey, string(transfertypes.KeySendEnabled), "false"),
- }
-
- proposal := paramsproposaltypes.NewParameterChangeProposal(ibctesting.Title, ibctesting.Description, changes)
- s.ExecuteGovProposal(ctx, chainA, chainAWallet, proposal)
- })
-
- t.Run("ensure transfer params are disabled", func(t *testing.T) {
- enabled := s.QueryTransferSendEnabledParam(ctx, chainA)
- s.Require().False(enabled)
- })
-
- t.Run("ensure ics20 transfer fails", func(t *testing.T) {
- transferTxResp, err := s.Transfer(ctx, chainA, chainAWallet, channelA.PortID, channelA.ChannelID, testvalues.DefaultTransferAmount(chainADenom), chainAAddress, chainBAddress, s.GetTimeoutHeight(ctx, chainB), 0, "")
- s.Require().NoError(err)
- s.Require().Equal(transfertypes.ErrSendDisabled.ABCICode(), transferTxResp.Code)
- })
-}
-
-// TestReceiveEnabledParam tests changing ics20 ReceiveEnabled parameter
-func (s *TransferTestSuite) TestReceiveEnabledParam() {
- t := s.T()
- ctx := context.TODO()
-
- relayer, channelA := s.SetupChainsRelayerAndChannel(ctx, transferChannelOptions())
- chainA, chainB := s.GetChains()
-
- chainAWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
- chainBWallet := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount)
-
- var (
- chainBDenom = chainB.Config().Denom
- chainAIBCToken = testsuite.GetIBCToken(chainBDenom, channelA.PortID, channelA.ChannelID) // IBC token sent to chainA
-
- chainAAddress = chainAWallet.FormattedAddress()
- chainBAddress = chainBWallet.FormattedAddress()
- )
-
- s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB), "failed to wait for blocks")
-
- t.Run("ensure transfer receive is enabled", func(t *testing.T) {
- enabled := s.QueryTransferReceiveEnabledParam(ctx, chainA)
- s.Require().True(enabled)
- })
-
- t.Run("ensure packets can be received, send from chainB to chainA", func(t *testing.T) {
- t.Run("send from chainB to chainA", func(t *testing.T) {
- transferTxResp, err := s.Transfer(ctx, chainB, chainBWallet, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID, testvalues.DefaultTransferAmount(chainBDenom), chainBAddress, chainAAddress, s.GetTimeoutHeight(ctx, chainA), 0, "")
- s.Require().NoError(err)
- s.AssertValidTxResponse(transferTxResp)
- })
-
- t.Run("tokens are escrowed", func(t *testing.T) {
- actualBalance, err := s.GetChainBNativeBalance(ctx, chainBWallet)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - testvalues.IBCTransferAmount
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("packets are relayed", func(t *testing.T) {
- s.AssertPacketRelayed(ctx, chainA, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID, 1)
-
- actualBalance, err := chainA.GetBalance(ctx, chainAAddress, chainAIBCToken.IBCDenom())
- s.Require().NoError(err)
-
- expected := testvalues.IBCTransferAmount
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("stop relayer", func(t *testing.T) {
- s.StopRelayer(ctx, relayer)
- })
- })
-
- t.Run("change receive enabled parameter to disabled ", func(t *testing.T) {
- changes := []paramsproposaltypes.ParamChange{
- paramsproposaltypes.NewParamChange(transfertypes.StoreKey, string(transfertypes.KeyReceiveEnabled), "false"),
- }
-
- proposal := paramsproposaltypes.NewParameterChangeProposal(ibctesting.Title, ibctesting.Description, changes)
- s.ExecuteGovProposal(ctx, chainA, chainAWallet, proposal)
- })
-
- t.Run("ensure transfer params are disabled", func(t *testing.T) {
- enabled := s.QueryTransferReceiveEnabledParam(ctx, chainA)
- s.Require().False(enabled)
- })
-
- t.Run("ensure ics20 transfer fails", func(t *testing.T) {
- t.Run("send from chainB to chainA", func(t *testing.T) {
- transferTxResp, err := s.Transfer(ctx, chainB, chainBWallet, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID, testvalues.DefaultTransferAmount(chainBDenom), chainBAddress, chainAAddress, s.GetTimeoutHeight(ctx, chainA), 0, "")
- s.Require().NoError(err)
- s.AssertValidTxResponse(transferTxResp)
- })
-
- t.Run("tokens are escrowed", func(t *testing.T) {
- actualBalance, err := s.GetChainBNativeBalance(ctx, chainBWallet)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - (testvalues.IBCTransferAmount * 2) // second send
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("tokens are unescrowed in failed acknowledgement", func(t *testing.T) {
- actualBalance, err := s.GetChainBNativeBalance(ctx, chainBWallet)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - testvalues.IBCTransferAmount // only first send marked
- s.Require().Equal(expected, actualBalance)
- })
- })
-}
-
-// memoFeatureReleases represents the releases the memo field was released in.
-var memoFeatureReleases = semverutil.FeatureReleases{
- MajorVersion: "v6",
- MinorVersions: []string{
- "v2.5",
- "v3.4",
- "v4.2",
- "v5.1",
- },
-}
-
-// This can be used to test sending with a transfer packet with a memo given different combinations of
-// ibc-go versions.
-//
-// TestMsgTransfer_WithMemo will test sending IBC transfers from chainA to chainB
-// If the chains contain a version of FungibleTokenPacketData with memo, both send and receive should succeed.
-// If one of the chains contains a version of FungibleTokenPacketData without memo, then receiving a packet with
-// memo should fail in that chain
-func (s *TransferTestSuite) TestMsgTransfer_WithMemo() {
- t := s.T()
- ctx := context.TODO()
-
- relayer, channelA := s.SetupChainsRelayerAndChannel(ctx, transferChannelOptions())
- chainA, chainB := s.GetChains()
-
- chainADenom := chainA.Config().Denom
-
- chainAWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
- chainAAddress := chainAWallet.FormattedAddress()
-
- chainBWallet := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount)
- chainBAddress := chainBWallet.FormattedAddress()
-
- s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB), "failed to wait for blocks")
-
- chainAVersion := chainA.Config().Images[0].Version
- chainBVersion := chainB.Config().Images[0].Version
-
- t.Run("IBC token transfer with memo from chainA to chainB", func(t *testing.T) {
- transferTxResp, err := s.Transfer(ctx, chainA, chainAWallet, channelA.PortID, channelA.ChannelID, testvalues.DefaultTransferAmount(chainADenom), chainAAddress, chainBAddress, s.GetTimeoutHeight(ctx, chainB), 0, "memo")
- s.Require().NoError(err)
-
- if memoFeatureReleases.IsSupported(chainAVersion) {
- s.AssertValidTxResponse(transferTxResp)
- } else {
- s.Require().Equal(uint32(2), transferTxResp.Code)
- s.Require().Contains(transferTxResp.RawLog, "errUnknownField")
- }
- })
-
- if !memoFeatureReleases.IsSupported(chainAVersion) {
- // transfer not sent, end test
- return
- }
-
- t.Run("tokens are escrowed", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - testvalues.IBCTransferAmount
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- chainBIBCToken := testsuite.GetIBCToken(chainADenom, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID)
-
- t.Run("packets relayed", func(t *testing.T) {
- s.AssertPacketRelayed(ctx, chainA, channelA.PortID, channelA.ChannelID, 1)
-
- actualBalance, err := chainB.GetBalance(ctx, chainBAddress, chainBIBCToken.IBCDenom())
- s.Require().NoError(err)
-
- if memoFeatureReleases.IsSupported(chainBVersion) {
- s.Require().Equal(testvalues.IBCTransferAmount, actualBalance)
- } else {
- s.Require().Equal(int64(0), actualBalance)
- }
- })
-}
-
-// transferChannelOptions configures both of the chains to have non-incentivized transfer channels.
-func transferChannelOptions() func(options *ibc.CreateChannelOptions) {
- return func(opts *ibc.CreateChannelOptions) {
- opts.Version = transfertypes.Version
- opts.SourcePortName = transfertypes.PortID
- opts.DestPortName = transfertypes.PortID
- }
-}
diff --git a/e2e/tests/transfer/incentivized_test.go b/e2e/tests/transfer/incentivized_test.go
deleted file mode 100644
index 85f15c2e18d..00000000000
--- a/e2e/tests/transfer/incentivized_test.go
+++ /dev/null
@@ -1,742 +0,0 @@
-package transfer
-
-import (
- "context"
- "testing"
- "time"
-
- sdk "github.com/cosmos/cosmos-sdk/types"
- "github.com/strangelove-ventures/ibctest/v7/ibc"
- test "github.com/strangelove-ventures/ibctest/v7/testutil"
- "github.com/stretchr/testify/suite"
-
- "github.com/cosmos/ibc-go/e2e/testvalues"
- feetypes "github.com/cosmos/ibc-go/v7/modules/apps/29-fee/types"
- transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
- channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types"
-)
-
-type IncentivizedTransferTestSuite struct {
- TransferTestSuite
-}
-
-func TestIncentivizedTransferTestSuite(t *testing.T) {
- suite.Run(t, new(IncentivizedTransferTestSuite))
-}
-
-func (s *IncentivizedTransferTestSuite) TestMsgPayPacketFee_AsyncSingleSender_Succeeds() {
- t := s.T()
- ctx := context.TODO()
-
- relayer, channelA := s.SetupChainsRelayerAndChannel(ctx, feeMiddlewareChannelOptions())
- chainA, chainB := s.GetChains()
-
- var (
- chainADenom = chainA.Config().Denom
- testFee = testvalues.DefaultFee(chainADenom)
- chainATx ibc.Tx
- payPacketFeeTxResp sdk.TxResponse
- )
-
- chainAWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
-
- t.Run("relayer wallets recovered", func(t *testing.T) {
- err := s.RecoverRelayerWallets(ctx, relayer)
- s.Require().NoError(err)
- })
-
- chainARelayerWallet, chainBRelayerWallet, err := s.GetRelayerWallets(relayer)
- t.Run("relayer wallets fetched", func(t *testing.T) {
- s.Require().NoError(err)
- })
-
- s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB), "failed to wait for blocks")
-
- _, chainBRelayerUser := s.GetRelayerUsers(ctx)
-
- t.Run("register counterparty payee", func(t *testing.T) {
- resp, err := s.RegisterCounterPartyPayee(ctx, chainB, chainBRelayerUser, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID, chainBRelayerWallet.FormattedAddress(), chainARelayerWallet.FormattedAddress())
- s.Require().NoError(err)
- s.AssertValidTxResponse(resp)
- })
-
- t.Run("verify counterparty payee", func(t *testing.T) {
- address, err := s.QueryCounterPartyPayee(ctx, chainB, chainBRelayerWallet.FormattedAddress(), channelA.Counterparty.ChannelID)
- s.Require().NoError(err)
- s.Require().Equal(chainARelayerWallet.FormattedAddress(), address)
- })
-
- walletAmount := ibc.WalletAmount{
- Address: chainAWallet.FormattedAddress(), // destination address
- Denom: chainADenom,
- Amount: testvalues.IBCTransferAmount,
- }
-
- t.Run("send IBC transfer", func(t *testing.T) {
- chainATx, err = chainA.SendIBCTransfer(ctx, channelA.ChannelID, chainAWallet.KeyName(), walletAmount, ibc.TransferOptions{})
- s.Require().NoError(err)
- s.Require().NoError(chainATx.Validate(), "chain-a ibc transfer tx is invalid")
- })
-
- t.Run("tokens are escrowed", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - walletAmount.Amount
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("pay packet fee", func(t *testing.T) {
- t.Run("no incentivized packets", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID)
- s.Require().NoError(err)
- s.Require().Empty(packets)
- })
-
- packetId := channeltypes.NewPacketID(channelA.PortID, channelA.ChannelID, chainATx.Packet.Sequence)
- packetFee := feetypes.NewPacketFee(testFee, chainAWallet.FormattedAddress(), nil)
-
- t.Run("should succeed", func(t *testing.T) {
- payPacketFeeTxResp, err = s.PayPacketFeeAsync(ctx, chainA, chainAWallet, packetId, packetFee)
- s.Require().NoError(err)
- s.AssertValidTxResponse(payPacketFeeTxResp)
- })
-
- t.Run("there should be incentivized packets", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID)
- s.Require().NoError(err)
- s.Require().Len(packets, 1)
- actualFee := packets[0].PacketFees[0].Fee
-
- s.Require().True(actualFee.RecvFee.IsEqual(testFee.RecvFee))
- s.Require().True(actualFee.AckFee.IsEqual(testFee.AckFee))
- s.Require().True(actualFee.TimeoutFee.IsEqual(testFee.TimeoutFee))
- })
-
- t.Run("balance should be lowered by sum of recv ack and timeout", func(t *testing.T) {
- // The balance should be lowered by the sum of the recv, ack and timeout fees.
- actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - walletAmount.Amount - testFee.Total().AmountOf(chainADenom).Int64()
- s.Require().Equal(expected, actualBalance)
- })
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("packets are relayed", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID)
- s.Require().NoError(err)
- s.Require().Empty(packets)
- })
-
- t.Run("timeout fee is refunded", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet)
- s.Require().NoError(err)
-
- // once the relayer has relayed the packets, the timeout fee should be refunded.
- expected := testvalues.StartingTokenAmount - walletAmount.Amount - testFee.AckFee.AmountOf(chainADenom).Int64() - testFee.RecvFee.AmountOf(chainADenom).Int64()
- s.Require().Equal(expected, actualBalance)
- })
-}
-
-func (s *IncentivizedTransferTestSuite) TestMsgPayPacketFee_InvalidReceiverAccount() {
- t := s.T()
- ctx := context.TODO()
-
- relayer, channelA := s.SetupChainsRelayerAndChannel(ctx, feeMiddlewareChannelOptions())
- chainA, chainB := s.GetChains()
-
- var (
- chainADenom = chainA.Config().Denom
- testFee = testvalues.DefaultFee(chainADenom)
- payPacketFeeTxResp sdk.TxResponse
- )
-
- chainAWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
-
- t.Run("relayer wallets recovered", func(t *testing.T) {
- err := s.RecoverRelayerWallets(ctx, relayer)
- s.Require().NoError(err)
- })
-
- chainARelayerWallet, chainBRelayerWallet, err := s.GetRelayerWallets(relayer)
- t.Run("relayer wallets fetched", func(t *testing.T) {
- s.Require().NoError(err)
- })
-
- s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB), "failed to wait for blocks")
-
- _, chainBRelayerUser := s.GetRelayerUsers(ctx)
-
- t.Run("register counterparty payee", func(t *testing.T) {
- resp, err := s.RegisterCounterPartyPayee(ctx, chainB, chainBRelayerUser, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID, chainBRelayerWallet.FormattedAddress(), chainARelayerWallet.FormattedAddress())
- s.Require().NoError(err)
- s.AssertValidTxResponse(resp)
- })
-
- t.Run("verify counterparty payee", func(t *testing.T) {
- address, err := s.QueryCounterPartyPayee(ctx, chainB, chainBRelayerWallet.FormattedAddress(), channelA.Counterparty.ChannelID)
- s.Require().NoError(err)
- s.Require().Equal(chainARelayerWallet.FormattedAddress(), address)
- })
-
- transferAmount := testvalues.DefaultTransferAmount(chainADenom)
-
- t.Run("send IBC transfer", func(t *testing.T) {
- transferMsg := transfertypes.NewMsgTransfer(channelA.PortID, channelA.ChannelID, transferAmount, chainAWallet.FormattedAddress(), testvalues.InvalidAddress, s.GetTimeoutHeight(ctx, chainB), 0, "")
- txResp, err := s.BroadcastMessages(ctx, chainA, chainAWallet, transferMsg)
- // this message should be successful, as receiver account is not validated on the sending chain.
- s.Require().NoError(err)
- s.AssertValidTxResponse(txResp)
- })
-
- t.Run("tokens are escrowed", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - transferAmount.Amount.Int64()
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("pay packet fee", func(t *testing.T) {
- t.Run("no incentivized packets", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID)
- s.Require().NoError(err)
- s.Require().Empty(packets)
- })
-
- packetId := channeltypes.NewPacketID(channelA.PortID, channelA.ChannelID, 1)
- packetFee := feetypes.NewPacketFee(testFee, chainAWallet.FormattedAddress(), nil)
-
- t.Run("should succeed", func(t *testing.T) {
- payPacketFeeTxResp, err = s.PayPacketFeeAsync(ctx, chainA, chainAWallet, packetId, packetFee)
- s.Require().NoError(err)
- s.AssertValidTxResponse(payPacketFeeTxResp)
- })
-
- t.Run("there should be incentivized packets", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID)
- s.Require().NoError(err)
- s.Require().Len(packets, 1)
- actualFee := packets[0].PacketFees[0].Fee
-
- s.Require().True(actualFee.RecvFee.IsEqual(testFee.RecvFee))
- s.Require().True(actualFee.AckFee.IsEqual(testFee.AckFee))
- s.Require().True(actualFee.TimeoutFee.IsEqual(testFee.TimeoutFee))
- })
-
- t.Run("balance should be lowered by sum of recv, ack and timeout", func(t *testing.T) {
- // The balance should be lowered by the sum of the recv, ack and timeout fees.
- actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - transferAmount.Amount.Int64() - testFee.Total().AmountOf(chainADenom).Int64()
- s.Require().Equal(expected, actualBalance)
- })
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("packets are relayed", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID)
- s.Require().NoError(err)
- s.Require().Empty(packets)
- })
- t.Run("timeout fee and transfer amount refunded", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet)
- s.Require().NoError(err)
-
- // once the relayer has relayed the packets, the timeout fee should be refunded.
- // the address was invalid so the amount sent should be unescrowed.
- expected := testvalues.StartingTokenAmount - testFee.AckFee.AmountOf(chainADenom).Int64() - testFee.RecvFee.AmountOf(chainADenom).Int64()
- s.Require().Equal(expected, actualBalance, "the amount sent and timeout fee should have been refunded as there was an invalid receiver address provided")
- })
-}
-
-func (s *IncentivizedTransferTestSuite) TestMultiMsg_MsgPayPacketFeeSingleSender() {
- t := s.T()
- ctx := context.TODO()
-
- relayer, channelA := s.SetupChainsRelayerAndChannel(ctx, feeMiddlewareChannelOptions())
-
- chainA, chainB := s.GetChains()
-
- var (
- chainADenom = chainA.Config().Denom
- testFee = testvalues.DefaultFee(chainADenom)
- multiMsgTxResponse sdk.TxResponse
- )
-
- transferAmount := testvalues.DefaultTransferAmount(chainA.Config().Denom)
-
- chainAWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
- chainBWallet := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount)
-
- t.Run("relayer wallets recovered", func(t *testing.T) {
- err := s.RecoverRelayerWallets(ctx, relayer)
- s.Require().NoError(err)
- })
-
- chainARelayerWallet, chainBRelayerWallet, err := s.GetRelayerWallets(relayer)
- t.Run("relayer wallets fetched", func(t *testing.T) {
- s.Require().NoError(err)
- })
-
- s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB), "failed to wait for blocks")
-
- chainARelayerUser, chainBRelayerUser := s.GetRelayerUsers(ctx)
-
- relayerAStartingBalance, err := s.GetChainANativeBalance(ctx, chainARelayerUser)
- s.Require().NoError(err)
- t.Logf("relayer A user starting with balance: %d", relayerAStartingBalance)
-
- t.Run("register counterparty payee", func(t *testing.T) {
- multiMsgTxResponse, err = s.RegisterCounterPartyPayee(ctx, chainB, chainBRelayerUser, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID, chainBRelayerWallet.FormattedAddress(), chainARelayerWallet.FormattedAddress())
- s.Require().NoError(err)
- s.AssertValidTxResponse(multiMsgTxResponse)
- })
-
- t.Run("verify counterparty payee", func(t *testing.T) {
- address, err := s.QueryCounterPartyPayee(ctx, chainB, chainBRelayerWallet.FormattedAddress(), channelA.Counterparty.ChannelID)
- s.Require().NoError(err)
- s.Require().Equal(chainARelayerWallet.FormattedAddress(), address)
- })
-
- t.Run("no incentivized packets", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID)
- s.Require().NoError(err)
- s.Require().Empty(packets)
- })
-
- payPacketFeeMsg := feetypes.NewMsgPayPacketFee(testFee, channelA.PortID, channelA.ChannelID, chainAWallet.FormattedAddress(), nil)
- transferMsg := transfertypes.NewMsgTransfer(channelA.PortID, channelA.ChannelID, transferAmount, chainAWallet.FormattedAddress(), chainBWallet.FormattedAddress(), s.GetTimeoutHeight(ctx, chainB), 0, "")
- resp, err := s.BroadcastMessages(ctx, chainA, chainAWallet, payPacketFeeMsg, transferMsg)
-
- t.Run("transfer successful", func(t *testing.T) {
- s.AssertValidTxResponse(resp)
- s.Require().NoError(err)
- })
-
- t.Run("there should be incentivized packets", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID)
- s.Require().NoError(err)
- s.Require().Len(packets, 1)
- actualFee := packets[0].PacketFees[0].Fee
-
- s.Require().True(actualFee.RecvFee.IsEqual(testFee.RecvFee))
- s.Require().True(actualFee.AckFee.IsEqual(testFee.AckFee))
- s.Require().True(actualFee.TimeoutFee.IsEqual(testFee.TimeoutFee))
- })
-
- t.Run("balance should be lowered by sum of recv ack and timeout", func(t *testing.T) {
- // The balance should be lowered by the sum of the recv, ack and timeout fees.
- actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - testvalues.IBCTransferAmount - testFee.Total().AmountOf(chainADenom).Int64()
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("packets are relayed", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID)
- s.Require().NoError(err)
- s.Require().Empty(packets)
- })
-
- t.Run("timeout fee is refunded", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet)
- s.Require().NoError(err)
-
- // once the relayer has relayed the packets, the timeout fee should be refunded.
- expected := testvalues.StartingTokenAmount - testvalues.IBCTransferAmount - testFee.AckFee.AmountOf(chainADenom).Int64() - testFee.RecvFee.AmountOf(chainADenom).Int64()
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("relayerA is paid ack and recv fee", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, chainARelayerUser)
- s.Require().NoError(err)
- expected := relayerAStartingBalance + testFee.AckFee.AmountOf(chainADenom).Int64() + testFee.RecvFee.AmountOf(chainADenom).Int64()
- s.Require().Equal(expected, actualBalance)
- })
-}
-
-func (s *IncentivizedTransferTestSuite) TestMsgPayPacketFee_SingleSender_TimesOut() {
- t := s.T()
- ctx := context.TODO()
-
- relayer, channelA := s.SetupChainsRelayerAndChannel(ctx, feeMiddlewareChannelOptions())
- chainA, chainB := s.GetChains()
-
- var (
- chainADenom = chainA.Config().Denom
- testFee = testvalues.DefaultFee(chainADenom)
- chainATx ibc.Tx
- payPacketFeeTxResp sdk.TxResponse
- )
-
- chainAWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
- chainBWallet := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount)
-
- t.Run("relayer wallets recovered", func(t *testing.T) {
- s.Require().NoError(s.RecoverRelayerWallets(ctx, relayer))
- })
-
- chainARelayerWallet, chainBRelayerWallet, err := s.GetRelayerWallets(relayer)
- t.Run("relayer wallets fetched", func(t *testing.T) {
- s.Require().NoError(err)
- })
-
- _, chainBRelayerUser := s.GetRelayerUsers(ctx)
-
- t.Run("register counterparty payee", func(t *testing.T) {
- resp, err := s.RegisterCounterPartyPayee(ctx, chainB, chainBRelayerUser, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID, chainBRelayerWallet.FormattedAddress(), chainARelayerWallet.FormattedAddress())
- s.Require().NoError(err)
- s.AssertValidTxResponse(resp)
- })
-
- t.Run("verify counterparty payee", func(t *testing.T) {
- address, err := s.QueryCounterPartyPayee(ctx, chainB, chainBRelayerWallet.FormattedAddress(), channelA.Counterparty.ChannelID)
- s.Require().NoError(err)
- s.Require().Equal(chainARelayerWallet.FormattedAddress(), address)
- })
-
- chainBWalletAmount := ibc.WalletAmount{
- Address: chainBWallet.FormattedAddress(), // destination address
- Denom: chainA.Config().Denom,
- Amount: testvalues.IBCTransferAmount,
- }
-
- t.Run("Send IBC transfer", func(t *testing.T) {
- chainATx, err = chainA.SendIBCTransfer(ctx, channelA.ChannelID, chainAWallet.KeyName(), chainBWalletAmount, ibc.TransferOptions{Timeout: testvalues.ImmediatelyTimeout()})
- s.Require().NoError(err)
- s.Require().NoError(chainATx.Validate(), "source ibc transfer tx is invalid")
- time.Sleep(time.Nanosecond * 1) // want it to timeout immediately
- })
-
- t.Run("tokens are escrowed", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - chainBWalletAmount.Amount
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("pay packet fee", func(t *testing.T) {
- packetId := channeltypes.NewPacketID(channelA.PortID, channelA.ChannelID, chainATx.Packet.Sequence)
- packetFee := feetypes.NewPacketFee(testFee, chainAWallet.FormattedAddress(), nil)
-
- t.Run("no incentivized packets", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID)
- s.Require().NoError(err)
- s.Require().Empty(packets)
- })
-
- t.Run("should succeed", func(t *testing.T) {
- payPacketFeeTxResp, err = s.PayPacketFeeAsync(ctx, chainA, chainAWallet, packetId, packetFee)
- s.Require().NoError(err)
- s.AssertValidTxResponse(payPacketFeeTxResp)
- })
-
- t.Run("there should be incentivized packets", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID)
- s.Require().NoError(err)
- s.Require().Len(packets, 1)
- actualFee := packets[0].PacketFees[0].Fee
-
- s.Require().True(actualFee.RecvFee.IsEqual(testFee.RecvFee))
- s.Require().True(actualFee.AckFee.IsEqual(testFee.AckFee))
- s.Require().True(actualFee.TimeoutFee.IsEqual(testFee.TimeoutFee))
- })
-
- t.Run("balance should be lowered by sum of recv ack and timeout", func(t *testing.T) {
- // The balance should be lowered by the sum of the recv, ack and timeout fees.
- actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - chainBWalletAmount.Amount - testFee.Total().AmountOf(chainADenom).Int64()
- s.Require().Equal(expected, actualBalance)
- })
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("packets are relayed", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID)
- s.Require().NoError(err)
- s.Require().Empty(packets)
- })
-
- t.Run("recv and ack should be refunded", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - testFee.TimeoutFee.AmountOf(chainADenom).Int64()
- s.Require().Equal(expected, actualBalance)
- })
-}
-
-func (s *IncentivizedTransferTestSuite) TestPayPacketFeeAsync_SingleSender_NoCounterPartyAddress() {
- t := s.T()
- ctx := context.TODO()
-
- relayer, channelA := s.SetupChainsRelayerAndChannel(ctx, feeMiddlewareChannelOptions())
- chainA, _ := s.GetChains()
-
- var (
- chainADenom = chainA.Config().Denom
- testFee = testvalues.DefaultFee(chainADenom)
- chainATx ibc.Tx
- payPacketFeeTxResp sdk.TxResponse
- )
-
- chainAWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
-
- t.Run("relayer wallets recovered", func(t *testing.T) {
- err := s.RecoverRelayerWallets(ctx, relayer)
- s.Require().NoError(err)
- })
-
- chainBWalletAmount := ibc.WalletAmount{
- Address: chainAWallet.FormattedAddress(), // destination address
- Denom: chainADenom,
- Amount: testvalues.IBCTransferAmount,
- }
-
- t.Run("send IBC transfer", func(t *testing.T) {
- var err error
- chainATx, err = chainA.SendIBCTransfer(ctx, channelA.ChannelID, chainAWallet.KeyName(), chainBWalletAmount, ibc.TransferOptions{})
- s.Require().NoError(err)
- s.Require().NoError(chainATx.Validate(), "source ibc transfer tx is invalid")
- })
-
- t.Run("tokens are escrowed", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - chainBWalletAmount.Amount
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("pay packet fee", func(t *testing.T) {
- t.Run("no incentivized packets", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID)
- s.Require().NoError(err)
- s.Require().Empty(packets)
- })
-
- packetId := channeltypes.NewPacketID(channelA.PortID, channelA.ChannelID, chainATx.Packet.Sequence)
- packetFee := feetypes.NewPacketFee(testFee, chainAWallet.FormattedAddress(), nil)
-
- t.Run("should succeed", func(t *testing.T) {
- var err error
- payPacketFeeTxResp, err = s.PayPacketFeeAsync(ctx, chainA, chainAWallet, packetId, packetFee)
- s.Require().NoError(err)
- s.AssertValidTxResponse(payPacketFeeTxResp)
- })
-
- t.Run("should be incentivized packets", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID)
- s.Require().NoError(err)
- s.Require().Len(packets, 1)
- actualFee := packets[0].PacketFees[0].Fee
-
- s.Require().True(actualFee.RecvFee.IsEqual(testFee.RecvFee))
- s.Require().True(actualFee.AckFee.IsEqual(testFee.AckFee))
- s.Require().True(actualFee.TimeoutFee.IsEqual(testFee.TimeoutFee))
- })
- })
-
- t.Run("balance should be lowered by sum of recv, ack and timeout", func(t *testing.T) {
- // The balance should be lowered by the sum of the recv, ack and timeout fees.
- actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - chainBWalletAmount.Amount - testFee.Total().AmountOf(chainADenom).Int64()
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("with no counterparty address", func(t *testing.T) {
- t.Run("packets are relayed", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID)
- s.Require().NoError(err)
- s.Require().Empty(packets)
- })
-
- t.Run("timeout and recv fee are refunded", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet)
- s.Require().NoError(err)
-
- // once the relayer has relayed the packets, the timeout and recv fee should be refunded.
- expected := testvalues.StartingTokenAmount - chainBWalletAmount.Amount - testFee.AckFee.AmountOf(chainADenom).Int64()
- s.Require().Equal(expected, actualBalance)
- })
- })
-}
-
-func (s *IncentivizedTransferTestSuite) TestMsgPayPacketFee_AsyncMultipleSenders_Succeeds() {
- t := s.T()
- ctx := context.TODO()
-
- relayer, channelA := s.SetupChainsRelayerAndChannel(ctx, feeMiddlewareChannelOptions())
- chainA, chainB := s.GetChains()
-
- var (
- chainADenom = chainA.Config().Denom
- testFee = testvalues.DefaultFee(chainADenom)
- chainATx ibc.Tx
- payPacketFeeTxResp sdk.TxResponse
- )
-
- chainAWallet1 := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
- chainAWallet2 := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
-
- t.Run("relayer wallets recovered", func(t *testing.T) {
- err := s.RecoverRelayerWallets(ctx, relayer)
- s.Require().NoError(err)
- })
-
- chainARelayerWallet, chainBRelayerWallet, err := s.GetRelayerWallets(relayer)
- s.Require().NoError(err)
- s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB), "failed to wait for blocks")
-
- _, chainBRelayerUser := s.GetRelayerUsers(ctx)
-
- t.Run("register counterparty payee", func(t *testing.T) {
- resp, err := s.RegisterCounterPartyPayee(ctx, chainB, chainBRelayerUser, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID, chainBRelayerWallet.FormattedAddress(), chainARelayerWallet.FormattedAddress())
- s.Require().NoError(err)
- s.AssertValidTxResponse(resp)
- })
-
- t.Run("verify counterparty payee", func(t *testing.T) {
- address, err := s.QueryCounterPartyPayee(ctx, chainB, chainBRelayerWallet.FormattedAddress(), channelA.Counterparty.ChannelID)
- s.Require().NoError(err)
- s.Require().Equal(chainARelayerWallet.FormattedAddress(), address)
- })
-
- walletAmount1 := ibc.WalletAmount{
- Address: chainAWallet1.FormattedAddress(), // destination address
- Denom: chainADenom,
- Amount: testvalues.IBCTransferAmount,
- }
-
- t.Run("send IBC transfer", func(t *testing.T) {
- chainATx, err = chainA.SendIBCTransfer(ctx, channelA.ChannelID, chainAWallet1.KeyName(), walletAmount1, ibc.TransferOptions{})
- s.Require().NoError(err)
- s.Require().NoError(chainATx.Validate(), "chain-a ibc transfer tx is invalid")
- })
-
- t.Run("tokens are escrowed", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet1)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - walletAmount1.Amount
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("pay packet fee", func(t *testing.T) {
- t.Run("no incentivized packets", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID)
- s.Require().NoError(err)
- s.Require().Empty(packets)
- })
-
- packetId := channeltypes.NewPacketID(channelA.PortID, channelA.ChannelID, chainATx.Packet.Sequence)
- packetFee1 := feetypes.NewPacketFee(testFee, chainAWallet1.FormattedAddress(), nil)
- packetFee2 := feetypes.NewPacketFee(testFee, chainAWallet2.FormattedAddress(), nil)
-
- t.Run("paying packetFee1 should succeed", func(t *testing.T) {
- payPacketFeeTxResp, err = s.PayPacketFeeAsync(ctx, chainA, chainAWallet1, packetId, packetFee1)
- s.Require().NoError(err)
- s.AssertValidTxResponse(payPacketFeeTxResp)
- })
- t.Run("paying packetFee2 should succeed", func(t *testing.T) {
- payPacketFeeTxResp, err = s.PayPacketFeeAsync(ctx, chainA, chainAWallet2, packetId, packetFee2)
- s.Require().NoError(err)
- s.AssertValidTxResponse(payPacketFeeTxResp)
- })
-
- t.Run("there should be incentivized packets", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID)
- s.Require().NoError(err)
- s.Require().Len(packets, 1)
- actualFee1 := packets[0].PacketFees[0].Fee
- actualFee2 := packets[0].PacketFees[1].Fee
- s.Require().Len(packets[0].PacketFees, 2)
-
- s.Require().True(actualFee1.RecvFee.IsEqual(testFee.RecvFee))
- s.Require().True(actualFee1.AckFee.IsEqual(testFee.AckFee))
- s.Require().True(actualFee1.TimeoutFee.IsEqual(testFee.TimeoutFee))
-
- s.Require().True(actualFee2.RecvFee.IsEqual(testFee.RecvFee))
- s.Require().True(actualFee2.AckFee.IsEqual(testFee.AckFee))
- s.Require().True(actualFee2.TimeoutFee.IsEqual(testFee.TimeoutFee))
- })
-
- t.Run("balance of chainAWallet1 should be lowered by sum of recv ack and timeout", func(t *testing.T) {
- actualBalance1, err := s.GetChainANativeBalance(ctx, chainAWallet1)
- s.Require().NoError(err)
-
- expected1 := testvalues.StartingTokenAmount - walletAmount1.Amount - testFee.Total().AmountOf(chainADenom).Int64()
- s.Require().Equal(expected1, actualBalance1)
- })
-
- t.Run("balance of chainAWallet2 should be lowered by sum of recv ack and timeout", func(t *testing.T) {
- actualBalance2, err := s.GetChainANativeBalance(ctx, chainAWallet2)
- s.Require().NoError(err)
-
- expected2 := testvalues.StartingTokenAmount - testFee.Total().AmountOf(chainADenom).Int64()
- s.Require().Equal(expected2, actualBalance2)
- })
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("packets are relayed", func(t *testing.T) {
- packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID)
- s.Require().NoError(err)
- s.Require().Empty(packets)
- })
-
- t.Run("timeout fee is refunded", func(t *testing.T) {
- actualBalance1, err := s.GetChainANativeBalance(ctx, chainAWallet1)
- s.Require().NoError(err)
-
- // once the relayer has relayed the packets, the timeout fee should be refunded.
- expected1 := testvalues.StartingTokenAmount - walletAmount1.Amount - testFee.AckFee.AmountOf(chainADenom).Int64() - testFee.RecvFee.AmountOf(chainADenom).Int64()
- s.Require().Equal(expected1, actualBalance1)
-
- actualBalance2, err := s.GetChainANativeBalance(ctx, chainAWallet2)
- s.Require().NoError(err)
-
- // once the relayer has relayed the packets, the timeout fee should be refunded.
- expected2 := testvalues.StartingTokenAmount - testFee.AckFee.AmountOf(chainADenom).Int64() - testFee.RecvFee.AmountOf(chainADenom).Int64()
- s.Require().Equal(expected2, actualBalance2)
- })
-}
-
-// feeMiddlewareChannelOptions configures both of the chains to have fee middleware enabled.
-func feeMiddlewareChannelOptions() func(options *ibc.CreateChannelOptions) {
- return func(opts *ibc.CreateChannelOptions) {
- opts.Version = "{\"fee_version\":\"ics29-1\",\"app_version\":\"ics20-1\"}"
- opts.DestPortName = "transfer"
- opts.SourcePortName = "transfer"
- }
-}
diff --git a/e2e/tests/upgrades/upgrade_test.go b/e2e/tests/upgrades/upgrade_test.go
deleted file mode 100644
index 337a5e266af..00000000000
--- a/e2e/tests/upgrades/upgrade_test.go
+++ /dev/null
@@ -1,583 +0,0 @@
-package upgrades
-
-import (
- "context"
- "fmt"
- "testing"
- "time"
-
- sdk "github.com/cosmos/cosmos-sdk/types"
- banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
- upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
- "github.com/cosmos/gogoproto/proto"
- v6upgrades "github.com/cosmos/interchain-accounts/app/upgrades/v6"
- intertxtypes "github.com/cosmos/interchain-accounts/x/inter-tx/types"
- ibctest "github.com/strangelove-ventures/ibctest/v7"
- "github.com/strangelove-ventures/ibctest/v7/chain/cosmos"
- "github.com/strangelove-ventures/ibctest/v7/ibc"
- test "github.com/strangelove-ventures/ibctest/v7/testutil"
- "github.com/stretchr/testify/suite"
- "golang.org/x/mod/semver"
-
- "github.com/cosmos/ibc-go/e2e/testconfig"
- "github.com/cosmos/ibc-go/e2e/testsuite"
- "github.com/cosmos/ibc-go/e2e/testvalues"
- controllertypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/types"
- icatypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/types"
- v7migrations "github.com/cosmos/ibc-go/v7/modules/core/02-client/migrations/v7"
- clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
- "github.com/cosmos/ibc-go/v7/modules/core/exported"
- solomachine "github.com/cosmos/ibc-go/v7/modules/light-clients/06-solomachine"
- ibctesting "github.com/cosmos/ibc-go/v7/testing"
- simappupgrades "github.com/cosmos/ibc-go/v7/testing/simapp/upgrades"
- v7upgrades "github.com/cosmos/ibc-go/v7/testing/simapp/upgrades/v7"
-)
-
-const (
- haltHeight = uint64(100)
- blocksAfterUpgrade = uint64(10)
-)
-
-func TestUpgradeTestSuite(t *testing.T) {
- suite.Run(t, new(UpgradeTestSuite))
-}
-
-type UpgradeTestSuite struct {
- testsuite.E2ETestSuite
-}
-
-// UpgradeChain upgrades a chain to a specific version using the planName provided.
-// The software upgrade proposal is broadcast by the provided wallet.
-func (s *UpgradeTestSuite) UpgradeChain(ctx context.Context, chain *cosmos.CosmosChain, wallet ibc.Wallet, planName, currentVersion, upgradeVersion string) {
- plan := upgradetypes.Plan{
- Name: planName,
- Height: int64(haltHeight),
- Info: fmt.Sprintf("upgrade version test from %s to %s", currentVersion, upgradeVersion),
- }
-
- upgradeProposal := upgradetypes.NewSoftwareUpgradeProposal(fmt.Sprintf("upgrade from %s to %s", currentVersion, upgradeVersion), "upgrade chain E2E test", plan)
- s.ExecuteGovProposal(ctx, chain, wallet, upgradeProposal)
-
- height, err := chain.Height(ctx)
- s.Require().NoError(err, "error fetching height before upgrade")
-
- timeoutCtx, timeoutCtxCancel := context.WithTimeout(ctx, time.Minute*2)
- defer timeoutCtxCancel()
-
- err = test.WaitForBlocks(timeoutCtx, int(haltHeight-height)+1, chain)
- s.Require().Error(err, "chain did not halt at halt height")
-
- err = chain.StopAllNodes(ctx)
- s.Require().NoError(err, "error stopping node(s)")
-
- chain.UpgradeVersion(ctx, s.DockerClient, upgradeVersion)
-
- err = chain.StartAllNodes(ctx)
- s.Require().NoError(err, "error starting upgraded node(s)")
-
- // we are reinitializing the clients because we need to update the hostGRPCAddress after
- // the upgrade and subsequent restarting of nodes
- s.InitGRPCClients(chain)
-
- timeoutCtx, timeoutCtxCancel = context.WithTimeout(ctx, time.Minute*2)
- defer timeoutCtxCancel()
-
- err = test.WaitForBlocks(timeoutCtx, int(blocksAfterUpgrade), chain)
- s.Require().NoError(err, "chain did not produce blocks after upgrade")
-
- height, err = chain.Height(ctx)
- s.Require().NoError(err, "error fetching height after upgrade")
-
- s.Require().Greater(height, haltHeight, "height did not increment after upgrade")
-}
-
-func (s *UpgradeTestSuite) TestV4ToV5ChainUpgrade() {
- t := s.T()
- testCfg := testconfig.FromEnv()
-
- ctx := context.Background()
- relayer, channelA := s.SetupChainsRelayerAndChannel(ctx)
- chainA, chainB := s.GetChains()
-
- var (
- chainADenom = chainA.Config().Denom
- chainBIBCToken = testsuite.GetIBCToken(chainADenom, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID) // IBC token sent to chainB
-
- chainBDenom = chainB.Config().Denom
- chainAIBCToken = testsuite.GetIBCToken(chainBDenom, channelA.PortID, channelA.ChannelID) // IBC token sent to chainA
- )
-
- // create separate user specifically for the upgrade proposal to more easily verify starting
- // and end balances of the chainA users.
- chainAUpgradeProposalWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
-
- chainAWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
- chainAAddress := chainAWallet.FormattedAddress()
-
- chainBWallet := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount)
- chainBAddress := chainBWallet.FormattedAddress()
-
- s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB), "failed to wait for blocks")
-
- t.Run("native IBC token transfer from chainA to chainB, sender is source of tokens", func(t *testing.T) {
- transferTxResp, err := s.Transfer(ctx, chainA, chainAWallet, channelA.PortID, channelA.ChannelID, testvalues.DefaultTransferAmount(chainADenom), chainAAddress, chainBAddress, s.GetTimeoutHeight(ctx, chainB), 0, "")
- s.Require().NoError(err)
- s.AssertValidTxResponse(transferTxResp)
- })
-
- t.Run("tokens are escrowed", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - testvalues.IBCTransferAmount
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("packets are relayed", func(t *testing.T) {
- s.AssertPacketRelayed(ctx, chainA, channelA.PortID, channelA.ChannelID, 1)
-
- actualBalance, err := chainB.GetBalance(ctx, chainBAddress, chainBIBCToken.IBCDenom())
- s.Require().NoError(err)
-
- expected := testvalues.IBCTransferAmount
- s.Require().Equal(expected, actualBalance)
- })
-
- s.Require().NoError(test.WaitForBlocks(ctx, 5, chainA, chainB), "failed to wait for blocks")
-
- t.Run("upgrade chainA", func(t *testing.T) {
- s.UpgradeChain(ctx, chainA, chainAUpgradeProposalWallet, simappupgrades.DefaultUpgradeName, testCfg.ChainAConfig.Tag, testCfg.UpgradeTag)
- })
-
- t.Run("restart relayer", func(t *testing.T) {
- s.StopRelayer(ctx, relayer)
- s.StartRelayer(relayer)
- })
-
- t.Run("native IBC token transfer from chainA to chainB, sender is source of tokens", func(t *testing.T) {
- transferTxResp, err := s.Transfer(ctx, chainA, chainAWallet, channelA.PortID, channelA.ChannelID, testvalues.DefaultTransferAmount(chainADenom), chainAAddress, chainBAddress, s.GetTimeoutHeight(ctx, chainB), 0, "")
- s.Require().NoError(err)
- s.AssertValidTxResponse(transferTxResp)
- })
-
- s.Require().NoError(test.WaitForBlocks(ctx, 5, chainA, chainB), "failed to wait for blocks")
-
- t.Run("packets are relayed", func(t *testing.T) {
- s.AssertPacketRelayed(ctx, chainA, channelA.PortID, channelA.ChannelID, 2)
-
- actualBalance, err := chainB.GetBalance(ctx, chainBAddress, chainBIBCToken.IBCDenom())
- s.Require().NoError(err)
-
- expected := testvalues.IBCTransferAmount * 2
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("ensure packets can be received, send from chainB to chainA", func(t *testing.T) {
- t.Run("send from chainB to chainA", func(t *testing.T) {
- transferTxResp, err := s.Transfer(ctx, chainB, chainBWallet, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID, testvalues.DefaultTransferAmount(chainBDenom), chainBAddress, chainAAddress, s.GetTimeoutHeight(ctx, chainA), 0, "")
- s.Require().NoError(err)
- s.AssertValidTxResponse(transferTxResp)
- })
-
- s.Require().NoError(test.WaitForBlocks(ctx, 5, chainA, chainB), "failed to wait for blocks")
-
- t.Run("packets are relayed", func(t *testing.T) {
- s.AssertPacketRelayed(ctx, chainA, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID, 1)
-
- actualBalance, err := chainA.GetBalance(ctx, chainAAddress, chainAIBCToken.IBCDenom())
- s.Require().NoError(err)
-
- expected := testvalues.IBCTransferAmount
- s.Require().Equal(expected, actualBalance)
- })
- })
-}
-
-func (s *UpgradeTestSuite) TestV5ToV6ChainUpgrade() {
- t := s.T()
- testCfg := testconfig.FromEnv()
-
- ctx := context.Background()
- relayer, _ := s.SetupChainsRelayerAndChannel(ctx)
- chainA, chainB := s.GetChains()
-
- // create separate user specifically for the upgrade proposal to more easily verify starting
- // and end balances of the chainA users.
- chainAUpgradeProposalWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
-
- s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB), "failed to wait for blocks")
-
- // setup 2 accounts: controller account on chain A, a second chain B account.
- // host account will be created when the ICA is registered
- controllerAccount := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
- chainBAccount := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount)
- var hostAccount string
-
- t.Run("register interchain account", func(t *testing.T) {
- version := getICAVersion(testconfig.GetChainATag(), testconfig.GetChainBTag())
- msgRegisterAccount := intertxtypes.NewMsgRegisterAccount(controllerAccount.FormattedAddress(), ibctesting.FirstConnectionID, version)
- err := s.RegisterInterchainAccount(ctx, chainA, controllerAccount, msgRegisterAccount)
- s.Require().NoError(err)
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("verify interchain account", func(t *testing.T) {
- var err error
- hostAccount, err = s.QueryInterchainAccount(ctx, chainA, controllerAccount.FormattedAddress(), ibctesting.FirstConnectionID)
- s.Require().NoError(err)
- s.Require().NotZero(len(hostAccount))
-
- channels, err := relayer.GetChannels(ctx, s.GetRelayerExecReporter(), chainA.Config().ChainID)
- s.Require().NoError(err)
- s.Require().Equal(len(channels), 2)
- })
-
- t.Run("interchain account executes a bank transfer on behalf of the corresponding owner account", func(t *testing.T) {
- t.Run("fund interchain account wallet", func(t *testing.T) {
- // fund the host account account so it has some $$ to send
- err := chainB.SendFunds(ctx, ibctest.FaucetAccountKeyName, ibc.WalletAmount{
- Address: hostAccount,
- Amount: testvalues.StartingTokenAmount,
- Denom: chainB.Config().Denom,
- })
- s.Require().NoError(err)
- })
-
- t.Run("broadcast MsgSubmitTx (legacy)", func(t *testing.T) {
- // assemble bank transfer message from host account to user account on host chain
- msgSend := &banktypes.MsgSend{
- FromAddress: hostAccount,
- ToAddress: chainBAccount.FormattedAddress(),
- Amount: sdk.NewCoins(testvalues.DefaultTransferAmount(chainB.Config().Denom)),
- }
-
- // assemble submitMessage tx for intertx
- msgSubmitTx, err := intertxtypes.NewMsgSubmitTx(
- msgSend,
- ibctesting.FirstConnectionID,
- controllerAccount.FormattedAddress(),
- )
- s.Require().NoError(err)
-
- // broadcast submitMessage tx from controller account on chain A
- // this message should trigger the sending of an ICA packet over channel-1 (channel created between controller and host)
- // this ICA packet contains the assembled bank transfer message from above, which will be executed by the host account on the host chain.
- resp, err := s.BroadcastMessages(
- ctx,
- chainA,
- controllerAccount,
- msgSubmitTx,
- )
-
- s.AssertValidTxResponse(resp)
- s.Require().NoError(err)
-
- s.Require().NoError(test.WaitForBlocks(ctx, 10, chainA, chainB))
- })
-
- t.Run("verify tokens transferred", func(t *testing.T) {
- balance, err := chainB.GetBalance(ctx, chainBAccount.FormattedAddress(), chainB.Config().Denom)
- s.Require().NoError(err)
-
- _, err = chainB.GetBalance(ctx, hostAccount, chainB.Config().Denom)
- s.Require().NoError(err)
-
- expected := testvalues.IBCTransferAmount + testvalues.StartingTokenAmount
- s.Require().Equal(expected, balance)
- })
- })
-
- s.Require().NoError(test.WaitForBlocks(ctx, 5, chainA, chainB), "failed to wait for blocks")
-
- t.Run("upgrade chainA", func(t *testing.T) {
- s.UpgradeChain(ctx, chainA, chainAUpgradeProposalWallet, v6upgrades.UpgradeName, testCfg.ChainAConfig.Tag, testCfg.UpgradeTag)
- })
-
- t.Run("restart relayer", func(t *testing.T) {
- s.StopRelayer(ctx, relayer)
- s.StartRelayer(relayer)
- })
-
- t.Run("broadcast MsgSubmitTx (legacy)", func(t *testing.T) {
- // assemble bank transfer message from host account to user account on host chain
- msgSend := &banktypes.MsgSend{
- FromAddress: hostAccount,
- ToAddress: chainBAccount.FormattedAddress(),
- Amount: sdk.NewCoins(testvalues.DefaultTransferAmount(chainB.Config().Denom)),
- }
-
- // assemble submitMessage tx for intertx
- msgSubmitTx, err := intertxtypes.NewMsgSubmitTx(
- msgSend,
- ibctesting.FirstConnectionID,
- controllerAccount.FormattedAddress(),
- )
- s.Require().NoError(err)
-
- // broadcast submitMessage tx from controller account on chain A
- // this message should trigger the sending of an ICA packet over channel-1 (channel created between controller and host)
- // this ICA packet contains the assembled bank transfer message from above, which will be executed by the host account on the host chain.
- resp, err := s.BroadcastMessages(
- ctx,
- chainA,
- controllerAccount,
- msgSubmitTx,
- )
-
- s.AssertValidTxResponse(resp)
- s.Require().NoError(err)
-
- s.Require().NoError(test.WaitForBlocks(ctx, 10, chainA, chainB))
- })
-
- t.Run("verify tokens transferred", func(t *testing.T) {
- balance, err := chainB.GetBalance(ctx, chainBAccount.FormattedAddress(), chainB.Config().Denom)
- s.Require().NoError(err)
-
- _, err = chainB.GetBalance(ctx, hostAccount, chainB.Config().Denom)
- s.Require().NoError(err)
-
- expected := (testvalues.IBCTransferAmount * 2) + testvalues.StartingTokenAmount
- s.Require().Equal(expected, balance)
- })
-
- t.Run("broadcast MsgSendTx (MsgServer)", func(t *testing.T) {
- // assemble bank transfer message from host account to user account on host chain
- msgSend := &banktypes.MsgSend{
- FromAddress: hostAccount,
- ToAddress: chainBAccount.FormattedAddress(),
- Amount: sdk.NewCoins(testvalues.DefaultTransferAmount(chainB.Config().Denom)),
- }
-
- data, err := icatypes.SerializeCosmosTx(testsuite.Codec(), []proto.Message{msgSend})
- s.Require().NoError(err)
-
- icaPacketData := icatypes.InterchainAccountPacketData{
- Type: icatypes.EXECUTE_TX,
- Data: data,
- }
-
- relativeTimeoutTimestamp := uint64(time.Hour.Nanoseconds())
- msgSendTx := controllertypes.NewMsgSendTx(controllerAccount.FormattedAddress(), ibctesting.FirstConnectionID, relativeTimeoutTimestamp, icaPacketData)
-
- // broadcast MsgSendTx tx from controller account on chain A
- // this message should trigger the sending of an ICA packet over channel-1 (channel created between controller and host)
- // this ICA packet contains the assembled bank transfer message from above, which will be executed by the host account on the host chain.
- resp, err := s.BroadcastMessages(
- ctx,
- chainA,
- controllerAccount,
- msgSendTx,
- )
-
- s.AssertValidTxResponse(resp)
- s.Require().NoError(err)
-
- s.Require().NoError(test.WaitForBlocks(ctx, 10, chainA, chainB))
- })
-
- t.Run("verify tokens transferred", func(t *testing.T) {
- balance, err := chainB.GetBalance(ctx, chainBAccount.FormattedAddress(), chainB.Config().Denom)
- s.Require().NoError(err)
-
- _, err = chainB.GetBalance(ctx, hostAccount, chainB.Config().Denom)
- s.Require().NoError(err)
-
- expected := (testvalues.IBCTransferAmount * 3) + testvalues.StartingTokenAmount
- s.Require().Equal(expected, balance)
- })
-}
-
-// TestV6ToV7ChainUpgrade will test that an upgrade from a v6 ibc-go binary to a v7 ibc-go binary is successful
-// and that the automatic migrations associated with the 02-client module are performed. Namely that the solo machine
-// proto definition is migrated in state from the v2 to v3 definition. This is checked by creating a solo machine client
-// before the upgrade and asserting that its TypeURL has been changed after the upgrade. The test also ensure packets
-// can be sent before and after the upgrade without issue
-func (s *UpgradeTestSuite) TestV6ToV7ChainUpgrade() {
- t := s.T()
- testCfg := testconfig.FromEnv()
-
- ctx := context.Background()
- relayer, channelA := s.SetupChainsRelayerAndChannel(ctx)
- chainA, chainB := s.GetChains()
-
- var (
- chainADenom = chainA.Config().Denom
- chainBIBCToken = testsuite.GetIBCToken(chainADenom, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID) // IBC token sent to chainB
- )
-
- chainAWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
- chainAAddress := chainAWallet.FormattedAddress()
-
- chainBWallet := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount)
- chainBAddress := chainBWallet.FormattedAddress()
-
- // create second tendermint client
- createClientOptions := ibc.CreateClientOptions{
- TrustingPeriod: ibctesting.TrustingPeriod.String(),
- }
-
- s.SetupClients(ctx, relayer, createClientOptions)
-
- s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB), "failed to wait for blocks")
-
- t.Run("check that both tendermint clients are active", func(t *testing.T) {
- status, err := s.QueryClientStatus(ctx, chainA, testvalues.TendermintClientID(0))
- s.Require().NoError(err)
- s.Require().Equal(exported.Active.String(), status)
-
- status, err = s.QueryClientStatus(ctx, chainA, testvalues.TendermintClientID(1))
- s.Require().NoError(err)
- s.Require().Equal(exported.Active.String(), status)
- })
-
- // create solo machine client using the solomachine implementation from ibctesting
- // TODO: the solomachine clientID should be updated when after fix of this issue: https://github.com/cosmos/ibc-go/issues/2907
- solo := ibctesting.NewSolomachine(t, testsuite.Codec(), "solomachine", "testing", 1)
-
- legacyConsensusState := &v7migrations.ConsensusState{
- PublicKey: solo.ConsensusState().PublicKey,
- Diversifier: solo.ConsensusState().Diversifier,
- Timestamp: solo.ConsensusState().Timestamp,
- }
-
- legacyClientState := &v7migrations.ClientState{
- Sequence: solo.ClientState().Sequence,
- IsFrozen: solo.ClientState().IsFrozen,
- ConsensusState: legacyConsensusState,
- AllowUpdateAfterProposal: true,
- }
-
- msgCreateSoloMachineClient, err := clienttypes.NewMsgCreateClient(legacyClientState, legacyConsensusState, chainAAddress)
- s.Require().NoError(err)
-
- resp, err := s.BroadcastMessages(
- ctx,
- chainA,
- chainAWallet,
- msgCreateSoloMachineClient,
- )
-
- s.AssertValidTxResponse(resp)
- s.Require().NoError(err)
-
- t.Run("check that the solomachine is now active and that the clientstate is a pre-upgrade v2 solomachine clientstate", func(t *testing.T) {
- status, err := s.QueryClientStatus(ctx, chainA, testvalues.SolomachineClientID(2))
- s.Require().NoError(err)
- s.Require().Equal(exported.Active.String(), status)
-
- res, err := s.ClientState(ctx, chainA, testvalues.SolomachineClientID(2))
- s.Require().NoError(err)
- s.Require().Equal(fmt.Sprint("/", proto.MessageName(&v7migrations.ClientState{})), res.ClientState.TypeUrl)
- })
-
- s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB), "failed to wait for blocks")
-
- t.Run("IBC token transfer from chainA to chainB, sender is source of tokens", func(t *testing.T) {
- transferTxResp, err := s.Transfer(ctx, chainA, chainAWallet, channelA.PortID, channelA.ChannelID, testvalues.DefaultTransferAmount(chainADenom), chainAAddress, chainBAddress, s.GetTimeoutHeight(ctx, chainB), 0, "")
- s.Require().NoError(err)
- s.AssertValidTxResponse(transferTxResp)
- })
-
- t.Run("tokens are escrowed", func(t *testing.T) {
- actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet)
- s.Require().NoError(err)
-
- expected := testvalues.StartingTokenAmount - testvalues.IBCTransferAmount
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("start relayer", func(t *testing.T) {
- s.StartRelayer(relayer)
- })
-
- t.Run("packets are relayed", func(t *testing.T) {
- s.AssertPacketRelayed(ctx, chainA, channelA.PortID, channelA.ChannelID, 1)
-
- actualBalance, err := chainB.GetBalance(ctx, chainBAddress, chainBIBCToken.IBCDenom())
- s.Require().NoError(err)
-
- expected := testvalues.IBCTransferAmount
- s.Require().Equal(expected, actualBalance)
- })
-
- // create separate user specifically for the upgrade proposal to more easily verify starting
- // and end balances of the chainA users.
- chainAUpgradeProposalWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount)
-
- t.Run("upgrade chainA", func(t *testing.T) {
- s.UpgradeChain(ctx, chainA, chainAUpgradeProposalWallet, v7upgrades.UpgradeName, testCfg.ChainAConfig.Tag, testCfg.UpgradeTag)
- })
-
- t.Run("check that the tendermint clients are active again after upgrade", func(t *testing.T) {
- status, err := s.QueryClientStatus(ctx, chainA, testvalues.TendermintClientID(0))
- s.Require().NoError(err)
- s.Require().Equal(exported.Active.String(), status)
-
- status, err = s.QueryClientStatus(ctx, chainA, testvalues.TendermintClientID(1))
- s.Require().NoError(err)
- s.Require().Equal(exported.Active.String(), status)
- })
-
- t.Run("IBC token transfer from chainA to chainB, to make sure the upgrade did not break the packet flow", func(t *testing.T) {
- transferTxResp, err := s.Transfer(ctx, chainA, chainAWallet, channelA.PortID, channelA.ChannelID, testvalues.DefaultTransferAmount(chainADenom), chainAAddress, chainBAddress, s.GetTimeoutHeight(ctx, chainB), 0, "")
- s.Require().NoError(err)
- s.AssertValidTxResponse(transferTxResp)
- })
-
- t.Run("packets are relayed", func(t *testing.T) {
- s.AssertPacketRelayed(ctx, chainA, channelA.PortID, channelA.ChannelID, 1)
-
- actualBalance, err := chainB.GetBalance(ctx, chainBAddress, chainBIBCToken.IBCDenom())
- s.Require().NoError(err)
-
- expected := testvalues.IBCTransferAmount * 2
- s.Require().Equal(expected, actualBalance)
- })
-
- t.Run("check that the v2 solo machine clientstate has been updated to the v3 solo machine clientstate", func(t *testing.T) {
- res, err := s.ClientState(ctx, chainA, testvalues.SolomachineClientID(2))
- s.Require().NoError(err)
- s.Require().Equal(fmt.Sprint("/", proto.MessageName(&solomachine.ClientState{})), res.ClientState.TypeUrl)
- })
-}
-
-// RegisterInterchainAccount will attempt to register an interchain account on the counterparty chain.
-func (s *UpgradeTestSuite) RegisterInterchainAccount(ctx context.Context, chain *cosmos.CosmosChain, user ibc.Wallet, msgRegisterAccount *intertxtypes.MsgRegisterAccount) error {
- txResp, err := s.BroadcastMessages(ctx, chain, user, msgRegisterAccount)
- s.Require().NoError(err)
- s.AssertValidTxResponse(txResp)
- return err
-}
-
-// getICAVersion returns the version which should be used in the MsgRegisterAccount broadcast from the
-// controller chain.
-func getICAVersion(chainAVersion, chainBVersion string) string {
- chainBIsGreaterThanOrEqualToChainA := semver.Compare(chainAVersion, chainBVersion) <= 0
- if chainBIsGreaterThanOrEqualToChainA {
- // allow version to be specified by the controller chain
- return ""
- }
- // explicitly set the version string because the host chain might not yet support incentivized channels.
- return icatypes.NewDefaultMetadataString(ibctesting.FirstConnectionID, ibctesting.FirstConnectionID)
-}
-
-// ClientState queries the current ClientState by clientID
-func (s *UpgradeTestSuite) ClientState(ctx context.Context, chain ibc.Chain, clientID string) (*clienttypes.QueryClientStateResponse, error) {
- queryClient := s.GetChainGRCPClients(chain).ClientQueryClient
- res, err := queryClient.ClientState(ctx, &clienttypes.QueryClientStateRequest{
- ClientId: clientID,
- })
- if err != nil {
- return res, err
- }
-
- return res, nil
-}
diff --git a/e2e/testsuite/codec.go b/e2e/testsuite/codec.go
deleted file mode 100644
index a203078079c..00000000000
--- a/e2e/testsuite/codec.go
+++ /dev/null
@@ -1,46 +0,0 @@
-package testsuite
-
-import (
- "github.com/cosmos/cosmos-sdk/codec"
- sdkcodec "github.com/cosmos/cosmos-sdk/crypto/codec"
- authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
- banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
- govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
- govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1"
- grouptypes "github.com/cosmos/cosmos-sdk/x/group"
- proposaltypes "github.com/cosmos/cosmos-sdk/x/params/types/proposal"
-
- icacontrollertypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/types"
- feetypes "github.com/cosmos/ibc-go/v7/modules/apps/29-fee/types"
- transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
- clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
- simappparams "github.com/cosmos/ibc-go/v7/testing/simapp/params"
-)
-
-func Codec() *codec.ProtoCodec {
- cdc, _ := codecAndEncodingConfig()
- return cdc
-}
-
-func EncodingConfig() simappparams.EncodingConfig {
- _, cfg := codecAndEncodingConfig()
- return cfg
-}
-
-func codecAndEncodingConfig() (*codec.ProtoCodec, simappparams.EncodingConfig) {
- cfg := simappparams.MakeTestEncodingConfig()
- banktypes.RegisterInterfaces(cfg.InterfaceRegistry)
- govv1beta1.RegisterInterfaces(cfg.InterfaceRegistry)
- govv1.RegisterInterfaces(cfg.InterfaceRegistry)
- authtypes.RegisterInterfaces(cfg.InterfaceRegistry)
- feetypes.RegisterInterfaces(cfg.InterfaceRegistry)
- icacontrollertypes.RegisterInterfaces(cfg.InterfaceRegistry)
- sdkcodec.RegisterInterfaces(cfg.InterfaceRegistry)
- grouptypes.RegisterInterfaces(cfg.InterfaceRegistry)
- proposaltypes.RegisterInterfaces(cfg.InterfaceRegistry)
- transfertypes.RegisterInterfaces(cfg.InterfaceRegistry)
- clienttypes.RegisterInterfaces(cfg.InterfaceRegistry)
-
- cdc := codec.NewProtoCodec(cfg.InterfaceRegistry)
- return cdc, cfg
-}
diff --git a/e2e/testsuite/grpc_query.go b/e2e/testsuite/grpc_query.go
deleted file mode 100644
index 5babe87970f..00000000000
--- a/e2e/testsuite/grpc_query.go
+++ /dev/null
@@ -1,159 +0,0 @@
-package testsuite
-
-import (
- "context"
-
- govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
- govtypesbeta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1"
- intertxtypes "github.com/cosmos/interchain-accounts/x/inter-tx/types"
- "github.com/strangelove-ventures/ibctest/v7/chain/cosmos"
- "github.com/strangelove-ventures/ibctest/v7/ibc"
-
- controllertypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/types"
- feetypes "github.com/cosmos/ibc-go/v7/modules/apps/29-fee/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"
- ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported"
-)
-
-// QueryClientState queries the client state on the given chain for the provided clientID.
-func (s *E2ETestSuite) QueryClientState(ctx context.Context, chain ibc.Chain, clientID string) (ibcexported.ClientState, error) {
- queryClient := s.GetChainGRCPClients(chain).ClientQueryClient
- res, err := queryClient.ClientState(ctx, &clienttypes.QueryClientStateRequest{
- ClientId: clientID,
- })
- if err != nil {
- return nil, err
- }
-
- clientState, err := clienttypes.UnpackClientState(res.ClientState)
- if err != nil {
- return nil, err
- }
-
- return clientState, nil
-}
-
-// QueryClientStatus queries the status of the client by clientID
-func (s *E2ETestSuite) QueryClientStatus(ctx context.Context, chain ibc.Chain, clientID string) (string, error) {
- queryClient := s.GetChainGRCPClients(chain).ClientQueryClient
- res, err := queryClient.ClientStatus(ctx, &clienttypes.QueryClientStatusRequest{
- ClientId: clientID,
- })
- if err != nil {
- return "", err
- }
-
- return res.Status, nil
-}
-
-// QueryChannel queries the channel on a given chain for the provided portID and channelID
-func (s *E2ETestSuite) QueryChannel(ctx context.Context, chain ibc.Chain, portID, channelID string) (channeltypes.Channel, error) {
- queryClient := s.GetChainGRCPClients(chain).ChannelQueryClient
- res, err := queryClient.Channel(ctx, &channeltypes.QueryChannelRequest{
- PortId: portID,
- ChannelId: channelID,
- })
- if err != nil {
- return channeltypes.Channel{}, err
- }
-
- return *res.Channel, nil
-}
-
-// QueryPacketCommitment queries the packet commitment on the given chain for the provided channel and sequence.
-func (s *E2ETestSuite) QueryPacketCommitment(ctx context.Context, chain ibc.Chain, portID, channelID string, sequence uint64) ([]byte, error) {
- queryClient := s.GetChainGRCPClients(chain).ChannelQueryClient
- res, err := queryClient.PacketCommitment(ctx, &channeltypes.QueryPacketCommitmentRequest{
- PortId: portID,
- ChannelId: channelID,
- Sequence: sequence,
- })
- if err != nil {
- return nil, err
- }
- return res.Commitment, nil
-}
-
-// QueryInterchainAccount queries the interchain account for the given owner and connectionID.
-func (s *E2ETestSuite) QueryInterchainAccount(ctx context.Context, chain ibc.Chain, owner, connectionID string) (string, error) {
- queryClient := s.GetChainGRCPClients(chain).ICAQueryClient
- res, err := queryClient.InterchainAccount(ctx, &controllertypes.QueryInterchainAccountRequest{
- Owner: owner,
- ConnectionId: connectionID,
- })
- if err != nil {
- return "", err
- }
- return res.Address, nil
-}
-
-// QueryInterchainAccountLegacy queries the interchain account for the given owner and connectionID using the intertx module.
-func (s *E2ETestSuite) QueryInterchainAccountLegacy(ctx context.Context, chain ibc.Chain, owner, connectionID string) (string, error) {
- queryClient := s.GetChainGRCPClients(chain).InterTxQueryClient
- res, err := queryClient.InterchainAccount(ctx, &intertxtypes.QueryInterchainAccountRequest{
- Owner: owner,
- ConnectionId: connectionID,
- })
- if err != nil {
- return "", err
- }
-
- return res.InterchainAccountAddress, nil
-}
-
-// QueryIncentivizedPacketsForChannel queries the incentivized packets on the specified channel.
-func (s *E2ETestSuite) QueryIncentivizedPacketsForChannel(
- ctx context.Context,
- chain *cosmos.CosmosChain,
- portId,
- channelId string,
-) ([]*feetypes.IdentifiedPacketFees, error) {
- queryClient := s.GetChainGRCPClients(chain).FeeQueryClient
- res, err := queryClient.IncentivizedPacketsForChannel(ctx, &feetypes.QueryIncentivizedPacketsForChannelRequest{
- PortId: portId,
- ChannelId: channelId,
- })
- if err != nil {
- return nil, err
- }
- return res.IncentivizedPackets, err
-}
-
-// QueryCounterPartyPayee queries the counterparty payee of the given chain and relayer address on the specified channel.
-func (s *E2ETestSuite) QueryCounterPartyPayee(ctx context.Context, chain ibc.Chain, relayerAddress, channelID string) (string, error) {
- queryClient := s.GetChainGRCPClients(chain).FeeQueryClient
- res, err := queryClient.CounterpartyPayee(ctx, &feetypes.QueryCounterpartyPayeeRequest{
- ChannelId: channelID,
- Relayer: relayerAddress,
- })
- if err != nil {
- return "", err
- }
- return res.CounterpartyPayee, nil
-}
-
-// QueryProposal queries the governance proposal on the given chain with the given proposal ID.
-func (s *E2ETestSuite) QueryProposal(ctx context.Context, chain ibc.Chain, proposalID uint64) (govtypesbeta1.Proposal, error) {
- queryClient := s.GetChainGRCPClients(chain).GovQueryClient
- res, err := queryClient.Proposal(ctx, &govtypesbeta1.QueryProposalRequest{
- ProposalId: proposalID,
- })
- if err != nil {
- return govtypesbeta1.Proposal{}, err
- }
-
- return res.Proposal, nil
-}
-
-func (s *E2ETestSuite) QueryProposalV1(ctx context.Context, chain ibc.Chain, proposalID uint64) (govtypesv1.Proposal, error) {
- queryClient := s.GetChainGRCPClients(chain).GovQueryClientV1
- res, err := queryClient.Proposal(ctx, &govtypesv1.QueryProposalRequest{
- ProposalId: proposalID,
- })
- if err != nil {
- return govtypesv1.Proposal{}, err
- }
-
- return *res.Proposal, nil
-}
diff --git a/e2e/testsuite/relayer.go b/e2e/testsuite/relayer.go
deleted file mode 100644
index 3728eac56bb..00000000000
--- a/e2e/testsuite/relayer.go
+++ /dev/null
@@ -1,31 +0,0 @@
-package testsuite
-
-import (
- "testing"
-
- dockerclient "github.com/docker/docker/client"
- "github.com/strangelove-ventures/ibctest/v7"
- "github.com/strangelove-ventures/ibctest/v7/ibc"
- "github.com/strangelove-ventures/ibctest/v7/relayer"
- "go.uber.org/zap"
-
- "github.com/cosmos/ibc-go/e2e/testconfig"
-)
-
-const (
- cosmosRelayerRepository = "ghcr.io/cosmos/relayer"
- cosmosRelayerUser = "100:1000" // docker run -it --rm --entrypoint echo ghcr.io/cosmos/relayer "$(id -u):$(id -g)"
-)
-
-// newCosmosRelayer returns an instance of the go relayer.
-// Options are used to allow for relayer version selection and specifying the default processing option.
-func newCosmosRelayer(t *testing.T, tc testconfig.TestConfig, logger *zap.Logger, dockerClient *dockerclient.Client, network string) ibc.Relayer {
- customImageOption := relayer.CustomDockerImage(cosmosRelayerRepository, tc.RlyTag, cosmosRelayerUser)
- relayerProcessingOption := relayer.StartupFlags("-p", "events") // relayer processes via events
-
- relayerFactory := ibctest.NewBuiltinRelayerFactory(ibc.CosmosRly, logger, customImageOption, relayerProcessingOption)
-
- return relayerFactory.Build(
- t, dockerClient, network,
- )
-}
diff --git a/e2e/testsuite/testsuite.go b/e2e/testsuite/testsuite.go
deleted file mode 100644
index 42503349078..00000000000
--- a/e2e/testsuite/testsuite.go
+++ /dev/null
@@ -1,561 +0,0 @@
-package testsuite
-
-import (
- "context"
- "errors"
- "fmt"
- "strconv"
- "strings"
- "time"
-
- "github.com/cosmos/cosmos-sdk/client"
- "github.com/cosmos/cosmos-sdk/client/tx"
- sdk "github.com/cosmos/cosmos-sdk/types"
- signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing"
- authtx "github.com/cosmos/cosmos-sdk/x/auth/tx"
- authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
- govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
- govtypesv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1"
- grouptypes "github.com/cosmos/cosmos-sdk/x/group"
- paramsproposaltypes "github.com/cosmos/cosmos-sdk/x/params/types/proposal"
- intertxtypes "github.com/cosmos/interchain-accounts/x/inter-tx/types"
- dockerclient "github.com/docker/docker/client"
- "github.com/strangelove-ventures/ibctest/v7"
- "github.com/strangelove-ventures/ibctest/v7/chain/cosmos"
- "github.com/strangelove-ventures/ibctest/v7/ibc"
- "github.com/strangelove-ventures/ibctest/v7/testreporter"
- test "github.com/strangelove-ventures/ibctest/v7/testutil"
- "github.com/stretchr/testify/suite"
- "go.uber.org/zap"
- "go.uber.org/zap/zaptest"
- "google.golang.org/grpc"
- "google.golang.org/grpc/credentials/insecure"
-
- "github.com/cosmos/ibc-go/e2e/testconfig"
- "github.com/cosmos/ibc-go/e2e/testvalues"
- controllertypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/types"
- feetypes "github.com/cosmos/ibc-go/v7/modules/apps/29-fee/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"
-)
-
-const (
- // ChainARelayerName is the name given to the relayer wallet on ChainA
- ChainARelayerName = "rlyA"
- // ChainBRelayerName is the name given to the relayer wallet on ChainB
- ChainBRelayerName = "rlyB"
- // DefaultGasValue is the default gas value used to configure tx.Factory
- DefaultGasValue = 500000
- // emptyLogs is the string value returned from `BroadcastMessages`. There are some situations in which
- // the result is empty, when this happens we include the raw logs instead to get as much information
- // amount the failure as possible.
- emptyLogs = "[]"
-)
-
-// E2ETestSuite has methods and functionality which can be shared among all test suites.
-type E2ETestSuite struct {
- suite.Suite
-
- grpcClients map[string]GRPCClients
- paths map[string]path
- logger *zap.Logger
- DockerClient *dockerclient.Client
- network string
- startRelayerFn func(relayer ibc.Relayer)
-
- // pathNameIndex is the latest index to be used for generating paths
- pathNameIndex uint64
-}
-
-// GRPCClients holds a reference to any GRPC clients that are needed by the tests.
-// These should typically be used for query clients only. If we need to make changes, we should
-// use E2ETestSuite.BroadcastMessages to broadcast transactions instead.
-type GRPCClients struct {
- ClientQueryClient clienttypes.QueryClient
- ChannelQueryClient channeltypes.QueryClient
- FeeQueryClient feetypes.QueryClient
- ICAQueryClient controllertypes.QueryClient
- InterTxQueryClient intertxtypes.QueryClient
-
- // SDK query clients
- GovQueryClient govtypesv1beta1.QueryClient
- GovQueryClientV1 govtypesv1.QueryClient
- GroupsQueryClient grouptypes.QueryClient
- ParamsQueryClient paramsproposaltypes.QueryClient
- AuthQueryClient authtypes.QueryClient
-}
-
-// path is a pairing of two chains which will be used in a test.
-type path struct {
- chainA, chainB *cosmos.CosmosChain
-}
-
-// newPath returns a path built from the given chains.
-func newPath(chainA, chainB *cosmos.CosmosChain) path {
- return path{
- chainA: chainA,
- chainB: chainB,
- }
-}
-
-// GetRelayerUsers returns two ibc.Wallet instances which can be used for the relayer users
-// on the two chains.
-func (s *E2ETestSuite) GetRelayerUsers(ctx context.Context, chainOpts ...testconfig.ChainOptionConfiguration) (ibc.Wallet, ibc.Wallet) {
- chainA, chainB := s.GetChains(chainOpts...)
- chainAAccountBytes, err := chainA.GetAddress(ctx, ChainARelayerName)
- s.Require().NoError(err)
-
- chainBAccountBytes, err := chainB.GetAddress(ctx, ChainBRelayerName)
- s.Require().NoError(err)
-
- chainARelayerUser := cosmos.NewWallet(ChainARelayerName, chainAAccountBytes, "", chainA.Config())
- chainBRelayerUser := cosmos.NewWallet(ChainBRelayerName, chainBAccountBytes, "", chainB.Config())
-
- return chainARelayerUser, chainBRelayerUser
-}
-
-// SetupChainsRelayerAndChannel create two chains, a relayer, establishes a connection and creates a channel
-// using the given channel options. The relayer returned by this function has not yet started. It should be started
-// with E2ETestSuite.StartRelayer if needed.
-// This should be called at the start of every test, unless fine grained control is required.
-func (s *E2ETestSuite) SetupChainsRelayerAndChannel(ctx context.Context, channelOpts ...func(*ibc.CreateChannelOptions)) (ibc.Relayer, ibc.ChannelOutput) {
- chainA, chainB := s.GetChains()
-
- r := newCosmosRelayer(s.T(), testconfig.FromEnv(), s.logger, s.DockerClient, s.network)
-
- pathName := s.generatePathName()
-
- channelOptions := ibc.DefaultChannelOpts()
- for _, opt := range channelOpts {
- opt(&channelOptions)
- }
-
- ic := ibctest.NewInterchain().
- AddChain(chainA).
- AddChain(chainB).
- AddRelayer(r, "r").
- AddLink(ibctest.InterchainLink{
- Chain1: chainA,
- Chain2: chainB,
- Relayer: r,
- Path: pathName,
- CreateChannelOpts: channelOptions,
- })
-
- eRep := s.GetRelayerExecReporter()
- s.Require().NoError(ic.Build(ctx, eRep, ibctest.InterchainBuildOptions{
- TestName: s.T().Name(),
- Client: s.DockerClient,
- NetworkID: s.network,
- }))
-
- s.startRelayerFn = func(relayer ibc.Relayer) {
- err := relayer.StartRelayer(ctx, eRep, pathName)
- s.Require().NoError(err, fmt.Sprintf("failed to start relayer: %s", err))
- s.T().Cleanup(func() {
- if !s.T().Failed() {
- if err := relayer.StopRelayer(ctx, eRep); err != nil {
- s.T().Logf("error stopping relayer: %v", err)
- }
- }
- })
- // wait for relayer to start.
- time.Sleep(time.Second * 10)
- }
-
- s.InitGRPCClients(chainA)
- s.InitGRPCClients(chainB)
-
- chainAChannels, err := r.GetChannels(ctx, eRep, chainA.Config().ChainID)
- s.Require().NoError(err)
- return r, chainAChannels[len(chainAChannels)-1]
-}
-
-// generatePathName generates the path name using the test suites name
-func (s *E2ETestSuite) generatePathName() string {
- pathName := fmt.Sprintf("%s-path-%d", s.T().Name(), s.pathNameIndex)
- s.pathNameIndex++
- return strings.ReplaceAll(pathName, "/", "-")
-}
-
-// generatePath generates the path name using the test suites name
-func (s *E2ETestSuite) generatePath(ctx context.Context, relayer ibc.Relayer) string {
- chainA, chainB := s.GetChains()
- chainAID := chainA.Config().ChainID
- chainBID := chainB.Config().ChainID
-
- pathName := s.generatePathName()
- err := relayer.GeneratePath(ctx, s.GetRelayerExecReporter(), chainAID, chainBID, pathName)
- s.Require().NoError(err)
-
- return pathName
-}
-
-// SetupClients creates clients on chainA and chainB using the provided create client options
-func (s *E2ETestSuite) SetupClients(ctx context.Context, relayer ibc.Relayer, opts ibc.CreateClientOptions) {
- pathName := s.generatePath(ctx, relayer)
- err := relayer.CreateClients(ctx, s.GetRelayerExecReporter(), pathName, opts)
- s.Require().NoError(err)
-}
-
-// UpdateClients updates clients on chainA and chainB
-func (s *E2ETestSuite) UpdateClients(ctx context.Context, relayer ibc.Relayer, pathName string) {
- err := relayer.UpdateClients(ctx, s.GetRelayerExecReporter(), pathName)
- s.Require().NoError(err)
-}
-
-// GetChains returns two chains that can be used in a test. The pair returned
-// is unique to the current test being run. Note: this function does not create containers.
-func (s *E2ETestSuite) GetChains(chainOpts ...testconfig.ChainOptionConfiguration) (*cosmos.CosmosChain, *cosmos.CosmosChain) {
- if s.paths == nil {
- s.paths = map[string]path{}
- }
-
- path, ok := s.paths[s.T().Name()]
- if ok {
- return path.chainA, path.chainB
- }
-
- chainOptions := testconfig.DefaultChainOptions()
- for _, opt := range chainOpts {
- opt(&chainOptions)
- }
-
- chainA, chainB := s.createCosmosChains(chainOptions)
- path = newPath(chainA, chainB)
- s.paths[s.T().Name()] = path
-
- return path.chainA, path.chainB
-}
-
-// TODO: remove this type once the broadcast user interface aligns with ibc.Wallet
-type broadcastUser struct {
- ibc.Wallet
-}
-
-// FormattedAddressWithPrefix implement the broadcast user interface, the FormattedAddress
-// function already includes the correct prefix.
-func (b *broadcastUser) FormattedAddressWithPrefix(prefix string) string {
- return b.FormattedAddress()
-}
-
-// BroadcastMessages broadcasts the provided messages to the given chain and signs them on behalf of the provided user.
-// Once the broadcast response is returned, we wait for a few blocks to be created on both chain A and chain B.
-func (s *E2ETestSuite) BroadcastMessages(ctx context.Context, chain *cosmos.CosmosChain, user ibc.Wallet, msgs ...sdk.Msg) (sdk.TxResponse, error) {
- // wrap the user so it is a valid implementation of broadcast user.
- b := broadcastUser{Wallet: user}
-
- broadcaster := cosmos.NewBroadcaster(s.T(), chain)
-
- broadcaster.ConfigureClientContextOptions(func(clientContext client.Context) client.Context {
- // use a codec with all the types our tests care about registered.
- // BroadcastTx will deserialize the response and will not be able to otherwise.
- cdc := Codec()
- return clientContext.WithCodec(cdc).WithTxConfig(authtx.NewTxConfig(cdc, []signingtypes.SignMode{signingtypes.SignMode_SIGN_MODE_DIRECT}))
- })
-
- broadcaster.ConfigureFactoryOptions(func(factory tx.Factory) tx.Factory {
- return factory.WithGas(DefaultGasValue)
- })
-
- resp, err := cosmos.BroadcastTx(ctx, broadcaster, &b, msgs...)
- if err != nil {
- return sdk.TxResponse{}, err
- }
-
- chainA, chainB := s.GetChains()
- err = test.WaitForBlocks(ctx, 2, chainA, chainB)
- return resp, err
-}
-
-// RegisterCounterPartyPayee broadcasts a MsgRegisterCounterpartyPayee message.
-func (s *E2ETestSuite) RegisterCounterPartyPayee(ctx context.Context, chain *cosmos.CosmosChain,
- user ibc.Wallet, portID, channelID, relayerAddr, counterpartyPayeeAddr string,
-) (sdk.TxResponse, error) {
- msg := feetypes.NewMsgRegisterCounterpartyPayee(portID, channelID, relayerAddr, counterpartyPayeeAddr)
- return s.BroadcastMessages(ctx, chain, user, msg)
-}
-
-// PayPacketFeeAsync broadcasts a MsgPayPacketFeeAsync message.
-func (s *E2ETestSuite) PayPacketFeeAsync(
- ctx context.Context,
- chain *cosmos.CosmosChain,
- user ibc.Wallet,
- packetID channeltypes.PacketId,
- packetFee feetypes.PacketFee,
-) (sdk.TxResponse, error) {
- msg := feetypes.NewMsgPayPacketFeeAsync(packetID, packetFee)
- return s.BroadcastMessages(ctx, chain, user, msg)
-}
-
-// GetRelayerWallets returns the relayer wallets associated with the chains.
-func (s *E2ETestSuite) GetRelayerWallets(relayer ibc.Relayer) (ibc.Wallet, ibc.Wallet, error) {
- chainA, chainB := s.GetChains()
- chainARelayerWallet, ok := relayer.GetWallet(chainA.Config().ChainID)
- if !ok {
- return nil, nil, fmt.Errorf("unable to find chain A relayer wallet")
- }
-
- chainBRelayerWallet, ok := relayer.GetWallet(chainB.Config().ChainID)
- if !ok {
- return nil, nil, fmt.Errorf("unable to find chain B relayer wallet")
- }
- return chainARelayerWallet, chainBRelayerWallet, nil
-}
-
-// RecoverRelayerWallets adds the corresponding relayer address to the keychain of the chain.
-// This is useful if commands executed on the chains expect the relayer information to present in the keychain.
-func (s *E2ETestSuite) RecoverRelayerWallets(ctx context.Context, relayer ibc.Relayer) error {
- chainARelayerWallet, chainBRelayerWallet, err := s.GetRelayerWallets(relayer)
- if err != nil {
- return err
- }
-
- chainA, chainB := s.GetChains()
-
- if err := chainA.RecoverKey(ctx, ChainARelayerName, chainARelayerWallet.Mnemonic()); err != nil {
- return fmt.Errorf("could not recover relayer wallet on chain A: %s", err)
- }
- if err := chainB.RecoverKey(ctx, ChainBRelayerName, chainBRelayerWallet.Mnemonic()); err != nil {
- return fmt.Errorf("could not recover relayer wallet on chain B: %s", err)
- }
- return nil
-}
-
-// Transfer broadcasts a MsgTransfer message.
-func (s *E2ETestSuite) Transfer(ctx context.Context, chain *cosmos.CosmosChain, user ibc.Wallet,
- portID, channelID string, token sdk.Coin, sender, receiver string, timeoutHeight clienttypes.Height, timeoutTimestamp uint64, memo string,
-) (sdk.TxResponse, error) {
- msg := transfertypes.NewMsgTransfer(portID, channelID, token, sender, receiver, timeoutHeight, timeoutTimestamp, memo)
- return s.BroadcastMessages(ctx, chain, user, msg)
-}
-
-// StartRelayer starts the given relayer.
-func (s *E2ETestSuite) StartRelayer(relayer ibc.Relayer) {
- if s.startRelayerFn == nil {
- panic("cannot start relayer before it is created!")
- }
-
- s.startRelayerFn(relayer)
-}
-
-// StopRelayer stops the given relayer.
-func (s *E2ETestSuite) StopRelayer(ctx context.Context, relayer ibc.Relayer) {
- err := relayer.StopRelayer(ctx, s.GetRelayerExecReporter())
- s.Require().NoError(err)
-}
-
-// CreateUserOnChainA creates a user with the given amount of funds on chain A.
-func (s *E2ETestSuite) CreateUserOnChainA(ctx context.Context, amount int64) ibc.Wallet {
- chainA, _ := s.GetChains()
- return ibctest.GetAndFundTestUsers(s.T(), ctx, strings.ReplaceAll(s.T().Name(), " ", "-"), amount, chainA)[0]
-}
-
-// CreateUserOnChainB creates a user with the given amount of funds on chain B.
-func (s *E2ETestSuite) CreateUserOnChainB(ctx context.Context, amount int64) ibc.Wallet {
- _, chainB := s.GetChains()
- return ibctest.GetAndFundTestUsers(s.T(), ctx, strings.ReplaceAll(s.T().Name(), " ", "-"), amount, chainB)[0]
-}
-
-// GetChainANativeBalance gets the balance of a given user on chain A.
-func (s *E2ETestSuite) GetChainANativeBalance(ctx context.Context, user ibc.Wallet) (int64, error) {
- chainA, _ := s.GetChains()
- return GetNativeChainBalance(ctx, chainA, user)
-}
-
-// GetChainBNativeBalance gets the balance of a given user on chain B.
-func (s *E2ETestSuite) GetChainBNativeBalance(ctx context.Context, user ibc.Wallet) (int64, error) {
- _, chainB := s.GetChains()
- return GetNativeChainBalance(ctx, chainB, user)
-}
-
-// GetChainGRCPClients gets the GRPC clients associated with the given chain.
-func (s *E2ETestSuite) GetChainGRCPClients(chain ibc.Chain) GRPCClients {
- cs, ok := s.grpcClients[chain.Config().ChainID]
- s.Require().True(ok, "chain %s does not have GRPC clients", chain.Config().ChainID)
- return cs
-}
-
-// InitGRPCClients establishes GRPC clients with the given chain.
-// The created GRPCClients can be retrieved with GetChainGRCPClients.
-func (s *E2ETestSuite) InitGRPCClients(chain *cosmos.CosmosChain) {
- // Create a connection to the gRPC server.
- grpcConn, err := grpc.Dial(
- chain.GetHostGRPCAddress(),
- grpc.WithTransportCredentials(insecure.NewCredentials()),
- )
- s.Require().NoError(err)
- s.T().Cleanup(func() {
- if err := grpcConn.Close(); err != nil {
- s.T().Logf("failed closing GRPC connection to chain %s: %s", chain.Config().ChainID, err)
- }
- })
-
- if s.grpcClients == nil {
- s.grpcClients = make(map[string]GRPCClients)
- }
-
- s.grpcClients[chain.Config().ChainID] = GRPCClients{
- ClientQueryClient: clienttypes.NewQueryClient(grpcConn),
- ChannelQueryClient: channeltypes.NewQueryClient(grpcConn),
- FeeQueryClient: feetypes.NewQueryClient(grpcConn),
- ICAQueryClient: controllertypes.NewQueryClient(grpcConn),
- InterTxQueryClient: intertxtypes.NewQueryClient(grpcConn),
- GovQueryClient: govtypesv1beta1.NewQueryClient(grpcConn),
- GovQueryClientV1: govtypesv1.NewQueryClient(grpcConn),
- GroupsQueryClient: grouptypes.NewQueryClient(grpcConn),
- ParamsQueryClient: paramsproposaltypes.NewQueryClient(grpcConn),
- AuthQueryClient: authtypes.NewQueryClient(grpcConn),
- }
-}
-
-// AssertValidTxResponse verifies that an sdk.TxResponse
-// has non-empty values.
-func (s *E2ETestSuite) AssertValidTxResponse(resp sdk.TxResponse) {
- respLogsMsg := resp.Logs.String()
- if respLogsMsg == emptyLogs {
- respLogsMsg = resp.RawLog
- }
- s.Require().NotEqual(int64(0), resp.GasUsed, respLogsMsg)
- s.Require().NotEqual(int64(0), resp.GasWanted, respLogsMsg)
- s.Require().NotEmpty(resp.Events, respLogsMsg)
- s.Require().NotEmpty(resp.Data, respLogsMsg)
-}
-
-// AssertPacketRelayed asserts that the packet commitment does not exist on the sending chain.
-// The packet commitment will be deleted upon a packet acknowledgement or timeout.
-func (s *E2ETestSuite) AssertPacketRelayed(ctx context.Context, chain *cosmos.CosmosChain, portID, channelID string, sequence uint64) {
- commitment, _ := s.QueryPacketCommitment(ctx, chain, portID, channelID, sequence)
- s.Require().Empty(commitment)
-}
-
-// createCosmosChains creates two separate chains in docker containers.
-// test and can be retrieved with GetChains.
-func (s *E2ETestSuite) createCosmosChains(chainOptions testconfig.ChainOptions) (*cosmos.CosmosChain, *cosmos.CosmosChain) {
- client, network := ibctest.DockerSetup(s.T())
-
- s.logger = zap.NewExample()
- s.DockerClient = client
- s.network = network
-
- logger := zaptest.NewLogger(s.T())
-
- numValidators, numFullNodes := 4, 1
-
- chainA := cosmos.NewCosmosChain(s.T().Name(), *chainOptions.ChainAConfig, numValidators, numFullNodes, logger)
- chainB := cosmos.NewCosmosChain(s.T().Name(), *chainOptions.ChainBConfig, numValidators, numFullNodes, logger)
- return chainA, chainB
-}
-
-// GetRelayerExecReporter returns a testreporter.RelayerExecReporter instances
-// using the current test's testing.T.
-func (s *E2ETestSuite) GetRelayerExecReporter() *testreporter.RelayerExecReporter {
- rep := testreporter.NewNopReporter()
- return rep.RelayerExecReporter(s.T())
-}
-
-// GetTimeoutHeight returns a timeout height of 1000 blocks above the current block height.
-// This function should be used when the timeout is never expected to be reached
-func (s *E2ETestSuite) GetTimeoutHeight(ctx context.Context, chain *cosmos.CosmosChain) clienttypes.Height {
- height, err := chain.Height(ctx)
- s.Require().NoError(err)
- return clienttypes.NewHeight(clienttypes.ParseChainID(chain.Config().ChainID), uint64(height)+1000)
-}
-
-// GetNativeChainBalance returns the balance of a specific user on a chain using the native denom.
-func GetNativeChainBalance(ctx context.Context, chain ibc.Chain, user ibc.Wallet) (int64, error) {
- bal, err := chain.GetBalance(ctx, user.FormattedAddress(), chain.Config().Denom)
- if err != nil {
- return -1, err
- }
- return bal, nil
-}
-
-// ExecuteGovProposal submits the given governance proposal using the provided user and uses all validators to vote yes on the proposal.
-// It ensures the proposal successfully passes.
-func (s *E2ETestSuite) ExecuteGovProposal(ctx context.Context, chain *cosmos.CosmosChain, user ibc.Wallet, content govtypesv1beta1.Content) {
- sender, err := sdk.AccAddressFromBech32(user.FormattedAddress())
- s.Require().NoError(err)
-
- msgSubmitProposal, err := govtypesv1beta1.NewMsgSubmitProposal(content, sdk.NewCoins(sdk.NewCoin(chain.Config().Denom, govtypesv1beta1.DefaultMinDepositTokens)), sender)
- s.Require().NoError(err)
-
- txResp, err := s.BroadcastMessages(ctx, chain, user, msgSubmitProposal)
- s.Require().NoError(err)
- s.AssertValidTxResponse(txResp)
-
- // TODO: replace with parsed proposal ID from MsgSubmitProposalResponse
- // https://github.com/cosmos/ibc-go/issues/2122
-
- proposal, err := s.QueryProposal(ctx, chain, 1)
- s.Require().NoError(err)
- s.Require().Equal(govtypesv1beta1.StatusVotingPeriod, proposal.Status)
-
- err = chain.VoteOnProposalAllValidators(ctx, "1", cosmos.ProposalVoteYes)
- s.Require().NoError(err)
-
- // ensure voting period has not passed before validators finished voting
- proposal, err = s.QueryProposal(ctx, chain, 1)
- s.Require().NoError(err)
- s.Require().Equal(govtypesv1beta1.StatusVotingPeriod, proposal.Status)
-
- time.Sleep(testvalues.VotingPeriod) // pass proposal
-
- proposal, err = s.QueryProposal(ctx, chain, 1)
- s.Require().NoError(err)
- s.Require().Equal(govtypesv1beta1.StatusPassed, proposal.Status)
-}
-
-// ExecuteGovProposalV1 submits a governance proposal using the provided user and message and uses all validators
-// to vote yes on the proposal. It ensures the proposal successfully passes.
-func (s *E2ETestSuite) ExecuteGovProposalV1(ctx context.Context, msg sdk.Msg, chain *cosmos.CosmosChain, user ibc.Wallet, proposalID uint64) {
- sender, err := sdk.AccAddressFromBech32(user.FormattedAddress())
- s.Require().NoError(err)
-
- msgs := []sdk.Msg{msg}
- msgSubmitProposal, err := govtypesv1.NewMsgSubmitProposal(msgs, sdk.NewCoins(sdk.NewCoin(chain.Config().Denom, govtypesv1.DefaultMinDepositTokens)), sender.String(), "", fmt.Sprintf("e2e gov proposal: %d", proposalID), fmt.Sprintf("executing gov proposal %d", proposalID))
- s.Require().NoError(err)
-
- resp, err := s.BroadcastMessages(ctx, chain, user, msgSubmitProposal)
- s.AssertValidTxResponse(resp)
- s.Require().NoError(err)
-
- s.Require().NoError(chain.VoteOnProposalAllValidators(ctx, strconv.Itoa(int(proposalID)), cosmos.ProposalVoteYes))
-
- time.Sleep(testvalues.VotingPeriod)
-
- proposal, err := s.QueryProposalV1(ctx, chain, proposalID)
- s.Require().NoError(err)
- s.Require().Equal(govtypesv1.StatusPassed, proposal.Status)
-}
-
-// QueryModuleAccountAddress returns the sdk.AccAddress of a given module name.
-func (s *E2ETestSuite) QueryModuleAccountAddress(ctx context.Context, moduleName string, chain *cosmos.CosmosChain) (sdk.AccAddress, error) {
- authClient := s.GetChainGRCPClients(chain).AuthQueryClient
-
- resp, err := authClient.ModuleAccountByName(ctx, &authtypes.QueryModuleAccountByNameRequest{
- Name: moduleName,
- })
- if err != nil {
- return nil, err
- }
-
- cfg := EncodingConfig()
-
- var account authtypes.AccountI
- if err := cfg.InterfaceRegistry.UnpackAny(resp.Account, &account); err != nil {
- return nil, err
- }
- moduleAccount, ok := account.(authtypes.ModuleAccountI)
- if !ok {
- return nil, errors.New(fmt.Sprintf("failed to cast account: %T as ModuleAccount", moduleAccount))
- }
-
- return moduleAccount.GetAddress(), nil
-}
-
-// GetIBCToken returns the denomination of the full token denom sent to the receiving channel
-func GetIBCToken(fullTokenDenom string, portID, channelID string) transfertypes.DenomTrace {
- return transfertypes.ParseDenomTrace(fmt.Sprintf("%s/%s/%s", portID, channelID, fullTokenDenom))
-}
diff --git a/e2e/testvalues/values.go b/e2e/testvalues/values.go
deleted file mode 100644
index ead66b00351..00000000000
--- a/e2e/testvalues/values.go
+++ /dev/null
@@ -1,45 +0,0 @@
-package testvalues
-
-import (
- "fmt"
- "time"
-
- sdk "github.com/cosmos/cosmos-sdk/types"
- "github.com/strangelove-ventures/ibctest/v7/ibc"
-
- feetypes "github.com/cosmos/ibc-go/v7/modules/apps/29-fee/types"
-)
-
-const (
- StartingTokenAmount int64 = 100_000_000
- IBCTransferAmount int64 = 10_000
- InvalidAddress string = ""
- VotingPeriod time.Duration = time.Second * 30
-)
-
-// ImmediatelyTimeout returns an ibc.IBCTimeout which will cause an IBC transfer to timeout immediately.
-func ImmediatelyTimeout() *ibc.IBCTimeout {
- return &ibc.IBCTimeout{
- NanoSeconds: 1,
- }
-}
-
-func DefaultFee(denom string) feetypes.Fee {
- return feetypes.Fee{
- RecvFee: sdk.NewCoins(sdk.NewCoin(denom, sdk.NewInt(50))),
- AckFee: sdk.NewCoins(sdk.NewCoin(denom, sdk.NewInt(25))),
- TimeoutFee: sdk.NewCoins(sdk.NewCoin(denom, sdk.NewInt(10))),
- }
-}
-
-func DefaultTransferAmount(denom string) sdk.Coin {
- return sdk.Coin{Denom: denom, Amount: sdk.NewInt(IBCTransferAmount)}
-}
-
-func TendermintClientID(id int) string {
- return fmt.Sprintf("07-tendermint-%d", id)
-}
-
-func SolomachineClientID(id int) string {
- return fmt.Sprint("06-solomachine-%d", id)
-}
diff --git a/go.mod b/go.mod
index b1082d0abe8..3fb0ebcc8cb 100644
--- a/go.mod
+++ b/go.mod
@@ -1,65 +1,71 @@
go 1.19
+retract (
+ v7.1.0 // contains ledger transaction signing bug
+ v7.0.1 // contains ledger transaction signing bug
+ v7.0.0 // contains huckleberry vulnerability
+)
+
module github.com/cosmos/ibc-go/v7
require (
+ cosmossdk.io/api v0.3.1
cosmossdk.io/errors v1.0.0-beta.7
- cosmossdk.io/math v1.0.0-beta.4
- cosmossdk.io/simapp v0.0.0-20221216140705-ee8890cf30e7
- cosmossdk.io/tools/rosetta v0.2.0
+ cosmossdk.io/math v1.0.1
+ cosmossdk.io/tools/rosetta v0.2.1
github.com/armon/go-metrics v0.4.1
- github.com/cosmos/cosmos-proto v1.0.0-beta.1
- github.com/cosmos/cosmos-sdk v0.47.0-rc1
- github.com/cosmos/gogoproto v1.4.3
- github.com/cosmos/ics23/go v0.9.1-0.20221207100636-b1abd8678aab
- github.com/golang/protobuf v1.5.2
+ github.com/cometbft/cometbft v0.37.2
+ github.com/cometbft/cometbft-db v0.8.0
+ github.com/cosmos/cosmos-proto v1.0.0-beta.2
+ github.com/cosmos/cosmos-sdk v0.47.3
+ github.com/cosmos/gogoproto v1.4.10
+ github.com/cosmos/ics23/go v0.10.0
+ github.com/golang/protobuf v1.5.3
github.com/gorilla/mux v1.8.0
github.com/grpc-ecosystem/grpc-gateway v1.16.0
github.com/rakyll/statik v0.1.7
- github.com/spf13/cast v1.5.0
- github.com/spf13/cobra v1.6.1
- github.com/spf13/viper v1.15.0
- github.com/stretchr/testify v1.8.1
- github.com/tendermint/tendermint v0.37.0-rc2
- github.com/tendermint/tm-db v0.6.7
- google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef
- google.golang.org/grpc v1.52.1
- google.golang.org/protobuf v1.28.1
+ github.com/spf13/cast v1.5.1
+ github.com/spf13/cobra v1.7.0
+ github.com/spf13/viper v1.16.0
+ github.com/stretchr/testify v1.8.4
+ google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1
+ google.golang.org/grpc v1.55.0
+ google.golang.org/protobuf v1.30.0
gopkg.in/yaml.v2 v2.4.0
)
require (
- cloud.google.com/go v0.105.0 // indirect
- cloud.google.com/go/compute v1.14.0 // indirect
+ cloud.google.com/go v0.110.0 // indirect
+ cloud.google.com/go/compute v1.19.0 // indirect
cloud.google.com/go/compute/metadata v0.2.3 // indirect
- cloud.google.com/go/iam v0.8.0 // indirect
- cloud.google.com/go/storage v1.27.0 // indirect
- cosmossdk.io/api v0.2.6 // indirect
- cosmossdk.io/core v0.3.2 // indirect
+ cloud.google.com/go/iam v0.13.0 // indirect
+ cloud.google.com/go/storage v1.29.0 // indirect
+ 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/log v1.1.0 // indirect
+ 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 v0.0.0-20200405005733-88cbf1b4c40d // indirect
- github.com/aws/aws-sdk-go v1.40.45 // 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.0 // 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/chzyer/readline v0.0.0-20180603132655-2972be24d48e // 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/types v1.0.0 // indirect
github.com/confio/ics23/go v0.9.0 // indirect
github.com/cosmos/btcutil v1.0.5 // indirect
github.com/cosmos/go-bip39 v1.0.0 // indirect
github.com/cosmos/gogogateway v1.2.0 // indirect
- github.com/cosmos/gorocksdb v1.2.0 // indirect
- github.com/cosmos/iavl v0.19.4 // indirect
+ github.com/cosmos/iavl v0.20.0 // indirect
github.com/cosmos/ledger-cosmos-go v0.12.1 // indirect
- github.com/cosmos/rosetta-sdk-go v0.9.0 // 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.1.0 // indirect
@@ -67,27 +73,28 @@ require (
github.com/dgraph-io/badger/v2 v2.2007.4 // 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/gin-gonic/gin v1.7.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/googleapis v1.4.1-0.20201022092350-68b0159b7869 // indirect
+ github.com/gogo/googleapis v1.4.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
- github.com/golang/glog v1.0.0 // indirect
+ github.com/golang/glog v1.1.0 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/mock v1.6.0 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/google/btree v1.1.2 // indirect
github.com/google/go-cmp v0.5.9 // indirect
github.com/google/orderedcode v0.0.1 // indirect
+ github.com/google/s2a-go v0.1.3 // indirect
github.com/google/uuid v1.3.0 // indirect
- github.com/googleapis/enterprise-certificate-proxy v0.2.1 // indirect
- github.com/googleapis/gax-go/v2 v2.7.0 // indirect
+ github.com/googleapis/enterprise-certificate-proxy v0.2.3 // 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
@@ -95,71 +102,74 @@ require (
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.6.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-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.0.1 // 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.12 // 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
github.com/magiconair/properties v1.8.7 // indirect
github.com/manifoldco/promptui v0.9.0 // 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/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.0.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/pelletier/go-toml/v2 v2.0.6 // indirect
- github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // 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
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/rs/cors v1.8.2 // indirect
- github.com/rs/zerolog v1.28.0 // indirect
+ github.com/rs/cors v1.8.3 // indirect
+ github.com/rs/zerolog v1.29.1 // 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
- github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect
- github.com/tendermint/btcd v0.1.1 // indirect
- github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 // 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.2 // indirect
- github.com/ulikunitz/xz v0.5.8 // indirect
+ github.com/tidwall/btree v1.6.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.0 // indirect
- go.etcd.io/bbolt v1.3.6 // indirect
+ 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/crypto v0.4.0 // indirect
- golang.org/x/exp v0.0.0-20221019170559-20944726eadf // indirect
- golang.org/x/net v0.4.0 // indirect
- golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 // indirect
- golang.org/x/sys v0.3.0 // indirect
- golang.org/x/term v0.3.0 // indirect
- golang.org/x/text v0.5.0 // indirect
+ golang.org/x/crypto v0.9.0 // indirect
+ golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc // indirect
+ golang.org/x/net v0.10.0 // indirect
+ golang.org/x/oauth2 v0.7.0 // indirect
+ golang.org/x/sys v0.8.0 // indirect
+ golang.org/x/term v0.8.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.107.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
nhooyr.io/websocket v1.8.6 // indirect
- pgregory.net/rapid v0.5.3 // indirect
+ pgregory.net/rapid v0.5.5 // indirect
sigs.k8s.io/yaml v1.3.0 // indirect
)
+
+replace github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7
diff --git a/go.sum b/go.sum
index 1954a406519..cdd6e042502 100644
--- a/go.sum
+++ b/go.sum
@@ -17,52 +17,194 @@ 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.105.0 h1:DNtEKRBAAzeS4KyIory52wWHuClNaXJ5x1F7xa4q+5Y=
-cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM=
+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/compute v1.14.0 h1:hfm2+FfxVmnRlh6LpB7cg1ZNU+5edAHmW679JePztk0=
-cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo=
+cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA=
+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.19.0 h1:+9zda3WGgW1ZSTlVppLCYFIr48Pa35q1uG2N1itbCEQ=
+cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU=
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/iam v0.8.0 h1:E2osAkZzxI/+8pZcxVLcDtAQx/u+hZXVryUaYQ5O0Kk=
-cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE=
-cloud.google.com/go/longrunning v0.3.0 h1:NjljC+FYPV3uh5/OwWT6pVU+doBqMg2x/rZlE+CamDs=
+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.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=
+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.27.0 h1:YOO045NZI9RKfCj1c5A/ZtuuENUc8OAW+gHdGnDgyMQ=
+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=
-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/core v0.3.2 h1:KlQIufpJHJvOs7YLGTZsZcCo1WlkencDXepsr8STKZQ=
-cosmossdk.io/core v0.3.2/go.mod h1:CO7vbe+evrBvHc0setFHL/u7nlY7HJGzdRSBkT/sirc=
+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=
+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/math v1.0.0-beta.4 h1:JtKedVLGzA0vv84xjYmZ75RKG35Kf2WwcFu8IjRkIIw=
-cosmossdk.io/math v1.0.0-beta.4/go.mod h1:An0MllWJY6PxibUpnwGk8jOm+a/qIxlKmL5Zyp9NnaM=
-cosmossdk.io/simapp v0.0.0-20221216140705-ee8890cf30e7 h1:8uwZLyQ6NMZNT0janUI86Q4vF1sIIquSUsijmOkgmp8=
-cosmossdk.io/simapp v0.0.0-20221216140705-ee8890cf30e7/go.mod h1:zvJ3aFHDzqQ6NvkCcCHyolr5Wh2BJ9Rg4qVcN1T6Re0=
-cosmossdk.io/tools/rosetta v0.2.0 h1:Ae499UiZ9yPNCXvjOBO/R9I1pksCJfxoqWauEZgA/gs=
-cosmossdk.io/tools/rosetta v0.2.0/go.mod h1:3mn8QuE2wLUdTi77/gbDXdFqXZdBdiBJhgAWUTSXPv8=
+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=
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=
@@ -74,7 +216,7 @@ github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQ
github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4=
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
-github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA=
+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=
@@ -101,10 +243,10 @@ github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
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.15.78/go.mod h1:E3/ieXAlvM0XWO57iftYVDLLvQ824smPP3ATZkfNZeM=
github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
-github.com/aws/aws-sdk-go v1.40.45 h1:QN1nsY27ssD/JmW4s83qmSb+uL6DG4GmCDzjmJB4xUI=
-github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q=
+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/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=
@@ -112,12 +254,14 @@ 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 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY=
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=
github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U=
github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04=
github.com/btcsuite/btcd/btcutil v1.1.2 h1:XLMbX8JQEiwMcYft2EGi8zPUkoa0abKIU6/BJSRsjzQ=
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U=
+github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA=
github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
@@ -128,15 +272,18 @@ github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA
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 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
-github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8=
+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/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8=
+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=
@@ -145,6 +292,7 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX
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=
@@ -154,6 +302,12 @@ github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOG
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/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
+github.com/coinbase/rosetta-sdk-go/types v1.0.0 h1:jpVIwLcPoOeCR6o1tU+Xv7r5bMONNbHU7MuEHboiFuA=
+github.com/coinbase/rosetta-sdk-go/types v1.0.0/go.mod h1:eq7W2TMRH22GTW0N0beDnN931DW0/WOI1R2sdHNHG4c=
+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=
github.com/confio/ics23/go v0.9.0/go.mod h1:4LPZ2NYqnYIVRklaozjNR1FScgDJ2s5Xrp+e/mYVRak=
github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg=
@@ -161,37 +315,35 @@ 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.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk=
github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis=
-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.47.0-rc1 h1:ptoLIOAqFGoqnZeqgec9KvC2JIZ6CVIyMHHjti9p6dQ=
-github.com/cosmos/cosmos-sdk v0.47.0-rc1/go.mod h1:yWd503ULBJ71Zuv7GD0/dYJuyeg4LGWAvjeI4wK/dfY=
+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/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.3 h1:RP3yyVREh9snv/lsOvmsAPQt8f44LgL281X0IOIhhcI=
-github.com/cosmos/gogoproto v1.4.3/go.mod h1:0hLIG5TR7IvV1fme1HCFKjfzW9X2x0Mo+RooWXCnOWU=
-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.4 h1:t82sN+Y0WeqxDLJRSpNd8YFX5URIrT+p8n6oJbJ2Dok=
-github.com/cosmos/iavl v0.19.4/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw=
-github.com/cosmos/ics23/go v0.9.1-0.20221207100636-b1abd8678aab h1:I9ialKTQo7248V827Bba4OuKPmk+FPzmTVHsLXaIJWw=
-github.com/cosmos/ics23/go v0.9.1-0.20221207100636-b1abd8678aab/go.mod h1:2CwqasX5dSD7Hbp/9b6lhK6BwoBDCBldx7gPKRukR60=
+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/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.1 h1:sMBxza5p/rNK/06nBSNmsI/WDqI0pVJFVNihy1Y984w=
github.com/cosmos/ledger-cosmos-go v0.12.1/go.mod h1:dhO6kj+Y+AHIOgAe4L9HL/6NDdyyth4q238I9yFpD2g=
-github.com/cosmos/rosetta-sdk-go v0.9.0 h1:3mj2naR+GUhUXabtb96WWSsPFZDCYkdtp6r0jffgugg=
-github.com/cosmos/rosetta-sdk-go v0.9.0/go.mod h1:2v41yXL25xxAXrczVSnbDHcQH9CgildruDlGQGKW/JU=
+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/cucumber/common/gherkin/go/v22 v22.0.0 h1:4K8NqptbvdOrjL9DEea6HFjSpbdT9+Q5kgLpmmsHYl0=
github.com/cucumber/common/messages/go/v17 v17.1.1 h1:RNqopvIFyLWnKv0LfATh34SWBhXeoFTJnSrgm9cT/Ts=
@@ -215,10 +367,11 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn
github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y=
github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
-github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
+github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
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=
@@ -231,12 +384,11 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m
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/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/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o=
@@ -244,7 +396,7 @@ github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSw
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=
@@ -252,9 +404,8 @@ github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbS
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.7.0 h1:jGB9xAJQ12AIGNB4HguylppmDK1Am9ppF7XnGXXJuoU=
-github.com/gin-gonic/gin v1.7.0/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY=
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=
@@ -263,23 +414,22 @@ 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-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
+github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
-github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
-github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
+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 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY=
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
-github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE=
-github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0=
@@ -291,10 +441,11 @@ github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/E
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=
-github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0=
+github.com/gofrs/uuid v4.3.0+incompatible h1:CaSVZxm5B+7o45rtab4jC2G37WGYX1zQfuU2i6DSvnc=
github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
-github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869 h1:kRpU4zq+Pzh4feET49aEWPOzwQy3U2SsbZEQ7QEcif0=
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/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=
@@ -302,8 +453,8 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
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=
@@ -317,6 +468,7 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt
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=
@@ -335,8 +487,10 @@ 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.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
+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=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
@@ -357,6 +511,8 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
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-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
@@ -366,7 +522,8 @@ github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPg
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 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ=
+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=
@@ -379,17 +536,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/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.2/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.2.1 h1:RY7tHKZcRlk788d5WSo/e83gOyyy742E8GSs771ySpg=
-github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k=
+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.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.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.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=
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
@@ -425,8 +600,8 @@ github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng
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.6.2 h1:7jX7xcB+uVCliddZgeKyNxv0xoT7qL5KDtH7rU4IqIk=
-github.com/hashicorp/go-getter v1.6.2/go.mod h1:IZCrswsZPeWv9IkVnLElzRU/gz/QPi6pZHn4tv6vbwA=
+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=
@@ -441,7 +616,6 @@ github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdv
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE=
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
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=
@@ -456,8 +630,8 @@ 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/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=
@@ -469,11 +643,10 @@ 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 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc=
-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/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
-github.com/jhump/protoreflect v1.12.1-0.20220721211354-060cc04fc18b h1:izTof8BKh/nE1wrKOrloNA5q4odOarjf+Xpe+4qow98=
-github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
+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=
@@ -488,9 +661,7 @@ 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/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
@@ -501,28 +672,31 @@ github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQL
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/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
-github.com/klauspost/compress v1.11.2/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.12 h1:YClS/PImqYbn+UILDnqxQCZ3RehC9N318SU3kElDUEM=
-github.com/klauspost/compress v1.15.12/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
+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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
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.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
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/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
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.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.16 h1:Q2co1xrpdkr5Hx3Fp+f+f7fRGhQFQhvi/+226dtLmA8=
+github.com/linxGnu/grocksdb v1.7.16/go.mod h1:JkS7pl5qWpGpuVb3bPqTz8nC12X3YtPZT+Xq7+QfQo4=
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.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
@@ -537,13 +711,14 @@ github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
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.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
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/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=
@@ -554,8 +729,9 @@ github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceT
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 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0=
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=
@@ -568,7 +744,6 @@ 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/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs=
github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
@@ -583,8 +758,8 @@ github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi
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=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
-github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
+github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
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/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
@@ -599,7 +774,7 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y
github.com/onsi/gomega v1.20.0 h1:8W0cWlwFkflGPLltQvLRB7ZVD5HuP6ng320w2IS245Q=
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.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec=
+github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034=
github.com/opencontainers/runc v1.1.3 h1:vIXrkId+0/J2Ymu2m7VjGvbSlAId9XNRPhn2p4b+d8w=
github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
@@ -616,11 +791,12 @@ github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0Mw
github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
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.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU=
-github.com/pelletier/go-toml/v2 v2.0.6/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/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/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/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -638,8 +814,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=
@@ -656,20 +830,16 @@ 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/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=
@@ -679,13 +849,13 @@ github.com/regen-network/gocuke v0.6.2 h1:pHviZ0kKAq2U2hN2q3smKNxct6hS0mGByFMHGn
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.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg=
+github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
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/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.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY=
-github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0=
+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=
@@ -708,15 +878,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.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=
-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=
@@ -725,8 +895,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/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=
github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
@@ -743,33 +913,29 @@ 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.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
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=
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/tendermint/btcd v0.1.1 h1:0VcxPfflS2zZ3RiOAHkBiFUcPvbtRj5O7zHmcJWHV7s=
-github.com/tendermint/btcd v0.1.1/go.mod h1:DC6/m53jtQzr/NFmMNEu0rxf18/ktVoVtMrnDD5pN+U=
-github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 h1:hqAk8riJvK4RMWx1aInLzndwxKalgi5rTqgfXxOxbEI=
-github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15/go.mod h1:z4YtwM70uOnk8h0pjJYlj3zdYwi9l03By6iAIF5j/Pk=
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/tendermint v0.37.0-rc2 h1:2n1em+jfbhSv6QnBj8F6KHCpbIzZCB8KgcjidJUQNlY=
-github.com/tendermint/tendermint v0.37.0-rc2/go.mod h1:uYQO9DRNPeZROa9X3hJOZpYcVREDC2/HST+EiU5g2+A=
-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.2 h1:5eA83Gfki799V3d3bJo9sWk+yL2LRoTEah3O/SA6/8w=
-github.com/tidwall/btree v1.5.2/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY=
+github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg=
+github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY=
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
-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 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
-github.com/ulikunitz/xz v0.5.8 h1:ERv8V6GKqVi23rgu5cj9pVfVzJbOqAY2Ntl88O6c2nQ=
-github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
+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/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
@@ -779,13 +945,14 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
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.0 h1:dlMC7aO8Wss1CxBq2I96kZ69Nh1ligzbs8UWOtq/AsA=
-github.com/zondax/ledger-go v0.14.0/go.mod h1:fZ3Dqg6qcdXWSOJFKMG8GCTnD7slO/RL2feOQv8K320=
+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=
@@ -795,6 +962,7 @@ 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=
@@ -818,9 +986,11 @@ golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
-golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8=
-golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/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.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
+golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -832,8 +1002,8 @@ 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-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-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=
@@ -847,6 +1017,7 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
@@ -858,6 +1029,8 @@ 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.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-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=
@@ -900,15 +1073,27 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY
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-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-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/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.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU=
-golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
+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.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
+golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
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=
@@ -918,10 +1103,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-20221014153046-6fdb5e3db783 h1:nt+Q6cXKz4MosCSpnbMtqiQ8Oz0pxTef2B4Vca2lvfk=
+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.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=
@@ -933,6 +1132,10 @@ 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.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/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=
@@ -983,37 +1186,61 @@ golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/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-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-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/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-20210819135213-f52c844e1c1c/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-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-20220517195934-5e4e11fc645e/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.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ=
-golang.org/x/sys v0.3.0/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.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
+golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
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.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI=
-golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
+golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols=
+golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
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=
@@ -1023,8 +1250,10 @@ 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.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM=
-golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+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.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=
@@ -1086,10 +1315,19 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f
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.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=
google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
@@ -1112,8 +1350,37 @@ 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.107.0 h1:I2SlFjD8ZWabaIFOfeEDg3pf0BHJDh6iYQ1ic3Yu/UU=
-google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY=
+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.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=
@@ -1163,10 +1430,76 @@ 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-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-20221227171554-f9683d7f8bef h1:uQ2vjV/sHTsWSqdKeLqmwitzgvjMl7o4IdtHwUDXSJY=
-google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
+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-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=
@@ -1191,10 +1524,26 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv
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.52.1 h1:2NpOPk5g5Xtb0qebIEs7hNIa++PdtZLo2AQUpc1YnSU=
-google.golang.org/grpc v1.52.1/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY=
+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=
@@ -1208,8 +1557,10 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba
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.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
+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=
@@ -1241,6 +1592,7 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C
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=
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/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=
@@ -1252,8 +1604,8 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
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.3/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04=
+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/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
diff --git a/internal/errors/errors.go b/internal/errors/errors.go
new file mode 100644
index 00000000000..79b96856a87
--- /dev/null
+++ b/internal/errors/errors.go
@@ -0,0 +1,63 @@
+package errors
+
+import (
+ errorsmod "cosmossdk.io/errors"
+
+ "github.com/cosmos/ibc-go/v7/modules/core/exported"
+)
+
+const codespace = exported.ModuleName
+
+var (
+ // ErrInvalidSequence is used the sequence number (nonce) is incorrect
+ // for the signature.
+ ErrInvalidSequence = errorsmod.Register(codespace, 1, "invalid sequence")
+
+ // ErrUnauthorized is used whenever a request without sufficient
+ // authorization is handled.
+ ErrUnauthorized = errorsmod.Register(codespace, 2, "unauthorized")
+
+ // ErrInsufficientFunds is used when the account cannot pay requested amount.
+ ErrInsufficientFunds = errorsmod.Register(codespace, 3, "insufficient funds")
+
+ // ErrUnknownRequest is used when the request body.
+ ErrUnknownRequest = errorsmod.Register(codespace, 4, "unknown request")
+
+ // ErrInvalidAddress is used when an address is found to be invalid.
+ ErrInvalidAddress = errorsmod.Register(codespace, 5, "invalid address")
+
+ // ErrInvalidCoins is used when sdk.Coins are invalid.
+ ErrInvalidCoins = errorsmod.Register(codespace, 6, "invalid coins")
+
+ // ErrOutOfGas is used when there is not enough gas.
+ ErrOutOfGas = errorsmod.Register(codespace, 7, "out of gas")
+
+ // ErrInvalidRequest defines an ABCI typed error where the request contains
+ // invalid data.
+ ErrInvalidRequest = errorsmod.Register(codespace, 8, "invalid request")
+
+ // ErrInvalidHeight defines an error for an invalid height
+ ErrInvalidHeight = errorsmod.Register(codespace, 9, "invalid height")
+
+ // ErrInvalidVersion defines a general error for an invalid version
+ ErrInvalidVersion = errorsmod.Register(codespace, 10, "invalid version")
+
+ // ErrInvalidChainID defines an error when the chain-id is invalid.
+ ErrInvalidChainID = errorsmod.Register(codespace, 11, "invalid chain-id")
+
+ // ErrInvalidType defines an error an invalid type.
+ ErrInvalidType = errorsmod.Register(codespace, 12, "invalid type")
+
+ // ErrPackAny defines an error when packing a protobuf message to Any fails.
+ ErrPackAny = errorsmod.Register(codespace, 13, "failed packing protobuf message to Any")
+
+ // ErrUnpackAny defines an error when unpacking a protobuf message from Any fails.
+ ErrUnpackAny = errorsmod.Register(codespace, 14, "failed unpacking protobuf message from Any")
+
+ // ErrLogic defines an internal logic error, e.g. an invariant or assertion
+ // that is violated. It is a programmer error, not a user-facing error.
+ ErrLogic = errorsmod.Register(codespace, 15, "internal logic error")
+
+ // ErrNotFound defines an error when requested entity doesn't exist in the state.
+ ErrNotFound = errorsmod.Register(codespace, 16, "not found")
+)
diff --git a/modules/apps/27-interchain-accounts/controller/keeper/keeper.go b/modules/apps/27-interchain-accounts/controller/keeper/keeper.go
index 5e576bba2a8..3796cdef123 100644
--- a/modules/apps/27-interchain-accounts/controller/keeper/keeper.go
+++ b/modules/apps/27-interchain-accounts/controller/keeper/keeper.go
@@ -5,13 +5,13 @@ import (
"fmt"
"strings"
+ "github.com/cometbft/cometbft/libs/log"
"github.com/cosmos/cosmos-sdk/codec"
storetypes "github.com/cosmos/cosmos-sdk/store/types"
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"
- "github.com/tendermint/tendermint/libs/log"
"github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/types"
genesistypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/genesis/types"
diff --git a/modules/apps/27-interchain-accounts/controller/keeper/msg_server.go b/modules/apps/27-interchain-accounts/controller/keeper/msg_server.go
index ed953fd8c1e..fe0535c7022 100644
--- a/modules/apps/27-interchain-accounts/controller/keeper/msg_server.go
+++ b/modules/apps/27-interchain-accounts/controller/keeper/msg_server.go
@@ -47,6 +47,7 @@ func (s msgServer) RegisterInterchainAccount(goCtx context.Context, msg *types.M
return &types.MsgRegisterInterchainAccountResponse{
ChannelId: channelID,
+ PortId: portID,
}, nil
}
diff --git a/modules/apps/27-interchain-accounts/controller/types/tx.pb.go b/modules/apps/27-interchain-accounts/controller/types/tx.pb.go
index b2ea19032a2..b15979a713e 100644
--- a/modules/apps/27-interchain-accounts/controller/types/tx.pb.go
+++ b/modules/apps/27-interchain-accounts/controller/types/tx.pb.go
@@ -72,6 +72,7 @@ var xxx_messageInfo_MsgRegisterInterchainAccount proto.InternalMessageInfo
// MsgRegisterInterchainAccountResponse defines the response for Msg/RegisterAccount
type MsgRegisterInterchainAccountResponse struct {
ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty" yaml:"channel_id"`
+ PortId string `protobuf:"bytes,2,opt,name=port_id,json=portId,proto3" json:"port_id,omitempty" yaml:"port_id"`
}
func (m *MsgRegisterInterchainAccountResponse) Reset() { *m = MsgRegisterInterchainAccountResponse{} }
@@ -114,6 +115,13 @@ func (m *MsgRegisterInterchainAccountResponse) GetChannelId() string {
return ""
}
+func (m *MsgRegisterInterchainAccountResponse) GetPortId() string {
+ if m != nil {
+ return m.PortId
+ }
+ return ""
+}
+
// MsgSendTx defines the payload for Msg/SendTx
type MsgSendTx struct {
Owner string `protobuf:"bytes,1,opt,name=owner,proto3" json:"owner,omitempty"`
@@ -214,42 +222,43 @@ func init() {
}
var fileDescriptor_7def041328c84a30 = []byte{
- // 546 bytes of a gzipped FileDescriptorProto
+ // 570 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x94, 0xbf, 0x6f, 0xd3, 0x40,
- 0x14, 0xc7, 0xed, 0x34, 0x94, 0xe6, 0x0a, 0x82, 0x5a, 0x41, 0x18, 0x83, 0xec, 0xca, 0x62, 0xe8,
- 0x92, 0x3b, 0x25, 0x54, 0xaa, 0x54, 0xd4, 0x81, 0xa8, 0x20, 0x65, 0x88, 0x14, 0x99, 0x0e, 0x08,
- 0x21, 0x45, 0x97, 0xf3, 0xc9, 0x39, 0x70, 0xee, 0x8c, 0xef, 0x62, 0xda, 0x91, 0x8d, 0x09, 0xb1,
- 0xb1, 0xf6, 0xaf, 0xe0, 0x5f, 0xa0, 0x63, 0x47, 0xa6, 0xa8, 0x4a, 0x16, 0xe6, 0xfc, 0x05, 0xc8,
- 0x76, 0xe2, 0x04, 0x28, 0x55, 0xf9, 0xb5, 0xf9, 0xdd, 0xdd, 0xe7, 0xbd, 0xef, 0xfb, 0xe1, 0x07,
- 0x1e, 0xb2, 0x1e, 0x41, 0x38, 0x8a, 0x42, 0x46, 0xb0, 0x62, 0x82, 0x4b, 0xc4, 0xb8, 0xa2, 0x31,
- 0xe9, 0x63, 0xc6, 0xbb, 0x98, 0x10, 0x31, 0xe4, 0x4a, 0x22, 0x22, 0xb8, 0x8a, 0x45, 0x18, 0xd2,
- 0x18, 0x25, 0x75, 0xa4, 0x0e, 0x61, 0x14, 0x0b, 0x25, 0x8c, 0x06, 0xeb, 0x11, 0xb8, 0x0c, 0xc3,
- 0x73, 0x60, 0xb8, 0x80, 0x61, 0x52, 0xb7, 0xaa, 0x81, 0x08, 0x44, 0x86, 0xa3, 0xf4, 0x2b, 0xf7,
- 0x64, 0x6d, 0x5f, 0x4a, 0x46, 0x52, 0x47, 0x11, 0x26, 0xaf, 0xa8, 0xca, 0x29, 0xf7, 0xa3, 0x0e,
- 0xee, 0xb5, 0x65, 0xe0, 0xd1, 0x80, 0x49, 0x45, 0xe3, 0x56, 0x81, 0x3c, 0xca, 0x09, 0xa3, 0x0a,
- 0xae, 0x88, 0x37, 0x9c, 0xc6, 0xa6, 0xbe, 0xa9, 0x6f, 0x55, 0xbc, 0xdc, 0x30, 0xf6, 0xc0, 0x75,
- 0x22, 0x38, 0xa7, 0x24, 0x8d, 0xd4, 0x65, 0xbe, 0x59, 0x4a, 0x6f, 0x9b, 0xe6, 0x74, 0xe4, 0x54,
- 0x8f, 0xf0, 0x20, 0xdc, 0x75, 0xbf, 0xbb, 0x76, 0xbd, 0x6b, 0x0b, 0xbb, 0xe5, 0x1b, 0x26, 0xb8,
- 0x9a, 0xd0, 0x58, 0x32, 0xc1, 0xcd, 0x95, 0xcc, 0xed, 0xdc, 0xdc, 0x5d, 0x7b, 0x77, 0xec, 0x68,
- 0x5f, 0x8f, 0x1d, 0xcd, 0x7d, 0x01, 0xee, 0x5f, 0x24, 0xcc, 0xa3, 0x32, 0x12, 0x5c, 0x52, 0x63,
- 0x1b, 0x00, 0xd2, 0xc7, 0x9c, 0xd3, 0x30, 0xd5, 0x91, 0xa9, 0x6c, 0xde, 0x9a, 0x8e, 0x9c, 0x8d,
- 0x99, 0x8e, 0xe2, 0xce, 0xf5, 0x2a, 0x33, 0xa3, 0xe5, 0xbb, 0x9f, 0x4a, 0xa0, 0xd2, 0x96, 0xc1,
- 0x53, 0xca, 0xfd, 0x83, 0xc3, 0xff, 0x93, 0xe4, 0x5b, 0x1d, 0xac, 0xe7, 0xb5, 0xee, 0xfa, 0x58,
- 0xe1, 0x2c, 0xd3, 0xf5, 0xc6, 0x3e, 0xbc, 0x54, 0xc7, 0x93, 0x3a, 0xfc, 0x29, 0xe5, 0x4e, 0xe6,
- 0x6c, 0x1f, 0x2b, 0xdc, 0xb4, 0x4e, 0x46, 0x8e, 0x36, 0x1d, 0x39, 0x46, 0xae, 0x63, 0x29, 0x8c,
- 0xeb, 0x81, 0xa8, 0x78, 0x67, 0x3c, 0x01, 0x37, 0x63, 0x1a, 0x62, 0xc5, 0x12, 0xda, 0x55, 0x6c,
- 0x40, 0xc5, 0x50, 0x99, 0xe5, 0x4d, 0x7d, 0xab, 0xdc, 0xbc, 0x3b, 0x1d, 0x39, 0xb7, 0x73, 0xfa,
- 0xc7, 0x17, 0xae, 0x77, 0x63, 0x7e, 0x74, 0x90, 0x9f, 0x2c, 0xb5, 0x05, 0x81, 0x8d, 0xa2, 0x6e,
- 0x45, 0x0f, 0x2c, 0xb0, 0x26, 0xe9, 0xeb, 0x21, 0xe5, 0x84, 0x66, 0x25, 0x2c, 0x7b, 0x85, 0xdd,
- 0x38, 0x2b, 0x81, 0x95, 0xb6, 0x0c, 0x8c, 0xcf, 0x3a, 0xb8, 0xf3, 0xeb, 0x31, 0xeb, 0xc0, 0xdf,
- 0xff, 0x11, 0xe0, 0x45, 0xf3, 0x61, 0x3d, 0xfb, 0xd7, 0x1e, 0x8b, 0x6c, 0xdf, 0xeb, 0x60, 0x75,
- 0x36, 0x38, 0x7b, 0x7f, 0x18, 0x24, 0xc7, 0xad, 0xc7, 0x7f, 0x85, 0xcf, 0x05, 0x35, 0x5f, 0x9e,
- 0x8c, 0x6d, 0xfd, 0x74, 0x6c, 0xeb, 0x67, 0x63, 0x5b, 0xff, 0x30, 0xb1, 0xb5, 0xd3, 0x89, 0xad,
- 0x7d, 0x99, 0xd8, 0xda, 0xf3, 0x4e, 0xc0, 0x54, 0x7f, 0xd8, 0x83, 0x44, 0x0c, 0x10, 0x11, 0x72,
- 0x20, 0x24, 0x62, 0x3d, 0x52, 0x0b, 0x04, 0x4a, 0x76, 0xd0, 0x40, 0xf8, 0xc3, 0x90, 0xca, 0x74,
- 0x69, 0x48, 0xd4, 0xd8, 0xa9, 0x2d, 0x42, 0xd7, 0xce, 0x5b, 0x5b, 0xea, 0x28, 0xa2, 0xb2, 0xb7,
- 0x9a, 0xed, 0x8d, 0x07, 0xdf, 0x02, 0x00, 0x00, 0xff, 0xff, 0x17, 0x12, 0x8c, 0xf0, 0xf6, 0x04,
- 0x00, 0x00,
+ 0x14, 0xc7, 0xed, 0x34, 0xa4, 0xcd, 0x95, 0x5f, 0xb5, 0x82, 0x30, 0x06, 0xd9, 0x95, 0xc5, 0x50,
+ 0x09, 0xc5, 0xa7, 0x84, 0x4a, 0x95, 0x8a, 0x3a, 0x10, 0x15, 0xa4, 0x0c, 0x91, 0x22, 0xd3, 0x01,
+ 0xb1, 0x44, 0x97, 0xf3, 0xc9, 0x39, 0x70, 0xee, 0x8c, 0xef, 0x62, 0xda, 0x91, 0x0d, 0x16, 0xc4,
+ 0xc6, 0xda, 0xbf, 0x82, 0x7f, 0x81, 0x8e, 0x1d, 0x99, 0xac, 0x2a, 0x59, 0x98, 0xf3, 0x17, 0x20,
+ 0xdb, 0x89, 0x53, 0xa0, 0x54, 0xe5, 0x47, 0x37, 0xbf, 0x7b, 0xf7, 0x79, 0xef, 0x7b, 0xef, 0x3d,
+ 0x3f, 0xf0, 0x88, 0xf6, 0x31, 0x44, 0x61, 0x18, 0x50, 0x8c, 0x24, 0xe5, 0x4c, 0x40, 0xca, 0x24,
+ 0x89, 0xf0, 0x00, 0x51, 0xd6, 0x43, 0x18, 0xf3, 0x11, 0x93, 0x02, 0x62, 0xce, 0x64, 0xc4, 0x83,
+ 0x80, 0x44, 0x30, 0x6e, 0x40, 0xb9, 0xef, 0x84, 0x11, 0x97, 0x5c, 0x6b, 0xd2, 0x3e, 0x76, 0x4e,
+ 0xc3, 0xce, 0x19, 0xb0, 0xb3, 0x80, 0x9d, 0xb8, 0x61, 0xd4, 0x7c, 0xee, 0xf3, 0x0c, 0x87, 0xe9,
+ 0x57, 0x1e, 0xc9, 0xd8, 0xbc, 0x90, 0x8c, 0xb8, 0x01, 0x43, 0x84, 0x5f, 0x11, 0x99, 0x53, 0xf6,
+ 0x27, 0x15, 0xdc, 0xeb, 0x08, 0xdf, 0x25, 0x3e, 0x15, 0x92, 0x44, 0xed, 0x02, 0x79, 0x9c, 0x13,
+ 0x5a, 0x0d, 0x5c, 0xe1, 0x6f, 0x18, 0x89, 0x74, 0x75, 0x5d, 0xdd, 0xa8, 0xba, 0xb9, 0xa1, 0xed,
+ 0x80, 0x6b, 0x98, 0x33, 0x46, 0x70, 0x9a, 0xa9, 0x47, 0x3d, 0xbd, 0x94, 0x7a, 0x5b, 0xfa, 0x34,
+ 0xb1, 0x6a, 0x07, 0x68, 0x18, 0x6c, 0xdb, 0x3f, 0xb8, 0x6d, 0xf7, 0xea, 0xc2, 0x6e, 0x7b, 0x9a,
+ 0x0e, 0x96, 0x63, 0x12, 0x09, 0xca, 0x99, 0xbe, 0x94, 0x85, 0x9d, 0x9b, 0xdb, 0x2b, 0xef, 0x0e,
+ 0x2d, 0xe5, 0xdb, 0xa1, 0xa5, 0xd8, 0xef, 0x55, 0x70, 0xff, 0x3c, 0x65, 0x2e, 0x11, 0x21, 0x67,
+ 0x82, 0x68, 0x9b, 0x00, 0xe0, 0x01, 0x62, 0x8c, 0x04, 0xa9, 0x90, 0x4c, 0x66, 0xeb, 0xd6, 0x34,
+ 0xb1, 0xd6, 0x66, 0x42, 0x0a, 0x9f, 0xed, 0x56, 0x67, 0x46, 0xdb, 0xd3, 0x1e, 0x80, 0xe5, 0x90,
+ 0x47, 0x72, 0xa1, 0x5d, 0x9b, 0x26, 0xd6, 0xf5, 0x1c, 0x99, 0x39, 0x6c, 0xb7, 0x92, 0x7e, 0xb5,
+ 0x3d, 0xfb, 0x73, 0x09, 0x54, 0x3b, 0xc2, 0x7f, 0x46, 0x98, 0xb7, 0xb7, 0x7f, 0x39, 0x25, 0x79,
+ 0xab, 0x82, 0xd5, 0xbc, 0x33, 0x3d, 0x0f, 0x49, 0x94, 0xd5, 0x65, 0xb5, 0xb9, 0xeb, 0x5c, 0x68,
+ 0x3e, 0xe2, 0x86, 0xf3, 0x4b, 0x7d, 0xba, 0x59, 0xb0, 0x5d, 0x24, 0x51, 0xcb, 0x38, 0x4a, 0x2c,
+ 0x65, 0x9a, 0x58, 0xda, 0xec, 0x79, 0x8b, 0x34, 0xb6, 0x0b, 0xc2, 0xe2, 0x9e, 0xf6, 0x14, 0xdc,
+ 0x8c, 0x48, 0x80, 0x24, 0x8d, 0x49, 0x4f, 0xd2, 0x21, 0xe1, 0x23, 0xa9, 0x97, 0xd7, 0xd5, 0x8d,
+ 0x72, 0xeb, 0xee, 0x34, 0xb1, 0x6e, 0xe7, 0xf4, 0xcf, 0x37, 0x6c, 0xf7, 0xc6, 0xfc, 0x68, 0x2f,
+ 0x3f, 0x39, 0xd5, 0x44, 0x08, 0xd6, 0x8a, 0xba, 0x15, 0x0d, 0x33, 0xc0, 0x8a, 0x20, 0xaf, 0x47,
+ 0x84, 0x61, 0x92, 0x95, 0xb0, 0xec, 0x16, 0x76, 0xf3, 0xa4, 0x04, 0x96, 0x3a, 0xc2, 0xd7, 0xbe,
+ 0xa8, 0xe0, 0xce, 0xef, 0x87, 0xb2, 0xeb, 0xfc, 0xf9, 0x6f, 0xe3, 0x9c, 0x37, 0x4c, 0xc6, 0xf3,
+ 0xff, 0x1d, 0xb1, 0x78, 0xed, 0x07, 0x15, 0x54, 0x66, 0x83, 0xb3, 0xf3, 0x97, 0x49, 0x72, 0xdc,
+ 0x78, 0xf2, 0x4f, 0xf8, 0x5c, 0x50, 0xeb, 0xe5, 0xd1, 0xd8, 0x54, 0x8f, 0xc7, 0xa6, 0x7a, 0x32,
+ 0x36, 0xd5, 0x8f, 0x13, 0x53, 0x39, 0x9e, 0x98, 0xca, 0xd7, 0x89, 0xa9, 0xbc, 0xe8, 0xfa, 0x54,
+ 0x0e, 0x46, 0x7d, 0x07, 0xf3, 0x21, 0xc4, 0x5c, 0x0c, 0xb9, 0x80, 0xb4, 0x8f, 0xeb, 0x3e, 0x87,
+ 0xf1, 0x16, 0x1c, 0x72, 0x6f, 0x14, 0x10, 0x91, 0xae, 0x18, 0x01, 0x9b, 0x5b, 0xf5, 0x45, 0xea,
+ 0xfa, 0x59, 0x4b, 0x4e, 0x1e, 0x84, 0x44, 0xf4, 0x2b, 0xd9, 0x96, 0x79, 0xf8, 0x3d, 0x00, 0x00,
+ 0xff, 0xff, 0xf0, 0x81, 0x7c, 0xb2, 0x24, 0x05, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -436,6 +445,13 @@ func (m *MsgRegisterInterchainAccountResponse) MarshalToSizedBuffer(dAtA []byte)
_ = i
var l int
_ = l
+ if len(m.PortId) > 0 {
+ i -= len(m.PortId)
+ copy(dAtA[i:], m.PortId)
+ i = encodeVarintTx(dAtA, i, uint64(len(m.PortId)))
+ i--
+ dAtA[i] = 0x12
+ }
if len(m.ChannelId) > 0 {
i -= len(m.ChannelId)
copy(dAtA[i:], m.ChannelId)
@@ -568,6 +584,10 @@ func (m *MsgRegisterInterchainAccountResponse) Size() (n int) {
if l > 0 {
n += 1 + l + sovTx(uint64(l))
}
+ l = len(m.PortId)
+ if l > 0 {
+ n += 1 + l + sovTx(uint64(l))
+ }
return n
}
@@ -818,6 +838,38 @@ func (m *MsgRegisterInterchainAccountResponse) Unmarshal(dAtA []byte) error {
}
m.ChannelId = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field PortId", 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.PortId = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipTx(dAtA[iNdEx:])
diff --git a/modules/apps/27-interchain-accounts/host/client/cli/query.go b/modules/apps/27-interchain-accounts/host/client/cli/query.go
index 95ff6a77fc8..327f51538fc 100644
--- a/modules/apps/27-interchain-accounts/host/client/cli/query.go
+++ b/modules/apps/27-interchain-accounts/host/client/cli/query.go
@@ -4,13 +4,13 @@ import (
"fmt"
"strconv"
+ abci "github.com/cometbft/cometbft/abci/types"
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/flags"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/version"
"github.com/cosmos/cosmos-sdk/x/auth/tx"
"github.com/spf13/cobra"
- abci "github.com/tendermint/tendermint/abci/types"
"github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/types"
icatypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/types"
diff --git a/modules/apps/27-interchain-accounts/host/keeper/keeper.go b/modules/apps/27-interchain-accounts/host/keeper/keeper.go
index fe8d3310adf..506d7be6832 100644
--- a/modules/apps/27-interchain-accounts/host/keeper/keeper.go
+++ b/modules/apps/27-interchain-accounts/host/keeper/keeper.go
@@ -4,12 +4,12 @@ import (
"fmt"
"strings"
+ "github.com/cometbft/cometbft/libs/log"
"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"
- "github.com/tendermint/tendermint/libs/log"
genesistypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/genesis/types"
"github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/types"
diff --git a/modules/apps/27-interchain-accounts/host/keeper/relay_test.go b/modules/apps/27-interchain-accounts/host/keeper/relay_test.go
index 0f2ac129287..0abc06b5abe 100644
--- a/modules/apps/27-interchain-accounts/host/keeper/relay_test.go
+++ b/modules/apps/27-interchain-accounts/host/keeper/relay_test.go
@@ -44,7 +44,7 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() {
proposalMsg, err := govv1.NewLegacyContent(testProposal, interchainAccountAddr)
suite.Require().NoError(err)
- proposal, err := govv1.NewProposal([]sdk.Msg{proposalMsg}, govtypes.DefaultStartingProposalID, "test proposal", suite.chainA.GetContext().BlockTime(), suite.chainA.GetContext().BlockTime(), "title", "Description", sdk.AccAddress(interchainAccountAddr))
+ proposal, err := govv1.NewProposal([]sdk.Msg{proposalMsg}, govtypes.DefaultStartingProposalID, suite.chainA.GetContext().BlockTime(), suite.chainA.GetContext().BlockTime(), "test proposal", "title", "Description", sdk.AccAddress(interchainAccountAddr))
suite.Require().NoError(err)
suite.chainB.GetSimApp().GovKeeper.SetProposal(suite.chainB.GetContext(), proposal)
@@ -210,7 +210,7 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() {
proposalMsg, err := govv1.NewLegacyContent(testProposal, interchainAccountAddr)
suite.Require().NoError(err)
- proposal, err := govv1.NewProposal([]sdk.Msg{proposalMsg}, govtypes.DefaultStartingProposalID, "test proposal", suite.chainA.GetContext().BlockTime(), suite.chainA.GetContext().BlockTime(), "title", "description", sdk.AccAddress(interchainAccountAddr))
+ proposal, err := govv1.NewProposal([]sdk.Msg{proposalMsg}, govtypes.DefaultStartingProposalID, suite.chainA.GetContext().BlockTime(), suite.chainA.GetContext().BlockTime(), "test proposal", "title", "description", sdk.AccAddress(interchainAccountAddr))
suite.Require().NoError(err)
suite.chainB.GetSimApp().GovKeeper.SetProposal(suite.chainB.GetContext(), proposal)
diff --git a/modules/apps/27-interchain-accounts/module.go b/modules/apps/27-interchain-accounts/module.go
index 44a257e17fb..8b0c5d90f26 100644
--- a/modules/apps/27-interchain-accounts/module.go
+++ b/modules/apps/27-interchain-accounts/module.go
@@ -4,8 +4,8 @@ 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"
@@ -14,7 +14,6 @@ import (
simtypes "github.com/cosmos/cosmos-sdk/types/simulation"
"github.com/grpc-ecosystem/grpc-gateway/runtime"
"github.com/spf13/cobra"
- abci "github.com/tendermint/tendermint/abci/types"
"github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/client/cli"
controllerkeeper "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/keeper"
@@ -202,21 +201,11 @@ func (AppModule) GenerateGenesisState(simState *module.SimulationState) {
simulation.RandomizedGenState(simState)
}
-// ProposalContents doesn't return any content functions for governance proposals.
-func (AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalContent {
- return nil
-}
-
// WeightedOperations is unimplemented.
func (am AppModule) WeightedOperations(_ module.SimulationState) []simtypes.WeightedOperation {
return nil
}
-// RandomizedParams creates randomized ibc-transfer param changes for the simulator.
-func (am AppModule) RandomizedParams(r *rand.Rand) []simtypes.ParamChange {
- return simulation.ParamChanges(r, am.controllerKeeper, am.hostKeeper)
-}
-
// RegisterStoreDecoder registers a decoder for interchain accounts module's types
func (am AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) {
sdr[types.StoreKey] = simulation.NewDecodeStore()
diff --git a/modules/apps/27-interchain-accounts/module_test.go b/modules/apps/27-interchain-accounts/module_test.go
index a1215a60ddb..461091b996d 100644
--- a/modules/apps/27-interchain-accounts/module_test.go
+++ b/modules/apps/27-interchain-accounts/module_test.go
@@ -3,11 +3,12 @@ package ica_test
import (
"testing"
+ dbm "github.com/cometbft/cometbft-db"
+ "github.com/cometbft/cometbft/libs/log"
+ tmproto "github.com/cometbft/cometbft/proto/tendermint/types"
+ "github.com/cosmos/cosmos-sdk/baseapp"
simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims"
"github.com/stretchr/testify/suite"
- "github.com/tendermint/tendermint/libs/log"
- tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
- dbm "github.com/tendermint/tm-db"
ica "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts"
controllertypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/types"
@@ -33,12 +34,13 @@ func (suite *InterchainAccountsTestSuite) SetupTest() {
func (suite *InterchainAccountsTestSuite) TestInitModule() {
// setup and basic testing
- app := simapp.NewSimApp(log.NewNopLogger(), dbm.NewMemDB(), nil, true, map[int64]bool{}, simapp.DefaultNodeHome, 5, simapp.MakeTestEncodingConfig(), simtestutil.EmptyAppOptions{})
+ chainID := "testchain"
+ app := simapp.NewSimApp(log.NewNopLogger(), dbm.NewMemDB(), nil, true, map[int64]bool{}, simapp.DefaultNodeHome, 5, simapp.MakeTestEncodingConfig(), simtestutil.EmptyAppOptions{}, baseapp.SetChainID(chainID))
appModule, ok := app.GetModuleManager().Modules[types.ModuleName].(ica.AppModule)
suite.Require().True(ok)
header := tmproto.Header{
- ChainID: "testchain",
+ ChainID: chainID,
Height: 1,
Time: suite.coordinator.CurrentTime.UTC(),
}
@@ -99,9 +101,10 @@ func (suite *InterchainAccountsTestSuite) TestInitModule() {
suite.SetupTest() // reset
// reset app state
- app = simapp.NewSimApp(log.NewNopLogger(), dbm.NewMemDB(), nil, true, map[int64]bool{}, simapp.DefaultNodeHome, 5, simapp.MakeTestEncodingConfig(), simtestutil.EmptyAppOptions{})
+ chainID := "testchain"
+ app = simapp.NewSimApp(log.NewNopLogger(), dbm.NewMemDB(), nil, true, map[int64]bool{}, simapp.DefaultNodeHome, 5, simapp.MakeTestEncodingConfig(), simtestutil.EmptyAppOptions{}, baseapp.SetChainID(chainID))
header := tmproto.Header{
- ChainID: "testchain",
+ ChainID: chainID,
Height: 1,
Time: suite.coordinator.CurrentTime.UTC(),
}
diff --git a/modules/apps/27-interchain-accounts/simulation/params.go b/modules/apps/27-interchain-accounts/simulation/params.go
deleted file mode 100644
index 4b1fb019a33..00000000000
--- a/modules/apps/27-interchain-accounts/simulation/params.go
+++ /dev/null
@@ -1,41 +0,0 @@
-package simulation
-
-import (
- "fmt"
- "math/rand"
-
- simtypes "github.com/cosmos/cosmos-sdk/types/simulation"
- "github.com/cosmos/cosmos-sdk/x/simulation"
- gogotypes "github.com/cosmos/gogoproto/types"
-
- controllerkeeper "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/keeper"
- controllertypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/types"
- hostkeeper "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/keeper"
- hosttypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/types"
- "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/types"
-)
-
-// ParamChanges defines the parameters that can be modified by param change proposals
-// on the simulation
-func ParamChanges(r *rand.Rand, controllerKeeper *controllerkeeper.Keeper, hostKeeper *hostkeeper.Keeper) []simtypes.ParamChange {
- var paramChanges []simtypes.ParamChange
- if controllerKeeper != nil {
- paramChanges = append(paramChanges, simulation.NewSimParamChange(controllertypes.SubModuleName, string(controllertypes.KeyControllerEnabled),
- func(r *rand.Rand) string {
- controllerEnabled := RandomEnabled(r)
- return fmt.Sprintf("%s", types.ModuleCdc.MustMarshalJSON(&gogotypes.BoolValue{Value: controllerEnabled})) //nolint:gosimple
- },
- ))
- }
-
- if hostKeeper != nil {
- paramChanges = append(paramChanges, simulation.NewSimParamChange(hosttypes.SubModuleName, string(hosttypes.KeyHostEnabled),
- func(r *rand.Rand) string {
- receiveEnabled := RandomEnabled(r)
- return fmt.Sprintf("%s", types.ModuleCdc.MustMarshalJSON(&gogotypes.BoolValue{Value: receiveEnabled})) //nolint:gosimple
- },
- ))
- }
-
- return paramChanges
-}
diff --git a/modules/apps/27-interchain-accounts/simulation/params_test.go b/modules/apps/27-interchain-accounts/simulation/params_test.go
deleted file mode 100644
index 5c92a5f65f9..00000000000
--- a/modules/apps/27-interchain-accounts/simulation/params_test.go
+++ /dev/null
@@ -1,64 +0,0 @@
-package simulation_test
-
-import (
- "fmt"
- "math/rand"
- "testing"
-
- "github.com/stretchr/testify/require"
-
- controllertypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/types"
- hosttypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/types"
- "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/simulation"
- "github.com/cosmos/ibc-go/v7/testing/simapp"
-)
-
-func TestParamChanges(t *testing.T) {
- app := simapp.Setup(false)
-
- s := rand.NewSource(1)
- r := rand.New(s)
-
- expected := []struct {
- composedKey string
- key string
- simValue string
- subspace string
- }{
- {fmt.Sprintf("%s/%s", controllertypes.SubModuleName, controllertypes.KeyControllerEnabled), string(controllertypes.KeyControllerEnabled), "false", controllertypes.SubModuleName},
- {fmt.Sprintf("%s/%s", hosttypes.SubModuleName, hosttypes.KeyHostEnabled), string(hosttypes.KeyHostEnabled), "true", hosttypes.SubModuleName},
- }
-
- paramChanges := simulation.ParamChanges(r, &app.ICAControllerKeeper, &app.ICAHostKeeper)
- require.Len(t, paramChanges, 2)
-
- for i, p := range paramChanges {
- require.Equal(t, expected[i].composedKey, p.ComposedKey())
- require.Equal(t, expected[i].key, p.Key())
- require.Equal(t, expected[i].simValue, p.SimValue()(r), p.Key())
- require.Equal(t, expected[i].subspace, p.Subspace())
- }
-
- paramChanges = simulation.ParamChanges(r, &app.ICAControllerKeeper, nil)
- require.Len(t, paramChanges, 1)
-
- // the second call to paramChanges causing the controller enabled to be changed to true
- expected[0].simValue = "true"
-
- for _, p := range paramChanges {
- require.Equal(t, expected[0].composedKey, p.ComposedKey())
- require.Equal(t, expected[0].key, p.Key())
- require.Equal(t, expected[0].simValue, p.SimValue()(r), p.Key())
- require.Equal(t, expected[0].subspace, p.Subspace())
- }
-
- paramChanges = simulation.ParamChanges(r, nil, &app.ICAHostKeeper)
- require.Len(t, paramChanges, 1)
-
- for _, p := range paramChanges {
- require.Equal(t, expected[1].composedKey, p.ComposedKey())
- require.Equal(t, expected[1].key, p.Key())
- require.Equal(t, expected[1].simValue, p.SimValue()(r), p.Key())
- require.Equal(t, expected[1].subspace, p.Subspace())
- }
-}
diff --git a/modules/apps/27-interchain-accounts/types/account.pb.go b/modules/apps/27-interchain-accounts/types/account.pb.go
index 30be213a4c6..67273dfd591 100644
--- a/modules/apps/27-interchain-accounts/types/account.pb.go
+++ b/modules/apps/27-interchain-accounts/types/account.pb.go
@@ -72,7 +72,7 @@ func init() {
}
var fileDescriptor_5561bd92625bf7da = []byte{
- // 341 bytes of a gzipped FileDescriptorProto
+ // 344 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x32, 0xcd, 0x4c, 0x4a, 0xd6,
0x4f, 0x2c, 0x28, 0xc8, 0xc9, 0x4c, 0x4e, 0x2c, 0xc9, 0xcc, 0xcf, 0x2b, 0xd6, 0xcf, 0xcc, 0x2b,
0x49, 0x2d, 0x4a, 0xce, 0x48, 0xcc, 0xcc, 0x8b, 0x4f, 0x4c, 0x4e, 0xce, 0x2f, 0xcd, 0x2b, 0x29,
@@ -80,21 +80,21 @@ var fileDescriptor_5561bd92625bf7da = []byte{
0x92, 0xf5, 0x90, 0xb5, 0xe9, 0x61, 0xd1, 0xa6, 0x57, 0x66, 0x28, 0x25, 0x99, 0x9c, 0x5f, 0x9c,
0x9b, 0x5f, 0x1c, 0x0f, 0xd6, 0xa6, 0x0f, 0xe1, 0x40, 0xcc, 0x90, 0x12, 0x49, 0xcf, 0x4f, 0xcf,
0x87, 0x88, 0x83, 0x58, 0x50, 0x51, 0x39, 0x88, 0x1a, 0xfd, 0xc4, 0xd2, 0x92, 0x0c, 0xfd, 0x32,
- 0xc3, 0xa4, 0xd4, 0x92, 0x44, 0x43, 0x30, 0x07, 0x22, 0xaf, 0x74, 0x85, 0x91, 0x4b, 0xd0, 0x13,
+ 0xc3, 0xa4, 0xd4, 0x92, 0x44, 0x43, 0x30, 0x07, 0x22, 0xaf, 0xf4, 0x87, 0x91, 0x4b, 0xd0, 0x13,
0x6e, 0x97, 0x23, 0xc4, 0x2a, 0xa1, 0x04, 0x2e, 0x9e, 0xa4, 0xc4, 0xe2, 0x54, 0x98, 0xd5, 0x12,
0x8c, 0x0a, 0x8c, 0x1a, 0xdc, 0x46, 0x0a, 0x7a, 0x50, 0x0b, 0xc1, 0xfa, 0xa1, 0x86, 0xe9, 0x39,
0x25, 0x16, 0xa7, 0x42, 0xf5, 0x39, 0x49, 0x5f, 0xb8, 0x27, 0xcf, 0xf8, 0xe9, 0x9e, 0xbc, 0x70,
0x65, 0x62, 0x6e, 0x8e, 0x95, 0x12, 0xb2, 0x19, 0x4a, 0x41, 0xdc, 0x49, 0x08, 0x95, 0x42, 0xb6,
0x5c, 0xbc, 0x50, 0x89, 0xf8, 0xfc, 0xf2, 0xbc, 0xd4, 0x22, 0x09, 0x26, 0x05, 0x46, 0x0d, 0x4e,
0x27, 0x89, 0x4f, 0xf7, 0xe4, 0x45, 0x20, 0x9a, 0x51, 0xa4, 0x95, 0x82, 0x78, 0xa0, 0x7c, 0x7f,
- 0x10, 0xd7, 0x4a, 0xae, 0x63, 0x81, 0x3c, 0xc3, 0x8c, 0x05, 0xf2, 0x0c, 0xa7, 0xb6, 0xe8, 0x0a,
- 0x61, 0xb8, 0xdf, 0xd3, 0x29, 0xfe, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, 0xe4, 0x18, 0x1f, 0x3c,
- 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, 0x39, 0x86, 0x1b, 0x8f, 0xe5, 0x18, 0xa2,
- 0x5c, 0xd3, 0x33, 0x4b, 0x32, 0x4a, 0x93, 0xf4, 0x92, 0xf3, 0x73, 0xa1, 0xe1, 0xa7, 0x9f, 0x99,
- 0x94, 0xac, 0x9b, 0x9e, 0xaf, 0x5f, 0x66, 0xae, 0x9f, 0x9b, 0x9f, 0x52, 0x9a, 0x93, 0x5a, 0x0c,
- 0x8a, 0xc1, 0x62, 0x7d, 0x23, 0x73, 0x5d, 0x44, 0x2c, 0xe8, 0xc2, 0x23, 0xaf, 0xa4, 0xb2, 0x20,
- 0xb5, 0x38, 0x89, 0x0d, 0x1c, 0x7c, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4f, 0x3d, 0xe7,
- 0xd4, 0xf1, 0x01, 0x00, 0x00,
+ 0x10, 0xd7, 0xca, 0xad, 0x63, 0x81, 0x3c, 0xc3, 0x8c, 0x05, 0xf2, 0x0c, 0xa7, 0xb6, 0xe8, 0x5a,
+ 0x11, 0x19, 0x78, 0x7a, 0x18, 0xfe, 0xf4, 0x74, 0x8a, 0x3f, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23,
+ 0x39, 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6,
+ 0x63, 0x39, 0x86, 0x28, 0xd7, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, 0x68,
+ 0x38, 0xeb, 0x67, 0x26, 0x25, 0xeb, 0xa6, 0xe7, 0xeb, 0x97, 0x99, 0xeb, 0xe7, 0xe6, 0xa7, 0x94,
+ 0xe6, 0xa4, 0x16, 0x83, 0x62, 0xba, 0x58, 0xdf, 0xc8, 0x5c, 0x17, 0x61, 0xa1, 0x2e, 0x3c, 0x92,
+ 0x4b, 0x2a, 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0xc1, 0x6c, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff,
+ 0xae, 0x11, 0x4f, 0x20, 0x19, 0x02, 0x00, 0x00,
}
func (m *InterchainAccount) Marshal() (dAtA []byte, err error) {
diff --git a/modules/apps/29-fee/keeper/escrow_test.go b/modules/apps/29-fee/keeper/escrow_test.go
index af0ce95902e..bcb6c473596 100644
--- a/modules/apps/29-fee/keeper/escrow_test.go
+++ b/modules/apps/29-fee/keeper/escrow_test.go
@@ -1,8 +1,8 @@
package keeper_test
import (
+ "github.com/cometbft/cometbft/crypto/secp256k1"
sdk "github.com/cosmos/cosmos-sdk/types"
- "github.com/tendermint/tendermint/crypto/secp256k1"
"github.com/cosmos/ibc-go/v7/modules/apps/29-fee/types"
transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
diff --git a/modules/apps/29-fee/keeper/events_test.go b/modules/apps/29-fee/keeper/events_test.go
index 4fd2b6c62cb..1f7726fea00 100644
--- a/modules/apps/29-fee/keeper/events_test.go
+++ b/modules/apps/29-fee/keeper/events_test.go
@@ -1,8 +1,8 @@
package keeper_test
import (
+ abcitypes "github.com/cometbft/cometbft/abci/types"
sdk "github.com/cosmos/cosmos-sdk/types"
- abcitypes "github.com/tendermint/tendermint/abci/types"
"github.com/cosmos/ibc-go/v7/modules/apps/29-fee/types"
transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
diff --git a/modules/apps/29-fee/keeper/grpc_query_test.go b/modules/apps/29-fee/keeper/grpc_query_test.go
index a90b6e829a9..fdededc0b37 100644
--- a/modules/apps/29-fee/keeper/grpc_query_test.go
+++ b/modules/apps/29-fee/keeper/grpc_query_test.go
@@ -3,9 +3,9 @@ package keeper_test
import (
"fmt"
+ "github.com/cometbft/cometbft/crypto/secp256k1"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/query"
- "github.com/tendermint/tendermint/crypto/secp256k1"
"github.com/cosmos/ibc-go/v7/modules/apps/29-fee/types"
channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types"
diff --git a/modules/apps/29-fee/keeper/keeper.go b/modules/apps/29-fee/keeper/keeper.go
index 7db7cbd3e46..c88bbbe492a 100644
--- a/modules/apps/29-fee/keeper/keeper.go
+++ b/modules/apps/29-fee/keeper/keeper.go
@@ -1,11 +1,11 @@
package keeper
import (
+ "github.com/cometbft/cometbft/libs/log"
"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"
- "github.com/tendermint/tendermint/libs/log"
"github.com/cosmos/ibc-go/v7/modules/apps/29-fee/types"
channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types"
@@ -291,7 +291,7 @@ func (k Keeper) GetFeesInEscrow(ctx sdk.Context, packetID channeltypes.PacketId)
store := ctx.KVStore(k.storeKey)
key := types.KeyFeesInEscrow(packetID)
bz := store.Get(key)
- if bz == nil {
+ if len(bz) == 0 {
return types.PacketFees{}, false
}
diff --git a/modules/apps/29-fee/module.go b/modules/apps/29-fee/module.go
index b1bdedf0581..9286e98cb9e 100644
--- a/modules/apps/29-fee/module.go
+++ b/modules/apps/29-fee/module.go
@@ -4,8 +4,8 @@ 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"
@@ -14,7 +14,6 @@ import (
simtypes "github.com/cosmos/cosmos-sdk/types/simulation"
"github.com/grpc-ecosystem/grpc-gateway/runtime"
"github.com/spf13/cobra"
- abci "github.com/tendermint/tendermint/abci/types"
"github.com/cosmos/ibc-go/v7/modules/apps/29-fee/client/cli"
"github.com/cosmos/ibc-go/v7/modules/apps/29-fee/keeper"
@@ -133,16 +132,6 @@ func (am AppModule) EndBlock(ctx sdk.Context, req abci.RequestEndBlock) []abci.V
func (AppModule) GenerateGenesisState(_ *module.SimulationState) {
}
-// ProposalContents doesn't return any content functions for governance proposals.
-func (AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalContent {
- return nil
-}
-
-// RandomizedParams creates randomized ibc-29-fee param changes for the simulator.
-func (AppModule) RandomizedParams(_ *rand.Rand) []simtypes.ParamChange {
- return nil
-}
-
// RegisterStoreDecoder registers a decoder for 29-fee module's types
func (am AppModule) RegisterStoreDecoder(_ sdk.StoreDecoderRegistry) {
}
diff --git a/modules/apps/29-fee/types/fee_test.go b/modules/apps/29-fee/types/fee_test.go
index 71758559baa..5c8800f2913 100644
--- a/modules/apps/29-fee/types/fee_test.go
+++ b/modules/apps/29-fee/types/fee_test.go
@@ -3,9 +3,9 @@ package types_test
import (
"testing"
+ "github.com/cometbft/cometbft/crypto/secp256k1"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/stretchr/testify/require"
- "github.com/tendermint/tendermint/crypto/secp256k1"
"github.com/cosmos/ibc-go/v7/modules/apps/29-fee/types"
)
diff --git a/modules/apps/29-fee/types/genesis_test.go b/modules/apps/29-fee/types/genesis_test.go
index cdf217f3afd..6ecde68c3a6 100644
--- a/modules/apps/29-fee/types/genesis_test.go
+++ b/modules/apps/29-fee/types/genesis_test.go
@@ -3,9 +3,9 @@ package types_test
import (
"testing"
+ "github.com/cometbft/cometbft/crypto/secp256k1"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/stretchr/testify/require"
- "github.com/tendermint/tendermint/crypto/secp256k1"
"github.com/cosmos/ibc-go/v7/modules/apps/29-fee/types"
channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types"
diff --git a/modules/apps/29-fee/types/msgs.go b/modules/apps/29-fee/types/msgs.go
index 047b48b9ec1..c44f14925c4 100644
--- a/modules/apps/29-fee/types/msgs.go
+++ b/modules/apps/29-fee/types/msgs.go
@@ -5,11 +5,27 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
+ legacytx "github.com/cosmos/cosmos-sdk/x/auth/migrations/legacytx"
channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types"
host "github.com/cosmos/ibc-go/v7/modules/core/24-host"
)
+// msg types
+const (
+ TypeMsgPayPacketFee = "payPacketFee"
+ TypeMsgPayPacketFeeAsync = "payPacketFeeAsync"
+)
+
+var (
+ _ sdk.Msg = (*MsgRegisterPayee)(nil)
+ _ sdk.Msg = (*MsgRegisterCounterpartyPayee)(nil)
+ _ sdk.Msg = (*MsgPayPacketFee)(nil)
+ _ sdk.Msg = (*MsgPayPacketFeeAsync)(nil)
+ _ legacytx.LegacyMsg = (*MsgPayPacketFee)(nil)
+ _ legacytx.LegacyMsg = (*MsgPayPacketFeeAsync)(nil)
+)
+
// NewMsgRegisterPayee creates a new instance of MsgRegisterPayee
func NewMsgRegisterPayee(portID, channelID, relayerAddr, payeeAddr string) *MsgRegisterPayee {
return &MsgRegisterPayee{
@@ -148,12 +164,17 @@ func (msg MsgPayPacketFee) GetSigners() []sdk.AccAddress {
return []sdk.AccAddress{signer}
}
-// Route implements sdk.Msg
+// Type implements legacytx.LegacyMsg
+func (msg MsgPayPacketFee) Type() string {
+ return TypeMsgPayPacketFee
+}
+
+// Route implements legacytx.LegacyMsg
func (msg MsgPayPacketFee) Route() string {
return RouterKey
}
-// GetSignBytes implements sdk.Msg.
+// GetSignBytes implements legacytx.LegacyMsg
func (msg MsgPayPacketFee) GetSignBytes() []byte {
return sdk.MustSortJSON(AminoCdc.MustMarshalJSON(&msg))
}
@@ -189,12 +210,17 @@ func (msg MsgPayPacketFeeAsync) GetSigners() []sdk.AccAddress {
return []sdk.AccAddress{signer}
}
-// Route implements sdk.Msg
+// Type implements legacytx.LegacyMsg
+func (msg MsgPayPacketFeeAsync) Type() string {
+ return TypeMsgPayPacketFeeAsync
+}
+
+// Route implements legacytx.LegacyMsg
func (msg MsgPayPacketFeeAsync) Route() string {
return RouterKey
}
-// GetSignBytes implements sdk.Msg.
+// GetSignBytes implements legacytx.LegacyMsg
func (msg MsgPayPacketFeeAsync) GetSignBytes() []byte {
return sdk.MustSortJSON(AminoCdc.MustMarshalJSON(&msg))
}
diff --git a/modules/apps/29-fee/types/msgs_test.go b/modules/apps/29-fee/types/msgs_test.go
index 2bba74bff42..e20984e228b 100644
--- a/modules/apps/29-fee/types/msgs_test.go
+++ b/modules/apps/29-fee/types/msgs_test.go
@@ -3,9 +3,9 @@ package types_test
import (
"testing"
+ "github.com/cometbft/cometbft/crypto/secp256k1"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/stretchr/testify/require"
- "github.com/tendermint/tendermint/crypto/secp256k1"
"github.com/cosmos/ibc-go/v7/modules/apps/29-fee/types"
channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types"
diff --git a/modules/apps/transfer/client/cli/cli.go b/modules/apps/transfer/client/cli/cli.go
index 52102df81a1..8412c331fc8 100644
--- a/modules/apps/transfer/client/cli/cli.go
+++ b/modules/apps/transfer/client/cli/cli.go
@@ -20,6 +20,7 @@ func GetQueryCmd() *cobra.Command {
GetCmdParams(),
GetCmdQueryEscrowAddress(),
GetCmdQueryDenomHash(),
+ GetCmdQueryTotalEscrowForDenom(),
)
return queryCmd
diff --git a/modules/apps/transfer/client/cli/query.go b/modules/apps/transfer/client/cli/query.go
index e87998e5573..8ebab138c66 100644
--- a/modules/apps/transfer/client/cli/query.go
+++ b/modules/apps/transfer/client/cli/query.go
@@ -167,3 +167,36 @@ func GetCmdQueryDenomHash() *cobra.Command {
flags.AddQueryFlagsToCmd(cmd)
return cmd
}
+
+// GetCmdQueryTotalEscrowForDenom defines the command to query the total amount of tokens in escrow for a denom
+func GetCmdQueryTotalEscrowForDenom() *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "total-escrow [denom]",
+ Short: "Query the total amount of tokens in escrow for a denom",
+ Long: "Query the total amount of tokens in escrow for a denom",
+ Example: fmt.Sprintf("%s query ibc-transfer total-escrow uosmo", version.AppName),
+ Args: cobra.ExactArgs(1),
+ RunE: func(cmd *cobra.Command, args []string) error {
+ clientCtx, err := client.GetClientQueryContext(cmd)
+ if err != nil {
+ return err
+ }
+
+ queryClient := types.NewQueryClient(clientCtx)
+
+ req := &types.QueryTotalEscrowForDenomRequest{
+ Denom: args[0],
+ }
+
+ res, err := queryClient.TotalEscrowForDenom(cmd.Context(), req)
+ if err != nil {
+ return err
+ }
+
+ return clientCtx.PrintProto(res)
+ },
+ }
+
+ flags.AddQueryFlagsToCmd(cmd)
+ return cmd
+}
diff --git a/modules/apps/transfer/client/cli/tx.go b/modules/apps/transfer/client/cli/tx.go
index 452aa214ae1..c9024f03886 100644
--- a/modules/apps/transfer/client/cli/tx.go
+++ b/modules/apps/transfer/client/cli/tx.go
@@ -14,8 +14,10 @@ import (
"github.com/spf13/cobra"
"github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
+ clientutils "github.com/cosmos/ibc-go/v7/modules/core/02-client/client/utils"
clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
channelutils "github.com/cosmos/ibc-go/v7/modules/core/04-channel/client/utils"
+ "github.com/cosmos/ibc-go/v7/modules/core/exported"
)
const (
@@ -83,26 +85,54 @@ corresponding to the counterparty channel. Any timeout set to 0 is disabled.`),
}
// if the timeouts are not absolute, retrieve latest block height and block timestamp
- // for the consensus state connected to the destination port/channel
+ // for the consensus state connected to the destination port/channel.
+ // localhost clients must rely solely on local clock time in order to use relative timestamps.
if !absoluteTimeouts {
- consensusState, height, _, err := channelutils.QueryLatestConsensusState(clientCtx, srcPort, srcChannel)
+ clientRes, err := channelutils.QueryChannelClientState(clientCtx, srcPort, srcChannel, false)
if err != nil {
return err
}
+ var clientState exported.ClientState
+ if err := clientCtx.InterfaceRegistry.UnpackAny(clientRes.IdentifiedClientState.ClientState, &clientState); err != nil {
+ return err
+ }
+
+ clientHeight, ok := clientState.GetLatestHeight().(clienttypes.Height)
+ if !ok {
+ return fmt.Errorf("invalid height type. expected type: %T, got: %T", clienttypes.Height{}, clientState.GetLatestHeight())
+ }
+
+ var consensusState exported.ConsensusState
+ if clientState.ClientType() != exported.Localhost {
+ consensusStateRes, err := clientutils.QueryConsensusState(clientCtx, clientRes.IdentifiedClientState.ClientId, clientHeight, false, true)
+ if err != nil {
+ return err
+ }
+
+ if err := clientCtx.InterfaceRegistry.UnpackAny(consensusStateRes.ConsensusState, &consensusState); err != nil {
+ return err
+ }
+ }
+
if !timeoutHeight.IsZero() {
- absoluteHeight := height
+ absoluteHeight := clientHeight
absoluteHeight.RevisionNumber += timeoutHeight.RevisionNumber
absoluteHeight.RevisionHeight += timeoutHeight.RevisionHeight
timeoutHeight = absoluteHeight
}
+ // use local clock time as reference time if it is later than the
+ // consensus state timestamp of the counterparty chain, otherwise
+ // still use consensus state timestamp as reference.
+ // for localhost clients local clock time is always used.
if timeoutTimestamp != 0 {
- // use local clock time as reference time if it is later than the
- // consensus state timestamp of the counter party chain, otherwise
- // still use consensus state timestamp as reference
+ var consensusStateTimestamp uint64
+ if consensusState != nil {
+ consensusStateTimestamp = consensusState.GetTimestamp()
+ }
+
now := time.Now().UnixNano()
- consensusStateTimestamp := consensusState.GetTimestamp()
if now > 0 {
now := uint64(now)
if now > consensusStateTimestamp {
diff --git a/modules/apps/transfer/keeper/genesis.go b/modules/apps/transfer/keeper/genesis.go
index ce0a45155e1..3381e6cdc37 100644
--- a/modules/apps/transfer/keeper/genesis.go
+++ b/modules/apps/transfer/keeper/genesis.go
@@ -28,13 +28,20 @@ func (k Keeper) InitGenesis(ctx sdk.Context, state types.GenesisState) {
}
k.SetParams(ctx, state.Params)
+
+ // Every denom will have only one total escrow amount, since any
+ // duplicate entry will fail validation in Validate of GenesisState
+ for _, denomEscrow := range state.TotalEscrowed {
+ k.SetTotalEscrowForDenom(ctx, denomEscrow)
+ }
}
// ExportGenesis exports ibc-transfer module's portID and denom trace info into its genesis state.
func (k Keeper) ExportGenesis(ctx sdk.Context) *types.GenesisState {
return &types.GenesisState{
- PortId: k.GetPort(ctx),
- DenomTraces: k.GetAllDenomTraces(ctx),
- Params: k.GetParams(ctx),
+ PortId: k.GetPort(ctx),
+ DenomTraces: k.GetAllDenomTraces(ctx),
+ Params: k.GetParams(ctx),
+ TotalEscrowed: k.GetAllTotalEscrowed(ctx),
}
}
diff --git a/modules/apps/transfer/keeper/genesis_test.go b/modules/apps/transfer/keeper/genesis_test.go
index 3bc35144943..99c25eab242 100644
--- a/modules/apps/transfer/keeper/genesis_test.go
+++ b/modules/apps/transfer/keeper/genesis_test.go
@@ -3,35 +3,52 @@ package keeper_test
import (
"fmt"
+ "cosmossdk.io/math"
+ sdk "github.com/cosmos/cosmos-sdk/types"
+
"github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
)
func (suite *KeeperTestSuite) TestGenesis() {
- var (
- path string
- traces types.Traces
- )
+ getTrace := func(index uint) string {
+ return fmt.Sprintf("transfer/channelToChain%d", index)
+ }
- for i := 0; i < 5; i++ {
- prefix := fmt.Sprintf("transfer/channelToChain%d", i)
- if i == 0 {
- path = prefix
- } else {
- path = prefix + "/" + path
+ var (
+ traces types.Traces
+ escrows sdk.Coins
+ pathsAndEscrowAmounts = []struct {
+ path string
+ escrow string
+ }{
+ {getTrace(0), "10"},
+ {fmt.Sprintf("%s/%s", getTrace(1), getTrace(0)), "100000"},
+ {fmt.Sprintf("%s/%s/%s", getTrace(2), getTrace(1), getTrace(0)), "10000000000"},
+ {fmt.Sprintf("%s/%s/%s/%s", getTrace(3), getTrace(2), getTrace(1), getTrace(0)), "1000000000000000"},
+ {fmt.Sprintf("%s/%s/%s/%s/%s", getTrace(4), getTrace(3), getTrace(2), getTrace(1), getTrace(0)), "100000000000000000000"},
}
+ )
+ for _, pathAndEscrowAmount := range pathsAndEscrowAmounts {
denomTrace := types.DenomTrace{
BaseDenom: "uatom",
- Path: path,
+ Path: pathAndEscrowAmount.path,
}
traces = append(types.Traces{denomTrace}, traces...)
suite.chainA.GetSimApp().TransferKeeper.SetDenomTrace(suite.chainA.GetContext(), denomTrace)
+
+ denom := denomTrace.IBCDenom()
+ amount, ok := math.NewIntFromString(pathAndEscrowAmount.escrow)
+ suite.Require().True(ok)
+ escrows = append(sdk.NewCoins(sdk.NewCoin(denom, amount)), escrows...)
+ suite.chainA.GetSimApp().TransferKeeper.SetTotalEscrowForDenom(suite.chainA.GetContext(), sdk.NewCoin(denom, amount))
}
genesis := suite.chainA.GetSimApp().TransferKeeper.ExportGenesis(suite.chainA.GetContext())
suite.Require().Equal(types.PortID, genesis.PortId)
suite.Require().Equal(traces.Sort(), genesis.DenomTraces)
+ suite.Require().Equal(escrows.Sort(), genesis.TotalEscrowed)
suite.Require().NotPanics(func() {
suite.chainA.GetSimApp().TransferKeeper.InitGenesis(suite.chainA.GetContext(), *genesis)
diff --git a/modules/apps/transfer/keeper/grpc_query.go b/modules/apps/transfer/keeper/grpc_query.go
index 869daf20758..817d554b5d5 100644
--- a/modules/apps/transfer/keeper/grpc_query.go
+++ b/modules/apps/transfer/keeper/grpc_query.go
@@ -121,3 +121,22 @@ func (q Keeper) EscrowAddress(c context.Context, req *types.QueryEscrowAddressRe
EscrowAddress: addr.String(),
}, nil
}
+
+// TotalEscrowForDenom implements the TotalEscrowForDenom gRPC method.
+func (q Keeper) TotalEscrowForDenom(c context.Context, req *types.QueryTotalEscrowForDenomRequest) (*types.QueryTotalEscrowForDenomResponse, error) {
+ if req == nil {
+ return nil, status.Error(codes.InvalidArgument, "empty request")
+ }
+
+ ctx := sdk.UnwrapSDKContext(c)
+
+ if err := sdk.ValidateDenom(req.Denom); err != nil {
+ return nil, status.Error(codes.InvalidArgument, err.Error())
+ }
+
+ amount := q.GetTotalEscrowForDenom(ctx, req.Denom)
+
+ return &types.QueryTotalEscrowForDenomResponse{
+ Amount: amount,
+ }, nil
+}
diff --git a/modules/apps/transfer/keeper/grpc_query_test.go b/modules/apps/transfer/keeper/grpc_query_test.go
index ffb4833d25e..b22d2d6427d 100644
--- a/modules/apps/transfer/keeper/grpc_query_test.go
+++ b/modules/apps/transfer/keeper/grpc_query_test.go
@@ -3,6 +3,7 @@ package keeper_test
import (
"fmt"
+ "cosmossdk.io/math"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/query"
@@ -261,3 +262,99 @@ func (suite *KeeperTestSuite) TestEscrowAddress() {
})
}
}
+
+func (suite *KeeperTestSuite) TestTotalEscrowForDenom() {
+ var (
+ req *types.QueryTotalEscrowForDenomRequest
+ expEscrowAmount math.Int
+ )
+
+ testCases := []struct {
+ msg string
+ malleate func()
+ expPass bool
+ }{
+ {
+ "valid native denom with escrow amount < 2^63",
+ func() {
+ req = &types.QueryTotalEscrowForDenomRequest{
+ Denom: sdk.DefaultBondDenom,
+ }
+
+ expEscrowAmount = math.NewInt(100)
+ suite.chainA.GetSimApp().TransferKeeper.SetTotalEscrowForDenom(suite.chainA.GetContext(), sdk.NewCoin(sdk.DefaultBondDenom, expEscrowAmount))
+ },
+ true,
+ },
+ {
+ "valid ibc denom with escrow amount > 2^63",
+ func() {
+ denomTrace := types.DenomTrace{
+ Path: "transfer/channel-0",
+ BaseDenom: sdk.DefaultBondDenom,
+ }
+
+ suite.chainA.GetSimApp().TransferKeeper.SetDenomTrace(suite.chainA.GetContext(), denomTrace)
+ expEscrowAmount, ok := math.NewIntFromString("100000000000000000000")
+ suite.Require().True(ok)
+ suite.chainA.GetSimApp().TransferKeeper.SetTotalEscrowForDenom(suite.chainA.GetContext(), sdk.NewCoin(sdk.DefaultBondDenom, expEscrowAmount))
+
+ req = &types.QueryTotalEscrowForDenomRequest{
+ Denom: denomTrace.IBCDenom(),
+ }
+ },
+ true,
+ },
+ {
+ "valid ibc denom treated as native denom",
+ func() {
+ denomTrace := types.DenomTrace{
+ Path: "transfer/channel-0",
+ BaseDenom: sdk.DefaultBondDenom,
+ }
+
+ req = &types.QueryTotalEscrowForDenomRequest{
+ Denom: denomTrace.IBCDenom(),
+ }
+ },
+ true, // denom trace is not found, thus the denom is considered a native token
+ },
+ {
+ "invalid ibc denom treated as valid native denom",
+ func() {
+ req = &types.QueryTotalEscrowForDenomRequest{
+ Denom: "ibc/123",
+ }
+ },
+ true, // the ibc denom does not contain a valid hash, thus the denom is considered a native token
+ },
+ {
+ "invalid denom",
+ func() {
+ req = &types.QueryTotalEscrowForDenomRequest{
+ Denom: "??𓃠🐾??",
+ }
+ },
+ false,
+ },
+ }
+
+ for _, tc := range testCases {
+ suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
+ suite.SetupTest() // reset
+
+ expEscrowAmount = sdk.ZeroInt()
+ tc.malleate()
+ ctx := sdk.WrapSDKContext(suite.chainA.GetContext())
+
+ res, err := suite.chainA.GetSimApp().TransferKeeper.TotalEscrowForDenom(ctx, req)
+
+ if tc.expPass {
+ suite.Require().NoError(err)
+ suite.Require().Equal(expEscrowAmount, res.Amount.Amount)
+ } else {
+ suite.Require().Error(err)
+ }
+ })
+ }
+}
diff --git a/modules/apps/transfer/keeper/invariants.go b/modules/apps/transfer/keeper/invariants.go
new file mode 100644
index 00000000000..93e5aa36259
--- /dev/null
+++ b/modules/apps/transfer/keeper/invariants.go
@@ -0,0 +1,51 @@
+package keeper
+
+import (
+ "fmt"
+
+ sdk "github.com/cosmos/cosmos-sdk/types"
+
+ "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
+)
+
+// RegisterInvariants registers all transfer invariants
+func RegisterInvariants(ir sdk.InvariantRegistry, k *Keeper) {
+ ir.RegisterRoute(types.ModuleName, "total-escrow-per-denom",
+ TotalEscrowPerDenomInvariants(k))
+}
+
+// AllInvariants runs all invariants of the transfer module.
+func AllInvariants(k *Keeper) sdk.Invariant {
+ return func(ctx sdk.Context) (string, bool) {
+ return TotalEscrowPerDenomInvariants(k)(ctx)
+ }
+}
+
+// TotalEscrowPerDenomInvariants checks that the total amount escrowed for
+// each denom is not smaller than the amount stored in the state entry.
+func TotalEscrowPerDenomInvariants(k *Keeper) sdk.Invariant {
+ return func(ctx sdk.Context) (string, bool) {
+ var actualTotalEscrowed sdk.Coins
+
+ expectedTotalEscrowed := k.GetAllTotalEscrowed(ctx)
+
+ portID := k.GetPort(ctx)
+ transferChannels := k.channelKeeper.GetAllChannelsWithPortPrefix(ctx, portID)
+ for _, channel := range transferChannels {
+ escrowAddress := types.GetEscrowAddress(portID, channel.ChannelId)
+ escrowBalances := k.bankKeeper.GetAllBalances(ctx, escrowAddress)
+
+ actualTotalEscrowed = actualTotalEscrowed.Add(escrowBalances...)
+ }
+
+ // the actual escrowed amount must be greater than or equal to the expected amount for all denominations
+ if !actualTotalEscrowed.IsAllGTE(expectedTotalEscrowed) {
+ return sdk.FormatInvariant(
+ types.ModuleName,
+ "total escrow per denom invariance",
+ fmt.Sprintf("found denom(s) with total escrow amount lower than expected:\nactual total escrowed: %s\nexpected total escrowed: %s", actualTotalEscrowed, expectedTotalEscrowed)), true
+ }
+
+ return "", false
+ }
+}
diff --git a/modules/apps/transfer/keeper/invariants_test.go b/modules/apps/transfer/keeper/invariants_test.go
new file mode 100644
index 00000000000..972060ca6b7
--- /dev/null
+++ b/modules/apps/transfer/keeper/invariants_test.go
@@ -0,0 +1,71 @@
+package keeper_test
+
+import (
+ "cosmossdk.io/math"
+
+ sdk "github.com/cosmos/cosmos-sdk/types"
+ "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper"
+ "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
+)
+
+func (suite *KeeperTestSuite) TestTotalEscrowPerDenomInvariant() {
+ testCases := []struct {
+ name string
+ malleate func()
+ expPass bool
+ }{
+ {
+ "success",
+ func() {},
+ true,
+ },
+ {
+ "fails with broken invariant",
+ func() {
+ // set amount for denom higher than actual value in escrow
+ amount := math.NewInt(200)
+ suite.chainA.GetSimApp().TransferKeeper.SetTotalEscrowForDenom(suite.chainA.GetContext(), sdk.NewCoin(sdk.DefaultBondDenom, amount))
+ },
+ false,
+ },
+ }
+
+ for _, tc := range testCases {
+ tc := tc
+
+ suite.Run(tc.name, func() {
+ suite.SetupTest() // reset
+ path := NewTransferPath(suite.chainA, suite.chainB)
+ suite.coordinator.Setup(path)
+
+ amount := math.NewInt(100)
+
+ // send coins from chain A to chain B so that we have them in escrow
+ coin := sdk.NewCoin(sdk.DefaultBondDenom, amount)
+ msg := types.NewMsgTransfer(
+ path.EndpointA.ChannelConfig.PortID,
+ path.EndpointA.ChannelID,
+ coin,
+ suite.chainA.SenderAccount.GetAddress().String(),
+ suite.chainB.SenderAccount.GetAddress().String(),
+ suite.chainA.GetTimeoutHeight(), 0, "",
+ )
+
+ res, err := suite.chainA.SendMsgs(msg)
+ suite.Require().NoError(err)
+ suite.Require().NotNil(res)
+
+ tc.malleate()
+
+ out, broken := keeper.TotalEscrowPerDenomInvariants(&suite.chainA.GetSimApp().TransferKeeper)(suite.chainA.GetContext())
+
+ if tc.expPass {
+ suite.Require().False(broken)
+ suite.Require().Empty(out)
+ } else {
+ suite.Require().True(broken)
+ suite.Require().NotEmpty(out)
+ }
+ })
+ }
+}
diff --git a/modules/apps/transfer/keeper/keeper.go b/modules/apps/transfer/keeper/keeper.go
index 9b382966ef4..736bb11298a 100644
--- a/modules/apps/transfer/keeper/keeper.go
+++ b/modules/apps/transfer/keeper/keeper.go
@@ -1,14 +1,17 @@
package keeper
import (
+ "fmt"
+ "strings"
+
+ tmbytes "github.com/cometbft/cometbft/libs/bytes"
+ "github.com/cometbft/cometbft/libs/log"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/store/prefix"
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"
- tmbytes "github.com/tendermint/tendermint/libs/bytes"
- "github.com/tendermint/tendermint/libs/log"
"github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types"
@@ -93,7 +96,7 @@ func (k Keeper) SetPort(ctx sdk.Context, portID string) {
func (k Keeper) GetDenomTrace(ctx sdk.Context, denomTraceHash tmbytes.HexBytes) (types.DenomTrace, bool) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.DenomTraceKey)
bz := store.Get(denomTraceHash)
- if bz == nil {
+ if len(bz) == 0 {
return types.DenomTrace{}, false
}
@@ -133,7 +136,6 @@ func (k Keeper) IterateDenomTraces(ctx sdk.Context, cb func(denomTrace types.Den
defer sdk.LogDeferred(ctx.Logger(), func() error { return iterator.Close() })
for ; iterator.Valid(); iterator.Next() {
-
denomTrace := k.MustUnmarshalDenomTrace(iterator.Value())
if cb(denomTrace) {
break
@@ -141,6 +143,81 @@ func (k Keeper) IterateDenomTraces(ctx sdk.Context, cb func(denomTrace types.Den
}
}
+// GetTotalEscrowForDenom gets the total amount of source chain tokens that
+// are in escrow, keyed by the denomination.
+//
+// NOTE: if there is no value stored in state for the provided denom then a new Coin is returned for the denom with an initial value of zero.
+// This accommodates callers to simply call `Add()` on the returned Coin as an empty Coin literal (e.g. sdk.Coin{}) will trigger a panic due to the absence of a denom.
+func (k Keeper) GetTotalEscrowForDenom(ctx sdk.Context, denom string) sdk.Coin {
+ store := ctx.KVStore(k.storeKey)
+ bz := store.Get(types.TotalEscrowForDenomKey(denom))
+ if len(bz) == 0 {
+ return sdk.NewCoin(denom, sdk.ZeroInt())
+ }
+
+ amount := sdk.IntProto{}
+ k.cdc.MustUnmarshal(bz, &amount)
+
+ return sdk.NewCoin(denom, amount.Int)
+}
+
+// SetTotalEscrowForDenom stores the total amount of source chain tokens that are in escrow.
+// Amount is stored in state if and only if it is not equal to zero. The function will panic
+// if the amount is negative.
+func (k Keeper) SetTotalEscrowForDenom(ctx sdk.Context, coin sdk.Coin) {
+ if coin.Amount.IsNegative() {
+ panic(fmt.Sprintf("amount cannot be negative: %s", coin.Amount))
+ }
+
+ store := ctx.KVStore(k.storeKey)
+ key := types.TotalEscrowForDenomKey(coin.Denom)
+
+ if coin.Amount.IsZero() {
+ store.Delete(key) // delete the key since Cosmos SDK x/bank module will prune any non-zero balances
+ return
+ }
+
+ bz := k.cdc.MustMarshal(&sdk.IntProto{Int: coin.Amount})
+ store.Set(key, bz)
+}
+
+// GetAllTotalEscrowed returns the escrow information for all the denominations.
+func (k Keeper) GetAllTotalEscrowed(ctx sdk.Context) sdk.Coins {
+ var escrows sdk.Coins
+ k.IterateTokensInEscrow(ctx, []byte(types.KeyTotalEscrowPrefix), func(denomEscrow sdk.Coin) bool {
+ escrows = escrows.Add(denomEscrow)
+ return false
+ })
+
+ return escrows
+}
+
+// IterateTokensInEscrow iterates over the denomination escrows in the store
+// and performs a callback function. Denominations for which an invalid value
+// (i.e. not integer) is stored, will be skipped.
+func (k Keeper) IterateTokensInEscrow(ctx sdk.Context, prefix []byte, cb func(denomEscrow sdk.Coin) bool) {
+ store := ctx.KVStore(k.storeKey)
+ iterator := sdk.KVStorePrefixIterator(store, prefix)
+
+ defer sdk.LogDeferred(ctx.Logger(), func() error { return iterator.Close() })
+ for ; iterator.Valid(); iterator.Next() {
+ denom := strings.TrimPrefix(string(iterator.Key()), fmt.Sprintf("%s/", types.KeyTotalEscrowPrefix))
+ if strings.TrimSpace(denom) == "" {
+ continue // denom is empty
+ }
+
+ amount := sdk.IntProto{}
+ if err := k.cdc.Unmarshal(iterator.Value(), &amount); err != nil {
+ continue // total escrow amount cannot be unmarshalled to integer
+ }
+
+ denomEscrow := sdk.NewCoin(denom, amount.Int)
+ if cb(denomEscrow) {
+ break
+ }
+ }
+}
+
// AuthenticateCapability wraps the scopedKeeper's AuthenticateCapability function
func (k Keeper) AuthenticateCapability(ctx sdk.Context, cap *capabilitytypes.Capability, name string) bool {
return k.scopedKeeper.AuthenticateCapability(ctx, cap, name)
diff --git a/modules/apps/transfer/keeper/keeper_test.go b/modules/apps/transfer/keeper/keeper_test.go
index 6e56dbbd4bc..f0a746108cc 100644
--- a/modules/apps/transfer/keeper/keeper_test.go
+++ b/modules/apps/transfer/keeper/keeper_test.go
@@ -1,9 +1,14 @@
package keeper_test
import (
+ "fmt"
"testing"
+ "cosmossdk.io/math"
"github.com/cosmos/cosmos-sdk/baseapp"
+ "github.com/cosmos/cosmos-sdk/codec"
+ storetypes "github.com/cosmos/cosmos-sdk/store/types"
+ sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/stretchr/testify/suite"
"github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
@@ -47,3 +52,180 @@ func NewTransferPath(chainA, chainB *ibctesting.TestChain) *ibctesting.Path {
func TestKeeperTestSuite(t *testing.T) {
suite.Run(t, new(KeeperTestSuite))
}
+
+func (suite *KeeperTestSuite) TestSetGetTotalEscrowForDenom() {
+ const denom = "atom"
+ var expAmount math.Int
+
+ testCases := []struct {
+ name string
+ malleate func()
+ expPass bool
+ }{
+ {
+ "success: with non-zero escrow amount",
+ func() {},
+ true,
+ },
+ {
+ "success: with escrow amount > 2^63",
+ func() {
+ expAmount, _ = math.NewIntFromString("100000000000000000000")
+ },
+ true,
+ },
+ {
+ "success: escrow amount 0 is not stored",
+ func() {
+ expAmount = math.ZeroInt()
+ },
+ true,
+ },
+ {
+ "failure: setter panics with negative escrow amount",
+ func() {
+ expAmount = math.NewInt(-1)
+ },
+ false,
+ },
+ }
+
+ for _, tc := range testCases {
+ tc := tc
+
+ suite.Run(tc.name, func() {
+ suite.SetupTest() // reset
+ expAmount = math.NewInt(100)
+ ctx := suite.chainA.GetContext()
+
+ tc.malleate()
+
+ if tc.expPass {
+ suite.chainA.GetSimApp().TransferKeeper.SetTotalEscrowForDenom(ctx, sdk.NewCoin(denom, expAmount))
+ total := suite.chainA.GetSimApp().TransferKeeper.GetTotalEscrowForDenom(ctx, denom)
+ suite.Require().Equal(expAmount, total.Amount)
+
+ storeKey := suite.chainA.GetSimApp().GetKey(types.ModuleName)
+ store := ctx.KVStore(storeKey)
+ key := types.TotalEscrowForDenomKey(denom)
+ if expAmount.IsZero() {
+ suite.Require().False(store.Has(key))
+ } else {
+ suite.Require().True(store.Has(key))
+ }
+ } else {
+ suite.Require().PanicsWithError("negative coin amount: -1", func() {
+ suite.chainA.GetSimApp().TransferKeeper.SetTotalEscrowForDenom(ctx, sdk.NewCoin(denom, expAmount))
+ })
+ total := suite.chainA.GetSimApp().TransferKeeper.GetTotalEscrowForDenom(ctx, denom)
+ suite.Require().Equal(math.ZeroInt(), total.Amount)
+ }
+ })
+ }
+}
+
+func (suite *KeeperTestSuite) TestGetAllDenomEscrows() {
+ var (
+ store storetypes.KVStore
+ cdc codec.Codec
+ expDenomEscrows sdk.Coins
+ )
+
+ testCases := []struct {
+ name string
+ malleate func()
+ expPass bool
+ }{
+ {
+ "success",
+ func() {
+ denom := "uatom"
+ amount := math.NewInt(100)
+ expDenomEscrows = append(expDenomEscrows, sdk.NewCoin(denom, amount))
+
+ bz := cdc.MustMarshal(&sdk.IntProto{Int: amount})
+ store.Set(types.TotalEscrowForDenomKey(denom), bz)
+ },
+ true,
+ },
+ {
+ "success: multiple denoms",
+ func() {
+ denom := "uatom"
+ amount := math.NewInt(100)
+ expDenomEscrows = append(expDenomEscrows, sdk.NewCoin(denom, amount))
+
+ bz := cdc.MustMarshal(&sdk.IntProto{Int: amount})
+ store.Set(types.TotalEscrowForDenomKey(denom), bz)
+
+ denom = "bar/foo"
+ amount = math.NewInt(50)
+ expDenomEscrows = append(expDenomEscrows, sdk.NewCoin(denom, amount))
+
+ bz = cdc.MustMarshal(&sdk.IntProto{Int: amount})
+ store.Set(types.TotalEscrowForDenomKey(denom), bz)
+ },
+ true,
+ },
+ {
+ "success: denom with non-alphanumeric characters",
+ func() {
+ denom := "ibc/123-456"
+ amount := math.NewInt(100)
+ expDenomEscrows = append(expDenomEscrows, sdk.NewCoin(denom, amount))
+
+ bz := cdc.MustMarshal(&sdk.IntProto{Int: amount})
+ store.Set(types.TotalEscrowForDenomKey(denom), bz)
+ },
+ true,
+ },
+ {
+ "failure: empty denom",
+ func() {
+ denom := ""
+ amount := math.ZeroInt()
+
+ bz := cdc.MustMarshal(&sdk.IntProto{Int: amount})
+ store.Set(types.TotalEscrowForDenomKey(denom), bz)
+ },
+ false,
+ },
+ {
+ "failure: wrong prefix key",
+ func() {
+ denom := "uatom"
+ amount := math.ZeroInt()
+
+ bz := cdc.MustMarshal(&sdk.IntProto{Int: amount})
+ store.Set([]byte(fmt.Sprintf("wrong-prefix/%s", denom)), bz)
+ },
+ false,
+ },
+ }
+
+ for _, tc := range testCases {
+ tc := tc
+
+ suite.Run(tc.name, func() {
+ suite.SetupTest() // reset
+
+ expDenomEscrows = sdk.Coins{}
+ ctx := suite.chainA.GetContext()
+
+ storeKey := suite.chainA.GetSimApp().GetKey(types.ModuleName)
+ store = ctx.KVStore(storeKey)
+ cdc = suite.chainA.App.AppCodec()
+
+ tc.malleate()
+
+ denomEscrows := suite.chainA.GetSimApp().TransferKeeper.GetAllTotalEscrowed(ctx)
+
+ if tc.expPass {
+ suite.Require().Len(expDenomEscrows, len(denomEscrows))
+ suite.Require().ElementsMatch(expDenomEscrows, denomEscrows)
+ } else {
+ suite.Require().Empty(denomEscrows)
+ }
+ })
+ }
+}
diff --git a/modules/apps/transfer/keeper/mbt_relay_test.go b/modules/apps/transfer/keeper/mbt_relay_test.go
index 2a8f2f84132..e6c95b182c6 100644
--- a/modules/apps/transfer/keeper/mbt_relay_test.go
+++ b/modules/apps/transfer/keeper/mbt_relay_test.go
@@ -12,9 +12,9 @@ import (
"strings"
"cosmossdk.io/math"
+ "github.com/cometbft/cometbft/crypto"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
- "github.com/tendermint/tendermint/crypto"
"github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
diff --git a/modules/apps/transfer/keeper/migrations.go b/modules/apps/transfer/keeper/migrations.go
index c0399a2ad34..7927f76a2b0 100644
--- a/modules/apps/transfer/keeper/migrations.go
+++ b/modules/apps/transfer/keeper/migrations.go
@@ -53,6 +53,28 @@ func (m Migrator) MigrateTraces(ctx sdk.Context) error {
return nil
}
+// MigrateTotalEscrowForDenom migrates the total amount of source chain tokens in escrow.
+func (m Migrator) MigrateTotalEscrowForDenom(ctx sdk.Context) error {
+ var totalEscrowed sdk.Coins
+ portID := m.keeper.GetPort(ctx)
+
+ transferChannels := m.keeper.channelKeeper.GetAllChannelsWithPortPrefix(ctx, portID)
+ for _, channel := range transferChannels {
+ escrowAddress := types.GetEscrowAddress(portID, channel.ChannelId)
+ escrowBalances := m.keeper.bankKeeper.GetAllBalances(ctx, escrowAddress)
+
+ totalEscrowed = totalEscrowed.Add(escrowBalances...)
+ }
+
+ for _, totalEscrow := range totalEscrowed {
+ m.keeper.SetTotalEscrowForDenom(ctx, totalEscrow)
+ }
+
+ logger := m.keeper.Logger(ctx)
+ logger.Info("successfully set total escrow for %d denominations", totalEscrowed.Len())
+ return nil
+}
+
func equalTraces(dtA, dtB types.DenomTrace) bool {
return dtA.BaseDenom == dtB.BaseDenom && dtA.Path == dtB.Path
}
diff --git a/modules/apps/transfer/keeper/migrations_test.go b/modules/apps/transfer/keeper/migrations_test.go
index ac0097e617a..5faca42989d 100644
--- a/modules/apps/transfer/keeper/migrations_test.go
+++ b/modules/apps/transfer/keeper/migrations_test.go
@@ -3,8 +3,13 @@ package keeper_test
import (
"fmt"
+ "cosmossdk.io/math"
+ sdk "github.com/cosmos/cosmos-sdk/types"
+ banktestutil "github.com/cosmos/cosmos-sdk/x/bank/testutil"
+
transferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper"
transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
+ ibctesting "github.com/cosmos/ibc-go/v7/testing"
)
func (suite *KeeperTestSuite) TestMigratorMigrateTraces() {
@@ -119,3 +124,80 @@ func (suite *KeeperTestSuite) TestMigratorMigrateTracesCorruptionDetection() {
migrator.MigrateTraces(suite.chainA.GetContext()) //nolint:errcheck // we shouldn't check the error here because we want to ensure that a panic occurs.
})
}
+
+func (suite *KeeperTestSuite) TestMigrateTotalEscrowForDenom() {
+ var (
+ path *ibctesting.Path
+ denom string
+ )
+
+ testCases := []struct {
+ msg string
+ malleate func()
+ expectedEscrowAmt math.Int
+ }{
+ {
+ "success: one native denom escrowed in one channel",
+ func() {
+ denom = sdk.DefaultBondDenom
+ escrowAddress := transfertypes.GetEscrowAddress(path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID)
+ coin := sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100))
+
+ // funds the escrow account to have balance
+ suite.Require().NoError(banktestutil.FundAccount(suite.chainA.GetSimApp().BankKeeper, suite.chainA.GetContext(), escrowAddress, sdk.NewCoins(coin)))
+ },
+ math.NewInt(100),
+ },
+ {
+ "success: one native denom escrowed in two channels",
+ func() {
+ denom = sdk.DefaultBondDenom
+ extraPath := NewTransferPath(suite.chainA, suite.chainB)
+ suite.coordinator.Setup(extraPath)
+
+ escrowAddress1 := transfertypes.GetEscrowAddress(path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID)
+ escrowAddress2 := transfertypes.GetEscrowAddress(extraPath.EndpointA.ChannelConfig.PortID, extraPath.EndpointA.ChannelID)
+ coin1 := sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100))
+ coin2 := sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100))
+
+ // funds the escrow accounts to have balance
+ suite.Require().NoError(banktestutil.FundAccount(suite.chainA.GetSimApp().BankKeeper, suite.chainA.GetContext(), escrowAddress1, sdk.NewCoins(coin1)))
+ suite.Require().NoError(banktestutil.FundAccount(suite.chainA.GetSimApp().BankKeeper, suite.chainA.GetContext(), escrowAddress2, sdk.NewCoins(coin2)))
+ },
+ math.NewInt(200),
+ },
+ {
+ "success: valid ibc denom escrowed in one channel",
+ func() {
+ escrowAddress := transfertypes.GetEscrowAddress(path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID)
+ trace := transfertypes.ParseDenomTrace(transfertypes.GetPrefixedDenom(path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, sdk.DefaultBondDenom))
+ coin := sdk.NewCoin(trace.IBCDenom(), sdk.NewInt(100))
+ denom = trace.IBCDenom()
+
+ suite.chainA.GetSimApp().TransferKeeper.SetDenomTrace(suite.chainA.GetContext(), trace)
+
+ // funds the escrow account to have balance
+ suite.Require().NoError(banktestutil.FundAccount(suite.chainA.GetSimApp().BankKeeper, suite.chainA.GetContext(), escrowAddress, sdk.NewCoins(coin)))
+ },
+ sdk.NewInt(100),
+ },
+ }
+
+ for _, tc := range testCases {
+ suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
+ suite.SetupTest() // reset
+
+ path = NewTransferPath(suite.chainA, suite.chainB)
+ suite.coordinator.Setup(path)
+
+ tc.malleate() // explicitly fund escrow account
+
+ migrator := transferkeeper.NewMigrator(suite.chainA.GetSimApp().TransferKeeper)
+ suite.Require().NoError(migrator.MigrateTotalEscrowForDenom(suite.chainA.GetContext()))
+
+ // check that the migration set the expected amount for both native and IBC tokens
+ amount := suite.chainA.GetSimApp().TransferKeeper.GetTotalEscrowForDenom(suite.chainA.GetContext(), denom)
+ suite.Require().Equal(tc.expectedEscrowAmt, amount.Amount)
+ })
+ }
+}
diff --git a/modules/apps/transfer/keeper/relay.go b/modules/apps/transfer/keeper/relay.go
index c464b5dbbbd..29ea46a6b57 100644
--- a/modules/apps/transfer/keeper/relay.go
+++ b/modules/apps/transfer/keeper/relay.go
@@ -100,15 +100,12 @@ func (k Keeper) sendTransfer(
if types.SenderChainIsSource(sourcePort, sourceChannel, fullDenomPath) {
labels = append(labels, telemetry.NewLabel(coretypes.LabelSource, "true"))
- // create the escrow address for the tokens
+ // obtain the escrow address for the source channel end
escrowAddress := types.GetEscrowAddress(sourcePort, sourceChannel)
-
- // escrow source tokens. It fails if balance insufficient.
- if err := k.bankKeeper.SendCoins(
- ctx, sender, escrowAddress, sdk.NewCoins(token),
- ); err != nil {
+ if err := k.escrowToken(ctx, sender, escrowAddress, token); err != nil {
return 0, err
}
+
} else {
labels = append(labels, telemetry.NewLabel(coretypes.LabelSource, "false"))
@@ -196,7 +193,6 @@ func (k Keeper) OnRecvPacket(ctx sdk.Context, packet channeltypes.Packet, data t
// NOTE: We use SourcePort and SourceChannel here, because the counterparty
// chain would have prefixed with DestPort and DestChannel when originally
// receiving this coin as seen in the "sender chain is the source" condition.
-
if types.ReceiverChainIsSource(packet.GetSourcePort(), packet.GetSourceChannel(), data.Denom) {
// sender chain is not the source, unescrow tokens
@@ -210,7 +206,7 @@ func (k Keeper) OnRecvPacket(ctx sdk.Context, packet channeltypes.Packet, data t
// The denomination used to send the coins is either the native denom or the hash of the path
// if the denomination is not native.
denomTrace := types.ParseDenomTrace(unprefixedDenom)
- if denomTrace.Path != "" {
+ if !denomTrace.IsNativeDenom() {
denom = denomTrace.IBCDenom()
}
token := sdk.NewCoin(denom, transferAmount)
@@ -219,14 +215,9 @@ func (k Keeper) OnRecvPacket(ctx sdk.Context, packet channeltypes.Packet, data t
return sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "%s is not allowed to receive funds", receiver)
}
- // unescrow tokens
escrowAddress := types.GetEscrowAddress(packet.GetDestPort(), packet.GetDestChannel())
- if err := k.bankKeeper.SendCoins(ctx, escrowAddress, receiver, sdk.NewCoins(token)); err != nil {
- // NOTE: this error is only expected to occur given an unexpected bug or a malicious
- // counterparty module. The bug may occur in bank or any part of the code that allows
- // the escrow address to be drained. A malicious counterparty module could drain the
- // escrow address by allowing more tokens to be sent back then were escrowed.
- return sdkerrors.Wrap(err, "unable to unescrow tokens, this may be caused by a malicious counterparty module or a bug: please open an issue on counterparty module")
+ if err := k.unescrowToken(ctx, escrowAddress, receiver, token); err != nil {
+ return err
}
defer func() {
@@ -357,15 +348,7 @@ func (k Keeper) refundPacketToken(ctx sdk.Context, packet channeltypes.Packet, d
if types.SenderChainIsSource(packet.GetSourcePort(), packet.GetSourceChannel(), data.Denom) {
// unescrow tokens back to sender
escrowAddress := types.GetEscrowAddress(packet.GetSourcePort(), packet.GetSourceChannel())
- if err := k.bankKeeper.SendCoins(ctx, escrowAddress, sender, sdk.NewCoins(token)); err != nil {
- // NOTE: this error is only expected to occur given an unexpected bug or a malicious
- // counterparty module. The bug may occur in bank or any part of the code that allows
- // the escrow address to be drained. A malicious counterparty module could drain the
- // escrow address by allowing more tokens to be sent back then were escrowed.
- return sdkerrors.Wrap(err, "unable to unescrow tokens, this may be caused by a malicious counterparty module or a bug: please open an issue on counterparty module")
- }
-
- return nil
+ return k.unescrowToken(ctx, escrowAddress, sender, token)
}
// mint vouchers back to sender
@@ -382,6 +365,41 @@ func (k Keeper) refundPacketToken(ctx sdk.Context, packet channeltypes.Packet, d
return nil
}
+// escrowToken will send the given token from the provided sender to the escrow address. It will also
+// update the total escrowed amount by adding the escrowed token to the current total escrow.
+func (k Keeper) escrowToken(ctx sdk.Context, sender, escrowAddress sdk.AccAddress, token sdk.Coin) error {
+ if err := k.bankKeeper.SendCoins(ctx, sender, escrowAddress, sdk.NewCoins(token)); err != nil {
+ // failure is expected for insufficient balances
+ return err
+ }
+
+ // track the total amount in escrow keyed by denomination to allow for efficient iteration
+ currentTotalEscrow := k.GetTotalEscrowForDenom(ctx, token.GetDenom())
+ newTotalEscrow := currentTotalEscrow.Add(token)
+ k.SetTotalEscrowForDenom(ctx, newTotalEscrow)
+
+ return nil
+}
+
+// unescrowToken will send the given token from the escrow address to the provided receiver. It will also
+// update the total escrow by deducting the unescrowed token from the current total escrow.
+func (k Keeper) unescrowToken(ctx sdk.Context, escrowAddress, receiver sdk.AccAddress, token sdk.Coin) error {
+ if err := k.bankKeeper.SendCoins(ctx, escrowAddress, receiver, sdk.NewCoins(token)); err != nil {
+ // NOTE: this error is only expected to occur given an unexpected bug or a malicious
+ // counterparty module. The bug may occur in bank or any part of the code that allows
+ // the escrow address to be drained. A malicious counterparty module could drain the
+ // escrow address by allowing more tokens to be sent back then were escrowed.
+ return sdkerrors.Wrap(err, "unable to unescrow tokens, this may be caused by a malicious counterparty module or a bug: please open an issue on counterparty module")
+ }
+
+ // track the total amount in escrow keyed by denomination to allow for efficient iteration
+ currentTotalEscrow := k.GetTotalEscrowForDenom(ctx, token.GetDenom())
+ newTotalEscrow := currentTotalEscrow.Sub(token)
+ k.SetTotalEscrowForDenom(ctx, newTotalEscrow)
+
+ return nil
+}
+
// DenomPathFromHash returns the full denomination path prefix from an ibc denom with a hash
// component.
func (k Keeper) DenomPathFromHash(ctx sdk.Context, denom string) (string, error) {
diff --git a/modules/apps/transfer/keeper/relay_test.go b/modules/apps/transfer/keeper/relay_test.go
index a09a73037b1..e5eeb9a8ef6 100644
--- a/modules/apps/transfer/keeper/relay_test.go
+++ b/modules/apps/transfer/keeper/relay_test.go
@@ -17,11 +17,12 @@ import (
// chainA and coin that orignate on chainB
func (suite *KeeperTestSuite) TestSendTransfer() {
var (
- coin sdk.Coin
- path *ibctesting.Path
- sender sdk.AccAddress
- timeoutHeight clienttypes.Height
- memo string
+ coin sdk.Coin
+ path *ibctesting.Path
+ sender sdk.AccAddress
+ timeoutHeight clienttypes.Height
+ memo string
+ expEscrowAmount math.Int // total amount in escrow for denom on receiving chain
)
testCases := []struct {
@@ -31,17 +32,19 @@ func (suite *KeeperTestSuite) TestSendTransfer() {
}{
{
"successful transfer with native token",
- func() {}, true,
+ func() {
+ expEscrowAmount = math.NewInt(100)
+ }, true,
},
{
"successful transfer from source chain with memo",
func() {
memo = "memo" //nolint:goconst
+ expEscrowAmount = math.NewInt(100)
}, true,
},
{
"successful transfer with IBC token",
-
func() {
// send IBC token back to chainB
coin = types.GetTransferCoin(path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, coin.Denom, coin.Amount)
@@ -99,6 +102,7 @@ func (suite *KeeperTestSuite) TestSendTransfer() {
"SendPacket fails, timeout height and timeout timestamp are zero",
func() {
timeoutHeight = clienttypes.ZeroHeight()
+ expEscrowAmount = math.NewInt(100)
}, false,
},
}
@@ -114,6 +118,7 @@ func (suite *KeeperTestSuite) TestSendTransfer() {
sender = suite.chainA.SenderAccount.GetAddress()
memo = ""
timeoutHeight = suite.chainB.GetTimeoutHeight()
+ expEscrowAmount = math.ZeroInt()
// create IBC token on chainA
transferMsg := types.NewMsgTransfer(path.EndpointB.ChannelConfig.PortID, path.EndpointB.ChannelID, coin, suite.chainB.SenderAccount.GetAddress().String(), suite.chainA.SenderAccount.GetAddress().String(), suite.chainA.GetTimeoutHeight(), 0, "")
@@ -138,6 +143,10 @@ func (suite *KeeperTestSuite) TestSendTransfer() {
res, err := suite.chainA.GetSimApp().TransferKeeper.Transfer(sdk.WrapSDKContext(suite.chainA.GetContext()), msg)
+ // check total amount in escrow of sent token denom on sending chain
+ amount := suite.chainA.GetSimApp().TransferKeeper.GetTotalEscrowForDenom(suite.chainA.GetContext(), coin.GetDenom())
+ suite.Require().Equal(expEscrowAmount, amount.Amount)
+
if tc.expPass {
suite.Require().NoError(err)
suite.Require().NotNil(res)
@@ -149,16 +158,95 @@ func (suite *KeeperTestSuite) TestSendTransfer() {
}
}
+func (suite *KeeperTestSuite) TestSendTransferSetsTotalEscrowAmountForSourceIBCToken() {
+ /*
+ Given the following flow of tokens:
+
+ chain A (channel 0) -> (channel-0) chain B (channel-1) -> (channel-1) chain A
+ stake transfer/channel-0/stake transfer/channel-1/transfer/channel-0/stake
+ ^
+ |
+ SendTransfer
+
+ This test will transfer vouchers of denom "transfer/channel-0/stake" from chain B
+ to chain A over channel-1 to assert that total escrow amount is stored on chain B
+ for vouchers of denom "transfer/channel-0/stake" because chain B acts as source
+ in this case.
+
+ Set up:
+ - Two transfer channels between chain A and chain B (channel-0 and channel-1).
+ - Tokens of native denom "stake" on chain A transferred to chain B over channel-0
+ and vouchers minted with denom trace "tranfer/channel-0/stake".
+
+ Execute:
+ - Transfer vouchers of denom trace "tranfer/channel-0/stake" from chain B to chain A
+ over channel-1.
+
+ Assert:
+ - The vouchers are not of a native denom (because they are of an IBC denom), but chain B
+ is the source, then the value for total escrow amount should still be stored for the IBC
+ denom that corresponds to the trace "tranfer/channel-0/stake".
+ */
+
+ // set up
+ // 2 transfer channels between chain A and chain B
+ path1 := NewTransferPath(suite.chainA, suite.chainB)
+ suite.coordinator.Setup(path1)
+
+ path2 := NewTransferPath(suite.chainA, suite.chainB)
+ suite.coordinator.Setup(path2)
+
+ // create IBC token on chain B with denom trace "transfer/channel-0/stake"
+ coin := sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100))
+ transferMsg := types.NewMsgTransfer(
+ path1.EndpointA.ChannelConfig.PortID,
+ path1.EndpointA.ChannelID,
+ coin,
+ suite.chainA.SenderAccount.GetAddress().String(),
+ suite.chainB.SenderAccount.GetAddress().String(),
+ suite.chainB.GetTimeoutHeight(), 0, "",
+ )
+ result, err := suite.chainA.SendMsgs(transferMsg)
+ suite.Require().NoError(err) // message committed
+
+ packet, err := ibctesting.ParsePacketFromEvents(result.GetEvents())
+ suite.Require().NoError(err)
+
+ err = path1.RelayPacket(packet)
+ suite.Require().NoError(err)
+
+ // execute
+ trace := types.ParseDenomTrace(types.GetPrefixedDenom(path1.EndpointB.ChannelConfig.PortID, path1.EndpointB.ChannelID, sdk.DefaultBondDenom))
+ coin = sdk.NewCoin(trace.IBCDenom(), sdk.NewInt(100))
+ msg := types.NewMsgTransfer(
+ path2.EndpointB.ChannelConfig.PortID,
+ path2.EndpointB.ChannelID,
+ coin,
+ suite.chainB.SenderAccount.GetAddress().String(),
+ suite.chainA.SenderAccount.GetAddress().String(),
+ suite.chainA.GetTimeoutHeight(), 0, "",
+ )
+
+ res, err := suite.chainB.GetSimApp().TransferKeeper.Transfer(sdk.WrapSDKContext(suite.chainB.GetContext()), msg)
+ suite.Require().NoError(err)
+ suite.Require().NotNil(res)
+
+ // check total amount in escrow of sent token on sending chain
+ totalEscrow := suite.chainB.GetSimApp().TransferKeeper.GetTotalEscrowForDenom(suite.chainB.GetContext(), coin.GetDenom())
+ suite.Require().Equal(math.NewInt(100), totalEscrow.Amount)
+}
+
// test receiving coin on chainB with coin that orignate on chainA and
-// coin that orignated on chainB (source). The bulk of the testing occurs
+// coin that originated on chainB (source). The bulk of the testing occurs
// in the test case for loop since setup is intensive for all cases. The
// malleate function allows for testing invalid cases.
func (suite *KeeperTestSuite) TestOnRecvPacket() {
var (
- trace types.DenomTrace
- amount math.Int
- receiver string
- memo string
+ trace types.DenomTrace
+ amount math.Int
+ receiver string
+ memo string
+ expEscrowAmount math.Int // total amount in escrow for denom on receiving chain
)
testCases := []struct {
@@ -167,42 +255,83 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() {
recvIsSource bool // the receiving chain is the source of the coin originally
expPass bool
}{
- {"success receive on source chain", func() {}, true, true},
- {"success receive on source chain with memo", func() {
- memo = "memo"
- }, true, true},
- {"success receive with coin from another chain as source", func() {}, false, true},
- {"success receive with coin from another chain as source with memo", func() {
- memo = "memo"
- }, false, true},
- {"empty coin", func() {
- trace = types.DenomTrace{}
- amount = sdk.ZeroInt()
- }, true, false},
- {"invalid receiver address", func() {
- receiver = "gaia1scqhwpgsmr6vmztaa7suurfl52my6nd2kmrudl"
- }, true, false},
+ {
+ "success receive on source chain",
+ func() {}, true, true,
+ },
+ {
+ "success receive on source chain of half the amount",
+ func() {
+ amount = math.NewInt(50)
+ expEscrowAmount = math.NewInt(50)
+ }, true, true,
+ },
+ {
+ "success receive on source chain with memo",
+ func() {
+ memo = "memo"
+ }, true, true,
+ },
+ {
+ "success receive with coin from another chain as source",
+ func() {}, false, true,
+ },
+ {
+ "success receive with coin from another chain as source with memo",
+ func() {
+ memo = "memo"
+ }, false, true,
+ },
+ {
+ "empty coin",
+ func() {
+ trace = types.DenomTrace{}
+ amount = sdk.ZeroInt()
+ expEscrowAmount = math.NewInt(100)
+ }, true, false,
+ },
+ {
+ "invalid receiver address",
+ func() {
+ receiver = "gaia1scqhwpgsmr6vmztaa7suurfl52my6nd2kmrudl"
+ expEscrowAmount = math.NewInt(100)
+ }, true, false,
+ },
// onRecvPacket
// - coin from chain chainA
- {"failure: mint zero coin", func() {
- amount = sdk.ZeroInt()
- }, false, false},
+ {
+ "failure: mint zero coin",
+ func() {
+ amount = sdk.ZeroInt()
+ }, false, false,
+ },
// - coin being sent back to original chain (chainB)
- {"tries to unescrow more tokens than allowed", func() {
- amount = sdk.NewInt(1000000)
- }, true, false},
+ {
+ "tries to unescrow more tokens than allowed",
+ func() {
+ amount = sdk.NewInt(1000000)
+ expEscrowAmount = math.NewInt(100)
+ }, true, false,
+ },
// - coin being sent to module address on chainA
- {"failure: receive on module account", func() {
- receiver = suite.chainA.GetSimApp().AccountKeeper.GetModuleAddress(types.ModuleName).String()
- }, false, false},
+ {
+ "failure: receive on module account",
+ func() {
+ receiver = suite.chainA.GetSimApp().AccountKeeper.GetModuleAddress(types.ModuleName).String()
+ }, false, false,
+ },
// - coin being sent back to original chain (chainB) to module address
- {"failure: receive on module account on source chain", func() {
- receiver = suite.chainB.GetSimApp().AccountKeeper.GetModuleAddress(types.ModuleName).String()
- }, true, false},
+ {
+ "failure: receive on module account on source chain",
+ func() {
+ receiver = suite.chainB.GetSimApp().AccountKeeper.GetModuleAddress(types.ModuleName).String()
+ expEscrowAmount = math.NewInt(100)
+ }, true, false,
+ },
}
for _, tc := range testCases {
@@ -215,8 +344,9 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() {
suite.coordinator.Setup(path)
receiver = suite.chainB.SenderAccount.GetAddress().String() // must be explicitly changed in malleate
- memo = "" // can be explicitly changed in malleate
- amount = sdk.NewInt(100) // must be explicitly changed in malleate
+ memo = "" // can be explicitly changed in malleate
+ amount = sdk.NewInt(100) // must be explicitly changed in malleate
+ expEscrowAmount = math.ZeroInt() // total amount in escrow of voucher denom on receiving chain
seq := uint64(1)
if tc.recvIsSource {
@@ -241,7 +371,8 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() {
}
// send coin from chainA to chainB
- transferMsg := types.NewMsgTransfer(path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, sdk.NewCoin(trace.IBCDenom(), amount), suite.chainA.SenderAccount.GetAddress().String(), receiver, clienttypes.NewHeight(1, 110), 0, memo)
+ coin := sdk.NewCoin(trace.IBCDenom(), amount)
+ transferMsg := types.NewMsgTransfer(path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, coin, suite.chainA.SenderAccount.GetAddress().String(), receiver, clienttypes.NewHeight(1, 110), 0, memo)
_, err := suite.chainA.SendMsgs(transferMsg)
suite.Require().NoError(err) // message committed
@@ -252,6 +383,19 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() {
err = suite.chainB.GetSimApp().TransferKeeper.OnRecvPacket(suite.chainB.GetContext(), packet, data)
+ // check total amount in escrow of received token denom on receiving chain
+ var (
+ denom string
+ totalEscrow sdk.Coin
+ )
+ if tc.recvIsSource {
+ denom = sdk.DefaultBondDenom
+ } else {
+ denom = trace.IBCDenom()
+ }
+ totalEscrow = suite.chainB.GetSimApp().TransferKeeper.GetTotalEscrowForDenom(suite.chainB.GetContext(), denom)
+ suite.Require().Equal(expEscrowAmount, totalEscrow.Amount)
+
if tc.expPass {
suite.Require().NoError(err)
} else {
@@ -261,17 +405,111 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() {
}
}
+func (suite *KeeperTestSuite) TestOnRecvPacketSetsTotalEscrowAmountForSourceIBCToken() {
+ /*
+ Given the following flow of tokens:
+
+ chain A (channel 0) -> (channel-0) chain B (channel-1) -> (channel-1) chain A (channel-1) -> (channel-1) chain B
+ stake transfer/channel-0/stake transfer/channel-1/transfer/channel-0/stake transfer/channel-0/stake
+ ^
+ |
+ OnRecvPacket
+
+ This test will assert that on receiving vouchers of denom "transfer/channel-0/stake"
+ on chain B the total escrow amount is updated on because chain B acted as source
+ when vouchers were transferred to chain A over channel-1.
+
+ Setup:
+ - Two transfer channels between chain A and chain B.
+ - Vouchers of denom trace "transfer/channel-0/stake" on chain B are in escrow
+ account for port ID transfer and channel ID channel-1.
+
+ Execute:
+ - Receive vouchers of denom trace "transfer/channel-0/stake" from chain A to chain B
+ over channel-1.
+
+ Assert:
+ - The vouchers are not of a native denom (because they are of an IBC denom), but chain B
+ is the source, then the value for total escrow amount should still be updated for the IBC
+ denom that corresponds to the trace "tranfer/channel-0/stake" when the vouchers are
+ received back on chain B.
+ */
+
+ seq := uint64(1)
+ amount := math.NewInt(100)
+ timeout := suite.chainA.GetTimeoutHeight()
+
+ // setup
+ // 2 transfer channels between chain A and chain B
+ path1 := NewTransferPath(suite.chainA, suite.chainB)
+ suite.coordinator.Setup(path1)
+
+ path2 := NewTransferPath(suite.chainA, suite.chainB)
+ suite.coordinator.Setup(path2)
+
+ // denomTrace path: {transfer/channel-1/transfer/channel-0}
+ denomTrace := types.DenomTrace{
+ BaseDenom: sdk.DefaultBondDenom,
+ Path: fmt.Sprintf("%s/%s/%s/%s", path2.EndpointA.ChannelConfig.PortID, path2.EndpointA.ChannelID, path1.EndpointB.ChannelConfig.PortID, path1.EndpointB.ChannelID),
+ }
+ data := types.NewFungibleTokenPacketData(
+ denomTrace.GetFullDenomPath(),
+ amount.String(),
+ suite.chainA.SenderAccount.GetAddress().String(),
+ suite.chainB.SenderAccount.GetAddress().String(), "",
+ )
+ packet := channeltypes.NewPacket(
+ data.GetBytes(),
+ seq,
+ path2.EndpointA.ChannelConfig.PortID,
+ path2.EndpointA.ChannelID,
+ path2.EndpointB.ChannelConfig.PortID,
+ path2.EndpointB.ChannelID,
+ timeout, 0,
+ )
+
+ // fund escrow account for transfer and channel-1 on chain B
+ // denomTrace path: transfer/channel-0
+ denomTrace = types.DenomTrace{
+ BaseDenom: sdk.DefaultBondDenom,
+ Path: fmt.Sprintf("%s/%s", path1.EndpointB.ChannelConfig.PortID, path1.EndpointB.ChannelID),
+ }
+ escrowAddress := types.GetEscrowAddress(path2.EndpointB.ChannelConfig.PortID, path2.EndpointB.ChannelID)
+ coin := sdk.NewCoin(denomTrace.IBCDenom(), amount)
+ suite.Require().NoError(
+ banktestutil.FundAccount(
+ suite.chainB.GetSimApp().BankKeeper,
+ suite.chainB.GetContext(),
+ escrowAddress,
+ sdk.NewCoins(coin),
+ ),
+ )
+
+ suite.chainB.GetSimApp().TransferKeeper.SetTotalEscrowForDenom(suite.chainB.GetContext(), coin)
+ totalEscrowChainB := suite.chainB.GetSimApp().TransferKeeper.GetTotalEscrowForDenom(suite.chainB.GetContext(), coin.GetDenom())
+ suite.Require().Equal(math.NewInt(100), totalEscrowChainB.Amount)
+
+ // execute onRecvPacket, when chaninB receives the source token the escrow amount should decrease
+ err := suite.chainB.GetSimApp().TransferKeeper.OnRecvPacket(suite.chainB.GetContext(), packet, data)
+ suite.Require().NoError(err)
+
+ // check total amount in escrow of sent token on reveiving chain
+ totalEscrowChainB = suite.chainB.GetSimApp().TransferKeeper.GetTotalEscrowForDenom(suite.chainB.GetContext(), coin.GetDenom())
+ suite.Require().Equal(math.ZeroInt(), totalEscrowChainB.Amount)
+}
+
// TestOnAcknowledgementPacket tests that successful acknowledgement is a no-op
// and failure acknowledment leads to refund when attempting to send from chainA
-// to chainB. If sender is source than the denomination being refunded has no
-// trace.
+// to chainB. If sender is source then the denomination being refunded has no
+// trace
func (suite *KeeperTestSuite) TestOnAcknowledgementPacket() {
var (
- successAck = channeltypes.NewResultAcknowledgement([]byte{byte(1)})
- failedAck = channeltypes.NewErrorAcknowledgement(fmt.Errorf("failed packet transfer"))
- trace types.DenomTrace
- amount math.Int
- path *ibctesting.Path
+ successAck = channeltypes.NewResultAcknowledgement([]byte{byte(1)})
+ failedAck = channeltypes.NewErrorAcknowledgement(fmt.Errorf("failed packet transfer"))
+ trace types.DenomTrace
+ amount math.Int
+ path *ibctesting.Path
+ expEscrowAmount math.Int
)
testCases := []struct {
@@ -281,24 +519,41 @@ func (suite *KeeperTestSuite) TestOnAcknowledgementPacket() {
success bool // success of ack
expPass bool
}{
- {"success ack causes no-op", successAck, func() {
- trace = types.ParseDenomTrace(types.GetPrefixedDenom(path.EndpointB.ChannelConfig.PortID, path.EndpointB.ChannelID, sdk.DefaultBondDenom))
- }, true, true},
- {"successful refund from source chain", failedAck, func() {
- escrow := types.GetEscrowAddress(path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID)
- trace = types.ParseDenomTrace(sdk.DefaultBondDenom)
- coin := sdk.NewCoin(sdk.DefaultBondDenom, amount)
-
- suite.Require().NoError(banktestutil.FundAccount(suite.chainA.GetSimApp().BankKeeper, suite.chainA.GetContext(), escrow, sdk.NewCoins(coin)))
- }, false, true},
{
- "unsuccessful refund from source", failedAck,
+ "success ack causes no-op",
+ successAck,
+ func() {
+ trace = types.ParseDenomTrace(types.GetPrefixedDenom(path.EndpointB.ChannelConfig.PortID, path.EndpointB.ChannelID, sdk.DefaultBondDenom))
+ }, true, true,
+ },
+ {
+ "successful refund from source chain",
+ failedAck,
func() {
+ escrow := types.GetEscrowAddress(path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID)
trace = types.ParseDenomTrace(sdk.DefaultBondDenom)
+ coin := sdk.NewCoin(sdk.DefaultBondDenom, amount)
+
+ suite.Require().NoError(banktestutil.FundAccount(suite.chainA.GetSimApp().BankKeeper, suite.chainA.GetContext(), escrow, sdk.NewCoins(coin)))
+
+ // set escrow amount that would have been stored after successful execution of MsgTransfer
+ suite.chainA.GetSimApp().TransferKeeper.SetTotalEscrowForDenom(suite.chainA.GetContext(), sdk.NewCoin(sdk.DefaultBondDenom, amount))
+ }, false, true,
+ },
+ {
+ "unsuccessful refund from source",
+ failedAck,
+ func() {
+ trace = types.ParseDenomTrace(sdk.DefaultBondDenom)
+
+ // set escrow amount that would have been stored after successful execution of MsgTransfer
+ suite.chainA.GetSimApp().TransferKeeper.SetTotalEscrowForDenom(suite.chainA.GetContext(), sdk.NewCoin(sdk.DefaultBondDenom, amount))
+ expEscrowAmount = math.NewInt(100)
}, false, false,
},
{
- "successful refund from with coin from external chain", failedAck,
+ "successful refund with coin from external chain",
+ failedAck,
func() {
escrow := types.GetEscrowAddress(path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID)
trace = types.ParseDenomTrace(types.GetPrefixedDenom(path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, sdk.DefaultBondDenom))
@@ -317,15 +572,20 @@ func (suite *KeeperTestSuite) TestOnAcknowledgementPacket() {
path = NewTransferPath(suite.chainA, suite.chainB)
suite.coordinator.Setup(path)
amount = sdk.NewInt(100) // must be explicitly changed
+ expEscrowAmount = math.ZeroInt()
tc.malleate()
data := types.NewFungibleTokenPacketData(trace.GetFullDenomPath(), amount.String(), suite.chainA.SenderAccount.GetAddress().String(), suite.chainB.SenderAccount.GetAddress().String(), "")
packet := channeltypes.NewPacket(data.GetBytes(), 1, path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, path.EndpointB.ChannelConfig.PortID, path.EndpointB.ChannelID, clienttypes.NewHeight(1, 100), 0)
-
preCoin := suite.chainA.GetSimApp().BankKeeper.GetBalance(suite.chainA.GetContext(), suite.chainA.SenderAccount.GetAddress(), trace.IBCDenom())
err := suite.chainA.GetSimApp().TransferKeeper.OnAcknowledgementPacket(suite.chainA.GetContext(), packet, data, tc.ack)
+
+ // check total amount in escrow of sent token denom on sending chain
+ totalEscrow := suite.chainA.GetSimApp().TransferKeeper.GetTotalEscrowForDenom(suite.chainA.GetContext(), trace.IBCDenom())
+ suite.Require().Equal(expEscrowAmount, totalEscrow.Amount)
+
if tc.expPass {
suite.Require().NoError(err)
postCoin := suite.chainA.GetSimApp().BankKeeper.GetBalance(suite.chainA.GetContext(), suite.chainA.SenderAccount.GetAddress(), trace.IBCDenom())
@@ -336,7 +596,6 @@ func (suite *KeeperTestSuite) TestOnAcknowledgementPacket() {
} else {
suite.Require().Equal(amount, deltaAmount, "failed ack did not trigger refund")
}
-
} else {
suite.Require().Error(err)
}
@@ -344,16 +603,103 @@ func (suite *KeeperTestSuite) TestOnAcknowledgementPacket() {
}
}
+func (suite *KeeperTestSuite) TestOnAcknowledgementPacketSetsTotalEscrowAmountForSourceIBCToken() {
+ /*
+ This test is testing the following scenario. Given tokens travelling like this:
+
+ chain A (channel 0) -> (channel-0) chain B (channel-1) -> (channel-1) chain A (channel-1)
+ stake transfer/channel-0/stake transfer/channel-1/transfer/channel-0/stake
+ ^
+ |
+ OnAcknowledgePacket
+
+ We want to assert that on failed acknowledgment of vouchers sent with denom trace
+ "transfer/channel-0/stake" on chain B the total escrow amount is updated.
+
+ Set up:
+ - Two transfer channels between chain A and chain B.
+ - Vouckers of denom "transfer/channel-0/stake" on chain B are in escrow
+ account for port ID transfer and channel ID channel-1.
+
+ Execute:
+ - Acknowledge vouchers of denom trace "tranfer/channel-0/stake" sent from chain B
+ to chain B over channel-1.
+
+ Assert:
+ - The vouchers are not of a native denom (because they are of an IBC denom), but chain B
+ is the source, then the value for total escrow amount should still be updated for the IBC
+ denom that corresponds to the trace "tranfer/channel-0/stake" when processing the failed
+ acknowledgement.
+ */
+
+ seq := uint64(1)
+ amount := math.NewInt(100)
+ ack := channeltypes.NewErrorAcknowledgement(fmt.Errorf("failed packet transfer"))
+
+ // set up
+ // 2 transfer channels between chain A and chain B
+ path1 := NewTransferPath(suite.chainA, suite.chainB)
+ suite.coordinator.Setup(path1)
+
+ path2 := NewTransferPath(suite.chainA, suite.chainB)
+ suite.coordinator.Setup(path2)
+
+ // fund escrow account for transfer and channel-1 on chain B
+ // denomTrace path = transfer/channel-0
+ denomTrace := types.DenomTrace{
+ BaseDenom: sdk.DefaultBondDenom,
+ Path: fmt.Sprintf("%s/%s", path1.EndpointB.ChannelConfig.PortID, path1.EndpointB.ChannelID),
+ }
+ escrowAddress := types.GetEscrowAddress(path2.EndpointB.ChannelConfig.PortID, path2.EndpointB.ChannelID)
+ coin := sdk.NewCoin(denomTrace.IBCDenom(), amount)
+ suite.Require().NoError(
+ banktestutil.FundAccount(
+ suite.chainB.GetSimApp().BankKeeper,
+ suite.chainB.GetContext(),
+ escrowAddress,
+ sdk.NewCoins(coin),
+ ),
+ )
+
+ data := types.NewFungibleTokenPacketData(
+ denomTrace.GetFullDenomPath(),
+ amount.String(),
+ suite.chainB.SenderAccount.GetAddress().String(),
+ suite.chainA.SenderAccount.GetAddress().String(), "",
+ )
+ packet := channeltypes.NewPacket(
+ data.GetBytes(),
+ seq,
+ path2.EndpointB.ChannelConfig.PortID,
+ path2.EndpointB.ChannelID,
+ path2.EndpointA.ChannelConfig.PortID,
+ path2.EndpointA.ChannelID,
+ suite.chainA.GetTimeoutHeight(), 0,
+ )
+
+ suite.chainB.GetSimApp().TransferKeeper.SetTotalEscrowForDenom(suite.chainB.GetContext(), coin)
+ totalEscrowChainB := suite.chainB.GetSimApp().TransferKeeper.GetTotalEscrowForDenom(suite.chainB.GetContext(), coin.GetDenom())
+ suite.Require().Equal(math.NewInt(100), totalEscrowChainB.Amount)
+
+ err := suite.chainB.GetSimApp().TransferKeeper.OnAcknowledgementPacket(suite.chainB.GetContext(), packet, data, ack)
+ suite.Require().NoError(err)
+
+ // check total amount in escrow of sent token on sending chain
+ totalEscrowChainB = suite.chainB.GetSimApp().TransferKeeper.GetTotalEscrowForDenom(suite.chainB.GetContext(), coin.GetDenom())
+ suite.Require().Equal(math.ZeroInt(), totalEscrowChainB.Amount)
+}
+
// TestOnTimeoutPacket test private refundPacket function since it is a simple
// wrapper over it. The actual timeout does not matter since IBC core logic
// is not being tested. The test is timing out a send from chainA to chainB
// so the refunds are occurring on chainA.
func (suite *KeeperTestSuite) TestOnTimeoutPacket() {
var (
- trace types.DenomTrace
- path *ibctesting.Path
- amount math.Int
- sender string
+ trace types.DenomTrace
+ path *ibctesting.Path
+ amount math.Int
+ sender string
+ expEscrowAmount math.Int
)
testCases := []struct {
@@ -367,8 +713,12 @@ func (suite *KeeperTestSuite) TestOnTimeoutPacket() {
escrow := types.GetEscrowAddress(path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID)
trace = types.ParseDenomTrace(sdk.DefaultBondDenom)
coin := sdk.NewCoin(trace.IBCDenom(), amount)
+ expEscrowAmount = math.ZeroInt()
+ // funds the escrow account to have balance
suite.Require().NoError(banktestutil.FundAccount(suite.chainA.GetSimApp().BankKeeper, suite.chainA.GetContext(), escrow, sdk.NewCoins(coin)))
+ // set escrow amount that would have been stored after successful execution of MsgTransfer
+ suite.chainA.GetSimApp().TransferKeeper.SetTotalEscrowForDenom(suite.chainA.GetContext(), coin)
}, true,
},
{
@@ -377,7 +727,9 @@ func (suite *KeeperTestSuite) TestOnTimeoutPacket() {
escrow := types.GetEscrowAddress(path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID)
trace = types.ParseDenomTrace(types.GetPrefixedDenom(path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, sdk.DefaultBondDenom))
coin := sdk.NewCoin(trace.IBCDenom(), amount)
+ expEscrowAmount = math.ZeroInt()
+ // funds the escrow account to have balance
suite.Require().NoError(banktestutil.FundAccount(suite.chainA.GetSimApp().BankKeeper, suite.chainA.GetContext(), escrow, sdk.NewCoins(coin)))
}, true,
},
@@ -385,12 +737,20 @@ func (suite *KeeperTestSuite) TestOnTimeoutPacket() {
"no balance for coin denom",
func() {
trace = types.ParseDenomTrace("bitcoin")
+ expEscrowAmount = amount
+
+ // set escrow amount that would have been stored after successful execution of MsgTransfer
+ suite.chainA.GetSimApp().TransferKeeper.SetTotalEscrowForDenom(suite.chainA.GetContext(), sdk.NewCoin(trace.IBCDenom(), amount))
}, false,
},
{
"unescrow failed",
func() {
trace = types.ParseDenomTrace(sdk.DefaultBondDenom)
+ expEscrowAmount = amount
+
+ // set escrow amount that would have been stored after successful execution of MsgTransfer
+ suite.chainA.GetSimApp().TransferKeeper.SetTotalEscrowForDenom(suite.chainA.GetContext(), sdk.NewCoin(trace.IBCDenom(), amount))
}, false,
},
{
@@ -413,12 +773,12 @@ func (suite *KeeperTestSuite) TestOnTimeoutPacket() {
suite.coordinator.Setup(path)
amount = sdk.NewInt(100) // must be explicitly changed
sender = suite.chainA.SenderAccount.GetAddress().String()
+ expEscrowAmount = math.ZeroInt()
tc.malleate()
data := types.NewFungibleTokenPacketData(trace.GetFullDenomPath(), amount.String(), sender, suite.chainB.SenderAccount.GetAddress().String(), "")
packet := channeltypes.NewPacket(data.GetBytes(), 1, path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, path.EndpointB.ChannelConfig.PortID, path.EndpointB.ChannelID, clienttypes.NewHeight(1, 100), 0)
-
preCoin := suite.chainA.GetSimApp().BankKeeper.GetBalance(suite.chainA.GetContext(), suite.chainA.SenderAccount.GetAddress(), trace.IBCDenom())
err := suite.chainA.GetSimApp().TransferKeeper.OnTimeoutPacket(suite.chainA.GetContext(), packet, data)
@@ -426,6 +786,10 @@ func (suite *KeeperTestSuite) TestOnTimeoutPacket() {
postCoin := suite.chainA.GetSimApp().BankKeeper.GetBalance(suite.chainA.GetContext(), suite.chainA.SenderAccount.GetAddress(), trace.IBCDenom())
deltaAmount := postCoin.Amount.Sub(preCoin.Amount)
+ // check total amount in escrow of sent token denom on sending chain
+ totalEscrow := suite.chainA.GetSimApp().TransferKeeper.GetTotalEscrowForDenom(suite.chainA.GetContext(), trace.IBCDenom())
+ suite.Require().Equal(expEscrowAmount, totalEscrow.Amount)
+
if tc.expPass {
suite.Require().NoError(err)
suite.Require().Equal(amount.Int64(), deltaAmount.Int64(), "successful timeout did not trigger refund")
@@ -435,3 +799,86 @@ func (suite *KeeperTestSuite) TestOnTimeoutPacket() {
})
}
}
+
+func (suite *KeeperTestSuite) TestOnTimeoutPacketSetsTotalEscrowAmountForSourceIBCToken() {
+ /*
+ Given the following flow of tokens:
+
+ chain A (channel 0) -> (channel-0) chain B (channel-1) -> (channel-1) chain A (channel-1)
+ stake transfer/channel-0/stake transfer/channel-1/transfer/channel-0/stake
+ ^
+ |
+ OnTimeoutPacket
+
+ We want to assert that on timeout of vouchers sent with denom trace
+ "transfer/channel-0/stake" on chain B the total escrow amount is updated.
+
+ Set up:
+ - Two transfer channels between chain A and chain B.
+ - Vouckers of denom "transfer/channel-0/stake" on chain B are in escrow
+ account for port ID transfer and channel ID channel-1.
+
+ Execute:
+ - Timeout vouchers of denom trace "tranfer/channel-0/stake" sent from chain B
+ to chain B over channel-1.
+
+ Assert:
+ - The vouchers are not of a native denom (because they are of an IBC denom), but chain B
+ is the source, then the value for total escrow amount should still be updated for the IBC
+ denom that corresponds to the trace "tranfer/channel-0/stake" when processing the timeout.
+ */
+
+ seq := uint64(1)
+ amount := math.NewInt(100)
+
+ // set up
+ // 2 transfer channels between chain A and chain B
+ path1 := NewTransferPath(suite.chainA, suite.chainB)
+ suite.coordinator.Setup(path1)
+
+ path2 := NewTransferPath(suite.chainA, suite.chainB)
+ suite.coordinator.Setup(path2)
+
+ // fund escrow account for transfer and channel-1 on chain B
+ denomTrace := types.DenomTrace{
+ BaseDenom: sdk.DefaultBondDenom,
+ Path: fmt.Sprintf("%s/%s", path1.EndpointB.ChannelConfig.PortID, path1.EndpointB.ChannelID),
+ }
+ escrowAddress := types.GetEscrowAddress(path2.EndpointB.ChannelConfig.PortID, path2.EndpointB.ChannelID)
+ coin := sdk.NewCoin(denomTrace.IBCDenom(), amount)
+ suite.Require().NoError(
+ banktestutil.FundAccount(
+ suite.chainB.GetSimApp().BankKeeper,
+ suite.chainB.GetContext(),
+ escrowAddress,
+ sdk.NewCoins(coin),
+ ),
+ )
+
+ data := types.NewFungibleTokenPacketData(
+ denomTrace.GetFullDenomPath(),
+ amount.String(),
+ suite.chainB.SenderAccount.GetAddress().String(),
+ suite.chainA.SenderAccount.GetAddress().String(), "",
+ )
+ packet := channeltypes.NewPacket(
+ data.GetBytes(),
+ seq,
+ path2.EndpointB.ChannelConfig.PortID,
+ path2.EndpointB.ChannelID,
+ path2.EndpointA.ChannelConfig.PortID,
+ path2.EndpointA.ChannelID,
+ suite.chainA.GetTimeoutHeight(), 0,
+ )
+
+ suite.chainB.GetSimApp().TransferKeeper.SetTotalEscrowForDenom(suite.chainB.GetContext(), coin)
+ totalEscrowChainB := suite.chainB.GetSimApp().TransferKeeper.GetTotalEscrowForDenom(suite.chainB.GetContext(), coin.GetDenom())
+ suite.Require().Equal(math.NewInt(100), totalEscrowChainB.Amount)
+
+ err := suite.chainB.GetSimApp().TransferKeeper.OnTimeoutPacket(suite.chainB.GetContext(), packet, data)
+ suite.Require().NoError(err)
+
+ // check total amount in escrow of sent token on sending chain
+ totalEscrowChainB = suite.chainB.GetSimApp().TransferKeeper.GetTotalEscrowForDenom(suite.chainB.GetContext(), coin.GetDenom())
+ suite.Require().Equal(math.ZeroInt(), totalEscrowChainB.Amount)
+}
diff --git a/modules/apps/transfer/module.go b/modules/apps/transfer/module.go
index 67c56515401..14dff25d91f 100644
--- a/modules/apps/transfer/module.go
+++ b/modules/apps/transfer/module.go
@@ -4,8 +4,8 @@ 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"
@@ -14,7 +14,6 @@ import (
simtypes "github.com/cosmos/cosmos-sdk/types/simulation"
"github.com/grpc-ecosystem/grpc-gateway/runtime"
"github.com/spf13/cobra"
- abci "github.com/tendermint/tendermint/abci/types"
"github.com/cosmos/ibc-go/v7/modules/apps/transfer/client/cli"
"github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper"
@@ -95,8 +94,8 @@ func NewAppModule(k keeper.Keeper) AppModule {
}
// RegisterInvariants implements the AppModule interface
-func (AppModule) RegisterInvariants(ir sdk.InvariantRegistry) {
- // TODO
+func (am AppModule) RegisterInvariants(ir sdk.InvariantRegistry) {
+ keeper.RegisterInvariants(ir, &am.keeper)
}
// RegisterServices registers module services.
@@ -108,6 +107,10 @@ func (am AppModule) RegisterServices(cfg module.Configurator) {
if err := cfg.RegisterMigration(types.ModuleName, 1, m.MigrateTraces); err != nil {
panic(fmt.Sprintf("failed to migrate transfer app from version 1 to 2: %v", err))
}
+
+ if err := cfg.RegisterMigration(types.ModuleName, 2, m.MigrateTotalEscrowForDenom); err != nil {
+ panic(fmt.Sprintf("failed to migrate transfer app from version 2 to 3: %v", err))
+ }
}
// InitGenesis performs genesis initialization for the ibc-transfer module. It returns
@@ -127,7 +130,7 @@ func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.Raw
}
// ConsensusVersion implements AppModule/ConsensusVersion.
-func (AppModule) ConsensusVersion() uint64 { return 2 }
+func (AppModule) ConsensusVersion() uint64 { return 3 }
// BeginBlock implements the AppModule interface
func (am AppModule) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) {
@@ -145,16 +148,6 @@ func (AppModule) GenerateGenesisState(simState *module.SimulationState) {
simulation.RandomizedGenState(simState)
}
-// ProposalContents doesn't return any content functions for governance proposals.
-func (AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalContent {
- return nil
-}
-
-// RandomizedParams creates randomized ibc-transfer param changes for the simulator.
-func (AppModule) RandomizedParams(r *rand.Rand) []simtypes.ParamChange {
- return simulation.ParamChanges(r)
-}
-
// RegisterStoreDecoder registers a decoder for transfer module's types
func (am AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) {
sdr[types.StoreKey] = simulation.NewDecodeStore(am.keeper)
diff --git a/modules/apps/transfer/simulation/params.go b/modules/apps/transfer/simulation/params.go
deleted file mode 100644
index 500bd3ece6a..00000000000
--- a/modules/apps/transfer/simulation/params.go
+++ /dev/null
@@ -1,31 +0,0 @@
-package simulation
-
-import (
- "fmt"
- "math/rand"
-
- simtypes "github.com/cosmos/cosmos-sdk/types/simulation"
- "github.com/cosmos/cosmos-sdk/x/simulation"
- gogotypes "github.com/cosmos/gogoproto/types"
-
- "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
-)
-
-// ParamChanges defines the parameters that can be modified by param change proposals
-// on the simulation
-func ParamChanges(r *rand.Rand) []simtypes.ParamChange {
- return []simtypes.ParamChange{
- simulation.NewSimParamChange(types.ModuleName, string(types.KeySendEnabled),
- func(r *rand.Rand) string {
- sendEnabled := RadomEnabled(r)
- return fmt.Sprintf("%s", types.ModuleCdc.MustMarshalJSON(&gogotypes.BoolValue{Value: sendEnabled})) //nolint:gosimple
- },
- ),
- simulation.NewSimParamChange(types.ModuleName, string(types.KeyReceiveEnabled),
- func(r *rand.Rand) string {
- receiveEnabled := RadomEnabled(r)
- return fmt.Sprintf("%s", types.ModuleCdc.MustMarshalJSON(&gogotypes.BoolValue{Value: receiveEnabled})) //nolint:gosimple
- },
- ),
- }
-}
diff --git a/modules/apps/transfer/simulation/params_test.go b/modules/apps/transfer/simulation/params_test.go
deleted file mode 100644
index d8582935234..00000000000
--- a/modules/apps/transfer/simulation/params_test.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package simulation_test
-
-import (
- "math/rand"
- "testing"
-
- "github.com/stretchr/testify/require"
-
- "github.com/cosmos/ibc-go/v7/modules/apps/transfer/simulation"
-)
-
-func TestParamChanges(t *testing.T) {
- s := rand.NewSource(1)
- r := rand.New(s)
-
- expected := []struct {
- composedKey string
- key string
- simValue string
- subspace string
- }{
- {"transfer/SendEnabled", "SendEnabled", "false", "transfer"},
- {"transfer/ReceiveEnabled", "ReceiveEnabled", "true", "transfer"},
- }
-
- paramChanges := simulation.ParamChanges(r)
-
- require.Len(t, paramChanges, 2)
-
- for i, p := range paramChanges {
- require.Equal(t, expected[i].composedKey, p.ComposedKey())
- require.Equal(t, expected[i].key, p.Key())
- require.Equal(t, expected[i].simValue, p.SimValue()(r), p.Key())
- require.Equal(t, expected[i].subspace, p.Subspace())
- }
-}
diff --git a/modules/apps/transfer/types/authz.pb.go b/modules/apps/transfer/types/authz.pb.go
new file mode 100644
index 00000000000..95f24eca332
--- /dev/null
+++ b/modules/apps/transfer/types/authz.pb.go
@@ -0,0 +1,695 @@
+// Code generated by protoc-gen-gogo. DO NOT EDIT.
+// source: ibc/applications/transfer/v1/authz.proto
+
+package types
+
+import (
+ fmt "fmt"
+ _ "github.com/cosmos/cosmos-proto"
+ github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types"
+ types "github.com/cosmos/cosmos-sdk/types"
+ _ "github.com/cosmos/gogoproto/gogoproto"
+ proto "github.com/cosmos/gogoproto/proto"
+ io "io"
+ math "math"
+ math_bits "math/bits"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
+
+// Allocation defines the spend limit for a particular port and channel
+type Allocation struct {
+ // the port on which the packet will be sent
+ SourcePort string `protobuf:"bytes,1,opt,name=source_port,json=sourcePort,proto3" json:"source_port,omitempty" yaml:"source_port"`
+ // the channel by which the packet will be sent
+ SourceChannel string `protobuf:"bytes,2,opt,name=source_channel,json=sourceChannel,proto3" json:"source_channel,omitempty" yaml:"source_channel"`
+ // spend limitation on the channel
+ SpendLimit github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,3,rep,name=spend_limit,json=spendLimit,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"spend_limit"`
+ // allow list of receivers, an empty allow list permits any receiver address
+ AllowList []string `protobuf:"bytes,4,rep,name=allow_list,json=allowList,proto3" json:"allow_list,omitempty"`
+}
+
+func (m *Allocation) Reset() { *m = Allocation{} }
+func (m *Allocation) String() string { return proto.CompactTextString(m) }
+func (*Allocation) ProtoMessage() {}
+func (*Allocation) Descriptor() ([]byte, []int) {
+ return fileDescriptor_b1a28b55d17325aa, []int{0}
+}
+func (m *Allocation) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *Allocation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_Allocation.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 *Allocation) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_Allocation.Merge(m, src)
+}
+func (m *Allocation) XXX_Size() int {
+ return m.Size()
+}
+func (m *Allocation) XXX_DiscardUnknown() {
+ xxx_messageInfo_Allocation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Allocation proto.InternalMessageInfo
+
+func (m *Allocation) GetSourcePort() string {
+ if m != nil {
+ return m.SourcePort
+ }
+ return ""
+}
+
+func (m *Allocation) GetSourceChannel() string {
+ if m != nil {
+ return m.SourceChannel
+ }
+ return ""
+}
+
+func (m *Allocation) GetSpendLimit() github_com_cosmos_cosmos_sdk_types.Coins {
+ if m != nil {
+ return m.SpendLimit
+ }
+ return nil
+}
+
+func (m *Allocation) GetAllowList() []string {
+ if m != nil {
+ return m.AllowList
+ }
+ return nil
+}
+
+// TransferAuthorization allows the grantee to spend up to spend_limit coins from
+// the granter's account for ibc transfer on a specific channel
+type TransferAuthorization struct {
+ // port and channel amounts
+ Allocations []Allocation `protobuf:"bytes,1,rep,name=allocations,proto3" json:"allocations"`
+}
+
+func (m *TransferAuthorization) Reset() { *m = TransferAuthorization{} }
+func (m *TransferAuthorization) String() string { return proto.CompactTextString(m) }
+func (*TransferAuthorization) ProtoMessage() {}
+func (*TransferAuthorization) Descriptor() ([]byte, []int) {
+ return fileDescriptor_b1a28b55d17325aa, []int{1}
+}
+func (m *TransferAuthorization) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *TransferAuthorization) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_TransferAuthorization.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 *TransferAuthorization) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_TransferAuthorization.Merge(m, src)
+}
+func (m *TransferAuthorization) XXX_Size() int {
+ return m.Size()
+}
+func (m *TransferAuthorization) XXX_DiscardUnknown() {
+ xxx_messageInfo_TransferAuthorization.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TransferAuthorization proto.InternalMessageInfo
+
+func (m *TransferAuthorization) GetAllocations() []Allocation {
+ if m != nil {
+ return m.Allocations
+ }
+ return nil
+}
+
+func init() {
+ proto.RegisterType((*Allocation)(nil), "ibc.applications.transfer.v1.Allocation")
+ proto.RegisterType((*TransferAuthorization)(nil), "ibc.applications.transfer.v1.TransferAuthorization")
+}
+
+func init() {
+ proto.RegisterFile("ibc/applications/transfer/v1/authz.proto", fileDescriptor_b1a28b55d17325aa)
+}
+
+var fileDescriptor_b1a28b55d17325aa = []byte{
+ // 435 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x52, 0x4d, 0x6e, 0xd3, 0x40,
+ 0x14, 0x8e, 0x9b, 0x0a, 0x29, 0x13, 0xc1, 0xc2, 0xa2, 0xc8, 0xa9, 0xc0, 0x89, 0xbc, 0x40, 0xde,
+ 0x64, 0x86, 0xc0, 0x22, 0x52, 0x57, 0x34, 0xdd, 0x76, 0x51, 0x2c, 0x56, 0x6c, 0xa2, 0xf1, 0x64,
+ 0xb0, 0x47, 0x8c, 0xfd, 0x2c, 0xcf, 0xd8, 0xa8, 0x3d, 0x05, 0x48, 0x9c, 0x82, 0x35, 0x87, 0xa8,
+ 0x58, 0x75, 0xc9, 0x2a, 0xa0, 0xe4, 0x06, 0x3d, 0x01, 0xf2, 0xcc, 0x14, 0x5c, 0x21, 0xb1, 0xb2,
+ 0xdf, 0xcf, 0xf7, 0xde, 0xf7, 0xbe, 0xf9, 0x50, 0x2c, 0x52, 0x46, 0x68, 0x55, 0x49, 0xc1, 0xa8,
+ 0x16, 0x50, 0x2a, 0xa2, 0x6b, 0x5a, 0xaa, 0xf7, 0xbc, 0x26, 0xed, 0x82, 0xd0, 0x46, 0xe7, 0x57,
+ 0xb8, 0xaa, 0x41, 0x83, 0xff, 0x54, 0xa4, 0x0c, 0xf7, 0x3b, 0xf1, 0x5d, 0x27, 0x6e, 0x17, 0xc7,
+ 0x13, 0x06, 0xaa, 0x00, 0xb5, 0x36, 0xbd, 0xc4, 0x06, 0x16, 0x78, 0xfc, 0x38, 0x83, 0x0c, 0x6c,
+ 0xbe, 0xfb, 0x73, 0xd9, 0xd0, 0xf6, 0x90, 0x94, 0x2a, 0x4e, 0xda, 0x45, 0xca, 0x35, 0x5d, 0x10,
+ 0x06, 0xa2, 0xb4, 0xf5, 0xe8, 0xcb, 0x01, 0x42, 0xa7, 0x52, 0x82, 0x5d, 0xe6, 0x2f, 0xd1, 0x58,
+ 0x41, 0x53, 0x33, 0xbe, 0xae, 0xa0, 0xd6, 0x81, 0x37, 0xf3, 0xe2, 0xd1, 0xea, 0xc9, 0xed, 0x76,
+ 0xea, 0x5f, 0xd2, 0x42, 0x9e, 0x44, 0xbd, 0x62, 0x94, 0x20, 0x1b, 0x5d, 0x40, 0xad, 0xfd, 0xd7,
+ 0xe8, 0x91, 0xab, 0xb1, 0x9c, 0x96, 0x25, 0x97, 0xc1, 0x81, 0xc1, 0x4e, 0x6e, 0xb7, 0xd3, 0xa3,
+ 0x7b, 0x58, 0x57, 0x8f, 0x92, 0x87, 0x36, 0x71, 0x66, 0x63, 0x5f, 0xa2, 0xb1, 0xaa, 0x78, 0xb9,
+ 0x59, 0x4b, 0x51, 0x08, 0x1d, 0x0c, 0x67, 0xc3, 0x78, 0xfc, 0x72, 0x82, 0xdd, 0x8d, 0x1d, 0x7f,
+ 0xec, 0xf8, 0xe3, 0x33, 0x10, 0xe5, 0xea, 0xc5, 0xf5, 0x76, 0x3a, 0xf8, 0xfa, 0x73, 0x1a, 0x67,
+ 0x42, 0xe7, 0x4d, 0x8a, 0x19, 0x14, 0x4e, 0x10, 0xf7, 0x99, 0xab, 0xcd, 0x07, 0xa2, 0x2f, 0x2b,
+ 0xae, 0x0c, 0x40, 0x25, 0xc8, 0xcc, 0x3f, 0xef, 0xc6, 0xfb, 0xcf, 0x10, 0xa2, 0x52, 0xc2, 0xc7,
+ 0xb5, 0x14, 0x4a, 0x07, 0x87, 0xb3, 0x61, 0x3c, 0x4a, 0x46, 0x26, 0x73, 0x2e, 0x94, 0x8e, 0x3e,
+ 0x7b, 0xe8, 0xe8, 0xad, 0xd3, 0xfd, 0xb4, 0xd1, 0x39, 0xd4, 0xe2, 0xca, 0x2a, 0x74, 0x81, 0xc6,
+ 0xf4, 0x8f, 0x5e, 0x2a, 0xf0, 0x0c, 0xcd, 0x18, 0xff, 0xef, 0xd5, 0xf0, 0x5f, 0x81, 0x57, 0x87,
+ 0x1d, 0xeb, 0xa4, 0x3f, 0xe2, 0xe4, 0xf9, 0xf7, 0x6f, 0xf3, 0xc8, 0x9d, 0x69, 0x9d, 0x70, 0x77,
+ 0xe7, 0xbd, 0xcd, 0xab, 0x37, 0xd7, 0xbb, 0xd0, 0xbb, 0xd9, 0x85, 0xde, 0xaf, 0x5d, 0xe8, 0x7d,
+ 0xda, 0x87, 0x83, 0x9b, 0x7d, 0x38, 0xf8, 0xb1, 0x0f, 0x07, 0xef, 0x96, 0xff, 0x4a, 0x20, 0x52,
+ 0x36, 0xcf, 0x80, 0xb4, 0x4b, 0x52, 0xc0, 0xa6, 0x91, 0x5c, 0x75, 0xee, 0xeb, 0xb9, 0xce, 0xe8,
+ 0x92, 0x3e, 0x30, 0x26, 0x78, 0xf5, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x61, 0xe8, 0x65, 0x9c, 0x9f,
+ 0x02, 0x00, 0x00,
+}
+
+func (m *Allocation) 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 *Allocation) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *Allocation) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if len(m.AllowList) > 0 {
+ for iNdEx := len(m.AllowList) - 1; iNdEx >= 0; iNdEx-- {
+ i -= len(m.AllowList[iNdEx])
+ copy(dAtA[i:], m.AllowList[iNdEx])
+ i = encodeVarintAuthz(dAtA, i, uint64(len(m.AllowList[iNdEx])))
+ i--
+ dAtA[i] = 0x22
+ }
+ }
+ if len(m.SpendLimit) > 0 {
+ for iNdEx := len(m.SpendLimit) - 1; iNdEx >= 0; iNdEx-- {
+ {
+ size, err := m.SpendLimit[iNdEx].MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintAuthz(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x1a
+ }
+ }
+ if len(m.SourceChannel) > 0 {
+ i -= len(m.SourceChannel)
+ copy(dAtA[i:], m.SourceChannel)
+ i = encodeVarintAuthz(dAtA, i, uint64(len(m.SourceChannel)))
+ i--
+ dAtA[i] = 0x12
+ }
+ if len(m.SourcePort) > 0 {
+ i -= len(m.SourcePort)
+ copy(dAtA[i:], m.SourcePort)
+ i = encodeVarintAuthz(dAtA, i, uint64(len(m.SourcePort)))
+ i--
+ dAtA[i] = 0xa
+ }
+ return len(dAtA) - i, nil
+}
+
+func (m *TransferAuthorization) 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 *TransferAuthorization) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *TransferAuthorization) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if len(m.Allocations) > 0 {
+ for iNdEx := len(m.Allocations) - 1; iNdEx >= 0; iNdEx-- {
+ {
+ size, err := m.Allocations[iNdEx].MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintAuthz(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0xa
+ }
+ }
+ return len(dAtA) - i, nil
+}
+
+func encodeVarintAuthz(dAtA []byte, offset int, v uint64) int {
+ offset -= sovAuthz(v)
+ base := offset
+ for v >= 1<<7 {
+ dAtA[offset] = uint8(v&0x7f | 0x80)
+ v >>= 7
+ offset++
+ }
+ dAtA[offset] = uint8(v)
+ return base
+}
+func (m *Allocation) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ l = len(m.SourcePort)
+ if l > 0 {
+ n += 1 + l + sovAuthz(uint64(l))
+ }
+ l = len(m.SourceChannel)
+ if l > 0 {
+ n += 1 + l + sovAuthz(uint64(l))
+ }
+ if len(m.SpendLimit) > 0 {
+ for _, e := range m.SpendLimit {
+ l = e.Size()
+ n += 1 + l + sovAuthz(uint64(l))
+ }
+ }
+ if len(m.AllowList) > 0 {
+ for _, s := range m.AllowList {
+ l = len(s)
+ n += 1 + l + sovAuthz(uint64(l))
+ }
+ }
+ return n
+}
+
+func (m *TransferAuthorization) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ if len(m.Allocations) > 0 {
+ for _, e := range m.Allocations {
+ l = e.Size()
+ n += 1 + l + sovAuthz(uint64(l))
+ }
+ }
+ return n
+}
+
+func sovAuthz(x uint64) (n int) {
+ return (math_bits.Len64(x|1) + 6) / 7
+}
+func sozAuthz(x uint64) (n int) {
+ return sovAuthz(uint64((x << 1) ^ uint64((int64(x) >> 63))))
+}
+func (m *Allocation) 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 ErrIntOverflowAuthz
+ }
+ 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: Allocation: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: Allocation: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field SourcePort", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowAuthz
+ }
+ 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 ErrInvalidLengthAuthz
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthAuthz
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.SourcePort = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field SourceChannel", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowAuthz
+ }
+ 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 ErrInvalidLengthAuthz
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthAuthz
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.SourceChannel = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 3:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field SpendLimit", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowAuthz
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthAuthz
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthAuthz
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.SpendLimit = append(m.SpendLimit, types.Coin{})
+ if err := m.SpendLimit[len(m.SpendLimit)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ case 4:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field AllowList", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowAuthz
+ }
+ 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 ErrInvalidLengthAuthz
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthAuthz
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.AllowList = append(m.AllowList, string(dAtA[iNdEx:postIndex]))
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipAuthz(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthAuthz
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *TransferAuthorization) 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 ErrIntOverflowAuthz
+ }
+ 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: TransferAuthorization: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: TransferAuthorization: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Allocations", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowAuthz
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthAuthz
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthAuthz
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Allocations = append(m.Allocations, Allocation{})
+ if err := m.Allocations[len(m.Allocations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipAuthz(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthAuthz
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func skipAuthz(dAtA []byte) (n int, err error) {
+ l := len(dAtA)
+ iNdEx := 0
+ depth := 0
+ for iNdEx < l {
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowAuthz
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ wireType := int(wire & 0x7)
+ switch wireType {
+ case 0:
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowAuthz
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ iNdEx++
+ if dAtA[iNdEx-1] < 0x80 {
+ break
+ }
+ }
+ case 1:
+ iNdEx += 8
+ case 2:
+ var length int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowAuthz
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ length |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if length < 0 {
+ return 0, ErrInvalidLengthAuthz
+ }
+ iNdEx += length
+ case 3:
+ depth++
+ case 4:
+ if depth == 0 {
+ return 0, ErrUnexpectedEndOfGroupAuthz
+ }
+ depth--
+ case 5:
+ iNdEx += 4
+ default:
+ return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
+ }
+ if iNdEx < 0 {
+ return 0, ErrInvalidLengthAuthz
+ }
+ if depth == 0 {
+ return iNdEx, nil
+ }
+ }
+ return 0, io.ErrUnexpectedEOF
+}
+
+var (
+ ErrInvalidLengthAuthz = fmt.Errorf("proto: negative length found during unmarshaling")
+ ErrIntOverflowAuthz = fmt.Errorf("proto: integer overflow")
+ ErrUnexpectedEndOfGroupAuthz = fmt.Errorf("proto: unexpected end of group")
+)
diff --git a/modules/apps/transfer/types/codec.go b/modules/apps/transfer/types/codec.go
index f1fcf135f50..92ed91ef58a 100644
--- a/modules/apps/transfer/types/codec.go
+++ b/modules/apps/transfer/types/codec.go
@@ -3,6 +3,7 @@ package types
import (
"bytes"
+ "github.com/cosmos/cosmos-sdk/x/authz"
"github.com/cosmos/gogoproto/jsonpb"
"github.com/cosmos/gogoproto/proto"
@@ -23,6 +24,11 @@ func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) {
func RegisterInterfaces(registry codectypes.InterfaceRegistry) {
registry.RegisterImplementations((*sdk.Msg)(nil), &MsgTransfer{})
+ registry.RegisterImplementations(
+ (*authz.Authorization)(nil),
+ &TransferAuthorization{},
+ )
+
msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc)
}
diff --git a/modules/apps/transfer/types/errors.go b/modules/apps/transfer/types/errors.go
index 0f0cb7c42a4..d4f85cf4fa7 100644
--- a/modules/apps/transfer/types/errors.go
+++ b/modules/apps/transfer/types/errors.go
@@ -14,4 +14,5 @@ var (
ErrSendDisabled = sdkerrors.Register(ModuleName, 7, "fungible token transfers from this chain are disabled")
ErrReceiveDisabled = sdkerrors.Register(ModuleName, 8, "fungible token transfers to this chain are disabled")
ErrMaxTransferChannels = sdkerrors.Register(ModuleName, 9, "max transfer channels")
+ ErrInvalidAuthorization = sdkerrors.Register(ModuleName, 10, "invalid transfer authorization")
)
diff --git a/modules/apps/transfer/types/expected_keepers.go b/modules/apps/transfer/types/expected_keepers.go
index 2d53fc58f8f..a4b3b715b9c 100644
--- a/modules/apps/transfer/types/expected_keepers.go
+++ b/modules/apps/transfer/types/expected_keepers.go
@@ -25,12 +25,15 @@ type BankKeeper interface {
SendCoinsFromAccountToModule(ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error
BlockedAddr(addr sdk.AccAddress) bool
IsSendEnabledCoin(ctx sdk.Context, coin sdk.Coin) bool
+ GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin
+ GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins
}
// ChannelKeeper defines the expected IBC channel keeper
type ChannelKeeper interface {
GetChannel(ctx sdk.Context, srcPort, srcChan string) (channel channeltypes.Channel, found bool)
GetNextSequenceSend(ctx sdk.Context, portID, channelID string) (uint64, bool)
+ GetAllChannelsWithPortPrefix(ctx sdk.Context, portPrefix string) []channeltypes.IdentifiedChannel
}
// ClientKeeper defines the expected IBC client keeper
diff --git a/modules/apps/transfer/types/genesis.go b/modules/apps/transfer/types/genesis.go
index 241a6cff005..f5f45386c3f 100644
--- a/modules/apps/transfer/types/genesis.go
+++ b/modules/apps/transfer/types/genesis.go
@@ -1,6 +1,8 @@
package types
import (
+ sdk "github.com/cosmos/cosmos-sdk/types"
+
host "github.com/cosmos/ibc-go/v7/modules/core/24-host"
)
@@ -16,9 +18,10 @@ func NewGenesisState(portID string, denomTraces Traces, params Params) *GenesisS
// DefaultGenesisState returns a GenesisState with "transfer" as the default PortID.
func DefaultGenesisState() *GenesisState {
return &GenesisState{
- PortId: PortID,
- DenomTraces: Traces{},
- Params: DefaultParams(),
+ PortId: PortID,
+ DenomTraces: Traces{},
+ Params: DefaultParams(),
+ TotalEscrowed: sdk.Coins{},
}
}
@@ -31,5 +34,8 @@ func (gs GenesisState) Validate() error {
if err := gs.DenomTraces.Validate(); err != nil {
return err
}
- return gs.Params.Validate()
+ if err := gs.Params.Validate(); err != nil {
+ return err
+ }
+ return gs.TotalEscrowed.Validate() // will fail if there are duplicates for any denom
}
diff --git a/modules/apps/transfer/types/genesis.pb.go b/modules/apps/transfer/types/genesis.pb.go
index d7cd38dd7a9..49dd1c43993 100644
--- a/modules/apps/transfer/types/genesis.pb.go
+++ b/modules/apps/transfer/types/genesis.pb.go
@@ -5,6 +5,8 @@ package types
import (
fmt "fmt"
+ github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types"
+ types "github.com/cosmos/cosmos-sdk/types"
_ "github.com/cosmos/gogoproto/gogoproto"
proto "github.com/cosmos/gogoproto/proto"
io "io"
@@ -28,6 +30,9 @@ type GenesisState struct {
PortId string `protobuf:"bytes,1,opt,name=port_id,json=portId,proto3" json:"port_id,omitempty" yaml:"port_id"`
DenomTraces Traces `protobuf:"bytes,2,rep,name=denom_traces,json=denomTraces,proto3,castrepeated=Traces" json:"denom_traces" yaml:"denom_traces"`
Params Params `protobuf:"bytes,3,opt,name=params,proto3" json:"params"`
+ // total_escrowed contains the total amount of tokens escrowed
+ // by the transfer module
+ TotalEscrowed github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,4,rep,name=total_escrowed,json=totalEscrowed,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"total_escrowed" yaml:"total_escrowed"`
}
func (m *GenesisState) Reset() { *m = GenesisState{} }
@@ -84,6 +89,13 @@ func (m *GenesisState) GetParams() Params {
return Params{}
}
+func (m *GenesisState) GetTotalEscrowed() github_com_cosmos_cosmos_sdk_types.Coins {
+ if m != nil {
+ return m.TotalEscrowed
+ }
+ return nil
+}
+
func init() {
proto.RegisterType((*GenesisState)(nil), "ibc.applications.transfer.v1.GenesisState")
}
@@ -93,28 +105,33 @@ func init() {
}
var fileDescriptor_a4f788affd5bea89 = []byte{
- // 324 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xc3, 0x30,
- 0x1c, 0xc6, 0x1b, 0x27, 0x15, 0xbb, 0xe1, 0xa1, 0x7a, 0x18, 0x43, 0xda, 0x51, 0x14, 0x8a, 0xc3,
- 0x84, 0xcd, 0xc3, 0xc0, 0x63, 0x11, 0xc4, 0x9b, 0x4e, 0x4f, 0x5e, 0x46, 0x9a, 0xc6, 0x1a, 0x58,
- 0x9b, 0x92, 0x7f, 0x36, 0xd8, 0x5b, 0xf8, 0x1c, 0x3e, 0xc9, 0x8e, 0x3b, 0x7a, 0x9a, 0xb2, 0xbd,
- 0xc1, 0x7c, 0x01, 0x49, 0x37, 0xc7, 0x4e, 0xbd, 0x7d, 0x24, 0xbf, 0xef, 0xfb, 0xfe, 0x7c, 0xce,
- 0x95, 0x88, 0x19, 0xa1, 0x45, 0x31, 0x12, 0x8c, 0x6a, 0x21, 0x73, 0x20, 0x5a, 0xd1, 0x1c, 0xde,
- 0xb8, 0x22, 0x93, 0x2e, 0x49, 0x79, 0xce, 0x41, 0x00, 0x2e, 0x94, 0xd4, 0xd2, 0x3d, 0x17, 0x31,
- 0xc3, 0xfb, 0x2c, 0xfe, 0x67, 0xf1, 0xa4, 0xdb, 0xea, 0x54, 0x26, 0xed, 0xc8, 0x32, 0xaa, 0x75,
- 0x96, 0xca, 0x54, 0x96, 0x92, 0x18, 0xb5, 0x79, 0x0d, 0x7e, 0x91, 0xd3, 0xb8, 0xdf, 0x54, 0x3e,
- 0x6b, 0xaa, 0xb9, 0xdb, 0x71, 0x8e, 0x0a, 0xa9, 0xf4, 0x50, 0x24, 0x4d, 0xd4, 0x46, 0xe1, 0x71,
- 0xe4, 0xae, 0x17, 0xfe, 0xc9, 0x94, 0x66, 0xa3, 0xdb, 0x60, 0xfb, 0x11, 0x0c, 0x6c, 0xa3, 0x1e,
- 0x12, 0x57, 0x39, 0x8d, 0x84, 0xe7, 0x32, 0x1b, 0x6a, 0x45, 0x19, 0x87, 0xe6, 0x41, 0xbb, 0x16,
- 0xd6, 0x7b, 0x21, 0xae, 0xba, 0x1a, 0xdf, 0x19, 0xc7, 0x8b, 0x31, 0x44, 0x97, 0xb3, 0x85, 0x6f,
- 0xad, 0x17, 0xfe, 0xe9, 0x26, 0x7f, 0x3f, 0x2b, 0xf8, 0xfc, 0xf6, 0xed, 0x92, 0x82, 0x41, 0x3d,
- 0xd9, 0x59, 0xc0, 0x8d, 0x1c, 0xbb, 0xa0, 0x8a, 0x66, 0xd0, 0xac, 0xb5, 0x51, 0x58, 0xef, 0x5d,
- 0x54, 0xb7, 0x3d, 0x96, 0x6c, 0x74, 0x68, 0x9a, 0x06, 0x5b, 0x67, 0xf4, 0x34, 0x5b, 0x7a, 0x68,
- 0xbe, 0xf4, 0xd0, 0xcf, 0xd2, 0x43, 0x1f, 0x2b, 0xcf, 0x9a, 0xaf, 0x3c, 0xeb, 0x6b, 0xe5, 0x59,
- 0xaf, 0xfd, 0x54, 0xe8, 0xf7, 0x71, 0x8c, 0x99, 0xcc, 0x08, 0x93, 0x90, 0x49, 0x20, 0x22, 0x66,
- 0xd7, 0xa9, 0x24, 0x93, 0x3e, 0xc9, 0x64, 0x32, 0x1e, 0x71, 0x30, 0x93, 0xef, 0x4d, 0xad, 0xa7,
- 0x05, 0x87, 0xd8, 0x2e, 0xf7, 0xbc, 0xf9, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xf6, 0x4d, 0x22, 0xc9,
- 0xde, 0x01, 0x00, 0x00,
+ // 411 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0x41, 0x6b, 0xd4, 0x40,
+ 0x14, 0xc7, 0x13, 0xb7, 0x44, 0xcc, 0xd6, 0x1e, 0xa2, 0x42, 0x2c, 0x92, 0x2c, 0x41, 0x21, 0x58,
+ 0x3a, 0x43, 0xea, 0xa1, 0xe0, 0x31, 0x2a, 0xd2, 0x9b, 0x46, 0x4f, 0x5e, 0x96, 0xc9, 0x64, 0x8c,
+ 0x83, 0x49, 0x5e, 0x98, 0x37, 0x8d, 0xf4, 0xe8, 0xd9, 0x8b, 0x9f, 0xc3, 0x4f, 0xd2, 0x63, 0x8f,
+ 0x9e, 0x56, 0xd9, 0xfd, 0x06, 0xfd, 0x04, 0x32, 0x93, 0x58, 0x56, 0x84, 0x3d, 0xe5, 0x91, 0xf9,
+ 0xff, 0xfe, 0xef, 0x3f, 0x6f, 0x9e, 0xff, 0x54, 0x96, 0x9c, 0xb2, 0xbe, 0x6f, 0x24, 0x67, 0x5a,
+ 0x42, 0x87, 0x54, 0x2b, 0xd6, 0xe1, 0x47, 0xa1, 0xe8, 0x90, 0xd1, 0x5a, 0x74, 0x02, 0x25, 0x92,
+ 0x5e, 0x81, 0x86, 0xe0, 0x91, 0x2c, 0x39, 0xd9, 0xd6, 0x92, 0xbf, 0x5a, 0x32, 0x64, 0x87, 0x47,
+ 0x3b, 0x9d, 0x6e, 0x94, 0xd6, 0xea, 0x30, 0xe2, 0x80, 0x2d, 0x20, 0x2d, 0x19, 0x0a, 0x3a, 0x64,
+ 0xa5, 0xd0, 0x2c, 0xa3, 0x1c, 0x64, 0x37, 0x9d, 0xdf, 0xaf, 0xa1, 0x06, 0x5b, 0x52, 0x53, 0x8d,
+ 0x7f, 0x93, 0xaf, 0x33, 0x7f, 0xff, 0xf5, 0x18, 0xe9, 0x9d, 0x66, 0x5a, 0x04, 0x47, 0xfe, 0xed,
+ 0x1e, 0x94, 0x5e, 0xca, 0x2a, 0x74, 0x17, 0x6e, 0x7a, 0x27, 0x0f, 0xae, 0x57, 0xf1, 0xc1, 0x05,
+ 0x6b, 0x9b, 0xe7, 0xc9, 0x74, 0x90, 0x14, 0x9e, 0xa9, 0xce, 0xaa, 0x40, 0xf9, 0xfb, 0x95, 0xe8,
+ 0xa0, 0x5d, 0x6a, 0xc5, 0xb8, 0xc0, 0xf0, 0xd6, 0x62, 0x96, 0xce, 0x4f, 0x52, 0xb2, 0xeb, 0x56,
+ 0xe4, 0xa5, 0x21, 0xde, 0x1b, 0x20, 0x7f, 0x72, 0xb9, 0x8a, 0x9d, 0xeb, 0x55, 0x7c, 0x6f, 0xf4,
+ 0xdf, 0xf6, 0x4a, 0x7e, 0xfc, 0x8a, 0x3d, 0xab, 0xc2, 0x62, 0x5e, 0xdd, 0x20, 0x18, 0xe4, 0xbe,
+ 0xd7, 0x33, 0xc5, 0x5a, 0x0c, 0x67, 0x0b, 0x37, 0x9d, 0x9f, 0x3c, 0xde, 0xdd, 0xed, 0x8d, 0xd5,
+ 0xe6, 0x7b, 0xa6, 0x53, 0x31, 0x91, 0xc1, 0x37, 0xd7, 0x3f, 0xd0, 0xa0, 0x59, 0xb3, 0x14, 0xc8,
+ 0x15, 0x7c, 0x11, 0x55, 0xb8, 0x67, 0xa3, 0x3f, 0x24, 0xe3, 0x14, 0x89, 0x99, 0x22, 0x99, 0xa6,
+ 0x48, 0x5e, 0x80, 0xec, 0xf2, 0xb3, 0x29, 0xeb, 0x83, 0x31, 0xeb, 0xbf, 0xb8, 0x49, 0x9b, 0xd6,
+ 0x52, 0x7f, 0x3a, 0x2f, 0x09, 0x87, 0x96, 0x4e, 0x6f, 0x31, 0x7e, 0x8e, 0xb1, 0xfa, 0x4c, 0xf5,
+ 0x45, 0x2f, 0xd0, 0x3a, 0x61, 0x71, 0xd7, 0xc2, 0xaf, 0x26, 0x36, 0x7f, 0x7b, 0xb9, 0x8e, 0xdc,
+ 0xab, 0x75, 0xe4, 0xfe, 0x5e, 0x47, 0xee, 0xf7, 0x4d, 0xe4, 0x5c, 0x6d, 0x22, 0xe7, 0xe7, 0x26,
+ 0x72, 0x3e, 0x9c, 0xfe, 0x6f, 0x29, 0x4b, 0x7e, 0x5c, 0x03, 0x1d, 0x4e, 0x69, 0x0b, 0xd5, 0x79,
+ 0x23, 0xd0, 0x2c, 0xc8, 0xd6, 0x62, 0xd8, 0x3e, 0xa5, 0x67, 0x5f, 0xf7, 0xd9, 0x9f, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0x45, 0x60, 0xfb, 0xc1, 0x8c, 0x02, 0x00, 0x00,
}
func (m *GenesisState) Marshal() (dAtA []byte, err error) {
@@ -137,6 +154,20 @@ func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
+ if len(m.TotalEscrowed) > 0 {
+ for iNdEx := len(m.TotalEscrowed) - 1; iNdEx >= 0; iNdEx-- {
+ {
+ size, err := m.TotalEscrowed[iNdEx].MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintGenesis(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x22
+ }
+ }
{
size, err := m.Params.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
@@ -200,6 +231,12 @@ func (m *GenesisState) Size() (n int) {
}
l = m.Params.Size()
n += 1 + l + sovGenesis(uint64(l))
+ if len(m.TotalEscrowed) > 0 {
+ for _, e := range m.TotalEscrowed {
+ l = e.Size()
+ n += 1 + l + sovGenesis(uint64(l))
+ }
+ }
return n
}
@@ -337,6 +374,40 @@ func (m *GenesisState) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
+ case 4:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field TotalEscrowed", 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.TotalEscrowed = append(m.TotalEscrowed, types.Coin{})
+ if err := m.TotalEscrowed[len(m.TotalEscrowed)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipGenesis(dAtA[iNdEx:])
diff --git a/modules/apps/transfer/types/keys.go b/modules/apps/transfer/types/keys.go
index c156af3fd88..ec4c76cf596 100644
--- a/modules/apps/transfer/types/keys.go
+++ b/modules/apps/transfer/types/keys.go
@@ -29,6 +29,8 @@ const (
// DenomPrefix is the prefix used for internal SDK coin representation.
DenomPrefix = "ibc"
+
+ KeyTotalEscrowPrefix = "totalEscrowForDenom"
)
var (
@@ -53,3 +55,9 @@ func GetEscrowAddress(portID, channelID string) sdk.AccAddress {
hash := sha256.Sum256(preImage)
return hash[:20]
}
+
+// TotalEscrowForDenomKey returns the store key of under which the total amout of
+// source chain tokens in escrow is stored.
+func TotalEscrowForDenomKey(denom string) []byte {
+ return []byte(fmt.Sprintf("%s/%s", KeyTotalEscrowPrefix, denom))
+}
diff --git a/modules/apps/transfer/types/msgs.go b/modules/apps/transfer/types/msgs.go
index d6c70fec93a..eaf0046b798 100644
--- a/modules/apps/transfer/types/msgs.go
+++ b/modules/apps/transfer/types/msgs.go
@@ -5,11 +5,22 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
+ legacytx "github.com/cosmos/cosmos-sdk/x/auth/migrations/legacytx"
clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
host "github.com/cosmos/ibc-go/v7/modules/core/24-host"
)
+// msg types
+const (
+ TypeMsgTransfer = "transfer"
+)
+
+var (
+ _ sdk.Msg = (*MsgTransfer)(nil)
+ _ legacytx.LegacyMsg = (*MsgTransfer)(nil)
+)
+
// NewMsgTransfer creates a new MsgTransfer instance
//
//nolint:interfacer
@@ -31,7 +42,12 @@ func NewMsgTransfer(
}
}
-// Route implements sdk.Msg
+// Type implements legacytx.LegacyMsg
+func (MsgTransfer) Type() string {
+ return TypeMsgTransfer
+}
+
+// Route implements legacytx.LegacyMsg
func (MsgTransfer) Route() string {
return RouterKey
}
@@ -64,7 +80,7 @@ func (msg MsgTransfer) ValidateBasic() error {
return ValidateIBCDenom(msg.Token.Denom)
}
-// GetSignBytes implements sdk.Msg.
+// GetSignBytes implements legacytx.LegacyMsg
func (msg MsgTransfer) GetSignBytes() []byte {
return sdk.MustSortJSON(AminoCdc.MustMarshalJSON(&msg))
}
diff --git a/modules/apps/transfer/types/query.pb.go b/modules/apps/transfer/types/query.pb.go
index 95734564362..b7a3904461e 100644
--- a/modules/apps/transfer/types/query.pb.go
+++ b/modules/apps/transfer/types/query.pb.go
@@ -6,6 +6,7 @@ package types
import (
context "context"
fmt "fmt"
+ types "github.com/cosmos/cosmos-sdk/types"
query "github.com/cosmos/cosmos-sdk/types/query"
_ "github.com/cosmos/gogoproto/gogoproto"
grpc1 "github.com/cosmos/gogoproto/grpc"
@@ -505,6 +506,96 @@ func (m *QueryEscrowAddressResponse) GetEscrowAddress() string {
return ""
}
+// QueryTotalEscrowForDenomRequest is the request type for TotalEscrowForDenom RPC method.
+type QueryTotalEscrowForDenomRequest struct {
+ Denom string `protobuf:"bytes,1,opt,name=denom,proto3" json:"denom,omitempty"`
+}
+
+func (m *QueryTotalEscrowForDenomRequest) Reset() { *m = QueryTotalEscrowForDenomRequest{} }
+func (m *QueryTotalEscrowForDenomRequest) String() string { return proto.CompactTextString(m) }
+func (*QueryTotalEscrowForDenomRequest) ProtoMessage() {}
+func (*QueryTotalEscrowForDenomRequest) Descriptor() ([]byte, []int) {
+ return fileDescriptor_a638e2800a01538c, []int{10}
+}
+func (m *QueryTotalEscrowForDenomRequest) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *QueryTotalEscrowForDenomRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_QueryTotalEscrowForDenomRequest.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 *QueryTotalEscrowForDenomRequest) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_QueryTotalEscrowForDenomRequest.Merge(m, src)
+}
+func (m *QueryTotalEscrowForDenomRequest) XXX_Size() int {
+ return m.Size()
+}
+func (m *QueryTotalEscrowForDenomRequest) XXX_DiscardUnknown() {
+ xxx_messageInfo_QueryTotalEscrowForDenomRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_QueryTotalEscrowForDenomRequest proto.InternalMessageInfo
+
+func (m *QueryTotalEscrowForDenomRequest) GetDenom() string {
+ if m != nil {
+ return m.Denom
+ }
+ return ""
+}
+
+// QueryTotalEscrowForDenomResponse is the response type for TotalEscrowForDenom RPC method.
+type QueryTotalEscrowForDenomResponse struct {
+ Amount types.Coin `protobuf:"bytes,1,opt,name=amount,proto3" json:"amount"`
+}
+
+func (m *QueryTotalEscrowForDenomResponse) Reset() { *m = QueryTotalEscrowForDenomResponse{} }
+func (m *QueryTotalEscrowForDenomResponse) String() string { return proto.CompactTextString(m) }
+func (*QueryTotalEscrowForDenomResponse) ProtoMessage() {}
+func (*QueryTotalEscrowForDenomResponse) Descriptor() ([]byte, []int) {
+ return fileDescriptor_a638e2800a01538c, []int{11}
+}
+func (m *QueryTotalEscrowForDenomResponse) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *QueryTotalEscrowForDenomResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_QueryTotalEscrowForDenomResponse.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 *QueryTotalEscrowForDenomResponse) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_QueryTotalEscrowForDenomResponse.Merge(m, src)
+}
+func (m *QueryTotalEscrowForDenomResponse) XXX_Size() int {
+ return m.Size()
+}
+func (m *QueryTotalEscrowForDenomResponse) XXX_DiscardUnknown() {
+ xxx_messageInfo_QueryTotalEscrowForDenomResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_QueryTotalEscrowForDenomResponse proto.InternalMessageInfo
+
+func (m *QueryTotalEscrowForDenomResponse) GetAmount() types.Coin {
+ if m != nil {
+ return m.Amount
+ }
+ return types.Coin{}
+}
+
func init() {
proto.RegisterType((*QueryDenomTraceRequest)(nil), "ibc.applications.transfer.v1.QueryDenomTraceRequest")
proto.RegisterType((*QueryDenomTraceResponse)(nil), "ibc.applications.transfer.v1.QueryDenomTraceResponse")
@@ -516,6 +607,8 @@ func init() {
proto.RegisterType((*QueryDenomHashResponse)(nil), "ibc.applications.transfer.v1.QueryDenomHashResponse")
proto.RegisterType((*QueryEscrowAddressRequest)(nil), "ibc.applications.transfer.v1.QueryEscrowAddressRequest")
proto.RegisterType((*QueryEscrowAddressResponse)(nil), "ibc.applications.transfer.v1.QueryEscrowAddressResponse")
+ proto.RegisterType((*QueryTotalEscrowForDenomRequest)(nil), "ibc.applications.transfer.v1.QueryTotalEscrowForDenomRequest")
+ proto.RegisterType((*QueryTotalEscrowForDenomResponse)(nil), "ibc.applications.transfer.v1.QueryTotalEscrowForDenomResponse")
}
func init() {
@@ -523,52 +616,59 @@ func init() {
}
var fileDescriptor_a638e2800a01538c = []byte{
- // 715 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x55, 0xcd, 0x6e, 0xd3, 0x4c,
- 0x14, 0x8d, 0xfb, 0x7d, 0x0d, 0xca, 0x0d, 0xed, 0x62, 0x28, 0xb4, 0x58, 0xc5, 0xad, 0xac, 0x02,
- 0xa5, 0x3f, 0x1e, 0xd2, 0x16, 0xca, 0x82, 0x0d, 0xe5, 0xb7, 0x88, 0x45, 0x9b, 0xb2, 0x82, 0x45,
- 0x35, 0xb6, 0x07, 0xc7, 0x52, 0xe2, 0x71, 0x3d, 0x4e, 0x50, 0x55, 0x65, 0xc3, 0x13, 0x20, 0xf5,
- 0x25, 0x50, 0xc5, 0x43, 0xb0, 0xec, 0xb2, 0x12, 0x12, 0x62, 0x05, 0xa8, 0xe5, 0x35, 0x90, 0x90,
- 0x67, 0x26, 0x89, 0x4d, 0xa3, 0x34, 0xde, 0x8d, 0x67, 0xee, 0xb9, 0xf7, 0x9c, 0x73, 0xef, 0x95,
- 0x61, 0xde, 0xb7, 0x1d, 0x4c, 0xc2, 0xb0, 0xee, 0x3b, 0x24, 0xf6, 0x59, 0xc0, 0x71, 0x1c, 0x91,
- 0x80, 0xbf, 0xa3, 0x11, 0x6e, 0x55, 0xf0, 0x5e, 0x93, 0x46, 0xfb, 0x56, 0x18, 0xb1, 0x98, 0xa1,
- 0x69, 0xdf, 0x76, 0xac, 0x74, 0xa4, 0xd5, 0x89, 0xb4, 0x5a, 0x15, 0x7d, 0xc2, 0x63, 0x1e, 0x13,
- 0x81, 0x38, 0x39, 0x49, 0x8c, 0xbe, 0xe0, 0x30, 0xde, 0x60, 0x1c, 0xdb, 0x84, 0x53, 0x99, 0x0c,
- 0xb7, 0x2a, 0x36, 0x8d, 0x49, 0x05, 0x87, 0xc4, 0xf3, 0x03, 0x91, 0x48, 0xc5, 0x2e, 0x0e, 0x64,
- 0xd2, 0xad, 0x25, 0x83, 0xa7, 0x3d, 0xc6, 0xbc, 0x3a, 0xc5, 0x24, 0xf4, 0x31, 0x09, 0x02, 0x16,
- 0x2b, 0x4a, 0xe2, 0xd5, 0x5c, 0x82, 0x6b, 0xdb, 0x49, 0xb1, 0x27, 0x34, 0x60, 0x8d, 0xd7, 0x11,
- 0x71, 0x68, 0x95, 0xee, 0x35, 0x29, 0x8f, 0x11, 0x82, 0xff, 0x6b, 0x84, 0xd7, 0xa6, 0xb4, 0x59,
- 0x6d, 0xbe, 0x54, 0x15, 0x67, 0xd3, 0x85, 0xc9, 0x73, 0xd1, 0x3c, 0x64, 0x01, 0xa7, 0x68, 0x13,
- 0xca, 0x6e, 0x72, 0xbb, 0x1b, 0x27, 0xd7, 0x02, 0x55, 0x5e, 0x99, 0xb7, 0x06, 0x39, 0x61, 0xa5,
- 0xd2, 0x80, 0xdb, 0x3d, 0x9b, 0xe4, 0x5c, 0x15, 0xde, 0x21, 0xf5, 0x0c, 0xa0, 0xe7, 0x86, 0x2a,
- 0x72, 0xcb, 0x92, 0xd6, 0x59, 0x89, 0x75, 0x96, 0xec, 0x83, 0xb2, 0xce, 0xda, 0x22, 0x5e, 0x47,
- 0x50, 0x35, 0x85, 0x34, 0xbf, 0x68, 0x30, 0x75, 0xbe, 0x86, 0x92, 0xf2, 0x16, 0x2e, 0xa7, 0xa4,
- 0xf0, 0x29, 0x6d, 0xf6, 0xbf, 0x3c, 0x5a, 0x36, 0xc6, 0x8f, 0x7f, 0xcc, 0x14, 0x8e, 0x7e, 0xce,
- 0x14, 0x55, 0xde, 0x72, 0x4f, 0x1b, 0x47, 0xcf, 0x33, 0x0a, 0x46, 0x84, 0x82, 0xdb, 0x17, 0x2a,
- 0x90, 0xcc, 0x32, 0x12, 0x26, 0x00, 0x09, 0x05, 0x5b, 0x24, 0x22, 0x8d, 0x8e, 0x41, 0xe6, 0x0e,
- 0x5c, 0xc9, 0xdc, 0x2a, 0x49, 0x0f, 0xa1, 0x18, 0x8a, 0x1b, 0xe5, 0xd9, 0xdc, 0x60, 0x31, 0x0a,
- 0xad, 0x30, 0xe6, 0x32, 0x5c, 0xed, 0x99, 0xf5, 0x82, 0xf0, 0x5a, 0xa7, 0x1d, 0x13, 0x30, 0xda,
- 0x6b, 0x77, 0xa9, 0x2a, 0x3f, 0xb2, 0x33, 0x25, 0xc3, 0x15, 0x8d, 0x7e, 0x33, 0xb5, 0x03, 0xd7,
- 0x45, 0xf4, 0x53, 0xee, 0x44, 0xec, 0xfd, 0x23, 0xd7, 0x8d, 0x28, 0xef, 0xf6, 0x7b, 0x12, 0x2e,
- 0x85, 0x2c, 0x8a, 0x77, 0x7d, 0x57, 0x61, 0x8a, 0xc9, 0xe7, 0xa6, 0x8b, 0x6e, 0x00, 0x38, 0x35,
- 0x12, 0x04, 0xb4, 0x9e, 0xbc, 0x8d, 0x88, 0xb7, 0x92, 0xba, 0xd9, 0x74, 0xcd, 0xc7, 0xa0, 0xf7,
- 0x4b, 0xaa, 0x68, 0xdc, 0x84, 0x71, 0x2a, 0x1e, 0x76, 0x89, 0x7c, 0x51, 0xc9, 0xc7, 0x68, 0x3a,
- 0x7c, 0xe5, 0x4f, 0x11, 0x46, 0x45, 0x16, 0xf4, 0x59, 0x03, 0xe8, 0x35, 0x18, 0xad, 0x0d, 0x76,
- 0xaf, 0xff, 0x42, 0xe9, 0xf7, 0x72, 0xa2, 0x24, 0x59, 0xb3, 0xf2, 0xe1, 0xeb, 0xef, 0xc3, 0x91,
- 0x45, 0x74, 0x07, 0xab, 0xad, 0xcf, 0x6e, 0x7b, 0x7a, 0x52, 0xf1, 0x41, 0xe2, 0x68, 0x1b, 0x7d,
- 0xd2, 0xa0, 0x9c, 0x1a, 0x6c, 0x94, 0xaf, 0x72, 0xc7, 0x7c, 0xfd, 0x7e, 0x5e, 0x98, 0x62, 0xbc,
- 0x20, 0x18, 0xcf, 0x21, 0xf3, 0x62, 0xc6, 0xe8, 0x50, 0x83, 0xa2, 0x9c, 0x36, 0x74, 0x77, 0x88,
- 0x72, 0x99, 0x61, 0xd7, 0x2b, 0x39, 0x10, 0x8a, 0xdb, 0x9c, 0xe0, 0x66, 0xa0, 0xe9, 0xfe, 0xdc,
- 0xe4, 0xc0, 0xa3, 0x23, 0x0d, 0x4a, 0xdd, 0xe9, 0x45, 0xab, 0xc3, 0xfa, 0x90, 0x5a, 0x0d, 0x7d,
- 0x2d, 0x1f, 0x48, 0xd1, 0x5b, 0x11, 0xf4, 0x96, 0xd0, 0xc2, 0x20, 0xeb, 0x92, 0x26, 0x27, 0xcd,
- 0x16, 0x16, 0xb6, 0xd1, 0x37, 0x0d, 0xc6, 0x32, 0x73, 0x8e, 0xd6, 0x87, 0xa8, 0xdd, 0x6f, 0xdd,
- 0xf4, 0x07, 0xf9, 0x81, 0x8a, 0x78, 0x55, 0x10, 0x7f, 0x85, 0x5e, 0xf6, 0x27, 0xae, 0x36, 0x93,
- 0xe3, 0x83, 0xde, 0xd6, 0xb6, 0x71, 0xb2, 0xcb, 0x1c, 0x1f, 0xa8, 0x0d, 0x6f, 0xe3, 0xec, 0x52,
- 0x6e, 0x6c, 0x1f, 0x9f, 0x1a, 0xda, 0xc9, 0xa9, 0xa1, 0xfd, 0x3a, 0x35, 0xb4, 0x8f, 0x67, 0x46,
- 0xe1, 0xe4, 0xcc, 0x28, 0x7c, 0x3f, 0x33, 0x0a, 0x6f, 0xd6, 0x3d, 0x3f, 0xae, 0x35, 0x6d, 0xcb,
- 0x61, 0x0d, 0xac, 0xfe, 0x9b, 0xbe, 0xed, 0x2c, 0x7b, 0x0c, 0xb7, 0xd6, 0x71, 0x83, 0xb9, 0xcd,
- 0x3a, 0xe5, 0xff, 0x90, 0x88, 0xf7, 0x43, 0xca, 0xed, 0xa2, 0xf8, 0xeb, 0xad, 0xfe, 0x0d, 0x00,
- 0x00, 0xff, 0xff, 0x8d, 0xed, 0x11, 0x8c, 0xcc, 0x07, 0x00, 0x00,
+ // 830 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0x4f, 0x4f, 0xe3, 0x46,
+ 0x14, 0x8f, 0x29, 0xa4, 0xcd, 0x4b, 0xe1, 0x30, 0xd0, 0x02, 0x16, 0x35, 0xc8, 0xa2, 0x2d, 0x4a,
+ 0xc1, 0xd3, 0x40, 0x20, 0x3d, 0x40, 0xa5, 0x42, 0x4b, 0x4b, 0xd5, 0x03, 0x04, 0x4e, 0xe5, 0x10,
+ 0x4d, 0xec, 0xa9, 0x63, 0x29, 0xf1, 0x18, 0x8f, 0x93, 0x0a, 0x45, 0x5c, 0xfa, 0x09, 0x2a, 0xf1,
+ 0x25, 0x56, 0x2b, 0xad, 0xf6, 0x2b, 0xec, 0x91, 0x23, 0xda, 0x95, 0x56, 0x9c, 0x76, 0x57, 0xb0,
+ 0x1f, 0x64, 0xe5, 0xf1, 0x38, 0xb1, 0x97, 0x10, 0x92, 0x3d, 0xc5, 0x33, 0xef, 0xdf, 0xef, 0xf7,
+ 0x7e, 0xf3, 0x9e, 0x02, 0x2b, 0x4e, 0xcd, 0xc4, 0xc4, 0xf3, 0x1a, 0x8e, 0x49, 0x02, 0x87, 0xb9,
+ 0x1c, 0x07, 0x3e, 0x71, 0xf9, 0x3f, 0xd4, 0xc7, 0xed, 0x22, 0x3e, 0x6b, 0x51, 0xff, 0xdc, 0xf0,
+ 0x7c, 0x16, 0x30, 0xb4, 0xe0, 0xd4, 0x4c, 0x23, 0xe9, 0x69, 0xc4, 0x9e, 0x46, 0xbb, 0xa8, 0xce,
+ 0xd8, 0xcc, 0x66, 0xc2, 0x11, 0x87, 0x5f, 0x51, 0x8c, 0xaa, 0x99, 0x8c, 0x37, 0x19, 0xc7, 0x35,
+ 0xc2, 0x29, 0x6e, 0x17, 0x6b, 0x34, 0x20, 0x45, 0x6c, 0x32, 0xc7, 0x95, 0xf6, 0x42, 0xd2, 0x2e,
+ 0x8a, 0x75, 0xbd, 0x3c, 0x62, 0x3b, 0xae, 0x28, 0x24, 0x7d, 0x7f, 0x18, 0x88, 0xb4, 0x8b, 0x25,
+ 0x72, 0x5e, 0xb0, 0x19, 0xb3, 0x1b, 0x14, 0x13, 0xcf, 0xc1, 0xc4, 0x75, 0x59, 0x20, 0x21, 0x0b,
+ 0xab, 0xbe, 0x0a, 0x5f, 0x1f, 0x85, 0xc5, 0x7e, 0xa5, 0x2e, 0x6b, 0x9e, 0xf8, 0xc4, 0xa4, 0x15,
+ 0x7a, 0xd6, 0xa2, 0x3c, 0x40, 0x08, 0xc6, 0xeb, 0x84, 0xd7, 0xe7, 0x94, 0x25, 0x65, 0x25, 0x57,
+ 0x11, 0xdf, 0xba, 0x05, 0xb3, 0xf7, 0xbc, 0xb9, 0xc7, 0x5c, 0x4e, 0xd1, 0x01, 0xe4, 0xad, 0xf0,
+ 0xb6, 0x1a, 0x84, 0xd7, 0x22, 0x2a, 0xbf, 0xbe, 0x62, 0x0c, 0xea, 0x94, 0x91, 0x48, 0x03, 0x56,
+ 0xf7, 0x5b, 0x27, 0xf7, 0xaa, 0xf0, 0x18, 0xd4, 0x3e, 0x40, 0xaf, 0x1b, 0xb2, 0xc8, 0x77, 0x46,
+ 0xd4, 0x3a, 0x23, 0x6c, 0x9d, 0x11, 0xe9, 0x24, 0x5b, 0x67, 0x1c, 0x12, 0x3b, 0x26, 0x54, 0x49,
+ 0x44, 0xea, 0x2f, 0x14, 0x98, 0xbb, 0x5f, 0x43, 0x52, 0x39, 0x85, 0x2f, 0x13, 0x54, 0xf8, 0x9c,
+ 0xb2, 0xf4, 0xd9, 0x28, 0x5c, 0x76, 0xa7, 0xae, 0xde, 0x2c, 0x66, 0x9e, 0xbe, 0x5d, 0xcc, 0xca,
+ 0xbc, 0xf9, 0x1e, 0x37, 0x8e, 0x7e, 0x4f, 0x31, 0x18, 0x13, 0x0c, 0xbe, 0x7f, 0x94, 0x41, 0x84,
+ 0x2c, 0x45, 0x61, 0x06, 0x90, 0x60, 0x70, 0x48, 0x7c, 0xd2, 0x8c, 0x1b, 0xa4, 0x1f, 0xc3, 0x74,
+ 0xea, 0x56, 0x52, 0xda, 0x86, 0xac, 0x27, 0x6e, 0x64, 0xcf, 0x96, 0x07, 0x93, 0x91, 0xd1, 0x32,
+ 0x46, 0x5f, 0x83, 0xaf, 0x7a, 0xcd, 0xfa, 0x83, 0xf0, 0x7a, 0x2c, 0xc7, 0x0c, 0x4c, 0xf4, 0xe4,
+ 0xce, 0x55, 0xa2, 0x43, 0xfa, 0x4d, 0x45, 0xee, 0x12, 0x46, 0xbf, 0x37, 0x75, 0x0c, 0xf3, 0xc2,
+ 0xfb, 0x37, 0x6e, 0xfa, 0xec, 0xdf, 0x5f, 0x2c, 0xcb, 0xa7, 0xbc, 0xab, 0xf7, 0x2c, 0x7c, 0xee,
+ 0x31, 0x3f, 0xa8, 0x3a, 0x96, 0x8c, 0xc9, 0x86, 0xc7, 0x03, 0x0b, 0x7d, 0x03, 0x60, 0xd6, 0x89,
+ 0xeb, 0xd2, 0x46, 0x68, 0x1b, 0x13, 0xb6, 0x9c, 0xbc, 0x39, 0xb0, 0xf4, 0x3d, 0x50, 0xfb, 0x25,
+ 0x95, 0x30, 0xbe, 0x85, 0x29, 0x2a, 0x0c, 0x55, 0x12, 0x59, 0x64, 0xf2, 0x49, 0x9a, 0x74, 0xd7,
+ 0xcb, 0xb0, 0x28, 0x92, 0x9c, 0xb0, 0x80, 0x34, 0xa2, 0x4c, 0xfb, 0xcc, 0x17, 0xac, 0x12, 0x0d,
+ 0x10, 0xe2, 0xc6, 0x0d, 0x10, 0x07, 0xfd, 0x14, 0x96, 0x1e, 0x0e, 0x94, 0x18, 0xca, 0x90, 0x25,
+ 0x4d, 0xd6, 0x72, 0x03, 0xa9, 0xc8, 0x7c, 0xea, 0x0d, 0xc4, 0xea, 0xef, 0x31, 0xc7, 0xdd, 0x1d,
+ 0x0f, 0xdf, 0x53, 0x45, 0xba, 0xaf, 0xdf, 0x7c, 0x01, 0x13, 0x22, 0x3b, 0x7a, 0xae, 0x00, 0xf4,
+ 0x9e, 0x1d, 0x2a, 0x0d, 0xd6, 0xb4, 0xff, 0x98, 0xab, 0x9b, 0x23, 0x46, 0x45, 0xf0, 0xf5, 0xd2,
+ 0x7f, 0xaf, 0xde, 0x5f, 0x8e, 0x19, 0x68, 0x15, 0xcb, 0x5d, 0x94, 0xde, 0x41, 0xc9, 0xf9, 0xc1,
+ 0x9d, 0x50, 0xe7, 0x9d, 0x42, 0xe1, 0x02, 0x3d, 0x51, 0x20, 0x9f, 0x98, 0x38, 0x34, 0x5a, 0xf1,
+ 0xf8, 0x55, 0xa8, 0x5b, 0xa3, 0x86, 0x49, 0xd0, 0x05, 0x01, 0x7a, 0x19, 0xe9, 0x8f, 0x83, 0x46,
+ 0x97, 0x0a, 0x64, 0xa3, 0x31, 0x40, 0x3f, 0x0e, 0x51, 0x2e, 0x35, 0x85, 0x6a, 0x71, 0x84, 0x08,
+ 0x89, 0x6d, 0x59, 0x60, 0xd3, 0xd0, 0x42, 0x7f, 0x6c, 0xd1, 0x24, 0xa2, 0x67, 0x0a, 0xe4, 0xba,
+ 0x63, 0x85, 0x36, 0x86, 0xed, 0x43, 0x62, 0x66, 0xd5, 0xd2, 0x68, 0x41, 0x12, 0xde, 0xa6, 0x80,
+ 0x87, 0xd1, 0xda, 0xa0, 0xd6, 0x85, 0x3a, 0x87, 0x7a, 0x8b, 0x16, 0x0a, 0xc1, 0x5f, 0x2b, 0x30,
+ 0x99, 0x9a, 0x41, 0x54, 0x1e, 0xa2, 0x7c, 0xbf, 0x55, 0xa0, 0xfe, 0x34, 0x7a, 0xa0, 0xc4, 0x5e,
+ 0x11, 0xd8, 0xff, 0x42, 0x7f, 0xf6, 0xc7, 0x2e, 0xb7, 0x06, 0xc7, 0x9d, 0xde, 0x46, 0xb9, 0xc0,
+ 0xe1, 0x9e, 0xe1, 0xb8, 0x23, 0xb7, 0xcf, 0x05, 0x4e, 0x2f, 0x0c, 0xf4, 0x52, 0x81, 0xe9, 0x3e,
+ 0xe3, 0x8d, 0x76, 0x86, 0x40, 0xf9, 0xf0, 0x3e, 0x51, 0x7f, 0xfe, 0xd4, 0x70, 0x49, 0x75, 0x5b,
+ 0x50, 0xdd, 0x42, 0xa5, 0x01, 0x32, 0x71, 0xdc, 0x11, 0xbf, 0xa1, 0x40, 0x38, 0x08, 0x93, 0x55,
+ 0x23, 0x72, 0xbb, 0x47, 0x57, 0xb7, 0x9a, 0x72, 0x7d, 0xab, 0x29, 0xef, 0x6e, 0x35, 0xe5, 0xff,
+ 0x3b, 0x2d, 0x73, 0x7d, 0xa7, 0x65, 0x6e, 0xee, 0xb4, 0xcc, 0xdf, 0x65, 0xdb, 0x09, 0xea, 0xad,
+ 0x9a, 0x61, 0xb2, 0x26, 0x96, 0x7f, 0x54, 0x9c, 0x9a, 0xb9, 0x66, 0x33, 0xdc, 0x2e, 0xe3, 0x26,
+ 0xb3, 0x5a, 0x0d, 0xca, 0x3f, 0x2a, 0x17, 0x9c, 0x7b, 0x94, 0xd7, 0xb2, 0xe2, 0x6f, 0xc6, 0xc6,
+ 0x87, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd9, 0x35, 0xa9, 0x75, 0x5d, 0x09, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -593,6 +693,8 @@ type QueryClient interface {
DenomHash(ctx context.Context, in *QueryDenomHashRequest, opts ...grpc.CallOption) (*QueryDenomHashResponse, error)
// EscrowAddress returns the escrow address for a particular port and channel id.
EscrowAddress(ctx context.Context, in *QueryEscrowAddressRequest, opts ...grpc.CallOption) (*QueryEscrowAddressResponse, error)
+ // TotalEscrowForDenom returns the total amount of tokens in escrow based on the denom.
+ TotalEscrowForDenom(ctx context.Context, in *QueryTotalEscrowForDenomRequest, opts ...grpc.CallOption) (*QueryTotalEscrowForDenomResponse, error)
}
type queryClient struct {
@@ -648,6 +750,15 @@ func (c *queryClient) EscrowAddress(ctx context.Context, in *QueryEscrowAddressR
return out, nil
}
+func (c *queryClient) TotalEscrowForDenom(ctx context.Context, in *QueryTotalEscrowForDenomRequest, opts ...grpc.CallOption) (*QueryTotalEscrowForDenomResponse, error) {
+ out := new(QueryTotalEscrowForDenomResponse)
+ err := c.cc.Invoke(ctx, "/ibc.applications.transfer.v1.Query/TotalEscrowForDenom", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
// QueryServer is the server API for Query service.
type QueryServer interface {
// DenomTrace queries a denomination trace information.
@@ -660,6 +771,8 @@ type QueryServer interface {
DenomHash(context.Context, *QueryDenomHashRequest) (*QueryDenomHashResponse, error)
// EscrowAddress returns the escrow address for a particular port and channel id.
EscrowAddress(context.Context, *QueryEscrowAddressRequest) (*QueryEscrowAddressResponse, error)
+ // TotalEscrowForDenom returns the total amount of tokens in escrow based on the denom.
+ TotalEscrowForDenom(context.Context, *QueryTotalEscrowForDenomRequest) (*QueryTotalEscrowForDenomResponse, error)
}
// UnimplementedQueryServer can be embedded to have forward compatible implementations.
@@ -681,6 +794,9 @@ func (*UnimplementedQueryServer) DenomHash(ctx context.Context, req *QueryDenomH
func (*UnimplementedQueryServer) EscrowAddress(ctx context.Context, req *QueryEscrowAddressRequest) (*QueryEscrowAddressResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method EscrowAddress not implemented")
}
+func (*UnimplementedQueryServer) TotalEscrowForDenom(ctx context.Context, req *QueryTotalEscrowForDenomRequest) (*QueryTotalEscrowForDenomResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method TotalEscrowForDenom not implemented")
+}
func RegisterQueryServer(s grpc1.Server, srv QueryServer) {
s.RegisterService(&_Query_serviceDesc, srv)
@@ -776,6 +892,24 @@ func _Query_EscrowAddress_Handler(srv interface{}, ctx context.Context, dec func
return interceptor(ctx, in, info, handler)
}
+func _Query_TotalEscrowForDenom_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(QueryTotalEscrowForDenomRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(QueryServer).TotalEscrowForDenom(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/ibc.applications.transfer.v1.Query/TotalEscrowForDenom",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(QueryServer).TotalEscrowForDenom(ctx, req.(*QueryTotalEscrowForDenomRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
var _Query_serviceDesc = grpc.ServiceDesc{
ServiceName: "ibc.applications.transfer.v1.Query",
HandlerType: (*QueryServer)(nil),
@@ -800,6 +934,10 @@ var _Query_serviceDesc = grpc.ServiceDesc{
MethodName: "EscrowAddress",
Handler: _Query_EscrowAddress_Handler,
},
+ {
+ MethodName: "TotalEscrowForDenom",
+ Handler: _Query_TotalEscrowForDenom_Handler,
+ },
},
Streams: []grpc.StreamDesc{},
Metadata: "ibc/applications/transfer/v1/query.proto",
@@ -1139,6 +1277,69 @@ func (m *QueryEscrowAddressResponse) MarshalToSizedBuffer(dAtA []byte) (int, err
return len(dAtA) - i, nil
}
+func (m *QueryTotalEscrowForDenomRequest) 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 *QueryTotalEscrowForDenomRequest) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *QueryTotalEscrowForDenomRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if len(m.Denom) > 0 {
+ i -= len(m.Denom)
+ copy(dAtA[i:], m.Denom)
+ i = encodeVarintQuery(dAtA, i, uint64(len(m.Denom)))
+ i--
+ dAtA[i] = 0xa
+ }
+ return len(dAtA) - i, nil
+}
+
+func (m *QueryTotalEscrowForDenomResponse) 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 *QueryTotalEscrowForDenomResponse) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *QueryTotalEscrowForDenomResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ {
+ size, err := m.Amount.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 encodeVarintQuery(dAtA []byte, offset int, v uint64) int {
offset -= sovQuery(v)
base := offset
@@ -1286,6 +1487,30 @@ func (m *QueryEscrowAddressResponse) Size() (n int) {
return n
}
+func (m *QueryTotalEscrowForDenomRequest) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ l = len(m.Denom)
+ if l > 0 {
+ n += 1 + l + sovQuery(uint64(l))
+ }
+ return n
+}
+
+func (m *QueryTotalEscrowForDenomResponse) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ l = m.Amount.Size()
+ n += 1 + l + sovQuery(uint64(l))
+ return n
+}
+
func sovQuery(x uint64) (n int) {
return (math_bits.Len64(x|1) + 6) / 7
}
@@ -2162,6 +2387,171 @@ func (m *QueryEscrowAddressResponse) Unmarshal(dAtA []byte) error {
}
return nil
}
+func (m *QueryTotalEscrowForDenomRequest) 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: QueryTotalEscrowForDenomRequest: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: QueryTotalEscrowForDenomRequest: 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 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.Denom = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipQuery(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthQuery
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *QueryTotalEscrowForDenomResponse) 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: QueryTotalEscrowForDenomResponse: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: QueryTotalEscrowForDenomResponse: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Amount", 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.Amount.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 skipQuery(dAtA []byte) (n int, err error) {
l := len(dAtA)
iNdEx := 0
diff --git a/modules/apps/transfer/types/query.pb.gw.go b/modules/apps/transfer/types/query.pb.gw.go
index d0c0e4db5c3..e7b727dbd50 100644
--- a/modules/apps/transfer/types/query.pb.gw.go
+++ b/modules/apps/transfer/types/query.pb.gw.go
@@ -271,6 +271,60 @@ func local_request_Query_EscrowAddress_0(ctx context.Context, marshaler runtime.
}
+func request_Query_TotalEscrowForDenom_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq QueryTotalEscrowForDenomRequest
+ var metadata runtime.ServerMetadata
+
+ var (
+ val string
+ ok bool
+ err error
+ _ = err
+ )
+
+ val, ok = pathParams["denom"]
+ if !ok {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "denom")
+ }
+
+ protoReq.Denom, err = runtime.String(val)
+
+ if err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "denom", err)
+ }
+
+ msg, err := client.TotalEscrowForDenom(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+ return msg, metadata, err
+
+}
+
+func local_request_Query_TotalEscrowForDenom_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+ var protoReq QueryTotalEscrowForDenomRequest
+ var metadata runtime.ServerMetadata
+
+ var (
+ val string
+ ok bool
+ err error
+ _ = err
+ )
+
+ val, ok = pathParams["denom"]
+ if !ok {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "denom")
+ }
+
+ protoReq.Denom, err = runtime.String(val)
+
+ if err != nil {
+ return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "denom", err)
+ }
+
+ msg, err := server.TotalEscrowForDenom(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.
@@ -392,6 +446,29 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv
})
+ mux.Handle("GET", pattern_Query_TotalEscrowForDenom_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_TotalEscrowForDenom_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_TotalEscrowForDenom_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
return nil
}
@@ -533,19 +610,41 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie
})
+ mux.Handle("GET", pattern_Query_TotalEscrowForDenom_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_TotalEscrowForDenom_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_TotalEscrowForDenom_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+ })
+
return nil
}
var (
- pattern_Query_DenomTrace_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"ibc", "apps", "transfer", "v1", "denom_traces", "hash"}, "", runtime.AssumeColonVerbOpt(false)))
+ pattern_Query_DenomTrace_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 3, 0, 4, 1, 5, 5}, []string{"ibc", "apps", "transfer", "v1", "denom_traces", "hash"}, "", runtime.AssumeColonVerbOpt(false)))
pattern_Query_DenomTraces_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"ibc", "apps", "transfer", "v1", "denom_traces"}, "", runtime.AssumeColonVerbOpt(false)))
pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"ibc", "apps", "transfer", "v1", "params"}, "", runtime.AssumeColonVerbOpt(false)))
- pattern_Query_DenomHash_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"ibc", "apps", "transfer", "v1", "denom_hashes", "trace"}, "", runtime.AssumeColonVerbOpt(false)))
+ pattern_Query_DenomHash_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 3, 0, 4, 1, 5, 5}, []string{"ibc", "apps", "transfer", "v1", "denom_hashes", "trace"}, "", runtime.AssumeColonVerbOpt(false)))
pattern_Query_EscrowAddress_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6, 1, 0, 4, 1, 5, 7, 2, 8}, []string{"ibc", "apps", "transfer", "v1", "channels", "channel_id", "ports", "port_id", "escrow_address"}, "", runtime.AssumeColonVerbOpt(false)))
+
+ pattern_Query_TotalEscrowForDenom_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 3, 0, 4, 1, 5, 5, 2, 6}, []string{"ibc", "apps", "transfer", "v1", "denoms", "denom", "total_escrow"}, "", runtime.AssumeColonVerbOpt(false)))
)
var (
@@ -558,4 +657,6 @@ var (
forward_Query_DenomHash_0 = runtime.ForwardResponseMessage
forward_Query_EscrowAddress_0 = runtime.ForwardResponseMessage
+
+ forward_Query_TotalEscrowForDenom_0 = runtime.ForwardResponseMessage
)
diff --git a/modules/apps/transfer/types/trace.go b/modules/apps/transfer/types/trace.go
index 7123e5eed68..8270ed7fb7a 100644
--- a/modules/apps/transfer/types/trace.go
+++ b/modules/apps/transfer/types/trace.go
@@ -7,10 +7,10 @@ import (
"sort"
"strings"
+ tmbytes "github.com/cometbft/cometbft/libs/bytes"
+ tmtypes "github.com/cometbft/cometbft/types"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
- tmbytes "github.com/tendermint/tendermint/libs/bytes"
- tmtypes "github.com/tendermint/tendermint/types"
channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types"
host "github.com/cosmos/ibc-go/v7/modules/core/24-host"
@@ -75,6 +75,11 @@ func (dt DenomTrace) GetFullDenomPath() string {
return dt.GetPrefix() + dt.BaseDenom
}
+// IsNativeDenom returns true if the denomination is native, thus containing no trace history.
+func (dt DenomTrace) IsNativeDenom() bool {
+ return dt.Path == ""
+}
+
// extractPathAndBaseFromFullDenom returns the trace path and the base denom from
// the elements that constitute the complete denom.
func extractPathAndBaseFromFullDenom(fullDenomItems []string) (string, string) {
diff --git a/modules/apps/transfer/types/transfer_authorization.go b/modules/apps/transfer/types/transfer_authorization.go
new file mode 100644
index 00000000000..f8a7ef18be2
--- /dev/null
+++ b/modules/apps/transfer/types/transfer_authorization.go
@@ -0,0 +1,150 @@
+package types
+
+import (
+ "math/big"
+
+ sdkmath "cosmossdk.io/math"
+ sdk "github.com/cosmos/cosmos-sdk/types"
+ sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
+ "github.com/cosmos/cosmos-sdk/x/authz"
+
+ channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types"
+ host "github.com/cosmos/ibc-go/v7/modules/core/24-host"
+)
+
+var _ authz.Authorization = &TransferAuthorization{}
+
+// maxUint256 is the maximum value for a 256 bit unsigned integer.
+var maxUint256 = new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 256), big.NewInt(1))
+
+// NewTransferAuthorization creates a new TransferAuthorization object.
+func NewTransferAuthorization(allocations ...Allocation) *TransferAuthorization {
+ return &TransferAuthorization{
+ Allocations: allocations,
+ }
+}
+
+// MsgTypeURL implements Authorization.MsgTypeURL.
+func (a TransferAuthorization) MsgTypeURL() string {
+ return sdk.MsgTypeURL(&MsgTransfer{})
+}
+
+// Accept implements Authorization.Accept.
+func (a TransferAuthorization) Accept(ctx sdk.Context, msg sdk.Msg) (authz.AcceptResponse, error) {
+ msgTransfer, ok := msg.(*MsgTransfer)
+ if !ok {
+ return authz.AcceptResponse{}, sdkerrors.Wrap(sdkerrors.ErrInvalidType, "type mismatch")
+ }
+
+ for index, allocation := range a.Allocations {
+ if !(allocation.SourceChannel == msgTransfer.SourceChannel && allocation.SourcePort == msgTransfer.SourcePort) {
+ continue
+ }
+
+ if !isAllowedAddress(ctx, msgTransfer.Receiver, allocation.AllowList) {
+ return authz.AcceptResponse{}, sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "not allowed receiver address for transfer")
+ }
+
+ // If the spend limit is set to the MaxUint256 sentinel value, do not subtract the amount from the spend limit.
+ if allocation.SpendLimit.AmountOf(msgTransfer.Token.Denom).Equal(UnboundedSpendLimit()) {
+ return authz.AcceptResponse{Accept: true, Delete: false, Updated: nil}, nil
+ }
+
+ limitLeft, isNegative := allocation.SpendLimit.SafeSub(msgTransfer.Token)
+ if isNegative {
+ return authz.AcceptResponse{}, sdkerrors.Wrapf(sdkerrors.ErrInsufficientFunds, "requested amount is more than spend limit")
+ }
+
+ if limitLeft.IsZero() {
+ a.Allocations = append(a.Allocations[:index], a.Allocations[index+1:]...)
+ if len(a.Allocations) == 0 {
+ return authz.AcceptResponse{Accept: true, Delete: true}, nil
+ }
+ return authz.AcceptResponse{Accept: true, Delete: false, Updated: &TransferAuthorization{
+ Allocations: a.Allocations,
+ }}, nil
+ }
+ a.Allocations[index] = Allocation{
+ SourcePort: allocation.SourcePort,
+ SourceChannel: allocation.SourceChannel,
+ SpendLimit: limitLeft,
+ AllowList: allocation.AllowList,
+ }
+
+ return authz.AcceptResponse{Accept: true, Delete: false, Updated: &TransferAuthorization{
+ Allocations: a.Allocations,
+ }}, nil
+ }
+
+ return authz.AcceptResponse{}, sdkerrors.Wrapf(sdkerrors.ErrNotFound, "requested port and channel allocation does not exist")
+}
+
+// ValidateBasic implements Authorization.ValidateBasic.
+func (a TransferAuthorization) ValidateBasic() error {
+ if len(a.Allocations) == 0 {
+ return sdkerrors.Wrap(ErrInvalidAuthorization, "allocations cannot be empty")
+ }
+
+ foundChannels := make(map[string]bool, 0)
+
+ for _, allocation := range a.Allocations {
+ if _, found := foundChannels[allocation.SourceChannel]; found {
+ return sdkerrors.Wrapf(channeltypes.ErrInvalidChannel, "duplicate source channel ID: %s", allocation.SourceChannel)
+ }
+
+ foundChannels[allocation.SourceChannel] = true
+
+ if allocation.SpendLimit == nil {
+ return sdkerrors.Wrap(sdkerrors.ErrInvalidCoins, "spend limit cannot be nil")
+ }
+
+ if err := allocation.SpendLimit.Validate(); err != nil {
+ return sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, err.Error())
+ }
+
+ if err := host.PortIdentifierValidator(allocation.SourcePort); err != nil {
+ return sdkerrors.Wrap(err, "invalid source port ID")
+ }
+
+ if err := host.ChannelIdentifierValidator(allocation.SourceChannel); err != nil {
+ return sdkerrors.Wrap(err, "invalid source channel ID")
+ }
+
+ found := make(map[string]bool, 0)
+ for i := 0; i < len(allocation.AllowList); i++ {
+ if found[allocation.AllowList[i]] {
+ return sdkerrors.Wrapf(ErrInvalidAuthorization, "duplicate entry in allow list %s")
+ }
+ found[allocation.AllowList[i]] = true
+ }
+ }
+
+ return nil
+}
+
+// isAllowedAddress returns a boolean indicating if the receiver address is valid for transfer.
+// gasCostPerIteration gas is consumed for each iteration.
+func isAllowedAddress(ctx sdk.Context, receiver string, allowedAddrs []string) bool {
+ if len(allowedAddrs) == 0 {
+ return true
+ }
+
+ gasCostPerIteration := ctx.KVGasConfig().IterNextCostFlat
+
+ for _, addr := range allowedAddrs {
+ ctx.GasMeter().ConsumeGas(gasCostPerIteration, "transfer authorization")
+ if addr == receiver {
+ return true
+ }
+ }
+ return false
+}
+
+// UnboundedSpendLimit returns the sentinel value that can be used
+// as the amount for a denomination's spend limit for which spend limit updating
+// should be disabled. Please note that using this sentinel value means that a grantee
+// will be granted the privilege to do ICS20 token transfers for the total amount
+// of the denomination available at the granter's account.
+func UnboundedSpendLimit() sdkmath.Int {
+ return sdk.NewIntFromBigInt(maxUint256)
+}
diff --git a/modules/apps/transfer/types/transfer_authorization_test.go b/modules/apps/transfer/types/transfer_authorization_test.go
new file mode 100644
index 00000000000..a549bce954e
--- /dev/null
+++ b/modules/apps/transfer/types/transfer_authorization_test.go
@@ -0,0 +1,328 @@
+package types_test
+
+import (
+ sdk "github.com/cosmos/cosmos-sdk/types"
+ "github.com/cosmos/cosmos-sdk/x/authz"
+ "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
+ ibctesting "github.com/cosmos/ibc-go/v7/testing"
+ "github.com/cosmos/ibc-go/v7/testing/mock"
+)
+
+func (suite *TypesTestSuite) TestTransferAuthorizationAccept() {
+ var (
+ msgTransfer types.MsgTransfer
+ transferAuthz types.TransferAuthorization
+ )
+
+ testCases := []struct {
+ name string
+ malleate func()
+ assertResult func(res authz.AcceptResponse, err error)
+ }{
+ {
+ "success",
+ func() {},
+ func(res authz.AcceptResponse, err error) {
+ suite.Require().NoError(err)
+
+ suite.Require().True(res.Accept)
+ suite.Require().True(res.Delete)
+ suite.Require().Nil(res.Updated)
+ },
+ },
+ {
+ "success: with spend limit updated",
+ func() {
+ msgTransfer.Token = sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(50))
+ },
+ func(res authz.AcceptResponse, err error) {
+ suite.Require().NoError(err)
+
+ suite.Require().True(res.Accept)
+ suite.Require().False(res.Delete)
+
+ updatedAuthz, ok := res.Updated.(*types.TransferAuthorization)
+ suite.Require().True(ok)
+
+ isEqual := updatedAuthz.Allocations[0].SpendLimit.IsEqual(sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(50))))
+ suite.Require().True(isEqual)
+ },
+ },
+ {
+ "success: with empty allow list",
+ func() {
+ transferAuthz.Allocations[0].AllowList = []string{}
+ },
+ func(res authz.AcceptResponse, err error) {
+ suite.Require().NoError(err)
+
+ suite.Require().True(res.Accept)
+ suite.Require().True(res.Delete)
+ suite.Require().Nil(res.Updated)
+ },
+ },
+ {
+ "success: with multiple allocations",
+ func() {
+ alloc := types.Allocation{
+ SourcePort: ibctesting.MockPort,
+ SourceChannel: "channel-9",
+ SpendLimit: ibctesting.TestCoins,
+ }
+
+ transferAuthz.Allocations = append(transferAuthz.Allocations, alloc)
+ },
+ func(res authz.AcceptResponse, err error) {
+ suite.Require().NoError(err)
+
+ suite.Require().True(res.Accept)
+ suite.Require().False(res.Delete)
+
+ updatedAuthz, ok := res.Updated.(*types.TransferAuthorization)
+ suite.Require().True(ok)
+
+ // assert spent spendlimit is removed from the list
+ suite.Require().Len(updatedAuthz.Allocations, 1)
+ },
+ },
+ {
+ "success: with unlimited spend limit of max uint256",
+ func() {
+ transferAuthz.Allocations[0].SpendLimit = sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, types.UnboundedSpendLimit()))
+ },
+ func(res authz.AcceptResponse, err error) {
+ suite.Require().NoError(err)
+
+ suite.Require().True(res.Accept)
+ suite.Require().False(res.Delete)
+ suite.Require().Nil(res.Updated)
+ },
+ },
+ {
+ "test multiple coins does not overspend",
+ func() {
+ transferAuthz.Allocations[0].SpendLimit = transferAuthz.Allocations[0].SpendLimit.Add(
+ sdk.NewCoins(
+ sdk.NewCoin("test-denom", sdk.NewInt(100)),
+ sdk.NewCoin("test-denom2", sdk.NewInt(100)),
+ )...,
+ )
+ msgTransfer.Token = sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(50))
+ },
+ func(res authz.AcceptResponse, err error) {
+ suite.Require().NoError(err)
+
+ updatedTransferAuthz, ok := res.Updated.(*types.TransferAuthorization)
+ suite.Require().True(ok)
+
+ remainder := updatedTransferAuthz.Allocations[0].SpendLimit.AmountOf(sdk.DefaultBondDenom)
+ suite.Require().True(sdk.NewInt(50).Equal(remainder))
+
+ remainder = updatedTransferAuthz.Allocations[0].SpendLimit.AmountOf("test-denom")
+ suite.Require().True(sdk.NewInt(100).Equal(remainder))
+
+ remainder = updatedTransferAuthz.Allocations[0].SpendLimit.AmountOf("test-denom2")
+ suite.Require().True(sdk.NewInt(100).Equal(remainder))
+ },
+ },
+ {
+ "no spend limit set for MsgTransfer port/channel",
+ func() {
+ msgTransfer.SourcePort = ibctesting.MockPort
+ msgTransfer.SourceChannel = "channel-9"
+ },
+ func(res authz.AcceptResponse, err error) {
+ suite.Require().Error(err)
+ },
+ },
+ {
+ "requested transfer amount is more than the spend limit",
+ func() {
+ msgTransfer.Token = sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1000))
+ },
+ func(res authz.AcceptResponse, err error) {
+ suite.Require().Error(err)
+ },
+ },
+ {
+ "receiver address not permitted via allow list",
+ func() {
+ msgTransfer.Receiver = suite.chainB.SenderAccount.GetAddress().String()
+ },
+ func(res authz.AcceptResponse, err error) {
+ suite.Require().Error(err)
+ },
+ },
+ }
+
+ for _, tc := range testCases {
+ suite.Run(tc.name, func() {
+ suite.SetupTest()
+
+ path := NewTransferPath(suite.chainA, suite.chainB)
+ suite.coordinator.Setup(path)
+
+ transferAuthz = types.TransferAuthorization{
+ Allocations: []types.Allocation{
+ {
+ SourcePort: path.EndpointA.ChannelConfig.PortID,
+ SourceChannel: path.EndpointA.ChannelID,
+ SpendLimit: ibctesting.TestCoins,
+ AllowList: []string{ibctesting.TestAccAddress},
+ },
+ },
+ }
+
+ msgTransfer = types.MsgTransfer{
+ SourcePort: path.EndpointA.ChannelConfig.PortID,
+ SourceChannel: path.EndpointA.ChannelID,
+ Token: ibctesting.TestCoin,
+ Sender: suite.chainA.SenderAccount.GetAddress().String(),
+ Receiver: ibctesting.TestAccAddress,
+ TimeoutHeight: suite.chainB.GetTimeoutHeight(),
+ }
+
+ tc.malleate()
+
+ res, err := transferAuthz.Accept(suite.chainA.GetContext(), &msgTransfer)
+ tc.assertResult(res, err)
+ })
+ }
+}
+
+func (suite *TypesTestSuite) TestTransferAuthorizationMsgTypeURL() {
+ var transferAuthz types.TransferAuthorization
+ suite.Require().Equal(sdk.MsgTypeURL(&types.MsgTransfer{}), transferAuthz.MsgTypeURL(), "invalid type url for transfer authorization")
+}
+
+func (suite *TypesTestSuite) TestTransferAuthorizationValidateBasic() {
+ var transferAuthz types.TransferAuthorization
+
+ testCases := []struct {
+ name string
+ malleate func()
+ expPass bool
+ }{
+ {
+ "success",
+ func() {},
+ true,
+ },
+ {
+ "success: empty allow list",
+ func() {
+ transferAuthz.Allocations[0].AllowList = []string{}
+ },
+ true,
+ },
+ {
+ "success: with multiple allocations",
+ func() {
+ allocation := types.Allocation{
+ SourcePort: types.PortID,
+ SourceChannel: "channel-1",
+ SpendLimit: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100))),
+ AllowList: []string{},
+ }
+
+ transferAuthz.Allocations = append(transferAuthz.Allocations, allocation)
+ },
+ true,
+ },
+ {
+ "success: with unlimited spend limit of max uint256",
+ func() {
+ transferAuthz.Allocations[0].SpendLimit = sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, types.UnboundedSpendLimit()))
+ },
+ true,
+ },
+ {
+ "empty allocations",
+ func() {
+ transferAuthz = types.TransferAuthorization{Allocations: []types.Allocation{}}
+ },
+ false,
+ },
+ {
+ "nil allocations",
+ func() {
+ transferAuthz = types.TransferAuthorization{}
+ },
+ false,
+ },
+ {
+ "nil spend limit coins",
+ func() {
+ transferAuthz.Allocations[0].SpendLimit = nil
+ },
+ false,
+ },
+ {
+ "invalid spend limit coins",
+ func() {
+ transferAuthz.Allocations[0].SpendLimit = sdk.Coins{sdk.Coin{Denom: ""}}
+ },
+ false,
+ },
+ {
+ "duplicate entry in allow list",
+ func() {
+ transferAuthz.Allocations[0].AllowList = []string{ibctesting.TestAccAddress, ibctesting.TestAccAddress}
+ },
+ false,
+ },
+ {
+ "invalid port identifier",
+ func() {
+ transferAuthz.Allocations[0].SourcePort = ""
+ },
+ false,
+ },
+ {
+ "invalid channel identifier",
+ func() {
+ transferAuthz.Allocations[0].SourceChannel = ""
+ },
+ false,
+ },
+ {
+ name: "duplicate channel ID",
+ malleate: func() {
+ allocation := types.Allocation{
+ SourcePort: mock.PortID,
+ SourceChannel: transferAuthz.Allocations[0].SourceChannel,
+ SpendLimit: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100))),
+ AllowList: []string{ibctesting.TestAccAddress},
+ }
+
+ transferAuthz.Allocations = append(transferAuthz.Allocations, allocation)
+ },
+ expPass: false,
+ },
+ }
+
+ for _, tc := range testCases {
+ suite.Run(tc.name, func() {
+ transferAuthz = types.TransferAuthorization{
+ Allocations: []types.Allocation{
+ {
+ SourcePort: mock.PortID,
+ SourceChannel: ibctesting.FirstChannelID,
+ SpendLimit: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100))),
+ AllowList: []string{ibctesting.TestAccAddress},
+ },
+ },
+ }
+
+ tc.malleate()
+
+ err := transferAuthz.ValidateBasic()
+
+ if tc.expPass {
+ suite.Require().NoError(err)
+ } else {
+ suite.Require().Error(err)
+ }
+ })
+ }
+}
diff --git a/modules/apps/transfer/types/ack_test.go b/modules/apps/transfer/types/types_test.go
similarity index 59%
rename from modules/apps/transfer/types/ack_test.go
rename to modules/apps/transfer/types/types_test.go
index 1516f334e7e..86069b1a887 100644
--- a/modules/apps/transfer/types/ack_test.go
+++ b/modules/apps/transfer/types/types_test.go
@@ -5,6 +5,7 @@ import (
"github.com/stretchr/testify/suite"
+ "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
ibctesting "github.com/cosmos/ibc-go/v7/testing"
)
@@ -24,6 +25,16 @@ func (suite *TypesTestSuite) SetupTest() {
suite.chainB = suite.coordinator.GetChain(ibctesting.GetChainID(2))
}
+func NewTransferPath(chainA, chainB *ibctesting.TestChain) *ibctesting.Path {
+ path := ibctesting.NewPath(chainA, chainB)
+ path.EndpointA.ChannelConfig.PortID = types.PortID
+ path.EndpointB.ChannelConfig.PortID = types.PortID
+ path.EndpointA.ChannelConfig.Version = types.Version
+ path.EndpointB.ChannelConfig.Version = types.Version
+
+ return path
+}
+
func TestTypesTestSuite(t *testing.T) {
suite.Run(t, new(TypesTestSuite))
}
diff --git a/modules/core/02-client/abci.go b/modules/core/02-client/abci.go
index 735834b2f65..d5b4b2deb65 100644
--- a/modules/core/02-client/abci.go
+++ b/modules/core/02-client/abci.go
@@ -4,6 +4,7 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper"
+ "github.com/cosmos/ibc-go/v7/modules/core/exported"
ibctm "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint"
)
@@ -31,4 +32,11 @@ func BeginBlocker(ctx sdk.Context, k keeper.Keeper) {
keeper.EmitUpgradeChainEvent(ctx, plan.Height)
}
}
+
+ // update the localhost client with the latest block height if it is active.
+ if clientState, found := k.GetClientState(ctx, exported.Localhost); found {
+ if k.GetClientStatus(ctx, clientState, exported.Localhost) == exported.Active {
+ k.UpdateLocalhostClient(ctx, clientState)
+ }
+ }
}
diff --git a/modules/core/02-client/abci_test.go b/modules/core/02-client/abci_test.go
index c5dbf2c8a55..170f5a63524 100644
--- a/modules/core/02-client/abci_test.go
+++ b/modules/core/02-client/abci_test.go
@@ -4,11 +4,11 @@ import (
"strings"
"testing"
+ abci "github.com/cometbft/cometbft/abci/types"
+ tmproto "github.com/cometbft/cometbft/proto/tendermint/types"
sdk "github.com/cosmos/cosmos-sdk/types"
upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
"github.com/stretchr/testify/suite"
- abci "github.com/tendermint/tendermint/abci/types"
- tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
client "github.com/cosmos/ibc-go/v7/modules/core/02-client"
"github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
@@ -59,6 +59,7 @@ func (suite *ClientTestSuite) TestBeginBlockerConsensusState() {
nextValsHash := []byte("nextValsHash")
newCtx := suite.chainA.GetContext().WithBlockHeader(tmproto.Header{
+ ChainID: suite.chainA.ChainID,
Height: suite.chainA.GetContext().BlockHeight(),
NextValidatorsHash: nextValsHash,
})
diff --git a/modules/core/02-client/client/utils/utils.go b/modules/core/02-client/client/utils/utils.go
index 18fecf9d8e2..6b4df0f6993 100644
--- a/modules/core/02-client/client/utils/utils.go
+++ b/modules/core/02-client/client/utils/utils.go
@@ -3,10 +3,10 @@ package utils
import (
"context"
+ tmtypes "github.com/cometbft/cometbft/types"
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/codec"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
- tmtypes "github.com/tendermint/tendermint/types"
"github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types"
diff --git a/modules/core/02-client/genesis.go b/modules/core/02-client/genesis.go
index aae41d9ae5a..7a38683ea03 100644
--- a/modules/core/02-client/genesis.go
+++ b/modules/core/02-client/genesis.go
@@ -46,6 +46,12 @@ func InitGenesis(ctx sdk.Context, k keeper.Keeper, gs types.GenesisState) {
}
k.SetNextClientSequence(ctx, gs.NextClientSequence)
+
+ // if the localhost already exists in state (included in the genesis file),
+ // it must be overwritten to ensure its stored height equals the context block height
+ if err := k.CreateLocalhostClient(ctx); err != nil {
+ panic(fmt.Sprintf("failed to initialise localhost client: %s", err.Error()))
+ }
}
// ExportGenesis returns the ibc client submodule's exported genesis.
diff --git a/modules/core/02-client/keeper/client.go b/modules/core/02-client/keeper/client.go
index fd260d65d98..271efb4d14b 100644
--- a/modules/core/02-client/keeper/client.go
+++ b/modules/core/02-client/keeper/client.go
@@ -16,6 +16,10 @@ import (
func (k Keeper) CreateClient(
ctx sdk.Context, clientState exported.ClientState, consensusState exported.ConsensusState,
) (string, error) {
+ if clientState.ClientType() == exported.Localhost {
+ return "", sdkerrors.Wrapf(types.ErrInvalidClientType, "cannot create client of type: %s", clientState.ClientType())
+ }
+
params := k.GetParams(ctx)
if !params.IsAllowedClient(clientState.ClientType()) {
return "", sdkerrors.Wrapf(
@@ -53,7 +57,7 @@ func (k Keeper) UpdateClient(ctx sdk.Context, clientID string, clientMsg exporte
clientStore := k.ClientStore(ctx, clientID)
- if status := clientState.Status(ctx, clientStore, k.cdc); status != exported.Active {
+ if status := k.GetClientStatus(ctx, clientState, clientID); status != exported.Active {
return sdkerrors.Wrapf(types.ErrClientNotActive, "cannot update client (%s) with status %s", clientID, status)
}
@@ -114,7 +118,7 @@ func (k Keeper) UpgradeClient(ctx sdk.Context, clientID string, upgradedClient e
clientStore := k.ClientStore(ctx, clientID)
- if status := clientState.Status(ctx, clientStore, k.cdc); status != exported.Active {
+ if status := k.GetClientStatus(ctx, clientState, clientID); status != exported.Active {
return sdkerrors.Wrapf(types.ErrClientNotActive, "cannot upgrade client (%s) with status %s", clientID, status)
}
diff --git a/modules/core/02-client/keeper/client_test.go b/modules/core/02-client/keeper/client_test.go
index 94b5fed855a..ce338d25853 100644
--- a/modules/core/02-client/keeper/client_test.go
+++ b/modules/core/02-client/keeper/client_test.go
@@ -13,22 +13,39 @@ import (
"github.com/cosmos/ibc-go/v7/modules/core/exported"
solomachine "github.com/cosmos/ibc-go/v7/modules/light-clients/06-solomachine"
ibctm "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint"
+ localhost "github.com/cosmos/ibc-go/v7/modules/light-clients/09-localhost"
ibctesting "github.com/cosmos/ibc-go/v7/testing"
)
func (suite *KeeperTestSuite) TestCreateClient() {
cases := []struct {
- msg string
- clientState exported.ClientState
- expPass bool
+ msg string
+ clientState exported.ClientState
+ consensusState exported.ConsensusState
+ expPass bool
}{
- {"success", ibctm.NewClientState(testChainID, ibctm.DefaultTrustLevel, trustingPeriod, ubdPeriod, maxClockDrift, testClientHeight, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath), true},
- {"client type not supported", solomachine.NewClientState(0, &solomachine.ConsensusState{PublicKey: suite.solomachine.ConsensusState().PublicKey, Diversifier: suite.solomachine.Diversifier, Timestamp: suite.solomachine.Time}), false},
+ {
+ "success: 07-tendermint client type supported",
+ ibctm.NewClientState(testChainID, ibctm.DefaultTrustLevel, trustingPeriod, ubdPeriod, maxClockDrift, testClientHeight, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath),
+ suite.consensusState,
+ true,
+ },
+ {
+ "success: 06-solomachine client type supported",
+ solomachine.NewClientState(0, &solomachine.ConsensusState{PublicKey: suite.solomachine.ConsensusState().PublicKey, Diversifier: suite.solomachine.Diversifier, Timestamp: suite.solomachine.Time}),
+ &solomachine.ConsensusState{PublicKey: suite.solomachine.ConsensusState().PublicKey, Diversifier: suite.solomachine.Diversifier, Timestamp: suite.solomachine.Time},
+ true,
+ },
+ {
+ "failure: 09-localhost client type not supported",
+ localhost.NewClientState(clienttypes.GetSelfHeight(suite.ctx)),
+ nil,
+ false,
+ },
}
for i, tc := range cases {
-
- clientID, err := suite.keeper.CreateClient(suite.ctx, tc.clientState, suite.consensusState)
+ clientID, err := suite.keeper.CreateClient(suite.ctx, tc.clientState, tc.consensusState)
if tc.expPass {
suite.Require().NoError(err, "valid test case %d failed: %s", i, tc.msg)
suite.Require().NotNil(clientID, "valid test case %d failed: %s", i, tc.msg)
diff --git a/modules/core/02-client/keeper/grpc_query.go b/modules/core/02-client/keeper/grpc_query.go
index dd462cbca29..a8e1104323c 100644
--- a/modules/core/02-client/keeper/grpc_query.go
+++ b/modules/core/02-client/keeper/grpc_query.go
@@ -245,8 +245,7 @@ func (q Keeper) ClientStatus(c context.Context, req *types.QueryClientStatusRequ
)
}
- clientStore := q.ClientStore(ctx, req.ClientId)
- status := clientState.Status(ctx, clientStore, q.cdc)
+ status := q.GetClientStatus(ctx, clientState, req.ClientId)
return &types.QueryClientStatusResponse{
Status: status.String(),
diff --git a/modules/core/02-client/keeper/grpc_query_test.go b/modules/core/02-client/keeper/grpc_query_test.go
index 50683e98723..6b48f466aba 100644
--- a/modules/core/02-client/keeper/grpc_query_test.go
+++ b/modules/core/02-client/keeper/grpc_query_test.go
@@ -111,13 +111,17 @@ func (suite *KeeperTestSuite) TestQueryClientStates() {
{
"empty pagination",
func() {
+ localhost := types.NewIdentifiedClientState(exported.LocalhostClientID, suite.chainA.GetClientState(exported.LocalhostClientID))
+ expClientStates = types.IdentifiedClientStates{localhost}
req = &types.QueryClientStatesRequest{}
},
true,
},
{
- "success, no results",
+ "success, only localhost",
func() {
+ localhost := types.NewIdentifiedClientState(exported.LocalhostClientID, suite.chainA.GetClientState(exported.LocalhostClientID))
+ expClientStates = types.IdentifiedClientStates{localhost}
req = &types.QueryClientStatesRequest{
Pagination: &query.PageRequest{
Limit: 3,
@@ -139,11 +143,12 @@ func (suite *KeeperTestSuite) TestQueryClientStates() {
clientStateA1 := path1.EndpointA.GetClientState()
clientStateA2 := path2.EndpointA.GetClientState()
+ localhost := types.NewIdentifiedClientState(exported.LocalhostClientID, suite.chainA.GetClientState(exported.LocalhostClientID))
idcs := types.NewIdentifiedClientState(path1.EndpointA.ClientID, clientStateA1)
idcs2 := types.NewIdentifiedClientState(path2.EndpointA.ClientID, clientStateA2)
// order is sorted by client id
- expClientStates = types.IdentifiedClientStates{idcs, idcs2}.Sort()
+ expClientStates = types.IdentifiedClientStates{localhost, idcs, idcs2}.Sort()
req = &types.QueryClientStatesRequest{
Pagination: &query.PageRequest{
Limit: 20,
@@ -158,10 +163,10 @@ func (suite *KeeperTestSuite) TestQueryClientStates() {
for _, tc := range testCases {
suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
suite.SetupTest() // reset
+
tc.malleate()
ctx := sdk.WrapSDKContext(suite.chainA.GetContext())
-
res, err := suite.chainA.QueryServer.ClientStates(ctx, req)
if tc.expPass {
suite.Require().NoError(err)
diff --git a/modules/core/02-client/keeper/keeper.go b/modules/core/02-client/keeper/keeper.go
index a3ce022f9b0..54b5b49b66a 100644
--- a/modules/core/02-client/keeper/keeper.go
+++ b/modules/core/02-client/keeper/keeper.go
@@ -5,6 +5,8 @@ import (
"reflect"
"strings"
+ "github.com/cometbft/cometbft/libs/log"
+ "github.com/cometbft/cometbft/light"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/store/prefix"
storetypes "github.com/cosmos/cosmos-sdk/store/types"
@@ -12,14 +14,13 @@ import (
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
paramtypes "github.com/cosmos/cosmos-sdk/x/params/types"
upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
- "github.com/tendermint/tendermint/libs/log"
- "github.com/tendermint/tendermint/light"
"github.com/cosmos/ibc-go/v7/modules/core/02-client/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"
ibctm "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint"
+ localhost "github.com/cosmos/ibc-go/v7/modules/light-clients/09-localhost"
)
// Keeper represents a type that grants read and write permissions to any client
@@ -53,6 +54,17 @@ func (k Keeper) Logger(ctx sdk.Context) log.Logger {
return ctx.Logger().With("module", "x/"+exported.ModuleName+"/"+types.SubModuleName)
}
+// CreateLocalhostClient initialises the 09-localhost client state and sets it in state.
+func (k Keeper) CreateLocalhostClient(ctx sdk.Context) error {
+ var clientState localhost.ClientState
+ return clientState.Initialize(ctx, k.cdc, k.ClientStore(ctx, exported.LocalhostClientID), nil)
+}
+
+// UpdateLocalhostClient updates the 09-localhost client to the latest block height and chain ID.
+func (k Keeper) UpdateLocalhostClient(ctx sdk.Context, clientState exported.ClientState) []exported.Height {
+ return clientState.UpdateState(ctx, k.cdc, k.ClientStore(ctx, exported.LocalhostClientID), nil)
+}
+
// GenerateClientIdentifier returns the next client identifier.
func (k Keeper) GenerateClientIdentifier(ctx sdk.Context, clientType string) string {
nextClientSeq := k.GetNextClientSequence(ctx)
@@ -67,7 +79,7 @@ func (k Keeper) GenerateClientIdentifier(ctx sdk.Context, clientType string) str
func (k Keeper) GetClientState(ctx sdk.Context, clientID string) (exported.ClientState, bool) {
store := k.ClientStore(ctx, clientID)
bz := store.Get(host.ClientStateKey())
- if bz == nil {
+ if len(bz) == 0 {
return nil, false
}
@@ -85,7 +97,7 @@ func (k Keeper) SetClientState(ctx sdk.Context, clientID string, clientState exp
func (k Keeper) GetClientConsensusState(ctx sdk.Context, clientID string, height exported.Height) (exported.ConsensusState, bool) {
store := k.ClientStore(ctx, clientID)
bz := store.Get(host.ConsensusStateKey(height))
- if bz == nil {
+ if len(bz) == 0 {
return nil, false
}
@@ -104,7 +116,7 @@ func (k Keeper) SetClientConsensusState(ctx sdk.Context, clientID string, height
func (k Keeper) GetNextClientSequence(ctx sdk.Context) uint64 {
store := ctx.KVStore(k.storeKey)
bz := store.Get([]byte(types.KeyNextClientSequence))
- if bz == nil {
+ if len(bz) == 0 {
panic("next client sequence is nil")
}
@@ -391,3 +403,12 @@ func (k Keeper) ClientStore(ctx sdk.Context, clientID string) sdk.KVStore {
clientPrefix := []byte(fmt.Sprintf("%s/%s/", host.KeyClientStorePrefix, clientID))
return prefix.NewStore(ctx.KVStore(k.storeKey), clientPrefix)
}
+
+// GetClientStatus returns the status for a given clientState. If the client type is not in the allowed
+// clients param field, Unauthorized is returned, otherwise the client state status is returned.
+func (k Keeper) GetClientStatus(ctx sdk.Context, clientState exported.ClientState, clientID string) exported.Status {
+ if !k.GetParams(ctx).IsAllowedClient(clientState.ClientType()) {
+ return exported.Unauthorized
+ }
+ return clientState.Status(ctx, k.ClientStore(ctx, clientID), k.cdc)
+}
diff --git a/modules/core/02-client/keeper/keeper_test.go b/modules/core/02-client/keeper/keeper_test.go
index 8e5cac289d4..839ee00553d 100644
--- a/modules/core/02-client/keeper/keeper_test.go
+++ b/modules/core/02-client/keeper/keeper_test.go
@@ -5,15 +5,15 @@ import (
"testing"
"time"
+ tmbytes "github.com/cometbft/cometbft/libs/bytes"
+ 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/codec"
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/stretchr/testify/suite"
- tmbytes "github.com/tendermint/tendermint/libs/bytes"
- tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
- tmtypes "github.com/tendermint/tendermint/types"
"github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper"
"github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
@@ -21,6 +21,7 @@ import (
"github.com/cosmos/ibc-go/v7/modules/core/exported"
solomachine "github.com/cosmos/ibc-go/v7/modules/light-clients/06-solomachine"
ibctm "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint"
+ localhost "github.com/cosmos/ibc-go/v7/modules/light-clients/09-localhost"
ibctesting "github.com/cosmos/ibc-go/v7/testing"
ibctestingmock "github.com/cosmos/ibc-go/v7/testing/mock"
"github.com/cosmos/ibc-go/v7/testing/simapp"
@@ -236,9 +237,10 @@ func (suite *KeeperTestSuite) TestValidateSelfClient() {
func (suite KeeperTestSuite) TestGetAllGenesisClients() { //nolint:govet // this is a test, we are okay with copying locks
clientIDs := []string{
- testClientID2, testClientID3, testClientID,
+ exported.LocalhostClientID, testClientID2, testClientID3, testClientID,
}
expClients := []exported.ClientState{
+ localhost.NewClientState(types.GetSelfHeight(suite.chainA.GetContext())),
ibctm.NewClientState(testChainID, ibctm.DefaultTrustLevel, trustingPeriod, ubdPeriod, maxClockDrift, types.ZeroHeight(), commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath),
ibctm.NewClientState(testChainID, ibctm.DefaultTrustLevel, trustingPeriod, ubdPeriod, maxClockDrift, types.ZeroHeight(), commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath),
ibctm.NewClientState(testChainID, ibctm.DefaultTrustLevel, trustingPeriod, ubdPeriod, maxClockDrift, types.ZeroHeight(), commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath),
@@ -418,22 +420,31 @@ func (suite KeeperTestSuite) TestIterateClientStates() { //nolint:govet // this
testCases := []struct {
name string
prefix []byte
- expClientIDs []string
+ expClientIDs func() []string
}{
{
"all clientIDs",
nil,
- append(expSMClientIDs, expTMClientIDs...),
+ func() []string {
+ allClientIDs := []string{exported.LocalhostClientID}
+ allClientIDs = append(allClientIDs, expSMClientIDs...)
+ allClientIDs = append(allClientIDs, expTMClientIDs...)
+ return allClientIDs
+ },
},
{
"tendermint clientIDs",
[]byte(exported.Tendermint),
- expTMClientIDs,
+ func() []string {
+ return expTMClientIDs
+ },
},
{
"solo machine clientIDs",
[]byte(exported.Solomachine),
- expSMClientIDs,
+ func() []string {
+ return expSMClientIDs
+ },
},
}
@@ -446,7 +457,7 @@ func (suite KeeperTestSuite) TestIterateClientStates() { //nolint:govet // this
return false
})
- suite.Require().Equal(tc.expClientIDs, clientIDs)
+ suite.Require().ElementsMatch(tc.expClientIDs(), clientIDs)
})
}
}
diff --git a/modules/core/02-client/keeper/migrations.go b/modules/core/02-client/keeper/migrations.go
index ad3587ae901..b8290133042 100644
--- a/modules/core/02-client/keeper/migrations.go
+++ b/modules/core/02-client/keeper/migrations.go
@@ -16,7 +16,7 @@ func NewMigrator(keeper Keeper) Migrator {
return Migrator{keeper: keeper}
}
-// Migrate2to3 migrates from version 2 to 3.
+// Migrate2to3 migrates from consensus version 2 to 3.
// This migration
// - migrates solo machine client states from v2 to v3 protobuf definition
// - prunes solo machine consensus states
@@ -25,3 +25,9 @@ func NewMigrator(keeper Keeper) Migrator {
func (m Migrator) Migrate2to3(ctx sdk.Context) error {
return v7.MigrateStore(ctx, m.keeper.storeKey, m.keeper.cdc, m.keeper)
}
+
+// Migrate3to4 migrates from consensus version 3 to 4.
+// This migration enables the localhost client.
+func (m Migrator) Migrate3to4(ctx sdk.Context) error {
+ return v7.MigrateLocalhostClient(ctx, m.keeper)
+}
diff --git a/modules/core/02-client/keeper/proposal.go b/modules/core/02-client/keeper/proposal.go
index a8c0d072ab3..024939080a4 100644
--- a/modules/core/02-client/keeper/proposal.go
+++ b/modules/core/02-client/keeper/proposal.go
@@ -25,7 +25,7 @@ func (k Keeper) ClientUpdateProposal(ctx sdk.Context, p *types.ClientUpdatePropo
subjectClientStore := k.ClientStore(ctx, p.SubjectClientId)
- if status := subjectClientState.Status(ctx, subjectClientStore, k.cdc); status == exported.Active {
+ if status := k.GetClientStatus(ctx, subjectClientState, p.SubjectClientId); status == exported.Active {
return sdkerrors.Wrap(types.ErrInvalidUpdateClientProposal, "cannot update Active subject client")
}
@@ -40,7 +40,7 @@ func (k Keeper) ClientUpdateProposal(ctx sdk.Context, p *types.ClientUpdatePropo
substituteClientStore := k.ClientStore(ctx, p.SubstituteClientId)
- if status := substituteClientState.Status(ctx, substituteClientStore, k.cdc); status != exported.Active {
+ if status := k.GetClientStatus(ctx, substituteClientState, p.SubstituteClientId); status != exported.Active {
return sdkerrors.Wrapf(types.ErrClientNotActive, "substitute client is not Active, status is %s", status)
}
diff --git a/modules/core/02-client/migrations/v7/expected_keepers.go b/modules/core/02-client/migrations/v7/expected_keepers.go
index 6d424cc0370..f36be5fabe2 100644
--- a/modules/core/02-client/migrations/v7/expected_keepers.go
+++ b/modules/core/02-client/migrations/v7/expected_keepers.go
@@ -11,4 +11,5 @@ type ClientKeeper interface {
GetClientState(ctx sdk.Context, clientID string) (exported.ClientState, bool)
SetClientState(ctx sdk.Context, clientID string, clientState exported.ClientState)
ClientStore(ctx sdk.Context, clientID string) sdk.KVStore
+ CreateLocalhostClient(ctx sdk.Context) error
}
diff --git a/modules/core/02-client/migrations/v7/localhost.go b/modules/core/02-client/migrations/v7/localhost.go
new file mode 100644
index 00000000000..49709b9db9f
--- /dev/null
+++ b/modules/core/02-client/migrations/v7/localhost.go
@@ -0,0 +1,10 @@
+package v7
+
+import (
+ sdk "github.com/cosmos/cosmos-sdk/types"
+)
+
+// MigrateLocalhostClient initialises the 09-localhost client state and sets it in state.
+func MigrateLocalhostClient(ctx sdk.Context, clientKeeper ClientKeeper) error {
+ return clientKeeper.CreateLocalhostClient(ctx)
+}
diff --git a/modules/core/02-client/migrations/v7/localhost_test.go b/modules/core/02-client/migrations/v7/localhost_test.go
new file mode 100644
index 00000000000..fc09523a94c
--- /dev/null
+++ b/modules/core/02-client/migrations/v7/localhost_test.go
@@ -0,0 +1,26 @@
+package v7_test
+
+import (
+ v7 "github.com/cosmos/ibc-go/v7/modules/core/02-client/migrations/v7"
+ host "github.com/cosmos/ibc-go/v7/modules/core/24-host"
+ "github.com/cosmos/ibc-go/v7/modules/core/exported"
+)
+
+func (suite *MigrationsV7TestSuite) TestMigrateLocalhostClient() {
+ suite.SetupTest()
+
+ // note: explicitly remove the localhost client before running migration handler
+ clientStore := suite.chainA.GetSimApp().GetIBCKeeper().ClientKeeper.ClientStore(suite.chainA.GetContext(), exported.LocalhostClientID)
+ clientStore.Delete(host.ClientStateKey())
+
+ clientState, found := suite.chainA.GetSimApp().GetIBCKeeper().ClientKeeper.GetClientState(suite.chainA.GetContext(), exported.LocalhostClientID)
+ suite.Require().False(found)
+ suite.Require().Nil(clientState)
+
+ err := v7.MigrateLocalhostClient(suite.chainA.GetContext(), suite.chainA.GetSimApp().GetIBCKeeper().ClientKeeper)
+ suite.Require().NoError(err)
+
+ clientState, found = suite.chainA.GetSimApp().GetIBCKeeper().ClientKeeper.GetClientState(suite.chainA.GetContext(), exported.LocalhostClientID)
+ suite.Require().True(found)
+ suite.Require().NotNil(clientState)
+}
diff --git a/modules/core/02-client/migrations/v7/store.go b/modules/core/02-client/migrations/v7/store.go
index e62a975341b..b70e541e671 100644
--- a/modules/core/02-client/migrations/v7/store.go
+++ b/modules/core/02-client/migrations/v7/store.go
@@ -58,7 +58,7 @@ func handleSolomachineMigration(ctx sdk.Context, store sdk.KVStore, cdc codec.Bi
clientStore := clientKeeper.ClientStore(ctx, clientID)
bz := clientStore.Get(host.ClientStateKey())
- if bz == nil {
+ if len(bz) == 0 {
return sdkerrors.Wrapf(clienttypes.ErrClientNotFound, "clientID %s", clientID)
}
diff --git a/modules/core/02-client/types/client.pb.go b/modules/core/02-client/types/client.pb.go
index 6b4f4351245..badaa482f47 100644
--- a/modules/core/02-client/types/client.pb.go
+++ b/modules/core/02-client/types/client.pb.go
@@ -341,7 +341,9 @@ var xxx_messageInfo_Height proto.InternalMessageInfo
// Params defines the set of IBC light client parameters.
type Params struct {
- // allowed_clients defines the list of allowed client state types.
+ // allowed_clients defines the list of allowed client state types which can be created
+ // and interacted with. If a client type is removed from the allowed clients list, usage
+ // of this client will be disabled until it is added again to the list.
AllowedClients []string `protobuf:"bytes,1,rep,name=allowed_clients,json=allowedClients,proto3" json:"allowed_clients,omitempty" yaml:"allowed_clients"`
}
diff --git a/modules/core/02-client/types/errors.go b/modules/core/02-client/types/errors.go
index 0c2bd65f339..39792948ae5 100644
--- a/modules/core/02-client/types/errors.go
+++ b/modules/core/02-client/types/errors.go
@@ -34,4 +34,6 @@ var (
ErrInvalidSubstitute = sdkerrors.Register(SubModuleName, 27, "invalid client state substitute")
ErrInvalidUpgradeProposal = sdkerrors.Register(SubModuleName, 28, "invalid upgrade proposal")
ErrClientNotActive = sdkerrors.Register(SubModuleName, 29, "client state is not active")
+ ErrFailedMembershipVerification = sdkerrors.Register(SubModuleName, 30, "membership verification failed")
+ ErrFailedNonMembershipVerification = sdkerrors.Register(SubModuleName, 31, "non-membership verification failed")
)
diff --git a/modules/core/02-client/types/genesis_test.go b/modules/core/02-client/types/genesis_test.go
index 16c87f58411..41254d148e3 100644
--- a/modules/core/02-client/types/genesis_test.go
+++ b/modules/core/02-client/types/genesis_test.go
@@ -3,7 +3,7 @@ package types_test
import (
"time"
- tmtypes "github.com/tendermint/tendermint/types"
+ tmtypes "github.com/cometbft/cometbft/types"
client "github.com/cosmos/ibc-go/v7/modules/core/02-client"
"github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
diff --git a/modules/core/02-client/types/keys.go b/modules/core/02-client/types/keys.go
index 1a70f196d5f..9a2c67df3c5 100644
--- a/modules/core/02-client/types/keys.go
+++ b/modules/core/02-client/types/keys.go
@@ -9,6 +9,7 @@ import (
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
host "github.com/cosmos/ibc-go/v7/modules/core/24-host"
+ "github.com/cosmos/ibc-go/v7/modules/core/exported"
)
const (
@@ -49,6 +50,10 @@ func IsValidClientID(clientID string) bool {
// ParseClientIdentifier parses the client type and sequence from the client identifier.
func ParseClientIdentifier(clientID string) (string, uint64, error) {
+ if clientID == exported.LocalhostClientID {
+ return clientID, 0, nil
+ }
+
if !IsClientIDFormat(clientID) {
return "", 0, sdkerrors.Wrapf(host.ErrInvalidID, "invalid client identifier %s is not in format: `{client-type}-{N}`", clientID)
}
diff --git a/modules/core/02-client/types/params.go b/modules/core/02-client/types/params.go
index 21ad31007df..b0c43b156ef 100644
--- a/modules/core/02-client/types/params.go
+++ b/modules/core/02-client/types/params.go
@@ -10,8 +10,8 @@ import (
)
var (
- // DefaultAllowedClients are "06-solomachine" and "07-tendermint"
- DefaultAllowedClients = []string{exported.Solomachine, exported.Tendermint}
+ // DefaultAllowedClients are the default clients for the AllowedClients parameter.
+ DefaultAllowedClients = []string{exported.Solomachine, exported.Tendermint, exported.Localhost}
// KeyAllowedClients is store's key for AllowedClients Params
KeyAllowedClients = []byte("AllowedClients")
@@ -29,7 +29,7 @@ func NewParams(allowedClients ...string) Params {
}
}
-// DefaultParams is the default parameter configuration for the ibc-client module
+// DefaultParams is the default parameter configuration for the ibc-client module.
func DefaultParams() Params {
return NewParams(DefaultAllowedClients...)
}
diff --git a/modules/core/03-connection/genesis.go b/modules/core/03-connection/genesis.go
index 44a8585bcdb..df8fb28945e 100644
--- a/modules/core/03-connection/genesis.go
+++ b/modules/core/03-connection/genesis.go
@@ -19,6 +19,8 @@ func InitGenesis(ctx sdk.Context, k keeper.Keeper, gs types.GenesisState) {
}
k.SetNextConnectionSequence(ctx, gs.NextConnectionSequence)
k.SetParams(ctx, gs.Params)
+
+ k.CreateSentinelLocalhostConnection(ctx)
}
// ExportGenesis returns the ibc connection submodule's exported genesis.
diff --git a/modules/core/03-connection/keeper/grpc_query_test.go b/modules/core/03-connection/keeper/grpc_query_test.go
index dd9531fb43e..0573e3e02aa 100644
--- a/modules/core/03-connection/keeper/grpc_query_test.go
+++ b/modules/core/03-connection/keeper/grpc_query_test.go
@@ -87,9 +87,15 @@ func (suite *KeeperTestSuite) TestQueryConnection() {
}
func (suite *KeeperTestSuite) TestQueryConnections() {
+ suite.chainA.App.GetIBCKeeper().ConnectionKeeper.CreateSentinelLocalhostConnection(suite.chainA.GetContext())
+ localhostConn, found := suite.chainA.App.GetIBCKeeper().ConnectionKeeper.GetConnection(suite.chainA.GetContext(), exported.LocalhostConnectionID)
+ suite.Require().True(found)
+
+ identifiedConn := types.NewIdentifiedConnection(exported.LocalhostConnectionID, localhostConn)
+
var (
req *types.QueryConnectionsRequest
- expConnections = []*types.IdentifiedConnection{}
+ expConnections = []*types.IdentifiedConnection{&identifiedConn}
)
testCases := []struct {
@@ -137,11 +143,11 @@ func (suite *KeeperTestSuite) TestQueryConnections() {
iconn2 := types.NewIdentifiedConnection(path2.EndpointA.ConnectionID, conn2)
iconn3 := types.NewIdentifiedConnection(path3.EndpointA.ConnectionID, conn3)
- expConnections = []*types.IdentifiedConnection{&iconn1, &iconn2, &iconn3}
+ expConnections = []*types.IdentifiedConnection{&iconn1, &iconn2, &iconn3, &identifiedConn}
req = &types.QueryConnectionsRequest{
Pagination: &query.PageRequest{
- Limit: 3,
+ Limit: 4,
CountTotal: true,
},
}
diff --git a/modules/core/03-connection/keeper/handshake.go b/modules/core/03-connection/keeper/handshake.go
index 93fe4a9bf6d..53417a2aa9e 100644
--- a/modules/core/03-connection/keeper/handshake.go
+++ b/modules/core/03-connection/keeper/handshake.go
@@ -32,6 +32,15 @@ func (k Keeper) ConnOpenInit(
versions = []exported.Version{version}
}
+ clientState, found := k.clientKeeper.GetClientState(ctx, clientID)
+ if !found {
+ return "", sdkerrors.Wrapf(clienttypes.ErrClientNotFound, "clientID (%s)", clientID)
+ }
+
+ if status := k.clientKeeper.GetClientStatus(ctx, clientState, clientID); status != exported.Active {
+ return "", sdkerrors.Wrapf(clienttypes.ErrClientNotActive, "client (%s) status is %s", clientID, status)
+ }
+
connectionID := k.GenerateConnectionIdentifier(ctx)
if err := k.addConnectionToClient(ctx, clientID, connectionID); err != nil {
return "", err
@@ -74,6 +83,8 @@ func (k Keeper) ConnOpenTry(
// generate a new connection
connectionID := k.GenerateConnectionIdentifier(ctx)
+ // check that the consensus height the counterparty chain is using to store a representation
+ // of this chain's consensus state is at a height in the past
selfHeight := clienttypes.GetSelfHeight(ctx)
if consensusHeight.GTE(selfHeight) {
return "", sdkerrors.Wrapf(
@@ -163,7 +174,8 @@ func (k Keeper) ConnOpenAck(
proofHeight exported.Height, // height that relayer constructed proofTry
consensusHeight exported.Height, // latest height of chainA that chainB has stored on its chainA client
) error {
- // Check that chainB client hasn't stored invalid height
+ // check that the consensus height the counterparty chain is using to store a representation
+ // of this chain's consensus state is at a height in the past
selfHeight := clienttypes.GetSelfHeight(ctx)
if consensusHeight.GTE(selfHeight) {
return sdkerrors.Wrapf(
diff --git a/modules/core/03-connection/keeper/handshake_test.go b/modules/core/03-connection/keeper/handshake_test.go
index c14ec879204..5751c9e531a 100644
--- a/modules/core/03-connection/keeper/handshake_test.go
+++ b/modules/core/03-connection/keeper/handshake_test.go
@@ -15,10 +15,11 @@ import (
// chainB which is yet UNINITIALIZED
func (suite *KeeperTestSuite) TestConnOpenInit() {
var (
- path *ibctesting.Path
- version *types.Version
- delayPeriod uint64
- emptyConnBID bool
+ path *ibctesting.Path
+ version *types.Version
+ delayPeriod uint64
+ emptyConnBID bool
+ expErrorMsgSubstring string
)
testCases := []struct {
@@ -45,6 +46,17 @@ func (suite *KeeperTestSuite) TestConnOpenInit() {
// set path.EndpointA.ClientID to invalid client identifier
path.EndpointA.ClientID = "clientidentifier"
}, false},
+ {
+ msg: "unauthorized client",
+ expPass: false,
+ malleate: func() {
+ expErrorMsgSubstring = "status is Unauthorized"
+ // remove client from allowed list
+ params := suite.chainA.App.GetIBCKeeper().ClientKeeper.GetParams(suite.chainA.GetContext())
+ params.AllowedClients = []string{}
+ suite.chainA.App.GetIBCKeeper().ClientKeeper.SetParams(suite.chainA.GetContext(), params)
+ },
+ },
}
for _, tc := range testCases {
@@ -53,6 +65,7 @@ func (suite *KeeperTestSuite) TestConnOpenInit() {
suite.SetupTest() // reset
emptyConnBID = false // must be explicitly changed
version = nil // must be explicitly changed
+ expErrorMsgSubstring = ""
path = ibctesting.NewPath(suite.chainA, suite.chainB)
suite.coordinator.SetupClients(path)
@@ -70,6 +83,7 @@ func (suite *KeeperTestSuite) TestConnOpenInit() {
suite.Require().Equal(types.FormatConnectionIdentifier(0), connectionID)
} else {
suite.Require().Error(err)
+ suite.Contains(err.Error(), expErrorMsgSubstring)
suite.Require().Equal("", connectionID)
}
})
diff --git a/modules/core/03-connection/keeper/keeper.go b/modules/core/03-connection/keeper/keeper.go
index 9a4335148d9..58d22176d10 100644
--- a/modules/core/03-connection/keeper/keeper.go
+++ b/modules/core/03-connection/keeper/keeper.go
@@ -1,12 +1,12 @@
package keeper
import (
+ "github.com/cometbft/cometbft/libs/log"
"github.com/cosmos/cosmos-sdk/codec"
storetypes "github.com/cosmos/cosmos-sdk/store/types"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
paramtypes "github.com/cosmos/cosmos-sdk/x/params/types"
- "github.com/tendermint/tendermint/libs/log"
clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
"github.com/cosmos/ibc-go/v7/modules/core/03-connection/types"
@@ -66,7 +66,7 @@ func (k Keeper) GenerateConnectionIdentifier(ctx sdk.Context) string {
func (k Keeper) GetConnection(ctx sdk.Context, connectionID string) (types.ConnectionEnd, bool) {
store := ctx.KVStore(k.storeKey)
bz := store.Get(host.ConnectionKey(connectionID))
- if bz == nil {
+ if len(bz) == 0 {
return types.ConnectionEnd{}, false
}
@@ -76,6 +76,13 @@ func (k Keeper) GetConnection(ctx sdk.Context, connectionID string) (types.Conne
return connection, true
}
+// HasConnection returns a true if the connection with the given identifier
+// exists in the store.
+func (k Keeper) HasConnection(ctx sdk.Context, connectionID string) bool {
+ store := ctx.KVStore(k.storeKey)
+ return store.Has(host.ConnectionKey(connectionID))
+}
+
// SetConnection sets a connection to the store
func (k Keeper) SetConnection(ctx sdk.Context, connectionID string, connection types.ConnectionEnd) {
store := ctx.KVStore(k.storeKey)
@@ -106,7 +113,7 @@ func (k Keeper) GetTimestampAtHeight(ctx sdk.Context, connection types.Connectio
func (k Keeper) GetClientConnectionPaths(ctx sdk.Context, clientID string) ([]string, bool) {
store := ctx.KVStore(k.storeKey)
bz := store.Get(host.ClientConnectionsKey(clientID))
- if bz == nil {
+ if len(bz) == 0 {
return nil, false
}
@@ -127,7 +134,7 @@ func (k Keeper) SetClientConnectionPaths(ctx sdk.Context, clientID string, paths
func (k Keeper) GetNextConnectionSequence(ctx sdk.Context) uint64 {
store := ctx.KVStore(k.storeKey)
bz := store.Get([]byte(types.KeyNextConnectionSequence))
- if bz == nil {
+ if len(bz) == 0 {
panic("next connection sequence is nil")
}
@@ -189,6 +196,14 @@ func (k Keeper) GetAllConnections(ctx sdk.Context) (connections []types.Identifi
return connections
}
+// CreateSentinelLocalhostConnection creates and sets the sentinel localhost connection end in the IBC store.
+func (k Keeper) CreateSentinelLocalhostConnection(ctx sdk.Context) {
+ counterparty := types.NewCounterparty(exported.LocalhostClientID, exported.LocalhostConnectionID, commitmenttypes.NewMerklePrefix(k.GetCommitmentPrefix().Bytes()))
+ connectionEnd := types.NewConnectionEnd(types.OPEN, exported.LocalhostClientID, counterparty, types.ExportedVersionsToProto(types.GetCompatibleVersions()), 0)
+
+ k.SetConnection(ctx, exported.LocalhostConnectionID, connectionEnd)
+}
+
// addConnectionToClient is used to add a connection identifier to the set of
// connections associated with a client.
func (k Keeper) addConnectionToClient(ctx sdk.Context, clientID, connectionID string) error {
diff --git a/modules/core/03-connection/keeper/keeper_test.go b/modules/core/03-connection/keeper/keeper_test.go
index a82573788d3..dbae331d690 100644
--- a/modules/core/03-connection/keeper/keeper_test.go
+++ b/modules/core/03-connection/keeper/keeper_test.go
@@ -7,6 +7,7 @@ import (
"github.com/stretchr/testify/suite"
"github.com/cosmos/ibc-go/v7/modules/core/03-connection/types"
+ commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types"
"github.com/cosmos/ibc-go/v7/modules/core/exported"
ibctesting "github.com/cosmos/ibc-go/v7/testing"
)
@@ -79,7 +80,11 @@ func (suite KeeperTestSuite) TestGetAllConnections() { //nolint:govet // this is
iconn1 := types.NewIdentifiedConnection(path1.EndpointA.ConnectionID, conn1)
iconn2 := types.NewIdentifiedConnection(path2.EndpointA.ConnectionID, conn2)
- expConnections := []types.IdentifiedConnection{iconn1, iconn2}
+ suite.chainA.App.GetIBCKeeper().ConnectionKeeper.CreateSentinelLocalhostConnection(suite.chainA.GetContext())
+ localhostConn, found := suite.chainA.App.GetIBCKeeper().ConnectionKeeper.GetConnection(suite.chainA.GetContext(), exported.LocalhostConnectionID)
+ suite.Require().True(found)
+
+ expConnections := []types.IdentifiedConnection{iconn1, iconn2, types.NewIdentifiedConnection(exported.LocalhostConnectionID, localhostConn)}
connections := suite.chainA.App.GetIBCKeeper().ConnectionKeeper.GetAllConnections(suite.chainA.GetContext())
suite.Require().Len(connections, len(expConnections))
@@ -156,3 +161,18 @@ func (suite *KeeperTestSuite) TestGetTimestampAtHeight() {
})
}
}
+
+func (suite *KeeperTestSuite) TestLocalhostConnectionEndCreation() {
+ ctx := suite.chainA.GetContext()
+ connectionKeeper := suite.chainA.App.GetIBCKeeper().ConnectionKeeper
+ connectionKeeper.CreateSentinelLocalhostConnection(ctx)
+
+ connectionEnd, found := connectionKeeper.GetConnection(ctx, exported.LocalhostConnectionID)
+
+ suite.Require().True(found)
+ suite.Require().Equal(types.OPEN, connectionEnd.State)
+ suite.Require().Equal(exported.LocalhostClientID, connectionEnd.ClientId)
+ suite.Require().Equal(types.ExportedVersionsToProto(types.GetCompatibleVersions()), connectionEnd.Versions)
+ expectedCounterParty := types.NewCounterparty(exported.LocalhostClientID, exported.LocalhostConnectionID, commitmenttypes.NewMerklePrefix(connectionKeeper.GetCommitmentPrefix().Bytes()))
+ suite.Require().Equal(expectedCounterParty, connectionEnd.Counterparty)
+}
diff --git a/modules/core/03-connection/keeper/migrations.go b/modules/core/03-connection/keeper/migrations.go
new file mode 100644
index 00000000000..9965eab28ca
--- /dev/null
+++ b/modules/core/03-connection/keeper/migrations.go
@@ -0,0 +1,24 @@
+package keeper
+
+import (
+ sdk "github.com/cosmos/cosmos-sdk/types"
+
+ connectionv7 "github.com/cosmos/ibc-go/v7/modules/core/03-connection/migrations/v7"
+)
+
+// Migrator is a struct for handling in-place store migrations.
+type Migrator struct {
+ keeper Keeper
+}
+
+// NewMigrator returns a new Migrator.
+func NewMigrator(keeper Keeper) Migrator {
+ return Migrator{keeper: keeper}
+}
+
+// Migrate3to4 migrates from version 3 to 4.
+// This migration writes the sentinel localhost connection end to state.
+func (m Migrator) Migrate3to4(ctx sdk.Context) error {
+ connectionv7.MigrateLocalhostConnection(ctx, m.keeper)
+ return nil
+}
diff --git a/modules/core/03-connection/keeper/verify.go b/modules/core/03-connection/keeper/verify.go
index 2a505ec317e..e55970a9de7 100644
--- a/modules/core/03-connection/keeper/verify.go
+++ b/modules/core/03-connection/keeper/verify.go
@@ -24,19 +24,17 @@ func (k Keeper) VerifyClientState(
clientState exported.ClientState,
) error {
clientID := connection.GetClientID()
- clientStore := k.clientKeeper.ClientStore(ctx, clientID)
-
- targetClient, found := k.clientKeeper.GetClientState(ctx, clientID)
- if !found {
- return sdkerrors.Wrap(clienttypes.ErrClientNotFound, clientID)
+ targetClient, clientStore, err := k.getClientStateAndVerificationStore(ctx, clientID)
+ if err != nil {
+ return err
}
- if status := targetClient.Status(ctx, clientStore, k.cdc); status != exported.Active {
+ if status := k.clientKeeper.GetClientStatus(ctx, targetClient, clientID); status != exported.Active {
return sdkerrors.Wrapf(clienttypes.ErrClientNotActive, "client (%s) status is %s", clientID, status)
}
merklePath := commitmenttypes.NewMerklePath(host.FullClientStatePath(connection.GetCounterparty().GetClientID()))
- merklePath, err := commitmenttypes.ApplyPrefix(connection.GetCounterparty().GetPrefix(), merklePath)
+ merklePath, err = commitmenttypes.ApplyPrefix(connection.GetCounterparty().GetPrefix(), merklePath)
if err != nil {
return err
}
@@ -68,19 +66,17 @@ func (k Keeper) VerifyClientConsensusState(
consensusState exported.ConsensusState,
) error {
clientID := connection.GetClientID()
- clientStore := k.clientKeeper.ClientStore(ctx, clientID)
-
- clientState, found := k.clientKeeper.GetClientState(ctx, clientID)
- if !found {
- return sdkerrors.Wrap(clienttypes.ErrClientNotFound, clientID)
+ clientState, clientStore, err := k.getClientStateAndVerificationStore(ctx, clientID)
+ if err != nil {
+ return err
}
- if status := clientState.Status(ctx, clientStore, k.cdc); status != exported.Active {
+ if status := k.clientKeeper.GetClientStatus(ctx, clientState, clientID); status != exported.Active {
return sdkerrors.Wrapf(clienttypes.ErrClientNotActive, "client (%s) status is %s", clientID, status)
}
merklePath := commitmenttypes.NewMerklePath(host.FullConsensusStatePath(connection.GetCounterparty().GetClientID(), consensusHeight))
- merklePath, err := commitmenttypes.ApplyPrefix(connection.GetCounterparty().GetPrefix(), merklePath)
+ merklePath, err = commitmenttypes.ApplyPrefix(connection.GetCounterparty().GetPrefix(), merklePath)
if err != nil {
return err
}
@@ -112,19 +108,17 @@ func (k Keeper) VerifyConnectionState(
counterpartyConnection exported.ConnectionI, // opposite connection
) error {
clientID := connection.GetClientID()
- clientStore := k.clientKeeper.ClientStore(ctx, clientID)
-
- clientState, found := k.clientKeeper.GetClientState(ctx, clientID)
- if !found {
- return sdkerrors.Wrap(clienttypes.ErrClientNotFound, clientID)
+ clientState, clientStore, err := k.getClientStateAndVerificationStore(ctx, clientID)
+ if err != nil {
+ return err
}
- if status := clientState.Status(ctx, clientStore, k.cdc); status != exported.Active {
+ if status := k.clientKeeper.GetClientStatus(ctx, clientState, clientID); status != exported.Active {
return sdkerrors.Wrapf(clienttypes.ErrClientNotActive, "client (%s) status is %s", clientID, status)
}
merklePath := commitmenttypes.NewMerklePath(host.ConnectionPath(connectionID))
- merklePath, err := commitmenttypes.ApplyPrefix(connection.GetCounterparty().GetPrefix(), merklePath)
+ merklePath, err = commitmenttypes.ApplyPrefix(connection.GetCounterparty().GetPrefix(), merklePath)
if err != nil {
return err
}
@@ -162,19 +156,17 @@ func (k Keeper) VerifyChannelState(
channel exported.ChannelI,
) error {
clientID := connection.GetClientID()
- clientStore := k.clientKeeper.ClientStore(ctx, clientID)
-
- clientState, found := k.clientKeeper.GetClientState(ctx, clientID)
- if !found {
- return sdkerrors.Wrap(clienttypes.ErrClientNotFound, clientID)
+ clientState, clientStore, err := k.getClientStateAndVerificationStore(ctx, clientID)
+ if err != nil {
+ return err
}
- if status := clientState.Status(ctx, clientStore, k.cdc); status != exported.Active {
+ if status := k.clientKeeper.GetClientStatus(ctx, clientState, clientID); status != exported.Active {
return sdkerrors.Wrapf(clienttypes.ErrClientNotActive, "client (%s) status is %s", clientID, status)
}
merklePath := commitmenttypes.NewMerklePath(host.ChannelPath(portID, channelID))
- merklePath, err := commitmenttypes.ApplyPrefix(connection.GetCounterparty().GetPrefix(), merklePath)
+ merklePath, err = commitmenttypes.ApplyPrefix(connection.GetCounterparty().GetPrefix(), merklePath)
if err != nil {
return err
}
@@ -213,14 +205,12 @@ func (k Keeper) VerifyPacketCommitment(
commitmentBytes []byte,
) error {
clientID := connection.GetClientID()
- clientStore := k.clientKeeper.ClientStore(ctx, clientID)
-
- clientState, found := k.clientKeeper.GetClientState(ctx, clientID)
- if !found {
- return sdkerrors.Wrap(clienttypes.ErrClientNotFound, clientID)
+ clientState, clientStore, err := k.getClientStateAndVerificationStore(ctx, clientID)
+ if err != nil {
+ return err
}
- if status := clientState.Status(ctx, clientStore, k.cdc); status != exported.Active {
+ if status := k.clientKeeper.GetClientStatus(ctx, clientState, clientID); status != exported.Active {
return sdkerrors.Wrapf(clienttypes.ErrClientNotActive, "client (%s) status is %s", clientID, status)
}
@@ -229,7 +219,7 @@ func (k Keeper) VerifyPacketCommitment(
blockDelay := k.getBlockDelay(ctx, connection)
merklePath := commitmenttypes.NewMerklePath(host.PacketCommitmentPath(portID, channelID, sequence))
- merklePath, err := commitmenttypes.ApplyPrefix(connection.GetCounterparty().GetPrefix(), merklePath)
+ merklePath, err = commitmenttypes.ApplyPrefix(connection.GetCounterparty().GetPrefix(), merklePath)
if err != nil {
return err
}
@@ -258,14 +248,12 @@ func (k Keeper) VerifyPacketAcknowledgement(
acknowledgement []byte,
) error {
clientID := connection.GetClientID()
- clientStore := k.clientKeeper.ClientStore(ctx, clientID)
-
- clientState, found := k.clientKeeper.GetClientState(ctx, clientID)
- if !found {
- return sdkerrors.Wrap(clienttypes.ErrClientNotFound, clientID)
+ clientState, clientStore, err := k.getClientStateAndVerificationStore(ctx, clientID)
+ if err != nil {
+ return err
}
- if status := clientState.Status(ctx, clientStore, k.cdc); status != exported.Active {
+ if status := k.clientKeeper.GetClientStatus(ctx, clientState, clientID); status != exported.Active {
return sdkerrors.Wrapf(clienttypes.ErrClientNotActive, "client (%s) status is %s", clientID, status)
}
@@ -274,7 +262,7 @@ func (k Keeper) VerifyPacketAcknowledgement(
blockDelay := k.getBlockDelay(ctx, connection)
merklePath := commitmenttypes.NewMerklePath(host.PacketAcknowledgementPath(portID, channelID, sequence))
- merklePath, err := commitmenttypes.ApplyPrefix(connection.GetCounterparty().GetPrefix(), merklePath)
+ merklePath, err = commitmenttypes.ApplyPrefix(connection.GetCounterparty().GetPrefix(), merklePath)
if err != nil {
return err
}
@@ -303,14 +291,12 @@ func (k Keeper) VerifyPacketReceiptAbsence(
sequence uint64,
) error {
clientID := connection.GetClientID()
- clientStore := k.clientKeeper.ClientStore(ctx, clientID)
-
- clientState, found := k.clientKeeper.GetClientState(ctx, clientID)
- if !found {
- return sdkerrors.Wrap(clienttypes.ErrClientNotFound, clientID)
+ clientState, clientStore, err := k.getClientStateAndVerificationStore(ctx, clientID)
+ if err != nil {
+ return err
}
- if status := clientState.Status(ctx, clientStore, k.cdc); status != exported.Active {
+ if status := k.clientKeeper.GetClientStatus(ctx, clientState, clientID); status != exported.Active {
return sdkerrors.Wrapf(clienttypes.ErrClientNotActive, "client (%s) status is %s", clientID, status)
}
@@ -319,7 +305,7 @@ func (k Keeper) VerifyPacketReceiptAbsence(
blockDelay := k.getBlockDelay(ctx, connection)
merklePath := commitmenttypes.NewMerklePath(host.PacketReceiptPath(portID, channelID, sequence))
- merklePath, err := commitmenttypes.ApplyPrefix(connection.GetCounterparty().GetPrefix(), merklePath)
+ merklePath, err = commitmenttypes.ApplyPrefix(connection.GetCounterparty().GetPrefix(), merklePath)
if err != nil {
return err
}
@@ -347,14 +333,12 @@ func (k Keeper) VerifyNextSequenceRecv(
nextSequenceRecv uint64,
) error {
clientID := connection.GetClientID()
- clientStore := k.clientKeeper.ClientStore(ctx, clientID)
-
- clientState, found := k.clientKeeper.GetClientState(ctx, clientID)
- if !found {
- return sdkerrors.Wrap(clienttypes.ErrClientNotFound, clientID)
+ clientState, clientStore, err := k.getClientStateAndVerificationStore(ctx, clientID)
+ if err != nil {
+ return err
}
- if status := clientState.Status(ctx, clientStore, k.cdc); status != exported.Active {
+ if status := k.clientKeeper.GetClientStatus(ctx, clientState, clientID); status != exported.Active {
return sdkerrors.Wrapf(clienttypes.ErrClientNotActive, "client (%s) status is %s", clientID, status)
}
@@ -363,7 +347,7 @@ func (k Keeper) VerifyNextSequenceRecv(
blockDelay := k.getBlockDelay(ctx, connection)
merklePath := commitmenttypes.NewMerklePath(host.NextSequenceRecvPath(portID, channelID))
- merklePath, err := commitmenttypes.ApplyPrefix(connection.GetCounterparty().GetPrefix(), merklePath)
+ merklePath, err = commitmenttypes.ApplyPrefix(connection.GetCounterparty().GetPrefix(), merklePath)
if err != nil {
return err
}
@@ -393,3 +377,19 @@ func (k Keeper) getBlockDelay(ctx sdk.Context, connection exported.ConnectionI)
timeDelay := connection.GetDelayPeriod()
return uint64(math.Ceil(float64(timeDelay) / float64(expectedTimePerBlock)))
}
+
+// getClientStateAndVerificationStore returns the client state and associated KVStore for the provided client identifier.
+// If the client type is localhost then the core IBC KVStore is returned, otherwise the client prefixed store is returned.
+func (k Keeper) getClientStateAndVerificationStore(ctx sdk.Context, clientID string) (exported.ClientState, sdk.KVStore, error) {
+ clientState, found := k.clientKeeper.GetClientState(ctx, clientID)
+ if !found {
+ return nil, nil, sdkerrors.Wrap(clienttypes.ErrClientNotFound, clientID)
+ }
+
+ store := k.clientKeeper.ClientStore(ctx, clientID)
+ if clientID == exported.LocalhostClientID {
+ store = ctx.KVStore(k.storeKey)
+ }
+
+ return clientState, store, nil
+}
diff --git a/modules/core/03-connection/migrations/v7/expected_keepers.go b/modules/core/03-connection/migrations/v7/expected_keepers.go
new file mode 100644
index 00000000000..8427e2cc2bf
--- /dev/null
+++ b/modules/core/03-connection/migrations/v7/expected_keepers.go
@@ -0,0 +1,10 @@
+package v7
+
+import (
+ sdk "github.com/cosmos/cosmos-sdk/types"
+)
+
+// ConnectionKeeper expected IBC connection keeper
+type ConnectionKeeper interface {
+ CreateSentinelLocalhostConnection(ctx sdk.Context)
+}
diff --git a/modules/core/03-connection/migrations/v7/localhost.go b/modules/core/03-connection/migrations/v7/localhost.go
new file mode 100644
index 00000000000..76f768402de
--- /dev/null
+++ b/modules/core/03-connection/migrations/v7/localhost.go
@@ -0,0 +1,11 @@
+package v7
+
+import (
+ sdk "github.com/cosmos/cosmos-sdk/types"
+)
+
+// MigrateLocalhostConnection creates the sentinel localhost connection end to enable
+// localhost ibc functionality.
+func MigrateLocalhostConnection(ctx sdk.Context, connectionKeeper ConnectionKeeper) {
+ connectionKeeper.CreateSentinelLocalhostConnection(ctx)
+}
diff --git a/modules/core/03-connection/types/expected_keepers.go b/modules/core/03-connection/types/expected_keepers.go
index 5945766726d..d9b8dec6599 100644
--- a/modules/core/03-connection/types/expected_keepers.go
+++ b/modules/core/03-connection/types/expected_keepers.go
@@ -8,6 +8,7 @@ import (
// ClientKeeper expected account IBC client keeper
type ClientKeeper interface {
+ GetClientStatus(ctx sdk.Context, clientState exported.ClientState, clientID string) exported.Status
GetClientState(ctx sdk.Context, clientID string) (exported.ClientState, bool)
GetClientConsensusState(ctx sdk.Context, clientID string, height exported.Height) (exported.ConsensusState, bool)
GetSelfConsensusState(ctx sdk.Context, height exported.Height) (exported.ConsensusState, error)
diff --git a/modules/core/03-connection/types/msgs.go b/modules/core/03-connection/types/msgs.go
index b4b119837cd..96a9f84a743 100644
--- a/modules/core/03-connection/types/msgs.go
+++ b/modules/core/03-connection/types/msgs.go
@@ -43,6 +43,10 @@ func NewMsgConnectionOpenInit(
// ValidateBasic implements sdk.Msg.
func (msg MsgConnectionOpenInit) ValidateBasic() error {
+ if msg.ClientId == exported.LocalhostClientID {
+ return sdkerrors.Wrap(clienttypes.ErrInvalidClientType, "localhost connection handshakes are disallowed")
+ }
+
if err := host.ClientIdentifierValidator(msg.ClientId); err != nil {
return sdkerrors.Wrap(err, "invalid client ID")
}
@@ -102,6 +106,10 @@ func NewMsgConnectionOpenTry(
// ValidateBasic implements sdk.Msg
func (msg MsgConnectionOpenTry) ValidateBasic() error {
+ if msg.ClientId == exported.LocalhostClientID {
+ return sdkerrors.Wrap(clienttypes.ErrInvalidClientType, "localhost connection handshakes are disallowed")
+ }
+
if msg.PreviousConnectionId != "" {
return sdkerrors.Wrap(ErrInvalidConnectionIdentifier, "previous connection identifier must be empty, this field has been deprecated as crossing hellos are no longer supported")
}
diff --git a/modules/core/03-connection/types/msgs_test.go b/modules/core/03-connection/types/msgs_test.go
index a89ba23a681..bc75adf6116 100644
--- a/modules/core/03-connection/types/msgs_test.go
+++ b/modules/core/03-connection/types/msgs_test.go
@@ -5,17 +5,18 @@ import (
"testing"
"time"
+ dbm "github.com/cometbft/cometbft-db"
+ abci "github.com/cometbft/cometbft/abci/types"
+ log "github.com/cometbft/cometbft/libs/log"
"github.com/cosmos/cosmos-sdk/store/iavl"
"github.com/cosmos/cosmos-sdk/store/rootmulti"
storetypes "github.com/cosmos/cosmos-sdk/store/types"
"github.com/stretchr/testify/suite"
- abci "github.com/tendermint/tendermint/abci/types"
- log "github.com/tendermint/tendermint/libs/log"
- dbm "github.com/tendermint/tm-db"
clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
"github.com/cosmos/ibc-go/v7/modules/core/03-connection/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/ibc-go/v7/testing"
"github.com/cosmos/ibc-go/v7/testing/simapp"
@@ -88,6 +89,7 @@ func (suite *MsgTestSuite) TestNewMsgConnectionOpenInit() {
msg *types.MsgConnectionOpenInit
expPass bool
}{
+ {"localhost client ID", types.NewMsgConnectionOpenInit(exported.LocalhostClientID, "clienttotest", prefix, version, 500, signer), false},
{"invalid client ID", types.NewMsgConnectionOpenInit("test/iris", "clienttotest", prefix, version, 500, signer), false},
{"invalid counterparty client ID", types.NewMsgConnectionOpenInit("clienttotest", "(clienttotest)", prefix, version, 500, signer), false},
{"invalid counterparty connection ID", &types.MsgConnectionOpenInit{connectionID, types.NewCounterparty("clienttotest", "connectiontotest", prefix), version, 500, signer}, false},
@@ -113,7 +115,7 @@ func (suite *MsgTestSuite) TestNewMsgConnectionOpenTry() {
clientState := ibctm.NewClientState(
chainID, ibctm.DefaultTrustLevel, ibctesting.TrustingPeriod, ibctesting.UnbondingPeriod, ibctesting.MaxClockDrift, clientHeight, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath,
)
- any, err := clienttypes.PackClientState(clientState)
+ protoAny, err := clienttypes.PackClientState(clientState)
suite.Require().NoError(err)
// Pack consensus state into any to test unpacking error
@@ -133,7 +135,8 @@ func (suite *MsgTestSuite) TestNewMsgConnectionOpenTry() {
msg *types.MsgConnectionOpenTry
expPass bool
}{
- {"non empty connection ID", &types.MsgConnectionOpenTry{"connection-0", "clienttotesta", any, counterparty, 500, []*types.Version{ibctesting.ConnectionVersion}, clientHeight, suite.proof, suite.proof, suite.proof, clientHeight, signer, nil}, false},
+ {"non empty connection ID", &types.MsgConnectionOpenTry{"connection-0", "clienttotesta", protoAny, counterparty, 500, []*types.Version{ibctesting.ConnectionVersion}, clientHeight, suite.proof, suite.proof, suite.proof, clientHeight, signer, nil}, false},
+ {"localhost client ID", types.NewMsgConnectionOpenTry(exported.LocalhostClientID, "connectiontotest", "clienttotest", clientState, prefix, []*types.Version{ibctesting.ConnectionVersion}, 500, suite.proof, suite.proof, suite.proof, clientHeight, clientHeight, signer), false},
{"invalid client ID", types.NewMsgConnectionOpenTry("test/iris", "connectiontotest", "clienttotest", clientState, prefix, []*types.Version{ibctesting.ConnectionVersion}, 500, suite.proof, suite.proof, suite.proof, clientHeight, clientHeight, signer), false},
{"invalid counterparty connection ID", types.NewMsgConnectionOpenTry("clienttotesta", "ibc/test", "clienttotest", clientState, prefix, []*types.Version{ibctesting.ConnectionVersion}, 500, suite.proof, suite.proof, suite.proof, clientHeight, clientHeight, signer), false},
{"invalid counterparty client ID", types.NewMsgConnectionOpenTry("clienttotesta", "connectiontotest", "test/conn1", clientState, prefix, []*types.Version{ibctesting.ConnectionVersion}, 500, suite.proof, suite.proof, suite.proof, clientHeight, clientHeight, signer), false},
diff --git a/modules/core/04-channel/keeper/events.go b/modules/core/04-channel/keeper/events.go
index ddefecc697e..78dfdbe1644 100644
--- a/modules/core/04-channel/keeper/events.go
+++ b/modules/core/04-channel/keeper/events.go
@@ -138,7 +138,8 @@ func EmitSendPacketEvent(ctx sdk.Context, packet exported.PacketI, channel types
sdk.NewAttribute(types.AttributeKeyChannelOrdering, channel.Ordering.String()),
// we only support 1-hop packets now, and that is the most important hop for a relayer
// (is it going to a chain I am connected to)
- sdk.NewAttribute(types.AttributeKeyConnection, channel.ConnectionHops[0]),
+ sdk.NewAttribute(types.AttributeKeyConnection, channel.ConnectionHops[0]), //nolint:staticcheck // DEPRECATED
+ sdk.NewAttribute(types.AttributeKeyConnectionID, channel.ConnectionHops[0]),
),
sdk.NewEvent(
sdk.EventTypeMessage,
@@ -165,7 +166,8 @@ func EmitRecvPacketEvent(ctx sdk.Context, packet exported.PacketI, channel types
sdk.NewAttribute(types.AttributeKeyChannelOrdering, channel.Ordering.String()),
// we only support 1-hop packets now, and that is the most important hop for a relayer
// (is it going to a chain I am connected to)
- sdk.NewAttribute(types.AttributeKeyConnection, channel.ConnectionHops[0]),
+ sdk.NewAttribute(types.AttributeKeyConnection, channel.ConnectionHops[0]), //nolint:staticcheck // DEPRECATED
+ sdk.NewAttribute(types.AttributeKeyConnectionID, channel.ConnectionHops[0]),
),
sdk.NewEvent(
sdk.EventTypeMessage,
@@ -192,7 +194,8 @@ func EmitWriteAcknowledgementEvent(ctx sdk.Context, packet exported.PacketI, cha
sdk.NewAttribute(types.AttributeKeyAckHex, hex.EncodeToString(acknowledgement)),
// we only support 1-hop packets now, and that is the most important hop for a relayer
// (is it going to a chain I am connected to)
- sdk.NewAttribute(types.AttributeKeyConnection, channel.ConnectionHops[0]),
+ sdk.NewAttribute(types.AttributeKeyConnection, channel.ConnectionHops[0]), //nolint:staticcheck // DEPRECATED
+ sdk.NewAttribute(types.AttributeKeyConnectionID, channel.ConnectionHops[0]),
),
sdk.NewEvent(
sdk.EventTypeMessage,
@@ -217,7 +220,8 @@ func EmitAcknowledgePacketEvent(ctx sdk.Context, packet exported.PacketI, channe
sdk.NewAttribute(types.AttributeKeyChannelOrdering, channel.Ordering.String()),
// we only support 1-hop packets now, and that is the most important hop for a relayer
// (is it going to a chain I am connected to)
- sdk.NewAttribute(types.AttributeKeyConnection, channel.ConnectionHops[0]),
+ sdk.NewAttribute(types.AttributeKeyConnection, channel.ConnectionHops[0]), //nolint:staticcheck // DEPRECATED
+ sdk.NewAttribute(types.AttributeKeyConnectionID, channel.ConnectionHops[0]),
),
sdk.NewEvent(
sdk.EventTypeMessage,
@@ -239,6 +243,7 @@ func EmitTimeoutPacketEvent(ctx sdk.Context, packet exported.PacketI, channel ty
sdk.NewAttribute(types.AttributeKeySrcChannel, packet.GetSourceChannel()),
sdk.NewAttribute(types.AttributeKeyDstPort, packet.GetDestPort()),
sdk.NewAttribute(types.AttributeKeyDstChannel, packet.GetDestChannel()),
+ sdk.NewAttribute(types.AttributeKeyConnectionID, channel.ConnectionHops[0]),
sdk.NewAttribute(types.AttributeKeyChannelOrdering, channel.Ordering.String()),
),
sdk.NewEvent(
diff --git a/modules/core/04-channel/keeper/grpc_query.go b/modules/core/04-channel/keeper/grpc_query.go
index 6385076de75..9cea705de01 100644
--- a/modules/core/04-channel/keeper/grpc_query.go
+++ b/modules/core/04-channel/keeper/grpc_query.go
@@ -398,18 +398,55 @@ func (q Keeper) UnreceivedPackets(c context.Context, req *types.QueryUnreceivedP
ctx := sdk.UnwrapSDKContext(c)
- unreceivedSequences := []uint64{}
+ channel, found := q.GetChannel(sdk.UnwrapSDKContext(c), req.PortId, req.ChannelId)
+ if !found {
+ return nil, status.Error(
+ codes.NotFound,
+ sdkerrors.Wrapf(types.ErrChannelNotFound, "port-id: %s, channel-id %s", req.PortId, req.ChannelId).Error(),
+ )
+ }
- for i, seq := range req.PacketCommitmentSequences {
- if seq == 0 {
- return nil, status.Errorf(codes.InvalidArgument, "packet sequence %d cannot be 0", i)
- }
+ var unreceivedSequences []uint64
+ switch channel.Ordering {
+ case types.UNORDERED:
+ for i, seq := range req.PacketCommitmentSequences {
+ // filter for invalid sequences to ensure they are not included in the response value.
+ if seq == 0 {
+ return nil, status.Errorf(codes.InvalidArgument, "packet sequence %d cannot be 0", i)
+ }
- // if packet receipt exists on the receiving chain, then packet has already been received
- if _, found := q.GetPacketReceipt(ctx, req.PortId, req.ChannelId, seq); !found {
- unreceivedSequences = append(unreceivedSequences, seq)
+ // if the packet receipt does not exist, then it is unreceived
+ if _, found := q.GetPacketReceipt(ctx, req.PortId, req.ChannelId, seq); !found {
+ unreceivedSequences = append(unreceivedSequences, seq)
+ }
+ }
+ case types.ORDERED:
+ nextSequenceRecv, found := q.GetNextSequenceRecv(ctx, req.PortId, req.ChannelId)
+ if !found {
+ return nil, status.Error(
+ codes.NotFound,
+ sdkerrors.Wrapf(
+ types.ErrSequenceReceiveNotFound,
+ "destination port: %s, destination channel: %s", req.PortId, req.ChannelId,
+ ).Error(),
+ )
}
+ for i, seq := range req.PacketCommitmentSequences {
+ // filter for invalid sequences to ensure they are not included in the response value.
+ if seq == 0 {
+ return nil, status.Errorf(codes.InvalidArgument, "packet sequence %d cannot be 0", i)
+ }
+
+ // Any sequence greater than or equal to the next sequence to be received is not received.
+ if seq >= nextSequenceRecv {
+ unreceivedSequences = append(unreceivedSequences, seq)
+ }
+ }
+ default:
+ return nil, status.Error(
+ codes.InvalidArgument,
+ sdkerrors.Wrapf(types.ErrInvalidChannelOrdering, "channel order %s is not supported", channel.Ordering.String()).Error())
}
selfHeight := clienttypes.GetSelfHeight(ctx)
diff --git a/modules/core/04-channel/keeper/grpc_query_test.go b/modules/core/04-channel/keeper/grpc_query_test.go
index 0082663a243..e782ce75e1a 100644
--- a/modules/core/04-channel/keeper/grpc_query_test.go
+++ b/modules/core/04-channel/keeper/grpc_query_test.go
@@ -1112,7 +1112,7 @@ func (suite *KeeperTestSuite) TestQueryPacketAcknowledgements() {
func (suite *KeeperTestSuite) TestQueryUnreceivedPackets() {
var (
req *types.QueryUnreceivedPacketsRequest
- expSeq = []uint64{}
+ expSeq = []uint64(nil)
)
testCases := []struct {
@@ -1158,6 +1158,46 @@ func (suite *KeeperTestSuite) TestQueryUnreceivedPackets() {
},
false,
},
+ {
+ "invalid seq, ordered channel",
+ func() {
+ path := ibctesting.NewPath(suite.chainA, suite.chainB)
+ path.SetChannelOrdered()
+ suite.coordinator.Setup(path)
+
+ req = &types.QueryUnreceivedPacketsRequest{
+ PortId: path.EndpointA.ChannelConfig.PortID,
+ ChannelId: path.EndpointA.ChannelID,
+ PacketCommitmentSequences: []uint64{0},
+ }
+ },
+ false,
+ },
+ {
+ "channel not found",
+ func() {
+ req = &types.QueryUnreceivedPacketsRequest{
+ PortId: "invalid-port-id",
+ ChannelId: "invalid-channel-id",
+ }
+ },
+ false,
+ },
+ {
+ "basic success empty packet commitments",
+ func() {
+ path := ibctesting.NewPath(suite.chainA, suite.chainB)
+ suite.coordinator.Setup(path)
+
+ expSeq = []uint64(nil)
+ req = &types.QueryUnreceivedPacketsRequest{
+ PortId: path.EndpointA.ChannelConfig.PortID,
+ ChannelId: path.EndpointA.ChannelID,
+ PacketCommitmentSequences: []uint64{},
+ }
+ },
+ true,
+ },
{
"basic success unreceived packet commitments",
func() {
@@ -1183,7 +1223,7 @@ func (suite *KeeperTestSuite) TestQueryUnreceivedPackets() {
suite.chainA.App.GetIBCKeeper().ChannelKeeper.SetPacketReceipt(suite.chainA.GetContext(), path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, 1)
- expSeq = []uint64{}
+ expSeq = []uint64(nil)
req = &types.QueryUnreceivedPacketsRequest{
PortId: path.EndpointA.ChannelConfig.PortID,
ChannelId: path.EndpointA.ChannelID,
@@ -1197,7 +1237,7 @@ func (suite *KeeperTestSuite) TestQueryUnreceivedPackets() {
func() {
path := ibctesting.NewPath(suite.chainA, suite.chainB)
suite.coordinator.Setup(path)
- expSeq = []uint64{} // reset
+ expSeq = []uint64(nil) // reset
packetCommitments := []uint64{}
// set packet receipt for every other sequence
@@ -1219,6 +1259,60 @@ func (suite *KeeperTestSuite) TestQueryUnreceivedPackets() {
},
true,
},
+ {
+ "basic success empty packet commitments, ordered channel",
+ func() {
+ path := ibctesting.NewPath(suite.chainA, suite.chainB)
+ path.SetChannelOrdered()
+ suite.coordinator.Setup(path)
+
+ expSeq = []uint64(nil)
+ req = &types.QueryUnreceivedPacketsRequest{
+ PortId: path.EndpointA.ChannelConfig.PortID,
+ ChannelId: path.EndpointA.ChannelID,
+ PacketCommitmentSequences: []uint64{},
+ }
+ },
+ true,
+ },
+ {
+ "basic success unreceived packet commitments, ordered channel",
+ func() {
+ path := ibctesting.NewPath(suite.chainA, suite.chainB)
+ path.SetChannelOrdered()
+ suite.coordinator.Setup(path)
+
+ // Note: NextSequenceRecv is set to 1 on channel creation.
+ expSeq = []uint64{1}
+ req = &types.QueryUnreceivedPacketsRequest{
+ PortId: path.EndpointA.ChannelConfig.PortID,
+ ChannelId: path.EndpointA.ChannelID,
+ PacketCommitmentSequences: []uint64{1},
+ }
+ },
+ true,
+ },
+ {
+ "basic success multiple unreceived packet commitments, ordered channel",
+ func() {
+ path := ibctesting.NewPath(suite.chainA, suite.chainB)
+ path.SetChannelOrdered()
+ suite.coordinator.Setup(path)
+
+ // Exercise scenario from issue #1532. NextSequenceRecv is 5, packet commitments provided are 2, 7, 9, 10.
+ // Packet sequence 2 is already received so only sequences 7, 9, 10 should be considered unreceived.
+ expSeq = []uint64{7, 9, 10}
+ packetCommitments := []uint64{2, 7, 9, 10}
+ suite.chainA.App.GetIBCKeeper().ChannelKeeper.SetNextSequenceRecv(suite.chainA.GetContext(), path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, 5)
+
+ req = &types.QueryUnreceivedPacketsRequest{
+ PortId: path.EndpointA.ChannelConfig.PortID,
+ ChannelId: path.EndpointA.ChannelID,
+ PacketCommitmentSequences: packetCommitments,
+ }
+ },
+ true,
+ },
}
for _, tc := range testCases {
diff --git a/modules/core/04-channel/keeper/handshake.go b/modules/core/04-channel/keeper/handshake.go
index 922b681f104..94cce64b8f9 100644
--- a/modules/core/04-channel/keeper/handshake.go
+++ b/modules/core/04-channel/keeper/handshake.go
@@ -8,6 +8,7 @@ import (
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/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"
"github.com/cosmos/ibc-go/v7/modules/core/04-channel/types"
porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types"
@@ -50,6 +51,15 @@ func (k Keeper) ChanOpenInit(
)
}
+ clientState, found := k.clientKeeper.GetClientState(ctx, connectionEnd.ClientId)
+ if !found {
+ return "", nil, sdkerrors.Wrapf(clienttypes.ErrClientNotFound, "clientID (%s)", connectionEnd.ClientId)
+ }
+
+ if status := k.clientKeeper.GetClientStatus(ctx, clientState, connectionEnd.ClientId); status != exported.Active {
+ return "", nil, sdkerrors.Wrapf(clienttypes.ErrClientNotActive, "client (%s) status is %s", connectionEnd.ClientId, status)
+ }
+
if !k.portKeeper.Authenticate(ctx, portCap, portID) {
return "", nil, sdkerrors.Wrapf(porttypes.ErrInvalidPort, "caller does not own port capability for port ID %s", portID)
}
@@ -401,6 +411,15 @@ func (k Keeper) ChanCloseInit(
return sdkerrors.Wrap(connectiontypes.ErrConnectionNotFound, channel.ConnectionHops[0])
}
+ clientState, found := k.clientKeeper.GetClientState(ctx, connectionEnd.ClientId)
+ if !found {
+ return sdkerrors.Wrapf(clienttypes.ErrClientNotFound, "clientID (%s)", connectionEnd.ClientId)
+ }
+
+ if status := k.clientKeeper.GetClientStatus(ctx, clientState, connectionEnd.ClientId); status != exported.Active {
+ return sdkerrors.Wrapf(clienttypes.ErrClientNotActive, "client (%s) status is %s", connectionEnd.ClientId, status)
+ }
+
if connectionEnd.GetState() != int32(connectiontypes.OPEN) {
return sdkerrors.Wrapf(
connectiontypes.ErrInvalidConnectionState,
diff --git a/modules/core/04-channel/keeper/handshake_test.go b/modules/core/04-channel/keeper/handshake_test.go
index bf77d7ed530..8c721d1f438 100644
--- a/modules/core/04-channel/keeper/handshake_test.go
+++ b/modules/core/04-channel/keeper/handshake_test.go
@@ -25,9 +25,10 @@ type testCase = struct {
// can succeed.
func (suite *KeeperTestSuite) TestChanOpenInit() {
var (
- path *ibctesting.Path
- features []string
- portCap *capabilitytypes.Capability
+ path *ibctesting.Path
+ features []string
+ portCap *capabilitytypes.Capability
+ expErrorMsgSubstring string
)
testCases := []testCase{
@@ -85,6 +86,22 @@ func (suite *KeeperTestSuite) TestChanOpenInit() {
suite.chainA.CreatePortCapability(suite.chainA.GetSimApp().ScopedIBCMockKeeper, ibctesting.MockPort)
portCap = suite.chainA.GetPortCapability(ibctesting.MockPort)
}, true},
+ {
+ msg: "unauthorized client",
+ expPass: false,
+ malleate: func() {
+ expErrorMsgSubstring = "status is Unauthorized"
+ suite.coordinator.SetupConnections(path)
+
+ // remove client from allowed list
+ params := suite.chainA.App.GetIBCKeeper().ClientKeeper.GetParams(suite.chainA.GetContext())
+ params.AllowedClients = []string{}
+ suite.chainA.App.GetIBCKeeper().ClientKeeper.SetParams(suite.chainA.GetContext(), params)
+
+ suite.chainA.CreatePortCapability(suite.chainA.GetSimApp().ScopedIBCMockKeeper, ibctesting.MockPort)
+ portCap = suite.chainA.GetPortCapability(ibctesting.MockPort)
+ },
+ },
}
for _, tc := range testCases {
@@ -96,6 +113,7 @@ func (suite *KeeperTestSuite) TestChanOpenInit() {
path = ibctesting.NewPath(suite.chainA, suite.chainB)
path.EndpointA.ChannelConfig.Order = order
path.EndpointB.ChannelConfig.Order = order
+ expErrorMsgSubstring = ""
tc.malleate()
@@ -129,6 +147,7 @@ func (suite *KeeperTestSuite) TestChanOpenInit() {
suite.Require().Equal(chanCap.String(), cap.String(), "channel capability is not correct")
} else {
suite.Require().Error(err)
+ suite.Require().Contains(err.Error(), expErrorMsgSubstring)
suite.Require().Nil(cap)
suite.Require().Equal("", channelID)
}
@@ -598,8 +617,9 @@ func (suite *KeeperTestSuite) TestChanOpenConfirm() {
// ChanCloseInit. Both chains will use message passing to setup OPEN channels.
func (suite *KeeperTestSuite) TestChanCloseInit() {
var (
- path *ibctesting.Path
- channelCap *capabilitytypes.Capability
+ path *ibctesting.Path
+ channelCap *capabilitytypes.Capability
+ expErrorMsgSubstring string
)
testCases := []testCase{
@@ -655,6 +675,20 @@ func (suite *KeeperTestSuite) TestChanCloseInit() {
suite.coordinator.Setup(path)
channelCap = capabilitytypes.NewCapability(3)
}, false},
+ {
+ msg: "unauthorized client",
+ expPass: false,
+ malleate: func() {
+ suite.coordinator.Setup(path)
+ channelCap = suite.chainA.GetChannelCapability(path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID)
+
+ // remove client from allowed list
+ params := suite.chainA.App.GetIBCKeeper().ClientKeeper.GetParams(suite.chainA.GetContext())
+ params.AllowedClients = []string{}
+ suite.chainA.App.GetIBCKeeper().ClientKeeper.SetParams(suite.chainA.GetContext(), params)
+ expErrorMsgSubstring = "status is Unauthorized"
+ },
+ },
}
for _, tc := range testCases {
@@ -662,6 +696,7 @@ func (suite *KeeperTestSuite) TestChanCloseInit() {
suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
suite.SetupTest() // reset
path = ibctesting.NewPath(suite.chainA, suite.chainB)
+ expErrorMsgSubstring = ""
tc.malleate()
@@ -673,6 +708,7 @@ func (suite *KeeperTestSuite) TestChanCloseInit() {
suite.Require().NoError(err)
} else {
suite.Require().Error(err)
+ suite.Require().Contains(err.Error(), expErrorMsgSubstring)
}
})
}
diff --git a/modules/core/04-channel/keeper/keeper.go b/modules/core/04-channel/keeper/keeper.go
index d86f0d9bf5f..9322210333b 100644
--- a/modules/core/04-channel/keeper/keeper.go
+++ b/modules/core/04-channel/keeper/keeper.go
@@ -4,13 +4,13 @@ import (
"strconv"
"strings"
+ db "github.com/cometbft/cometbft-db"
+ "github.com/cometbft/cometbft/libs/log"
"github.com/cosmos/cosmos-sdk/codec"
storetypes "github.com/cosmos/cosmos-sdk/store/types"
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/tendermint/tendermint/libs/log"
- db "github.com/tendermint/tm-db"
clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
connectiontypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types"
@@ -66,11 +66,17 @@ func (k Keeper) GenerateChannelIdentifier(ctx sdk.Context) string {
return channelID
}
+// HasChannel true if the channel with the given identifiers exists in state.
+func (k Keeper) HasChannel(ctx sdk.Context, portID, channelID string) bool {
+ store := ctx.KVStore(k.storeKey)
+ return store.Has(host.ChannelKey(portID, channelID))
+}
+
// GetChannel returns a channel with a particular identifier binded to a specific port
func (k Keeper) GetChannel(ctx sdk.Context, portID, channelID string) (types.Channel, bool) {
store := ctx.KVStore(k.storeKey)
bz := store.Get(host.ChannelKey(portID, channelID))
- if bz == nil {
+ if len(bz) == 0 {
return types.Channel{}, false
}
@@ -100,7 +106,7 @@ func (k Keeper) GetAppVersion(ctx sdk.Context, portID, channelID string) (string
func (k Keeper) GetNextChannelSequence(ctx sdk.Context) uint64 {
store := ctx.KVStore(k.storeKey)
bz := store.Get([]byte(types.KeyNextChannelSequence))
- if bz == nil {
+ if len(bz) == 0 {
panic("next channel sequence is nil")
}
@@ -118,7 +124,7 @@ func (k Keeper) SetNextChannelSequence(ctx sdk.Context, sequence uint64) {
func (k Keeper) GetNextSequenceSend(ctx sdk.Context, portID, channelID string) (uint64, bool) {
store := ctx.KVStore(k.storeKey)
bz := store.Get(host.NextSequenceSendKey(portID, channelID))
- if bz == nil {
+ if len(bz) == 0 {
return 0, false
}
@@ -136,7 +142,7 @@ func (k Keeper) SetNextSequenceSend(ctx sdk.Context, portID, channelID string, s
func (k Keeper) GetNextSequenceRecv(ctx sdk.Context, portID, channelID string) (uint64, bool) {
store := ctx.KVStore(k.storeKey)
bz := store.Get(host.NextSequenceRecvKey(portID, channelID))
- if bz == nil {
+ if len(bz) == 0 {
return 0, false
}
@@ -154,7 +160,7 @@ func (k Keeper) SetNextSequenceRecv(ctx sdk.Context, portID, channelID string, s
func (k Keeper) GetNextSequenceAck(ctx sdk.Context, portID, channelID string) (uint64, bool) {
store := ctx.KVStore(k.storeKey)
bz := store.Get(host.NextSequenceAckKey(portID, channelID))
- if bz == nil {
+ if len(bz) == 0 {
return 0, false
}
@@ -172,7 +178,7 @@ func (k Keeper) SetNextSequenceAck(ctx sdk.Context, portID, channelID string, se
func (k Keeper) GetPacketReceipt(ctx sdk.Context, portID, channelID string, sequence uint64) (string, bool) {
store := ctx.KVStore(k.storeKey)
bz := store.Get(host.PacketReceiptKey(portID, channelID, sequence))
- if bz == nil {
+ if len(bz) == 0 {
return "", false
}
@@ -219,7 +225,7 @@ func (k Keeper) SetPacketAcknowledgement(ctx sdk.Context, portID, channelID stri
func (k Keeper) GetPacketAcknowledgement(ctx sdk.Context, portID, channelID string, sequence uint64) ([]byte, bool) {
store := ctx.KVStore(k.storeKey)
bz := store.Get(host.PacketAcknowledgementKey(portID, channelID, sequence))
- if bz == nil {
+ if len(bz) == 0 {
return nil, false
}
return bz, true
diff --git a/modules/core/04-channel/keeper/keeper_test.go b/modules/core/04-channel/keeper/keeper_test.go
index 0a262508ae5..92afaba9135 100644
--- a/modules/core/04-channel/keeper/keeper_test.go
+++ b/modules/core/04-channel/keeper/keeper_test.go
@@ -46,7 +46,7 @@ func (suite *KeeperTestSuite) TestSetChannel() {
suite.coordinator.SetupConnections(path)
// check for channel to be created on chainA
- _, found := suite.chainA.App.GetIBCKeeper().ChannelKeeper.GetChannel(suite.chainA.GetContext(), path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID)
+ found := suite.chainA.App.GetIBCKeeper().ChannelKeeper.HasChannel(suite.chainA.GetContext(), path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID)
suite.False(found)
path.SetChannelOrdered()
diff --git a/modules/core/04-channel/keeper/packet.go b/modules/core/04-channel/keeper/packet.go
index 7268c37c574..1db46f660e4 100644
--- a/modules/core/04-channel/keeper/packet.go
+++ b/modules/core/04-channel/keeper/packet.go
@@ -67,12 +67,11 @@ func (k Keeper) SendPacket(
clientState, found := k.clientKeeper.GetClientState(ctx, connectionEnd.GetClientID())
if !found {
- return 0, clienttypes.ErrConsensusStateNotFound
+ return 0, clienttypes.ErrClientNotFound
}
// prevent accidental sends with clients that cannot be updated
- clientStore := k.clientKeeper.ClientStore(ctx, connectionEnd.GetClientID())
- if status := clientState.Status(ctx, clientStore, k.cdc); status != exported.Active {
+ if status := k.clientKeeper.GetClientStatus(ctx, clientState, connectionEnd.GetClientID()); status != exported.Active {
return 0, sdkerrors.Wrapf(clienttypes.ErrClientNotActive, "cannot send packet using client (%s) with status %s", connectionEnd.GetClientID(), status)
}
diff --git a/modules/core/04-channel/types/acknowledgement_test.go b/modules/core/04-channel/types/acknowledgement_test.go
index 5a08f093500..d439573b078 100644
--- a/modules/core/04-channel/types/acknowledgement_test.go
+++ b/modules/core/04-channel/types/acknowledgement_test.go
@@ -3,10 +3,10 @@ package types_test
import (
"fmt"
+ abcitypes "github.com/cometbft/cometbft/abci/types"
+ tmprotostate "github.com/cometbft/cometbft/proto/tendermint/state"
+ tmstate "github.com/cometbft/cometbft/state"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
- abcitypes "github.com/tendermint/tendermint/abci/types"
- tmprotostate "github.com/tendermint/tendermint/proto/tendermint/state"
- tmstate "github.com/tendermint/tendermint/state"
"github.com/cosmos/ibc-go/v7/modules/core/04-channel/types"
)
diff --git a/modules/core/04-channel/types/expected_keepers.go b/modules/core/04-channel/types/expected_keepers.go
index 3a5460502c6..3c0b0b0198d 100644
--- a/modules/core/04-channel/types/expected_keepers.go
+++ b/modules/core/04-channel/types/expected_keepers.go
@@ -10,6 +10,7 @@ import (
// ClientKeeper expected account IBC client keeper
type ClientKeeper interface {
+ GetClientStatus(ctx sdk.Context, clientState exported.ClientState, clientID string) exported.Status
GetClientState(ctx sdk.Context, clientID string) (exported.ClientState, bool)
GetClientConsensusState(ctx sdk.Context, clientID string, height exported.Height) (exported.ConsensusState, bool)
ClientStore(ctx sdk.Context, clientID string) sdk.KVStore
diff --git a/modules/core/04-channel/types/msgs_test.go b/modules/core/04-channel/types/msgs_test.go
index 1aa2690209b..0d459dde865 100644
--- a/modules/core/04-channel/types/msgs_test.go
+++ b/modules/core/04-channel/types/msgs_test.go
@@ -4,14 +4,14 @@ import (
"fmt"
"testing"
+ dbm "github.com/cometbft/cometbft-db"
+ abci "github.com/cometbft/cometbft/abci/types"
+ log "github.com/cometbft/cometbft/libs/log"
"github.com/cosmos/cosmos-sdk/store/iavl"
"github.com/cosmos/cosmos-sdk/store/rootmulti"
storetypes "github.com/cosmos/cosmos-sdk/store/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/stretchr/testify/suite"
- abci "github.com/tendermint/tendermint/abci/types"
- log "github.com/tendermint/tendermint/libs/log"
- dbm "github.com/tendermint/tm-db"
clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
"github.com/cosmos/ibc-go/v7/modules/core/04-channel/types"
@@ -316,8 +316,8 @@ func (suite *TypesTestSuite) TestMsgRecvPacketValidateBasic() {
expPass bool
}{
{"success", types.NewMsgRecvPacket(packet, suite.proof, height, addr), true},
- {"proof contain empty proof", types.NewMsgRecvPacket(packet, emptyProof, height, addr), false},
{"missing signer address", types.NewMsgRecvPacket(packet, suite.proof, height, emptyAddr), false},
+ {"proof contain empty proof", types.NewMsgRecvPacket(packet, emptyProof, height, addr), false},
{"invalid packet", types.NewMsgRecvPacket(invalidPacket, suite.proof, height, addr), false},
}
@@ -380,9 +380,9 @@ func (suite *TypesTestSuite) TestMsgTimeoutOnCloseValidateBasic() {
}{
{"success", types.NewMsgTimeoutOnClose(packet, 1, suite.proof, suite.proof, height, addr), true},
{"seq 0", types.NewMsgTimeoutOnClose(packet, 0, suite.proof, suite.proof, height, addr), false},
+ {"signer address is empty", types.NewMsgTimeoutOnClose(packet, 1, suite.proof, suite.proof, height, emptyAddr), false},
{"empty proof", types.NewMsgTimeoutOnClose(packet, 1, emptyProof, suite.proof, height, addr), false},
{"empty proof close", types.NewMsgTimeoutOnClose(packet, 1, suite.proof, emptyProof, height, addr), false},
- {"signer address is empty", types.NewMsgTimeoutOnClose(packet, 1, suite.proof, suite.proof, height, emptyAddr), false},
{"invalid packet", types.NewMsgTimeoutOnClose(invalidPacket, 1, suite.proof, suite.proof, height, addr), false},
}
diff --git a/modules/core/04-channel/types/tx.pb.go b/modules/core/04-channel/types/tx.pb.go
index ec23399a695..cd1d8fdb256 100644
--- a/modules/core/04-channel/types/tx.pb.go
+++ b/modules/core/04-channel/types/tx.pb.go
@@ -205,7 +205,8 @@ var xxx_messageInfo_MsgChannelOpenTry proto.InternalMessageInfo
// MsgChannelOpenTryResponse defines the Msg/ChannelOpenTry response type.
type MsgChannelOpenTryResponse struct {
- Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"`
+ Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"`
+ ChannelId string `protobuf:"bytes,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty" yaml:"channel_id"`
}
func (m *MsgChannelOpenTryResponse) Reset() { *m = MsgChannelOpenTryResponse{} }
@@ -248,6 +249,13 @@ func (m *MsgChannelOpenTryResponse) GetVersion() string {
return ""
}
+func (m *MsgChannelOpenTryResponse) GetChannelId() string {
+ if m != nil {
+ return m.ChannelId
+ }
+ return ""
+}
+
// MsgChannelOpenAck defines a msg sent by a Relayer to Chain A to acknowledge
// the change of channel state to TRYOPEN on Chain B.
type MsgChannelOpenAck struct {
@@ -917,88 +925,89 @@ func init() {
func init() { proto.RegisterFile("ibc/core/channel/v1/tx.proto", fileDescriptor_bc4637e0ac3fc7b7) }
var fileDescriptor_bc4637e0ac3fc7b7 = []byte{
- // 1294 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0x5f, 0x6f, 0xda, 0x56,
- 0x14, 0xc7, 0x40, 0x21, 0x39, 0x74, 0x09, 0x31, 0x49, 0x4a, 0x4c, 0x82, 0x99, 0x1f, 0x9a, 0x28,
- 0x53, 0xa0, 0x49, 0x5b, 0x55, 0x8d, 0x26, 0x4d, 0x81, 0x51, 0x2d, 0xda, 0x92, 0x20, 0x43, 0x26,
- 0x2d, 0x9b, 0x86, 0xc0, 0xdc, 0x12, 0x0b, 0xb0, 0x99, 0x6d, 0x68, 0xf9, 0x06, 0x55, 0x9e, 0xfa,
- 0x5c, 0x29, 0x52, 0xa7, 0x3d, 0x4d, 0x7b, 0xe8, 0x3e, 0x46, 0x1f, 0xfb, 0xb6, 0x6a, 0x0f, 0x68,
- 0x4a, 0x5e, 0xf6, 0xcc, 0x27, 0x98, 0x7c, 0x7d, 0x6d, 0x0c, 0xd8, 0x8a, 0xd3, 0x26, 0xe9, 0xde,
- 0x7c, 0xef, 0xf9, 0xdd, 0x73, 0xce, 0xfd, 0x9d, 0xdf, 0xfd, 0x67, 0x58, 0x16, 0xab, 0x42, 0x46,
- 0x90, 0x15, 0x94, 0x11, 0x8e, 0x2b, 0x92, 0x84, 0x9a, 0x99, 0xee, 0x66, 0x46, 0x7b, 0x9e, 0x6e,
- 0x2b, 0xb2, 0x26, 0xd3, 0x31, 0xb1, 0x2a, 0xa4, 0x75, 0x6b, 0x9a, 0x58, 0xd3, 0xdd, 0x4d, 0x66,
- 0xbe, 0x2e, 0xd7, 0x65, 0x6c, 0xcf, 0xe8, 0x5f, 0x06, 0x94, 0x61, 0x87, 0x8e, 0x9a, 0x22, 0x92,
- 0x34, 0xdd, 0x8f, 0xf1, 0x45, 0x00, 0x9f, 0x3b, 0x45, 0x32, 0xdd, 0x62, 0x08, 0xf7, 0x2b, 0x05,
- 0xf4, 0x9e, 0x5a, 0xcf, 0x19, 0x9d, 0x07, 0x6d, 0x24, 0xed, 0x4a, 0xa2, 0x46, 0x7f, 0x01, 0xe1,
- 0xb6, 0xac, 0x68, 0x65, 0xb1, 0x16, 0xa7, 0x52, 0xd4, 0xda, 0x74, 0x96, 0x1e, 0xf4, 0xd9, 0x99,
- 0x5e, 0xa5, 0xd5, 0xdc, 0xe6, 0x88, 0x81, 0xe3, 0x43, 0xfa, 0xd7, 0x6e, 0x8d, 0xfe, 0x12, 0xc2,
- 0xc4, 0x69, 0xdc, 0x9f, 0xa2, 0xd6, 0x22, 0x5b, 0xcb, 0x69, 0x87, 0x49, 0xa4, 0x49, 0x8c, 0x6c,
- 0xf0, 0x6d, 0x9f, 0xf5, 0xf1, 0xe6, 0x10, 0x7a, 0x11, 0x42, 0xaa, 0x58, 0x97, 0x90, 0x12, 0x0f,
- 0xe8, 0x91, 0x78, 0xd2, 0xda, 0x9e, 0x7a, 0xf1, 0x9a, 0xf5, 0xfd, 0xfb, 0x9a, 0xf5, 0x71, 0x4d,
- 0x60, 0x26, 0x53, 0xe4, 0x91, 0xda, 0x96, 0x25, 0x15, 0xd1, 0x0f, 0x00, 0x88, 0xab, 0x61, 0xb6,
- 0x0b, 0x83, 0x3e, 0x3b, 0x67, 0x64, 0x3b, 0xb4, 0x71, 0xfc, 0x34, 0x69, 0xec, 0xd6, 0xe8, 0x38,
- 0x84, 0xbb, 0x48, 0x51, 0x45, 0x59, 0xc2, 0x39, 0x4f, 0xf3, 0x66, 0x93, 0x7b, 0x1f, 0x80, 0xb9,
- 0xd1, 0x70, 0x25, 0xa5, 0x77, 0x39, 0x42, 0x0a, 0x10, 0x6b, 0x2b, 0xa8, 0x2b, 0xca, 0x1d, 0xb5,
- 0x6c, 0xcb, 0x0d, 0x07, 0xca, 0xa6, 0x06, 0x7d, 0x96, 0x21, 0x03, 0x27, 0x41, 0x5c, 0x9c, 0xe2,
- 0xe7, 0xcc, 0xfe, 0x9c, 0x95, 0xae, 0x8d, 0xe2, 0xc0, 0xe5, 0x29, 0xe6, 0x61, 0x5e, 0x90, 0x3b,
- 0x92, 0x86, 0x94, 0x76, 0x45, 0xd1, 0x7a, 0x65, 0x73, 0xe6, 0x41, 0x9c, 0x10, 0x3b, 0xe8, 0xb3,
- 0x09, 0x42, 0x96, 0x03, 0x8a, 0xe3, 0x63, 0xf6, 0xee, 0xef, 0x8d, 0x5e, 0x9d, 0xf6, 0xb6, 0x22,
- 0xcb, 0x4f, 0xcb, 0xa2, 0x24, 0x6a, 0xf1, 0x5b, 0x29, 0x6a, 0xed, 0xb6, 0x9d, 0xf6, 0xa1, 0x8d,
- 0xe3, 0xa7, 0x71, 0x03, 0xeb, 0xea, 0x08, 0x6e, 0x1b, 0x96, 0x63, 0x24, 0xd6, 0x8f, 0xb5, 0x78,
- 0x08, 0x4f, 0x86, 0xb1, 0x4d, 0xc6, 0xd0, 0x6f, 0x77, 0x33, 0xfd, 0x0d, 0x46, 0x64, 0x13, 0xfa,
- 0x54, 0x06, 0x7d, 0x36, 0x66, 0xf7, 0x6b, 0x8c, 0xe6, 0xf8, 0x08, 0x6e, 0x1a, 0x48, 0x9b, 0x90,
- 0xc2, 0x2e, 0x42, 0x7a, 0x08, 0x4b, 0x13, 0x95, 0xb5, 0x74, 0x64, 0x53, 0x04, 0x35, 0xaa, 0x88,
- 0xbf, 0x26, 0x14, 0xb1, 0x23, 0x34, 0x2e, 0xa7, 0x88, 0x51, 0x91, 0xfa, 0x3d, 0x8a, 0xf4, 0x08,
- 0xee, 0x8c, 0x54, 0xc4, 0xe6, 0x02, 0xaf, 0x95, 0x2c, 0x37, 0xe8, 0xb3, 0x49, 0x87, 0xd2, 0xd9,
- 0xfd, 0x2d, 0xd8, 0x2d, 0x43, 0x45, 0x5d, 0x87, 0x26, 0x36, 0xc1, 0x28, 0x75, 0x59, 0x53, 0x7a,
- 0x44, 0x12, 0xf3, 0x83, 0x3e, 0x1b, 0xb5, 0x97, 0x4e, 0x53, 0x7a, 0x1c, 0x3f, 0x85, 0xbf, 0xf5,
- 0x75, 0xf5, 0x69, 0x05, 0x91, 0x18, 0x17, 0xc4, 0x8e, 0xd0, 0x30, 0x05, 0xc1, 0xfd, 0xe1, 0x87,
- 0x85, 0x51, 0x6b, 0x4e, 0x96, 0x9e, 0x8a, 0x4a, 0xeb, 0x26, 0x4a, 0x6f, 0x51, 0x59, 0x11, 0x1a,
- 0xb8, 0xd8, 0x0e, 0x54, 0x56, 0x84, 0x86, 0x49, 0xa5, 0x2e, 0xc8, 0x71, 0x2a, 0x83, 0xd7, 0x42,
- 0xe5, 0x2d, 0x17, 0x2a, 0x59, 0x58, 0x71, 0x24, 0xcb, 0xa2, 0xf3, 0x15, 0x05, 0xb1, 0x21, 0x22,
- 0xd7, 0x94, 0x55, 0x74, 0xf9, 0xa3, 0xe6, 0xc3, 0xc8, 0xbc, 0xf8, 0x88, 0x59, 0x81, 0x84, 0x43,
- 0x6e, 0x56, 0xee, 0x6f, 0xfc, 0xb0, 0x38, 0x66, 0xbf, 0x41, 0x2d, 0x8c, 0x6e, 0xb5, 0x81, 0x0f,
- 0xdc, 0x6a, 0x6f, 0x56, 0x0e, 0x29, 0x48, 0x3a, 0x13, 0x66, 0x71, 0xfa, 0xd2, 0x0f, 0x9f, 0xed,
- 0xa9, 0x75, 0x1e, 0x09, 0xdd, 0x42, 0x45, 0x68, 0x20, 0x8d, 0x7e, 0x0c, 0xa1, 0x36, 0xfe, 0xc2,
- 0x4c, 0x46, 0xb6, 0x12, 0x8e, 0x67, 0x9c, 0x01, 0x26, 0x47, 0x1c, 0x19, 0x40, 0x3f, 0x81, 0xa8,
- 0x91, 0xae, 0x20, 0xb7, 0x5a, 0xa2, 0xd6, 0x42, 0x92, 0x86, 0xe9, 0xbd, 0x9d, 0x4d, 0x0c, 0xfa,
- 0xec, 0x1d, 0xfb, 0x84, 0x86, 0x08, 0x8e, 0x9f, 0xc5, 0x5d, 0x39, 0xab, 0x67, 0x82, 0xb4, 0xc0,
- 0xb5, 0x90, 0x16, 0x74, 0x21, 0xed, 0x67, 0xbc, 0xe1, 0x0c, 0x19, 0xb1, 0xce, 0xa6, 0xaf, 0x20,
- 0xa4, 0x20, 0xb5, 0xd3, 0x34, 0x98, 0x99, 0xd9, 0x5a, 0x75, 0x64, 0xc6, 0x84, 0xf3, 0x18, 0x5a,
- 0xea, 0xb5, 0x11, 0x4f, 0x86, 0x6d, 0x07, 0xf5, 0x18, 0xdc, 0xdf, 0x7e, 0x80, 0x3d, 0xb5, 0x5e,
- 0x12, 0x5b, 0x48, 0xee, 0x5c, 0x0d, 0xdf, 0x1d, 0x49, 0x41, 0x02, 0x12, 0xbb, 0xa8, 0xe6, 0xc6,
- 0xf7, 0x10, 0x61, 0xf2, 0x7d, 0x68, 0xf5, 0x5c, 0x2b, 0xdf, 0xdf, 0x02, 0x2d, 0xa1, 0xe7, 0x5a,
- 0x59, 0x45, 0xbf, 0x74, 0x90, 0x24, 0xa0, 0xb2, 0x82, 0x84, 0x2e, 0xe6, 0x3e, 0x98, 0x5d, 0x19,
- 0xf4, 0xd9, 0x25, 0xc3, 0xc3, 0x24, 0x86, 0xe3, 0xa3, 0x7a, 0x67, 0x91, 0xf4, 0xe9, 0xf5, 0xf0,
- 0xa0, 0xf8, 0x1f, 0xf1, 0x45, 0x9a, 0x70, 0x7b, 0xd5, 0x95, 0x7b, 0x65, 0x5c, 0x41, 0x88, 0xf7,
- 0x03, 0x09, 0xaf, 0xa8, 0xff, 0x43, 0x01, 0x1f, 0x41, 0x84, 0x2c, 0x2b, 0x3d, 0x23, 0xb2, 0x39,
- 0x2d, 0x0e, 0xfa, 0x2c, 0x3d, 0xb2, 0xe6, 0x74, 0x23, 0xc7, 0x1b, 0xdb, 0x98, 0x91, 0xfb, 0x75,
- 0x6e, 0x4f, 0xce, 0x95, 0xbf, 0xf5, 0xb1, 0x95, 0x0f, 0xb9, 0x54, 0xbe, 0x8a, 0x6f, 0x11, 0xa3,
- 0xb5, 0xb9, 0x6a, 0x01, 0xfc, 0xe9, 0xc7, 0xf2, 0xda, 0x11, 0x1a, 0x92, 0xfc, 0xac, 0x89, 0x6a,
- 0x75, 0x84, 0xf7, 0xab, 0x8f, 0x50, 0xc0, 0x1a, 0xcc, 0x56, 0x46, 0xbd, 0x19, 0x02, 0xe0, 0xc7,
- 0xbb, 0x87, 0x35, 0xd6, 0x07, 0xd6, 0xdc, 0x6a, 0x8c, 0x8d, 0x66, 0x8d, 0x77, 0xf4, 0xc6, 0x27,
- 0x3e, 0x82, 0x04, 0xfc, 0x6c, 0x1c, 0x63, 0xec, 0x8a, 0xeb, 0xb2, 0xfe, 0x3b, 0x05, 0xf4, 0x24,
- 0x88, 0x7e, 0x08, 0x29, 0x3e, 0x5f, 0x2c, 0x1c, 0xec, 0x17, 0xf3, 0x65, 0x3e, 0x5f, 0x3c, 0xfc,
- 0xae, 0x54, 0x2e, 0xfd, 0x50, 0xc8, 0x97, 0x0f, 0xf7, 0x8b, 0x85, 0x7c, 0x6e, 0xf7, 0xc9, 0x6e,
- 0xfe, 0xeb, 0xa8, 0x8f, 0x99, 0x3d, 0x39, 0x4d, 0x45, 0x6c, 0x5d, 0xf4, 0x2a, 0x2c, 0x39, 0x0e,
- 0xdb, 0x3f, 0x38, 0x28, 0x44, 0x29, 0x66, 0xea, 0xe4, 0x34, 0x15, 0xd4, 0xbf, 0xe9, 0x0d, 0x58,
- 0x76, 0x04, 0x16, 0x0f, 0x73, 0xb9, 0x7c, 0xb1, 0x18, 0xf5, 0x33, 0x91, 0x93, 0xd3, 0x54, 0x98,
- 0x34, 0x99, 0xe0, 0x8b, 0xdf, 0x92, 0xbe, 0xad, 0x37, 0x53, 0x10, 0xd8, 0x53, 0xeb, 0x74, 0x03,
- 0x66, 0xc7, 0xdf, 0xfb, 0xce, 0xb3, 0x9f, 0x7c, 0x75, 0x33, 0x19, 0x8f, 0x40, 0x8b, 0xe7, 0x63,
- 0x98, 0x19, 0x7b, 0x4a, 0xdf, 0xf5, 0xe0, 0xa2, 0xa4, 0xf4, 0x98, 0xb4, 0x37, 0x9c, 0x4b, 0x24,
- 0xfd, 0x46, 0xec, 0x25, 0xd2, 0x8e, 0xd0, 0xf0, 0x14, 0xc9, 0xf6, 0x32, 0xa0, 0x35, 0xa0, 0x1d,
- 0x5e, 0x05, 0xeb, 0x1e, 0xbc, 0x10, 0x2c, 0xb3, 0xe5, 0x1d, 0x6b, 0x45, 0x95, 0x20, 0x3a, 0x71,
- 0x79, 0x5e, 0xbb, 0xc0, 0x8f, 0x85, 0x64, 0xee, 0x79, 0x45, 0x5a, 0xf1, 0x9e, 0x41, 0xcc, 0xf1,
- 0xc2, 0xeb, 0xc5, 0x91, 0x39, 0xcf, 0xfb, 0x97, 0x00, 0x5b, 0x81, 0x7f, 0x02, 0xb0, 0xdd, 0x0a,
- 0x39, 0x37, 0x17, 0x43, 0x0c, 0xb3, 0x7e, 0x31, 0xc6, 0xf2, 0x5e, 0x84, 0xb0, 0x79, 0x01, 0x62,
- 0xdd, 0x86, 0x11, 0x00, 0xb3, 0x7a, 0x01, 0xc0, 0xae, 0xbd, 0xb1, 0xb3, 0xf9, 0xee, 0x05, 0x43,
- 0x09, 0xce, 0x5d, 0x7b, 0x2e, 0xe7, 0x49, 0x03, 0x66, 0xc7, 0x0f, 0x01, 0xd7, 0x2c, 0xc7, 0x80,
- 0xee, 0x8b, 0xd7, 0x65, 0x93, 0xcc, 0x16, 0xdf, 0x9e, 0x25, 0xa9, 0x77, 0x67, 0x49, 0xea, 0x9f,
- 0xb3, 0x24, 0xf5, 0xf2, 0x3c, 0xe9, 0x7b, 0x77, 0x9e, 0xf4, 0xbd, 0x3f, 0x4f, 0xfa, 0x8e, 0x1e,
- 0xd7, 0x45, 0xed, 0xb8, 0x53, 0x4d, 0x0b, 0x72, 0x2b, 0x23, 0xc8, 0x6a, 0x4b, 0x56, 0x33, 0x62,
- 0x55, 0xd8, 0xa8, 0xcb, 0x99, 0xee, 0xa3, 0x4c, 0x4b, 0xae, 0x75, 0x9a, 0x48, 0x35, 0x7e, 0x3d,
- 0xde, 0x7b, 0xb0, 0x61, 0xfe, 0x7d, 0xd4, 0x7a, 0x6d, 0xa4, 0x56, 0x43, 0xf8, 0xcf, 0xe3, 0xfd,
- 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0xa3, 0xcf, 0x11, 0xf4, 0x08, 0x15, 0x00, 0x00,
+ // 1300 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0xdf, 0x6f, 0xda, 0xd6,
+ 0x17, 0xc7, 0x40, 0x21, 0x39, 0xf4, 0x9b, 0x10, 0x93, 0xa4, 0xc4, 0x24, 0x98, 0xaf, 0x1f, 0x9a,
+ 0x28, 0x53, 0xa0, 0x49, 0x3b, 0x55, 0x8d, 0x26, 0x4d, 0x81, 0x51, 0x2d, 0xda, 0x92, 0x20, 0x43,
+ 0x26, 0x2d, 0x9b, 0x86, 0xc0, 0xdc, 0x12, 0x0b, 0xb0, 0x99, 0x6d, 0x68, 0xf9, 0x0f, 0xaa, 0x3c,
+ 0xf5, 0xb9, 0x52, 0xa4, 0x4e, 0x7b, 0x9a, 0xf6, 0xd0, 0xfd, 0x19, 0x7d, 0xec, 0xdb, 0xaa, 0x3d,
+ 0xa0, 0x29, 0x79, 0xd9, 0x33, 0x7f, 0xc1, 0xe4, 0xeb, 0x6b, 0x63, 0xc0, 0x56, 0x9c, 0x34, 0x49,
+ 0xf7, 0x76, 0xef, 0x3d, 0x9f, 0x7b, 0xce, 0xb9, 0x9f, 0xf3, 0xb9, 0x3f, 0x6c, 0x58, 0x16, 0xab,
+ 0x42, 0x46, 0x90, 0x15, 0x94, 0x11, 0x8e, 0x2b, 0x92, 0x84, 0x9a, 0x99, 0xee, 0x66, 0x46, 0x7b,
+ 0x91, 0x6e, 0x2b, 0xb2, 0x26, 0xd3, 0x31, 0xb1, 0x2a, 0xa4, 0x75, 0x6b, 0x9a, 0x58, 0xd3, 0xdd,
+ 0x4d, 0x66, 0xbe, 0x2e, 0xd7, 0x65, 0x6c, 0xcf, 0xe8, 0x2d, 0x03, 0xca, 0xb0, 0x43, 0x47, 0x4d,
+ 0x11, 0x49, 0x9a, 0xee, 0xc7, 0x68, 0x11, 0xc0, 0xff, 0x9d, 0x22, 0x99, 0x6e, 0x31, 0x84, 0xfb,
+ 0x85, 0x02, 0x7a, 0x4f, 0xad, 0xe7, 0x8c, 0xc1, 0x83, 0x36, 0x92, 0x76, 0x25, 0x51, 0xa3, 0x3f,
+ 0x83, 0x70, 0x5b, 0x56, 0xb4, 0xb2, 0x58, 0x8b, 0x53, 0x29, 0x6a, 0x6d, 0x3a, 0x4b, 0x0f, 0xfa,
+ 0xec, 0x4c, 0xaf, 0xd2, 0x6a, 0x6e, 0x73, 0xc4, 0xc0, 0xf1, 0x21, 0xbd, 0xb5, 0x5b, 0xa3, 0xbf,
+ 0x80, 0x30, 0x71, 0x1a, 0xf7, 0xa7, 0xa8, 0xb5, 0xc8, 0xd6, 0x72, 0xda, 0x61, 0x11, 0x69, 0x12,
+ 0x23, 0x1b, 0x7c, 0xd7, 0x67, 0x7d, 0xbc, 0x39, 0x85, 0x5e, 0x84, 0x90, 0x2a, 0xd6, 0x25, 0xa4,
+ 0xc4, 0x03, 0x7a, 0x24, 0x9e, 0xf4, 0xb6, 0xa7, 0x5e, 0xbe, 0x61, 0x7d, 0xff, 0xbc, 0x61, 0x7d,
+ 0x5c, 0x13, 0x98, 0xc9, 0x14, 0x79, 0xa4, 0xb6, 0x65, 0x49, 0x45, 0xf4, 0x23, 0x00, 0xe2, 0x6a,
+ 0x98, 0xed, 0xc2, 0xa0, 0xcf, 0xce, 0x19, 0xd9, 0x0e, 0x6d, 0x1c, 0x3f, 0x4d, 0x3a, 0xbb, 0x35,
+ 0x3a, 0x0e, 0xe1, 0x2e, 0x52, 0x54, 0x51, 0x96, 0x70, 0xce, 0xd3, 0xbc, 0xd9, 0xe5, 0x3e, 0x04,
+ 0x60, 0x6e, 0x34, 0x5c, 0x49, 0xe9, 0x5d, 0x8e, 0x90, 0x02, 0xc4, 0xda, 0x0a, 0xea, 0x8a, 0x72,
+ 0x47, 0x2d, 0xdb, 0x72, 0xc3, 0x81, 0xb2, 0xa9, 0x41, 0x9f, 0x65, 0xc8, 0xc4, 0x49, 0x10, 0x17,
+ 0xa7, 0xf8, 0x39, 0x73, 0x3c, 0x67, 0xa5, 0x6b, 0xa3, 0x38, 0x70, 0x79, 0x8a, 0x79, 0x98, 0x17,
+ 0xe4, 0x8e, 0xa4, 0x21, 0xa5, 0x5d, 0x51, 0xb4, 0x5e, 0xd9, 0x5c, 0x79, 0x10, 0x27, 0xc4, 0x0e,
+ 0xfa, 0x6c, 0x82, 0x90, 0xe5, 0x80, 0xe2, 0xf8, 0x98, 0x7d, 0xf8, 0x3b, 0x63, 0x54, 0xa7, 0xbd,
+ 0xad, 0xc8, 0xf2, 0xb3, 0xb2, 0x28, 0x89, 0x5a, 0xfc, 0x4e, 0x8a, 0x5a, 0xbb, 0x6b, 0xa7, 0x7d,
+ 0x68, 0xe3, 0xf8, 0x69, 0xdc, 0xc1, 0xba, 0x3a, 0x82, 0xbb, 0x86, 0xe5, 0x18, 0x89, 0xf5, 0x63,
+ 0x2d, 0x1e, 0xc2, 0x8b, 0x61, 0x6c, 0x8b, 0x31, 0xf4, 0xdb, 0xdd, 0x4c, 0x7f, 0x8d, 0x11, 0xd9,
+ 0x84, 0xbe, 0x94, 0x41, 0x9f, 0x8d, 0xd9, 0xfd, 0x1a, 0xb3, 0x39, 0x3e, 0x82, 0xbb, 0x06, 0xd2,
+ 0x26, 0xa4, 0xb0, 0x8b, 0x90, 0x1a, 0xb0, 0x34, 0x51, 0x59, 0x4b, 0x47, 0x36, 0x45, 0x50, 0x23,
+ 0x8a, 0x18, 0x53, 0x98, 0xdf, 0x9b, 0xc2, 0xb8, 0x3f, 0x27, 0x74, 0xb4, 0x23, 0x34, 0x2e, 0xa7,
+ 0xa3, 0x2b, 0x05, 0xa6, 0x8f, 0xe0, 0xde, 0x48, 0x1d, 0x6d, 0x2e, 0xf0, 0x0e, 0xcb, 0x72, 0x83,
+ 0x3e, 0x9b, 0x74, 0x28, 0xb8, 0xdd, 0xdf, 0x82, 0xdd, 0x32, 0xd4, 0xe1, 0x4d, 0x28, 0x69, 0x13,
+ 0x0c, 0x81, 0x94, 0x35, 0xa5, 0x47, 0x84, 0x34, 0x3f, 0xe8, 0xb3, 0x51, 0x7b, 0xc1, 0x35, 0xa5,
+ 0xc7, 0xf1, 0x53, 0xb8, 0xad, 0xef, 0xc6, 0x4f, 0x2b, 0xa3, 0xc4, 0xb8, 0x8c, 0x76, 0x84, 0x86,
+ 0x29, 0x23, 0xee, 0x77, 0x3f, 0x2c, 0x8c, 0x5a, 0x73, 0xb2, 0xf4, 0x4c, 0x54, 0x5a, 0xb7, 0x51,
+ 0x7a, 0x8b, 0xca, 0x8a, 0xd0, 0xc0, 0xc5, 0x76, 0xa0, 0xb2, 0x22, 0x34, 0x4c, 0x2a, 0x75, 0x41,
+ 0x8e, 0x53, 0x19, 0xbc, 0x11, 0x2a, 0xef, 0xb8, 0x50, 0xc9, 0xc2, 0x8a, 0x23, 0x59, 0x16, 0x9d,
+ 0xaf, 0x29, 0x88, 0x0d, 0x11, 0xb9, 0xa6, 0xac, 0xa2, 0xcb, 0x5f, 0x50, 0x57, 0x23, 0xf3, 0xe2,
+ 0x8b, 0x69, 0x05, 0x12, 0x0e, 0xb9, 0x59, 0xb9, 0xbf, 0xf5, 0xc3, 0xe2, 0x98, 0xfd, 0x16, 0xb5,
+ 0x30, 0x7a, 0x40, 0x07, 0xae, 0x78, 0x40, 0xdf, 0xae, 0x1c, 0x52, 0x90, 0x74, 0x26, 0xcc, 0xe2,
+ 0xf4, 0x95, 0x1f, 0xfe, 0xb7, 0xa7, 0xd6, 0x79, 0x24, 0x74, 0x0b, 0x15, 0xa1, 0x81, 0x34, 0xfa,
+ 0x09, 0x84, 0xda, 0xb8, 0x85, 0x99, 0x8c, 0x6c, 0x25, 0x1c, 0x6f, 0x46, 0x03, 0x4c, 0x2e, 0x46,
+ 0x32, 0x81, 0x7e, 0x0a, 0x51, 0x23, 0x5d, 0x41, 0x6e, 0xb5, 0x44, 0xad, 0x85, 0x24, 0x0d, 0xd3,
+ 0x7b, 0x37, 0x9b, 0x18, 0xf4, 0xd9, 0x7b, 0xf6, 0x05, 0x0d, 0x11, 0x1c, 0x3f, 0x8b, 0x87, 0x72,
+ 0xd6, 0xc8, 0x04, 0x69, 0x81, 0x1b, 0x21, 0x2d, 0xe8, 0x42, 0xda, 0x4f, 0xf8, 0xc0, 0x19, 0x32,
+ 0x62, 0xdd, 0x68, 0x5f, 0x42, 0x48, 0x41, 0x6a, 0xa7, 0x69, 0x30, 0x33, 0xb3, 0xb5, 0xea, 0xc8,
+ 0x8c, 0x09, 0xe7, 0x31, 0xb4, 0xd4, 0x6b, 0x23, 0x9e, 0x4c, 0xdb, 0x0e, 0xea, 0x31, 0xb8, 0xbf,
+ 0xfc, 0x00, 0x7b, 0x6a, 0xbd, 0x24, 0xb6, 0x90, 0xdc, 0xb9, 0x1e, 0xbe, 0x3b, 0x92, 0x82, 0x04,
+ 0x24, 0x76, 0x51, 0xcd, 0x8d, 0xef, 0x21, 0xc2, 0xe4, 0xfb, 0xd0, 0x1a, 0xb9, 0x51, 0xbe, 0xbf,
+ 0x01, 0x5a, 0x42, 0x2f, 0xb4, 0xb2, 0x8a, 0x7e, 0xee, 0x20, 0x49, 0x40, 0x65, 0x05, 0x09, 0x5d,
+ 0xcc, 0x7d, 0x30, 0xbb, 0x32, 0xe8, 0xb3, 0x4b, 0x86, 0x87, 0x49, 0x0c, 0xc7, 0x47, 0xf5, 0xc1,
+ 0x22, 0x19, 0xd3, 0xeb, 0xe1, 0x41, 0xf1, 0x3f, 0xe0, 0xe7, 0x37, 0xe1, 0xf6, 0xba, 0x2b, 0xf7,
+ 0xda, 0x78, 0x82, 0x10, 0xef, 0x07, 0x12, 0xde, 0x51, 0xff, 0x85, 0x02, 0x3e, 0x86, 0x08, 0xd9,
+ 0x56, 0x7a, 0x46, 0xe4, 0x70, 0x5a, 0x1c, 0xf4, 0x59, 0x7a, 0x64, 0xcf, 0xe9, 0x46, 0x8e, 0x37,
+ 0x8e, 0x31, 0x23, 0xf7, 0x9b, 0x3c, 0x9e, 0x9c, 0x2b, 0x7f, 0xe7, 0x63, 0x2b, 0x1f, 0x72, 0xa9,
+ 0x7c, 0x15, 0xbf, 0x22, 0x46, 0x6b, 0x73, 0xdd, 0x02, 0xf8, 0xc3, 0x8f, 0xe5, 0xb5, 0x23, 0x34,
+ 0x24, 0xf9, 0x79, 0x13, 0xd5, 0xea, 0x08, 0x9f, 0x57, 0x1f, 0xa1, 0x80, 0x35, 0x98, 0xad, 0x8c,
+ 0x7a, 0x33, 0x04, 0xc0, 0x8f, 0x0f, 0x0f, 0x6b, 0xac, 0x4f, 0xac, 0xb9, 0xd5, 0x18, 0x1b, 0xcd,
+ 0x1a, 0xef, 0xe8, 0x9d, 0x4f, 0x7c, 0x05, 0x09, 0xf8, 0x63, 0x73, 0x8c, 0xb1, 0x6b, 0xae, 0xcb,
+ 0xfa, 0x6f, 0x14, 0xd0, 0x93, 0x20, 0xfa, 0x73, 0x48, 0xf1, 0xf9, 0x62, 0xe1, 0x60, 0xbf, 0x98,
+ 0x2f, 0xf3, 0xf9, 0xe2, 0xe1, 0xb7, 0xa5, 0x72, 0xe9, 0xfb, 0x42, 0xbe, 0x7c, 0xb8, 0x5f, 0x2c,
+ 0xe4, 0x73, 0xbb, 0x4f, 0x77, 0xf3, 0x5f, 0x45, 0x7d, 0xcc, 0xec, 0xc9, 0x69, 0x2a, 0x62, 0x1b,
+ 0xa2, 0x57, 0x61, 0xc9, 0x71, 0xda, 0xfe, 0xc1, 0x41, 0x21, 0x4a, 0x31, 0x53, 0x27, 0xa7, 0xa9,
+ 0xa0, 0xde, 0xa6, 0x37, 0x60, 0xd9, 0x11, 0x58, 0x3c, 0xcc, 0xe5, 0xf2, 0xc5, 0x62, 0xd4, 0xcf,
+ 0x44, 0x4e, 0x4e, 0x53, 0x61, 0xd2, 0x65, 0x82, 0x2f, 0x7f, 0x4d, 0xfa, 0xb6, 0xde, 0x4e, 0x41,
+ 0x60, 0x4f, 0xad, 0xd3, 0x0d, 0x98, 0x1d, 0xff, 0x4b, 0xe0, 0xbc, 0xfa, 0xc9, 0x6f, 0x75, 0x26,
+ 0xe3, 0x11, 0x68, 0xf1, 0x7c, 0x0c, 0x33, 0x63, 0x1f, 0xe0, 0xf7, 0x3d, 0xb8, 0x28, 0x29, 0x3d,
+ 0x26, 0xed, 0x0d, 0xe7, 0x12, 0x49, 0x7f, 0x11, 0x7b, 0x89, 0xb4, 0x23, 0x34, 0x3c, 0x45, 0xb2,
+ 0x7d, 0x19, 0xd0, 0x1a, 0xd0, 0x0e, 0x5f, 0x05, 0xeb, 0x1e, 0xbc, 0x10, 0x2c, 0xb3, 0xe5, 0x1d,
+ 0x6b, 0x45, 0x95, 0x20, 0x3a, 0xf1, 0x78, 0x5e, 0xbb, 0xc0, 0x8f, 0x85, 0x64, 0x1e, 0x78, 0x45,
+ 0x5a, 0xf1, 0x9e, 0x43, 0xcc, 0xf1, 0xc1, 0xeb, 0xc5, 0x91, 0xb9, 0xce, 0x87, 0x97, 0x00, 0x5b,
+ 0x81, 0x7f, 0x04, 0xb0, 0xbd, 0x0a, 0x39, 0x37, 0x17, 0x43, 0x0c, 0xb3, 0x7e, 0x31, 0xc6, 0xf2,
+ 0x5e, 0x84, 0xb0, 0xf9, 0x00, 0x62, 0xdd, 0xa6, 0x11, 0x00, 0xb3, 0x7a, 0x01, 0xc0, 0xae, 0xbd,
+ 0xb1, 0xbb, 0xf9, 0xfe, 0x05, 0x53, 0x09, 0xce, 0x5d, 0x7b, 0x2e, 0xf7, 0x49, 0x03, 0x66, 0xc7,
+ 0x2f, 0x01, 0xd7, 0x2c, 0xc7, 0x80, 0xee, 0x9b, 0xd7, 0xe5, 0x90, 0xcc, 0x16, 0xdf, 0x9d, 0x25,
+ 0xa9, 0xf7, 0x67, 0x49, 0xea, 0xef, 0xb3, 0x24, 0xf5, 0xea, 0x3c, 0xe9, 0x7b, 0x7f, 0x9e, 0xf4,
+ 0x7d, 0x38, 0x4f, 0xfa, 0x8e, 0x9e, 0xd4, 0x45, 0xed, 0xb8, 0x53, 0x4d, 0x0b, 0x72, 0x2b, 0x23,
+ 0xc8, 0x6a, 0x4b, 0x56, 0x33, 0x62, 0x55, 0xd8, 0xa8, 0xcb, 0x99, 0xee, 0xe3, 0x4c, 0x4b, 0xae,
+ 0x75, 0x9a, 0x48, 0x35, 0x7e, 0x58, 0x3e, 0x78, 0xb4, 0x61, 0xfe, 0xb3, 0xd4, 0x7a, 0x6d, 0xa4,
+ 0x56, 0x43, 0xf8, 0x7f, 0xe5, 0xc3, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x02, 0xf0, 0xc5, 0x4c,
+ 0x3e, 0x15, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -1609,6 +1618,13 @@ func (m *MsgChannelOpenTryResponse) MarshalToSizedBuffer(dAtA []byte) (int, erro
_ = i
var l int
_ = l
+ if len(m.ChannelId) > 0 {
+ i -= len(m.ChannelId)
+ copy(dAtA[i:], m.ChannelId)
+ i = encodeVarintTx(dAtA, i, uint64(len(m.ChannelId)))
+ i--
+ dAtA[i] = 0x12
+ }
if len(m.Version) > 0 {
i -= len(m.Version)
copy(dAtA[i:], m.Version)
@@ -2406,6 +2422,10 @@ func (m *MsgChannelOpenTryResponse) Size() (n int) {
if l > 0 {
n += 1 + l + sovTx(uint64(l))
}
+ l = len(m.ChannelId)
+ if l > 0 {
+ n += 1 + l + sovTx(uint64(l))
+ }
return n
}
@@ -3307,6 +3327,38 @@ func (m *MsgChannelOpenTryResponse) Unmarshal(dAtA []byte) error {
}
m.Version = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
+ case 2:
+ 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 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.ChannelId = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipTx(dAtA[iNdEx:])
diff --git a/modules/core/05-port/keeper/keeper.go b/modules/core/05-port/keeper/keeper.go
index 35b3f273af7..e862e110100 100644
--- a/modules/core/05-port/keeper/keeper.go
+++ b/modules/core/05-port/keeper/keeper.go
@@ -3,9 +3,9 @@ package keeper
import (
"fmt"
+ "github.com/cometbft/cometbft/libs/log"
sdk "github.com/cosmos/cosmos-sdk/types"
capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types"
- "github.com/tendermint/tendermint/libs/log"
"github.com/cosmos/ibc-go/v7/modules/core/05-port/types"
host "github.com/cosmos/ibc-go/v7/modules/core/24-host"
diff --git a/modules/core/05-port/keeper/keeper_test.go b/modules/core/05-port/keeper/keeper_test.go
index c091a857474..b0459afa564 100644
--- a/modules/core/05-port/keeper/keeper_test.go
+++ b/modules/core/05-port/keeper/keeper_test.go
@@ -3,10 +3,10 @@ package keeper_test
import (
"testing"
+ tmproto "github.com/cometbft/cometbft/proto/tendermint/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/suite"
- tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
"github.com/cosmos/ibc-go/v7/modules/core/05-port/keeper"
"github.com/cosmos/ibc-go/v7/testing/simapp"
diff --git a/modules/core/23-commitment/types/commitment_test.go b/modules/core/23-commitment/types/commitment_test.go
index ccc794579f8..093e7df674c 100644
--- a/modules/core/23-commitment/types/commitment_test.go
+++ b/modules/core/23-commitment/types/commitment_test.go
@@ -3,12 +3,12 @@ package types_test
import (
"testing"
+ dbm "github.com/cometbft/cometbft-db"
+ "github.com/cometbft/cometbft/libs/log"
"github.com/cosmos/cosmos-sdk/store/iavl"
"github.com/cosmos/cosmos-sdk/store/rootmulti"
storetypes "github.com/cosmos/cosmos-sdk/store/types"
"github.com/stretchr/testify/suite"
- "github.com/tendermint/tendermint/libs/log"
- dbm "github.com/tendermint/tm-db"
)
type MerkleTestSuite struct {
diff --git a/modules/core/23-commitment/types/merkle.go b/modules/core/23-commitment/types/merkle.go
index 33c6f51dba7..5d263ce1777 100644
--- a/modules/core/23-commitment/types/merkle.go
+++ b/modules/core/23-commitment/types/merkle.go
@@ -5,10 +5,10 @@ import (
"fmt"
"net/url"
+ tmcrypto "github.com/cometbft/cometbft/proto/tendermint/crypto"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
"github.com/cosmos/gogoproto/proto"
ics23 "github.com/cosmos/ics23/go"
- tmcrypto "github.com/tendermint/tendermint/proto/tendermint/crypto"
"github.com/cosmos/ibc-go/v7/modules/core/exported"
)
diff --git a/modules/core/23-commitment/types/merkle_test.go b/modules/core/23-commitment/types/merkle_test.go
index 8086afd8c76..90fee1a8761 100644
--- a/modules/core/23-commitment/types/merkle_test.go
+++ b/modules/core/23-commitment/types/merkle_test.go
@@ -4,8 +4,8 @@ import (
"fmt"
"testing"
+ abci "github.com/cometbft/cometbft/abci/types"
"github.com/stretchr/testify/require"
- abci "github.com/tendermint/tendermint/abci/types"
"github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types"
)
diff --git a/modules/core/23-commitment/types/utils.go b/modules/core/23-commitment/types/utils.go
index e2c4317a9fc..771dc9fcab5 100644
--- a/modules/core/23-commitment/types/utils.go
+++ b/modules/core/23-commitment/types/utils.go
@@ -1,9 +1,9 @@
package types
import (
+ crypto "github.com/cometbft/cometbft/proto/tendermint/crypto"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
ics23 "github.com/cosmos/ics23/go"
- crypto "github.com/tendermint/tendermint/proto/tendermint/crypto"
)
// ConvertProofs converts crypto.ProofOps into MerkleProof
diff --git a/modules/core/23-commitment/types/utils_test.go b/modules/core/23-commitment/types/utils_test.go
index 4a1c5d3e185..4f5b4f89f5c 100644
--- a/modules/core/23-commitment/types/utils_test.go
+++ b/modules/core/23-commitment/types/utils_test.go
@@ -3,9 +3,9 @@ package types_test
import (
"fmt"
+ abci "github.com/cometbft/cometbft/abci/types"
+ crypto "github.com/cometbft/cometbft/proto/tendermint/crypto"
"github.com/stretchr/testify/require"
- abci "github.com/tendermint/tendermint/abci/types"
- crypto "github.com/tendermint/tendermint/proto/tendermint/crypto"
"github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types"
)
diff --git a/modules/core/client/query.go b/modules/core/client/query.go
index 48a87b3fa17..19b490a1c25 100644
--- a/modules/core/client/query.go
+++ b/modules/core/client/query.go
@@ -3,9 +3,9 @@ package client
import (
"fmt"
+ abci "github.com/cometbft/cometbft/abci/types"
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/codec"
- abci "github.com/tendermint/tendermint/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"
diff --git a/modules/core/exported/client.go b/modules/core/exported/client.go
index 88273ecc860..731d7e5edf7 100644
--- a/modules/core/exported/client.go
+++ b/modules/core/exported/client.go
@@ -19,6 +19,12 @@ const (
// Tendermint is used to indicate that the client uses the Tendermint Consensus Algorithm.
Tendermint string = "07-tendermint"
+ // Localhost is the client type for the localhost client.
+ Localhost string = "09-localhost"
+
+ // LocalhostClientID is the sentinel client ID for the localhost client.
+ LocalhostClientID string = Localhost
+
// Active is a status type of a client. An active client is allowed to be used.
Active Status = "Active"
@@ -30,6 +36,9 @@ const (
// Unknown indicates there was an error in determining the status of a client.
Unknown Status = "Unknown"
+
+ // Unauthorized indicates that the client type is not registered as an allowed client type.
+ Unauthorized Status = "Unauthorized"
)
// ClientState defines the required common functions for light clients.
diff --git a/modules/core/exported/connection.go b/modules/core/exported/connection.go
index 93129050db2..c418e8497a7 100644
--- a/modules/core/exported/connection.go
+++ b/modules/core/exported/connection.go
@@ -1,5 +1,8 @@
package exported
+// LocalhostConnectionID is the sentinel connection ID for the localhost connection.
+const LocalhostConnectionID string = "connection-localhost"
+
// ConnectionI describes the required methods for a connection.
type ConnectionI interface {
GetClientID() string
diff --git a/modules/core/genesis_test.go b/modules/core/genesis_test.go
index 215383fe09d..51ba25a9ea0 100644
--- a/modules/core/genesis_test.go
+++ b/modules/core/genesis_test.go
@@ -4,9 +4,9 @@ import (
"fmt"
"testing"
+ tmproto "github.com/cometbft/cometbft/proto/tendermint/types"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/stretchr/testify/suite"
- tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
ibc "github.com/cosmos/ibc-go/v7/modules/core"
clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
diff --git a/modules/core/keeper/msg_server.go b/modules/core/keeper/msg_server.go
index 460edb08643..7bb3c33ae33 100644
--- a/modules/core/keeper/msg_server.go
+++ b/modules/core/keeper/msg_server.go
@@ -250,7 +250,8 @@ func (k Keeper) ChannelOpenTry(goCtx context.Context, msg *channeltypes.MsgChann
ctx.Logger().Info("channel open try callback succeeded", "channel-id", channelID, "port-id", msg.PortId, "version", version)
return &channeltypes.MsgChannelOpenTryResponse{
- Version: version,
+ ChannelId: channelID,
+ Version: version,
}, nil
}
@@ -453,10 +454,6 @@ func (k Keeper) RecvPacket(goCtx context.Context, msg *channeltypes.MsgRecvPacke
if ack == nil || ack.Success() {
// write application state changes for asynchronous and successful acknowledgements
writeFn()
- } else {
- // NOTE: The context returned by CacheContext() refers to a new EventManager, so it needs to explicitly set events to the original context.
- // Events should still be emitted from failed acks and asynchronous acks
- ctx.EventManager().EmitEvents(cacheCtx.EventManager().Events())
}
// Set packet acknowledgement only if the acknowledgement is not nil.
diff --git a/modules/core/module.go b/modules/core/module.go
index ee0799f64c2..7f0cbfbd0aa 100644
--- a/modules/core/module.go
+++ b/modules/core/module.go
@@ -4,8 +4,8 @@ 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"
@@ -14,11 +14,11 @@ import (
simtypes "github.com/cosmos/cosmos-sdk/types/simulation"
"github.com/grpc-ecosystem/grpc-gateway/runtime"
"github.com/spf13/cobra"
- abci "github.com/tendermint/tendermint/abci/types"
ibcclient "github.com/cosmos/ibc-go/v7/modules/core/02-client"
clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper"
clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
+ connectionkeeper "github.com/cosmos/ibc-go/v7/modules/core/03-connection/keeper"
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/client/cli"
@@ -124,9 +124,23 @@ func (am AppModule) RegisterServices(cfg module.Configurator) {
channeltypes.RegisterMsgServer(cfg.MsgServer(), am.keeper)
types.RegisterQueryService(cfg.QueryServer(), am.keeper)
- m := clientkeeper.NewMigrator(am.keeper.ClientKeeper)
- err := cfg.RegisterMigration(exported.ModuleName, 2, m.Migrate2to3)
- if err != nil {
+ clientMigrator := clientkeeper.NewMigrator(am.keeper.ClientKeeper)
+ if err := cfg.RegisterMigration(exported.ModuleName, 2, clientMigrator.Migrate2to3); err != nil {
+ panic(err)
+ }
+
+ connectionMigrator := connectionkeeper.NewMigrator(am.keeper.ConnectionKeeper)
+ if err := cfg.RegisterMigration(exported.ModuleName, 3, func(ctx sdk.Context) error {
+ if err := connectionMigrator.Migrate3to4(ctx); err != nil {
+ return err
+ }
+
+ if err := clientMigrator.Migrate3to4(ctx); err != nil {
+ return err
+ }
+
+ return nil
+ }); err != nil {
panic(err)
}
}
@@ -150,7 +164,7 @@ func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.Raw
}
// ConsensusVersion implements AppModule/ConsensusVersion.
-func (AppModule) ConsensusVersion() uint64 { return 3 }
+func (AppModule) ConsensusVersion() uint64 { return 4 }
// BeginBlock returns the begin blocker for the ibc module.
func (am AppModule) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) {
@@ -170,16 +184,6 @@ func (AppModule) GenerateGenesisState(simState *module.SimulationState) {
simulation.RandomizedGenState(simState)
}
-// ProposalContents doesn't return any content functions for governance proposals.
-func (AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalContent {
- return nil
-}
-
-// RandomizedParams returns nil since IBC doesn't register parameter changes.
-func (AppModule) RandomizedParams(_ *rand.Rand) []simtypes.ParamChange {
- return nil
-}
-
// RegisterStoreDecoder registers a decoder for ibc module's types
func (am AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) {
sdr[exported.StoreKey] = simulation.NewDecodeStore(*am.keeper)
diff --git a/modules/core/types/codec.go b/modules/core/types/codec.go
index 447b05c849b..e2c67424026 100644
--- a/modules/core/types/codec.go
+++ b/modules/core/types/codec.go
@@ -7,12 +7,15 @@ import (
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"
+ localhost "github.com/cosmos/ibc-go/v7/modules/light-clients/09-localhost"
)
-// RegisterInterfaces registers x/ibc interfaces into protobuf Any.
+// RegisterInterfaces registers ibc types against interfaces using the global InterfaceRegistry.
+// Note: The localhost client is created by ibc core and thus requires explicit type registration.
func RegisterInterfaces(registry codectypes.InterfaceRegistry) {
clienttypes.RegisterInterfaces(registry)
connectiontypes.RegisterInterfaces(registry)
channeltypes.RegisterInterfaces(registry)
commitmenttypes.RegisterInterfaces(registry)
+ localhost.RegisterInterfaces(registry)
}
diff --git a/modules/light-clients/06-solomachine/keys.go b/modules/light-clients/06-solomachine/keys.go
index 2254ad60119..cbb665d6fe3 100644
--- a/modules/light-clients/06-solomachine/keys.go
+++ b/modules/light-clients/06-solomachine/keys.go
@@ -1,5 +1,5 @@
package solomachine
const (
- ModuleName = "solo machine"
+ ModuleName = "06-solomachine"
)
diff --git a/modules/light-clients/07-tendermint/client_state.go b/modules/light-clients/07-tendermint/client_state.go
index 5b083341415..66223775ba2 100644
--- a/modules/light-clients/07-tendermint/client_state.go
+++ b/modules/light-clients/07-tendermint/client_state.go
@@ -4,12 +4,12 @@ import (
"strings"
"time"
+ "github.com/cometbft/cometbft/light"
+ tmtypes "github.com/cometbft/cometbft/types"
"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
ics23 "github.com/cosmos/ics23/go"
- "github.com/tendermint/tendermint/light"
- 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"
diff --git a/modules/light-clients/07-tendermint/client_state_test.go b/modules/light-clients/07-tendermint/client_state_test.go
index 2a70d4199a6..9df8c6047ba 100644
--- a/modules/light-clients/07-tendermint/client_state_test.go
+++ b/modules/light-clients/07-tendermint/client_state_test.go
@@ -420,6 +420,12 @@ func (suite *TendermintTestSuite) TestVerifyMembership() {
value = []byte("invalid value")
}, false,
},
+ {
+ "proof is empty", func() {
+ // change the inserted proof
+ proof = []byte{}
+ }, false,
+ },
}
for _, tc := range testCases {
@@ -631,6 +637,12 @@ func (suite *TendermintTestSuite) TestVerifyNonMembership() {
proof, proofHeight = suite.chainB.QueryProof(key)
}, false,
},
+ {
+ "proof is empty", func() {
+ // change the inserted proof
+ proof = []byte{}
+ }, false,
+ },
}
for _, tc := range testCases {
diff --git a/modules/light-clients/07-tendermint/consensus_state.go b/modules/light-clients/07-tendermint/consensus_state.go
index 6656bb5ad4c..8ce880a6513 100644
--- a/modules/light-clients/07-tendermint/consensus_state.go
+++ b/modules/light-clients/07-tendermint/consensus_state.go
@@ -3,9 +3,9 @@ package tendermint
import (
"time"
+ tmbytes "github.com/cometbft/cometbft/libs/bytes"
+ tmtypes "github.com/cometbft/cometbft/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
- tmbytes "github.com/tendermint/tendermint/libs/bytes"
- 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"
diff --git a/modules/light-clients/07-tendermint/fraction.go b/modules/light-clients/07-tendermint/fraction.go
index 772c6d9c171..f9b750e7ecc 100644
--- a/modules/light-clients/07-tendermint/fraction.go
+++ b/modules/light-clients/07-tendermint/fraction.go
@@ -1,8 +1,8 @@
package tendermint
import (
- tmmath "github.com/tendermint/tendermint/libs/math"
- "github.com/tendermint/tendermint/light"
+ tmmath "github.com/cometbft/cometbft/libs/math"
+ "github.com/cometbft/cometbft/light"
)
// DefaultTrustLevel is the tendermint light client default trust level
diff --git a/modules/light-clients/07-tendermint/header.go b/modules/light-clients/07-tendermint/header.go
index 5db68127d10..daa3a9e699b 100644
--- a/modules/light-clients/07-tendermint/header.go
+++ b/modules/light-clients/07-tendermint/header.go
@@ -4,8 +4,8 @@ import (
"bytes"
"time"
+ tmtypes "github.com/cometbft/cometbft/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
- 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"
diff --git a/modules/light-clients/07-tendermint/header_test.go b/modules/light-clients/07-tendermint/header_test.go
index 5325bdb7a62..1a1769927e9 100644
--- a/modules/light-clients/07-tendermint/header_test.go
+++ b/modules/light-clients/07-tendermint/header_test.go
@@ -3,7 +3,7 @@ package tendermint_test
import (
"time"
- tmprotocrypto "github.com/tendermint/tendermint/proto/tendermint/crypto"
+ tmprotocrypto "github.com/cometbft/cometbft/proto/tendermint/crypto"
clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
"github.com/cosmos/ibc-go/v7/modules/core/exported"
diff --git a/modules/light-clients/07-tendermint/keys.go b/modules/light-clients/07-tendermint/keys.go
index e2e31b377fb..bc2fd02dec1 100644
--- a/modules/light-clients/07-tendermint/keys.go
+++ b/modules/light-clients/07-tendermint/keys.go
@@ -1,5 +1,5 @@
package tendermint
const (
- ModuleName = "tendermint-client"
+ ModuleName = "07-tendermint"
)
diff --git a/modules/light-clients/07-tendermint/migrations/expected_keepers.go b/modules/light-clients/07-tendermint/migrations/expected_keepers.go
index e47a82e40c1..e68bdbc97da 100644
--- a/modules/light-clients/07-tendermint/migrations/expected_keepers.go
+++ b/modules/light-clients/07-tendermint/migrations/expected_keepers.go
@@ -1,8 +1,8 @@
package migrations
import (
+ "github.com/cometbft/cometbft/libs/log"
sdk "github.com/cosmos/cosmos-sdk/types"
- "github.com/tendermint/tendermint/libs/log"
"github.com/cosmos/ibc-go/v7/modules/core/exported"
)
diff --git a/modules/light-clients/07-tendermint/misbehaviour.go b/modules/light-clients/07-tendermint/misbehaviour.go
index 89722ae415b..a521a750dc1 100644
--- a/modules/light-clients/07-tendermint/misbehaviour.go
+++ b/modules/light-clients/07-tendermint/misbehaviour.go
@@ -3,9 +3,9 @@ package tendermint
import (
"time"
+ tmproto "github.com/cometbft/cometbft/proto/tendermint/types"
+ tmtypes "github.com/cometbft/cometbft/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
- tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
- tmtypes "github.com/tendermint/tendermint/types"
clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
host "github.com/cosmos/ibc-go/v7/modules/core/24-host"
diff --git a/modules/light-clients/07-tendermint/misbehaviour_handle.go b/modules/light-clients/07-tendermint/misbehaviour_handle.go
index 961d9ea69cf..4f3b4a2f90b 100644
--- a/modules/light-clients/07-tendermint/misbehaviour_handle.go
+++ b/modules/light-clients/07-tendermint/misbehaviour_handle.go
@@ -5,16 +5,17 @@ import (
"reflect"
"time"
+ tmtypes "github.com/cometbft/cometbft/types"
"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
- tmtypes "github.com/tendermint/tendermint/types"
clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
"github.com/cosmos/ibc-go/v7/modules/core/exported"
)
// CheckForMisbehaviour detects duplicate height misbehaviour and BFT time violation misbehaviour
+// in a submitted Header message and verifies the correctness of a submitted Misbehaviour ClientMessage
func (cs ClientState) CheckForMisbehaviour(ctx sdk.Context, cdc codec.BinaryCodec, clientStore sdk.KVStore, msg exported.ClientMessage) bool {
switch msg := msg.(type) {
case *Header:
@@ -51,9 +52,29 @@ func (cs ClientState) CheckForMisbehaviour(ctx sdk.Context, cdc codec.BinaryCode
return true
}
case *Misbehaviour:
- // The correctness of Misbehaviour ClientMessage types is ensured by calling VerifyClientMessage prior to this function
- // Thus, here we can return true, as ClientMessage is of type Misbehaviour
- return true
+ // if heights are equal check that this is valid misbehaviour of a fork
+ // otherwise if heights are unequal check that this is valid misbehavior of BFT time violation
+ if msg.Header1.GetHeight().EQ(msg.Header2.GetHeight()) {
+ blockID1, err := tmtypes.BlockIDFromProto(&msg.Header1.SignedHeader.Commit.BlockID)
+ if err != nil {
+ return false
+ }
+
+ blockID2, err := tmtypes.BlockIDFromProto(&msg.Header2.SignedHeader.Commit.BlockID)
+ if err != nil {
+ return false
+ }
+
+ // Ensure that Commit Hashes are different
+ if !bytes.Equal(blockID1.Hash, blockID2.Hash) {
+ return true
+ }
+
+ } else if !msg.Header1.SignedHeader.Header.Time.After(msg.Header2.SignedHeader.Header.Time) {
+ // Header1 is at greater height than Header2, therefore Header1 time must be less than or equal to
+ // Header2 time in order to be valid misbehaviour (violation of monotonic time).
+ return true
+ }
}
return false
@@ -68,30 +89,6 @@ func (cs ClientState) CheckForMisbehaviour(ctx sdk.Context, cdc codec.BinaryCode
// to misbehaviour.Header2
// Misbehaviour sets frozen height to {0, 1} since it is only used as a boolean value (zero or non-zero).
func (cs *ClientState) verifyMisbehaviour(ctx sdk.Context, clientStore sdk.KVStore, cdc codec.BinaryCodec, misbehaviour *Misbehaviour) error {
- // if heights are equal check that this is valid misbehaviour of a fork
- // otherwise if heights are unequal check that this is valid misbehavior of BFT time violation
- if misbehaviour.Header1.GetHeight().EQ(misbehaviour.Header2.GetHeight()) {
- blockID1, err := tmtypes.BlockIDFromProto(&misbehaviour.Header1.SignedHeader.Commit.BlockID)
- if err != nil {
- return sdkerrors.Wrap(err, "invalid block ID from header 1 in misbehaviour")
- }
-
- blockID2, err := tmtypes.BlockIDFromProto(&misbehaviour.Header2.SignedHeader.Commit.BlockID)
- if err != nil {
- return sdkerrors.Wrap(err, "invalid block ID from header 2 in misbehaviour")
- }
-
- // Ensure that Commit Hashes are different
- if bytes.Equal(blockID1.Hash, blockID2.Hash) {
- return sdkerrors.Wrap(clienttypes.ErrInvalidMisbehaviour, "headers block hashes are equal")
- }
-
- } else if misbehaviour.Header1.SignedHeader.Header.Time.After(misbehaviour.Header2.SignedHeader.Header.Time) {
- // Header1 is at greater height than Header2, therefore Header1 time must be less than or equal to
- // Header2 time in order to be valid misbehaviour (violation of monotonic time).
- return sdkerrors.Wrap(clienttypes.ErrInvalidMisbehaviour, "headers are not at same height and are monotonically increasing")
- }
-
// Regardless of the type of misbehaviour, ensure that both headers are valid and would have been accepted by light-client
// Retrieve trusted consensus states for each Header in misbehaviour
diff --git a/modules/light-clients/07-tendermint/misbehaviour_handle_test.go b/modules/light-clients/07-tendermint/misbehaviour_handle_test.go
index aa458dbc69c..232fb38fe75 100644
--- a/modules/light-clients/07-tendermint/misbehaviour_handle_test.go
+++ b/modules/light-clients/07-tendermint/misbehaviour_handle_test.go
@@ -5,7 +5,7 @@ import (
"strings"
"time"
- tmtypes "github.com/tendermint/tendermint/types"
+ tmtypes "github.com/cometbft/cometbft/types"
clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
"github.com/cosmos/ibc-go/v7/modules/core/exported"
@@ -204,38 +204,6 @@ func (suite *TendermintTestSuite) TestVerifyMisbehaviour() {
}
}, true,
},
- {
- "invalid fork misbehaviour: identical headers", func() {
- trustedHeight := path.EndpointA.GetClientState().GetLatestHeight().(clienttypes.Height)
-
- trustedVals, found := suite.chainB.GetValsAtHeight(int64(trustedHeight.RevisionHeight) + 1)
- suite.Require().True(found)
-
- err := path.EndpointA.UpdateClient()
- suite.Require().NoError(err)
-
- height := path.EndpointA.GetClientState().GetLatestHeight().(clienttypes.Height)
-
- misbehaviourHeader := suite.chainB.CreateTMClientHeader(suite.chainB.ChainID, int64(height.RevisionHeight), trustedHeight, suite.chainB.CurrentHeader.Time.Add(time.Minute), suite.chainB.Vals, suite.chainB.NextVals, trustedVals, suite.chainB.Signers)
- misbehaviour = &ibctm.Misbehaviour{
- Header1: misbehaviourHeader,
- Header2: misbehaviourHeader,
- }
- }, false,
- },
- {
- "invalid time misbehaviour: monotonically increasing time", func() {
- trustedHeight := path.EndpointA.GetClientState().GetLatestHeight().(clienttypes.Height)
-
- trustedVals, found := suite.chainB.GetValsAtHeight(int64(trustedHeight.RevisionHeight) + 1)
- suite.Require().True(found)
-
- misbehaviour = &ibctm.Misbehaviour{
- Header1: suite.chainB.CreateTMClientHeader(suite.chainB.ChainID, suite.chainB.CurrentHeader.Height+3, trustedHeight, suite.chainB.CurrentHeader.Time.Add(time.Minute), suite.chainB.Vals, suite.chainB.NextVals, trustedVals, suite.chainB.Signers),
- Header2: suite.chainB.CreateTMClientHeader(suite.chainB.ChainID, suite.chainB.CurrentHeader.Height, trustedHeight, suite.chainB.CurrentHeader.Time, suite.chainB.Vals, suite.chainB.NextVals, trustedVals, suite.chainB.Signers),
- }
- }, false,
- },
{
"invalid misbehaviour: misbehaviour from different chain", func() {
trustedHeight := path.EndpointA.GetClientState().GetLatestHeight().(clienttypes.Height)
@@ -523,38 +491,6 @@ func (suite *TendermintTestSuite) TestVerifyMisbehaviourNonRevisionChainID() {
}
}, true,
},
- {
- "invalid fork misbehaviour: identical headers", func() {
- trustedHeight := path.EndpointA.GetClientState().GetLatestHeight().(clienttypes.Height)
-
- trustedVals, found := suite.chainB.GetValsAtHeight(int64(trustedHeight.RevisionHeight) + 1)
- suite.Require().True(found)
-
- err := path.EndpointA.UpdateClient()
- suite.Require().NoError(err)
-
- height := path.EndpointA.GetClientState().GetLatestHeight().(clienttypes.Height)
-
- misbehaviourHeader := suite.chainB.CreateTMClientHeader(suite.chainB.ChainID, int64(height.RevisionHeight), trustedHeight, suite.chainB.CurrentHeader.Time.Add(time.Minute), suite.chainB.Vals, suite.chainB.NextVals, trustedVals, suite.chainB.Signers)
- misbehaviour = &ibctm.Misbehaviour{
- Header1: misbehaviourHeader,
- Header2: misbehaviourHeader,
- }
- }, false,
- },
- {
- "invalid time misbehaviour: monotonically increasing time", func() {
- trustedHeight := path.EndpointA.GetClientState().GetLatestHeight().(clienttypes.Height)
-
- trustedVals, found := suite.chainB.GetValsAtHeight(int64(trustedHeight.RevisionHeight) + 1)
- suite.Require().True(found)
-
- misbehaviour = &ibctm.Misbehaviour{
- Header1: suite.chainB.CreateTMClientHeader(suite.chainB.ChainID, suite.chainB.CurrentHeader.Height+3, trustedHeight, suite.chainB.CurrentHeader.Time.Add(time.Minute), suite.chainB.Vals, suite.chainB.NextVals, trustedVals, suite.chainB.Signers),
- Header2: suite.chainB.CreateTMClientHeader(suite.chainB.ChainID, suite.chainB.CurrentHeader.Height, trustedHeight, suite.chainB.CurrentHeader.Time, suite.chainB.Vals, suite.chainB.NextVals, trustedVals, suite.chainB.Signers),
- }
- }, false,
- },
{
"invalid misbehaviour: misbehaviour from different chain", func() {
trustedHeight := path.EndpointA.GetClientState().GetLatestHeight().(clienttypes.Height)
diff --git a/modules/light-clients/07-tendermint/misbehaviour_test.go b/modules/light-clients/07-tendermint/misbehaviour_test.go
index d49df447f3c..61a5458906b 100644
--- a/modules/light-clients/07-tendermint/misbehaviour_test.go
+++ b/modules/light-clients/07-tendermint/misbehaviour_test.go
@@ -3,9 +3,9 @@ package tendermint_test
import (
"time"
- "github.com/tendermint/tendermint/crypto/tmhash"
- tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
- tmtypes "github.com/tendermint/tendermint/types"
+ "github.com/cometbft/cometbft/crypto/tmhash"
+ 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"
"github.com/cosmos/ibc-go/v7/modules/core/exported"
diff --git a/modules/light-clients/07-tendermint/store.go b/modules/light-clients/07-tendermint/store.go
index da5e2a4e9c3..8f992bc5183 100644
--- a/modules/light-clients/07-tendermint/store.go
+++ b/modules/light-clients/07-tendermint/store.go
@@ -60,7 +60,7 @@ func setConsensusState(clientStore sdk.KVStore, cdc codec.BinaryCodec, consensus
// If the ConsensusState does not exist in state for the provided height a nil value and false boolean flag is returned
func GetConsensusState(store sdk.KVStore, cdc codec.BinaryCodec, height exported.Height) (*ConsensusState, bool) {
bz := store.Get(host.ConsensusStateKey(height))
- if bz == nil {
+ if len(bz) == 0 {
return nil, false
}
@@ -129,7 +129,7 @@ func SetProcessedTime(clientStore sdk.KVStore, height exported.Height, timeNs ui
func GetProcessedTime(clientStore sdk.KVStore, height exported.Height) (uint64, bool) {
key := ProcessedTimeKey(height)
bz := clientStore.Get(key)
- if bz == nil {
+ if len(bz) == 0 {
return 0, false
}
return sdk.BigEndianToUint64(bz), true
@@ -160,7 +160,7 @@ func SetProcessedHeight(clientStore sdk.KVStore, consHeight, processedHeight exp
func GetProcessedHeight(clientStore sdk.KVStore, height exported.Height) (exported.Height, bool) {
key := ProcessedHeightKey(height)
bz := clientStore.Get(key)
- if bz == nil {
+ if len(bz) == 0 {
return nil, false
}
processedHeight, err := clienttypes.ParseHeight(string(bz))
@@ -306,7 +306,7 @@ func PruneAllExpiredConsensusStates(
// Helper function for GetNextConsensusState and GetPreviousConsensusState
func getTmConsensusState(clientStore sdk.KVStore, cdc codec.BinaryCodec, key []byte) (*ConsensusState, bool) {
bz := clientStore.Get(key)
- if bz == nil {
+ if len(bz) == 0 {
return nil, false
}
diff --git a/modules/light-clients/07-tendermint/tendermint.pb.go b/modules/light-clients/07-tendermint/tendermint.pb.go
index dcff8304099..169630c8cf9 100644
--- a/modules/light-clients/07-tendermint/tendermint.pb.go
+++ b/modules/light-clients/07-tendermint/tendermint.pb.go
@@ -5,14 +5,14 @@ package tendermint
import (
fmt "fmt"
+ github_com_cometbft_cometbft_libs_bytes "github.com/cometbft/cometbft/libs/bytes"
+ types2 "github.com/cometbft/cometbft/proto/tendermint/types"
_ "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"
types1 "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types"
_go "github.com/cosmos/ics23/go"
- github_com_tendermint_tendermint_libs_bytes "github.com/tendermint/tendermint/libs/bytes"
- types2 "github.com/tendermint/tendermint/proto/tendermint/types"
_ "google.golang.org/protobuf/types/known/durationpb"
_ "google.golang.org/protobuf/types/known/timestamppb"
io "io"
@@ -104,8 +104,8 @@ type ConsensusState struct {
// was stored.
Timestamp time.Time `protobuf:"bytes,1,opt,name=timestamp,proto3,stdtime" json:"timestamp"`
// commitment root (i.e app hash)
- Root types1.MerkleRoot `protobuf:"bytes,2,opt,name=root,proto3" json:"root"`
- NextValidatorsHash github_com_tendermint_tendermint_libs_bytes.HexBytes `protobuf:"bytes,3,opt,name=next_validators_hash,json=nextValidatorsHash,proto3,casttype=github.com/tendermint/tendermint/libs/bytes.HexBytes" json:"next_validators_hash,omitempty" yaml:"next_validators_hash"`
+ Root types1.MerkleRoot `protobuf:"bytes,2,opt,name=root,proto3" json:"root"`
+ NextValidatorsHash github_com_cometbft_cometbft_libs_bytes.HexBytes `protobuf:"bytes,3,opt,name=next_validators_hash,json=nextValidatorsHash,proto3,casttype=github.com/cometbft/cometbft/libs/bytes.HexBytes" json:"next_validators_hash,omitempty" yaml:"next_validators_hash"`
}
func (m *ConsensusState) Reset() { *m = ConsensusState{} }
@@ -323,76 +323,76 @@ func init() {
}
var fileDescriptor_c6d6cf2b288949be = []byte{
- // 1089 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0x4f, 0x6f, 0xe3, 0x44,
- 0x14, 0x6f, 0xda, 0xb2, 0x4d, 0x26, 0xe9, 0x76, 0x31, 0xa5, 0x9b, 0x96, 0x6e, 0x1c, 0x19, 0xa9,
- 0xf4, 0x40, 0x6d, 0x92, 0x22, 0xad, 0x54, 0xb8, 0xe0, 0x2e, 0xa8, 0xbb, 0x62, 0xa5, 0xca, 0xe5,
- 0x8f, 0x84, 0x84, 0xcc, 0xc4, 0x9e, 0x24, 0xa3, 0xb5, 0x3d, 0x96, 0x67, 0x1c, 0x5a, 0x3e, 0x01,
- 0x9c, 0xd8, 0x23, 0xe2, 0xc4, 0x81, 0x0f, 0xb3, 0xc7, 0x1e, 0x39, 0x19, 0xd4, 0x7e, 0x83, 0x1c,
- 0x38, 0x70, 0x42, 0xf3, 0xc7, 0xf6, 0xb4, 0xdb, 0xa5, 0x5a, 0x2e, 0xd1, 0xbc, 0xf7, 0x7e, 0xef,
- 0xf7, 0xcb, 0xbc, 0x79, 0xf3, 0xc6, 0xc0, 0xc1, 0xa3, 0xc0, 0x89, 0xf0, 0x64, 0xca, 0x82, 0x08,
- 0xa3, 0x84, 0x51, 0x87, 0xa1, 0x24, 0x44, 0x59, 0x8c, 0x13, 0xe6, 0xcc, 0x06, 0x9a, 0x65, 0xa7,
- 0x19, 0x61, 0xc4, 0xe8, 0xe1, 0x51, 0x60, 0xeb, 0x09, 0xb6, 0x06, 0x99, 0x0d, 0xb6, 0xfa, 0x5a,
- 0x3e, 0x3b, 0x4b, 0x11, 0x75, 0x66, 0x30, 0xc2, 0x21, 0x64, 0x24, 0x93, 0x0c, 0x5b, 0xdb, 0x2f,
- 0x21, 0xc4, 0x6f, 0x19, 0x0d, 0x08, 0x8d, 0x09, 0x75, 0x70, 0x40, 0x87, 0xfb, 0xfc, 0x1f, 0xa4,
- 0x19, 0x21, 0xe3, 0x32, 0xda, 0x9b, 0x10, 0x32, 0x89, 0x90, 0x23, 0xac, 0x51, 0x3e, 0x76, 0xc2,
- 0x3c, 0x83, 0x0c, 0x93, 0x44, 0xc5, 0xcd, 0xeb, 0x71, 0x86, 0x63, 0x44, 0x19, 0x8c, 0xd3, 0x12,
- 0xc0, 0xf7, 0x1b, 0x90, 0x0c, 0x39, 0xf2, 0xef, 0x73, 0x05, 0xb9, 0x52, 0x80, 0xf7, 0x6a, 0x00,
- 0x89, 0x63, 0xcc, 0xe2, 0x12, 0x54, 0x59, 0x0a, 0xb8, 0x3e, 0x21, 0x13, 0x22, 0x96, 0x0e, 0x5f,
- 0x49, 0xaf, 0xf5, 0xf7, 0x0a, 0x68, 0x1f, 0x0a, 0xbe, 0x13, 0x06, 0x19, 0x32, 0x36, 0x41, 0x33,
- 0x98, 0x42, 0x9c, 0xf8, 0x38, 0xec, 0x36, 0xfa, 0x8d, 0xdd, 0x96, 0xb7, 0x22, 0xec, 0xc7, 0xa1,
- 0x81, 0x40, 0x9b, 0x65, 0x39, 0x65, 0x7e, 0x84, 0x66, 0x28, 0xea, 0x2e, 0xf6, 0x1b, 0xbb, 0xed,
- 0xe1, 0xae, 0xfd, 0xdf, 0xf5, 0xb5, 0x3f, 0xcb, 0x60, 0xc0, 0x37, 0xec, 0x6e, 0xbd, 0x28, 0xcc,
- 0x85, 0x79, 0x61, 0x1a, 0x67, 0x30, 0x8e, 0x0e, 0x2c, 0x8d, 0xca, 0xf2, 0x80, 0xb0, 0x3e, 0xe7,
- 0x86, 0x31, 0x06, 0x6b, 0xc2, 0xc2, 0xc9, 0xc4, 0x4f, 0x51, 0x86, 0x49, 0xd8, 0x5d, 0x12, 0x52,
- 0x9b, 0xb6, 0x2c, 0x96, 0x5d, 0x16, 0xcb, 0x7e, 0xa4, 0x8a, 0xe9, 0x5a, 0x8a, 0x7b, 0x43, 0xe3,
- 0xae, 0xf3, 0xad, 0x5f, 0xfe, 0x34, 0x1b, 0xde, 0xdd, 0xd2, 0x7b, 0x2c, 0x9c, 0x06, 0x06, 0xf7,
- 0xf2, 0x64, 0x44, 0x92, 0x50, 0x13, 0x5a, 0xbe, 0x4d, 0xe8, 0x5d, 0x25, 0x74, 0x5f, 0x0a, 0x5d,
- 0x27, 0x90, 0x4a, 0x6b, 0x95, 0x5b, 0x49, 0x21, 0xb0, 0x16, 0xc3, 0x53, 0x3f, 0x88, 0x48, 0xf0,
- 0xcc, 0x0f, 0x33, 0x3c, 0x66, 0xdd, 0x37, 0x5e, 0x73, 0x4b, 0xd7, 0xf2, 0xa5, 0xd0, 0x6a, 0x0c,
- 0x4f, 0x0f, 0xb9, 0xf3, 0x11, 0xf7, 0x19, 0xdf, 0x82, 0xd5, 0x71, 0x46, 0x7e, 0x40, 0x89, 0x3f,
- 0x45, 0xfc, 0x40, 0xba, 0x77, 0x84, 0xc8, 0x96, 0x38, 0x22, 0xde, 0x22, 0xb6, 0xea, 0x9c, 0xd9,
- 0xc0, 0x3e, 0x12, 0x08, 0x77, 0x5b, 0xa9, 0xac, 0x4b, 0x95, 0x2b, 0xe9, 0x96, 0xd7, 0x91, 0xb6,
- 0xc4, 0x72, 0xfa, 0x08, 0x32, 0x44, 0x59, 0x49, 0xbf, 0xf2, 0xba, 0xf4, 0x57, 0xd2, 0x2d, 0xaf,
- 0x23, 0x6d, 0x45, 0x7f, 0x02, 0xda, 0xe2, 0xea, 0xf8, 0x34, 0x45, 0x01, 0xed, 0x36, 0xfb, 0x4b,
- 0x82, 0x5c, 0x5e, 0x2f, 0x5b, 0x5c, 0x2f, 0xce, 0x7c, 0xcc, 0x31, 0x27, 0x29, 0x0a, 0xdc, 0x8d,
- 0xba, 0x99, 0xb4, 0x44, 0xcb, 0x03, 0x69, 0x09, 0xa1, 0xc6, 0x01, 0xe8, 0xe4, 0xe9, 0x24, 0x83,
- 0x21, 0xf2, 0x53, 0xc8, 0xa6, 0xdd, 0x56, 0x7f, 0x69, 0xb7, 0xe5, 0xde, 0x9f, 0x17, 0xe6, 0x5b,
- 0xea, 0x04, 0xb5, 0xa8, 0xe5, 0xb5, 0x95, 0x79, 0x0c, 0xd9, 0xd4, 0x80, 0x60, 0x13, 0x46, 0x11,
- 0xf9, 0xde, 0xcf, 0xd3, 0x10, 0x32, 0xe4, 0xc3, 0x31, 0x43, 0x99, 0x8f, 0x4e, 0x53, 0x9c, 0x9d,
- 0x75, 0x41, 0xbf, 0xb1, 0xdb, 0x74, 0x77, 0xe6, 0x85, 0xd9, 0x97, 0x44, 0xaf, 0x84, 0x5a, 0xdd,
- 0x86, 0xb7, 0x21, 0xa2, 0x5f, 0x8a, 0xe0, 0x27, 0x3c, 0xf6, 0xa9, 0x08, 0x19, 0x14, 0x98, 0x37,
- 0xe4, 0xc5, 0x98, 0x8e, 0xd0, 0x14, 0xce, 0x30, 0xc9, 0xb3, 0x6e, 0x5b, 0x08, 0xbd, 0x3f, 0x2f,
- 0xcc, 0x9d, 0x57, 0x0a, 0xe9, 0x09, 0x5c, 0x6e, 0xfb, 0xba, 0xdc, 0x53, 0x0d, 0x70, 0xb0, 0xfc,
- 0xe3, 0x6f, 0xe6, 0x82, 0xf5, 0xfb, 0x22, 0xb8, 0x7b, 0x48, 0x12, 0x8a, 0x12, 0x9a, 0x53, 0x79,
- 0xf7, 0x5d, 0xd0, 0xaa, 0xc6, 0x8f, 0xb8, 0xfc, 0xbc, 0xfe, 0xd7, 0x1b, 0xf4, 0x8b, 0x12, 0xe1,
- 0x36, 0xf9, 0xe1, 0x3e, 0xe7, 0x7d, 0x58, 0xa7, 0x19, 0x1f, 0x83, 0xe5, 0x8c, 0x10, 0xa6, 0xa6,
- 0x83, 0xa5, 0xf5, 0x46, 0x3d, 0x8f, 0x66, 0x03, 0xfb, 0x29, 0xca, 0x9e, 0x45, 0xc8, 0x23, 0x84,
- 0xb9, 0xcb, 0x9c, 0xc6, 0x13, 0x59, 0xc6, 0x4f, 0x0d, 0xb0, 0x9e, 0xa0, 0x53, 0xe6, 0x57, 0x33,
- 0x98, 0xfa, 0x53, 0x48, 0xa7, 0x62, 0x02, 0x74, 0xdc, 0xaf, 0xe7, 0x85, 0xf9, 0x8e, 0xac, 0xc2,
- 0x4d, 0x28, 0xeb, 0x9f, 0xc2, 0xfc, 0x70, 0x82, 0xd9, 0x34, 0x1f, 0x71, 0x39, 0xfd, 0x65, 0xd0,
- 0x96, 0x11, 0x1e, 0x51, 0x67, 0x74, 0xc6, 0x10, 0xb5, 0x8f, 0xd0, 0xa9, 0xcb, 0x17, 0x9e, 0xc1,
- 0xe9, 0xbe, 0xaa, 0xd8, 0x8e, 0x20, 0x9d, 0xaa, 0x32, 0xfd, 0xbc, 0x08, 0x3a, 0x7a, 0xf5, 0x8c,
- 0x7d, 0xd0, 0x92, 0x6d, 0x5e, 0x4d, 0x48, 0xd1, 0x88, 0xf7, 0xe4, 0xdf, 0xaa, 0x42, 0xfc, 0x18,
- 0x9a, 0xd2, 0x7a, 0x1c, 0x1a, 0x10, 0x34, 0xa7, 0x08, 0x86, 0x28, 0xf3, 0x07, 0xaa, 0x32, 0x3b,
- 0xb7, 0xcd, 0xcd, 0x23, 0x81, 0x77, 0x7b, 0x17, 0x85, 0xb9, 0x22, 0xd7, 0x83, 0x79, 0x61, 0xae,
- 0x49, 0x99, 0x92, 0xcc, 0xf2, 0x56, 0xe4, 0x72, 0xa0, 0x49, 0x0c, 0xd5, 0xbc, 0xfc, 0x1f, 0x12,
- 0xc3, 0x97, 0x24, 0x86, 0x95, 0xc4, 0x50, 0x55, 0xe4, 0xd7, 0x25, 0x70, 0x47, 0xa2, 0x0d, 0x08,
- 0x56, 0x29, 0x9e, 0x24, 0x28, 0xf4, 0x25, 0x44, 0x35, 0x4d, 0x4f, 0xd7, 0x91, 0x6f, 0xe5, 0x89,
- 0x80, 0x29, 0xc1, 0xed, 0xf3, 0xc2, 0x6c, 0xd4, 0x53, 0xe1, 0x0a, 0x85, 0xe5, 0x75, 0xa8, 0x86,
- 0xe5, 0x43, 0xa7, 0x3a, 0x65, 0x9f, 0xa2, 0xb2, 0xb1, 0x6e, 0x90, 0xa8, 0x8e, 0xef, 0x04, 0x31,
- 0xb7, 0x5b, 0xd3, 0x5f, 0x49, 0xb7, 0xbc, 0xce, 0x4c, 0xc3, 0x19, 0xdf, 0x01, 0xf9, 0x2c, 0x08,
- 0x7d, 0x31, 0xd4, 0x96, 0x6e, 0x1d, 0x6a, 0x0f, 0xd4, 0x50, 0x7b, 0x5b, 0x7b, 0x6c, 0xaa, 0x7c,
- 0xcb, 0x5b, 0x55, 0x0e, 0x35, 0xd6, 0x22, 0x60, 0x94, 0x88, 0xba, 0x5d, 0xd5, 0x43, 0x73, 0xdb,
- 0x2e, 0x1e, 0xcc, 0x0b, 0x73, 0xf3, 0xaa, 0x4a, 0xcd, 0x61, 0x79, 0x6f, 0x2a, 0x67, 0xdd, 0xb8,
- 0xd6, 0x13, 0xd0, 0x2c, 0x1f, 0x5c, 0x63, 0x1b, 0xb4, 0x92, 0x3c, 0x46, 0x19, 0x8f, 0x88, 0x93,
- 0x59, 0xf6, 0x6a, 0x87, 0xd1, 0x07, 0xed, 0x10, 0x25, 0x24, 0xc6, 0x89, 0x88, 0x2f, 0x8a, 0xb8,
- 0xee, 0x72, 0xc3, 0x17, 0x17, 0xbd, 0xc6, 0xf9, 0x45, 0xaf, 0xf1, 0xd7, 0x45, 0xaf, 0xf1, 0xfc,
- 0xb2, 0xb7, 0x70, 0x7e, 0xd9, 0x5b, 0xf8, 0xe3, 0xb2, 0xb7, 0xf0, 0xcd, 0x13, 0xed, 0x92, 0x95,
- 0x9f, 0x3f, 0xa3, 0x60, 0x6f, 0x42, 0x9c, 0xd9, 0x43, 0x27, 0x26, 0x61, 0x1e, 0x21, 0x2a, 0x3f,
- 0xd2, 0xf6, 0xca, 0xaf, 0xb4, 0x0f, 0x1e, 0xee, 0xd5, 0x7b, 0xfd, 0xa8, 0x5e, 0x8e, 0xee, 0x88,
- 0xc9, 0xb2, 0xff, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x77, 0xfc, 0x54, 0x53, 0xd9, 0x09, 0x00,
- 0x00,
+ // 1091 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xcf, 0x6f, 0xe3, 0xc4,
+ 0x17, 0x6f, 0xda, 0x7e, 0xdb, 0x64, 0x92, 0x6e, 0xf7, 0x6b, 0x4a, 0x37, 0x2d, 0xdd, 0x38, 0x32,
+ 0x52, 0xe9, 0x81, 0xda, 0x9b, 0xf4, 0xb0, 0x52, 0xe1, 0x82, 0xbb, 0xa0, 0xee, 0x8a, 0x95, 0x2a,
+ 0x07, 0x38, 0x20, 0x21, 0x33, 0xb1, 0x27, 0xf1, 0x68, 0x6d, 0x8f, 0xe5, 0x19, 0x87, 0x96, 0x3b,
+ 0x12, 0x37, 0xf6, 0x88, 0x38, 0xed, 0x9f, 0xb3, 0xc7, 0x1e, 0x39, 0x19, 0xd4, 0xfe, 0x07, 0x39,
+ 0x70, 0xe0, 0x84, 0xe6, 0x87, 0x7f, 0xa4, 0xdb, 0xa5, 0x5a, 0x2e, 0xd1, 0xbc, 0xf7, 0x3e, 0xef,
+ 0xf3, 0xc9, 0xbc, 0x79, 0xf3, 0xc6, 0xc0, 0xc2, 0x63, 0xcf, 0x0a, 0xf1, 0x34, 0x60, 0x5e, 0x88,
+ 0x51, 0xcc, 0xa8, 0xc5, 0x50, 0xec, 0xa3, 0x34, 0xc2, 0x31, 0xb3, 0x66, 0x83, 0x9a, 0x65, 0x26,
+ 0x29, 0x61, 0x44, 0xeb, 0xe1, 0xb1, 0x67, 0xd6, 0x13, 0xcc, 0x1a, 0x64, 0x36, 0xd8, 0xed, 0xd7,
+ 0xf2, 0xd9, 0x45, 0x82, 0xa8, 0x35, 0x83, 0x21, 0xf6, 0x21, 0x23, 0xa9, 0x64, 0xd8, 0xdd, 0x7b,
+ 0x03, 0x21, 0x7e, 0x8b, 0xa8, 0x47, 0x68, 0x44, 0xa8, 0x85, 0x3d, 0x3a, 0x3c, 0xe2, 0xff, 0x20,
+ 0x49, 0x09, 0x99, 0x14, 0xd1, 0xde, 0x94, 0x90, 0x69, 0x88, 0x2c, 0x61, 0x8d, 0xb3, 0x89, 0xe5,
+ 0x67, 0x29, 0x64, 0x98, 0xc4, 0x2a, 0xae, 0xdf, 0x8c, 0x33, 0x1c, 0x21, 0xca, 0x60, 0x94, 0x14,
+ 0x00, 0xbe, 0x5f, 0x8f, 0xa4, 0xc8, 0x92, 0x7f, 0x9f, 0x2b, 0xc8, 0x95, 0x02, 0x7c, 0x54, 0x01,
+ 0x48, 0x14, 0x61, 0x16, 0x15, 0xa0, 0xd2, 0x52, 0xc0, 0xad, 0x29, 0x99, 0x12, 0xb1, 0xb4, 0xf8,
+ 0x4a, 0x7a, 0x8d, 0xbf, 0xd6, 0x41, 0xfb, 0x44, 0xf0, 0x8d, 0x18, 0x64, 0x48, 0xdb, 0x01, 0x4d,
+ 0x2f, 0x80, 0x38, 0x76, 0xb1, 0xdf, 0x6d, 0xf4, 0x1b, 0x07, 0x2d, 0x67, 0x5d, 0xd8, 0x4f, 0x7d,
+ 0x0d, 0x81, 0x36, 0x4b, 0x33, 0xca, 0xdc, 0x10, 0xcd, 0x50, 0xd8, 0x5d, 0xee, 0x37, 0x0e, 0xda,
+ 0xc3, 0x03, 0xf3, 0xdf, 0xeb, 0x6b, 0x7e, 0x91, 0x42, 0x8f, 0x6f, 0xd8, 0xde, 0x7d, 0x9d, 0xeb,
+ 0x4b, 0xf3, 0x5c, 0xd7, 0x2e, 0x60, 0x14, 0x1e, 0x1b, 0x35, 0x2a, 0xc3, 0x01, 0xc2, 0xfa, 0x92,
+ 0x1b, 0xda, 0x04, 0x6c, 0x0a, 0x0b, 0xc7, 0x53, 0x37, 0x41, 0x29, 0x26, 0x7e, 0x77, 0x45, 0x48,
+ 0xed, 0x98, 0xb2, 0x58, 0x66, 0x51, 0x2c, 0xf3, 0x89, 0x2a, 0xa6, 0x6d, 0x28, 0xee, 0xed, 0x1a,
+ 0x77, 0x95, 0x6f, 0xfc, 0xfa, 0x87, 0xde, 0x70, 0xee, 0x15, 0xde, 0x33, 0xe1, 0xd4, 0x30, 0xb8,
+ 0x9f, 0xc5, 0x63, 0x12, 0xfb, 0x35, 0xa1, 0xd5, 0xbb, 0x84, 0x3e, 0x54, 0x42, 0x0f, 0xa4, 0xd0,
+ 0x4d, 0x02, 0xa9, 0xb4, 0x59, 0xba, 0x95, 0x14, 0x02, 0x9b, 0x11, 0x3c, 0x77, 0xbd, 0x90, 0x78,
+ 0x2f, 0x5c, 0x3f, 0xc5, 0x13, 0xd6, 0xfd, 0xdf, 0x3b, 0x6e, 0xe9, 0x46, 0xbe, 0x14, 0xda, 0x88,
+ 0xe0, 0xf9, 0x09, 0x77, 0x3e, 0xe1, 0x3e, 0xed, 0x3b, 0xb0, 0x31, 0x49, 0xc9, 0x8f, 0x28, 0x76,
+ 0x03, 0xc4, 0x0f, 0xa4, 0xbb, 0x26, 0x44, 0x76, 0xc5, 0x11, 0xf1, 0x16, 0x31, 0x55, 0xe7, 0xcc,
+ 0x06, 0xe6, 0xa9, 0x40, 0xd8, 0x7b, 0x4a, 0x65, 0x4b, 0xaa, 0x2c, 0xa4, 0x1b, 0x4e, 0x47, 0xda,
+ 0x12, 0xcb, 0xe9, 0x43, 0xc8, 0x10, 0x65, 0x05, 0xfd, 0xfa, 0xbb, 0xd2, 0x2f, 0xa4, 0x1b, 0x4e,
+ 0x47, 0xda, 0x8a, 0x7e, 0x04, 0xda, 0xe2, 0xea, 0xb8, 0x34, 0x41, 0x1e, 0xed, 0x36, 0xfb, 0x2b,
+ 0x82, 0x5c, 0x5e, 0x2f, 0x53, 0x5c, 0x2f, 0xce, 0x7c, 0xc6, 0x31, 0xa3, 0x04, 0x79, 0xf6, 0x76,
+ 0xd5, 0x4c, 0xb5, 0x44, 0xc3, 0x01, 0x49, 0x01, 0xa1, 0xda, 0x31, 0xe8, 0x64, 0xc9, 0x34, 0x85,
+ 0x3e, 0x72, 0x13, 0xc8, 0x82, 0x6e, 0xab, 0xbf, 0x72, 0xd0, 0xb2, 0x1f, 0xcc, 0x73, 0xfd, 0x3d,
+ 0x75, 0x82, 0xb5, 0xa8, 0xe1, 0xb4, 0x95, 0x79, 0x06, 0x59, 0xa0, 0x41, 0xb0, 0x03, 0xc3, 0x90,
+ 0xfc, 0xe0, 0x66, 0x89, 0x0f, 0x19, 0x72, 0xe1, 0x84, 0xa1, 0xd4, 0x45, 0xe7, 0x09, 0x4e, 0x2f,
+ 0xba, 0xa0, 0xdf, 0x38, 0x68, 0xda, 0xfb, 0xf3, 0x5c, 0xef, 0x4b, 0xa2, 0xb7, 0x42, 0x8d, 0x6e,
+ 0xc3, 0xd9, 0x16, 0xd1, 0xaf, 0x45, 0xf0, 0x33, 0x1e, 0xfb, 0x5c, 0x84, 0x34, 0x0a, 0xf4, 0x5b,
+ 0xf2, 0x22, 0x4c, 0xc7, 0x28, 0x80, 0x33, 0x4c, 0xb2, 0xb4, 0xdb, 0x16, 0x42, 0x1f, 0xcf, 0x73,
+ 0x7d, 0xff, 0xad, 0x42, 0xf5, 0x04, 0x2e, 0xb7, 0x77, 0x53, 0xee, 0x79, 0x0d, 0x70, 0xbc, 0xfa,
+ 0xf3, 0x2b, 0x7d, 0xc9, 0x78, 0xb5, 0x0c, 0xee, 0x9d, 0x90, 0x98, 0xa2, 0x98, 0x66, 0x54, 0xde,
+ 0x7d, 0x1b, 0xb4, 0xca, 0xf1, 0x23, 0x2e, 0x3f, 0xaf, 0xff, 0xcd, 0x06, 0xfd, 0xaa, 0x40, 0xd8,
+ 0x4d, 0x7e, 0xb8, 0x2f, 0x79, 0x1f, 0x56, 0x69, 0xda, 0xa7, 0x60, 0x35, 0x25, 0x84, 0xa9, 0xe9,
+ 0x60, 0xd4, 0x7a, 0xa3, 0x9a, 0x47, 0xb3, 0x81, 0xf9, 0x1c, 0xa5, 0x2f, 0x42, 0xe4, 0x10, 0xc2,
+ 0xec, 0x55, 0x4e, 0xe3, 0x88, 0x2c, 0xed, 0xa7, 0x06, 0xd8, 0x8a, 0xd1, 0x39, 0x73, 0xcb, 0x19,
+ 0x4c, 0xdd, 0x00, 0xd2, 0x40, 0x4c, 0x80, 0x8e, 0x3d, 0x9a, 0xe7, 0xfa, 0x07, 0xb2, 0x0a, 0xb7,
+ 0xa1, 0x8c, 0xbf, 0x73, 0xfd, 0xd1, 0x14, 0xb3, 0x20, 0x1b, 0x73, 0x39, 0x3e, 0x02, 0x11, 0x1b,
+ 0x4f, 0x58, 0xb5, 0x08, 0xf1, 0x98, 0x5a, 0xe3, 0x0b, 0x86, 0xa8, 0x79, 0x8a, 0xce, 0x6d, 0xbe,
+ 0x70, 0x34, 0x4e, 0xf5, 0x4d, 0xc9, 0x74, 0x0a, 0x69, 0xa0, 0x4a, 0xf4, 0xcb, 0x32, 0xe8, 0xd4,
+ 0x2b, 0xa7, 0x1d, 0x81, 0x96, 0x6c, 0xf1, 0x72, 0x3a, 0x8a, 0x26, 0xbc, 0x2f, 0xff, 0x52, 0x19,
+ 0xe2, 0x47, 0xd0, 0x94, 0xd6, 0x53, 0x5f, 0x83, 0xa0, 0x19, 0x20, 0xe8, 0xa3, 0xd4, 0x1d, 0xa8,
+ 0xaa, 0xec, 0xdf, 0x35, 0x33, 0x4f, 0x05, 0xde, 0xee, 0x5d, 0xe5, 0xfa, 0xba, 0x5c, 0x0f, 0xe6,
+ 0xb9, 0xbe, 0x29, 0x65, 0x0a, 0x32, 0xc3, 0x59, 0x97, 0xcb, 0x41, 0x4d, 0x62, 0xa8, 0x66, 0xe5,
+ 0x7f, 0x90, 0x18, 0xbe, 0x21, 0x31, 0x2c, 0x25, 0x86, 0xaa, 0x22, 0xbf, 0xad, 0x80, 0x35, 0x89,
+ 0xd6, 0x20, 0xd8, 0xa0, 0x78, 0x1a, 0x23, 0xdf, 0x95, 0x10, 0xd5, 0x30, 0xbd, 0xba, 0x8e, 0x7c,
+ 0x27, 0x47, 0x02, 0xa6, 0x04, 0xf7, 0x2e, 0x73, 0xbd, 0x51, 0x4d, 0x84, 0x05, 0x0a, 0xc3, 0xe9,
+ 0xd0, 0x1a, 0x96, 0x0f, 0x9c, 0xf2, 0x84, 0x5d, 0x8a, 0x8a, 0xa6, 0xba, 0x45, 0xa2, 0x3c, 0xbe,
+ 0x11, 0x62, 0x76, 0xb7, 0xa2, 0x5f, 0x48, 0x37, 0x9c, 0xce, 0xac, 0x86, 0xd3, 0xbe, 0x07, 0xf2,
+ 0x49, 0x10, 0xfa, 0x62, 0xa0, 0xad, 0xdc, 0x39, 0xd0, 0x1e, 0xaa, 0x81, 0xf6, 0x7e, 0xed, 0xa1,
+ 0x29, 0xf3, 0x0d, 0x67, 0x43, 0x39, 0xd4, 0x48, 0x0b, 0x81, 0x56, 0x20, 0xaa, 0x56, 0x55, 0x8f,
+ 0xcc, 0x5d, 0xbb, 0x78, 0x38, 0xcf, 0xf5, 0x9d, 0x45, 0x95, 0x8a, 0xc3, 0x70, 0xfe, 0xaf, 0x9c,
+ 0x55, 0xe3, 0x1a, 0xcf, 0x40, 0xb3, 0x78, 0x6c, 0xb5, 0x3d, 0xd0, 0x8a, 0xb3, 0x08, 0xa5, 0x3c,
+ 0x22, 0x4e, 0x66, 0xd5, 0xa9, 0x1c, 0x5a, 0x1f, 0xb4, 0x7d, 0x14, 0x93, 0x08, 0xc7, 0x22, 0xbe,
+ 0x2c, 0xe2, 0x75, 0x97, 0xed, 0xbf, 0xbe, 0xea, 0x35, 0x2e, 0xaf, 0x7a, 0x8d, 0x3f, 0xaf, 0x7a,
+ 0x8d, 0x97, 0xd7, 0xbd, 0xa5, 0xcb, 0xeb, 0xde, 0xd2, 0xef, 0xd7, 0xbd, 0xa5, 0x6f, 0x9f, 0x2d,
+ 0x5c, 0x30, 0xf9, 0xe9, 0x33, 0xf6, 0x0e, 0xa7, 0xc4, 0x9a, 0x3d, 0xb6, 0x22, 0xe2, 0x67, 0x21,
+ 0xa2, 0xf2, 0x03, 0xed, 0xb0, 0xf8, 0x42, 0x7b, 0xf4, 0xf8, 0xb0, 0xda, 0xeb, 0x27, 0xd5, 0x72,
+ 0xbc, 0x26, 0xa6, 0xca, 0xd1, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x98, 0x66, 0xe1, 0xee, 0xd5,
+ 0x09, 0x00, 0x00,
}
func (m *ClientState) Marshal() (dAtA []byte, err error) {
diff --git a/modules/light-clients/07-tendermint/tendermint_test.go b/modules/light-clients/07-tendermint/tendermint_test.go
index 21554335a18..3879282ef35 100644
--- a/modules/light-clients/07-tendermint/tendermint_test.go
+++ b/modules/light-clients/07-tendermint/tendermint_test.go
@@ -4,12 +4,12 @@ import (
"testing"
"time"
+ tmbytes "github.com/cometbft/cometbft/libs/bytes"
+ tmproto "github.com/cometbft/cometbft/proto/tendermint/types"
+ tmtypes "github.com/cometbft/cometbft/types"
"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/stretchr/testify/suite"
- tmbytes "github.com/tendermint/tendermint/libs/bytes"
- tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
- tmtypes "github.com/tendermint/tendermint/types"
clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
ibctm "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint"
diff --git a/modules/light-clients/07-tendermint/update.go b/modules/light-clients/07-tendermint/update.go
index 2ed995ceb40..bceb28d8d83 100644
--- a/modules/light-clients/07-tendermint/update.go
+++ b/modules/light-clients/07-tendermint/update.go
@@ -4,11 +4,11 @@ import (
"bytes"
"fmt"
+ "github.com/cometbft/cometbft/light"
+ tmtypes "github.com/cometbft/cometbft/types"
"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
- "github.com/tendermint/tendermint/light"
- 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"
diff --git a/modules/light-clients/07-tendermint/update_test.go b/modules/light-clients/07-tendermint/update_test.go
index 366e5787078..b4e072ecbef 100644
--- a/modules/light-clients/07-tendermint/update_test.go
+++ b/modules/light-clients/07-tendermint/update_test.go
@@ -3,8 +3,8 @@ package tendermint_test
import (
"time"
+ tmtypes "github.com/cometbft/cometbft/types"
sdk "github.com/cosmos/cosmos-sdk/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"
@@ -635,6 +635,38 @@ func (suite *TendermintTestSuite) TestCheckForMisbehaviour() {
},
false,
},
+ {
+ "invalid fork misbehaviour: identical headers", func() {
+ trustedHeight := path.EndpointA.GetClientState().GetLatestHeight().(clienttypes.Height)
+
+ trustedVals, found := suite.chainB.GetValsAtHeight(int64(trustedHeight.RevisionHeight) + 1)
+ suite.Require().True(found)
+
+ err := path.EndpointA.UpdateClient()
+ suite.Require().NoError(err)
+
+ height := path.EndpointA.GetClientState().GetLatestHeight().(clienttypes.Height)
+
+ misbehaviourHeader := suite.chainB.CreateTMClientHeader(suite.chainB.ChainID, int64(height.RevisionHeight), trustedHeight, suite.chainB.CurrentHeader.Time.Add(time.Minute), suite.chainB.Vals, suite.chainB.NextVals, trustedVals, suite.chainB.Signers)
+ clientMessage = &ibctm.Misbehaviour{
+ Header1: misbehaviourHeader,
+ Header2: misbehaviourHeader,
+ }
+ }, false,
+ },
+ {
+ "invalid time misbehaviour: monotonically increasing time", func() {
+ trustedHeight := path.EndpointA.GetClientState().GetLatestHeight().(clienttypes.Height)
+
+ trustedVals, found := suite.chainB.GetValsAtHeight(int64(trustedHeight.RevisionHeight) + 1)
+ suite.Require().True(found)
+
+ clientMessage = &ibctm.Misbehaviour{
+ Header1: suite.chainB.CreateTMClientHeader(suite.chainB.ChainID, suite.chainB.CurrentHeader.Height+3, trustedHeight, suite.chainB.CurrentHeader.Time.Add(time.Minute), suite.chainB.Vals, suite.chainB.NextVals, trustedVals, suite.chainB.Signers),
+ Header2: suite.chainB.CreateTMClientHeader(suite.chainB.ChainID, suite.chainB.CurrentHeader.Height, trustedHeight, suite.chainB.CurrentHeader.Time, suite.chainB.Vals, suite.chainB.NextVals, trustedVals, suite.chainB.Signers),
+ }
+ }, false,
+ },
{
"consensus state already exists, app hash mismatch",
func() {
@@ -705,6 +737,19 @@ func (suite *TendermintTestSuite) TestCheckForMisbehaviour() {
},
true,
},
+ {
+ "valid time misbehaviour: not monotonically increasing time", func() {
+ trustedHeight := path.EndpointA.GetClientState().GetLatestHeight().(clienttypes.Height)
+
+ trustedVals, found := suite.chainB.GetValsAtHeight(int64(trustedHeight.RevisionHeight) + 1)
+ suite.Require().True(found)
+
+ clientMessage = &ibctm.Misbehaviour{
+ Header2: suite.chainB.CreateTMClientHeader(suite.chainB.ChainID, suite.chainB.CurrentHeader.Height+3, trustedHeight, suite.chainB.CurrentHeader.Time.Add(time.Minute), suite.chainB.Vals, suite.chainB.NextVals, trustedVals, suite.chainB.Signers),
+ Header1: suite.chainB.CreateTMClientHeader(suite.chainB.ChainID, suite.chainB.CurrentHeader.Height, trustedHeight, suite.chainB.CurrentHeader.Time, suite.chainB.Vals, suite.chainB.NextVals, trustedVals, suite.chainB.Signers),
+ }
+ }, true,
+ },
}
for _, tc := range testCases {
diff --git a/modules/light-clients/09-localhost/client_state.go b/modules/light-clients/09-localhost/client_state.go
new file mode 100644
index 00000000000..2cbfef7cf04
--- /dev/null
+++ b/modules/light-clients/09-localhost/client_state.go
@@ -0,0 +1,198 @@
+package localhost
+
+import (
+ "bytes"
+
+ "github.com/cosmos/cosmos-sdk/codec"
+ sdk "github.com/cosmos/cosmos-sdk/types"
+ sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
+
+ clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/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"
+)
+
+var _ exported.ClientState = (*ClientState)(nil)
+
+// NewClientState creates a new 09-localhost ClientState instance.
+func NewClientState(height clienttypes.Height) exported.ClientState {
+ return &ClientState{
+ LatestHeight: height,
+ }
+}
+
+// ClientType returns the 09-localhost client type.
+func (cs ClientState) ClientType() string {
+ return exported.Localhost
+}
+
+// GetLatestHeight returns the 09-localhost client state latest height.
+func (cs ClientState) GetLatestHeight() exported.Height {
+ return cs.LatestHeight
+}
+
+// Status always returns Active. The 09-localhost status cannot be changed.
+func (cs ClientState) Status(_ sdk.Context, _ sdk.KVStore, _ codec.BinaryCodec) exported.Status {
+ return exported.Active
+}
+
+// Validate performs a basic validation of the client state fields.
+func (cs ClientState) Validate() error {
+ if cs.LatestHeight.RevisionHeight == 0 {
+ return sdkerrors.Wrapf(sdkerrors.ErrInvalidHeight, "local revision height cannot be zero")
+ }
+
+ return nil
+}
+
+// ZeroCustomFields returns the same client state since there are no custom fields in the 09-localhost client state.
+func (cs ClientState) ZeroCustomFields() exported.ClientState {
+ return &cs
+}
+
+// Initialize ensures that initial consensus state for localhost is nil.
+func (cs ClientState) Initialize(ctx sdk.Context, cdc codec.BinaryCodec, clientStore sdk.KVStore, consState exported.ConsensusState) error {
+ if consState != nil {
+ return sdkerrors.Wrap(clienttypes.ErrInvalidConsensus, "initial consensus state for localhost must be nil.")
+ }
+
+ clientState := ClientState{
+ LatestHeight: clienttypes.GetSelfHeight(ctx),
+ }
+
+ clientStore.Set(host.ClientStateKey(), clienttypes.MustMarshalClientState(cdc, &clientState))
+
+ return nil
+}
+
+// GetTimestampAtHeight returns the current block time retrieved from the application context. The localhost client does not store consensus states and thus
+// cannot provide a timestamp for the provided height.
+func (cs ClientState) GetTimestampAtHeight(ctx sdk.Context, _ sdk.KVStore, _ codec.BinaryCodec, _ exported.Height) (uint64, error) {
+ return uint64(ctx.BlockTime().UnixNano()), nil
+}
+
+// VerifyMembership is a generic proof verification method which verifies the existence of a given key and value within the IBC store.
+// The caller is expected to construct the full CommitmentPath from a CommitmentPrefix and a standardized path (as defined in ICS 24).
+// The caller must provide the full IBC store.
+func (cs ClientState) VerifyMembership(
+ ctx sdk.Context,
+ store sdk.KVStore,
+ _ codec.BinaryCodec,
+ _ exported.Height,
+ _ uint64,
+ _ uint64,
+ proof []byte,
+ path exported.Path,
+ value []byte,
+) error {
+ // ensure the proof provided is the expected sentintel localhost client proof
+ if !bytes.Equal(proof, SentinelProof) {
+ return sdkerrors.Wrapf(commitmenttypes.ErrInvalidProof, "expected %s, got %s", string(SentinelProof), string(proof))
+ }
+
+ merklePath, ok := path.(commitmenttypes.MerklePath)
+ if !ok {
+ return sdkerrors.Wrapf(sdkerrors.ErrInvalidType, "expected %T, got %T", commitmenttypes.MerklePath{}, path)
+ }
+
+ if len(merklePath.GetKeyPath()) != 2 {
+ return sdkerrors.Wrapf(host.ErrInvalidPath, "path must be of length 2: %s", merklePath.GetKeyPath())
+ }
+
+ // The commitment prefix (eg: "ibc") is omitted when operating on the core IBC store
+ bz := store.Get([]byte(merklePath.KeyPath[1]))
+ if bz == nil {
+ return sdkerrors.Wrapf(clienttypes.ErrFailedMembershipVerification, "value not found for path %s", path)
+ }
+
+ if !bytes.Equal(bz, value) {
+ return sdkerrors.Wrapf(clienttypes.ErrFailedMembershipVerification, "value provided does not equal value stored at path: %s", path)
+ }
+
+ return nil
+}
+
+// VerifyNonMembership is a generic proof verification method which verifies the absence of a given CommitmentPath within the IBC store.
+// The caller is expected to construct the full CommitmentPath from a CommitmentPrefix and a standardized path (as defined in ICS 24).
+// The caller must provide the full IBC store.
+func (cs ClientState) VerifyNonMembership(
+ ctx sdk.Context,
+ store sdk.KVStore,
+ _ codec.BinaryCodec,
+ _ exported.Height,
+ _ uint64,
+ _ uint64,
+ proof []byte,
+ path exported.Path,
+) error {
+ // ensure the proof provided is the expected sentintel localhost client proof
+ if !bytes.Equal(proof, SentinelProof) {
+ return sdkerrors.Wrapf(commitmenttypes.ErrInvalidProof, "expected %s, got %s", string(SentinelProof), string(proof))
+ }
+
+ merklePath, ok := path.(commitmenttypes.MerklePath)
+ if !ok {
+ return sdkerrors.Wrapf(sdkerrors.ErrInvalidType, "expected %T, got %T", commitmenttypes.MerklePath{}, path)
+ }
+
+ if len(merklePath.GetKeyPath()) != 2 {
+ return sdkerrors.Wrapf(host.ErrInvalidPath, "path must be of length 2: %s", merklePath.GetKeyPath())
+ }
+
+ // The commitment prefix (eg: "ibc") is omitted when operating on the core IBC store
+ if store.Has([]byte(merklePath.KeyPath[1])) {
+ return sdkerrors.Wrapf(clienttypes.ErrFailedNonMembershipVerification, "value found for path %s", path)
+ }
+
+ return nil
+}
+
+// VerifyClientMessage is unsupported by the 09-localhost client type and returns an error.
+func (cs ClientState) VerifyClientMessage(_ sdk.Context, _ codec.BinaryCodec, _ sdk.KVStore, _ exported.ClientMessage) error {
+ return sdkerrors.Wrap(clienttypes.ErrUpdateClientFailed, "client message verification is unsupported by the localhost client")
+}
+
+// CheckForMisbehaviour is unsupported by the 09-localhost client type and performs a no-op, returning false.
+func (cs ClientState) CheckForMisbehaviour(_ sdk.Context, _ codec.BinaryCodec, _ sdk.KVStore, _ exported.ClientMessage) bool {
+ return false
+}
+
+// UpdateStateOnMisbehaviour is unsupported by the 09-localhost client type and performs a no-op.
+func (cs ClientState) UpdateStateOnMisbehaviour(_ sdk.Context, _ codec.BinaryCodec, _ sdk.KVStore, _ exported.ClientMessage) {
+}
+
+// UpdateState updates and stores as necessary any associated information for an IBC client, such as the ClientState and corresponding ConsensusState.
+// Upon successful update, a list of consensus heights is returned. It assumes the ClientMessage has already been verified.
+func (cs ClientState) UpdateState(ctx sdk.Context, cdc codec.BinaryCodec, clientStore sdk.KVStore, _ exported.ClientMessage) []exported.Height {
+ height := clienttypes.GetSelfHeight(ctx)
+ cs.LatestHeight = height
+
+ clientStore.Set(host.ClientStateKey(), clienttypes.MustMarshalClientState(cdc, &cs))
+
+ return []exported.Height{height}
+}
+
+// ExportMetadata is a no-op for the 09-localhost client.
+func (cs ClientState) ExportMetadata(_ sdk.KVStore) []exported.GenesisMetadata {
+ return nil
+}
+
+// CheckSubstituteAndUpdateState returns an error. The localhost cannot be modified by
+// proposals.
+func (cs ClientState) CheckSubstituteAndUpdateState(_ sdk.Context, _ codec.BinaryCodec, _, _ sdk.KVStore, _ exported.ClientState) error {
+ return sdkerrors.Wrap(clienttypes.ErrUpdateClientFailed, "cannot update localhost client with a proposal")
+}
+
+// VerifyUpgradeAndUpdateState returns an error since localhost cannot be upgraded
+func (cs ClientState) VerifyUpgradeAndUpdateState(
+ _ sdk.Context,
+ _ codec.BinaryCodec,
+ _ sdk.KVStore,
+ _ exported.ClientState,
+ _ exported.ConsensusState,
+ _,
+ _ []byte,
+) error {
+ return sdkerrors.Wrap(clienttypes.ErrInvalidUpgradeClient, "cannot upgrade localhost client")
+}
diff --git a/modules/light-clients/09-localhost/client_state_test.go b/modules/light-clients/09-localhost/client_state_test.go
new file mode 100644
index 00000000000..b11034a87e3
--- /dev/null
+++ b/modules/light-clients/09-localhost/client_state_test.go
@@ -0,0 +1,434 @@
+package localhost_test
+
+import (
+ sdk "github.com/cosmos/cosmos-sdk/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"
+ ibctm "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint"
+ localhost "github.com/cosmos/ibc-go/v7/modules/light-clients/09-localhost"
+ ibctesting "github.com/cosmos/ibc-go/v7/testing"
+ "github.com/cosmos/ibc-go/v7/testing/mock"
+)
+
+func (suite *LocalhostTestSuite) TestStatus() {
+ clientState := localhost.NewClientState(clienttypes.NewHeight(3, 10))
+ suite.Require().Equal(exported.Active, clientState.Status(suite.chain.GetContext(), nil, nil))
+}
+
+func (suite *LocalhostTestSuite) TestClientType() {
+ clientState := localhost.NewClientState(clienttypes.NewHeight(3, 10))
+ suite.Require().Equal(exported.Localhost, clientState.ClientType())
+}
+
+func (suite *LocalhostTestSuite) TestGetLatestHeight() {
+ expectedHeight := clienttypes.NewHeight(3, 10)
+ clientState := localhost.NewClientState(expectedHeight)
+ suite.Require().Equal(expectedHeight, clientState.GetLatestHeight())
+}
+
+func (suite *LocalhostTestSuite) TestZeroCustomFields() {
+ clientState := localhost.NewClientState(clienttypes.NewHeight(1, 10))
+ suite.Require().Equal(clientState, clientState.ZeroCustomFields())
+}
+
+func (suite *LocalhostTestSuite) TestGetTimestampAtHeight() {
+ ctx := suite.chain.GetContext()
+ clientState := localhost.NewClientState(clienttypes.NewHeight(1, 10))
+
+ timestamp, err := clientState.GetTimestampAtHeight(ctx, nil, nil, nil)
+ suite.Require().NoError(err)
+ suite.Require().Equal(uint64(ctx.BlockTime().UnixNano()), timestamp)
+}
+
+func (suite *LocalhostTestSuite) TestValidate() {
+ testCases := []struct {
+ name string
+ clientState exported.ClientState
+ expPass bool
+ }{
+ {
+ name: "valid client",
+ clientState: localhost.NewClientState(clienttypes.NewHeight(3, 10)),
+ expPass: true,
+ },
+ {
+ name: "invalid height",
+ clientState: localhost.NewClientState(clienttypes.ZeroHeight()),
+ expPass: false,
+ },
+ }
+
+ for _, tc := range testCases {
+ err := tc.clientState.Validate()
+ if tc.expPass {
+ suite.Require().NoError(err, tc.name)
+ } else {
+ suite.Require().Error(err, tc.name)
+ }
+ }
+}
+
+func (suite *LocalhostTestSuite) TestInitialize() {
+ testCases := []struct {
+ name string
+ consState exported.ConsensusState
+ expPass bool
+ }{
+ {
+ "valid initialization",
+ nil,
+ true,
+ },
+ {
+ "invalid consenus state",
+ &ibctm.ConsensusState{},
+ false,
+ },
+ }
+
+ for _, tc := range testCases {
+ suite.SetupTest()
+
+ clientState := localhost.NewClientState(clienttypes.NewHeight(3, 10))
+ clientStore := suite.chain.GetSimApp().GetIBCKeeper().ClientKeeper.ClientStore(suite.chain.GetContext(), exported.LocalhostClientID)
+
+ err := clientState.Initialize(suite.chain.GetContext(), suite.chain.Codec, clientStore, tc.consState)
+
+ if tc.expPass {
+ suite.Require().NoError(err, "valid testcase: %s failed", tc.name)
+ } else {
+ suite.Require().Error(err, "invalid testcase: %s passed", tc.name)
+ }
+ }
+}
+
+func (suite *LocalhostTestSuite) TestVerifyMembership() {
+ var (
+ path exported.Path
+ value []byte
+ )
+
+ testCases := []struct {
+ name string
+ malleate func()
+ expPass bool
+ }{
+ {
+ "success: client state verification",
+ func() {
+ clientState := suite.chain.GetClientState(exported.LocalhostClientID)
+
+ merklePath := commitmenttypes.NewMerklePath(host.FullClientStatePath(exported.LocalhostClientID))
+ merklePath, err := commitmenttypes.ApplyPrefix(suite.chain.GetPrefix(), merklePath)
+ suite.Require().NoError(err)
+
+ path = merklePath
+ value = clienttypes.MustMarshalClientState(suite.chain.Codec, clientState)
+ },
+ true,
+ },
+ {
+ "success: connection state verification",
+ func() {
+ connectionEnd := connectiontypes.NewConnectionEnd(
+ connectiontypes.OPEN,
+ exported.LocalhostClientID,
+ connectiontypes.NewCounterparty(exported.LocalhostClientID, exported.LocalhostConnectionID, suite.chain.GetPrefix()),
+ connectiontypes.ExportedVersionsToProto(connectiontypes.GetCompatibleVersions()), 0,
+ )
+
+ suite.chain.GetSimApp().GetIBCKeeper().ConnectionKeeper.SetConnection(suite.chain.GetContext(), exported.LocalhostConnectionID, connectionEnd)
+
+ merklePath := commitmenttypes.NewMerklePath(host.ConnectionPath(exported.LocalhostConnectionID))
+ merklePath, err := commitmenttypes.ApplyPrefix(suite.chain.GetPrefix(), merklePath)
+ suite.Require().NoError(err)
+
+ path = merklePath
+ value = suite.chain.Codec.MustMarshal(&connectionEnd)
+ },
+ true,
+ },
+ {
+ "success: channel state verification",
+ func() {
+ channel := channeltypes.NewChannel(
+ channeltypes.OPEN,
+ channeltypes.UNORDERED,
+ channeltypes.NewCounterparty(mock.PortID, ibctesting.FirstChannelID),
+ []string{exported.LocalhostConnectionID},
+ mock.Version,
+ )
+
+ suite.chain.GetSimApp().GetIBCKeeper().ChannelKeeper.SetChannel(suite.chain.GetContext(), mock.PortID, ibctesting.FirstChannelID, channel)
+
+ merklePath := commitmenttypes.NewMerklePath(host.ChannelPath(mock.PortID, ibctesting.FirstChannelID))
+ merklePath, err := commitmenttypes.ApplyPrefix(suite.chain.GetPrefix(), merklePath)
+ suite.Require().NoError(err)
+
+ path = merklePath
+ value = suite.chain.Codec.MustMarshal(&channel)
+ },
+ true,
+ },
+ {
+ "success: next sequence recv verification",
+ func() {
+ nextSeqRecv := uint64(100)
+ suite.chain.GetSimApp().GetIBCKeeper().ChannelKeeper.SetNextSequenceRecv(suite.chain.GetContext(), mock.PortID, ibctesting.FirstChannelID, nextSeqRecv)
+
+ merklePath := commitmenttypes.NewMerklePath(host.NextSequenceRecvPath(mock.PortID, ibctesting.FirstChannelID))
+ merklePath, err := commitmenttypes.ApplyPrefix(suite.chain.GetPrefix(), merklePath)
+ suite.Require().NoError(err)
+
+ path = merklePath
+ value = sdk.Uint64ToBigEndian(nextSeqRecv)
+ },
+ true,
+ },
+ {
+ "success: packet commitment verification",
+ func() {
+ packet := channeltypes.NewPacket(
+ ibctesting.MockPacketData,
+ 1,
+ ibctesting.MockPort,
+ ibctesting.FirstChannelID,
+ ibctesting.MockPort,
+ ibctesting.FirstChannelID,
+ clienttypes.NewHeight(0, 10),
+ 0,
+ )
+
+ commitmentBz := channeltypes.CommitPacket(suite.chain.Codec, packet)
+ suite.chain.GetSimApp().GetIBCKeeper().ChannelKeeper.SetPacketCommitment(suite.chain.GetContext(), mock.PortID, ibctesting.FirstChannelID, 1, commitmentBz)
+
+ merklePath := commitmenttypes.NewMerklePath(host.PacketCommitmentPath(packet.GetSourcePort(), packet.GetSourceChannel(), packet.GetSequence()))
+ merklePath, err := commitmenttypes.ApplyPrefix(suite.chain.GetPrefix(), merklePath)
+ suite.Require().NoError(err)
+
+ path = merklePath
+ value = commitmentBz
+ },
+ true,
+ },
+ {
+ "success: packet acknowledgement verification",
+ func() {
+ suite.chain.GetSimApp().GetIBCKeeper().ChannelKeeper.SetPacketAcknowledgement(suite.chain.GetContext(), mock.PortID, ibctesting.FirstChannelID, 1, ibctesting.MockAcknowledgement)
+
+ merklePath := commitmenttypes.NewMerklePath(host.PacketAcknowledgementPath(mock.PortID, ibctesting.FirstChannelID, 1))
+ merklePath, err := commitmenttypes.ApplyPrefix(suite.chain.GetPrefix(), merklePath)
+ suite.Require().NoError(err)
+
+ path = merklePath
+ value = ibctesting.MockAcknowledgement
+ },
+ true,
+ },
+ {
+ "invalid type for key path",
+ func() {
+ path = mock.KeyPath{}
+ },
+ false,
+ },
+ {
+ "key path has too many elements",
+ func() {
+ path = commitmenttypes.NewMerklePath("ibc", "test", "key")
+ },
+ false,
+ },
+ {
+ "no value found at provided key path",
+ func() {
+ merklePath := commitmenttypes.NewMerklePath(host.PacketAcknowledgementPath(mock.PortID, ibctesting.FirstChannelID, 100))
+ merklePath, err := commitmenttypes.ApplyPrefix(suite.chain.GetPrefix(), merklePath)
+ suite.Require().NoError(err)
+
+ path = merklePath
+ value = ibctesting.MockAcknowledgement
+ },
+ false,
+ },
+ {
+ "invalid value, bytes are not equal",
+ func() {
+ channel := channeltypes.NewChannel(
+ channeltypes.OPEN,
+ channeltypes.UNORDERED,
+ channeltypes.NewCounterparty(mock.PortID, ibctesting.FirstChannelID),
+ []string{exported.LocalhostConnectionID},
+ mock.Version,
+ )
+
+ suite.chain.GetSimApp().GetIBCKeeper().ChannelKeeper.SetChannel(suite.chain.GetContext(), mock.PortID, ibctesting.FirstChannelID, channel)
+
+ merklePath := commitmenttypes.NewMerklePath(host.ChannelPath(mock.PortID, ibctesting.FirstChannelID))
+ merklePath, err := commitmenttypes.ApplyPrefix(suite.chain.GetPrefix(), merklePath)
+ suite.Require().NoError(err)
+
+ path = merklePath
+
+ channel.State = channeltypes.CLOSED // modify the channel before marshalling to value bz
+ value = suite.chain.Codec.MustMarshal(&channel)
+ },
+ false,
+ },
+ }
+
+ for _, tc := range testCases {
+ tc := tc
+
+ suite.Run(tc.name, func() {
+ suite.SetupTest()
+
+ tc.malleate()
+
+ clientState := suite.chain.GetClientState(exported.LocalhostClientID)
+ store := suite.chain.GetContext().KVStore(suite.chain.GetSimApp().GetKey(exported.StoreKey))
+
+ err := clientState.VerifyMembership(
+ suite.chain.GetContext(),
+ store,
+ suite.chain.Codec,
+ clienttypes.ZeroHeight(),
+ 0, 0, // use zero values for delay periods
+ localhost.SentinelProof,
+ path,
+ value,
+ )
+
+ if tc.expPass {
+ suite.Require().NoError(err)
+ } else {
+ suite.Require().Error(err)
+ }
+ })
+ }
+}
+
+func (suite *LocalhostTestSuite) TestVerifyNonMembership() {
+ var path exported.Path
+
+ testCases := []struct {
+ name string
+ malleate func()
+ expPass bool
+ }{
+ {
+ "success: packet receipt absence verification",
+ func() {
+ merklePath := commitmenttypes.NewMerklePath(host.PacketReceiptPath(mock.PortID, ibctesting.FirstChannelID, 1))
+ merklePath, err := commitmenttypes.ApplyPrefix(suite.chain.GetPrefix(), merklePath)
+ suite.Require().NoError(err)
+
+ path = merklePath
+ },
+ true,
+ },
+ {
+ "packet receipt absence verification fails",
+ func() {
+ suite.chain.GetSimApp().GetIBCKeeper().ChannelKeeper.SetPacketReceipt(suite.chain.GetContext(), mock.PortID, ibctesting.FirstChannelID, 1)
+
+ merklePath := commitmenttypes.NewMerklePath(host.PacketReceiptPath(mock.PortID, ibctesting.FirstChannelID, 1))
+ merklePath, err := commitmenttypes.ApplyPrefix(suite.chain.GetPrefix(), merklePath)
+ suite.Require().NoError(err)
+
+ path = merklePath
+ },
+ false,
+ },
+ {
+ "invalid type for key path",
+ func() {
+ path = mock.KeyPath{}
+ },
+ false,
+ },
+ {
+ "key path has too many elements",
+ func() {
+ path = commitmenttypes.NewMerklePath("ibc", "test", "key")
+ },
+ false,
+ },
+ }
+
+ for _, tc := range testCases {
+ tc := tc
+
+ suite.Run(tc.name, func() {
+ suite.SetupTest()
+
+ tc.malleate()
+
+ clientState := suite.chain.GetClientState(exported.LocalhostClientID)
+ store := suite.chain.GetContext().KVStore(suite.chain.GetSimApp().GetKey(exported.StoreKey))
+
+ err := clientState.VerifyNonMembership(
+ suite.chain.GetContext(),
+ store,
+ suite.chain.Codec,
+ clienttypes.ZeroHeight(),
+ 0, 0, // use zero values for delay periods
+ localhost.SentinelProof,
+ path,
+ )
+
+ if tc.expPass {
+ suite.Require().NoError(err)
+ } else {
+ suite.Require().Error(err)
+ }
+ })
+ }
+}
+
+func (suite *LocalhostTestSuite) TestVerifyClientMessage() {
+ clientState := localhost.NewClientState(clienttypes.NewHeight(1, 10))
+ suite.Require().Error(clientState.VerifyClientMessage(suite.chain.GetContext(), nil, nil, nil))
+}
+
+func (suite *LocalhostTestSuite) TestVerifyCheckForMisbehaviour() {
+ clientState := localhost.NewClientState(clienttypes.NewHeight(1, 10))
+ suite.Require().False(clientState.CheckForMisbehaviour(suite.chain.GetContext(), nil, nil, nil))
+}
+
+func (suite *LocalhostTestSuite) TestUpdateState() {
+ clientState := localhost.NewClientState(clienttypes.NewHeight(1, uint64(suite.chain.GetContext().BlockHeight())))
+ store := suite.chain.GetSimApp().GetIBCKeeper().ClientKeeper.ClientStore(suite.chain.GetContext(), exported.LocalhostClientID)
+
+ suite.coordinator.CommitBlock(suite.chain)
+
+ heights := clientState.UpdateState(suite.chain.GetContext(), suite.chain.Codec, store, nil)
+
+ expHeight := clienttypes.NewHeight(1, uint64(suite.chain.GetContext().BlockHeight()))
+ suite.Require().True(heights[0].EQ(expHeight))
+
+ clientState = suite.chain.GetClientState(exported.LocalhostClientID)
+ suite.Require().True(heights[0].EQ(clientState.GetLatestHeight()))
+}
+
+func (suite *LocalhostTestSuite) TestExportMetadata() {
+ clientState := localhost.NewClientState(clienttypes.NewHeight(1, 10))
+ suite.Require().Nil(clientState.ExportMetadata(nil))
+}
+
+func (suite *LocalhostTestSuite) TestCheckSubstituteAndUpdateState() {
+ clientState := localhost.NewClientState(clienttypes.NewHeight(1, 10))
+ err := clientState.CheckSubstituteAndUpdateState(suite.chain.GetContext(), suite.chain.Codec, nil, nil, nil)
+ suite.Require().Error(err)
+}
+
+func (suite *LocalhostTestSuite) TestVerifyUpgradeAndUpdateState() {
+ clientState := localhost.NewClientState(clienttypes.NewHeight(1, 10))
+ err := clientState.VerifyUpgradeAndUpdateState(suite.chain.GetContext(), suite.chain.Codec, nil, nil, nil, nil, nil)
+ suite.Require().Error(err)
+}
diff --git a/modules/light-clients/09-localhost/codec.go b/modules/light-clients/09-localhost/codec.go
new file mode 100644
index 00000000000..04803e7df19
--- /dev/null
+++ b/modules/light-clients/09-localhost/codec.go
@@ -0,0 +1,16 @@
+package localhost
+
+import (
+ codectypes "github.com/cosmos/cosmos-sdk/codec/types"
+
+ "github.com/cosmos/ibc-go/v7/modules/core/exported"
+)
+
+// RegisterInterfaces registers the tendermint concrete client-related
+// implementations and interfaces.
+func RegisterInterfaces(registry codectypes.InterfaceRegistry) {
+ registry.RegisterImplementations(
+ (*exported.ClientState)(nil),
+ &ClientState{},
+ )
+}
diff --git a/modules/light-clients/09-localhost/keys.go b/modules/light-clients/09-localhost/keys.go
new file mode 100644
index 00000000000..bf10ed0d800
--- /dev/null
+++ b/modules/light-clients/09-localhost/keys.go
@@ -0,0 +1,12 @@
+package localhost
+
+const (
+ // ModuleName defines the 09-localhost light client module name
+ ModuleName = "09-localhost"
+)
+
+// SentinelProof defines the 09-localhost sentinel proof.
+// Submission of nil or empty proofs is disallowed in core IBC messaging.
+// This serves as a placeholder value for relayers to leverage as the proof field in various message types.
+// Localhost client state verification will fail if the sentintel proof value is not provided.
+var SentinelProof = []byte{0x01}
diff --git a/modules/light-clients/09-localhost/localhost.pb.go b/modules/light-clients/09-localhost/localhost.pb.go
new file mode 100644
index 00000000000..09303d4f1b2
--- /dev/null
+++ b/modules/light-clients/09-localhost/localhost.pb.go
@@ -0,0 +1,322 @@
+// Code generated by protoc-gen-gogo. DO NOT EDIT.
+// source: ibc/lightclients/localhost/v2/localhost.proto
+
+package localhost
+
+import (
+ fmt "fmt"
+ _ "github.com/cosmos/gogoproto/gogoproto"
+ proto "github.com/cosmos/gogoproto/proto"
+ types "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
+ io "io"
+ math "math"
+ math_bits "math/bits"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
+
+// ClientState defines the 09-localhost client state
+type ClientState struct {
+ // the latest block height
+ LatestHeight types.Height `protobuf:"bytes,1,opt,name=latest_height,json=latestHeight,proto3" json:"latest_height"`
+}
+
+func (m *ClientState) Reset() { *m = ClientState{} }
+func (m *ClientState) String() string { return proto.CompactTextString(m) }
+func (*ClientState) ProtoMessage() {}
+func (*ClientState) Descriptor() ([]byte, []int) {
+ return fileDescriptor_60e51cfed1fd7859, []int{0}
+}
+func (m *ClientState) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *ClientState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_ClientState.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 *ClientState) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_ClientState.Merge(m, src)
+}
+func (m *ClientState) XXX_Size() int {
+ return m.Size()
+}
+func (m *ClientState) XXX_DiscardUnknown() {
+ xxx_messageInfo_ClientState.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ClientState proto.InternalMessageInfo
+
+func init() {
+ proto.RegisterType((*ClientState)(nil), "ibc.lightclients.localhost.v2.ClientState")
+}
+
+func init() {
+ proto.RegisterFile("ibc/lightclients/localhost/v2/localhost.proto", fileDescriptor_60e51cfed1fd7859)
+}
+
+var fileDescriptor_60e51cfed1fd7859 = []byte{
+ // 257 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0xcd, 0x4c, 0x4a, 0xd6,
+ 0xcf, 0xc9, 0x4c, 0xcf, 0x28, 0x49, 0xce, 0xc9, 0x4c, 0xcd, 0x2b, 0x29, 0xd6, 0xcf, 0xc9, 0x4f,
+ 0x4e, 0xcc, 0xc9, 0xc8, 0x2f, 0x2e, 0xd1, 0x2f, 0x33, 0x42, 0x70, 0xf4, 0x0a, 0x8a, 0xf2, 0x4b,
+ 0xf2, 0x85, 0x64, 0x33, 0x93, 0x92, 0xf5, 0x90, 0x95, 0xeb, 0x21, 0x54, 0x94, 0x19, 0x49, 0xc9,
+ 0x83, 0x4c, 0x4b, 0xce, 0x2f, 0x4a, 0xd5, 0x87, 0x48, 0xeb, 0x97, 0x19, 0x42, 0x59, 0x10, 0xfd,
+ 0x52, 0x22, 0xe9, 0xf9, 0xe9, 0xf9, 0x60, 0xa6, 0x3e, 0x88, 0x05, 0x11, 0x55, 0x8a, 0xe2, 0xe2,
+ 0x76, 0x06, 0xab, 0x0a, 0x2e, 0x49, 0x2c, 0x49, 0x15, 0x72, 0xe5, 0xe2, 0xcd, 0x49, 0x2c, 0x49,
+ 0x2d, 0x2e, 0x89, 0xcf, 0x48, 0x05, 0x59, 0x25, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x6d, 0x24, 0xa5,
+ 0x07, 0xb2, 0x1c, 0x64, 0xba, 0x1e, 0xd4, 0xcc, 0x32, 0x43, 0x3d, 0x0f, 0xb0, 0x0a, 0x27, 0x96,
+ 0x13, 0xf7, 0xe4, 0x19, 0x82, 0x78, 0x20, 0xda, 0x20, 0x62, 0x56, 0x2c, 0x1d, 0x0b, 0xe4, 0x19,
+ 0x9c, 0x92, 0x4e, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09,
+ 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0xca, 0x23, 0x3d, 0xb3,
+ 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x57, 0x3f, 0x39, 0xbf, 0x38, 0x37, 0xbf, 0x58, 0x3f,
+ 0x33, 0x29, 0x59, 0x37, 0x3d, 0x5f, 0xbf, 0xcc, 0x5c, 0x3f, 0x37, 0x3f, 0xa5, 0x34, 0x27, 0xb5,
+ 0x18, 0x12, 0x34, 0xba, 0xb0, 0xb0, 0x31, 0xb0, 0xd4, 0x85, 0xfb, 0xd7, 0x1a, 0xce, 0x4a, 0x62,
+ 0x03, 0x7b, 0xc3, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x1e, 0xed, 0x07, 0xba, 0x4d, 0x01, 0x00,
+ 0x00,
+}
+
+func (m *ClientState) 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 *ClientState) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *ClientState) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ {
+ size, err := m.LatestHeight.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintLocalhost(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0xa
+ return len(dAtA) - i, nil
+}
+
+func encodeVarintLocalhost(dAtA []byte, offset int, v uint64) int {
+ offset -= sovLocalhost(v)
+ base := offset
+ for v >= 1<<7 {
+ dAtA[offset] = uint8(v&0x7f | 0x80)
+ v >>= 7
+ offset++
+ }
+ dAtA[offset] = uint8(v)
+ return base
+}
+func (m *ClientState) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ l = m.LatestHeight.Size()
+ n += 1 + l + sovLocalhost(uint64(l))
+ return n
+}
+
+func sovLocalhost(x uint64) (n int) {
+ return (math_bits.Len64(x|1) + 6) / 7
+}
+func sozLocalhost(x uint64) (n int) {
+ return sovLocalhost(uint64((x << 1) ^ uint64((int64(x) >> 63))))
+}
+func (m *ClientState) 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 ErrIntOverflowLocalhost
+ }
+ 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: ClientState: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: ClientState: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field LatestHeight", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowLocalhost
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthLocalhost
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthLocalhost
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if err := m.LatestHeight.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipLocalhost(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthLocalhost
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func skipLocalhost(dAtA []byte) (n int, err error) {
+ l := len(dAtA)
+ iNdEx := 0
+ depth := 0
+ for iNdEx < l {
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowLocalhost
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ wireType := int(wire & 0x7)
+ switch wireType {
+ case 0:
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowLocalhost
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ iNdEx++
+ if dAtA[iNdEx-1] < 0x80 {
+ break
+ }
+ }
+ case 1:
+ iNdEx += 8
+ case 2:
+ var length int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowLocalhost
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ length |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if length < 0 {
+ return 0, ErrInvalidLengthLocalhost
+ }
+ iNdEx += length
+ case 3:
+ depth++
+ case 4:
+ if depth == 0 {
+ return 0, ErrUnexpectedEndOfGroupLocalhost
+ }
+ depth--
+ case 5:
+ iNdEx += 4
+ default:
+ return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
+ }
+ if iNdEx < 0 {
+ return 0, ErrInvalidLengthLocalhost
+ }
+ if depth == 0 {
+ return iNdEx, nil
+ }
+ }
+ return 0, io.ErrUnexpectedEOF
+}
+
+var (
+ ErrInvalidLengthLocalhost = fmt.Errorf("proto: negative length found during unmarshaling")
+ ErrIntOverflowLocalhost = fmt.Errorf("proto: integer overflow")
+ ErrUnexpectedEndOfGroupLocalhost = fmt.Errorf("proto: unexpected end of group")
+)
diff --git a/modules/light-clients/09-localhost/localhost_test.go b/modules/light-clients/09-localhost/localhost_test.go
new file mode 100644
index 00000000000..c22ef1e35ae
--- /dev/null
+++ b/modules/light-clients/09-localhost/localhost_test.go
@@ -0,0 +1,25 @@
+package localhost_test
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/suite"
+
+ ibctesting "github.com/cosmos/ibc-go/v7/testing"
+)
+
+type LocalhostTestSuite struct {
+ suite.Suite
+
+ coordinator ibctesting.Coordinator
+ chain *ibctesting.TestChain
+}
+
+func (suite *LocalhostTestSuite) SetupTest() {
+ suite.coordinator = *ibctesting.NewCoordinator(suite.T(), 1)
+ suite.chain = suite.coordinator.GetChain(ibctesting.GetChainID(1))
+}
+
+func TestLocalhostTestSuite(t *testing.T) {
+ suite.Run(t, new(LocalhostTestSuite))
+}
diff --git a/proto/buf.lock b/proto/buf.lock
index f36df5f2658..1e11d0343b4 100644
--- a/proto/buf.lock
+++ b/proto/buf.lock
@@ -8,7 +8,7 @@ deps:
- remote: buf.build
owner: cosmos
repository: cosmos-sdk
- commit: 8c515ebc07ee4514aabcaf3a584a1d1a
+ commit: 2aa7ff2b23df473a85b7a7fe1884105d
- remote: buf.build
owner: cosmos
repository: gogo-proto
diff --git a/proto/buf.yaml b/proto/buf.yaml
index 79a7bf0012f..a8622cbea1d 100644
--- a/proto/buf.yaml
+++ b/proto/buf.yaml
@@ -3,7 +3,7 @@ name: buf.build/cosmos/ibc
deps:
# TODO: update sdk buf dependency when v0.47.0 is tagged and pushed to BSR
# see: (https://github.com/cosmos/cosmos-sdk/tree/main/proto#sdk-x-buf)
- - buf.build/cosmos/cosmos-sdk:8c515ebc07ee4514aabcaf3a584a1d1a
+ - buf.build/cosmos/cosmos-sdk:2aa7ff2b23df473a85b7a7fe1884105d
- buf.build/cosmos/cosmos-proto:1935555c206d4afb9e94615dfd0fad31
- buf.build/cosmos/gogo-proto:a14993478f40695898ed8a86931094b6656e8a5d
- buf.build/googleapis/googleapis:8d7204855ec14631a499bd7393ce1970
diff --git a/proto/ibc/applications/interchain_accounts/controller/v1/tx.proto b/proto/ibc/applications/interchain_accounts/controller/v1/tx.proto
index ab97914fe5d..284ffe70576 100644
--- a/proto/ibc/applications/interchain_accounts/controller/v1/tx.proto
+++ b/proto/ibc/applications/interchain_accounts/controller/v1/tx.proto
@@ -28,6 +28,7 @@ message MsgRegisterInterchainAccount {
// MsgRegisterInterchainAccountResponse defines the response for Msg/RegisterAccount
message MsgRegisterInterchainAccountResponse {
string channel_id = 1 [(gogoproto.moretags) = "yaml:\"channel_id\""];
+ string port_id = 2 [(gogoproto.moretags) = "yaml:\"port_id\""];
}
// MsgSendTx defines the payload for Msg/SendTx
diff --git a/proto/ibc/applications/interchain_accounts/v1/account.proto b/proto/ibc/applications/interchain_accounts/v1/account.proto
index 6c30957f83a..d60c27a9c29 100644
--- a/proto/ibc/applications/interchain_accounts/v1/account.proto
+++ b/proto/ibc/applications/interchain_accounts/v1/account.proto
@@ -12,7 +12,7 @@ import "cosmos/auth/v1beta1/auth.proto";
message InterchainAccount {
option (gogoproto.goproto_getters) = false;
option (gogoproto.goproto_stringer) = false;
- option (cosmos_proto.implements_interface) = "InterchainAccountI";
+ option (cosmos_proto.implements_interface) = "ibc.applications.interchain_accounts.v1.InterchainAccountI";
cosmos.auth.v1beta1.BaseAccount base_account = 1
[(gogoproto.embed) = true, (gogoproto.moretags) = "yaml:\"base_account\""];
diff --git a/proto/ibc/applications/transfer/v1/authz.proto b/proto/ibc/applications/transfer/v1/authz.proto
new file mode 100644
index 00000000000..8b27ac9cf7d
--- /dev/null
+++ b/proto/ibc/applications/transfer/v1/authz.proto
@@ -0,0 +1,31 @@
+syntax = "proto3";
+
+package ibc.applications.transfer.v1;
+
+option go_package = "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types";
+
+import "cosmos_proto/cosmos.proto";
+import "gogoproto/gogo.proto";
+import "cosmos/base/v1beta1/coin.proto";
+
+// Allocation defines the spend limit for a particular port and channel
+message Allocation {
+ // the port on which the packet will be sent
+ string source_port = 1 [(gogoproto.moretags) = "yaml:\"source_port\""];
+ // the channel by which the packet will be sent
+ string source_channel = 2 [(gogoproto.moretags) = "yaml:\"source_channel\""];
+ // spend limitation on the channel
+ repeated cosmos.base.v1beta1.Coin spend_limit = 3
+ [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"];
+ // allow list of receivers, an empty allow list permits any receiver address
+ repeated string allow_list = 4;
+}
+
+// TransferAuthorization allows the grantee to spend up to spend_limit coins from
+// the granter's account for ibc transfer on a specific channel
+message TransferAuthorization {
+ option (cosmos_proto.implements_interface) = "cosmos.authz.v1beta1.Authorization";
+
+ // port and channel amounts
+ repeated Allocation allocations = 1 [(gogoproto.nullable) = false];
+}
diff --git a/proto/ibc/applications/transfer/v1/genesis.proto b/proto/ibc/applications/transfer/v1/genesis.proto
index 5e09a34ab07..b3f013e1ee3 100644
--- a/proto/ibc/applications/transfer/v1/genesis.proto
+++ b/proto/ibc/applications/transfer/v1/genesis.proto
@@ -5,6 +5,7 @@ package ibc.applications.transfer.v1;
option go_package = "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types";
import "ibc/applications/transfer/v1/transfer.proto";
+import "cosmos/base/v1beta1/coin.proto";
import "gogoproto/gogo.proto";
// GenesisState defines the ibc-transfer genesis state
@@ -16,4 +17,11 @@ message GenesisState {
(gogoproto.moretags) = "yaml:\"denom_traces\""
];
Params params = 3 [(gogoproto.nullable) = false];
+ // total_escrowed contains the total amount of tokens escrowed
+ // by the transfer module
+ repeated cosmos.base.v1beta1.Coin total_escrowed = 4 [
+ (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins",
+ (gogoproto.nullable) = false,
+ (gogoproto.moretags) = "yaml:\"total_escrowed\""
+ ];
}
diff --git a/proto/ibc/applications/transfer/v1/query.proto b/proto/ibc/applications/transfer/v1/query.proto
index c732b830e84..ff56cc30c8d 100644
--- a/proto/ibc/applications/transfer/v1/query.proto
+++ b/proto/ibc/applications/transfer/v1/query.proto
@@ -3,6 +3,7 @@ syntax = "proto3";
package ibc.applications.transfer.v1;
import "gogoproto/gogo.proto";
+import "cosmos/base/v1beta1/coin.proto";
import "cosmos/base/query/v1beta1/pagination.proto";
import "ibc/applications/transfer/v1/transfer.proto";
import "google/api/annotations.proto";
@@ -13,7 +14,7 @@ option go_package = "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types";
service Query {
// DenomTrace queries a denomination trace information.
rpc DenomTrace(QueryDenomTraceRequest) returns (QueryDenomTraceResponse) {
- option (google.api.http).get = "/ibc/apps/transfer/v1/denom_traces/{hash}";
+ option (google.api.http).get = "/ibc/apps/transfer/v1/denom_traces/{hash=**}";
}
// DenomTraces queries all denomination traces.
@@ -28,13 +29,18 @@ service Query {
// DenomHash queries a denomination hash information.
rpc DenomHash(QueryDenomHashRequest) returns (QueryDenomHashResponse) {
- option (google.api.http).get = "/ibc/apps/transfer/v1/denom_hashes/{trace}";
+ option (google.api.http).get = "/ibc/apps/transfer/v1/denom_hashes/{trace=**}";
}
// EscrowAddress returns the escrow address for a particular port and channel id.
rpc EscrowAddress(QueryEscrowAddressRequest) returns (QueryEscrowAddressResponse) {
option (google.api.http).get = "/ibc/apps/transfer/v1/channels/{channel_id}/ports/{port_id}/escrow_address";
}
+
+ // TotalEscrowForDenom returns the total amount of tokens in escrow based on the denom.
+ rpc TotalEscrowForDenom(QueryTotalEscrowForDenomRequest) returns (QueryTotalEscrowForDenomResponse) {
+ option (google.api.http).get = "/ibc/apps/transfer/v1/denoms/{denom=**}/total_escrow";
+ }
}
// QueryDenomTraceRequest is the request type for the Query/DenomTrace RPC
@@ -102,4 +108,14 @@ message QueryEscrowAddressRequest {
message QueryEscrowAddressResponse {
// the escrow account address
string escrow_address = 1;
-}
\ No newline at end of file
+}
+
+// QueryTotalEscrowForDenomRequest is the request type for TotalEscrowForDenom RPC method.
+message QueryTotalEscrowForDenomRequest {
+ string denom = 1;
+}
+
+// QueryTotalEscrowForDenomResponse is the response type for TotalEscrowForDenom RPC method.
+message QueryTotalEscrowForDenomResponse {
+ cosmos.base.v1beta1.Coin amount = 1 [(gogoproto.nullable) = false];
+}
diff --git a/proto/ibc/core/channel/v1/tx.proto b/proto/ibc/core/channel/v1/tx.proto
index 0cc55fbaad6..a67a375559b 100644
--- a/proto/ibc/core/channel/v1/tx.proto
+++ b/proto/ibc/core/channel/v1/tx.proto
@@ -92,7 +92,8 @@ message MsgChannelOpenTry {
// MsgChannelOpenTryResponse defines the Msg/ChannelOpenTry response type.
message MsgChannelOpenTryResponse {
- string version = 1;
+ string version = 1;
+ string channel_id = 2 [(gogoproto.moretags) = "yaml:\"channel_id\""];
}
// MsgChannelOpenAck defines a msg sent by a Relayer to Chain A to acknowledge
diff --git a/proto/ibc/core/client/v1/client.proto b/proto/ibc/core/client/v1/client.proto
index 266649ba01c..15b47e55548 100644
--- a/proto/ibc/core/client/v1/client.proto
+++ b/proto/ibc/core/client/v1/client.proto
@@ -98,6 +98,8 @@ message Height {
// Params defines the set of IBC light client parameters.
message Params {
- // allowed_clients defines the list of allowed client state types.
+ // allowed_clients defines the list of allowed client state types which can be created
+ // and interacted with. If a client type is removed from the allowed clients list, usage
+ // of this client will be disabled until it is added again to the list.
repeated string allowed_clients = 1 [(gogoproto.moretags) = "yaml:\"allowed_clients\""];
}
diff --git a/proto/ibc/lightclients/localhost/v2/localhost.proto b/proto/ibc/lightclients/localhost/v2/localhost.proto
new file mode 100644
index 00000000000..ec970eb0008
--- /dev/null
+++ b/proto/ibc/lightclients/localhost/v2/localhost.proto
@@ -0,0 +1,16 @@
+syntax = "proto3";
+
+package ibc.lightclients.localhost.v2;
+
+option go_package = "github.com/cosmos/ibc-go/v7/modules/light-clients/09-localhost;localhost";
+
+import "ibc/core/client/v1/client.proto";
+import "gogoproto/gogo.proto";
+
+// ClientState defines the 09-localhost client state
+message ClientState {
+ option (gogoproto.goproto_getters) = false;
+
+ // the latest block height
+ ibc.core.client.v1.Height latest_height = 1 [(gogoproto.nullable) = false];
+}
diff --git a/proto/ibc/lightclients/tendermint/v1/tendermint.proto b/proto/ibc/lightclients/tendermint/v1/tendermint.proto
index 79713e5a253..83fa59c9fa4 100644
--- a/proto/ibc/lightclients/tendermint/v1/tendermint.proto
+++ b/proto/ibc/lightclients/tendermint/v1/tendermint.proto
@@ -69,7 +69,7 @@ message ConsensusState {
// 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.casttype) = "github.com/cometbft/cometbft/libs/bytes.HexBytes",
(gogoproto.moretags) = "yaml:\"next_validators_hash\""
];
}
diff --git a/testing/README.md b/testing/README.md
index 2e7bc0c8f72..c096e877f36 100644
--- a/testing/README.md
+++ b/testing/README.md
@@ -117,7 +117,17 @@ The testing package requires that you provide a function to initialize your Test
func SetupTestingApp() (TestingApp, map[string]json.RawMessage) {
db := dbm.NewMemDB()
encCdc := simapp.MakeTestEncodingConfig()
- app := simapp.NewSimApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, simapp.DefaultNodeHome, 5, encCdc, simapp.EmptyAppOptions{})
+ app := simapp.NewSimApp(
+ log.NewNopLogger(),
+ db,
+ nil,
+ true,
+ map[int64]bool{},
+ simapp.DefaultNodeHome,
+ 5,
+ encCdc,
+ simapp.EmptyAppOptions{},
+ )
return app, simapp.NewDefaultGenesisState(encCdc.Marshaler)
}
```
@@ -127,9 +137,8 @@ This function returns the TestingApp and the default genesis state used to initi
Change the value of `DefaultTestingAppInit` to use your function:
```go
func init() {
- ibctesting.DefaultTestingAppInit = MySetupTestingAppFunction
+ ibctesting.DefaultTestingAppInit = SetupTestingApp
}
-
```
## Example
@@ -252,9 +261,9 @@ package transfertesting
import (
"encoding/json"
- "github.com/tendermint/tendermint/libs/log"
- dbm "github.com/tendermint/tm-db"
-
+ "github.com/cometbft/cometbft/libs/log"
+ dbm "github.com/cometbft/cometbft-db"
+
"github.com/cosmos/ibc-go/v7/modules/apps/transfer/simapp"
ibctesting "github.com/cosmos/ibc-go/v7/testing"
)
@@ -262,7 +271,17 @@ import (
func SetupTransferTestingApp() (ibctesting.TestingApp, map[string]json.RawMessage) {
db := dbm.NewMemDB()
encCdc := simapp.MakeTestEncodingConfig()
- app := simapp.NewSimApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, simapp.DefaultNodeHome, 5, encCdc, simapp.EmptyAppOptions{})
+ app := simapp.NewSimApp(
+ log.NewNopLogger(),
+ db,
+ nil,
+ true,
+ map[int64]bool{},
+ simapp.DefaultNodeHome,
+ 5,
+ encCdc,
+ simapp.EmptyAppOptions{},
+ )
return app, simapp.NewDefaultGenesisState(encCdc.Marshaler)
}
diff --git a/testing/app.go b/testing/app.go
index f0fa35462f3..0df23c4312a 100644
--- a/testing/app.go
+++ b/testing/app.go
@@ -6,6 +6,11 @@ import (
"time"
"cosmossdk.io/math"
+ dbm "github.com/cometbft/cometbft-db"
+ abci "github.com/cometbft/cometbft/abci/types"
+ "github.com/cometbft/cometbft/libs/log"
+ 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"
@@ -19,11 +24,6 @@ import (
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"
- "github.com/tendermint/tendermint/libs/log"
- tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
- tmtypes "github.com/tendermint/tendermint/types"
- dbm "github.com/tendermint/tm-db"
"github.com/cosmos/ibc-go/v7/modules/core/keeper"
"github.com/cosmos/ibc-go/v7/testing/simapp"
@@ -64,6 +64,9 @@ func SetupTestingApp() (TestingApp, map[string]json.RawMessage) {
func SetupWithGenesisValSet(t *testing.T, valSet *tmtypes.ValidatorSet, genAccs []authtypes.GenesisAccount, chainID string, powerReduction math.Int, balances ...banktypes.Balance) TestingApp {
app, genesisState := DefaultTestingAppInit()
+ // ensure baseapp has a chain-id set before running InitChain
+ baseapp.SetChainID(chainID)(app.GetBaseApp())
+
// set genesis accounts
authGenesis := authtypes.NewGenesisState(authtypes.DefaultParams(), genAccs)
genesisState[authtypes.ModuleName] = app.AppCodec().MustMarshalJSON(authGenesis)
diff --git a/testing/chain.go b/testing/chain.go
index 709d4416f99..4a1a2f5db25 100644
--- a/testing/chain.go
+++ b/testing/chain.go
@@ -5,6 +5,12 @@ import (
"testing"
"time"
+ 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"
@@ -18,12 +24,6 @@ import (
"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/v7/modules/core/02-client/types"
commitmenttypes "github.com/cosmos/ibc-go/v7/modules/core/23-commitment/types"
diff --git a/testing/coordinator.go b/testing/coordinator.go
index 6374a17b170..614d153eebf 100644
--- a/testing/coordinator.go
+++ b/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"
)
var (
diff --git a/testing/endpoint.go b/testing/endpoint.go
index 4c3fce34936..f145804e4db 100644
--- a/testing/endpoint.go
+++ b/testing/endpoint.go
@@ -4,6 +4,7 @@ import (
"fmt"
"strings"
+ "github.com/cosmos/cosmos-sdk/baseapp"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/stretchr/testify/require"
@@ -180,6 +181,7 @@ func (endpoint *Endpoint) UpgradeChain() error {
}
// update chain
+ baseapp.SetChainID(newChainID)(endpoint.Chain.GetSimApp().GetBaseApp())
endpoint.Chain.ChainID = newChainID
endpoint.Chain.CurrentHeader.ChainID = newChainID
endpoint.Chain.NextBlock() // commit changes
diff --git a/testing/mock/mock.go b/testing/mock/mock.go
index 2c4b536fa26..9f265300c79 100644
--- a/testing/mock/mock.go
+++ b/testing/mock/mock.go
@@ -4,6 +4,7 @@ import (
"encoding/json"
"fmt"
+ 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"
@@ -12,7 +13,6 @@ import (
capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types"
"github.com/grpc-ecosystem/grpc-gateway/runtime"
"github.com/spf13/cobra"
- abci "github.com/tendermint/tendermint/abci/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"
diff --git a/testing/mock/privval.go b/testing/mock/privval.go
index 2917330b4d4..a92cc1fc5fa 100644
--- a/testing/mock/privval.go
+++ b/testing/mock/privval.go
@@ -1,12 +1,12 @@
package mock
import (
+ "github.com/cometbft/cometbft/crypto"
+ tmproto "github.com/cometbft/cometbft/proto/tendermint/types"
+ tmtypes "github.com/cometbft/cometbft/types"
cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec"
"github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
- "github.com/tendermint/tendermint/crypto"
- tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
- tmtypes "github.com/tendermint/tendermint/types"
)
var _ tmtypes.PrivValidator = PV{}
diff --git a/testing/mock/privval_test.go b/testing/mock/privval_test.go
index 7b40f7b7130..d8ef0e4409b 100644
--- a/testing/mock/privval_test.go
+++ b/testing/mock/privval_test.go
@@ -3,9 +3,9 @@ package mock_test
import (
"testing"
+ tmproto "github.com/cometbft/cometbft/proto/tendermint/types"
+ tmtypes "github.com/cometbft/cometbft/types"
"github.com/stretchr/testify/require"
- tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
- tmtypes "github.com/tendermint/tendermint/types"
"github.com/cosmos/ibc-go/v7/testing/mock"
)
diff --git a/testing/simapp/app.go b/testing/simapp/app.go
index 6ed2411f9cd..b2e17de7232 100644
--- a/testing/simapp/app.go
+++ b/testing/simapp/app.go
@@ -2,11 +2,18 @@ package simapp
import (
"encoding/json"
+ "fmt"
"io"
"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"
+ "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/docs/statik" // this is used for serving docs
@@ -14,6 +21,7 @@ import (
"github.com/cosmos/cosmos-sdk/client/grpc/tmservice"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/codec/types"
+ runtimeservices "github.com/cosmos/cosmos-sdk/runtime/services"
"github.com/cosmos/cosmos-sdk/server/api"
"github.com/cosmos/cosmos-sdk/server/config"
servertypes "github.com/cosmos/cosmos-sdk/server/types"
@@ -60,7 +68,6 @@ import (
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"
- govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1"
"github.com/cosmos/cosmos-sdk/x/group"
groupkeeper "github.com/cosmos/cosmos-sdk/x/group/keeper"
@@ -86,10 +93,6 @@ import (
"github.com/gorilla/mux"
"github.com/rakyll/statik/fs"
"github.com/spf13/cast"
- abci "github.com/tendermint/tendermint/abci/types"
- "github.com/tendermint/tendermint/libs/log"
- tmos "github.com/tendermint/tendermint/libs/os"
- dbm "github.com/tendermint/tm-db"
ica "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts"
icacontroller "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller"
@@ -116,9 +119,7 @@ import (
ibctm "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint"
ibcmock "github.com/cosmos/ibc-go/v7/testing/mock"
simappparams "github.com/cosmos/ibc-go/v7/testing/simapp/params"
- simappupgrades "github.com/cosmos/ibc-go/v7/testing/simapp/upgrades"
- v6 "github.com/cosmos/ibc-go/v7/testing/simapp/upgrades/v6"
- v7 "github.com/cosmos/ibc-go/v7/testing/simapp/upgrades/v7"
+ "github.com/cosmos/ibc-go/v7/testing/simapp/upgrades"
ibctestingtypes "github.com/cosmos/ibc-go/v7/testing/types"
)
@@ -305,7 +306,7 @@ func NewSimApp(
app.ParamsKeeper = initParamsKeeper(appCodec, legacyAmino, keys[paramstypes.StoreKey], tkeys[paramstypes.TStoreKey])
// set the BaseApp's parameter store
- app.ConsensusParamsKeeper = consensusparamkeeper.NewKeeper(appCodec, keys[upgradetypes.StoreKey], authtypes.NewModuleAddress(govtypes.ModuleName).String())
+ app.ConsensusParamsKeeper = consensusparamkeeper.NewKeeper(appCodec, keys[consensusparamtypes.StoreKey], authtypes.NewModuleAddress(govtypes.ModuleName).String())
bApp.SetParamStore(&app.ConsensusParamsKeeper)
// add capability keeper and ScopeToModule for ibc module
@@ -602,6 +603,14 @@ func NewSimApp(
app.configurator = module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter())
app.mm.RegisterServices(app.configurator)
+ autocliv1.RegisterQueryServer(app.GRPCQueryRouter(), runtimeservices.NewAutoCLIQueryService(app.mm.Modules))
+
+ reflectionSvc, err := runtimeservices.NewReflectionService()
+ if err != nil {
+ panic(err)
+ }
+ reflectionv1.RegisterReflectionServiceServer(app.GRPCQueryRouter(), reflectionSvc)
+
// add test gRPC service for testing gRPC queries in isolation
testdata.RegisterQueryServer(app.GRPCQueryRouter(), testdata.QueryImpl{})
@@ -658,6 +667,7 @@ func NewSimApp(
app.SetEndBlocker(app.EndBlocker)
app.setupUpgradeHandlers()
+ app.setupUpgradeStoreLoaders()
if loadLatest {
if err := app.LoadLatestVersion(); err != nil {
@@ -823,6 +833,9 @@ func (app *SimApp) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APICon
// Register legacy and grpc-gateway routes for all modules.
ModuleBasics.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter)
+ // Register nodeservice grpc-gateway routes.
+ nodeservice.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter)
+
// register swagger API from root so that other applications can override easily
if apiConfig.Swagger {
RegisterSwaggerAPI(clientCtx, apiSvr.Router)
@@ -892,14 +905,8 @@ func BlockedAddresses() map[string]bool {
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(banktypes.ModuleName)
- paramsKeeper.Subspace(stakingtypes.ModuleName)
- paramsKeeper.Subspace(minttypes.ModuleName)
- paramsKeeper.Subspace(distrtypes.ModuleName)
- paramsKeeper.Subspace(slashingtypes.ModuleName)
- paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(govv1.ParamKeyTable())
- paramsKeeper.Subspace(crisistypes.ModuleName)
+ // TODO: ibc module subspaces can be removed after migration of params
+ // https://github.com/cosmos/ibc-go/issues/2010
paramsKeeper.Subspace(ibctransfertypes.ModuleName)
paramsKeeper.Subspace(ibcexported.ModuleName)
paramsKeeper.Subspace(icacontrollertypes.SubModuleName)
@@ -911,17 +918,16 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino
// setupUpgradeHandlers sets all necessary upgrade handlers for testing purposes
func (app *SimApp) setupUpgradeHandlers() {
app.UpgradeKeeper.SetUpgradeHandler(
- simappupgrades.DefaultUpgradeName,
- simappupgrades.CreateDefaultUpgradeHandler(app.mm, app.configurator),
+ upgrades.V5,
+ upgrades.CreateDefaultUpgradeHandler(app.mm, app.configurator),
)
// NOTE: The moduleName arg of v6.CreateUpgradeHandler refers to the auth module ScopedKeeper name to which the channel capability should be migrated from.
// This should be the same string value provided upon instantiation of the ScopedKeeper with app.CapabilityKeeper.ScopeToModule()
- // TODO: update git tag in link below
- // See: https://github.com/cosmos/ibc-go/blob/v5.0.0-rc2/testing/simapp/app.go#L304
+ // See: https://github.com/cosmos/ibc-go/blob/v6.1.0/testing/simapp/app.go#L310
app.UpgradeKeeper.SetUpgradeHandler(
- v6.UpgradeName,
- v6.CreateUpgradeHandler(
+ upgrades.V6,
+ upgrades.CreateV6UpgradeHandler(
app.mm,
app.configurator,
app.appCodec,
@@ -932,12 +938,39 @@ func (app *SimApp) setupUpgradeHandlers() {
)
app.UpgradeKeeper.SetUpgradeHandler(
- v7.UpgradeName,
- v7.CreateUpgradeHandler(
+ upgrades.V7,
+ upgrades.CreateV7UpgradeHandler(
app.mm,
app.configurator,
app.appCodec,
app.IBCKeeper.ClientKeeper,
+ app.ConsensusParamsKeeper,
+ app.ParamsKeeper,
),
)
+
+ app.UpgradeKeeper.SetUpgradeHandler(
+ upgrades.V7_1,
+ upgrades.CreateV7LocalhostUpgradeHandler(app.mm, app.configurator, app.IBCKeeper.ClientKeeper),
+ )
+}
+
+// setupUpgradeStoreLoaders sets all necessary store loaders required by upgrades.
+func (app *SimApp) setupUpgradeStoreLoaders() {
+ upgradeInfo, err := app.UpgradeKeeper.ReadUpgradeInfoFromDisk()
+ if err != nil {
+ tmos.Exit(fmt.Sprintf("failed to read upgrade info from disk %s", err))
+ }
+
+ if upgradeInfo.Name == upgrades.V7 && !app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) {
+ storeUpgrades := storetypes.StoreUpgrades{
+ Added: []string{
+ consensusparamtypes.StoreKey,
+ crisistypes.StoreKey,
+ },
+ }
+
+ // configure store loader that checks if version == upgradeHeight and applies store upgrades
+ app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades))
+ }
}
diff --git a/testing/simapp/export.go b/testing/simapp/export.go
index 3d436bc4b6d..8515cc0f43f 100644
--- a/testing/simapp/export.go
+++ b/testing/simapp/export.go
@@ -4,12 +4,12 @@ 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/tendermint/tendermint/proto/tendermint/types"
)
// ExportAppStateAndValidators exports the state of the application for a genesis
diff --git a/testing/simapp/genesis_account_test.go b/testing/simapp/genesis_account_test.go
index 3f88fd435c5..be767553606 100644
--- a/testing/simapp/genesis_account_test.go
+++ b/testing/simapp/genesis_account_test.go
@@ -4,11 +4,11 @@ import (
"testing"
"time"
+ "github.com/cometbft/cometbft/crypto"
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
sdk "github.com/cosmos/cosmos-sdk/types"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
"github.com/stretchr/testify/require"
- "github.com/tendermint/tendermint/crypto"
"github.com/cosmos/ibc-go/v7/testing/simapp"
)
diff --git a/testing/simapp/sim_bench_test.go b/testing/simapp/sim_bench_test.go
index 8cdecd5c331..3a70bc835e8 100644
--- a/testing/simapp/sim_bench_test.go
+++ b/testing/simapp/sim_bench_test.go
@@ -5,10 +5,11 @@ import (
"os"
"testing"
+ tmproto "github.com/cometbft/cometbft/proto/tendermint/types"
+ "github.com/cosmos/cosmos-sdk/baseapp"
simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims"
simtypes "github.com/cosmos/cosmos-sdk/types/simulation"
"github.com/cosmos/cosmos-sdk/x/simulation"
- tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
)
// Profile with:
@@ -28,7 +29,7 @@ func BenchmarkFullAppSimulation(b *testing.B) {
}
}()
- app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), simtestutil.EmptyAppOptions{}, interBlockCacheOpt())
+ app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), simtestutil.EmptyAppOptions{}, interBlockCacheOpt(), baseapp.SetChainID(SimAppChainID))
// run randomized simulation
_, simParams, simErr := simulation.SimulateFromSeed(
@@ -74,7 +75,7 @@ func BenchmarkInvariants(b *testing.B) {
}
}()
- app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), simtestutil.EmptyAppOptions{}, interBlockCacheOpt())
+ app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), simtestutil.EmptyAppOptions{}, interBlockCacheOpt(), baseapp.SetChainID(SimAppChainID))
// run randomized simulation
_, simParams, simErr := simulation.SimulateFromSeed(
diff --git a/testing/simapp/sim_test.go b/testing/simapp/sim_test.go
index 5c9dc1cddde..2df2dba6d1a 100644
--- a/testing/simapp/sim_test.go
+++ b/testing/simapp/sim_test.go
@@ -7,6 +7,10 @@ import (
"os"
"testing"
+ dbm "github.com/cometbft/cometbft-db"
+ abci "github.com/cometbft/cometbft/abci/types"
+ "github.com/cometbft/cometbft/libs/log"
+ tmproto "github.com/cometbft/cometbft/proto/tendermint/types"
"github.com/cosmos/cosmos-sdk/baseapp"
"github.com/cosmos/cosmos-sdk/store"
storetypes "github.com/cosmos/cosmos-sdk/store/types"
@@ -26,15 +30,14 @@ import (
slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types"
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/libs/log"
- tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
- dbm "github.com/tendermint/tm-db"
ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported"
)
+// SimAppChainID hardcoded chainID for simulation
+const SimAppChainID = "simulation-app"
+
// Get flags every time the simulator is run
func init() {
GetSimulatorFlags()
@@ -70,7 +73,7 @@ func TestFullAppSimulation(t *testing.T) {
require.NoError(t, os.RemoveAll(dir))
}()
- app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), simtestutil.EmptyAppOptions{}, fauxMerkleModeOpt)
+ app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), simtestutil.EmptyAppOptions{}, fauxMerkleModeOpt, baseapp.SetChainID(SimAppChainID))
require.Equal(t, "SimApp", app.Name())
// run randomized simulation
@@ -108,7 +111,7 @@ func TestAppImportExport(t *testing.T) {
require.NoError(t, os.RemoveAll(dir))
}()
- app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), simtestutil.EmptyAppOptions{}, fauxMerkleModeOpt)
+ app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), simtestutil.EmptyAppOptions{}, fauxMerkleModeOpt, baseapp.SetChainID(SimAppChainID))
require.Equal(t, "SimApp", app.Name())
// Run randomized simulation
@@ -148,7 +151,7 @@ func TestAppImportExport(t *testing.T) {
require.NoError(t, os.RemoveAll(newDir))
}()
- newApp := NewSimApp(log.NewNopLogger(), newDB, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), simtestutil.EmptyAppOptions{}, fauxMerkleModeOpt)
+ newApp := NewSimApp(log.NewNopLogger(), newDB, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), simtestutil.EmptyAppOptions{}, fauxMerkleModeOpt, baseapp.SetChainID(SimAppChainID))
require.Equal(t, "SimApp", newApp.Name())
var genesisState GenesisState
@@ -208,7 +211,7 @@ func TestAppSimulationAfterImport(t *testing.T) {
require.NoError(t, os.RemoveAll(dir))
}()
- app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), simtestutil.EmptyAppOptions{}, fauxMerkleModeOpt)
+ app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), simtestutil.EmptyAppOptions{}, fauxMerkleModeOpt, baseapp.SetChainID(SimAppChainID))
require.Equal(t, "SimApp", app.Name())
// Run randomized simulation
@@ -253,7 +256,7 @@ func TestAppSimulationAfterImport(t *testing.T) {
require.NoError(t, os.RemoveAll(newDir))
}()
- newApp := NewSimApp(log.NewNopLogger(), newDB, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), simtestutil.EmptyAppOptions{}, fauxMerkleModeOpt)
+ newApp := NewSimApp(log.NewNopLogger(), newDB, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), simtestutil.EmptyAppOptions{}, fauxMerkleModeOpt, baseapp.SetChainID(SimAppChainID))
require.Equal(t, "SimApp", newApp.Name())
newApp.InitChain(abci.RequestInitChain{
@@ -304,7 +307,7 @@ func TestAppStateDeterminism(t *testing.T) {
}
db := dbm.NewMemDB()
- app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), simtestutil.EmptyAppOptions{}, interBlockCacheOpt())
+ app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), simtestutil.EmptyAppOptions{}, interBlockCacheOpt(), baseapp.SetChainID(SimAppChainID))
fmt.Printf(
"running non-determinism simulation; seed %d: %d/%d, attempt: %d/%d\n",
diff --git a/testing/simapp/simd/cmd/genaccounts_test.go b/testing/simapp/simd/cmd/genaccounts_test.go
index f643174707a..97b549c90f7 100644
--- a/testing/simapp/simd/cmd/genaccounts_test.go
+++ b/testing/simapp/simd/cmd/genaccounts_test.go
@@ -5,6 +5,7 @@ import (
"fmt"
"testing"
+ "github.com/cometbft/cometbft/libs/log"
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/flags"
"github.com/cosmos/cosmos-sdk/server"
@@ -14,7 +15,6 @@ import (
genutiltest "github.com/cosmos/cosmos-sdk/x/genutil/client/testutil"
"github.com/spf13/viper"
"github.com/stretchr/testify/require"
- "github.com/tendermint/tendermint/libs/log"
"github.com/cosmos/ibc-go/v7/testing/simapp"
simcmd "github.com/cosmos/ibc-go/v7/testing/simapp/simd/cmd"
diff --git a/testing/simapp/simd/cmd/root.go b/testing/simapp/simd/cmd/root.go
index 10a43fbb5d2..be85bbcca73 100644
--- a/testing/simapp/simd/cmd/root.go
+++ b/testing/simapp/simd/cmd/root.go
@@ -6,8 +6,12 @@ import (
"os"
"path/filepath"
- sdkcmd "cosmossdk.io/simapp/simd/cmd"
rosettaCmd "cosmossdk.io/tools/rosetta/cmd"
+ dbm "github.com/cometbft/cometbft-db"
+ tmcfg "github.com/cometbft/cometbft/config"
+ tmcli "github.com/cometbft/cometbft/libs/cli"
+ "github.com/cometbft/cometbft/libs/log"
+ tmtypes "github.com/cometbft/cometbft/types"
"github.com/cosmos/cosmos-sdk/baseapp"
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/config"
@@ -31,10 +35,6 @@ import (
genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types"
"github.com/spf13/cast"
"github.com/spf13/cobra"
- tmcfg "github.com/tendermint/tendermint/config"
- tmcli "github.com/tendermint/tendermint/libs/cli"
- "github.com/tendermint/tendermint/libs/log"
- dbm "github.com/tendermint/tm-db"
"github.com/cosmos/ibc-go/v7/testing/simapp"
"github.com/cosmos/ibc-go/v7/testing/simapp/params"
@@ -169,7 +169,6 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) {
genutilcli.ValidateGenesisCmd(simapp.ModuleBasics),
AddGenesisAccountCmd(simapp.DefaultNodeHome),
tmcli.NewCompletionCmd(rootCmd, true),
- sdkcmd.NewTestnetCmd(simapp.ModuleBasics, banktypes.GenesisBalancesIterator{}),
debug.Cmd(),
config.Cmd(),
)
@@ -265,6 +264,18 @@ func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, a
panic(err)
}
+ homeDir := cast.ToString(appOpts.Get(flags.FlagHome))
+ chainID := cast.ToString(appOpts.Get(flags.FlagChainID))
+ if chainID == "" {
+ // fallback to genesis chain-id
+ appGenesis, err := tmtypes.GenesisDocFromFile(filepath.Join(homeDir, "config", "genesis.json"))
+ if err != nil {
+ panic(err)
+ }
+
+ chainID = appGenesis.ChainID
+ }
+
snapshotDir := filepath.Join(cast.ToString(appOpts.Get(flags.FlagHome)), "data", "snapshots")
snapshotDB, err := dbm.NewDB("metadata", server.GetAppDBBackend(appOpts), snapshotDir)
if err != nil {
@@ -295,6 +306,7 @@ func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, a
baseapp.SetTrace(cast.ToBool(appOpts.Get(server.FlagTrace))),
baseapp.SetIndexEvents(cast.ToStringSlice(appOpts.Get(server.FlagIndexEvents))),
baseapp.SetSnapshot(snapshotStore, snapshotOptions),
+ baseapp.SetChainID(chainID),
)
}
diff --git a/testing/simapp/state.go b/testing/simapp/state.go
index 3e8707d40c1..29fa1955024 100644
--- a/testing/simapp/state.go
+++ b/testing/simapp/state.go
@@ -9,6 +9,8 @@ import (
"time"
"cosmossdk.io/math"
+ tmjson "github.com/cometbft/cometbft/libs/json"
+ tmtypes "github.com/cometbft/cometbft/types"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
sdk "github.com/cosmos/cosmos-sdk/types"
@@ -17,8 +19,6 @@ import (
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
- tmjson "github.com/tendermint/tendermint/libs/json"
- tmtypes "github.com/tendermint/tendermint/types"
simappparams "github.com/cosmos/ibc-go/v7/testing/simapp/params"
)
diff --git a/testing/simapp/test_helpers.go b/testing/simapp/test_helpers.go
index d2d27aa66e0..6c61a000727 100644
--- a/testing/simapp/test_helpers.go
+++ b/testing/simapp/test_helpers.go
@@ -6,6 +6,11 @@ import (
"testing"
"time"
+ dbm "github.com/cometbft/cometbft-db"
+ abci "github.com/cometbft/cometbft/abci/types"
+ "github.com/cometbft/cometbft/libs/log"
+ 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"
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
@@ -18,11 +23,6 @@ import (
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
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/libs/log"
- tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
- tmtypes "github.com/tendermint/tendermint/types"
- dbm "github.com/tendermint/tm-db"
"github.com/cosmos/ibc-go/v7/testing/mock"
)
diff --git a/testing/simapp/types.go b/testing/simapp/types.go
index fcb0b26b62d..ae07721f297 100644
--- a/testing/simapp/types.go
+++ b/testing/simapp/types.go
@@ -1,11 +1,11 @@
package simapp
import (
+ abci "github.com/cometbft/cometbft/abci/types"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/server/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/module"
- abci "github.com/tendermint/tendermint/abci/types"
)
// App implements the common methods for a Cosmos SDK-based application
diff --git a/testing/simapp/upgrades/upgrades.go b/testing/simapp/upgrades/upgrades.go
index adc81349bdd..1adf5eb3e68 100644
--- a/testing/simapp/upgrades/upgrades.go
+++ b/testing/simapp/upgrades/upgrades.go
@@ -1,14 +1,32 @@
package upgrades
import (
+ "github.com/cosmos/cosmos-sdk/baseapp"
+ "github.com/cosmos/cosmos-sdk/codec"
+ storetypes "github.com/cosmos/cosmos-sdk/store/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/module"
+ capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper"
+ consensusparamskeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper"
+ paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper"
+ paramstypes "github.com/cosmos/cosmos-sdk/x/params/types"
upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
+
+ v6 "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/migrations/v6"
+ clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper"
+ "github.com/cosmos/ibc-go/v7/modules/core/exported"
+ ibctmmigrations "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint/migrations"
)
const (
- // DefaultUpgradeName is the default upgrade name used for upgrade tests which do not require special handling.
- DefaultUpgradeName = "normal upgrade"
+ // V5 defines the upgrade name for the ibc-go/v5 upgrade handler.
+ V5 = "normal upgrade" // NOTE: keeping as "normal upgrade" as existing tags depend on this name
+ // V6 defines the upgrade name for the ibc-go/v6 upgrade handler.
+ V6 = "v6"
+ // V7 defines the upgrade name for the ibc-go/v7 upgrade handler.
+ V7 = "v7"
+ // V7_1 defines the upgrade name for the ibc-go/v7.1 upgrade handler.
+ V7_1 = "v7.1"
)
// CreateDefaultUpgradeHandler creates an upgrade handler which can be used for regular upgrade tests
@@ -21,3 +39,60 @@ func CreateDefaultUpgradeHandler(
return mm.RunMigrations(ctx, configurator, vm)
}
}
+
+// CreateV6UpgradeHandler creates an upgrade handler for the ibc-go/v6 SimApp upgrade.
+// NOTE: The v6.MigrateICS27ChannelCapabiliity function can be omitted if chains do not yet implement an ICS27 controller module
+func CreateV6UpgradeHandler(
+ mm *module.Manager,
+ configurator module.Configurator,
+ cdc codec.BinaryCodec,
+ capabilityStoreKey *storetypes.KVStoreKey,
+ capabilityKeeper *capabilitykeeper.Keeper,
+ moduleName string,
+) upgradetypes.UpgradeHandler {
+ return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) {
+ if err := v6.MigrateICS27ChannelCapability(ctx, cdc, capabilityStoreKey, capabilityKeeper, moduleName); err != nil {
+ return nil, err
+ }
+
+ return mm.RunMigrations(ctx, configurator, vm)
+ }
+}
+
+// CreateV7UpgradeHandler creates an upgrade handler for the ibc-go/v7 SimApp upgrade.
+func CreateV7UpgradeHandler(
+ mm *module.Manager,
+ configurator module.Configurator,
+ cdc codec.BinaryCodec,
+ clientKeeper clientkeeper.Keeper,
+ consensusParamsKeeper consensusparamskeeper.Keeper,
+ paramsKeeper paramskeeper.Keeper,
+) upgradetypes.UpgradeHandler {
+ return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) {
+ // OPTIONAL: prune expired tendermint consensus states to save storage space
+ if _, err := ibctmmigrations.PruneExpiredConsensusStates(ctx, cdc, clientKeeper); err != nil {
+ return nil, err
+ }
+
+ legacyBaseAppSubspace := paramsKeeper.Subspace(baseapp.Paramspace).WithKeyTable(paramstypes.ConsensusParamsKeyTable())
+ baseapp.MigrateParams(ctx, legacyBaseAppSubspace, &consensusParamsKeeper)
+
+ return mm.RunMigrations(ctx, configurator, vm)
+ }
+}
+
+// CreateV7LocalhostUpgradeHandler creates an upgrade handler for the ibc-go/v7.1 SimApp upgrade.
+func CreateV7LocalhostUpgradeHandler(
+ mm *module.Manager,
+ configurator module.Configurator,
+ clientKeeper clientkeeper.Keeper,
+) upgradetypes.UpgradeHandler {
+ return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) {
+ // explicitly update the IBC 02-client params, adding the localhost client type
+ params := clientKeeper.GetParams(ctx)
+ params.AllowedClients = append(params.AllowedClients, exported.Localhost)
+ clientKeeper.SetParams(ctx, params)
+
+ return mm.RunMigrations(ctx, configurator, vm)
+ }
+}
diff --git a/testing/simapp/upgrades/v6/upgrades.go b/testing/simapp/upgrades/v6/upgrades.go
deleted file mode 100644
index 953bccf37e9..00000000000
--- a/testing/simapp/upgrades/v6/upgrades.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package v6
-
-import (
- "github.com/cosmos/cosmos-sdk/codec"
- storetypes "github.com/cosmos/cosmos-sdk/store/types"
- sdk "github.com/cosmos/cosmos-sdk/types"
- "github.com/cosmos/cosmos-sdk/types/module"
- capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper"
- upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
-
- v6 "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/migrations/v6"
-)
-
-const (
- // UpgradeName defines the on-chain upgrade name for the SimApp v6 upgrade.
- UpgradeName = "v6"
-)
-
-// CreateUpgradeHandler creates an upgrade handler for the v6 SimApp upgrade.
-// NOTE: The v6.MigrateICS27ChannelCapabiliity function can be omitted if chains do not yet implement an ICS27 controller module
-func CreateUpgradeHandler(
- mm *module.Manager,
- configurator module.Configurator,
- cdc codec.BinaryCodec,
- capabilityStoreKey *storetypes.KVStoreKey,
- capabilityKeeper *capabilitykeeper.Keeper,
- moduleName string,
-) upgradetypes.UpgradeHandler {
- return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) {
- if err := v6.MigrateICS27ChannelCapability(ctx, cdc, capabilityStoreKey, capabilityKeeper, moduleName); err != nil {
- return nil, err
- }
-
- return mm.RunMigrations(ctx, configurator, vm)
- }
-}
diff --git a/testing/simapp/upgrades/v7/upgrades.go b/testing/simapp/upgrades/v7/upgrades.go
deleted file mode 100644
index 4cea0b5a9b0..00000000000
--- a/testing/simapp/upgrades/v7/upgrades.go
+++ /dev/null
@@ -1,33 +0,0 @@
-package v7
-
-import (
- "github.com/cosmos/cosmos-sdk/codec"
- sdk "github.com/cosmos/cosmos-sdk/types"
- "github.com/cosmos/cosmos-sdk/types/module"
- upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
-
- clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper"
- ibctmmigrations "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint/migrations"
-)
-
-const (
- // UpgradeName defines the on-chain upgrade name for the SimApp v7 upgrade.
- UpgradeName = "v7"
-)
-
-// CreateUpgradeHandler creates an upgrade handler for the v7 SimApp upgrade.
-func CreateUpgradeHandler(
- mm *module.Manager,
- configurator module.Configurator,
- cdc codec.BinaryCodec,
- clientKeeper clientkeeper.Keeper,
-) upgradetypes.UpgradeHandler {
- return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) {
- // OPTIONAL: prune expired tendermint consensus states to save storage space
- if _, err := ibctmmigrations.PruneExpiredConsensusStates(ctx, cdc, clientKeeper); err != nil {
- return nil, err
- }
-
- return mm.RunMigrations(ctx, configurator, vm)
- }
-}
diff --git a/testing/simapp/utils.go b/testing/simapp/utils.go
index 92fda85a524..70b354e17ac 100644
--- a/testing/simapp/utils.go
+++ b/testing/simapp/utils.go
@@ -5,13 +5,13 @@ import (
"fmt"
"os"
+ dbm "github.com/cometbft/cometbft-db"
+ "github.com/cometbft/cometbft/libs/log"
"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/kv"
"github.com/cosmos/cosmos-sdk/types/module"
simtypes "github.com/cosmos/cosmos-sdk/types/simulation"
- "github.com/tendermint/tendermint/libs/log"
- dbm "github.com/tendermint/tm-db"
)
// SetupSimulation creates the config, db (levelDB), temporary directory and logger for
@@ -65,7 +65,8 @@ func SimulationOperations(app App, cdc codec.JSONCodec, config simtypes.Config)
}
}
- simState.Contents = app.SimulationManager().GetProposalContents(simState)
+ //nolint: staticcheck // SA1019: app.SimulationManager().GetProposalContents is deprecated: Use GetProposalMsgs instead. GetProposalContents returns each module's proposal content generator function with their default operation weight and key.
+ simState.LegacyProposalContents = app.SimulationManager().GetProposalContents(simState)
return app.SimulationManager().WeightedOperations(simState)
}
diff --git a/testing/utils.go b/testing/utils.go
index f9f64bf72bd..f0091d8e211 100644
--- a/testing/utils.go
+++ b/testing/utils.go
@@ -3,9 +3,9 @@ package ibctesting
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"
)
// ApplyValSetChanges takes in tmtypes.ValidatorSet and []abci.ValidatorUpdate and will return a new tmtypes.ValidatorSet which has the