From 6a7b30b562f6840a1b755a8b7c0843f56cb08387 Mon Sep 17 00:00:00 2001 From: Carlos Rodriguez Date: Wed, 2 Oct 2024 22:41:40 +0200 Subject: [PATCH] chores after v9.0.0 release (#7376) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: update compatibility tests, etc after v9.0.0 release * add v9.0.x docs folder --------- Co-authored-by: colin axnér <25233464+colin-axner@users.noreply.github.com> Co-authored-by: DimitrisJim --- .../main/ica-chain-a.json | 1 + .../main/ica-chain-b.json | 1 + .../main/ica-channel-upgrade-chain-a.json | 1 + .../main/ica-channel-upgrade-chain-b.json | 1 + .../main/ica-gov-chain-a.json | 1 + .../main/ica-gov-chain-b.json | 1 + .../main/ica-groups-chain-a.json | 1 + .../main/ica-groups-chain-b.json | 1 + .../main/ica-unordered-channel-chain-a.json | 1 + .../main/ica-unordered-channel-chain-b.json | 1 + .../main/incentivized-ica-chain-a.json | 1 + .../main/incentivized-ica-chain-b.json | 1 + .../main/incentivized-transfer-chain-a.json | 1 + .../main/incentivized-transfer-chain-b.json | 1 + .../main/localhost-ica-chain-a.json | 1 + .../main/localhost-ica-chain-b.json | 1 + .../main/localhost-transfer-chain-a.json | 1 + .../main/localhost-transfer-chain-b.json | 1 + .../main/transfer-authz-chain-a.json | 1 + .../main/transfer-authz-chain-b.json | 1 + .../main/transfer-chain-a.json | 1 + .../main/transfer-chain-b.json | 1 + .../transfer-channel-upgrade-chain-a.json | 1 + .../transfer-channel-upgrade-chain-b.json | 1 + ...transfer-v2-1-channel-upgrade-chain-a.json | 3 +- ...transfer-v2-1-channel-upgrade-chain-b.json | 19 + ...transfer-v2-2-channel-upgrade-chain-a.json | 3 +- ...transfer-v2-2-channel-upgrade-chain-b.json | 18 + .../main/transfer-v2-forwarding-chain-a.json | 3 +- .../main/transfer-v2-forwarding-chain-b.json | 22 + .../main/transfer-v2-multidenom-chain-a.json | 3 +- .../main/transfer-v2-multidenom-chain-b.json | 20 + .../release-v7.4.x/ica-chain-a.json | 1 + .../release-v7.4.x/ica-chain-b.json | 1 + .../release-v7.4.x/ica-gov-chain-a.json | 1 + .../release-v7.4.x/ica-gov-chain-b.json | 1 + .../release-v7.4.x/ica-groups-chain-a.json | 1 + .../release-v7.4.x/ica-groups-chain-b.json | 1 + .../incentivized-ica-chain-a.json | 1 + .../incentivized-ica-chain-b.json | 1 + .../incentivized-transfer-chain-a.json | 1 + .../incentivized-transfer-chain-b.json | 1 + .../release-v7.4.x/localhost-ica-chain-a.json | 1 + .../localhost-transfer-chain-a.json | 1 + .../transfer-authz-chain-a.json | 1 + .../transfer-authz-chain-b.json | 1 + .../release-v7.4.x/transfer-chain-a.json | 1 + .../release-v7.4.x/transfer-chain-b.json | 1 + .../release-v7.5.x/ica-chain-a.json | 1 + .../release-v7.5.x/ica-chain-b.json | 1 + .../release-v7.5.x/ica-gov-chain-a.json | 1 + .../release-v7.5.x/ica-gov-chain-b.json | 1 + .../release-v7.5.x/ica-groups-chain-a.json | 1 + .../release-v7.5.x/ica-groups-chain-b.json | 1 + .../ica-unordered-channel-chain-a.json | 1 + .../ica-unordered-channel-chain-b.json | 1 + .../incentivized-ica-chain-a.json | 1 + .../incentivized-ica-chain-b.json | 1 + .../incentivized-transfer-chain-a.json | 1 + .../incentivized-transfer-chain-b.json | 1 + .../release-v7.5.x/localhost-ica-chain-a.json | 1 + .../localhost-transfer-chain-a.json | 1 + .../transfer-authz-chain-a.json | 1 + .../transfer-authz-chain-b.json | 1 + .../release-v7.5.x/transfer-chain-a.json | 1 + .../release-v7.5.x/transfer-chain-b.json | 1 + .../release-v7.6.x/ica-chain-a.json | 1 + .../release-v7.6.x/ica-chain-b.json | 1 + .../release-v7.6.x/ica-gov-chain-a.json | 1 + .../release-v7.6.x/ica-gov-chain-b.json | 1 + .../release-v7.6.x/ica-groups-chain-a.json | 1 + .../release-v7.6.x/ica-groups-chain-b.json | 1 + .../ica-unordered-channel-chain-a.json | 1 + .../ica-unordered-channel-chain-b.json | 1 + .../incentivized-ica-chain-a.json | 1 + .../incentivized-ica-chain-b.json | 1 + .../incentivized-transfer-chain-a.json | 1 + .../incentivized-transfer-chain-b.json | 1 + .../release-v7.6.x/localhost-ica-chain-a.json | 1 + .../localhost-transfer-chain-a.json | 1 + .../transfer-authz-chain-a.json | 1 + .../transfer-authz-chain-b.json | 1 + .../release-v7.6.x/transfer-chain-a.json | 1 + .../release-v7.6.x/transfer-chain-b.json | 1 + .../release-v7.7.x/ica-chain-a.json | 1 + .../release-v7.7.x/ica-chain-b.json | 1 + .../release-v7.7.x/ica-gov-chain-a.json | 1 + .../release-v7.7.x/ica-gov-chain-b.json | 1 + .../release-v7.7.x/ica-groups-chain-a.json | 1 + .../release-v7.7.x/ica-groups-chain-b.json | 1 + .../ica-unordered-channel-chain-a.json | 1 + .../ica-unordered-channel-chain-b.json | 1 + .../incentivized-ica-chain-a.json | 1 + .../incentivized-ica-chain-b.json | 1 + .../incentivized-transfer-chain-a.json | 1 + .../incentivized-transfer-chain-b.json | 1 + .../release-v7.7.x/localhost-ica-chain-a.json | 1 + .../localhost-transfer-chain-a.json | 1 + .../transfer-authz-chain-a.json | 1 + .../transfer-authz-chain-b.json | 1 + .../release-v7.7.x/transfer-chain-a.json | 1 + .../release-v7.7.x/transfer-chain-b.json | 1 + .../release-v7.8.x/ica-chain-a.json | 1 + .../release-v7.8.x/ica-chain-b.json | 1 + .../release-v7.8.x/ica-gov-chain-a.json | 1 + .../release-v7.8.x/ica-gov-chain-b.json | 1 + .../release-v7.8.x/ica-groups-chain-a.json | 1 + .../release-v7.8.x/ica-groups-chain-b.json | 1 + .../ica-unordered-channel-chain-a.json | 1 + .../ica-unordered-channel-chain-b.json | 1 + .../incentivized-ica-chain-a.json | 1 + .../incentivized-ica-chain-b.json | 1 + .../incentivized-transfer-chain-a.json | 1 + .../incentivized-transfer-chain-b.json | 1 + .../release-v7.8.x/localhost-ica-chain-a.json | 1 + .../localhost-transfer-chain-a.json | 1 + .../transfer-authz-chain-a.json | 1 + .../transfer-authz-chain-b.json | 1 + .../release-v7.8.x/transfer-chain-a.json | 1 + .../release-v7.8.x/transfer-chain-b.json | 1 + .../release-v8.4.x/ica-chain-a.json | 1 + .../release-v8.4.x/ica-chain-b.json | 1 + .../ica-channel-upgrade-chain-a.json | 1 + .../ica-channel-upgrade-chain-b.json | 1 + .../release-v8.4.x/ica-gov-chain-a.json | 1 + .../release-v8.4.x/ica-gov-chain-b.json | 1 + .../release-v8.4.x/ica-groups-chain-a.json | 1 + .../release-v8.4.x/ica-groups-chain-b.json | 1 + .../release-v8.4.x/ica-queries-chain-a.json | 1 + .../release-v8.4.x/ica-queries-chain-b.json | 1 + .../ica-unordered-channel-chain-a.json | 1 + .../ica-unordered-channel-chain-b.json | 1 + .../incentivized-ica-chain-a.json | 1 + .../incentivized-ica-chain-b.json | 1 + .../incentivized-transfer-chain-a.json | 1 + .../incentivized-transfer-chain-b.json | 1 + .../release-v8.4.x/localhost-ica-chain-a.json | 1 + .../localhost-transfer-chain-a.json | 1 + .../transfer-authz-chain-a.json | 1 + .../transfer-authz-chain-b.json | 1 + .../release-v8.4.x/transfer-chain-a.json | 1 + .../release-v8.4.x/transfer-chain-b.json | 1 + .../transfer-channel-upgrade-chain-a.json | 1 + .../transfer-channel-upgrade-chain-b.json | 1 + .../release-v8.5.x/ica-chain-a.json | 1 + .../release-v8.5.x/ica-chain-b.json | 1 + .../ica-channel-upgrade-chain-a.json | 1 + .../ica-channel-upgrade-chain-b.json | 1 + .../release-v8.5.x/ica-gov-chain-a.json | 1 + .../release-v8.5.x/ica-gov-chain-b.json | 1 + .../release-v8.5.x/ica-groups-chain-a.json | 1 + .../release-v8.5.x/ica-groups-chain-b.json | 1 + .../release-v8.5.x/ica-queries-chain-a.json | 1 + .../release-v8.5.x/ica-queries-chain-b.json | 1 + .../ica-unordered-channel-chain-a.json | 1 + .../ica-unordered-channel-chain-b.json | 1 + .../incentivized-ica-chain-a.json | 1 + .../incentivized-ica-chain-b.json | 1 + .../incentivized-transfer-chain-a.json | 1 + .../incentivized-transfer-chain-b.json | 1 + .../release-v8.5.x/localhost-ica-chain-a.json | 1 + .../localhost-transfer-chain-a.json | 1 + .../transfer-authz-chain-a.json | 1 + .../transfer-authz-chain-b.json | 1 + .../release-v8.5.x/transfer-chain-a.json | 1 + .../release-v8.5.x/transfer-chain-b.json | 1 + .../transfer-channel-upgrade-chain-a.json | 1 + .../transfer-channel-upgrade-chain-b.json | 1 + .../release-v9.0.x/ica-chain-a.json | 1 + .../release-v9.0.x/ica-chain-b.json | 1 + .../ica-channel-upgrade-chain-a.json | 1 + .../ica-channel-upgrade-chain-b.json | 1 + .../release-v9.0.x/ica-gov-chain-a.json | 1 + .../release-v9.0.x/ica-gov-chain-b.json | 1 + .../release-v9.0.x/ica-groups-chain-a.json | 1 + .../release-v9.0.x/ica-groups-chain-b.json | 1 + .../release-v9.0.x/ica-queries-chain-a.json | 1 + .../release-v9.0.x/ica-queries-chain-b.json | 1 + .../ica-unordered-channel-chain-a.json | 1 + .../ica-unordered-channel-chain-b.json | 1 + .../incentivized-ica-chain-a.json | 1 + .../incentivized-ica-chain-b.json | 1 + .../incentivized-transfer-chain-a.json | 1 + .../incentivized-transfer-chain-b.json | 1 + .../release-v9.0.x/localhost-ica-chain-a.json | 1 + .../localhost-transfer-chain-a.json | 1 + .../transfer-authz-chain-a.json | 1 + .../transfer-authz-chain-b.json | 1 + .../release-v9.0.x/transfer-chain-a.json | 1 + .../release-v9.0.x/transfer-chain-b.json | 1 + .../transfer-channel-upgrade-chain-a.json | 1 + ... => transfer-channel-upgrade-chain-b.json} | 5 +- ...transfer-v2-1-channel-upgrade-chain-a.json | 1 + ...transfer-v2-1-channel-upgrade-chain-b.json | 19 + ...transfer-v2-2-channel-upgrade-chain-a.json | 1 + ...transfer-v2-2-channel-upgrade-chain-b.json | 18 + .../transfer-v2-forwarding-chain-a.json | 1 + .../transfer-v2-forwarding-chain-b.json | 22 + .../transfer-v2-multidenom-chain-a.json | 1 + .../transfer-v2-multidenom-chain-b.json | 19 + .github/workflows/e2e-manual-simd.yaml | 2 + CHANGELOG.md | 15 +- README.md | 2 +- RELEASES.md | 2 + .../versioned_docs/version-v9.0.x/00-intro.md | 36 ++ .../version-v9.0.x/01-ibc/01-overview.md | 293 ++++++++++ .../version-v9.0.x/01-ibc/02-integration.md | 305 ++++++++++ .../version-v9.0.x/01-ibc/03-apps/01-apps.md | 444 ++++++++++++++ .../01-ibc/03-apps/02-ibcmodule.md | 367 ++++++++++++ .../01-ibc/03-apps/03-bindports.md | 122 ++++ .../01-ibc/03-apps/04-keeper.md | 71 +++ .../01-ibc/03-apps/05-packets_acks.md | 163 ++++++ .../01-ibc/03-apps/06-routing.md | 44 ++ .../01-ibc/03-apps/_category_.json | 5 + .../01-ibc/03-apps/images/packet_flow.png | Bin 0 -> 352988 bytes .../01-ibc/04-middleware/01-overview.md | 55 ++ .../01-ibc/04-middleware/02-develop.md | 464 +++++++++++++++ .../01-ibc/04-middleware/03-integration.md | 74 +++ .../01-ibc/04-middleware/_category_.json | 5 + .../04-middleware/images/middleware-stack.png | Bin 0 -> 194858 bytes .../01-ibc/05-upgrades/00-intro.md | 15 + .../01-ibc/05-upgrades/01-quick-guide.md | 60 ++ .../01-ibc/05-upgrades/02-developer-guide.md | 14 + .../01-ibc/05-upgrades/03-genesis-restart.md | 52 ++ .../01-ibc/05-upgrades/_category_.json | 5 + .../01-ibc/06-channel-upgrades.md | 413 +++++++++++++ .../version-v9.0.x/01-ibc/07-proposals.md | 118 ++++ .../version-v9.0.x/01-ibc/08-relayer.md | 53 ++ .../version-v9.0.x/01-ibc/09-proto-docs.md | 11 + .../version-v9.0.x/01-ibc/10-roadmap.md | 50 ++ .../01-ibc/11-troubleshooting.md | 15 + .../01-ibc/13-best-practices.md | 25 + .../version-v9.0.x/01-ibc/14-permissioning.md | 32 + .../version-v9.0.x/01-ibc/_category_.json | 5 + .../02-apps/01-transfer/01-overview.md | 181 ++++++ .../02-apps/01-transfer/02-state.md | 13 + .../01-transfer/03-state-transitions.md | 37 ++ .../02-apps/01-transfer/04-messages.md | 86 +++ .../02-apps/01-transfer/05-events.md | 57 ++ .../02-apps/01-transfer/06-metrics.md | 18 + .../02-apps/01-transfer/07-params.md | 94 +++ .../02-apps/01-transfer/08-authorizations.md | 66 +++ .../02-apps/01-transfer/09-client.md | 97 +++ .../01-transfer/10-ICS20-v1/01-overview.md | 142 +++++ .../01-transfer/10-ICS20-v1/02-state.md | 17 + .../10-ICS20-v1/03-state-transitions.md | 41 ++ .../01-transfer/10-ICS20-v1/04-messages.md | 65 +++ .../01-transfer/10-ICS20-v1/05-events.md | 61 ++ .../01-transfer/10-ICS20-v1/06-metrics.md | 21 + .../01-transfer/10-ICS20-v1/07-params.md | 97 +++ .../10-ICS20-v1/08-authorizations.md | 60 ++ .../01-transfer/10-ICS20-v1/09-client.md | 98 ++++ .../01-transfer/10-ICS20-v1/_category_.json | 5 + .../02-apps/01-transfer/_category_.json | 5 + .../images/forwarding-3-chains-dark.png | Bin 0 -> 65220 bytes .../images/forwarding-3-chains-light.png | Bin 0 -> 53492 bytes .../02-interchain-accounts/01-overview.md | 48 ++ .../02-interchain-accounts/02-development.md | 40 ++ .../02-interchain-accounts/03-auth-modules.md | 27 + .../02-interchain-accounts/04-integration.md | 195 +++++++ .../02-interchain-accounts/05-messages.md | 153 +++++ .../02-interchain-accounts/06-parameters.md | 65 +++ .../02-interchain-accounts/07-tx-encoding.md | 58 ++ .../02-interchain-accounts/08-client.md | 202 +++++++ .../09-active-channels.md | 45 ++ .../10-legacy/01-auth-modules.md | 268 +++++++++ .../10-legacy/02-integration.md | 196 +++++++ .../10-legacy/03-keeper-api.md | 123 ++++ .../10-legacy/_category_.json | 5 + .../10-legacy/images/ica-pre-v6.png | Bin 0 -> 34698 bytes .../02-interchain-accounts/_category_.json | 5 + .../02-interchain-accounts/images/ica-v6.png | Bin 0 -> 163580 bytes .../version-v9.0.x/02-apps/_category_.json | 5 + .../01-developer-guide/01-overview.md | 95 +++ .../02-light-client-module.md | 76 +++ .../01-developer-guide/03-client-state.md | 21 + .../01-developer-guide/04-consensus-state.md | 27 + .../05-updates-and-misbehaviour.md | 104 ++++ .../01-developer-guide/06-upgrades.md | 62 ++ .../01-developer-guide/07-proofs.md | 71 +++ .../01-developer-guide/08-proposals.md | 36 ++ .../01-developer-guide/09-setup.md | 135 +++++ .../01-developer-guide/_category_.json | 5 + .../02-localhost/01-overview.md | 56 ++ .../02-localhost/02-integration.md | 19 + .../02-localhost/03-client-state.md | 10 + .../02-localhost/04-connection.md | 29 + .../02-localhost/05-state-verification.md | 23 + .../02-localhost/_category_.json | 5 + .../03-solomachine/01-solomachine.md | 26 + .../03-solomachine/02-concepts.md | 168 ++++++ .../03-solomachine/03-state.md | 12 + .../03-solomachine/04-state_transitions.md | 43 ++ .../03-solomachine/_category_.json | 5 + .../03-light-clients/04-wasm/01-overview.md | 26 + .../03-light-clients/04-wasm/02-concepts.md | 90 +++ .../04-wasm/03-integration.md | 405 +++++++++++++ .../03-light-clients/04-wasm/04-messages.md | 75 +++ .../03-light-clients/04-wasm/05-governance.md | 126 ++++ .../03-light-clients/04-wasm/06-events.md | 26 + .../03-light-clients/04-wasm/07-contracts.md | 110 ++++ .../03-light-clients/04-wasm/08-client.md | 151 +++++ .../03-light-clients/04-wasm/09-migrations.md | 239 ++++++++ .../03-light-clients/04-wasm/_category_.json | 5 + .../05-tendermint/01-overview.md | 167 ++++++ .../05-tendermint/_category_.json | 5 + .../03-light-clients/_category_.json | 5 + .../04-middleware/01-ics29-fee/01-overview.md | 55 ++ .../01-ics29-fee/02-integration.md | 177 ++++++ .../04-middleware/01-ics29-fee/03-msgs.md | 97 +++ .../01-ics29-fee/04-fee-distribution.md | 117 ++++ .../04-middleware/01-ics29-fee/05-events.md | 43 ++ .../01-ics29-fee/06-end-users.md | 39 ++ .../01-ics29-fee/_category_.json | 5 + .../01-ics29-fee/images/feeflow.png | Bin 0 -> 394717 bytes .../01-ics29-fee/images/msgpaypacket.png | Bin 0 -> 150696 bytes .../01-ics29-fee/images/paypacketfeeasync.png | Bin 0 -> 142753 bytes .../04-middleware/02-callbacks/01-overview.md | 55 ++ .../02-callbacks/02-integration.md | 113 ++++ .../02-callbacks/03-interfaces.md | 170 ++++++ .../04-middleware/02-callbacks/04-events.md | 39 ++ .../02-callbacks/05-end-users.md | 96 +++ .../04-middleware/02-callbacks/06-gas.md | 77 +++ .../02-callbacks/_category_.json | 5 + .../02-callbacks/images/callbackflow.svg | 43 ++ .../02-callbacks/images/ics4-callbackflow.svg | 43 ++ .../04-middleware/_category_.json | 5 + .../01-support-denoms-with-slashes.md | 87 +++ .../05-migrations/02-sdk-to-v1.md | 195 +++++++ .../05-migrations/03-v1-to-v2.md | 59 ++ .../05-migrations/04-v2-to-v3.md | 186 ++++++ .../05-migrations/05-v3-to-v4.md | 159 +++++ .../05-migrations/06-v4-to-v5.md | 441 ++++++++++++++ .../05-migrations/07-v5-to-v6.md | 299 ++++++++++ .../05-migrations/08-v6-to-v7.md | 357 +++++++++++ .../05-migrations/09-v7-to-v7_1.md | 66 +++ .../05-migrations/10-v7_2-to-v7_3.md | 50 ++ .../05-migrations/11-v7-to-v8.md | 221 +++++++ .../05-migrations/12-v8-to-v8_1.md | 42 ++ .../05-migrations/13-v8-to-v9.md | 552 ++++++++++++++++++ .../05-migrations/14-v9-to-v10.md | 36 ++ .../05-migrations/_category_.json | 5 + .../images/auth-module-decision-tree.png | Bin 0 -> 80522 bytes .../05-migrations/migration.template.md | 28 + .../images/ibcoverview-dark.svg | 135 +++++ .../images/ibcoverview-light.svg | 135 +++++ .../version-v9.0.x-sidebars.json | 40 ++ docs/versions.json | 1 + 348 files changed, 13106 insertions(+), 19 deletions(-) create mode 100644 .github/compatibility-test-matrices/main/transfer-v2-1-channel-upgrade-chain-b.json create mode 100644 .github/compatibility-test-matrices/main/transfer-v2-2-channel-upgrade-chain-b.json create mode 100644 .github/compatibility-test-matrices/main/transfer-v2-forwarding-chain-b.json create mode 100644 .github/compatibility-test-matrices/main/transfer-v2-multidenom-chain-b.json rename .github/compatibility-test-matrices/release-v9.0.x/{transfer-channel-upgrade-chain-a copy.json => transfer-channel-upgrade-chain-b.json} (96%) create mode 100644 .github/compatibility-test-matrices/release-v9.0.x/transfer-v2-1-channel-upgrade-chain-b.json create mode 100644 .github/compatibility-test-matrices/release-v9.0.x/transfer-v2-2-channel-upgrade-chain-b.json create mode 100644 .github/compatibility-test-matrices/release-v9.0.x/transfer-v2-forwarding-chain-b.json create mode 100644 .github/compatibility-test-matrices/release-v9.0.x/transfer-v2-multidenom-chain-b.json create mode 100644 docs/versioned_docs/version-v9.0.x/00-intro.md create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/01-overview.md create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/02-integration.md create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/01-apps.md create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/02-ibcmodule.md create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/03-bindports.md create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/04-keeper.md create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/05-packets_acks.md create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/06-routing.md create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/_category_.json create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/images/packet_flow.png create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/04-middleware/01-overview.md create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/04-middleware/02-develop.md create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/04-middleware/03-integration.md create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/04-middleware/_category_.json create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/04-middleware/images/middleware-stack.png create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/05-upgrades/00-intro.md create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/05-upgrades/01-quick-guide.md create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/05-upgrades/02-developer-guide.md create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/05-upgrades/03-genesis-restart.md create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/05-upgrades/_category_.json create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/06-channel-upgrades.md create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/07-proposals.md create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/08-relayer.md create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/09-proto-docs.md create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/10-roadmap.md create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/11-troubleshooting.md create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/13-best-practices.md create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/14-permissioning.md create mode 100644 docs/versioned_docs/version-v9.0.x/01-ibc/_category_.json create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/01-overview.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/02-state.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/03-state-transitions.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/04-messages.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/05-events.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/06-metrics.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/07-params.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/08-authorizations.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/09-client.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/01-overview.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/02-state.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/03-state-transitions.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/04-messages.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/05-events.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/06-metrics.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/07-params.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/08-authorizations.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/09-client.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/_category_.json create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/_category_.json create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/images/forwarding-3-chains-dark.png create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/images/forwarding-3-chains-light.png create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/01-overview.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/02-development.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/03-auth-modules.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/04-integration.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/05-messages.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/06-parameters.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/07-tx-encoding.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/08-client.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/09-active-channels.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/10-legacy/01-auth-modules.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/10-legacy/02-integration.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/10-legacy/03-keeper-api.md create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/10-legacy/_category_.json create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/10-legacy/images/ica-pre-v6.png create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/_category_.json create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/images/ica-v6.png create mode 100644 docs/versioned_docs/version-v9.0.x/02-apps/_category_.json create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/01-overview.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/02-light-client-module.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/03-client-state.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/04-consensus-state.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/05-updates-and-misbehaviour.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/06-upgrades.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/07-proofs.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/08-proposals.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/09-setup.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/_category_.json create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/02-localhost/01-overview.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/02-localhost/02-integration.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/02-localhost/03-client-state.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/02-localhost/04-connection.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/02-localhost/05-state-verification.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/02-localhost/_category_.json create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/03-solomachine/01-solomachine.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/03-solomachine/02-concepts.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/03-solomachine/03-state.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/03-solomachine/04-state_transitions.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/03-solomachine/_category_.json create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/01-overview.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/02-concepts.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/03-integration.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/04-messages.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/05-governance.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/06-events.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/07-contracts.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/08-client.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/09-migrations.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/_category_.json create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/05-tendermint/01-overview.md create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/05-tendermint/_category_.json create mode 100644 docs/versioned_docs/version-v9.0.x/03-light-clients/_category_.json create mode 100644 docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/01-overview.md create mode 100644 docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/02-integration.md create mode 100644 docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/03-msgs.md create mode 100644 docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/04-fee-distribution.md create mode 100644 docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/05-events.md create mode 100644 docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/06-end-users.md create mode 100644 docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/_category_.json create mode 100644 docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/images/feeflow.png create mode 100644 docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/images/msgpaypacket.png create mode 100644 docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/images/paypacketfeeasync.png create mode 100644 docs/versioned_docs/version-v9.0.x/04-middleware/02-callbacks/01-overview.md create mode 100644 docs/versioned_docs/version-v9.0.x/04-middleware/02-callbacks/02-integration.md create mode 100644 docs/versioned_docs/version-v9.0.x/04-middleware/02-callbacks/03-interfaces.md create mode 100644 docs/versioned_docs/version-v9.0.x/04-middleware/02-callbacks/04-events.md create mode 100644 docs/versioned_docs/version-v9.0.x/04-middleware/02-callbacks/05-end-users.md create mode 100644 docs/versioned_docs/version-v9.0.x/04-middleware/02-callbacks/06-gas.md create mode 100644 docs/versioned_docs/version-v9.0.x/04-middleware/02-callbacks/_category_.json create mode 100644 docs/versioned_docs/version-v9.0.x/04-middleware/02-callbacks/images/callbackflow.svg create mode 100644 docs/versioned_docs/version-v9.0.x/04-middleware/02-callbacks/images/ics4-callbackflow.svg create mode 100644 docs/versioned_docs/version-v9.0.x/04-middleware/_category_.json create mode 100644 docs/versioned_docs/version-v9.0.x/05-migrations/01-support-denoms-with-slashes.md create mode 100644 docs/versioned_docs/version-v9.0.x/05-migrations/02-sdk-to-v1.md create mode 100644 docs/versioned_docs/version-v9.0.x/05-migrations/03-v1-to-v2.md create mode 100644 docs/versioned_docs/version-v9.0.x/05-migrations/04-v2-to-v3.md create mode 100644 docs/versioned_docs/version-v9.0.x/05-migrations/05-v3-to-v4.md create mode 100644 docs/versioned_docs/version-v9.0.x/05-migrations/06-v4-to-v5.md create mode 100644 docs/versioned_docs/version-v9.0.x/05-migrations/07-v5-to-v6.md create mode 100644 docs/versioned_docs/version-v9.0.x/05-migrations/08-v6-to-v7.md create mode 100644 docs/versioned_docs/version-v9.0.x/05-migrations/09-v7-to-v7_1.md create mode 100644 docs/versioned_docs/version-v9.0.x/05-migrations/10-v7_2-to-v7_3.md create mode 100644 docs/versioned_docs/version-v9.0.x/05-migrations/11-v7-to-v8.md create mode 100644 docs/versioned_docs/version-v9.0.x/05-migrations/12-v8-to-v8_1.md create mode 100644 docs/versioned_docs/version-v9.0.x/05-migrations/13-v8-to-v9.md create mode 100644 docs/versioned_docs/version-v9.0.x/05-migrations/14-v9-to-v10.md create mode 100644 docs/versioned_docs/version-v9.0.x/05-migrations/_category_.json create mode 100644 docs/versioned_docs/version-v9.0.x/05-migrations/images/auth-module-decision-tree.png create mode 100644 docs/versioned_docs/version-v9.0.x/05-migrations/migration.template.md create mode 100644 docs/versioned_docs/version-v9.0.x/images/ibcoverview-dark.svg create mode 100644 docs/versioned_docs/version-v9.0.x/images/ibcoverview-light.svg create mode 100644 docs/versioned_sidebars/version-v9.0.x-sidebars.json diff --git a/.github/compatibility-test-matrices/main/ica-chain-a.json b/.github/compatibility-test-matrices/main/ica-chain-a.json index eb14648ed4d..5fb45c4db19 100644 --- a/.github/compatibility-test-matrices/main/ica-chain-a.json +++ b/.github/compatibility-test-matrices/main/ica-chain-a.json @@ -4,6 +4,7 @@ ], "chain-b": [ "main", + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/main/ica-chain-b.json b/.github/compatibility-test-matrices/main/ica-chain-b.json index 9bb0c092bff..65f22af1dbb 100644 --- a/.github/compatibility-test-matrices/main/ica-chain-b.json +++ b/.github/compatibility-test-matrices/main/ica-chain-b.json @@ -1,6 +1,7 @@ { "chain-a": [ "main", + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/main/ica-channel-upgrade-chain-a.json b/.github/compatibility-test-matrices/main/ica-channel-upgrade-chain-a.json index ba6ec1d32ef..a10d27316eb 100644 --- a/.github/compatibility-test-matrices/main/ica-channel-upgrade-chain-a.json +++ b/.github/compatibility-test-matrices/main/ica-channel-upgrade-chain-a.json @@ -4,6 +4,7 @@ ], "chain-b": [ "main", + "v9.0.0", "v8.5.0", "v8.4.0" ], diff --git a/.github/compatibility-test-matrices/main/ica-channel-upgrade-chain-b.json b/.github/compatibility-test-matrices/main/ica-channel-upgrade-chain-b.json index e10ff5fcf63..4f76422e93d 100644 --- a/.github/compatibility-test-matrices/main/ica-channel-upgrade-chain-b.json +++ b/.github/compatibility-test-matrices/main/ica-channel-upgrade-chain-b.json @@ -1,6 +1,7 @@ { "chain-a": [ "main", + "v9.0.0", "v8.5.0", "v8.4.0" ], diff --git a/.github/compatibility-test-matrices/main/ica-gov-chain-a.json b/.github/compatibility-test-matrices/main/ica-gov-chain-a.json index a82db346b9d..cc8e0e0029c 100644 --- a/.github/compatibility-test-matrices/main/ica-gov-chain-a.json +++ b/.github/compatibility-test-matrices/main/ica-gov-chain-a.json @@ -4,6 +4,7 @@ ], "chain-b": [ "main", + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/main/ica-gov-chain-b.json b/.github/compatibility-test-matrices/main/ica-gov-chain-b.json index dbbca6d0a15..a4ee95e8bae 100644 --- a/.github/compatibility-test-matrices/main/ica-gov-chain-b.json +++ b/.github/compatibility-test-matrices/main/ica-gov-chain-b.json @@ -1,6 +1,7 @@ { "chain-a": [ "main", + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/main/ica-groups-chain-a.json b/.github/compatibility-test-matrices/main/ica-groups-chain-a.json index b0e6edc047c..491b873b5f0 100644 --- a/.github/compatibility-test-matrices/main/ica-groups-chain-a.json +++ b/.github/compatibility-test-matrices/main/ica-groups-chain-a.json @@ -4,6 +4,7 @@ ], "chain-b": [ "main", + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/main/ica-groups-chain-b.json b/.github/compatibility-test-matrices/main/ica-groups-chain-b.json index 72496c89730..221e32a49fb 100644 --- a/.github/compatibility-test-matrices/main/ica-groups-chain-b.json +++ b/.github/compatibility-test-matrices/main/ica-groups-chain-b.json @@ -1,6 +1,7 @@ { "chain-a": [ "main", + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/main/ica-unordered-channel-chain-a.json b/.github/compatibility-test-matrices/main/ica-unordered-channel-chain-a.json index fec7bc211d0..c332bea90e0 100644 --- a/.github/compatibility-test-matrices/main/ica-unordered-channel-chain-a.json +++ b/.github/compatibility-test-matrices/main/ica-unordered-channel-chain-a.json @@ -4,6 +4,7 @@ ], "chain-b": [ "main", + "v9.0.0", "v8.5.0", "v8.4.0" ], diff --git a/.github/compatibility-test-matrices/main/ica-unordered-channel-chain-b.json b/.github/compatibility-test-matrices/main/ica-unordered-channel-chain-b.json index 0ecac73aef8..8a6c009f6fa 100644 --- a/.github/compatibility-test-matrices/main/ica-unordered-channel-chain-b.json +++ b/.github/compatibility-test-matrices/main/ica-unordered-channel-chain-b.json @@ -1,6 +1,7 @@ { "chain-a": [ "main", + "v9.0.0", "v8.5.0", "v8.4.0" ], diff --git a/.github/compatibility-test-matrices/main/incentivized-ica-chain-a.json b/.github/compatibility-test-matrices/main/incentivized-ica-chain-a.json index 7b1d250e4d1..0b0eab21faf 100644 --- a/.github/compatibility-test-matrices/main/incentivized-ica-chain-a.json +++ b/.github/compatibility-test-matrices/main/incentivized-ica-chain-a.json @@ -4,6 +4,7 @@ ], "chain-b": [ "main", + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/main/incentivized-ica-chain-b.json b/.github/compatibility-test-matrices/main/incentivized-ica-chain-b.json index f964fdc44a3..6d1892f1842 100644 --- a/.github/compatibility-test-matrices/main/incentivized-ica-chain-b.json +++ b/.github/compatibility-test-matrices/main/incentivized-ica-chain-b.json @@ -1,6 +1,7 @@ { "chain-a": [ "main", + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/main/incentivized-transfer-chain-a.json b/.github/compatibility-test-matrices/main/incentivized-transfer-chain-a.json index ea9c944d149..32fc4d895a1 100644 --- a/.github/compatibility-test-matrices/main/incentivized-transfer-chain-a.json +++ b/.github/compatibility-test-matrices/main/incentivized-transfer-chain-a.json @@ -4,6 +4,7 @@ ], "chain-b": [ "main", + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/main/incentivized-transfer-chain-b.json b/.github/compatibility-test-matrices/main/incentivized-transfer-chain-b.json index c65742cf2ff..f7bfe912e1e 100644 --- a/.github/compatibility-test-matrices/main/incentivized-transfer-chain-b.json +++ b/.github/compatibility-test-matrices/main/incentivized-transfer-chain-b.json @@ -1,6 +1,7 @@ { "chain-a": [ "main", + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/main/localhost-ica-chain-a.json b/.github/compatibility-test-matrices/main/localhost-ica-chain-a.json index 22eaffb3fa3..aded3ddc4d0 100644 --- a/.github/compatibility-test-matrices/main/localhost-ica-chain-a.json +++ b/.github/compatibility-test-matrices/main/localhost-ica-chain-a.json @@ -1,6 +1,7 @@ { "chain-a": [ "main", + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/main/localhost-ica-chain-b.json b/.github/compatibility-test-matrices/main/localhost-ica-chain-b.json index 31de5da8b65..9640bd1df33 100644 --- a/.github/compatibility-test-matrices/main/localhost-ica-chain-b.json +++ b/.github/compatibility-test-matrices/main/localhost-ica-chain-b.json @@ -4,6 +4,7 @@ ], "chain-b": [ "main", + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/main/localhost-transfer-chain-a.json b/.github/compatibility-test-matrices/main/localhost-transfer-chain-a.json index 2934f7bbdf2..cb2b7cf8f42 100644 --- a/.github/compatibility-test-matrices/main/localhost-transfer-chain-a.json +++ b/.github/compatibility-test-matrices/main/localhost-transfer-chain-a.json @@ -1,6 +1,7 @@ { "chain-a": [ "main", + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/main/localhost-transfer-chain-b.json b/.github/compatibility-test-matrices/main/localhost-transfer-chain-b.json index c6cbecb9739..eb8263603ad 100644 --- a/.github/compatibility-test-matrices/main/localhost-transfer-chain-b.json +++ b/.github/compatibility-test-matrices/main/localhost-transfer-chain-b.json @@ -4,6 +4,7 @@ ], "chain-b": [ "main", + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/main/transfer-authz-chain-a.json b/.github/compatibility-test-matrices/main/transfer-authz-chain-a.json index 1356e01328c..1b4a8930d29 100644 --- a/.github/compatibility-test-matrices/main/transfer-authz-chain-a.json +++ b/.github/compatibility-test-matrices/main/transfer-authz-chain-a.json @@ -4,6 +4,7 @@ ], "chain-b": [ "main", + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/main/transfer-authz-chain-b.json b/.github/compatibility-test-matrices/main/transfer-authz-chain-b.json index c20b93d31c2..867cac33b69 100644 --- a/.github/compatibility-test-matrices/main/transfer-authz-chain-b.json +++ b/.github/compatibility-test-matrices/main/transfer-authz-chain-b.json @@ -1,6 +1,7 @@ { "chain-a": [ "main", + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/main/transfer-chain-a.json b/.github/compatibility-test-matrices/main/transfer-chain-a.json index d67ed6f3679..b2a7ba96fd9 100644 --- a/.github/compatibility-test-matrices/main/transfer-chain-a.json +++ b/.github/compatibility-test-matrices/main/transfer-chain-a.json @@ -4,6 +4,7 @@ ], "chain-b": [ "main", + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/main/transfer-chain-b.json b/.github/compatibility-test-matrices/main/transfer-chain-b.json index a1020f0f809..528a0bd9dce 100644 --- a/.github/compatibility-test-matrices/main/transfer-chain-b.json +++ b/.github/compatibility-test-matrices/main/transfer-chain-b.json @@ -1,6 +1,7 @@ { "chain-a": [ "main", + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/main/transfer-channel-upgrade-chain-a.json b/.github/compatibility-test-matrices/main/transfer-channel-upgrade-chain-a.json index 7fb9a65276d..a5b972f8f69 100644 --- a/.github/compatibility-test-matrices/main/transfer-channel-upgrade-chain-a.json +++ b/.github/compatibility-test-matrices/main/transfer-channel-upgrade-chain-a.json @@ -4,6 +4,7 @@ ], "chain-b": [ "main", + "v9.0.0", "v8.5.0", "v8.4.0" ], diff --git a/.github/compatibility-test-matrices/main/transfer-channel-upgrade-chain-b.json b/.github/compatibility-test-matrices/main/transfer-channel-upgrade-chain-b.json index f0331a1dcea..7bf6f95825d 100644 --- a/.github/compatibility-test-matrices/main/transfer-channel-upgrade-chain-b.json +++ b/.github/compatibility-test-matrices/main/transfer-channel-upgrade-chain-b.json @@ -1,6 +1,7 @@ { "chain-a": [ "main", + "v9.0.0", "v8.5.0", "v8.4.0" ], diff --git a/.github/compatibility-test-matrices/main/transfer-v2-1-channel-upgrade-chain-a.json b/.github/compatibility-test-matrices/main/transfer-v2-1-channel-upgrade-chain-a.json index 487d66ed0fc..c436d416799 100644 --- a/.github/compatibility-test-matrices/main/transfer-v2-1-channel-upgrade-chain-a.json +++ b/.github/compatibility-test-matrices/main/transfer-v2-1-channel-upgrade-chain-a.json @@ -3,7 +3,8 @@ "main" ], "chain-b": [ - "main" + "main", + "v9.0.0" ], "entrypoint": [ "TransferChannelUpgradesV1TestSuite" diff --git a/.github/compatibility-test-matrices/main/transfer-v2-1-channel-upgrade-chain-b.json b/.github/compatibility-test-matrices/main/transfer-v2-1-channel-upgrade-chain-b.json new file mode 100644 index 00000000000..f64538e8265 --- /dev/null +++ b/.github/compatibility-test-matrices/main/transfer-v2-1-channel-upgrade-chain-b.json @@ -0,0 +1,19 @@ +{ + "chain-a": [ + "main", + "v9.0.0" + ], + "chain-b": [ + "main" + ], + "entrypoint": [ + "TransferChannelUpgradesV1TestSuite" + ], + "test": [ + "TestChannelUpgrade_WithICS20v2_Succeeds", + "TestChannelUpgrade_WithFeeMiddlewareAndICS20v2_Succeeds" + ], + "relayer-type": [ + "hermes" + ] +} \ No newline at end of file diff --git a/.github/compatibility-test-matrices/main/transfer-v2-2-channel-upgrade-chain-a.json b/.github/compatibility-test-matrices/main/transfer-v2-2-channel-upgrade-chain-a.json index d1558f9c12e..7af82416a54 100644 --- a/.github/compatibility-test-matrices/main/transfer-v2-2-channel-upgrade-chain-a.json +++ b/.github/compatibility-test-matrices/main/transfer-v2-2-channel-upgrade-chain-a.json @@ -3,7 +3,8 @@ "main" ], "chain-b": [ - "main" + "main", + "v9.0.0" ], "entrypoint": [ "TestTransferChannelUpgradesTestSuite" diff --git a/.github/compatibility-test-matrices/main/transfer-v2-2-channel-upgrade-chain-b.json b/.github/compatibility-test-matrices/main/transfer-v2-2-channel-upgrade-chain-b.json new file mode 100644 index 00000000000..8922bb14e50 --- /dev/null +++ b/.github/compatibility-test-matrices/main/transfer-v2-2-channel-upgrade-chain-b.json @@ -0,0 +1,18 @@ +{ + "chain-a": [ + "main", + "v9.0.0" + ], + "chain-b": [ + "main" + ], + "entrypoint": [ + "TestTransferChannelUpgradesTestSuite" + ], + "test": [ + "TestChannelDowngrade_WithICS20v1_Succeeds" + ], + "relayer-type": [ + "hermes" + ] +} \ No newline at end of file diff --git a/.github/compatibility-test-matrices/main/transfer-v2-forwarding-chain-a.json b/.github/compatibility-test-matrices/main/transfer-v2-forwarding-chain-a.json index 7fc9ecbaae4..81c32f47557 100644 --- a/.github/compatibility-test-matrices/main/transfer-v2-forwarding-chain-a.json +++ b/.github/compatibility-test-matrices/main/transfer-v2-forwarding-chain-a.json @@ -3,7 +3,8 @@ "main" ], "chain-b": [ - "main" + "main", + "v9.0.0" ], "entrypoint": [ "TransferForwardingTestSuite" diff --git a/.github/compatibility-test-matrices/main/transfer-v2-forwarding-chain-b.json b/.github/compatibility-test-matrices/main/transfer-v2-forwarding-chain-b.json new file mode 100644 index 00000000000..4d356778b42 --- /dev/null +++ b/.github/compatibility-test-matrices/main/transfer-v2-forwarding-chain-b.json @@ -0,0 +1,22 @@ +{ + "chain-a": [ + "main", + "v9.0.0" + ], + "chain-b": [ + "main" + ], + "entrypoint": [ + "TransferForwardingTestSuite" + ], + "test": [ + "TestForwarding_Succeeds", + "TestForwarding_WithLastChainBeingICS20v1_Succeeds", + "TestForwardingWithUnwindSucceeds", + "TestFailedForwarding", + "TestChannelUpgradeForwarding_Succeeds" + ], + "relayer-type": [ + "hermes" + ] +} \ No newline at end of file diff --git a/.github/compatibility-test-matrices/main/transfer-v2-multidenom-chain-a.json b/.github/compatibility-test-matrices/main/transfer-v2-multidenom-chain-a.json index fb04ec8ba4d..49b973c658c 100644 --- a/.github/compatibility-test-matrices/main/transfer-v2-multidenom-chain-a.json +++ b/.github/compatibility-test-matrices/main/transfer-v2-multidenom-chain-a.json @@ -3,7 +3,8 @@ "main" ], "chain-b": [ - "main" + "main", + "v9.0.0" ], "entrypoint": [ "TestTransferTestSuite" diff --git a/.github/compatibility-test-matrices/main/transfer-v2-multidenom-chain-b.json b/.github/compatibility-test-matrices/main/transfer-v2-multidenom-chain-b.json new file mode 100644 index 00000000000..b1201ce1438 --- /dev/null +++ b/.github/compatibility-test-matrices/main/transfer-v2-multidenom-chain-b.json @@ -0,0 +1,20 @@ +{ + "chain-a": [ + "main", + "v9.0.0" + ], + "chain-b": [ + "main" + ], + "entrypoint": [ + "TestTransferTestSuite" + ], + "test": [ + "TestMsgTransfer_Succeeds_Nonincentivized_MultiDenom", + "TestMsgTransfer_EntireBalance", + "TestMsgTransfer_Fails_InvalidAddress_MultiDenom" + ], + "relayer-type": [ + "hermes" + ] +} \ No newline at end of file diff --git a/.github/compatibility-test-matrices/release-v7.4.x/ica-chain-a.json b/.github/compatibility-test-matrices/release-v7.4.x/ica-chain-a.json index 2f1b3aaddfd..b4c5d650991 100644 --- a/.github/compatibility-test-matrices/release-v7.4.x/ica-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.4.x/ica-chain-a.json @@ -3,6 +3,7 @@ "release-v7.4.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.4.x/ica-chain-b.json b/.github/compatibility-test-matrices/release-v7.4.x/ica-chain-b.json index 5ae111969a2..e49746163d1 100644 --- a/.github/compatibility-test-matrices/release-v7.4.x/ica-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.4.x/ica-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.4.x/ica-gov-chain-a.json b/.github/compatibility-test-matrices/release-v7.4.x/ica-gov-chain-a.json index b12e4355c5c..4b436a6e01e 100644 --- a/.github/compatibility-test-matrices/release-v7.4.x/ica-gov-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.4.x/ica-gov-chain-a.json @@ -3,6 +3,7 @@ "release-v7.4.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.4.x/ica-gov-chain-b.json b/.github/compatibility-test-matrices/release-v7.4.x/ica-gov-chain-b.json index 28b3716ab70..04bde55f367 100644 --- a/.github/compatibility-test-matrices/release-v7.4.x/ica-gov-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.4.x/ica-gov-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.4.x/ica-groups-chain-a.json b/.github/compatibility-test-matrices/release-v7.4.x/ica-groups-chain-a.json index e41b09dab64..c2393aded81 100644 --- a/.github/compatibility-test-matrices/release-v7.4.x/ica-groups-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.4.x/ica-groups-chain-a.json @@ -3,6 +3,7 @@ "release-v7.4.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.4.x/ica-groups-chain-b.json b/.github/compatibility-test-matrices/release-v7.4.x/ica-groups-chain-b.json index 8600a307e10..320e50abed8 100644 --- a/.github/compatibility-test-matrices/release-v7.4.x/ica-groups-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.4.x/ica-groups-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.4.x/incentivized-ica-chain-a.json b/.github/compatibility-test-matrices/release-v7.4.x/incentivized-ica-chain-a.json index 261d850ea14..d4540e54796 100644 --- a/.github/compatibility-test-matrices/release-v7.4.x/incentivized-ica-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.4.x/incentivized-ica-chain-a.json @@ -3,6 +3,7 @@ "release-v7.4.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.4.x/incentivized-ica-chain-b.json b/.github/compatibility-test-matrices/release-v7.4.x/incentivized-ica-chain-b.json index d9d794a1037..c595f13002d 100644 --- a/.github/compatibility-test-matrices/release-v7.4.x/incentivized-ica-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.4.x/incentivized-ica-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.4.x/incentivized-transfer-chain-a.json b/.github/compatibility-test-matrices/release-v7.4.x/incentivized-transfer-chain-a.json index 995efcd8904..e9b7608fefd 100644 --- a/.github/compatibility-test-matrices/release-v7.4.x/incentivized-transfer-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.4.x/incentivized-transfer-chain-a.json @@ -3,6 +3,7 @@ "release-v7.4.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.4.x/incentivized-transfer-chain-b.json b/.github/compatibility-test-matrices/release-v7.4.x/incentivized-transfer-chain-b.json index 6bc89899008..6d0f5dd6e8d 100644 --- a/.github/compatibility-test-matrices/release-v7.4.x/incentivized-transfer-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.4.x/incentivized-transfer-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.4.x/localhost-ica-chain-a.json b/.github/compatibility-test-matrices/release-v7.4.x/localhost-ica-chain-a.json index c9883d2efaa..6cf2cb80b5d 100644 --- a/.github/compatibility-test-matrices/release-v7.4.x/localhost-ica-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.4.x/localhost-ica-chain-a.json @@ -3,6 +3,7 @@ "release-v7.4.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.4.x/localhost-transfer-chain-a.json b/.github/compatibility-test-matrices/release-v7.4.x/localhost-transfer-chain-a.json index 70aa2a8f0b9..c88a421c514 100644 --- a/.github/compatibility-test-matrices/release-v7.4.x/localhost-transfer-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.4.x/localhost-transfer-chain-a.json @@ -3,6 +3,7 @@ "release-v7.4.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.4.x/transfer-authz-chain-a.json b/.github/compatibility-test-matrices/release-v7.4.x/transfer-authz-chain-a.json index 5f3764ef5df..3a0c29c2438 100644 --- a/.github/compatibility-test-matrices/release-v7.4.x/transfer-authz-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.4.x/transfer-authz-chain-a.json @@ -3,6 +3,7 @@ "release-v7.4.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.4.x/transfer-authz-chain-b.json b/.github/compatibility-test-matrices/release-v7.4.x/transfer-authz-chain-b.json index a634081fe1e..c6f321250dc 100644 --- a/.github/compatibility-test-matrices/release-v7.4.x/transfer-authz-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.4.x/transfer-authz-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.4.x/transfer-chain-a.json b/.github/compatibility-test-matrices/release-v7.4.x/transfer-chain-a.json index a7f092a8bb8..4d291f2f8f9 100644 --- a/.github/compatibility-test-matrices/release-v7.4.x/transfer-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.4.x/transfer-chain-a.json @@ -3,6 +3,7 @@ "release-v7.4.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.4.x/transfer-chain-b.json b/.github/compatibility-test-matrices/release-v7.4.x/transfer-chain-b.json index 62a2b7bb8ae..6f641f52bc5 100644 --- a/.github/compatibility-test-matrices/release-v7.4.x/transfer-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.4.x/transfer-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.5.x/ica-chain-a.json b/.github/compatibility-test-matrices/release-v7.5.x/ica-chain-a.json index df85b58ea20..a06940ca669 100644 --- a/.github/compatibility-test-matrices/release-v7.5.x/ica-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.5.x/ica-chain-a.json @@ -3,6 +3,7 @@ "release-v7.5.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.5.x/ica-chain-b.json b/.github/compatibility-test-matrices/release-v7.5.x/ica-chain-b.json index 43de7428554..befc551bb2b 100644 --- a/.github/compatibility-test-matrices/release-v7.5.x/ica-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.5.x/ica-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.5.x/ica-gov-chain-a.json b/.github/compatibility-test-matrices/release-v7.5.x/ica-gov-chain-a.json index eb031b169ba..4b7adee4e50 100644 --- a/.github/compatibility-test-matrices/release-v7.5.x/ica-gov-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.5.x/ica-gov-chain-a.json @@ -3,6 +3,7 @@ "release-v7.5.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.5.x/ica-gov-chain-b.json b/.github/compatibility-test-matrices/release-v7.5.x/ica-gov-chain-b.json index 4715e7d3f46..e4227e35e1a 100644 --- a/.github/compatibility-test-matrices/release-v7.5.x/ica-gov-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.5.x/ica-gov-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.5.x/ica-groups-chain-a.json b/.github/compatibility-test-matrices/release-v7.5.x/ica-groups-chain-a.json index d3552b6c85a..e7085f95879 100644 --- a/.github/compatibility-test-matrices/release-v7.5.x/ica-groups-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.5.x/ica-groups-chain-a.json @@ -3,6 +3,7 @@ "release-v7.5.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.5.x/ica-groups-chain-b.json b/.github/compatibility-test-matrices/release-v7.5.x/ica-groups-chain-b.json index 91469f4bc74..aa740c41bf4 100644 --- a/.github/compatibility-test-matrices/release-v7.5.x/ica-groups-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.5.x/ica-groups-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.5.x/ica-unordered-channel-chain-a.json b/.github/compatibility-test-matrices/release-v7.5.x/ica-unordered-channel-chain-a.json index 7744f41ff75..3ed146622bf 100644 --- a/.github/compatibility-test-matrices/release-v7.5.x/ica-unordered-channel-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.5.x/ica-unordered-channel-chain-a.json @@ -3,6 +3,7 @@ "release-v7.5.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "release-v7.5.x" diff --git a/.github/compatibility-test-matrices/release-v7.5.x/ica-unordered-channel-chain-b.json b/.github/compatibility-test-matrices/release-v7.5.x/ica-unordered-channel-chain-b.json index e2ee04f9739..5cf6e525aae 100644 --- a/.github/compatibility-test-matrices/release-v7.5.x/ica-unordered-channel-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.5.x/ica-unordered-channel-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "release-v7.5.x" diff --git a/.github/compatibility-test-matrices/release-v7.5.x/incentivized-ica-chain-a.json b/.github/compatibility-test-matrices/release-v7.5.x/incentivized-ica-chain-a.json index e8e0a4dc71d..156e44e5eae 100644 --- a/.github/compatibility-test-matrices/release-v7.5.x/incentivized-ica-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.5.x/incentivized-ica-chain-a.json @@ -3,6 +3,7 @@ "release-v7.5.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.5.x/incentivized-ica-chain-b.json b/.github/compatibility-test-matrices/release-v7.5.x/incentivized-ica-chain-b.json index 6cb957c3445..7ecb5e19d79 100644 --- a/.github/compatibility-test-matrices/release-v7.5.x/incentivized-ica-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.5.x/incentivized-ica-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.5.x/incentivized-transfer-chain-a.json b/.github/compatibility-test-matrices/release-v7.5.x/incentivized-transfer-chain-a.json index 119150bf216..86b6e58d2b9 100644 --- a/.github/compatibility-test-matrices/release-v7.5.x/incentivized-transfer-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.5.x/incentivized-transfer-chain-a.json @@ -3,6 +3,7 @@ "release-v7.5.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.5.x/incentivized-transfer-chain-b.json b/.github/compatibility-test-matrices/release-v7.5.x/incentivized-transfer-chain-b.json index 043fac58525..acd0f5fe811 100644 --- a/.github/compatibility-test-matrices/release-v7.5.x/incentivized-transfer-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.5.x/incentivized-transfer-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.5.x/localhost-ica-chain-a.json b/.github/compatibility-test-matrices/release-v7.5.x/localhost-ica-chain-a.json index 3b8625c9a4e..084352af361 100644 --- a/.github/compatibility-test-matrices/release-v7.5.x/localhost-ica-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.5.x/localhost-ica-chain-a.json @@ -3,6 +3,7 @@ "release-v7.5.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.5.x/localhost-transfer-chain-a.json b/.github/compatibility-test-matrices/release-v7.5.x/localhost-transfer-chain-a.json index 2e04effa1d1..975d7a5d572 100644 --- a/.github/compatibility-test-matrices/release-v7.5.x/localhost-transfer-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.5.x/localhost-transfer-chain-a.json @@ -3,6 +3,7 @@ "release-v7.5.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.5.x/transfer-authz-chain-a.json b/.github/compatibility-test-matrices/release-v7.5.x/transfer-authz-chain-a.json index 7250610a60d..c53e07bc5b8 100644 --- a/.github/compatibility-test-matrices/release-v7.5.x/transfer-authz-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.5.x/transfer-authz-chain-a.json @@ -3,6 +3,7 @@ "release-v7.5.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.5.x/transfer-authz-chain-b.json b/.github/compatibility-test-matrices/release-v7.5.x/transfer-authz-chain-b.json index d153dd4d30d..3782db96aa0 100644 --- a/.github/compatibility-test-matrices/release-v7.5.x/transfer-authz-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.5.x/transfer-authz-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.5.x/transfer-chain-a.json b/.github/compatibility-test-matrices/release-v7.5.x/transfer-chain-a.json index 2b0e065c972..98d2ee7c518 100644 --- a/.github/compatibility-test-matrices/release-v7.5.x/transfer-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.5.x/transfer-chain-a.json @@ -3,6 +3,7 @@ "release-v7.5.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.5.x/transfer-chain-b.json b/.github/compatibility-test-matrices/release-v7.5.x/transfer-chain-b.json index e8c68b9342e..7fa72895936 100644 --- a/.github/compatibility-test-matrices/release-v7.5.x/transfer-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.5.x/transfer-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.6.x/ica-chain-a.json b/.github/compatibility-test-matrices/release-v7.6.x/ica-chain-a.json index edf38f3cded..ee3668d4deb 100644 --- a/.github/compatibility-test-matrices/release-v7.6.x/ica-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.6.x/ica-chain-a.json @@ -3,6 +3,7 @@ "release-v7.6.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.6.x/ica-chain-b.json b/.github/compatibility-test-matrices/release-v7.6.x/ica-chain-b.json index d5c94282d8d..1e654dd5637 100644 --- a/.github/compatibility-test-matrices/release-v7.6.x/ica-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.6.x/ica-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.6.x/ica-gov-chain-a.json b/.github/compatibility-test-matrices/release-v7.6.x/ica-gov-chain-a.json index cd55da60534..1ac4ef3e611 100644 --- a/.github/compatibility-test-matrices/release-v7.6.x/ica-gov-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.6.x/ica-gov-chain-a.json @@ -3,6 +3,7 @@ "release-v7.6.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.6.x/ica-gov-chain-b.json b/.github/compatibility-test-matrices/release-v7.6.x/ica-gov-chain-b.json index cb22e2f185e..b2d8e894c24 100644 --- a/.github/compatibility-test-matrices/release-v7.6.x/ica-gov-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.6.x/ica-gov-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.6.x/ica-groups-chain-a.json b/.github/compatibility-test-matrices/release-v7.6.x/ica-groups-chain-a.json index 763c5ee9b45..cd5cf97d58e 100644 --- a/.github/compatibility-test-matrices/release-v7.6.x/ica-groups-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.6.x/ica-groups-chain-a.json @@ -3,6 +3,7 @@ "release-v7.6.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.6.x/ica-groups-chain-b.json b/.github/compatibility-test-matrices/release-v7.6.x/ica-groups-chain-b.json index 9bb44d4ea9b..afb8059c717 100644 --- a/.github/compatibility-test-matrices/release-v7.6.x/ica-groups-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.6.x/ica-groups-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.6.x/ica-unordered-channel-chain-a.json b/.github/compatibility-test-matrices/release-v7.6.x/ica-unordered-channel-chain-a.json index cf6e450466e..7fb313f57b9 100644 --- a/.github/compatibility-test-matrices/release-v7.6.x/ica-unordered-channel-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.6.x/ica-unordered-channel-chain-a.json @@ -3,6 +3,7 @@ "release-v7.6.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "release-v7.6.x" diff --git a/.github/compatibility-test-matrices/release-v7.6.x/ica-unordered-channel-chain-b.json b/.github/compatibility-test-matrices/release-v7.6.x/ica-unordered-channel-chain-b.json index 5d1506c255f..5c33433988a 100644 --- a/.github/compatibility-test-matrices/release-v7.6.x/ica-unordered-channel-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.6.x/ica-unordered-channel-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "release-v7.6.x" diff --git a/.github/compatibility-test-matrices/release-v7.6.x/incentivized-ica-chain-a.json b/.github/compatibility-test-matrices/release-v7.6.x/incentivized-ica-chain-a.json index 0e321531563..1ef2145b837 100644 --- a/.github/compatibility-test-matrices/release-v7.6.x/incentivized-ica-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.6.x/incentivized-ica-chain-a.json @@ -3,6 +3,7 @@ "release-v7.6.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.6.x/incentivized-ica-chain-b.json b/.github/compatibility-test-matrices/release-v7.6.x/incentivized-ica-chain-b.json index e39e71cef1b..5c5280b8488 100644 --- a/.github/compatibility-test-matrices/release-v7.6.x/incentivized-ica-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.6.x/incentivized-ica-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.6.x/incentivized-transfer-chain-a.json b/.github/compatibility-test-matrices/release-v7.6.x/incentivized-transfer-chain-a.json index 0d8032381a5..044db930ca8 100644 --- a/.github/compatibility-test-matrices/release-v7.6.x/incentivized-transfer-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.6.x/incentivized-transfer-chain-a.json @@ -3,6 +3,7 @@ "release-v7.6.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.6.x/incentivized-transfer-chain-b.json b/.github/compatibility-test-matrices/release-v7.6.x/incentivized-transfer-chain-b.json index 19a46ce636c..db41909a39e 100644 --- a/.github/compatibility-test-matrices/release-v7.6.x/incentivized-transfer-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.6.x/incentivized-transfer-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.6.x/localhost-ica-chain-a.json b/.github/compatibility-test-matrices/release-v7.6.x/localhost-ica-chain-a.json index 9ec9880bc87..5388cf1ac69 100644 --- a/.github/compatibility-test-matrices/release-v7.6.x/localhost-ica-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.6.x/localhost-ica-chain-a.json @@ -3,6 +3,7 @@ "release-v7.6.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.6.x/localhost-transfer-chain-a.json b/.github/compatibility-test-matrices/release-v7.6.x/localhost-transfer-chain-a.json index c50336a27e5..9d28c736b38 100644 --- a/.github/compatibility-test-matrices/release-v7.6.x/localhost-transfer-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.6.x/localhost-transfer-chain-a.json @@ -3,6 +3,7 @@ "release-v7.6.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.6.x/transfer-authz-chain-a.json b/.github/compatibility-test-matrices/release-v7.6.x/transfer-authz-chain-a.json index 8dddec5339b..e42906a200d 100644 --- a/.github/compatibility-test-matrices/release-v7.6.x/transfer-authz-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.6.x/transfer-authz-chain-a.json @@ -3,6 +3,7 @@ "release-v7.6.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.6.x/transfer-authz-chain-b.json b/.github/compatibility-test-matrices/release-v7.6.x/transfer-authz-chain-b.json index 95f4adc423c..fc8956a5879 100644 --- a/.github/compatibility-test-matrices/release-v7.6.x/transfer-authz-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.6.x/transfer-authz-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.6.x/transfer-chain-a.json b/.github/compatibility-test-matrices/release-v7.6.x/transfer-chain-a.json index eea91a7afec..3cbbd928cf7 100644 --- a/.github/compatibility-test-matrices/release-v7.6.x/transfer-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.6.x/transfer-chain-a.json @@ -3,6 +3,7 @@ "release-v7.6.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.6.x/transfer-chain-b.json b/.github/compatibility-test-matrices/release-v7.6.x/transfer-chain-b.json index 53d146f37cf..755ab6ef82a 100644 --- a/.github/compatibility-test-matrices/release-v7.6.x/transfer-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.6.x/transfer-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.7.x/ica-chain-a.json b/.github/compatibility-test-matrices/release-v7.7.x/ica-chain-a.json index 7c2c9f448c0..fc06ae844f0 100644 --- a/.github/compatibility-test-matrices/release-v7.7.x/ica-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.7.x/ica-chain-a.json @@ -3,6 +3,7 @@ "release-v7.7.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.7.x/ica-chain-b.json b/.github/compatibility-test-matrices/release-v7.7.x/ica-chain-b.json index 47d82f0b0b8..03a8dfdfcdb 100644 --- a/.github/compatibility-test-matrices/release-v7.7.x/ica-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.7.x/ica-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.7.x/ica-gov-chain-a.json b/.github/compatibility-test-matrices/release-v7.7.x/ica-gov-chain-a.json index 3020ce3ebc2..21ddba9ce27 100644 --- a/.github/compatibility-test-matrices/release-v7.7.x/ica-gov-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.7.x/ica-gov-chain-a.json @@ -3,6 +3,7 @@ "release-v7.7.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.7.x/ica-gov-chain-b.json b/.github/compatibility-test-matrices/release-v7.7.x/ica-gov-chain-b.json index a1e585285c4..ee7e13ceb33 100644 --- a/.github/compatibility-test-matrices/release-v7.7.x/ica-gov-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.7.x/ica-gov-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.7.x/ica-groups-chain-a.json b/.github/compatibility-test-matrices/release-v7.7.x/ica-groups-chain-a.json index 6cf1e0c5913..b701b6ed836 100644 --- a/.github/compatibility-test-matrices/release-v7.7.x/ica-groups-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.7.x/ica-groups-chain-a.json @@ -3,6 +3,7 @@ "release-v7.7.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.7.x/ica-groups-chain-b.json b/.github/compatibility-test-matrices/release-v7.7.x/ica-groups-chain-b.json index a2d262c0076..bea4c54c778 100644 --- a/.github/compatibility-test-matrices/release-v7.7.x/ica-groups-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.7.x/ica-groups-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.7.x/ica-unordered-channel-chain-a.json b/.github/compatibility-test-matrices/release-v7.7.x/ica-unordered-channel-chain-a.json index baaf8bab6f9..58726245d8d 100644 --- a/.github/compatibility-test-matrices/release-v7.7.x/ica-unordered-channel-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.7.x/ica-unordered-channel-chain-a.json @@ -3,6 +3,7 @@ "release-v7.7.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "release-v7.7.x" diff --git a/.github/compatibility-test-matrices/release-v7.7.x/ica-unordered-channel-chain-b.json b/.github/compatibility-test-matrices/release-v7.7.x/ica-unordered-channel-chain-b.json index 3d7a2fac3cb..f8352177d9c 100644 --- a/.github/compatibility-test-matrices/release-v7.7.x/ica-unordered-channel-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.7.x/ica-unordered-channel-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "release-v7.7.x" diff --git a/.github/compatibility-test-matrices/release-v7.7.x/incentivized-ica-chain-a.json b/.github/compatibility-test-matrices/release-v7.7.x/incentivized-ica-chain-a.json index 6b11a19db50..35dda0d2251 100644 --- a/.github/compatibility-test-matrices/release-v7.7.x/incentivized-ica-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.7.x/incentivized-ica-chain-a.json @@ -3,6 +3,7 @@ "release-v7.7.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.7.x/incentivized-ica-chain-b.json b/.github/compatibility-test-matrices/release-v7.7.x/incentivized-ica-chain-b.json index ffc7e16b18e..11020e13ee7 100644 --- a/.github/compatibility-test-matrices/release-v7.7.x/incentivized-ica-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.7.x/incentivized-ica-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.7.x/incentivized-transfer-chain-a.json b/.github/compatibility-test-matrices/release-v7.7.x/incentivized-transfer-chain-a.json index 63ca4f86ac4..647aefbf71c 100644 --- a/.github/compatibility-test-matrices/release-v7.7.x/incentivized-transfer-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.7.x/incentivized-transfer-chain-a.json @@ -3,6 +3,7 @@ "release-v7.7.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.7.x/incentivized-transfer-chain-b.json b/.github/compatibility-test-matrices/release-v7.7.x/incentivized-transfer-chain-b.json index 3f72a4f02a9..1779bb55d20 100644 --- a/.github/compatibility-test-matrices/release-v7.7.x/incentivized-transfer-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.7.x/incentivized-transfer-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.7.x/localhost-ica-chain-a.json b/.github/compatibility-test-matrices/release-v7.7.x/localhost-ica-chain-a.json index 12d246727ef..2ca5155c5fa 100644 --- a/.github/compatibility-test-matrices/release-v7.7.x/localhost-ica-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.7.x/localhost-ica-chain-a.json @@ -3,6 +3,7 @@ "release-v7.7.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.7.x/localhost-transfer-chain-a.json b/.github/compatibility-test-matrices/release-v7.7.x/localhost-transfer-chain-a.json index 397c21fb75b..b545a18d85e 100644 --- a/.github/compatibility-test-matrices/release-v7.7.x/localhost-transfer-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.7.x/localhost-transfer-chain-a.json @@ -3,6 +3,7 @@ "release-v7.7.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.7.x/transfer-authz-chain-a.json b/.github/compatibility-test-matrices/release-v7.7.x/transfer-authz-chain-a.json index aafffefacb2..6c2bc8c8cab 100644 --- a/.github/compatibility-test-matrices/release-v7.7.x/transfer-authz-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.7.x/transfer-authz-chain-a.json @@ -3,6 +3,7 @@ "release-v7.7.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.7.x/transfer-authz-chain-b.json b/.github/compatibility-test-matrices/release-v7.7.x/transfer-authz-chain-b.json index e4bceaff361..1a8455b4785 100644 --- a/.github/compatibility-test-matrices/release-v7.7.x/transfer-authz-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.7.x/transfer-authz-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.7.x/transfer-chain-a.json b/.github/compatibility-test-matrices/release-v7.7.x/transfer-chain-a.json index f832ac61a6e..0b2916d5c73 100644 --- a/.github/compatibility-test-matrices/release-v7.7.x/transfer-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.7.x/transfer-chain-a.json @@ -3,6 +3,7 @@ "release-v7.7.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.7.x/transfer-chain-b.json b/.github/compatibility-test-matrices/release-v7.7.x/transfer-chain-b.json index bf1b933a646..edb0b978daf 100644 --- a/.github/compatibility-test-matrices/release-v7.7.x/transfer-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.7.x/transfer-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.8.x/ica-chain-a.json b/.github/compatibility-test-matrices/release-v7.8.x/ica-chain-a.json index ae0b3d9a90f..2d34fec1e5a 100644 --- a/.github/compatibility-test-matrices/release-v7.8.x/ica-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.8.x/ica-chain-a.json @@ -3,6 +3,7 @@ "release-v7.8.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.8.x/ica-chain-b.json b/.github/compatibility-test-matrices/release-v7.8.x/ica-chain-b.json index a5f69025ec0..18cbbde57f4 100644 --- a/.github/compatibility-test-matrices/release-v7.8.x/ica-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.8.x/ica-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.8.x/ica-gov-chain-a.json b/.github/compatibility-test-matrices/release-v7.8.x/ica-gov-chain-a.json index 8ace4bfe3fe..b8ce19d6ff4 100644 --- a/.github/compatibility-test-matrices/release-v7.8.x/ica-gov-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.8.x/ica-gov-chain-a.json @@ -3,6 +3,7 @@ "release-v7.8.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.8.x/ica-gov-chain-b.json b/.github/compatibility-test-matrices/release-v7.8.x/ica-gov-chain-b.json index 9793fe4b54c..268657ac163 100644 --- a/.github/compatibility-test-matrices/release-v7.8.x/ica-gov-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.8.x/ica-gov-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.8.x/ica-groups-chain-a.json b/.github/compatibility-test-matrices/release-v7.8.x/ica-groups-chain-a.json index 032ec43173d..b67ca0f56da 100644 --- a/.github/compatibility-test-matrices/release-v7.8.x/ica-groups-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.8.x/ica-groups-chain-a.json @@ -3,6 +3,7 @@ "release-v7.8.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.8.x/ica-groups-chain-b.json b/.github/compatibility-test-matrices/release-v7.8.x/ica-groups-chain-b.json index 0f8f01af088..006db55559f 100644 --- a/.github/compatibility-test-matrices/release-v7.8.x/ica-groups-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.8.x/ica-groups-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.8.x/ica-unordered-channel-chain-a.json b/.github/compatibility-test-matrices/release-v7.8.x/ica-unordered-channel-chain-a.json index ccd805c86e1..926c5b8bece 100644 --- a/.github/compatibility-test-matrices/release-v7.8.x/ica-unordered-channel-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.8.x/ica-unordered-channel-chain-a.json @@ -3,6 +3,7 @@ "release-v7.8.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "release-v7.8.x" diff --git a/.github/compatibility-test-matrices/release-v7.8.x/ica-unordered-channel-chain-b.json b/.github/compatibility-test-matrices/release-v7.8.x/ica-unordered-channel-chain-b.json index d86d0aac81f..f27be113678 100644 --- a/.github/compatibility-test-matrices/release-v7.8.x/ica-unordered-channel-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.8.x/ica-unordered-channel-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "release-v7.8.x" diff --git a/.github/compatibility-test-matrices/release-v7.8.x/incentivized-ica-chain-a.json b/.github/compatibility-test-matrices/release-v7.8.x/incentivized-ica-chain-a.json index 3471c955487..ab2027dcdd7 100644 --- a/.github/compatibility-test-matrices/release-v7.8.x/incentivized-ica-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.8.x/incentivized-ica-chain-a.json @@ -3,6 +3,7 @@ "release-v7.8.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.8.x/incentivized-ica-chain-b.json b/.github/compatibility-test-matrices/release-v7.8.x/incentivized-ica-chain-b.json index 9365475a499..2a60b095e48 100644 --- a/.github/compatibility-test-matrices/release-v7.8.x/incentivized-ica-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.8.x/incentivized-ica-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.8.x/incentivized-transfer-chain-a.json b/.github/compatibility-test-matrices/release-v7.8.x/incentivized-transfer-chain-a.json index c4c9ca1107e..61fa270413f 100644 --- a/.github/compatibility-test-matrices/release-v7.8.x/incentivized-transfer-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.8.x/incentivized-transfer-chain-a.json @@ -3,6 +3,7 @@ "release-v7.8.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.8.x/incentivized-transfer-chain-b.json b/.github/compatibility-test-matrices/release-v7.8.x/incentivized-transfer-chain-b.json index 5aa8ce2345d..d48f66b5e37 100644 --- a/.github/compatibility-test-matrices/release-v7.8.x/incentivized-transfer-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.8.x/incentivized-transfer-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.8.x/localhost-ica-chain-a.json b/.github/compatibility-test-matrices/release-v7.8.x/localhost-ica-chain-a.json index fc7b1491b46..cb12f945d32 100644 --- a/.github/compatibility-test-matrices/release-v7.8.x/localhost-ica-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.8.x/localhost-ica-chain-a.json @@ -3,6 +3,7 @@ "release-v7.8.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.8.x/localhost-transfer-chain-a.json b/.github/compatibility-test-matrices/release-v7.8.x/localhost-transfer-chain-a.json index 6153e674a05..be320e72645 100644 --- a/.github/compatibility-test-matrices/release-v7.8.x/localhost-transfer-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.8.x/localhost-transfer-chain-a.json @@ -3,6 +3,7 @@ "release-v7.8.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.8.x/transfer-authz-chain-a.json b/.github/compatibility-test-matrices/release-v7.8.x/transfer-authz-chain-a.json index 156f8171a27..cc2174dfc3c 100644 --- a/.github/compatibility-test-matrices/release-v7.8.x/transfer-authz-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.8.x/transfer-authz-chain-a.json @@ -3,6 +3,7 @@ "release-v7.8.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.8.x/transfer-authz-chain-b.json b/.github/compatibility-test-matrices/release-v7.8.x/transfer-authz-chain-b.json index bad34e7e0c6..21d046fa7bd 100644 --- a/.github/compatibility-test-matrices/release-v7.8.x/transfer-authz-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.8.x/transfer-authz-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.8.x/transfer-chain-a.json b/.github/compatibility-test-matrices/release-v7.8.x/transfer-chain-a.json index f31a0b07a5b..60411906f0b 100644 --- a/.github/compatibility-test-matrices/release-v7.8.x/transfer-chain-a.json +++ b/.github/compatibility-test-matrices/release-v7.8.x/transfer-chain-a.json @@ -3,6 +3,7 @@ "release-v7.8.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v7.8.x/transfer-chain-b.json b/.github/compatibility-test-matrices/release-v7.8.x/transfer-chain-b.json index 09693a9c446..2be3cfd0f8c 100644 --- a/.github/compatibility-test-matrices/release-v7.8.x/transfer-chain-b.json +++ b/.github/compatibility-test-matrices/release-v7.8.x/transfer-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.4.x/ica-chain-a.json b/.github/compatibility-test-matrices/release-v8.4.x/ica-chain-a.json index 1e6f12f6f38..b85b81ffc1c 100644 --- a/.github/compatibility-test-matrices/release-v8.4.x/ica-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.4.x/ica-chain-a.json @@ -3,6 +3,7 @@ "release-v8.4.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.4.x/ica-chain-b.json b/.github/compatibility-test-matrices/release-v8.4.x/ica-chain-b.json index 26c040209f9..e32c1390647 100644 --- a/.github/compatibility-test-matrices/release-v8.4.x/ica-chain-b.json +++ b/.github/compatibility-test-matrices/release-v8.4.x/ica-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.4.x/ica-channel-upgrade-chain-a.json b/.github/compatibility-test-matrices/release-v8.4.x/ica-channel-upgrade-chain-a.json index 69a3f5042e7..acebf43d0c3 100644 --- a/.github/compatibility-test-matrices/release-v8.4.x/ica-channel-upgrade-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.4.x/ica-channel-upgrade-chain-a.json @@ -3,6 +3,7 @@ "release-v8.4.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "release-v8.4.x" diff --git a/.github/compatibility-test-matrices/release-v8.4.x/ica-channel-upgrade-chain-b.json b/.github/compatibility-test-matrices/release-v8.4.x/ica-channel-upgrade-chain-b.json index fc8ddd2f346..fbe739607a1 100644 --- a/.github/compatibility-test-matrices/release-v8.4.x/ica-channel-upgrade-chain-b.json +++ b/.github/compatibility-test-matrices/release-v8.4.x/ica-channel-upgrade-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "release-v8.4.x" diff --git a/.github/compatibility-test-matrices/release-v8.4.x/ica-gov-chain-a.json b/.github/compatibility-test-matrices/release-v8.4.x/ica-gov-chain-a.json index 92a20ef45ad..79c646cfcb8 100644 --- a/.github/compatibility-test-matrices/release-v8.4.x/ica-gov-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.4.x/ica-gov-chain-a.json @@ -3,6 +3,7 @@ "release-v8.4.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.4.x/ica-gov-chain-b.json b/.github/compatibility-test-matrices/release-v8.4.x/ica-gov-chain-b.json index 8a6c409e896..45d1f56db31 100644 --- a/.github/compatibility-test-matrices/release-v8.4.x/ica-gov-chain-b.json +++ b/.github/compatibility-test-matrices/release-v8.4.x/ica-gov-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.4.x/ica-groups-chain-a.json b/.github/compatibility-test-matrices/release-v8.4.x/ica-groups-chain-a.json index ceef3795909..dc626cbd3d3 100644 --- a/.github/compatibility-test-matrices/release-v8.4.x/ica-groups-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.4.x/ica-groups-chain-a.json @@ -3,6 +3,7 @@ "release-v8.4.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.4.x/ica-groups-chain-b.json b/.github/compatibility-test-matrices/release-v8.4.x/ica-groups-chain-b.json index d92e890efed..6d911b04b70 100644 --- a/.github/compatibility-test-matrices/release-v8.4.x/ica-groups-chain-b.json +++ b/.github/compatibility-test-matrices/release-v8.4.x/ica-groups-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.4.x/ica-queries-chain-a.json b/.github/compatibility-test-matrices/release-v8.4.x/ica-queries-chain-a.json index 7664b4934e5..964c8d2f25a 100644 --- a/.github/compatibility-test-matrices/release-v8.4.x/ica-queries-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.4.x/ica-queries-chain-a.json @@ -3,6 +3,7 @@ "release-v8.4.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.4.x/ica-queries-chain-b.json b/.github/compatibility-test-matrices/release-v8.4.x/ica-queries-chain-b.json index 3f18bd9b205..f92c0099b57 100644 --- a/.github/compatibility-test-matrices/release-v8.4.x/ica-queries-chain-b.json +++ b/.github/compatibility-test-matrices/release-v8.4.x/ica-queries-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.4.x/ica-unordered-channel-chain-a.json b/.github/compatibility-test-matrices/release-v8.4.x/ica-unordered-channel-chain-a.json index 2ffb5f9e4cc..6c0dda38f64 100644 --- a/.github/compatibility-test-matrices/release-v8.4.x/ica-unordered-channel-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.4.x/ica-unordered-channel-chain-a.json @@ -3,6 +3,7 @@ "release-v8.4.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.4.x/ica-unordered-channel-chain-b.json b/.github/compatibility-test-matrices/release-v8.4.x/ica-unordered-channel-chain-b.json index 40623b97af5..322feabdf31 100644 --- a/.github/compatibility-test-matrices/release-v8.4.x/ica-unordered-channel-chain-b.json +++ b/.github/compatibility-test-matrices/release-v8.4.x/ica-unordered-channel-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.4.x/incentivized-ica-chain-a.json b/.github/compatibility-test-matrices/release-v8.4.x/incentivized-ica-chain-a.json index 6e7a1744a8d..5d4b5cf22f6 100644 --- a/.github/compatibility-test-matrices/release-v8.4.x/incentivized-ica-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.4.x/incentivized-ica-chain-a.json @@ -3,6 +3,7 @@ "release-v8.4.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.4.x/incentivized-ica-chain-b.json b/.github/compatibility-test-matrices/release-v8.4.x/incentivized-ica-chain-b.json index e5a15ea9f8e..2127bf39421 100644 --- a/.github/compatibility-test-matrices/release-v8.4.x/incentivized-ica-chain-b.json +++ b/.github/compatibility-test-matrices/release-v8.4.x/incentivized-ica-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.4.x/incentivized-transfer-chain-a.json b/.github/compatibility-test-matrices/release-v8.4.x/incentivized-transfer-chain-a.json index 6e6e343d420..5c58b8d8234 100644 --- a/.github/compatibility-test-matrices/release-v8.4.x/incentivized-transfer-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.4.x/incentivized-transfer-chain-a.json @@ -3,6 +3,7 @@ "release-v8.4.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.4.x/incentivized-transfer-chain-b.json b/.github/compatibility-test-matrices/release-v8.4.x/incentivized-transfer-chain-b.json index bb7d5dfe150..075a3febbc4 100644 --- a/.github/compatibility-test-matrices/release-v8.4.x/incentivized-transfer-chain-b.json +++ b/.github/compatibility-test-matrices/release-v8.4.x/incentivized-transfer-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.4.x/localhost-ica-chain-a.json b/.github/compatibility-test-matrices/release-v8.4.x/localhost-ica-chain-a.json index 7f67b18a01b..3fe7463947a 100644 --- a/.github/compatibility-test-matrices/release-v8.4.x/localhost-ica-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.4.x/localhost-ica-chain-a.json @@ -3,6 +3,7 @@ "release-v8.4.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.4.x/localhost-transfer-chain-a.json b/.github/compatibility-test-matrices/release-v8.4.x/localhost-transfer-chain-a.json index 4d1ae7dcf70..30e197881d2 100644 --- a/.github/compatibility-test-matrices/release-v8.4.x/localhost-transfer-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.4.x/localhost-transfer-chain-a.json @@ -3,6 +3,7 @@ "release-v8.4.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.4.x/transfer-authz-chain-a.json b/.github/compatibility-test-matrices/release-v8.4.x/transfer-authz-chain-a.json index 11ae7ca039c..ed12691ebc4 100644 --- a/.github/compatibility-test-matrices/release-v8.4.x/transfer-authz-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.4.x/transfer-authz-chain-a.json @@ -3,6 +3,7 @@ "release-v8.4.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.4.x/transfer-authz-chain-b.json b/.github/compatibility-test-matrices/release-v8.4.x/transfer-authz-chain-b.json index 64641ff3091..d624b90adfb 100644 --- a/.github/compatibility-test-matrices/release-v8.4.x/transfer-authz-chain-b.json +++ b/.github/compatibility-test-matrices/release-v8.4.x/transfer-authz-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.4.x/transfer-chain-a.json b/.github/compatibility-test-matrices/release-v8.4.x/transfer-chain-a.json index eaed8ad7c77..f9c76912326 100644 --- a/.github/compatibility-test-matrices/release-v8.4.x/transfer-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.4.x/transfer-chain-a.json @@ -3,6 +3,7 @@ "release-v8.4.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.4.x/transfer-chain-b.json b/.github/compatibility-test-matrices/release-v8.4.x/transfer-chain-b.json index 83191949c6f..9a28aad8b8c 100644 --- a/.github/compatibility-test-matrices/release-v8.4.x/transfer-chain-b.json +++ b/.github/compatibility-test-matrices/release-v8.4.x/transfer-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.4.x/transfer-channel-upgrade-chain-a.json b/.github/compatibility-test-matrices/release-v8.4.x/transfer-channel-upgrade-chain-a.json index abd255a88d1..213fe6e807d 100644 --- a/.github/compatibility-test-matrices/release-v8.4.x/transfer-channel-upgrade-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.4.x/transfer-channel-upgrade-chain-a.json @@ -3,6 +3,7 @@ "release-v8.4.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "release-v8.4.x" diff --git a/.github/compatibility-test-matrices/release-v8.4.x/transfer-channel-upgrade-chain-b.json b/.github/compatibility-test-matrices/release-v8.4.x/transfer-channel-upgrade-chain-b.json index 71d5a676d32..857370c4387 100644 --- a/.github/compatibility-test-matrices/release-v8.4.x/transfer-channel-upgrade-chain-b.json +++ b/.github/compatibility-test-matrices/release-v8.4.x/transfer-channel-upgrade-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "release-v8.4.x" diff --git a/.github/compatibility-test-matrices/release-v8.5.x/ica-chain-a.json b/.github/compatibility-test-matrices/release-v8.5.x/ica-chain-a.json index 23e31849731..9e9b4b158bb 100644 --- a/.github/compatibility-test-matrices/release-v8.5.x/ica-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.5.x/ica-chain-a.json @@ -3,6 +3,7 @@ "release-v8.5.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.5.x/ica-chain-b.json b/.github/compatibility-test-matrices/release-v8.5.x/ica-chain-b.json index 7fa55f1fcf4..867d9562232 100644 --- a/.github/compatibility-test-matrices/release-v8.5.x/ica-chain-b.json +++ b/.github/compatibility-test-matrices/release-v8.5.x/ica-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.5.x/ica-channel-upgrade-chain-a.json b/.github/compatibility-test-matrices/release-v8.5.x/ica-channel-upgrade-chain-a.json index 248c371e927..1e8168fc951 100644 --- a/.github/compatibility-test-matrices/release-v8.5.x/ica-channel-upgrade-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.5.x/ica-channel-upgrade-chain-a.json @@ -3,6 +3,7 @@ "release-v8.5.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "release-v8.5.x" diff --git a/.github/compatibility-test-matrices/release-v8.5.x/ica-channel-upgrade-chain-b.json b/.github/compatibility-test-matrices/release-v8.5.x/ica-channel-upgrade-chain-b.json index 612eabe143b..211d38509f2 100644 --- a/.github/compatibility-test-matrices/release-v8.5.x/ica-channel-upgrade-chain-b.json +++ b/.github/compatibility-test-matrices/release-v8.5.x/ica-channel-upgrade-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "release-v8.5.x" diff --git a/.github/compatibility-test-matrices/release-v8.5.x/ica-gov-chain-a.json b/.github/compatibility-test-matrices/release-v8.5.x/ica-gov-chain-a.json index 3454076cf71..fe59339328d 100644 --- a/.github/compatibility-test-matrices/release-v8.5.x/ica-gov-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.5.x/ica-gov-chain-a.json @@ -3,6 +3,7 @@ "release-v8.5.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.5.x/ica-gov-chain-b.json b/.github/compatibility-test-matrices/release-v8.5.x/ica-gov-chain-b.json index 93f579f43d9..dd131c1f321 100644 --- a/.github/compatibility-test-matrices/release-v8.5.x/ica-gov-chain-b.json +++ b/.github/compatibility-test-matrices/release-v8.5.x/ica-gov-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.5.x/ica-groups-chain-a.json b/.github/compatibility-test-matrices/release-v8.5.x/ica-groups-chain-a.json index 89e36bc1f30..c22d96f104d 100644 --- a/.github/compatibility-test-matrices/release-v8.5.x/ica-groups-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.5.x/ica-groups-chain-a.json @@ -3,6 +3,7 @@ "release-v8.5.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.5.x/ica-groups-chain-b.json b/.github/compatibility-test-matrices/release-v8.5.x/ica-groups-chain-b.json index 40b58ea8b8e..be17cb6295f 100644 --- a/.github/compatibility-test-matrices/release-v8.5.x/ica-groups-chain-b.json +++ b/.github/compatibility-test-matrices/release-v8.5.x/ica-groups-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.5.x/ica-queries-chain-a.json b/.github/compatibility-test-matrices/release-v8.5.x/ica-queries-chain-a.json index 9a195d9ceb7..a34d4dd4cf6 100644 --- a/.github/compatibility-test-matrices/release-v8.5.x/ica-queries-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.5.x/ica-queries-chain-a.json @@ -3,6 +3,7 @@ "release-v8.5.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.5.x/ica-queries-chain-b.json b/.github/compatibility-test-matrices/release-v8.5.x/ica-queries-chain-b.json index 21b53e65bb0..37e04cb23ef 100644 --- a/.github/compatibility-test-matrices/release-v8.5.x/ica-queries-chain-b.json +++ b/.github/compatibility-test-matrices/release-v8.5.x/ica-queries-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.5.x/ica-unordered-channel-chain-a.json b/.github/compatibility-test-matrices/release-v8.5.x/ica-unordered-channel-chain-a.json index 577dae489e5..63607ab24db 100644 --- a/.github/compatibility-test-matrices/release-v8.5.x/ica-unordered-channel-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.5.x/ica-unordered-channel-chain-a.json @@ -3,6 +3,7 @@ "release-v8.5.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.5.x/ica-unordered-channel-chain-b.json b/.github/compatibility-test-matrices/release-v8.5.x/ica-unordered-channel-chain-b.json index d9c364fd2a0..835d87749b3 100644 --- a/.github/compatibility-test-matrices/release-v8.5.x/ica-unordered-channel-chain-b.json +++ b/.github/compatibility-test-matrices/release-v8.5.x/ica-unordered-channel-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.5.x/incentivized-ica-chain-a.json b/.github/compatibility-test-matrices/release-v8.5.x/incentivized-ica-chain-a.json index 330964f3c79..a08b2ebea6a 100644 --- a/.github/compatibility-test-matrices/release-v8.5.x/incentivized-ica-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.5.x/incentivized-ica-chain-a.json @@ -3,6 +3,7 @@ "release-v8.5.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.5.x/incentivized-ica-chain-b.json b/.github/compatibility-test-matrices/release-v8.5.x/incentivized-ica-chain-b.json index 9d6412f10af..e9c546d478b 100644 --- a/.github/compatibility-test-matrices/release-v8.5.x/incentivized-ica-chain-b.json +++ b/.github/compatibility-test-matrices/release-v8.5.x/incentivized-ica-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.5.x/incentivized-transfer-chain-a.json b/.github/compatibility-test-matrices/release-v8.5.x/incentivized-transfer-chain-a.json index 528821135bb..a054c17f7b9 100644 --- a/.github/compatibility-test-matrices/release-v8.5.x/incentivized-transfer-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.5.x/incentivized-transfer-chain-a.json @@ -3,6 +3,7 @@ "release-v8.5.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.5.x/incentivized-transfer-chain-b.json b/.github/compatibility-test-matrices/release-v8.5.x/incentivized-transfer-chain-b.json index 0e87e2c7808..ba6345b7e84 100644 --- a/.github/compatibility-test-matrices/release-v8.5.x/incentivized-transfer-chain-b.json +++ b/.github/compatibility-test-matrices/release-v8.5.x/incentivized-transfer-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.5.x/localhost-ica-chain-a.json b/.github/compatibility-test-matrices/release-v8.5.x/localhost-ica-chain-a.json index 2cda7657b7d..205806c2719 100644 --- a/.github/compatibility-test-matrices/release-v8.5.x/localhost-ica-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.5.x/localhost-ica-chain-a.json @@ -3,6 +3,7 @@ "release-v8.5.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.5.x/localhost-transfer-chain-a.json b/.github/compatibility-test-matrices/release-v8.5.x/localhost-transfer-chain-a.json index 7c36ff7d1a1..d4469d17571 100644 --- a/.github/compatibility-test-matrices/release-v8.5.x/localhost-transfer-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.5.x/localhost-transfer-chain-a.json @@ -3,6 +3,7 @@ "release-v8.5.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.5.x/transfer-authz-chain-a.json b/.github/compatibility-test-matrices/release-v8.5.x/transfer-authz-chain-a.json index fff34cfb346..a7e286853ac 100644 --- a/.github/compatibility-test-matrices/release-v8.5.x/transfer-authz-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.5.x/transfer-authz-chain-a.json @@ -3,6 +3,7 @@ "release-v8.5.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.5.x/transfer-authz-chain-b.json b/.github/compatibility-test-matrices/release-v8.5.x/transfer-authz-chain-b.json index 2ec52ff3240..cd8a3a3f1f1 100644 --- a/.github/compatibility-test-matrices/release-v8.5.x/transfer-authz-chain-b.json +++ b/.github/compatibility-test-matrices/release-v8.5.x/transfer-authz-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.5.x/transfer-chain-a.json b/.github/compatibility-test-matrices/release-v8.5.x/transfer-chain-a.json index bb1176b3ad3..a68f1fd5a0a 100644 --- a/.github/compatibility-test-matrices/release-v8.5.x/transfer-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.5.x/transfer-chain-a.json @@ -3,6 +3,7 @@ "release-v8.5.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.5.x/transfer-chain-b.json b/.github/compatibility-test-matrices/release-v8.5.x/transfer-chain-b.json index 5ee0b1f0f6f..8297dce0672 100644 --- a/.github/compatibility-test-matrices/release-v8.5.x/transfer-chain-b.json +++ b/.github/compatibility-test-matrices/release-v8.5.x/transfer-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v8.5.x/transfer-channel-upgrade-chain-a.json b/.github/compatibility-test-matrices/release-v8.5.x/transfer-channel-upgrade-chain-a.json index e13a5647db4..066e0103644 100644 --- a/.github/compatibility-test-matrices/release-v8.5.x/transfer-channel-upgrade-chain-a.json +++ b/.github/compatibility-test-matrices/release-v8.5.x/transfer-channel-upgrade-chain-a.json @@ -3,6 +3,7 @@ "release-v8.5.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "release-v8.5.x" diff --git a/.github/compatibility-test-matrices/release-v8.5.x/transfer-channel-upgrade-chain-b.json b/.github/compatibility-test-matrices/release-v8.5.x/transfer-channel-upgrade-chain-b.json index 383154fe1eb..2301c429ccb 100644 --- a/.github/compatibility-test-matrices/release-v8.5.x/transfer-channel-upgrade-chain-b.json +++ b/.github/compatibility-test-matrices/release-v8.5.x/transfer-channel-upgrade-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "release-v8.5.x" diff --git a/.github/compatibility-test-matrices/release-v9.0.x/ica-chain-a.json b/.github/compatibility-test-matrices/release-v9.0.x/ica-chain-a.json index 0f1aed472ba..45471fdedbe 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/ica-chain-a.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/ica-chain-a.json @@ -3,6 +3,7 @@ "release-v9.0.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v9.0.x/ica-chain-b.json b/.github/compatibility-test-matrices/release-v9.0.x/ica-chain-b.json index 6fd799e238b..25cb87054d7 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/ica-chain-b.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/ica-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v9.0.x/ica-channel-upgrade-chain-a.json b/.github/compatibility-test-matrices/release-v9.0.x/ica-channel-upgrade-chain-a.json index fc9d57f1fed..aa84371ef9e 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/ica-channel-upgrade-chain-a.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/ica-channel-upgrade-chain-a.json @@ -3,6 +3,7 @@ "release-v9.0.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "release-v9.0.x" diff --git a/.github/compatibility-test-matrices/release-v9.0.x/ica-channel-upgrade-chain-b.json b/.github/compatibility-test-matrices/release-v9.0.x/ica-channel-upgrade-chain-b.json index c689a92c791..e7e3ed1e6c3 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/ica-channel-upgrade-chain-b.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/ica-channel-upgrade-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "release-v9.0.x" diff --git a/.github/compatibility-test-matrices/release-v9.0.x/ica-gov-chain-a.json b/.github/compatibility-test-matrices/release-v9.0.x/ica-gov-chain-a.json index e2f558a7e37..5a951ba05ff 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/ica-gov-chain-a.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/ica-gov-chain-a.json @@ -3,6 +3,7 @@ "release-v9.0.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v9.0.x/ica-gov-chain-b.json b/.github/compatibility-test-matrices/release-v9.0.x/ica-gov-chain-b.json index 8e8e6ed85a2..63da08a7d35 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/ica-gov-chain-b.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/ica-gov-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v9.0.x/ica-groups-chain-a.json b/.github/compatibility-test-matrices/release-v9.0.x/ica-groups-chain-a.json index a9bcb6f5bcf..551c9e5eecc 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/ica-groups-chain-a.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/ica-groups-chain-a.json @@ -3,6 +3,7 @@ "release-v9.0.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v9.0.x/ica-groups-chain-b.json b/.github/compatibility-test-matrices/release-v9.0.x/ica-groups-chain-b.json index 86709bca8b8..a80d2a4d46f 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/ica-groups-chain-b.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/ica-groups-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v9.0.x/ica-queries-chain-a.json b/.github/compatibility-test-matrices/release-v9.0.x/ica-queries-chain-a.json index 5976a12e19d..5cae3c5dbd4 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/ica-queries-chain-a.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/ica-queries-chain-a.json @@ -3,6 +3,7 @@ "release-v9.0.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v9.0.x/ica-queries-chain-b.json b/.github/compatibility-test-matrices/release-v9.0.x/ica-queries-chain-b.json index 065156d3b35..b11084f01d8 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/ica-queries-chain-b.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/ica-queries-chain-b.json @@ -7,6 +7,7 @@ "release-v9.0.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "release-v9.0.x" diff --git a/.github/compatibility-test-matrices/release-v9.0.x/ica-unordered-channel-chain-a.json b/.github/compatibility-test-matrices/release-v9.0.x/ica-unordered-channel-chain-a.json index 2b9157ce95e..2b5233ee8c7 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/ica-unordered-channel-chain-a.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/ica-unordered-channel-chain-a.json @@ -3,6 +3,7 @@ "release-v9.0.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v9.0.x/ica-unordered-channel-chain-b.json b/.github/compatibility-test-matrices/release-v9.0.x/ica-unordered-channel-chain-b.json index dd9b990c6c0..4b709bc1d2a 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/ica-unordered-channel-chain-b.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/ica-unordered-channel-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v9.0.x/incentivized-ica-chain-a.json b/.github/compatibility-test-matrices/release-v9.0.x/incentivized-ica-chain-a.json index 5720e7b3378..6a1bb76c6b4 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/incentivized-ica-chain-a.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/incentivized-ica-chain-a.json @@ -3,6 +3,7 @@ "release-v9.0.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v9.0.x/incentivized-ica-chain-b.json b/.github/compatibility-test-matrices/release-v9.0.x/incentivized-ica-chain-b.json index d946dae389e..fa2c89d816d 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/incentivized-ica-chain-b.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/incentivized-ica-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v9.0.x/incentivized-transfer-chain-a.json b/.github/compatibility-test-matrices/release-v9.0.x/incentivized-transfer-chain-a.json index 768441d53b1..b08500750c5 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/incentivized-transfer-chain-a.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/incentivized-transfer-chain-a.json @@ -3,6 +3,7 @@ "release-v9.0.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v9.0.x/incentivized-transfer-chain-b.json b/.github/compatibility-test-matrices/release-v9.0.x/incentivized-transfer-chain-b.json index fb6ea5e68fe..86ed566f370 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/incentivized-transfer-chain-b.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/incentivized-transfer-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v9.0.x/localhost-ica-chain-a.json b/.github/compatibility-test-matrices/release-v9.0.x/localhost-ica-chain-a.json index 3e3399b0269..e15ccb82429 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/localhost-ica-chain-a.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/localhost-ica-chain-a.json @@ -3,6 +3,7 @@ "release-v9.0.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v9.0.x/localhost-transfer-chain-a.json b/.github/compatibility-test-matrices/release-v9.0.x/localhost-transfer-chain-a.json index 9e2671e0c8b..62c9c1644dd 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/localhost-transfer-chain-a.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/localhost-transfer-chain-a.json @@ -3,6 +3,7 @@ "release-v9.0.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v9.0.x/transfer-authz-chain-a.json b/.github/compatibility-test-matrices/release-v9.0.x/transfer-authz-chain-a.json index 8f51caef846..1f04456329f 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/transfer-authz-chain-a.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/transfer-authz-chain-a.json @@ -3,6 +3,7 @@ "release-v9.0.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v9.0.x/transfer-authz-chain-b.json b/.github/compatibility-test-matrices/release-v9.0.x/transfer-authz-chain-b.json index 61100e64000..9d213e88cc8 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/transfer-authz-chain-b.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/transfer-authz-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v9.0.x/transfer-chain-a.json b/.github/compatibility-test-matrices/release-v9.0.x/transfer-chain-a.json index 9fbc18b18eb..f6484d6aa9f 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/transfer-chain-a.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/transfer-chain-a.json @@ -3,6 +3,7 @@ "release-v9.0.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v9.0.x/transfer-chain-b.json b/.github/compatibility-test-matrices/release-v9.0.x/transfer-chain-b.json index 497406e4567..fd977d6af2c 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/transfer-chain-b.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/transfer-chain-b.json @@ -1,5 +1,6 @@ { "chain-a": [ + "v9.0.0", "v8.5.0", "v8.4.0", "v7.8.0", diff --git a/.github/compatibility-test-matrices/release-v9.0.x/transfer-channel-upgrade-chain-a.json b/.github/compatibility-test-matrices/release-v9.0.x/transfer-channel-upgrade-chain-a.json index ae30c743d7a..5d7e3e59b21 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/transfer-channel-upgrade-chain-a.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/transfer-channel-upgrade-chain-a.json @@ -3,6 +3,7 @@ "release-v9.0.x" ], "chain-b": [ + "v9.0.0", "v8.5.0", "v8.4.0", "release-v9.0.x" diff --git a/.github/compatibility-test-matrices/release-v9.0.x/transfer-channel-upgrade-chain-a copy.json b/.github/compatibility-test-matrices/release-v9.0.x/transfer-channel-upgrade-chain-b.json similarity index 96% rename from .github/compatibility-test-matrices/release-v9.0.x/transfer-channel-upgrade-chain-a copy.json rename to .github/compatibility-test-matrices/release-v9.0.x/transfer-channel-upgrade-chain-b.json index ae30c743d7a..9aa61648920 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/transfer-channel-upgrade-chain-a copy.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/transfer-channel-upgrade-chain-b.json @@ -1,10 +1,11 @@ { "chain-a": [ + "v9.0.0", + "v8.5.0", + "v8.4.0", "release-v9.0.x" ], "chain-b": [ - "v8.5.0", - "v8.4.0", "release-v9.0.x" ], "entrypoint": [ diff --git a/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-1-channel-upgrade-chain-a.json b/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-1-channel-upgrade-chain-a.json index 54055b7f6a5..c652d92ea50 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-1-channel-upgrade-chain-a.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-1-channel-upgrade-chain-a.json @@ -3,6 +3,7 @@ "release-v9.0.x" ], "chain-b": [ + "v9.0.0", "release-v9.0.x" ], "entrypoint": [ diff --git a/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-1-channel-upgrade-chain-b.json b/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-1-channel-upgrade-chain-b.json new file mode 100644 index 00000000000..baa7b5671b1 --- /dev/null +++ b/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-1-channel-upgrade-chain-b.json @@ -0,0 +1,19 @@ +{ + "chain-a": [ + "v9.0.0", + "release-v9.0.x" + ], + "chain-b": [ + "release-v9.0.x" + ], + "entrypoint": [ + "TransferChannelUpgradesV1TestSuite" + ], + "test": [ + "TestChannelUpgrade_WithICS20v2_Succeeds", + "TestChannelUpgrade_WithFeeMiddlewareAndICS20v2_Succeeds" + ], + "relayer-type": [ + "hermes" + ] +} \ No newline at end of file diff --git a/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-2-channel-upgrade-chain-a.json b/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-2-channel-upgrade-chain-a.json index 6d34120aae7..1c911971e54 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-2-channel-upgrade-chain-a.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-2-channel-upgrade-chain-a.json @@ -3,6 +3,7 @@ "release-v9.0.x" ], "chain-b": [ + "v9.0.0", "release-v9.0.x" ], "entrypoint": [ diff --git a/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-2-channel-upgrade-chain-b.json b/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-2-channel-upgrade-chain-b.json new file mode 100644 index 00000000000..db049e69553 --- /dev/null +++ b/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-2-channel-upgrade-chain-b.json @@ -0,0 +1,18 @@ +{ + "chain-a": [ + "v9.0.0", + "release-v9.0.x" + ], + "chain-b": [ + "release-v9.0.x" + ], + "entrypoint": [ + "TestTransferChannelUpgradesTestSuite" + ], + "test": [ + "TestChannelDowngrade_WithICS20v1_Succeeds" + ], + "relayer-type": [ + "hermes" + ] +} \ No newline at end of file diff --git a/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-forwarding-chain-a.json b/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-forwarding-chain-a.json index e161d7ae8a1..1e0f7149632 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-forwarding-chain-a.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-forwarding-chain-a.json @@ -3,6 +3,7 @@ "release-v9.0.x" ], "chain-b": [ + "v9.0.0", "release-v9.0.x" ], "entrypoint": [ diff --git a/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-forwarding-chain-b.json b/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-forwarding-chain-b.json new file mode 100644 index 00000000000..e433e06e97d --- /dev/null +++ b/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-forwarding-chain-b.json @@ -0,0 +1,22 @@ +{ + "chain-a": [ + "v9.0.0", + "release-v9.0.x" + ], + "chain-b": [ + "release-v9.0.x" + ], + "entrypoint": [ + "TransferForwardingTestSuite" + ], + "test": [ + "TestForwarding_Succeeds", + "TestForwarding_WithLastChainBeingICS20v1_Succeeds", + "TestForwardingWithUnwindSucceeds", + "TestFailedForwarding", + "TestChannelUpgradeForwarding_Succeeds" + ], + "relayer-type": [ + "hermes" + ] +} \ No newline at end of file diff --git a/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-multidenom-chain-a.json b/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-multidenom-chain-a.json index 60de14c5609..65c840b313c 100644 --- a/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-multidenom-chain-a.json +++ b/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-multidenom-chain-a.json @@ -3,6 +3,7 @@ "release-v9.0.x" ], "chain-b": [ + "v9.0.0", "release-v9.0.x" ], "entrypoint": [ diff --git a/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-multidenom-chain-b.json b/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-multidenom-chain-b.json new file mode 100644 index 00000000000..2962f7e7d80 --- /dev/null +++ b/.github/compatibility-test-matrices/release-v9.0.x/transfer-v2-multidenom-chain-b.json @@ -0,0 +1,19 @@ +{ + "chain-a": [ + "v9.0.0", + "release-v9.0.x" + ], + "chain-b": [ + "release-v9.0.x" + ], + "entrypoint": [ + "TestTransferTestSuite" + ], + "test": [ + "TestMsgTransfer_Succeeds_Nonincentivized_MultiDenom", + "TestMsgTransfer_Fails_InvalidAddress_MultiDenom" + ], + "relayer-type": [ + "hermes" + ] +} \ No newline at end of file diff --git a/.github/workflows/e2e-manual-simd.yaml b/.github/workflows/e2e-manual-simd.yaml index 94aa86aa425..d2ec7b5c081 100644 --- a/.github/workflows/e2e-manual-simd.yaml +++ b/.github/workflows/e2e-manual-simd.yaml @@ -35,6 +35,7 @@ on: default: main options: - main + - v9.0.0 - v8.5.0 - v8.4.0 - v7.7.0 @@ -52,6 +53,7 @@ on: type: choice options: - main + - v9.0.0 - v8.5.0 - v8.4.0 - v7.7.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ef85b65507..0b9b450e733 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -65,10 +65,11 @@ Ref: https://keepachangelog.com/en/1.0.0/ * (apps/27-interchain-accounts) [\#7277](https://github.com/cosmos/ibc-go/pull/7277) Use `GogoResolver` when populating module query safe allow list to avoid panics from unresolvable protobuf dependencies. * (core/04-channel) [\#7342](https://github.com/cosmos/ibc-go/pull/7342) Read Tx cmd flags including from address to avoid Address cannot be empty error when upgrade-channels via cli. -## v9.0.0 (unreleased) +## [v9.0.0](https://github.com/cosmos/ibc-go/releases/tag/v9.0.0) - 2024-10-01 ### Dependencies +* [\#6828](https://github.com/cosmos/ibc-go/pull/6828) Bump Cosmos SDK to v0.50.9. * [\#6193](https://github.com/cosmos/ibc-go/pull/6193) Bump `cosmossdk.io/store` to v1.1.0. * [\#7126](https://github.com/cosmos/ibc-go/pull/7126) Bump CometBFT to v0.38.11. * [\#6380](https://github.com/cosmos/ibc-go/pull/6380) Bump go to v1.22. @@ -76,16 +77,9 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### API Breaking -* (apps/27-interchain-accounts) [\#4977](https://github.com/cosmos/ibc-go/pull/4977) The `InitModule` function has been removed. -* (core/02-client) [\#5110](https://github.com/cosmos/ibc-go/pull/5110) The `header` attribute has been removed from the `update_client` event. -* (apps/27-interchain-accounts) [\#5396](https://github.com/cosmos/ibc-go/pull/5396) Remove `GetBytes` function of `CosmosTx` type. -* (core/04-channel) [\#5691](https://github.com/cosmos/ibc-go/pull/5691) Remove functions `IsOpen` and `IsClosed` of `Channel` type. -* (core/04-channel) [\#5705](https://github.com/cosmos/ibc-go/pull/5705) Remove functions `GetState`, `GetOrdering`, `GetCounterparty`, `GetConnectionHops`, `GetVersion` of the `Channel` type. -* (core/04-channel) [\#5603](https://github.com/cosmos/ibc-go/pull/5603) Rename attribute names and constants for channel upgrades events. * (core/02-client, light-clients) [\#5806](https://github.com/cosmos/ibc-go/pull/5806) Decouple light client routing from their encoding structure. * (core/04-channel) [\#5991](https://github.com/cosmos/ibc-go/pull/5991) The client CLI `QueryLatestConsensusState` has been removed. * (light-clients/06-solomachine) [\#6037](https://github.com/cosmos/ibc-go/pull/6037) Remove `Initialize` function from `ClientState` and move logic to `Initialize` function of `LightClientModule`. -- (core/04-channel) [\#6063](https://github.com/cosmos/ibc-go/pull/6063) Remove attributes `version`, `ordering` and `connection_hops` from the `channel_upgrade_init`, `channel_upgrade_try`, `channel_upgrade_ack`, `channel_upgrade_open`, `channel_upgrade_timeout` and `channel_upgrade_cancelled` events. * (light-clients/06-solomachine) [\#6230](https://github.com/cosmos/ibc-go/pull/6230) Remove `GetTimestampAtHeight`, `Status` and `UpdateStateOnMisbehaviour` functions from `ClientState` and move logic to functions of `LightClientModule`. * (core/02-client) [\#6084](https://github.com/cosmos/ibc-go/pull/6084) Removed `stakingKeeper` as an argument to `NewKeeper` and replaced with a `ConsensusHost` implementation. * (testing) [\#6070](https://github.com/cosmos/ibc-go/pull/6070) Remove `AssertEventsLegacy` function. @@ -93,7 +87,6 @@ Ref: https://keepachangelog.com/en/1.0.0/ * (core/04-channel) [\#6023](https://github.com/cosmos/ibc-go/pull/6023) Remove emission of non-hexlified event attributes `packet_data` and `packet_ack`. * (core) [\#6320](https://github.com/cosmos/ibc-go/pull/6320) Remove unnecessary `Proof` interface from `exported` package. * (core/05-port) [\#6341](https://github.com/cosmos/ibc-go/pull/6341) Modify `UnmarshalPacketData` interface to take in the context, portID, and channelID. This allows for packet data's to be unmarshaled based on the channel version. -* (core/05-port) [\#6341](https://github.com/cosmos/ibc-go/pull/6988) Modify `UnmarshalPacketData` interface to return the underlying application version. * (apps/27-interchain-accounts) [\#6433](https://github.com/cosmos/ibc-go/pull/6433) Use UNORDERED as the default ordering for new ICA channels. * (apps/transfer) [\#6440](https://github.com/cosmos/ibc-go/pull/6440) Remove `GetPrefixedDenom`. * (apps/transfer) [\#6508](https://github.com/cosmos/ibc-go/pull/6508) Remove the `DenomTrace` type. @@ -108,12 +101,10 @@ Ref: https://keepachangelog.com/en/1.0.0/ * (light-clients/06-solomachine, light-clients/07-tendermint) [\#6891](https://github.com/cosmos/ibc-go/pull/6891) The `VerifyMembership` and `VerifyNonMembership` functions of solomachine's `ClientState` have been made private. The `VerifyMembership`, `VerifyNonMembership`, `GetTimestampAtHeight`, `Status` and `Initialize` functions of tendermint's `ClientState` have been made private. * (core/04-channel) [\#6902](https://github.com/cosmos/ibc-go/pull/6902) Add channel version to core application callbacks. * (core/03-connection, core/02-client) [\#6937](https://github.com/cosmos/ibc-go/pull/6937) Remove 'ConsensusHost' interface, also removing self client and consensus state validation in the connection handshake. -* (core/24-host) [\#6882](https://github.com/cosmos/ibc-go/issues/6882) All functions ending in `Path` have been removed from 24-host in favour of their sibling functions ending in `Key`. -* (apps/27-interchain-accounts) [\#7053](https://github.com/cosmos/ibc-go/pull/7053) Remove ICS27 channel capability migration introduced in v6. +* (core/24-host) [\#6882](https://github.com/cosmos/ibc-go/issues/6882) All functions ending in `Path` have been removed from 24-host in favour of their sybling functions ending in `Key`. ### State Machine Breaking -* (light-clients/07-tendermint) [\#6276](https://github.com/cosmos/ibc-go/pull/6276) Fix: No-op to avoid panicking on `UpdateState` for invalid misbehaviour submissions. * (light-clients/06-solomachine) [\#6313](https://github.com/cosmos/ibc-go/pull/6313) Fix: No-op to avoid panicking on `UpdateState` for invalid misbehaviour submissions. ### Improvements diff --git a/README.md b/README.md index edf83ebf8fe..0aa4762a1b1 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ For the latest expected release timelines, please check [here](https://github.co ## Releases -The release lines currently supported are v7 and v8. +The release lines currently supported are v7, v8 and v9. Please refer to the [Stable Release Policy section of RELEASES.md](https://github.com/cosmos/ibc-go/blob/main/RELEASES.md#stable-release-policy) for more details. diff --git a/RELEASES.md b/RELEASES.md index 9e4d06f6764..287d9994c52 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -78,6 +78,7 @@ We reserve the right to drop support for releases if they are deemed unused (for |`v7.8.x`|March 17, 2025| |`v8.4.x`|May 10, 2025| |`v8.5.x`|May 10, 2025| +|`v9.0.x`|October 1, 2025| ### Callbacks middleware @@ -133,6 +134,7 @@ Versions of Golang, Cosmos SDK and CometBFT used by ibc-go in the currently acti | 1.19 | v7.8.0 | v0.47.13 | v0.37.5 | | 1.21 | v8.4.0 | v0.50.7 | v0.38.7 | | 1.21 | v8.5.0 | v0.50.9 | v0.38.11 | +| 1.22 | v9.0.0 | v0.50.9 | v0.38.11 | ### Callbacks middleware diff --git a/docs/versioned_docs/version-v9.0.x/00-intro.md b/docs/versioned_docs/version-v9.0.x/00-intro.md new file mode 100644 index 00000000000..a21bdf40058 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/00-intro.md @@ -0,0 +1,36 @@ +--- +slug: / +sidebar_position: 0 +--- + +# IBC-Go Documentation + +Welcome to the documentation for IBC-Go, the Golang implementation of the Inter-Blockchain Communication Protocol! Looking for information on ibc-rs? [Click here to go to the ibc-rs github repo](https://github.com/cosmos/ibc-rs). + +The Inter-Blockchain Communication Protocol (IBC) is an end-to-end, connection-oriented, stateful protocol for reliable, ordered, and authenticated communication between heterogeneous blockchains arranged in an unknown and dynamic topology. + +IBC is a protocol that allows blockchains to talk to each other. Chains that speak IBC can share any type of data as long as it's encoded in bytes, enabling the industry’s most feature-rich cross-chain interactions. IBC is secure and permissionless. + +The protocol realizes this interoperability by specifying a set of data structures, abstractions, and semantics that can be implemented by any distributed ledger that satisfies a small set of requirements. + +IBC can be used to build a wide range of cross-chain applications that include token transfers, atomic swaps, multi-chain smart contracts (with or without mutually comprehensible VMs), cross-chain account control, and data and code sharding of various kinds. + +## High-level overview of IBC + +The following diagram shows how IBC works at a high level: + +![Light Mode IBC Overview](./images/ibcoverview-light.svg#gh-light-mode-only)![Dark Mode IBC Overview](./images/ibcoverview-dark.svg#gh-dark-mode-only) + +The transport layer (TAO) provides the necessary infrastructure to establish secure connections and authenticate data packets between chains. The application layer builds on top of the transport layer and defines exactly how data packets should be packaged and interpreted by the sending and receiving chains. + +IBC provides a reliable, permissionless, and generic base layer (allowing for the secure relaying of data packets), while allowing for composability and modularity with separation of concerns by moving application designs (interpreting and acting upon the packet data) to a higher-level layer. This separation is reflected in the categories: + +- **IBC/TAO** comprises the Transport, Authentication, and Ordering of packets, i.e. the infrastructure layer. +- **IBC/APP** consists of the application handlers for the data packets being passed over the transport layer. These include but are not limited to fungible token transfers (ICS-20), NFT transfers (ICS-721), and interchain accounts (ICS-27). +- **Application module:** groups any application, middleware or smart contract that may wrap downstream application handlers to provide enhanced functionality. + +Note three crucial elements in the diagram: + +- The chains depend on relayers to communicate. [Relayers](https://github.com/cosmos/ibc/blob/main/spec/relayer/ics-018-relayer-algorithms/README.md) are the "physical" connection layer of IBC: off-chain processes responsible for relaying data between two chains running the IBC protocol by scanning the state of each chain, constructing appropriate datagrams, and executing them on the opposite chain as is allowed by the protocol. +- Many relayers can serve one or more channels to send messages between the chains. +- Each side of the connection uses the light client of the other chain to quickly verify incoming messages. diff --git a/docs/versioned_docs/version-v9.0.x/01-ibc/01-overview.md b/docs/versioned_docs/version-v9.0.x/01-ibc/01-overview.md new file mode 100644 index 00000000000..d2918a09519 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/01-ibc/01-overview.md @@ -0,0 +1,293 @@ +--- +title: Overview +sidebar_label: Overview +sidebar_position: 1 +slug: /ibc/overview +--- + +# Overview + +:::note Synopsis +Learn about IBC, its components, and its use cases. +::: + +## What is the Inter-Blockchain Communication Protocol (IBC)? + +This document serves as a guide for developers who want to write their own Inter-Blockchain +Communication Protocol (IBC) applications for custom use cases. + +> IBC applications must be written as self-contained modules. + +Due to the modular design of the IBC Protocol, IBC +application developers do not need to be concerned with the low-level details of clients, +connections, and proof verification. + +This brief explanation of the lower levels of the +stack gives application developers a broad understanding of the IBC +Protocol. Abstraction layer details for channels and ports are most relevant for application developers and describe how to define custom packets and `IBCModule` callbacks. + +The requirements to have your module interact over IBC are: + +- Bind to a port or ports. +- Define your packet data. +- Use the default acknowledgment struct provided by core IBC or optionally define a custom acknowledgment struct. +- Standardize an encoding of the packet data. +- Implement the `IBCModule` interface. +- Implement the `UpgradableModule` interface (optional). + +Read on for a detailed explanation of how to write a self-contained IBC application module. + +## Components overview + +### [Clients](https://github.com/cosmos/ibc-go/blob/main/modules/core/02-client) + +IBC clients are on-chain light clients. Each light client is identified by a unique client ID. +IBC clients track the consensus states of other blockchains, along with the proof spec necessary to +properly verify proofs against the client's consensus state. A client can be associated with any number +of connections to the counterparty chain. The client identifier is auto generated using the client type +and the global client counter appended in the format: `{client-type}-{N}`. + +A `ClientState` should contain chain specific and light client specific information necessary for verifying updates +and upgrades to the IBC client. The `ClientState` may contain information such as chain ID, latest height, proof specs, +unbonding periods or the status of the light client. The `ClientState` should not contain information that +is specific to a given block at a certain height, this is the function of the `ConsensusState`. Each `ConsensusState` +should be associated with a unique block and should be referenced using a height. IBC clients are given a +client identifier prefixed store to store their associated client state and consensus states along with +any metadata associated with the consensus states. Consensus states are stored using their associated height. + +The supported IBC clients are: + +- [Solo Machine light client](https://github.com/cosmos/ibc-go/blob/main/modules/light-clients/06-solomachine): Devices such as phones, browsers, or laptops. +- [Tendermint light client](https://github.com/cosmos/ibc-go/blob/main/modules/light-clients/07-tendermint): The default for Cosmos SDK-based chains. +- [Wasm client](https://github.com/cosmos/ibc-go/blob/main/modules/light-clients/08-wasm): Proxy client useful for running light clients written in a Wasm-compilable language. +- [Localhost (loopback) client](https://github.com/cosmos/ibc-go/blob/main/modules/light-clients/09-localhost): Useful for testing, simulation, and relaying packets to modules on the same application. + +### IBC client heights + +IBC Client Heights are represented by the struct: + +```go +type Height struct { + RevisionNumber uint64 + RevisionHeight uint64 +} +``` + +The `RevisionNumber` represents the revision of the chain that the height is representing. +A revision typically represents a continuous, monotonically increasing range of block-heights. +The `RevisionHeight` represents the height of the chain within the given revision. + +On any reset of the `RevisionHeight`—for example, when hard-forking a Tendermint chain, +the `RevisionNumber` will get incremented. This allows IBC clients to distinguish between a +block height `n` of a previous revision of the chain (at revision `p`) and block-height `n` of the current +revision of the chain (at revision `e`). + +`Height`s that share the same revision number can be compared by simply comparing their respective `RevisionHeight`s. +`Height`s that do not share the same revision number will only be compared using their respective `RevisionNumber`s. +Thus a height `h` with revision number `e+1` will always be greater than a height `g` with revision number `e`, +**REGARDLESS** of the difference in revision heights. + +For example: + +```go +Height{RevisionNumber: 3, RevisionHeight: 0} > Height{RevisionNumber: 2, RevisionHeight: 100000000000} +``` + +When a Tendermint chain is running a particular revision, relayers can simply submit headers and proofs with the revision number +given by the chain's `chainID`, and the revision height given by the Tendermint block height. When a chain updates using a hard-fork +and resets its block-height, it is responsible for updating its `chainID` to increment the revision number. +IBC Tendermint clients then verifies the revision number against their `chainID` and treat the `RevisionHeight` as the Tendermint block-height. + +Tendermint chains wishing to use revisions to maintain persistent IBC connections even across height-resetting upgrades must format their `chainID`s +in the following manner: `{chainID}-{revision_number}`. On any height-resetting upgrade, the `chainID` **MUST** be updated with a higher revision number +than the previous value. + +For example: + +- Before upgrade `chainID`: `gaiamainnet-3` +- After upgrade `chainID`: `gaiamainnet-4` + +Clients that do not require revisions, such as the `06-solomachine` client, can simply hardcode `0` into the revision number whenever they +need to return an IBC height when implementing IBC interfaces and use the `RevisionHeight` exclusively. + +Other client types can implement their own logic to verify the IBC heights that relayers provide in their `Update`, `Misbehavior`, and +`Verify` functions respectively. + +The IBC interfaces expect an `ibcexported.Height` interface, however all clients must use the concrete implementation provided in +`02-client/types` and reproduced above. + +### [Connections](https://github.com/cosmos/ibc-go/blob/main/modules/core/03-connection) + +Connections encapsulate two [`ConnectionEnd`](https://github.com/cosmos/ibc-go/blob/v8.0.0/proto/ibc/core/connection/v1/connection.proto#L17) +objects on two separate blockchains. Each `ConnectionEnd` is associated with a client of the +other blockchain (for example, the counterparty blockchain). The connection handshake is responsible +for verifying that the light clients on each chain are correct for their respective counterparties. +Connections, once established, are responsible for facilitating all cross-chain verifications of IBC state. +A connection can be associated with any number of channels. + +The connection handshake is a 4-step handshake. Briefly, if a given chain A wants to open a connection with +chain B using already established light clients on both chains: + +1. chain A sends a `ConnectionOpenInit` message to signal a connection initialization attempt with chain B. +2. chain B sends a `ConnectionOpenTry` message to try opening the connection on chain A. +3. chain A sends a `ConnectionOpenAck` message to mark its connection end state as open. +4. chain B sends a `ConnectionOpenConfirm` message to mark its connection end state as open. + +#### Time delayed connections + +Connections can be opened with a time delay by setting the `delay_period` field (in nanoseconds) in the [`MsgConnectionOpenInit`](https://github.com/cosmos/ibc-go/blob/v8.0.0/proto/ibc/core/connection/v1/tx.proto#L45). +The time delay is used to require that the underlying light clients have been updated to a certain height before commitment verification can be performed. + +`delayPeriod` is used in conjunction with the [`max_expected_time_per_block`](https://github.com/cosmos/ibc-go/blob/v8.0.0/proto/ibc/core/connection/v1/connection.proto#L113) parameter of the connection submodule to determine the `blockDelay`, which is number of blocks that the connection must be delayed by. + +When commitment verification is performed, the connection submodule will pass `delayPeriod` and `blockDelay` to the light client. It is up to the light client to determine whether the light client has been updated to the required height. Only the following light clients in `ibc-go` support time delayed connections: + +- `07-tendermint` +- `08-wasm` (passed to the contact) + +### [Proofs](https://github.com/cosmos/ibc-go/blob/main/modules/core/23-commitment) and [paths](https://github.com/cosmos/ibc-go/blob/main/modules/core/24-host) + +In IBC, blockchains do not directly pass messages to each other over the network. Instead, to +communicate, a blockchain commits some state to a specifically defined path that is reserved for a +specific message type and a specific counterparty. For example, for storing a specific connectionEnd as part +of a handshake or a packet intended to be relayed to a module on the counterparty chain. A relayer +process monitors for updates to these paths and relays messages by submitting the data stored +under the path and a proof to the counterparty chain. + +Proofs are passed from core IBC to light clients as bytes. It is up to light client implementations to interpret these bytes appropriately. + +- The paths that all IBC implementations must use for committing IBC messages is defined in +[ICS-24 Host State Machine Requirements](https://github.com/cosmos/ics/tree/master/spec/core/ics-024-host-requirements). +- The proof format that all implementations must be able to produce and verify is defined in [ICS-23 Proofs](https://github.com/cosmos/ics23) implementation. + +### [Ports](https://github.com/cosmos/ibc-go/blob/main/modules/core/05-port) + +An IBC module can bind to any number of ports. Each port must be identified by a unique `portID`. +Since IBC is designed to be secure with mutually distrusted modules operating on the same ledger, +binding a port returns a dynamic object capability. In order to take action on a particular port +(for example, an open channel with its port ID), a module must provide the dynamic object capability to the IBC +handler. This requirement prevents a malicious module from opening channels with ports it does not own. Thus, +IBC modules are responsible for claiming the capability that is returned on `BindPort`. + +### [Channels](https://github.com/cosmos/ibc-go/blob/main/modules/core/04-channel) + +An IBC channel can be established between two IBC ports. Currently, a port is exclusively owned by a +single module. IBC packets are sent over channels. Just as IP packets contain the destination IP +address and IP port, and the source IP address and source IP port, IBC packets contain +the destination port ID and channel ID, and the source port ID and channel ID. This packet structure enables IBC to +correctly route packets to the destination module while allowing modules receiving packets to +know the sender module. + +A channel can be `ORDERED`, where packets from a sending module must be processed by the +receiving module in the order they were sent. Or a channel can be `UNORDERED`, where packets +from a sending module are processed in the order they arrive (might be in a different order than they were sent). + +Modules can choose which channels they wish to communicate over with, thus IBC expects modules to +implement callbacks that are called during the channel handshake. These callbacks can do custom +channel initialization logic. If any callback returns an error, the channel handshake fails. Thus, by +returning errors on callbacks, modules can programmatically reject and accept channels. + +The channel handshake is a 4-step handshake. Briefly, if a given chain A wants to open a channel with +chain B using an already established connection: + +1. chain A sends a `ChanOpenInit` message to signal a channel initialization attempt with chain B. +2. chain B sends a `ChanOpenTry` message to try opening the channel on chain A. +3. chain A sends a `ChanOpenAck` message to mark its channel end status as open. +4. chain B sends a `ChanOpenConfirm` message to mark its channel end status as open. + +If all handshake steps are successful, the channel is opened on both sides. At each step in the handshake, the module +associated with the `ChannelEnd` executes its callback. So +on `ChanOpenInit`, the module on chain A executes its callback `OnChanOpenInit`. + +The channel identifier is auto derived in the format: `channel-{N}` where `N` is the next sequence to be used. + +#### Closing channels + +Closing a channel occurs in 2 handshake steps as defined in [ICS 04](https://github.com/cosmos/ibc/tree/master/spec/core/ics-004-channel-and-packet-semantics). +Once a channel is closed, it cannot be reopened. The channel handshake steps are: + +**`ChanCloseInit`** closes a channel on the executing chain if + +- the channel exists and it is not already closed, +- the connection it exists upon is `OPEN`, +- the [IBC module callback `OnChanCloseInit`](./03-apps/02-ibcmodule.md#channel-closing-callbacks) returns `nil`. + +`ChanCloseInit` can be initiated by any user by submitting a `MsgChannelCloseInit` transaction. +Note that channels are automatically closed when a packet times out on an `ORDERED` channel. +A timeout on an `ORDERED` channel skips the `ChanCloseInit` step and immediately closes the channel. + +**`ChanCloseConfirm`** is a response to a counterparty channel executing `ChanCloseInit`. The channel +on the executing chain closes if + +- the channel exists and is not already closed, +- the connection the channel exists upon is `OPEN`, +- the executing chain successfully verifies that the counterparty channel has been closed +- the [IBC module callback `OnChanCloseConfirm`](./03-apps/02-ibcmodule.md#channel-closing-callbacks) returns `nil`. + +Currently, none of the IBC applications provided in ibc-go support `ChanCloseInit`. + +### [Packets](https://github.com/cosmos/ibc-go/blob/main/modules/core/04-channel) + +Modules communicate with each other by sending packets over IBC channels. All +IBC packets contain the destination `portID` and `channelID` along with the source `portID` and +`channelID`. This packet structure allows modules to know the sender module of a given packet. IBC packets +contain a sequence to optionally enforce ordering. + +IBC packets also contain a `TimeoutHeight` and a `TimeoutTimestamp` that determine the deadline before the receiving module must process a packet. + +Modules send custom application data to each other inside the `Data` `[]byte` field of the IBC packet. +Thus, packet data is opaque to IBC handlers. It is incumbent on a sender module to encode +their application-specific packet information into the `Data` field of packets. The receiver +module must decode that `Data` back to the original application data. + +### [Receipts and timeouts](https://github.com/cosmos/ibc-go/blob/main/modules/core/04-channel) + +Since IBC works over a distributed network and relies on potentially faulty relayers to relay messages between ledgers, +IBC must handle the case where a packet does not get sent to its destination in a timely manner or at all. Packets must +specify a non-zero value for timeout height (`TimeoutHeight`) or timeout timestamp (`TimeoutTimestamp` ) after which a packet can no longer be successfully received on the destination chain. + +- The `timeoutHeight` indicates a consensus height on the destination chain after which the packet is no longer to be processed, and instead counts as having timed-out. +- The `timeoutTimestamp` indicates a timestamp on the destination chain after which the packet is no longer to be processed, and instead counts as having timed-out. + +If the timeout passes without the packet being successfully received, the packet can no longer be +received on the destination chain. The sending module can timeout the packet and take appropriate actions. + +If the timeout is reached, then a proof of packet timeout can be submitted to the original chain. The original chain can then perform +application-specific logic to timeout the packet, perhaps by rolling back the packet send changes (refunding senders any locked funds, etc). + +- In `ORDERED` channels, a timeout of a single packet in the channel causes the channel to close. + + - If packet sequence `n` times out, then a packet at sequence `k > n` cannot be received without violating the contract of `ORDERED` channels that packets are processed in the order that they are sent. + - Since `ORDERED` channels enforce this invariant, a proof that sequence `n` has not been received on the destination chain by the specified timeout of packet `n` is sufficient to timeout packet `n` and close the channel. + +- In `UNORDERED` channels, the application-specific timeout logic for that packet is applied and the channel is not closed. + + - Packets can be received in any order. + - IBC writes a packet receipt for each sequence received in the `UNORDERED` channel. This receipt does not contain information; it is simply a marker intended to signify that the `UNORDERED` channel has received a packet at the specified sequence. + - To timeout a packet on an `UNORDERED` channel, a proof is required that a packet receipt **does not exist** for the packet's sequence by the specified timeout. + +For this reason, most modules should use `UNORDERED` channels as they require fewer liveness guarantees to function effectively for users of that channel. + +### [Acknowledgments](https://github.com/cosmos/ibc-go/blob/main/modules/core/04-channel) + +Modules can also choose to write application-specific acknowledgments upon processing a packet. Acknowledgments can be done: + +- Synchronously on `OnRecvPacket` if the module processes packets as soon as they are received from IBC module. +- Asynchronously if module processes packets at some later point after receiving the packet. + +This acknowledgment data is opaque to IBC much like the packet `Data` and is treated by IBC as a simple byte string `[]byte`. Receiver modules must encode their acknowledgment so that the sender module can decode it correctly. The encoding must be negotiated between the two parties during version negotiation in the channel handshake. + +The acknowledgment can encode whether the packet processing succeeded or failed, along with additional information that allows the sender module to take appropriate action. + +After the acknowledgment has been written by the receiving chain, a relayer relays the acknowledgment back to the original sender module. + +The original sender module then executes application-specific acknowledgment logic using the contents of the acknowledgment. + +- After an acknowledgement fails, packet-send changes can be rolled back (for example, refunding senders in ICS 20). +- After an acknowledgment is received successfully on the original sender on the chain, the corresponding packet commitment is deleted since it is no longer needed. + +## Further readings and specs + +If you want to learn more about IBC, check the following specifications: + +- [IBC specification overview](https://github.com/cosmos/ibc/blob/master/README.md) diff --git a/docs/versioned_docs/version-v9.0.x/01-ibc/02-integration.md b/docs/versioned_docs/version-v9.0.x/01-ibc/02-integration.md new file mode 100644 index 00000000000..def03102de0 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/01-ibc/02-integration.md @@ -0,0 +1,305 @@ +--- +title: Integration +sidebar_label: Integration +sidebar_position: 2 +slug: /ibc/integration +--- + +# Integration + +:::note Synopsis +Learn how to integrate IBC to your application and send data packets to other chains. +::: + +This document outlines the required steps to integrate and configure the [IBC +module](https://github.com/cosmos/ibc-go/tree/main/modules/core) to your Cosmos SDK application and +send fungible token transfers to other chains. + +## Integrating the IBC module + +Integrating the IBC module to your SDK-based application is straightforward. The general changes can be summarized in the following steps: + +- [Define additional `Keeper` fields for the new modules on the `App` type](#add-application-fields-to-app). +- [Add the module's `StoreKey`s and initialize their `Keeper`s](#configure-the-keepers). +- [Set up IBC router and add route for the `transfer` module](#register-module-routes-in-the-ibc-router). +- [Grant permissions to `transfer`'s `ModuleAccount`](#module-account-permissions). +- [Add the modules to the module `Manager`](#module-manager-and-simulationmanager). +- [Update the module `SimulationManager` to enable simulations](#module-manager-and-simulationmanager). +- [Integrate light client modules (e.g. `07-tendermint`)](#integrating-light-clients). +- [Add modules to `Begin/EndBlockers` and `InitGenesis`](#application-abci-ordering). + +### Add application fields to `App` + +We need to register the core `ibc` and `transfer` `Keeper`s as follows: + +```go title="app.go" +import ( + // other imports + // ... + ibckeeper "github.com/cosmos/ibc-go/v9/modules/core/keeper" + ibctransferkeeper "github.com/cosmos/ibc-go/v9/modules/apps/transfer/keeper" +) + +type App struct { + // baseapp, keys and subspaces definitions + + // other keepers + // ... + IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly + TransferKeeper ibctransferkeeper.Keeper // for cross-chain fungible token transfers + + // ... + // module and simulation manager definitions +} +``` + +### Configure the `Keeper`s + +During initialization, besides initializing the IBC `Keeper`s (for core `ibc` and `transfer` modules), we need to grant specific capabilities through the capability module `ScopedKeeper`s so that we can authenticate the object-capability permissions for each of the IBC channels. + +```go +import ( + // other imports + // ... + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + + capabilitykeeper "github.com/cosmos/ibc-go/modules/capability/keeper" + capabilitytypes "github.com/cosmos/ibc-go/modules/capability/types" + ibcexported "github.com/cosmos/ibc-go/v9/modules/core/exported" + ibckeeper "github.com/cosmos/ibc-go/v9/modules/core/keeper" + "github.com/cosmos/ibc-go/v9/modules/apps/transfer" + ibctransfertypes "github.com/cosmos/ibc-go/v9/modules/apps/transfer/types" + ibctm "github.com/cosmos/ibc-go/v9/modules/light-clients/07-tendermint" +) + +func NewApp(...args) *App { + // define codecs and baseapp + + // add capability keeper and ScopeToModule for ibc module + app.CapabilityKeeper = capabilitykeeper.NewKeeper( + appCodec, + keys[capabilitytypes.StoreKey], + memKeys[capabilitytypes.MemStoreKey], + ) + + // grant capabilities for the ibc and transfer modules + scopedIBCKeeper := app.CapabilityKeeper.ScopeToModule(ibcexported.ModuleName) + scopedTransferKeeper := app.CapabilityKeeper.ScopeToModule(ibctransfertypes.ModuleName) + + // ... other module keepers + + // Create IBC Keeper + app.IBCKeeper = ibckeeper.NewKeeper( + appCodec, + keys[ibcexported.StoreKey], + app.GetSubspace(ibcexported.ModuleName), + app.UpgradeKeeper, + scopedIBCKeeper, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + ) + + // Create Transfer Keeper + app.TransferKeeper = ibctransferkeeper.NewKeeper( + appCodec, + keys[ibctransfertypes.StoreKey], + app.GetSubspace(ibctransfertypes.ModuleName), + app.IBCKeeper.ChannelKeeper, + app.IBCKeeper.ChannelKeeper, + app.IBCKeeper.PortKeeper, + app.AccountKeeper, + app.BankKeeper, + scopedTransferKeeper, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + ) + transferModule := transfer.NewIBCModule(app.TransferKeeper) + + // ... continues +} +``` + +### Register module routes in the IBC `Router` + +IBC needs to know which module is bound to which port so that it can route packets to the +appropriate module and call the appropriate callbacks. The port to module name mapping is handled by +IBC's port `Keeper`. However, the mapping from module name to the relevant callbacks is accomplished +by the port +[`Router`](https://github.com/cosmos/ibc-go/blob/main/modules/core/05-port/types/router.go) on the +`ibc` module. + +Adding the module routes allows the IBC handler to call the appropriate callback when processing a +channel handshake or a packet. + +Currently, a `Router` is static so it must be initialized and set correctly on app initialization. +Once the `Router` has been set, no new routes can be added. + +```go title="app.go" +import ( + // other imports + // ... + porttypes "github.com/cosmos/ibc-go/v9/modules/core/05-port/types" + ibctransfertypes "github.com/cosmos/ibc-go/v9/modules/apps/transfer/types" +) + +func NewApp(...args) *App { + // .. continuation from above + + // Create static IBC router, add transfer module route, then set and seal it + ibcRouter := porttypes.NewRouter() + ibcRouter.AddRoute(ibctransfertypes.ModuleName, transferModule) + // Setting Router will finalize all routes by sealing router + // No more routes can be added + app.IBCKeeper.SetRouter(ibcRouter) + + // ... continues +``` + +### Module `Manager` and `SimulationManager` + +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/build/building-modules/14-simulator.md). + +```go title="app.go" +import ( + // other imports + // ... + "github.com/cosmos/cosmos-sdk/types/module" + + ibc "github.com/cosmos/ibc-go/v9/modules/core" + "github.com/cosmos/ibc-go/v9/modules/apps/transfer" +) + +func NewApp(...args) *App { + // ... continuation from above + + app.ModuleManager = module.NewManager( + // other modules + // ... + // highlight-start ++ ibc.NewAppModule(app.IBCKeeper), ++ transfer.NewAppModule(app.TransferKeeper), + // highlight-end + ) + + // ... + + app.simulationManager = module.NewSimulationManagerFromAppModules( + // other modules + // ... + app.ModuleManager.Modules, + map[string]module.AppModuleSimulation{}, + ) + + // ... continues +``` + +### Module account permissions + +After that, we need to grant `Minter` and `Burner` permissions to +the `transfer` `ModuleAccount` to mint and burn relayed tokens. + +```go title="app.go" +import ( + // other imports + // ... + "github.com/cosmos/cosmos-sdk/types/module" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + + // highlight-next-line ++ ibctransfertypes "github.com/cosmos/ibc-go/v9/modules/apps/transfer/types" +) + +// app.go +var ( + // module account permissions + maccPerms = map[string][]string{ + // other module accounts permissions + // ... + ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner}, + } +) +``` + +#### Integrating light clients + +> Note that from v9 onwards, all light clients are expected to implement the [`LightClientInterface` interface](../03-light-clients/01-developer-guide/02-light-client-module.md#implementing-the-lightclientmodule-interface) defined by core IBC, and have to be explicitly registered in a chain's app.go. This is in contrast to earlier versions of ibc-go when `07-tendermint` and `06-solomachine` were added out of the box. Follow the steps below to integrate the `07-tendermint` light client. + +All light clients must be registered with `module.Manager` in a chain's app.go file. + +The following code example shows how to instantiate `07-tendermint` light client module and register its `ibctm.AppModule`. + +```go title="app.go" +import ( + // other imports + // ... + "github.com/cosmos/cosmos-sdk/types/module" + // highlight-next-line ++ ibctm "github.com/cosmos/ibc-go/v9/modules/light-clients/07-tendermint" +) + +// app.go +// after sealing the IBC router + +storeProvider := app.IBCKeeper.ClientKeeper.GetStoreProvider() + +tmLightClientModule := ibctm.NewLightClientModule(appCodec, storeProvider) +app.IBCKeeper.ClientKeeper.AddRoute(ibctm.ModuleName, &tmLightClientModule) +app.ModuleManager = module.NewManager( + // ... + ibc.NewAppModule(app.IBCKeeper), + transfer.NewAppModule(app.TransferKeeper), // i.e ibc-transfer module + + // register light clients on IBC + // highlight-next-line ++ ibctm.NewAppModule(tmLightClientModule), +) +``` + +### Application ABCI ordering + +One addition from IBC is the concept of `HistoricalInfo` which is stored in the Cosmos SDK `x/staking` module. The number of records stored by `x/staking` is controlled by the `HistoricalEntries` parameter which stores `HistoricalInfo` on a per height basis. +Each entry contains the historical information for the `Header` and `ValidatorSet` of this chain which is stored +at each height during the `BeginBlock` call. The `HistoricalInfo` is required to introspect a blockchain's prior state at a given height in order to verify the light client `ConsensusState` during the +connection handshake. + +```go title="app.go" +import ( + // other imports + // ... + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + ibcexported "github.com/cosmos/ibc-go/v9/modules/core/exported" + ibckeeper "github.com/cosmos/ibc-go/v9/modules/core/keeper" + ibctransfertypes "github.com/cosmos/ibc-go/v9/modules/apps/transfer/types" +) + +func NewApp(...args) *App { + // ... continuation from above + + // add x/staking, ibc and transfer modules to BeginBlockers + app.ModuleManager.SetOrderBeginBlockers( + // other modules ... + stakingtypes.ModuleName, + ibcexported.ModuleName, + ibctransfertypes.ModuleName, + ) + app.ModuleManager.SetOrderEndBlockers( + // other modules ... + stakingtypes.ModuleName, + ibcexported.ModuleName, + ibctransfertypes.ModuleName, + ) + + // ... + + genesisModuleOrder := []string{ + // other modules + // ... + ibcexported.ModuleName, + ibctransfertypes.ModuleName, + } + app.ModuleManager.SetOrderInitGenesis(genesisModuleOrder...) + + // ... continues +``` + +That's it! You have now wired up the IBC module and the `transfer` module, and are now able to send fungible tokens across +different chains. If you want to have a broader view of the changes take a look into the SDK's +[`SimApp`](https://github.com/cosmos/ibc-go/blob/main/testing/simapp/app.go). diff --git a/docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/01-apps.md b/docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/01-apps.md new file mode 100644 index 00000000000..dba8f1e903f --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/01-apps.md @@ -0,0 +1,444 @@ +--- +title: IBC Applications +sidebar_label: IBC Applications +sidebar_position: 1 +slug: /ibc/apps/apps +--- + +# IBC Applications + +Learn how to configure your application to use IBC and send data packets to other chains. + +This document serves as a guide for developers who want to write their own Inter-blockchain +Communication Protocol (IBC) applications for custom use cases. + +Due to the modular design of the IBC protocol, IBC +application developers do not need to concern themselves with the low-level details of clients, +connections, and proof verification. Nevertheless a brief explanation of the lower levels of the +stack is given so that application developers may have a high-level understanding of the IBC +protocol. Then the document goes into detail on the abstraction layer most relevant for application +developers (channels and ports), and describes how to define your own custom packets, and +`IBCModule` callbacks. + +To have your module interact over IBC you must: bind to a port(s), define your own packet data and acknowledgement structs as well as how to encode/decode them, and implement the +`IBCModule` interface. Below is a more detailed explanation of how to write an IBC application +module correctly. + +:::note + +## Pre-requisites Readings + +- [IBC Overview](../01-overview.md) +- [IBC default integration](../02-integration.md) + +::: + +## Create a custom IBC application module + +### Implement `IBCModule` Interface and callbacks + +The Cosmos SDK expects all IBC modules to implement the [`IBCModule` +interface](https://github.com/cosmos/ibc-go/tree/main/modules/core/05-port/types/module.go). This +interface contains all of the callbacks IBC expects modules to implement. This section will describe +the callbacks that are called during channel handshake execution. + +Here are the channel handshake callbacks that modules are expected to implement: + +```go +// Called by IBC Handler on MsgOpenInit +func (k Keeper) OnChanOpenInit(ctx sdk.Context, + order channeltypes.Order, + connectionHops []string, + portID string, + channelID string, + counterparty channeltypes.Counterparty, + version string, +) error { + + // ... do custom initialization logic + + // Use above arguments to determine if we want to abort handshake + // Examples: Abort if order == UNORDERED, + // Abort if version is unsupported + err := checkArguments(args) + return err +} + +// Called by IBC Handler on MsgOpenTry +OnChanOpenTry( + ctx sdk.Context, + order channeltypes.Order, + connectionHops []string, + portID, + channelID string, + counterparty channeltypes.Counterparty, + counterpartyVersion string, +) (string, error) { + // ... do custom initialization logic + + // Use above arguments to determine if we want to abort handshake + if err := checkArguments(args); err != nil { + return err + } + + // Construct application version + // IBC applications must return the appropriate application version + // This can be a simple string or it can be a complex version constructed + // from the counterpartyVersion and other arguments. + // The version returned will be the channel version used for both channel ends. + appVersion := negotiateAppVersion(counterpartyVersion, args) + + return appVersion, nil +} + +// Called by IBC Handler on MsgOpenAck +OnChanOpenAck( + ctx sdk.Context, + portID, + channelID string, + counterpartyVersion string, +) error { + // ... do custom initialization logic + + // Use above arguments to determine if we want to abort handshake + err := checkArguments(args) + return err +} + +// Called by IBC Handler on MsgOpenConfirm +OnChanOpenConfirm( + ctx sdk.Context, + portID, + channelID string, +) error { + // ... do custom initialization logic + + // Use above arguments to determine if we want to abort handshake + err := checkArguments(args) + return err +} +``` + +The channel closing handshake will also invoke module callbacks that can return errors to abort the +closing handshake. Closing a channel is a 2-step handshake, the initiating chain calls +`ChanCloseInit` and the finalizing chain calls `ChanCloseConfirm`. + +```go +// Called by IBC Handler on MsgCloseInit +OnChanCloseInit( + ctx sdk.Context, + portID, + channelID string, +) error { + // ... do custom finalization logic + + // Use above arguments to determine if we want to abort handshake + err := checkArguments(args) + return err +} + +// Called by IBC Handler on MsgCloseConfirm +OnChanCloseConfirm( + ctx sdk.Context, + portID, + channelID string, +) error { + // ... do custom finalization logic + + // Use above arguments to determine if we want to abort handshake + err := checkArguments(args) + return err +} +``` + +#### Channel Handshake Version Negotiation + +Application modules are expected to verify versioning used during the channel handshake procedure. + +- `ChanOpenInit` callback should verify that the `MsgChanOpenInit.Version` is valid +- `ChanOpenTry` callback should construct the application version used for both channel ends. If no application version can be constructed, it must return an error. +- `ChanOpenAck` callback should verify that the `MsgChanOpenAck.CounterpartyVersion` is valid and supported. + +IBC expects application modules to perform application version negotiation in `OnChanOpenTry`. The negotiated version +must be returned to core IBC. If the version cannot be negotiated, an error should be returned. + +Versions must be strings but can implement any versioning structure. If your application plans to +have linear releases then semantic versioning is recommended. If your application plans to release +various features in between major releases then it is advised to use the same versioning scheme +as IBC. This versioning scheme specifies a version identifier and compatible feature set with +that identifier. Valid version selection includes selecting a compatible version identifier with +a subset of features supported by your application for that version. The struct is used for this +scheme can be found in `03-connection/types`. + +Since the version type is a string, applications have the ability to do simple version verification +via string matching or they can use the already implemented versioning system and pass the proto +encoded version into each handhshake call as necessary. + +ICS20 currently implements basic string matching with a single supported version. + +### Custom Packets + +Modules connected by a channel must agree on what application data they are sending over the +channel, as well as how they will encode/decode it. This process is not specified by IBC as it is up +to each application module to determine how to implement this agreement. However, for most +applications this will happen as a version negotiation during the channel handshake. While more +complex version negotiation is possible to implement inside the channel opening handshake, a very +simple version negotiation is implemented in the [ibc-transfer module](https://github.com/cosmos/ibc-go/tree/main/modules/apps/transfer/module.go). + +Thus, a module must define its custom packet data structure, along with a well-defined way to +encode and decode it to and from `[]byte`. + +```go +// Custom packet data defined in application module +type CustomPacketData struct { + // Custom fields ... +} + +EncodePacketData(packetData CustomPacketData) []byte { + // encode packetData to bytes +} + +DecodePacketData(encoded []byte) (CustomPacketData) { + // decode from bytes to packet data +} +``` + +Then a module must encode its packet data before sending it through IBC. + +```go +// Sending custom application packet data +data := EncodePacketData(customPacketData) +packet.Data = data +// Send packet to IBC, authenticating with channelCap +sequence, err := IBCChannelKeeper.SendPacket( + ctx, + sourcePort, + sourceChannel, + timeoutHeight, + timeoutTimestamp, + data, +) +``` + +A module receiving a packet must decode the `PacketData` into a structure it expects so that it can +act on it. + +```go +// Receiving custom application packet data (in OnRecvPacket) +packetData := DecodePacketData(packet.Data) +// handle received custom packet data +``` + +#### Packet Flow Handling + +Just as IBC expected modules to implement callbacks for channel handshakes, IBC also expects modules +to implement callbacks for handling the packet flow through a channel. + +Once a module A and module B are connected to each other, relayers can start relaying packets and +acknowledgements back and forth on the channel. + +![IBC packet flow diagram](https://media.githubusercontent.com/media/cosmos/ibc/old/spec/ics-004-channel-and-packet-semantics/channel-state-machine.png) + +Briefly, a successful packet flow works as follows: + +1. module A sends a packet through the IBC module +2. the packet is received by module B +3. if module B writes an acknowledgement of the packet then module A will process the + acknowledgement +4. if the packet is not successfully received before the timeout, then module A processes the + packet's timeout. + +##### Sending Packets + +Modules do not send packets through callbacks, since the modules initiate the action of sending +packets to the IBC module, as opposed to other parts of the packet flow where msgs sent to the IBC +module must trigger execution on the port-bound module through the use of callbacks. Thus, to send a +packet a module simply needs to call `SendPacket` on the `IBCChannelKeeper`. + +```go +// Sending custom application packet data +data := EncodePacketData(customPacketData) +// Send packet to IBC, authenticating with channelCap +sequence, err := IBCChannelKeeper.SendPacket( + ctx, + sourcePort, + sourceChannel, + timeoutHeight, + timeoutTimestamp, + data, +) +``` + +##### Receiving Packets + +To handle receiving packets, the module must implement the `OnRecvPacket` callback. This gets +invoked by the IBC module after the packet has been proved valid and correctly processed by the IBC +keepers. Thus, the `OnRecvPacket` callback only needs to worry about making the appropriate state +changes given the packet data without worrying about whether the packet is valid or not. + +Modules may return to the IBC handler an acknowledgement which implements the Acknowledgement interface. +The IBC handler will then commit this acknowledgement of the packet so that a relayer may relay the +acknowledgement back to the sender module. + +The state changes that occurred during this callback will only be written if: + +- the acknowledgement was successful as indicated by the `Success()` function of the acknowledgement +- if the acknowledgement returned is nil indicating that an asynchronous process is occurring + +NOTE: Applications which process asynchronous acknowledgements must handle reverting state changes +when appropriate. Any state changes that occurred during the `OnRecvPacket` callback will be written +for asynchronous acknowledgements. + +```go +OnRecvPacket( + ctx sdk.Context, + packet channeltypes.Packet, +) ibcexported.Acknowledgement { + // Decode the packet data + packetData := DecodePacketData(packet.Data) + + // do application state changes based on packet data and return the acknowledgement + // NOTE: The acknowledgement will indicate to the IBC handler if the application + // state changes should be written via the `Success()` function. Application state + // changes are only written if the acknowledgement is successful or the acknowledgement + // returned is nil indicating that an asynchronous acknowledgement will occur. + ack := processPacket(ctx, packet, packetData) + + return ack +} +``` + +The Acknowledgement interface: + +```go +// Acknowledgement defines the interface used to return +// acknowledgements in the OnRecvPacket callback. +type Acknowledgement interface { + Success() bool + Acknowledgement() []byte +} +``` + +### Acknowledgements + +Modules may commit an acknowledgement upon receiving and processing a packet in the case of synchronous packet processing. +In the case where a packet is processed at some later point after the packet has been received (asynchronous execution), the acknowledgement +will be written once the packet has been processed by the application which may be well after the packet receipt. + +NOTE: Most blockchain modules will want to use the synchronous execution model in which the module processes and writes the acknowledgement +for a packet as soon as it has been received from the IBC module. + +This acknowledgement can then be relayed back to the original sender chain, which can take action +depending on the contents of the acknowledgement. + +Just as packet data was opaque to IBC, acknowledgements are similarly opaque. Modules must pass and +receive acknowledegments with the IBC modules as byte strings. + +Thus, modules must agree on how to encode/decode acknowledgements. The process of creating an +acknowledgement struct along with encoding and decoding it, is very similar to the packet data +example above. [ICS 04](https://github.com/cosmos/ibc/blob/master/spec/core/ics-004-channel-and-packet-semantics#acknowledgement-envelope) +specifies a recommended format for acknowledgements. This acknowledgement type can be imported from +[channel types](https://github.com/cosmos/ibc-go/tree/main/modules/core/04-channel/types). + +While modules may choose arbitrary acknowledgement structs, a default acknowledgement types is provided by IBC [here](https://github.com/cosmos/ibc-go/blob/main/proto/ibc/core/channel/v1/channel.proto): + +```proto +// 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 +message Acknowledgement { + // response contains either a result or an error and must be non-empty + oneof response { + bytes result = 21; + string error = 22; + } +} +``` + +#### Acknowledging Packets + +After a module writes an acknowledgement, a relayer can relay back the acknowledgement to the sender module. The sender module can +then process the acknowledgement using the `OnAcknowledgementPacket` callback. The contents of the +acknowledgement is entirely up to the modules on the channel (just like the packet data); however, it +may often contain information on whether the packet was successfully processed along +with some additional data that could be useful for remediation if the packet processing failed. + +Since the modules are responsible for agreeing on an encoding/decoding standard for packet data and +acknowledgements, IBC will pass in the acknowledgements as `[]byte` to this callback. The callback +is responsible for decoding the acknowledgement and processing it. + +```go +OnAcknowledgementPacket( + ctx sdk.Context, + packet channeltypes.Packet, + acknowledgement []byte, +) (*sdk.Result, error) { + // Decode acknowledgement + ack := DecodeAcknowledgement(acknowledgement) + + // process ack + res, err := processAck(ack) + return res, err +} +``` + +#### Timeout Packets + +If the timeout for a packet is reached before the packet is successfully received or the +counterparty channel end is closed before the packet is successfully received, then the receiving +chain can no longer process it. Thus, the sending chain must process the timeout using +`OnTimeoutPacket` to handle this situation. Again the IBC module will verify that the timeout is +indeed valid, so our module only needs to implement the state machine logic for what to do once a +timeout is reached and the packet can no longer be received. + +```go +OnTimeoutPacket( + ctx sdk.Context, + packet channeltypes.Packet, +) (*sdk.Result, error) { + // do custom timeout logic +} +``` + +### Routing + +As mentioned above, modules must implement the IBC module interface (which contains both channel +handshake callbacks and packet handling callbacks). The concrete implementation of this interface +must be registered with the module name as a route on the IBC `Router`. + +```go +// app.go +func NewApp(...args) *App { +// ... + +// Create static IBC router, add module routes, then set and seal it +ibcRouter := port.NewRouter() + +ibcRouter.AddRoute(ibctransfertypes.ModuleName, transferModule) +// Note: moduleCallbacks must implement IBCModule interface +ibcRouter.AddRoute(moduleName, moduleCallbacks) + +// Setting Router will finalize all routes by sealing router +// No more routes can be added +app.IBCKeeper.SetRouter(ibcRouter) +``` + +## Working Example + +For a real working example of an IBC application, you can look through the `ibc-transfer` module +which implements everything discussed above. + +Here are the useful parts of the module to look at: + +[Binding to transfer +port](https://github.com/cosmos/ibc-go/blob/main/modules/apps/transfer/keeper/genesis.go) + +[Sending transfer +packets](https://github.com/cosmos/ibc-go/blob/main/modules/apps/transfer/keeper/relay.go) + +[Implementing IBC +callbacks](https://github.com/cosmos/ibc-go/blob/main/modules/apps/transfer/ibc_module.go) diff --git a/docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/02-ibcmodule.md b/docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/02-ibcmodule.md new file mode 100644 index 00000000000..4d8a6019bbd --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/02-ibcmodule.md @@ -0,0 +1,367 @@ +--- +title: Implement IBCModule interface and callbacks +sidebar_label: Implement IBCModule interface and callbacks +sidebar_position: 2 +slug: /ibc/apps/ibcmodule +--- + +# Implement `IBCModule` interface and callbacks + +:::note Synopsis +Learn how to implement the `IBCModule` interface and all of the callbacks it requires. +::: + +The Cosmos SDK expects all IBC modules to implement the [`IBCModule` +interface](https://github.com/cosmos/ibc-go/tree/main/modules/core/05-port/types/module.go). This interface contains all of the callbacks IBC expects modules to implement. They include callbacks related to channel handshake, closing and packet callbacks (`OnRecvPacket`, `OnAcknowledgementPacket` and `OnTimeoutPacket`). + +```go +// IBCModule implements the ICS26 interface for given the keeper. +// The implementation of the IBCModule interface could for example be in a file called ibc_module.go, +// but ultimately file structure is up to the developer +type IBCModule struct { + keeper keeper.Keeper +} +``` + +Additionally, in the `module.go` file, add the following line: + +```go +var ( + _ module.AppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} + // Add this line + _ porttypes.IBCModule = IBCModule{} +) +``` + +:::note + +## Pre-requisite readings + +- [IBC Overview](../01-overview.md) +- [IBC default integration](../02-integration.md) + +::: + +## Channel handshake callbacks + +This section will describe the callbacks that are called during channel handshake execution. + +Here are the channel handshake callbacks that modules are expected to implement: + +> Note that some of the code below is *pseudo code*, indicating what actions need to happen but leaving it up to the developer to implement a custom implementation. E.g. the `checkArguments` and `negotiateAppVersion` functions. + +```go +// Called by IBC Handler on MsgOpenInit +func (im IBCModule) OnChanOpenInit(ctx sdk.Context, + order channeltypes.Order, + connectionHops []string, + portID string, + channelID string, + counterparty channeltypes.Counterparty, + version string, +) (string, error) { + // ... do custom initialization logic + + // Use above arguments to determine if we want to abort handshake + // Examples: + // - Abort if order == UNORDERED, + // - Abort if version is unsupported + if err := checkArguments(args); err != nil { + return "", err + } + + + return version, nil +} + +// Called by IBC Handler on MsgOpenTry +func (im IBCModule) OnChanOpenTry( + ctx sdk.Context, + order channeltypes.Order, + connectionHops []string, + portID, + channelID string, + counterparty channeltypes.Counterparty, + counterpartyVersion string, +) (string, error) { + // ... do custom initialization logic + + // Use above arguments to determine if we want to abort handshake + if err := checkArguments(args); err != nil { + return "", err + } + + // Construct application version + // IBC applications must return the appropriate application version + // This can be a simple string or it can be a complex version constructed + // from the counterpartyVersion and other arguments. + // The version returned will be the channel version used for both channel ends. + appVersion := negotiateAppVersion(counterpartyVersion, args) + + return appVersion, nil +} + +// Called by IBC Handler on MsgOpenAck +func (im IBCModule) OnChanOpenAck( + ctx sdk.Context, + portID, + channelID string, + counterpartyVersion string, +) error { + if counterpartyVersion != types.Version { + return sdkerrors.Wrapf(types.ErrInvalidVersion, "invalid counterparty version: %s, expected %s", counterpartyVersion, types.Version) + } + + // do custom logic + + return nil +} + +// Called by IBC Handler on MsgOpenConfirm +func (im IBCModule) OnChanOpenConfirm( + ctx sdk.Context, + portID, + channelID string, +) error { + // do custom logic + + return nil +} +``` + +### Channel closing callbacks + +The channel closing handshake will also invoke module callbacks that can return errors to abort the closing handshake. Closing a channel is a 2-step handshake, the initiating chain calls `ChanCloseInit` and the finalizing chain calls `ChanCloseConfirm`. + +Currently, all IBC modules in this repository return an error for `OnChanCloseInit` to prevent the channels from closing. This is because any user can call `ChanCloseInit` by submitting a `MsgChannelCloseInit` transaction. + +```go +// Called by IBC Handler on MsgCloseInit +func (im IBCModule) OnChanCloseInit( + ctx sdk.Context, + portID, + channelID string, +) error { + // ... do custom finalization logic + + // Use above arguments to determine if we want to abort handshake + err := checkArguments(args) + return err +} + +// Called by IBC Handler on MsgCloseConfirm +func (im IBCModule) OnChanCloseConfirm( + ctx sdk.Context, + portID, + channelID string, +) error { + // ... do custom finalization logic + + // Use above arguments to determine if we want to abort handshake + err := checkArguments(args) + return err +} +``` + +### Channel handshake version negotiation + +Application modules are expected to verify versioning used during the channel handshake procedure. + +- `OnChanOpenInit` will verify that the relayer-chosen parameters + are valid and perform any custom `INIT` logic. + It may return an error if the chosen parameters are invalid + in which case the handshake is aborted. + If the provided version string is non-empty, `OnChanOpenInit` should return + the version string if valid or an error if the provided version is invalid. + **If the version string is empty, `OnChanOpenInit` is expected to + return a default version string representing the version(s) + it supports.** + If there is no default version string for the application, + it should return an error if the provided version is an empty string. +- `OnChanOpenTry` will verify the relayer-chosen parameters along with the + counterparty-chosen version string and perform custom `TRY` logic. + If the relayer-chosen parameters + are invalid, the callback must return an error to abort the handshake. + If the counterparty-chosen version is not compatible with this module's + supported versions, the callback must return an error to abort the handshake. + If the versions are compatible, the try callback must select the final version + string and return it to core IBC. + `OnChanOpenTry` may also perform custom initialization logic. +- `OnChanOpenAck` will error if the counterparty selected version string + is invalid and abort the handshake. It may also perform custom ACK logic. + +Versions must be strings but can implement any versioning structure. If your application plans to +have linear releases then semantic versioning is recommended. If your application plans to release +various features in between major releases then it is advised to use the same versioning scheme +as IBC. This versioning scheme specifies a version identifier and compatible feature set with +that identifier. Valid version selection includes selecting a compatible version identifier with +a subset of features supported by your application for that version. The struct used for this +scheme can be found in [03-connection/types](https://github.com/cosmos/ibc-go/blob/main/modules/core/03-connection/types/version.go#L16). + +Since the version type is a string, applications have the ability to do simple version verification +via string matching or they can use the already implemented versioning system and pass the proto +encoded version into each handhshake call as necessary. + +ICS20 currently implements basic string matching with a single supported version. + +## Packet callbacks + +Just as IBC expects modules to implement callbacks for channel handshakes, it also expects modules to implement callbacks for handling the packet flow through a channel, as defined in the `IBCModule` interface. + +Once a module A and module B are connected to each other, relayers can start relaying packets and acknowledgements back and forth on the channel. + +![IBC packet flow diagram](./images/packet_flow.png) + +Briefly, a successful packet flow works as follows: + +1. Module A sends a packet through the IBC module +2. The packet is received by module B +3. If module B writes an acknowledgement of the packet then module A will process the acknowledgement +4. If the packet is not successfully received before the timeout, then module A processes the packet's timeout. + +### Sending packets + +Modules **do not send packets through callbacks**, since the modules initiate the action of sending packets to the IBC module, as opposed to other parts of the packet flow where messages sent to the IBC +module must trigger execution on the port-bound module through the use of callbacks. Thus, to send a packet a module simply needs to call `SendPacket` on the `IBCChannelKeeper`. + +> Note that some of the code below is *pseudo code*, indicating what actions need to happen but leaving it up to the developer to implement a custom implementation. E.g. the `EncodePacketData(customPacketData)` function. + +```go +// Sending custom application packet data +data := EncodePacketData(customPacketData) +// Send packet to IBC, authenticating with channelCap +sequence, err := IBCChannelKeeper.SendPacket( + ctx, + sourcePort, + sourceChannel, + timeoutHeight, + timeoutTimestamp, + data, +) +``` + +### Receiving packets + +To handle receiving packets, the module must implement the `OnRecvPacket` callback. This gets +invoked by the IBC module after the packet has been proved valid and correctly processed by the IBC +keepers. Thus, the `OnRecvPacket` callback only needs to worry about making the appropriate state +changes given the packet data without worrying about whether the packet is valid or not. + +Modules may return to the IBC handler an acknowledgement which implements the `Acknowledgement` interface. +The IBC handler will then commit this acknowledgement of the packet so that a relayer may relay the +acknowledgement back to the sender module. + +The state changes that occurred during this callback will only be written if: + +- the acknowledgement was successful as indicated by the `Success()` function of the acknowledgement +- if the acknowledgement returned is nil indicating that an asynchronous process is occurring + +NOTE: Applications which process asynchronous acknowledgements must handle reverting state changes +when appropriate. Any state changes that occurred during the `OnRecvPacket` callback will be written +for asynchronous acknowledgements. + +> Note that some of the code below is *pseudo code*, indicating what actions need to happen but leaving it up to the developer to implement a custom implementation. E.g. the `DecodePacketData(packet.Data)` function. + +```go +func (im IBCModule) OnRecvPacket( + ctx sdk.Context, + packet channeltypes.Packet, +) ibcexported.Acknowledgement { + // Decode the packet data + packetData := DecodePacketData(packet.Data) + + // do application state changes based on packet data and return the acknowledgement + // NOTE: The acknowledgement will indicate to the IBC handler if the application + // state changes should be written via the `Success()` function. Application state + // changes are only written if the acknowledgement is successful or the acknowledgement + // returned is nil indicating that an asynchronous acknowledgement will occur. + ack := processPacket(ctx, packet, packetData) + + return ack +} +``` + +Reminder, the `Acknowledgement` interface: + +```go +// Acknowledgement defines the interface used to return +// acknowledgements in the OnRecvPacket callback. +type Acknowledgement interface { + Success() bool + Acknowledgement() []byte +} +``` + +### Acknowledging packets + +After a module writes an acknowledgement, a relayer can relay back the acknowledgement to the sender module. The sender module can +then process the acknowledgement using the `OnAcknowledgementPacket` callback. The contents of the +acknowledgement is entirely up to the modules on the channel (just like the packet data); however, it +may often contain information on whether the packet was successfully processed along +with some additional data that could be useful for remediation if the packet processing failed. + +Since the modules are responsible for agreeing on an encoding/decoding standard for packet data and +acknowledgements, IBC will pass in the acknowledgements as `[]byte` to this callback. The callback +is responsible for decoding the acknowledgement and processing it. + +> Note that some of the code below is *pseudo code*, indicating what actions need to happen but leaving it up to the developer to implement a custom implementation. E.g. the `DecodeAcknowledgement(acknowledgments)` and `processAck(ack)` functions. + +```go +func (im IBCModule) OnAcknowledgementPacket( + ctx sdk.Context, + packet channeltypes.Packet, + acknowledgement []byte, +) (*sdk.Result, error) { + // Decode acknowledgement + ack := DecodeAcknowledgement(acknowledgement) + + // process ack + res, err := processAck(ack) + return res, err +} +``` + +### Timeout packets + +If the timeout for a packet is reached before the packet is successfully received or the +counterparty channel end is closed before the packet is successfully received, then the receiving +chain can no longer process it. Thus, the sending chain must process the timeout using +`OnTimeoutPacket` to handle this situation. Again the IBC module will verify that the timeout is +indeed valid, so our module only needs to implement the state machine logic for what to do once a +timeout is reached and the packet can no longer be received. + +```go +func (im IBCModule) OnTimeoutPacket( + ctx sdk.Context, + packet channeltypes.Packet, +) (*sdk.Result, error) { + // do custom timeout logic +} +``` + +### Optional interfaces + +The following interface are optional and MAY be implemented by an IBCModule. + +#### PacketDataUnmarshaler + +The `PacketDataUnmarshaler` interface is defined as follows: + +```go +// PacketDataUnmarshaler defines an optional interface which allows a middleware to +// request the packet data to be unmarshaled by the base application. +type PacketDataUnmarshaler interface { + // UnmarshalPacketData unmarshals the packet data into a concrete type + // ctx, portID, channelID are provided as arguments, so that (if needed) + // the packet data can be unmarshaled based on the channel version. + // The version of the underlying app is also returned. + UnmarshalPacketData(ctx sdk.Context, portID, channelID string, bz []byte) (interface{}, string, error) +} +``` + +The implementation of `UnmarshalPacketData` should unmarshal the bytes into the packet data type defined for an IBC stack. +The base application of an IBC stack should unmarshal the bytes into its packet data type, while a middleware may simply defer the call to the underlying application. + +This interface allows middlewares to unmarshal a packet data in order to make use of interfaces the packet data type implements. +For example, the callbacks middleware makes use of this function to access packet data types which implement the `PacketData` and `PacketDataProvider` interfaces. diff --git a/docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/03-bindports.md b/docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/03-bindports.md new file mode 100644 index 00000000000..6a3cc27a924 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/03-bindports.md @@ -0,0 +1,122 @@ +--- +title: Bind ports +sidebar_label: Bind ports +sidebar_position: 3 +slug: /ibc/apps/bindports +--- + +# Bind ports + +:::note Synopsis +Learn what changes to make to bind modules to their ports on initialization. +::: + +:::note + +## Pre-requisite readings + +- [IBC Overview](../01-overview.md) +- [IBC default integration](../02-integration.md) + +::: +Currently, ports must be bound on app initialization. In order to bind modules to their respective ports on initialization, the following needs to be implemented: + +> Note that `portID` does not refer to a certain numerical ID, like `localhost:8080` with a `portID` 8080. Rather it refers to the application module the port binds. For IBC Modules built with the Cosmos SDK, it defaults to the module's name and for Cosmwasm contracts it defaults to the contract address. + +1. Add port ID to the `GenesisState` proto definition: + +```protobuf +message GenesisState { + string port_id = 1; + // other fields +} +``` + +1. Add port ID as a key to the module store: + +```go +// x//types/keys.go +const ( + // ModuleName defines the IBC Module name + ModuleName = "moduleName" + + // Version defines the current version the IBC + // module supports + Version = "moduleVersion-1" + + // PortID is the default port id that module binds to + PortID = "portID" + + // ... +) +``` + +1. Add port ID to `x//types/genesis.go`: + +```go +// in x//types/genesis.go + +// DefaultGenesisState returns a GenesisState with "transfer" as the default PortID. +func DefaultGenesisState() *GenesisState { + return &GenesisState{ + PortId: PortID, + // additional k-v fields + } +} + +// Validate performs basic genesis state validation returning an error upon any +// failure. +func (gs GenesisState) Validate() error { + if err := host.PortIdentifierValidator(gs.PortId); err != nil { + return err + } + //additional validations + + return gs.Params.Validate() +} +``` + +1. Bind to port(s) in the module keeper's `InitGenesis`: + +```go +// InitGenesis initializes the ibc-module state and binds to PortID. +func (k Keeper) InitGenesis(ctx sdk.Context, state types.GenesisState) { + k.SetPort(ctx, state.PortId) + + // ... + + // Only try to bind to port if it is not already bound, since we may already own + // port capability from capability InitGenesis + if !k.hasCapability(ctx, state.PortId) { + // transfer module binds to the transfer port on InitChain + // and claims the returned capability + err := k.BindPort(ctx, state.PortId) + if err != nil { + panic(fmt.Sprintf("could not claim port capability: %v", err)) + } + } + + // ... +} +``` + +With: + +```go +// IsBound checks if the module is already bound to the desired port +func (k Keeper) IsBound(ctx sdk.Context, portID string) bool { + _, ok := k.scopedKeeper.GetCapability(ctx, host.PortPath(portID)) + return ok +} + +// BindPort defines a wrapper function for the port Keeper's function in +// order to expose it to module's InitGenesis function +func (k Keeper) BindPort(ctx sdk.Context, portID string) error { + cap := k.portKeeper.BindPort(ctx, portID) + return k.ClaimCapability(ctx, cap, host.PortPath(portID)) +} +``` + +The module binds to the desired port(s) and returns the capabilities. + +In the above we find reference to keeper methods that wrap other keeper functionality, in the next section the keeper methods that need to be implemented will be defined. diff --git a/docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/04-keeper.md b/docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/04-keeper.md new file mode 100644 index 00000000000..a1bb8fe838d --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/04-keeper.md @@ -0,0 +1,71 @@ +--- +title: Keeper +sidebar_label: Keeper +sidebar_position: 4 +slug: /ibc/apps/keeper +--- + +# Keeper + +:::note Synopsis +Learn how to implement the IBC Module keeper. +::: + +:::note + +## Pre-requisite readings + +- [IBC Overview](../01-overview.md) +- [IBC default integration](../02-integration.md) + +::: +In the previous sections, on channel handshake callbacks and port binding in `InitGenesis`, a reference was made to keeper methods that need to be implemented when creating a custom IBC module. Below is an overview of how to define an IBC module's keeper. + +> Note that some code has been left out for clarity, to get a full code overview, please refer to [the transfer module's keeper in the ibc-go repo](https://github.com/cosmos/ibc-go/blob/main/modules/apps/transfer/keeper/keeper.go). + +```go +// Keeper defines the IBC app module keeper +type Keeper struct { + storeKey sdk.StoreKey + cdc codec.BinaryCodec + paramSpace paramtypes.Subspace + + channelKeeper types.ChannelKeeper + portKeeper types.PortKeeper + + // ... additional according to custom logic +} + +// NewKeeper creates a new IBC app module Keeper instance +func NewKeeper( + // args +) Keeper { + // ... + + return Keeper{ + cdc: cdc, + storeKey: key, + paramSpace: paramSpace, + + channelKeeper: channelKeeper, + portKeeper: portKeeper, + scopedKeeper: scopedKeeper, + + // ... additional according to custom logic + } +} + +// GetPort returns the portID for the IBC app module. Used in ExportGenesis +func (k Keeper) GetPort(ctx sdk.Context) string { + store := ctx.KVStore(k.storeKey) + return string(store.Get(types.PortKey)) +} + +// SetPort sets the portID for the IBC app module. Used in InitGenesis +func (k Keeper) SetPort(ctx sdk.Context, portID string) { + store := ctx.KVStore(k.storeKey) + store.Set(types.PortKey, []byte(portID)) +} + +// ... additional according to custom logic +``` diff --git a/docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/05-packets_acks.md b/docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/05-packets_acks.md new file mode 100644 index 00000000000..18d34cdeaad --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/05-packets_acks.md @@ -0,0 +1,163 @@ +--- +title: Define packets and acks +sidebar_label: Define packets and acks +sidebar_position: 5 +slug: /ibc/apps/packets_acks +--- + +# Define packets and acks + +:::note Synopsis +Learn how to define custom packet and acknowledgement structs and how to encode and decode them. +::: + +:::note + +## Pre-requisite readings + +- [IBC Overview](../01-overview.md) +- [IBC default integration](../02-integration.md) + +::: + +## Custom packets + +Modules connected by a channel must agree on what application data they are sending over the +channel, as well as how they will encode/decode it. This process is not specified by IBC as it is up +to each application module to determine how to implement this agreement. However, for most +applications this will happen as a version negotiation during the channel handshake. While more +complex version negotiation is possible to implement inside the channel opening handshake, a very +simple version negotiation is implemented in the [ibc-transfer module](https://github.com/cosmos/ibc-go/tree/main/modules/apps/transfer/module.go). + +Thus, a module must define its custom packet data structure, along with a well-defined way to +encode and decode it to and from `[]byte`. + +```go +// Custom packet data defined in application module +type CustomPacketData struct { + // Custom fields ... +} + +EncodePacketData(packetData CustomPacketData) []byte { + // encode packetData to bytes +} + +DecodePacketData(encoded []byte) (CustomPacketData) { + // decode from bytes to packet data +} +``` + +> Note that the `CustomPacketData` struct is defined in the proto definition and then compiled by the protobuf compiler. + +Then a module must encode its packet data before sending it through IBC. + +```go +// Sending custom application packet data +data := EncodePacketData(customPacketData) +// Send packet to IBC, authenticating with channelCap +sequence, err := IBCChannelKeeper.SendPacket( + ctx, + sourcePort, + sourceChannel, + timeoutHeight, + timeoutTimestamp, + data, +) +``` + +A module receiving a packet must decode the `PacketData` into a structure it expects so that it can +act on it. + +```go +// Receiving custom application packet data (in OnRecvPacket) +packetData := DecodePacketData(packet.Data) +// handle received custom packet data +``` + +### Optional interfaces + +The following interfaces are optional and MAY be implemented by a custom packet type. +They allow middlewares such as callbacks to access information stored within the packet data. + +#### PacketData interface + +The `PacketData` interface is defined as follows: + +```go +// PacketData defines an optional interface which an application's packet data structure may implement. +type PacketData interface { + // GetPacketSender returns the sender address of the packet data. + // If the packet sender is unknown or undefined, an empty string should be returned. + GetPacketSender(sourcePortID string) string +} +``` + +The implementation of `GetPacketSender` should return the sender of the packet data. +If the packet sender is unknown or undefined, an empty string should be returned. + +This interface is intended to give IBC middlewares access to the packet sender of a packet data type. + +#### PacketDataProvider interface + +The `PacketDataProvider` interface is defined as follows: + +```go +// PacketDataProvider defines an optional interfaces for retrieving custom packet data stored on behalf of another application. +// An existing problem in the IBC middleware design is the inability for a middleware to define its own packet data type and insert packet sender provided information. +// A short term solution was introduced into several application's packet data to utilize a memo field to carry this information on behalf of another application. +// This interfaces standardizes that behaviour. Upon realization of the ability for middleware's to define their own packet data types, this interface will be deprecated and removed with time. +type PacketDataProvider interface { + // GetCustomPacketData returns the packet data held on behalf of another application. + // The name the information is stored under should be provided as the key. + // If no custom packet data exists for the key, nil should be returned. + GetCustomPacketData(key string) interface{} +} +``` + +The implementation of `GetCustomPacketData` should return packet data held on behalf of another application (if present and supported). +If this functionality is not supported, it should return nil. Otherwise it should return the packet data associated with the provided key. + +This interface gives IBC applications access to the packet data information embedded into the base packet data type. +Within transfer and interchain accounts, the embedded packet data is stored within the Memo field. + +Once all IBC applications within an IBC stack are capable of creating/maintaining their own packet data type's, this interface function will be deprecated and removed. + +## Acknowledgements + +Modules may commit an acknowledgement upon receiving and processing a packet in the case of synchronous packet processing. +In the case where a packet is processed at some later point after the packet has been received (asynchronous execution), the acknowledgement +will be written once the packet has been processed by the application which may be well after the packet receipt. + +NOTE: Most blockchain modules will want to use the synchronous execution model in which the module processes and writes the acknowledgement +for a packet as soon as it has been received from the IBC module. + +This acknowledgement can then be relayed back to the original sender chain, which can take action +depending on the contents of the acknowledgement. + +Just as packet data was opaque to IBC, acknowledgements are similarly opaque. Modules must pass and +receive acknowledegments with the IBC modules as byte strings. + +Thus, modules must agree on how to encode/decode acknowledgements. The process of creating an +acknowledgement struct along with encoding and decoding it, is very similar to the packet data +example above. [ICS 04](https://github.com/cosmos/ibc/blob/master/spec/core/ics-004-channel-and-packet-semantics#acknowledgement-envelope) +specifies a recommended format for acknowledgements. This acknowledgement type can be imported from +[channel types](https://github.com/cosmos/ibc-go/tree/main/modules/core/04-channel/types). + +While modules may choose arbitrary acknowledgement structs, a default acknowledgement types is provided by IBC [here](https://github.com/cosmos/ibc-go/blob/main/proto/ibc/core/channel/v1/channel.proto): + +```protobuf +// 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 +message Acknowledgement { + // response contains either a result or an error and must be non-empty + oneof response { + bytes result = 21; + string error = 22; + } +} +``` diff --git a/docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/06-routing.md b/docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/06-routing.md new file mode 100644 index 00000000000..666fb1af11b --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/06-routing.md @@ -0,0 +1,44 @@ +--- +title: Routing +sidebar_label: Routing +sidebar_position: 6 +slug: /ibc/apps/routing +--- + +# Routing + +:::note + +## Pre-requisite readings + +- [IBC Overview](../01-overview.md) +- [IBC default integration](../02-integration.md) + +::: +:::note Synopsis +Learn how to hook a route to the IBC router for the custom IBC module. +::: + +As mentioned above, modules must implement the `IBCModule` interface (which contains both channel +handshake callbacks and packet handling callbacks). The concrete implementation of this interface +must be registered with the module name as a route on the IBC `Router`. + +```go +// app.go +func NewApp(...args) *App { + // ... + + // Create static IBC router, add module routes, then set and seal it + ibcRouter := port.NewRouter() + + ibcRouter.AddRoute(ibctransfertypes.ModuleName, transferModule) + // Note: moduleCallbacks must implement IBCModule interface + ibcRouter.AddRoute(moduleName, moduleCallbacks) + + // Setting Router will finalize all routes by sealing router + // No more routes can be added + app.IBCKeeper.SetRouter(ibcRouter) + + // ... +} +``` diff --git a/docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/_category_.json b/docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/_category_.json new file mode 100644 index 00000000000..4561a95b84c --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Applications", + "position": 3, + "link": null +} \ No newline at end of file diff --git a/docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/images/packet_flow.png b/docs/versioned_docs/version-v9.0.x/01-ibc/03-apps/images/packet_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..db2d1d314b86766f403009ff6fa3f31578d32460 GIT binary patch literal 352988 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�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 z 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 Note how this is analogous to implementing the same interfaces for IBC applications that act as base applications. + +As will be mentioned in the [integration section](03-integration.md), this struct should be different than the struct that implements `AppModule` in case the middleware maintains its own internal state and processes separate SDK messages. + +The middleware must have access to the underlying application, and be called before it during all ICS-26 callbacks. It may execute custom logic during these callbacks, and then call the underlying application's callback. + +> Middleware **may** choose not to call the underlying application's callback at all. Though these should generally be limited to error cases. + +The `IBCModule` interface consists of the channel handshake callbacks and packet callbacks. Most of the custom logic will be performed in the packet callbacks, in the case of the channel handshake callbacks, introducing the middleware requires consideration to the version negotiation. + +### Channel handshake callbacks + +#### Version negotiation + +In the case where the IBC middleware expects to speak to a compatible IBC middleware on the counterparty chain, they must use the channel handshake to negotiate the middleware version without interfering in the version negotiation of the underlying application. + +Middleware accomplishes this by formatting the version in a JSON-encoded string containing the middleware version and the application version. The application version may as well be a JSON-encoded string, possibly including further middleware and app versions, if the application stack consists of multiple milddlewares wrapping a base application. The format of the version is specified in ICS-30 as the following: + +```json +{ + "": "", + "app_version": "" +} +``` + +The `` key in the JSON struct should be replaced by the actual name of the key for the corresponding middleware (e.g. `fee_version`). + +During the handshake callbacks, the middleware can unmarshal the version string and retrieve the middleware and application versions. It can do its negotiation logic on ``, and pass the `` to the underlying application. + +> **NOTE**: Middleware that does not need to negotiate with a counterparty middleware on the remote stack will not implement the version unmarshalling and negotiation, and will simply perform its own custom logic on the callbacks without relying on the counterparty behaving similarly. + +#### `OnChanOpenInit` + +```go +func (im IBCMiddleware) OnChanOpenInit( + ctx sdk.Context, + order channeltypes.Order, + connectionHops []string, + portID string, + channelID string, + counterparty channeltypes.Counterparty, + version string, +) (string, error) { + if version != "" { + // try to unmarshal JSON-encoded version string and pass + // the app-specific version to app callback. + // otherwise, pass version directly to app callback. + metadata, err := Unmarshal(version) + if err != nil { + // Since it is valid for fee version to not be specified, + // the above middleware version may be for another middleware. + // Pass the entire version string onto the underlying application. + return im.app.OnChanOpenInit( + ctx, + order, + connectionHops, + portID, + channelID, + counterparty, + version, + ) + } + else { + metadata = { + // set middleware version to default value + MiddlewareVersion: defaultMiddlewareVersion, + // allow application to return its default version + AppVersion: "", + } + } + } + + doCustomLogic() + + // if the version string is empty, OnChanOpenInit is expected to return + // a default version string representing the version(s) it supports + appVersion, err := im.app.OnChanOpenInit( + ctx, + order, + connectionHops, + portID, + channelID, + counterparty, + metadata.AppVersion, // note we only pass app version here + ) + if err != nil { + return "", err + } + + version := constructVersion(metadata.MiddlewareVersion, appVersion) + + return version, nil +} +``` + +See [here](https://github.com/cosmos/ibc-go/blob/v7.0.0/modules/apps/29-fee/ibc_middleware.go#L36-L83) an example implementation of this callback for the ICS-29 Fee Middleware module. + +#### `OnChanOpenTry` + +```go +func (im IBCMiddleware) OnChanOpenTry( + ctx sdk.Context, + order channeltypes.Order, + connectionHops []string, + portID, + channelID string, + counterparty channeltypes.Counterparty, + counterpartyVersion string, +) (string, error) { + // try to unmarshal JSON-encoded version string and pass + // the app-specific version to app callback. + // otherwise, pass version directly to app callback. + cpMetadata, err := Unmarshal(counterpartyVersion) + if err != nil { + return app.OnChanOpenTry( + ctx, + order, + connectionHops, + portID, + channelID, + counterparty, + counterpartyVersion, + ) + } + + doCustomLogic() + + // Call the underlying application's OnChanOpenTry callback. + // The try callback must select the final app-specific version string and return it. + appVersion, err := app.OnChanOpenTry( + ctx, + order, + connectionHops, + portID, + channelID, + counterparty, + cpMetadata.AppVersion, // note we only pass counterparty app version here + ) + if err != nil { + return "", err + } + + // negotiate final middleware version + middlewareVersion := negotiateMiddlewareVersion(cpMetadata.MiddlewareVersion) + version := constructVersion(middlewareVersion, appVersion) + + return version, nil +} +``` + +See [here](https://github.com/cosmos/ibc-go/blob/v7.0.0/modules/apps/29-fee/ibc_middleware.go#L88-L125) an example implementation of this callback for the ICS-29 Fee Middleware module. + +#### `OnChanOpenAck` + +```go +func (im IBCMiddleware) OnChanOpenAck( + ctx sdk.Context, + portID, + channelID string, + counterpartyChannelID string, + counterpartyVersion string, +) error { + // try to unmarshal JSON-encoded version string and pass + // the app-specific version to app callback. + // otherwise, pass version directly to app callback. + cpMetadata, err = UnmarshalJSON(counterpartyVersion) + if err != nil { + return app.OnChanOpenAck(ctx, portID, channelID, counterpartyChannelID, counterpartyVersion) + } + + if !isCompatible(cpMetadata.MiddlewareVersion) { + return error + } + doCustomLogic() + + // call the underlying application's OnChanOpenTry callback + return app.OnChanOpenAck(ctx, portID, channelID, counterpartyChannelID, cpMetadata.AppVersion) +} +``` + +See [here](https://github.com/cosmos/ibc-go/blob/v7.0.0/modules/apps/29-fee/ibc_middleware.go#L128-L153)) an example implementation of this callback for the ICS-29 Fee Middleware module. + +#### `OnChanOpenConfirm` + +```go +func OnChanOpenConfirm( + ctx sdk.Context, + portID, + channelID string, +) error { + doCustomLogic() + + return app.OnChanOpenConfirm(ctx, portID, channelID) +} +``` + +See [here](https://github.com/cosmos/ibc-go/blob/v7.0.0/modules/apps/29-fee/ibc_middleware.go#L156-L163) an example implementation of this callback for the ICS-29 Fee Middleware module. + +#### `OnChanCloseInit` + +```go +func OnChanCloseInit( + ctx sdk.Context, + portID, + channelID string, +) error { + doCustomLogic() + + return app.OnChanCloseInit(ctx, portID, channelID) +} +``` + +See [here](https://github.com/cosmos/ibc-go/blob/v7.0.0/modules/apps/29-fee/ibc_middleware.go#L166-L188) an example implementation of this callback for the ICS-29 Fee Middleware module. + +#### `OnChanCloseConfirm` + +```go +func OnChanCloseConfirm( + ctx sdk.Context, + portID, + channelID string, +) error { + doCustomLogic() + + return app.OnChanCloseConfirm(ctx, portID, channelID) +} +``` + +See [here](https://github.com/cosmos/ibc-go/blob/v7.0.0/modules/apps/29-fee/ibc_middleware.go#L191-L213) an example implementation of this callback for the ICS-29 Fee Middleware module. + +### Packet callbacks + +The packet callbacks just like the handshake callbacks wrap the application's packet callbacks. The packet callbacks are where the middleware performs most of its custom logic. The middleware may read the packet flow data and perform some additional packet handling, or it may modify the incoming data before it reaches the underlying application. This enables a wide degree of usecases, as a simple base application like token-transfer can be transformed for a variety of usecases by combining it with custom middleware. + +#### `OnRecvPacket` + +```go +func (im IBCMiddleware) OnRecvPacket( + ctx sdk.Context, + packet channeltypes.Packet, + relayer sdk.AccAddress, +) ibcexported.Acknowledgement { + doCustomLogic(packet) + + ack := app.OnRecvPacket(ctx, packet, relayer) + + doCustomLogic(ack) // middleware may modify outgoing ack + + return ack +} +``` + +See [here](https://github.com/cosmos/ibc-go/blob/v7.0.0/modules/apps/29-fee/ibc_middleware.go#L217-L238) an example implementation of this callback for the ICS-29 Fee Middleware module. + +#### `OnAcknowledgementPacket` + +```go +func (im IBCMiddleware) OnAcknowledgementPacket( + ctx sdk.Context, + packet channeltypes.Packet, + acknowledgement []byte, + relayer sdk.AccAddress, +) error { + doCustomLogic(packet, ack) + + return app.OnAcknowledgementPacket(ctx, packet, ack, relayer) +} +``` + +See [here](https://github.com/cosmos/ibc-go/blob/v7.0.0/modules/apps/29-fee/ibc_middleware.go#L242-L293) an example implementation of this callback for the ICS-29 Fee Middleware module. + +#### `OnTimeoutPacket` + +```go +func (im IBCMiddleware) OnTimeoutPacket( + ctx sdk.Context, + packet channeltypes.Packet, + relayer sdk.AccAddress, +) error { + doCustomLogic(packet) + + return app.OnTimeoutPacket(ctx, packet, relayer) +} +``` + +See [here](https://github.com/cosmos/ibc-go/blob/v7.0.0/modules/apps/29-fee/ibc_middleware.go#L297-L335) an example implementation of this callback for the ICS-29 Fee Middleware module. + +## ICS-04 wrappers + +Middleware must also wrap ICS-04 so that any communication from the application to the `channelKeeper` goes through the middleware first. Similar to the packet callbacks, the middleware may modify outgoing acknowledgements and packets in any way it wishes. + +To ensure optimal generalisability, the `ICS4Wrapper` abstraction serves to abstract away whether a middleware is the topmost middleware (and thus directly calling into the ICS-04 `channelKeeper`) or itself being wrapped by another middleware. + +Remember that middleware can be stateful or stateless. When defining the stateful middleware's keeper, the `ics4Wrapper` field is included. Then the appropriate keeper can be passed when instantiating the middleware's keeper in `app.go` + +```go +type Keeper struct { + storeKey storetypes.StoreKey + cdc codec.BinaryCodec + + ics4Wrapper porttypes.ICS4Wrapper + channelKeeper types.ChannelKeeper + portKeeper types.PortKeeper + ... +} +``` + +For stateless middleware, the `ics4Wrapper` can be passed on directly without having to instantiate a keeper struct for the middleware. + +[The interface](https://github.com/cosmos/ibc-go/blob/v7.0.0/modules/core/05-port/types/module.go#L110-L133) looks as follows: + +```go +// This is implemented by ICS4 and all middleware that are wrapping base application. +// The base application will call `sendPacket` or `writeAcknowledgement` of the middleware directly above them +// which will call the next middleware until it reaches the core IBC handler. +type ICS4Wrapper interface { + SendPacket( + ctx sdk.Context, + sourcePort string, + sourceChannel string, + timeoutHeight clienttypes.Height, + timeoutTimestamp uint64, + data []byte, + ) (sequence uint64, err error) + + WriteAcknowledgement( + ctx sdk.Context, + packet exported.PacketI, + ack exported.Acknowledgement, + ) error + + GetAppVersion( + ctx sdk.Context, + portID, + channelID string, + ) (string, bool) +} +``` + +:warning: In the following paragraphs, the methods are presented in pseudo code which has been kept general, not stating whether the middleware is stateful or stateless. Remember that when the middleware is stateful, `ics4Wrapper` can be accessed through the keeper. + +Check out the references provided for an actual implementation to clarify, where the `ics4Wrapper` methods in `ibc_middleware.go` simply call the equivalent keeper methods where the actual logic resides. + +### `SendPacket` + +```go +func SendPacket( + ctx sdk.Context, + sourcePort string, + sourceChannel string, + timeoutHeight clienttypes.Height, + timeoutTimestamp uint64, + appData []byte, +) (uint64, error) { + // middleware may modify data + data = doCustomLogic(appData) + + return ics4Wrapper.SendPacket( + ctx, + sourcePort, + sourceChannel, + timeoutHeight, + timeoutTimestamp, + data, + ) +} +``` + +See [here](https://github.com/cosmos/ibc-go/blob/v7.0.0/modules/apps/29-fee/keeper/relay.go#L17-L27) an example implementation of this function for the ICS-29 Fee Middleware module. + +### `WriteAcknowledgement` + +```go +// only called for async acks +func WriteAcknowledgement( + ctx sdk.Context, + packet exported.PacketI, + ack exported.Acknowledgement, +) error { + // middleware may modify acknowledgement + ack_bytes = doCustomLogic(ack) + + return ics4Wrapper.WriteAcknowledgement(packet, ack_bytes) +} +``` + +See [here](https://github.com/cosmos/ibc-go/blob/v7.0.0/modules/apps/29-fee/keeper/relay.go#L31-L55) an example implementation of this function for the ICS-29 Fee Middleware module. + +### `GetAppVersion` + +```go +// middleware must return the underlying application version +func GetAppVersion( + ctx sdk.Context, + portID, + channelID string, +) (string, bool) { + version, found := ics4Wrapper.GetAppVersion(ctx, portID, channelID) + if !found { + return "", false + } + + if !MiddlewareEnabled { + return version, true + } + + // unwrap channel version + metadata, err := Unmarshal(version) + if err != nil { + panic(fmt.Errof("unable to unmarshal version: %w", err)) + } + + return metadata.AppVersion, true +} +``` + +See [here](https://github.com/cosmos/ibc-go/blob/v7.0.0/modules/apps/29-fee/keeper/relay.go#L58-L74) an example implementation of this function for the ICS-29 Fee Middleware module. diff --git a/docs/versioned_docs/version-v9.0.x/01-ibc/04-middleware/03-integration.md b/docs/versioned_docs/version-v9.0.x/01-ibc/04-middleware/03-integration.md new file mode 100644 index 00000000000..f049555e544 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/01-ibc/04-middleware/03-integration.md @@ -0,0 +1,74 @@ +--- +title: Integrating IBC middleware into a chain +sidebar_label: Integrating IBC middleware into a chain +sidebar_position: 3 +slug: /ibc/middleware/integration +--- + + +# Integrating IBC middleware into a chain + +Learn how to integrate IBC middleware(s) with a base application to your chain. The following document only applies for Cosmos SDK chains. + +If the middleware is maintaining its own state and/or processing SDK messages, then it should create and register its SDK module with the module manager in `app.go`. + +All middleware must be connected to the IBC router and wrap over an underlying base IBC application. An IBC application may be wrapped by many layers of middleware, only the top layer middleware should be hooked to the IBC router, with all underlying middlewares and application getting wrapped by it. + +The order of middleware **matters**, function calls from IBC to the application travel from top-level middleware to the bottom middleware and then to the application. Function calls from the application to IBC goes through the bottom middleware in order to the top middleware and then to core IBC handlers. Thus the same set of middleware put in different orders may produce different effects. + +## Example integration + +```go +// app.go pseudocode + +// middleware 1 and middleware 3 are stateful middleware, +// perhaps implementing separate sdk.Msg and Handlers +mw1Keeper := mw1.NewKeeper(storeKey1, ..., ics4Wrapper: channelKeeper, ...) // in stack 1 & 3 +// middleware 2 is stateless +mw3Keeper1 := mw3.NewKeeper(storeKey3,..., ics4Wrapper: mw1Keeper, ...) // in stack 1 +mw3Keeper2 := mw3.NewKeeper(storeKey3,..., ics4Wrapper: channelKeeper, ...) // in stack 2 + +// Only create App Module **once** and register in app module +// if the module maintains independent state and/or processes sdk.Msgs +app.moduleManager = module.NewManager( + ... + mw1.NewAppModule(mw1Keeper), + mw3.NewAppModule(mw3Keeper1), + mw3.NewAppModule(mw3Keeper2), + transfer.NewAppModule(transferKeeper), + custom.NewAppModule(customKeeper) +) + +scopedKeeperTransfer := capabilityKeeper.NewScopedKeeper("transfer") +scopedKeeperCustom1 := capabilityKeeper.NewScopedKeeper("custom1") +scopedKeeperCustom2 := capabilityKeeper.NewScopedKeeper("custom2") + +// NOTE: IBC Modules may be initialized any number of times provided they use a separate +// scopedKeeper and underlying port. + +customKeeper1 := custom.NewKeeper(..., scopedKeeperCustom1, ...) +customKeeper2 := custom.NewKeeper(..., scopedKeeperCustom2, ...) + +// initialize base IBC applications +// if you want to create two different stacks with the same base application, +// they must be given different scopedKeepers and assigned different ports. +transferIBCModule := transfer.NewIBCModule(transferKeeper) +customIBCModule1 := custom.NewIBCModule(customKeeper1, "portCustom1") +customIBCModule2 := custom.NewIBCModule(customKeeper2, "portCustom2") + +// create IBC stacks by combining middleware with base application +// NOTE: since middleware2 is stateless it does not require a Keeper +// stack 1 contains mw1 -> mw3 -> transfer +stack1 := mw1.NewIBCMiddleware(mw3.NewIBCMiddleware(transferIBCModule, mw3Keeper1), mw1Keeper) +// stack 2 contains mw3 -> mw2 -> custom1 +stack2 := mw3.NewIBCMiddleware(mw2.NewIBCMiddleware(customIBCModule1), mw3Keeper2) +// stack 3 contains mw2 -> mw1 -> custom2 +stack3 := mw2.NewIBCMiddleware(mw1.NewIBCMiddleware(customIBCModule2, mw1Keeper)) + +// associate each stack with the moduleName provided by the underlying scopedKeeper +ibcRouter := porttypes.NewRouter() +ibcRouter.AddRoute("transfer", stack1) +ibcRouter.AddRoute("custom1", stack2) +ibcRouter.AddRoute("custom2", stack3) +app.IBCKeeper.SetRouter(ibcRouter) +``` diff --git a/docs/versioned_docs/version-v9.0.x/01-ibc/04-middleware/_category_.json b/docs/versioned_docs/version-v9.0.x/01-ibc/04-middleware/_category_.json new file mode 100644 index 00000000000..6596fe16c13 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/01-ibc/04-middleware/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Middleware", + "position": 4, + "link": null +} \ No newline at end of file diff --git a/docs/versioned_docs/version-v9.0.x/01-ibc/04-middleware/images/middleware-stack.png b/docs/versioned_docs/version-v9.0.x/01-ibc/04-middleware/images/middleware-stack.png new file mode 100644 index 0000000000000000000000000000000000000000..1d54f8081700fb7cf718d87f7cdc706ca3400b9a GIT binary patch literal 194858 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 z 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 z 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 PdU!8X=JGAZ^DW?(U>RmAGT!sJ% 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

%@>82P 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 Note: if the signer is the authority, e.g. the `gov` address, no `ErrorReceipt` or proof is required if the current channel state is not in FLUSHCOMPLETE. +> These can be left empty in the `MsgChannelUpgradeCancel` message in that case. + +Upon cancelling a channel upgrade, an `ErrorReceipt` will be written with the channel's current upgrade sequence, and +the channel will move back to `OPEN` state keeping its original parameters. + +It will then be possible to re-initiate an upgrade by sending a `MsgChannelOpenInit` message. + +:::warning + +Performing sequentially an upgrade cancellation, upgrade initialization, and another upgrade cancellation in a single block while the counterparty is in `FLUSHCOMPLETE` will lead to corrupted state. +The counterparty will be unable to cancel its upgrade attempt and will require a manual migration. +When the counterparty is in `FLUSHCOMPLETE`, it requires a proof that the counterparty cancelled its current upgrade attempt. +When this cancellation is succeeded by an initialization and cancellation in the same block, it results in the proof of cancellation existing only for the next upgrade attempt, not the current. + +::: + +## Timing Out a Channel Upgrade + +Timing out an outstanding channel upgrade may be necessary during the flushing packet stage of the channel upgrade process. As stated above, with `ChanUpgradeTry` or `ChanUpgradeAck`, the channel state has been changed from `OPEN` to `FLUSHING`, so no new packets will be allowed to be sent over this channel while flushing. If upgrades cannot be performed in a timely manner (due to unforeseen flushing issues), upgrade timeouts allow the channel to avoid blocking packet sends indefinitely. If flushing exceeds the time limit set in the `UpgradeTimeout` channel `Params`, the upgrade process will need to be timed out to abort the upgrade attempt and resume normal channel processing. + +Channel upgrades require setting a valid timeout value in the channel `Params` before submitting a `MsgChannelUpgradeTry` or `MsgChannelUpgradeAck` message (by default, 10 minutes): + +```go +type Params struct { + UpgradeTimeout Timeout +} +``` + +A valid Timeout contains either one or both of a timestamp and block height (sequence). + +```go +type Timeout struct { + // block height after which the packet or upgrade times out + Height types.Height + // block timestamp (in nanoseconds) after which the packet or upgrade times out + Timestamp uint64 +} +``` + +This timeout will then be set as a field on the `Upgrade` struct itself when flushing is started. + +```go +type Upgrade struct { + Fields UpgradeFields + Timeout Timeout + NextSequenceSend uint64 +} +``` + +If the timeout has been exceeded during flushing, a chain can then submit the `MsgChannelUpgradeTimeout` to timeout the channel upgrade process: + +```go +type MsgChannelUpgradeTimeout struct { + PortId string + ChannelId string + CounterpartyChannel Channel + ProofChannel []byte + ProofHeight types.Height + Signer string +} +``` + +An `ErrorReceipt` will be written with the channel's current upgrade sequence, and the channel will move back to `OPEN` state keeping its original parameters. + +Note that timing out a channel upgrade will end the upgrade process, and a new `MsgChannelUpgradeInit` will have to be submitted via governance in order to restart the upgrade process. + +## Pruning Acknowledgements + +Acknowledgements can be pruned by broadcasting the `MsgPruneAcknowledgements` message. + +> Note: It is only possible to prune acknowledgements after a channel has been upgraded, so pruning will fail +> if the channel has not yet been upgraded. + +```protobuf +// MsgPruneAcknowledgements defines the request type for the PruneAcknowledgements rpc. +message MsgPruneAcknowledgements { + option (cosmos.msg.v1.signer) = "signer"; + option (gogoproto.goproto_getters) = false; + + string port_id = 1; + string channel_id = 2; + uint64 limit = 3; + string signer = 4; +} +``` + +The `port_id` and `channel_id` specify the port and channel to act on, and the `limit` specifies the upper bound for the number +of acknowledgements and packet receipts to prune. + +### CLI Usage + +Acknowledgements can be pruned via the cli with the `prune-acknowledgements` command. + +```bash +simd tx ibc channel prune-acknowledgements [port] [channel] [limit] +``` + +## IBC App Recommendations + +IBC application callbacks should be primarily used to validate data fields and do compatibility checks. Application developers +should be aware that callbacks will be invoked before any core ibc state changes are written. + +`OnChanUpgradeInit` should validate the proposed version, order, and connection hops, and should return the application version to upgrade to. + +`OnChanUpgradeTry` should validate the proposed version (provided by the counterparty), order, and connection hops. The desired upgrade version should be returned. + +`OnChanUpgradeAck` should validate the version proposed by the counterparty. + +`OnChanUpgradeOpen` should perform any logic associated with changing of the channel fields. + +> IBC applications should not attempt to process any packet data under the new conditions until after `OnChanUpgradeOpen` +> has been executed, as up until this point it is still possible for the upgrade handshake to fail and for the channel +> to remain in the pre-upgraded state. + +## Upgrade an existing transfer application stack to use 29-fee middleware + +### Wire up the transfer stack and middleware in app.go + +In app.go, the existing transfer stack must be wrapped with the fee middleware. + +```golang + +import ( + // ... + ibcfee "github.com/cosmos/ibc-go/v9/modules/apps/29-fee" + ibctransferkeeper "github.com/cosmos/ibc-go/v9/modules/apps/transfer/keeper" + transfer "github.com/cosmos/ibc-go/v9/modules/apps/transfer" + porttypes "github.com/cosmos/ibc-go/v9/modules/core/05-port/types" + // ... +) + +type App struct { + // ... + TransferKeeper ibctransferkeeper.Keeper + IBCFeeKeeper ibcfeekeeper.Keeper + // .. +} + +// ... + +app.IBCFeeKeeper = ibcfeekeeper.NewKeeper( + appCodec, keys[ibcfeetypes.StoreKey], + app.IBCKeeper.ChannelKeeper, // may be replaced with IBC middleware + app.IBCKeeper.ChannelKeeper, + app.IBCKeeper.PortKeeper, app.AccountKeeper, app.BankKeeper, +) + +// Create Transfer Keeper and pass IBCFeeKeeper as expected Channel and PortKeeper +// since fee middleware will wrap the IBCKeeper for underlying application. +app.TransferKeeper = ibctransferkeeper.NewKeeper( + appCodec, keys[ibctransfertypes.StoreKey], app.GetSubspace(ibctransfertypes.ModuleName), + app.IBCFeeKeeper, // ISC4 Wrapper: fee IBC middleware + app.IBCKeeper.ChannelKeeper, app.IBCKeeper.PortKeeper, + app.AccountKeeper, app.BankKeeper, scopedTransferKeeper, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), +) + + +ibcRouter := porttypes.NewRouter() + +// create IBC module from bottom to top of stack +var transferStack porttypes.IBCModule +transferStack = transfer.NewIBCModule(app.TransferKeeper) +transferStack = ibcfee.NewIBCMiddleware(transferStack, app.IBCFeeKeeper) + +// Add transfer stack to IBC Router +ibcRouter.AddRoute(ibctransfertypes.ModuleName, transferStack) +``` + +### Submit a governance proposal to execute a MsgChannelUpgradeInit message + +> This process can be performed with the new CLI that has been added +> outlined [here](#upgrading-channels-with-the-cli). + +Only the configured authority for the ibc module is able to initiate a channel upgrade by submitting a `MsgChannelUpgradeInit` message. + +Execute a governance proposal specifying the relevant fields to perform a channel upgrade. + +Update the following json sample, and copy the contents into `proposal.json`. + +```json +{ + "title": "Channel upgrade init", + "summary": "Channel upgrade init", + "messages": [ + { + "@type": "/ibc.core.channel.v1.MsgChannelUpgradeInit", + "signer": "", + "port_id": "transfer", + "channel_id": "channel-...", + "fields": { + "ordering": "ORDER_UNORDERED", + "connection_hops": ["connection-0"], + "version": "{\"fee_version\":\"ics29-1\",\"app_version\":\"ics20-1\"}" + } + } + ], + "metadata": "", + "deposit": "10stake" +} +``` + +> Note: ensure the correct fields.version is specified. This is the new version that the channels will be upgraded to. + +### Submit the proposal + +```shell +simd tx submit-proposal proposal.json --from +``` + +## Upgrading channels with the CLI + +A new cli has been added which enables either + - submitting a governance proposal which contains a `MsgChannelUpgradeInit` for every channel to be upgraded. + - generating a `proposal.json` file which contains the proposal contents to be edited/submitted at a later date. + +The following example, would submit a governance proposal with the specified deposit, title and summary which would +contain a `MsgChannelUpgradeInit` for all `OPEN` channels whose port matches the regular expression `transfer`. + +> Note: by adding the `--json` flag, the command would instead output the contents of the proposal which could be +> stored in a `proposal.json` file to be edited and submitted at a later date. + +```bash +simd tx ibc channel upgrade-channels "{\"fee_version\":\"ics29-1\",\"app_version\":\"ics20-1\"}" \ + --deposit "10stake" \ + --title "Channel Upgrades Governance Proposal" \ + --summary "Upgrade all transfer channels to be fee enabled" \ + --port-pattern "transfer" +``` + +It is also possible to explicitly list a comma separated string of channel IDs. It is important to note that the +regular expression matching specified by `--port-pattern` (which defaults to `transfer`) still applies. + +For example the following command would generate the contents of a `proposal.json` file which would attempt to upgrade +channels with a port ID of `transfer` and a channelID of `channel-0`, `channel-1` or `channel-2`. + +```bash +simd tx ibc channel upgrade-channels "{\"fee_version\":\"ics29-1\",\"app_version\":\"ics20-1\"}" \ + --deposit "10stake" \ + --title "Channel Upgrades Governance Proposal" \ + --summary "Upgrade all transfer channels to be fee enabled" \ + --port-pattern "transfer" \ + --channel-ids "channel-0,channel-1,channel-2" \ + --json +``` diff --git a/docs/versioned_docs/version-v9.0.x/01-ibc/07-proposals.md b/docs/versioned_docs/version-v9.0.x/01-ibc/07-proposals.md new file mode 100644 index 00000000000..9a78f0b2aec --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/01-ibc/07-proposals.md @@ -0,0 +1,118 @@ +--- +title: Governance Proposals +sidebar_label: Governance Proposals +sidebar_position: 7 +slug: /ibc/proposals +--- + +# Governance Proposals + +In uncommon situations, a highly valued client may become frozen due to uncontrollable +circumstances. A highly valued client might have hundreds of channels being actively used. +Some of those channels might have a significant amount of locked tokens used for ICS 20. + +If the one third of the validator set of the chain the client represents decides to collude, +they can sign off on two valid but conflicting headers each signed by the other one third +of the honest validator set. The light client can now be updated with two valid, but conflicting +headers at the same height. The light client cannot know which header is trustworthy and therefore +evidence of such misbehaviour is likely to be submitted resulting in a frozen light client. + +Frozen light clients cannot be updated under any circumstance except via a governance proposal. +Since a quorum of validators can sign arbitrary state roots which may not be valid executions +of the state machine, a governance proposal has been added to ease the complexity of unfreezing +or updating clients which have become "stuck". Without this mechanism, validator sets would need +to construct a state root to unfreeze the client. Unfreezing clients, re-enables all of the channels +built upon that client. This may result in recovery of otherwise lost funds. + +Tendermint light clients may become expired if the trusting period has passed since their +last update. This may occur if relayers stop submitting headers to update the clients. + +An unplanned upgrade by the counterparty chain may also result in expired clients. If the counterparty +chain undergoes an unplanned upgrade, there may be no commitment to that upgrade signed by the validator +set before the chain ID changes. In this situation, the validator set of the last valid update for the +light client is never expected to produce another valid header since the chain ID has changed, which will +ultimately lead the on-chain light client to become expired. + +In the case that a highly valued light client is frozen, expired, or rendered non-updateable, a +governance proposal may be submitted to update this client, known as the subject client. The +proposal includes the client identifier for the subject and the client identifier for a substitute +client. Light client implementations may implement custom updating logic, but in most cases, +the subject will be updated to the latest consensus state of the substitute client, if the proposal passes. +The substitute client is used as a "stand in" while the subject is on trial. It is best practice to create +a substitute client *after* the subject has become frozen to avoid the substitute from also becoming frozen. +An active substitute client allows headers to be submitted during the voting period to prevent accidental expiry +once the proposal passes. + +*note* two of these parameters: `AllowUpdateAfterExpiry` and `AllowUpdateAfterMisbehavior` have been deprecated, and will both be set to `false` upon upgrades even if they were previously set to `true`. These parameters will no longer play a role in restricting a client upgrade. Please see ADR026 for more details. + +# How to recover an expired client with a governance proposal + +See also the relevant documentation: [ADR-026, IBC client recovery mechanisms](/architecture/adr-026-ibc-client-recovery-mechanisms) + +> **Who is this information for?** +> Although technically anyone can submit the governance proposal to recover an expired client, often it will be **relayer operators** (at least coordinating the submission). + +## Preconditions + +- There exists an active client (with a known client identifier) for the same counterparty chain as the expired client. +- The governance deposit. + +## Steps + +### Step 1 + +Check if the client is attached to the expected `chain_id`. For example, for an expired Tendermint client representing the Akash chain the client state looks like this on querying the client state: + +```text +{ + client_id: 07-tendermint-146 + client_state: + '@type': /ibc.lightclients.tendermint.v1.ClientState + allow_update_after_expiry: true + allow_update_after_misbehaviour: true + chain_id: akashnet-2 +} +``` + +The client is attached to the expected Akash `chain_id`. Note that although the parameters (`allow_update_after_expiry` and `allow_update_after_misbehaviour`) exist to signal intent, these parameters have been deprecated and will not enforce any checks on the revival of client. See ADR-026 for more context on this deprecation. + +### Step 2 + +Anyone can submit the governance proposal to recover the client by executing the following via CLI. +If the chain is on an ibc-go version older than v8, please see the [relevant documentation](https://ibc.cosmos.network/v7/ibc/proposals). + +- From ibc-go v8 onwards + + ```shell + tx gov submit-proposal [path-to-proposal-json] + ``` + + where `proposal.json` contains: + + ```json + { + "messages": [ + { + "@type": "/ibc.core.client.v1.MsgRecoverClient", + "subject_client_id": "", + "substitute_client_id": "", + "signer": "" + } + ], + "metadata": "", + "deposit": "10stake" + "title": "My proposal", + "summary": "A short summary of my proposal", + "expedited": false + } + ``` + +The `` identifier is the proposed client to be updated. This client must be either frozen or expired. + +The `` represents a substitute client. It carries all the state for the client which may be updated. It must have identical client and chain parameters to the client which may be updated (except for latest height, frozen height, and chain ID). It should be continually updated during the voting period. + +After this, all that remains is deciding who funds the governance deposit and ensuring the governance proposal passes. If it does, the client on trial will be updated to the latest state of the substitute. + +## Important considerations + +Please note that if the counterparty client is also expired, that client will also need to update. This process updates only one client. diff --git a/docs/versioned_docs/version-v9.0.x/01-ibc/08-relayer.md b/docs/versioned_docs/version-v9.0.x/01-ibc/08-relayer.md new file mode 100644 index 00000000000..100d68fc77a --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/01-ibc/08-relayer.md @@ -0,0 +1,53 @@ +--- +title: Relayer +sidebar_label: Relayer +sidebar_position: 8 +slug: /ibc/relayer +--- + +# Relayer + +:::note + +## Pre-requisite readings + +- [IBC Overview](01-overview.md) +- [Events](https://github.com/cosmos/cosmos-sdk/blob/main/docs/learn/advanced/08-events.md) + +::: + +## Events + +Events are emitted for every transaction processed by the base application to indicate the execution +of some logic clients may want to be aware of. This is extremely useful when relaying IBC packets. +Any message that uses IBC will emit events for the corresponding TAO logic executed as defined in +the [IBC events document](/events/events). + +In the SDK, it can be assumed that for every message there is an event emitted with the type `message`, +attribute key `action`, and an attribute value representing the type of message sent +(`channel_open_init` would be the attribute value for `MsgChannelOpenInit`). If a relayer queries +for transaction events, it can split message events using this event Type/Attribute Key pair. + +The Event Type `message` with the Attribute Key `module` may be emitted multiple times for a single +message due to application callbacks. It can be assumed that any TAO logic executed will result in +a module event emission with the attribute value `ibc_` (02-client emits `ibc_client`). + +### Subscribing with Tendermint + +Calling the Tendermint RPC method `Subscribe` via [Tendermint's Websocket](https://docs.tendermint.com/main/rpc/) will return events using +Tendermint's internal representation of them. Instead of receiving back a list of events as they +were emitted, Tendermint will return the type `map[string][]string` which maps a string in the +form `.` to `attribute_value`. This causes extraction of the event +ordering to be non-trivial, but still possible. + +A relayer should use the `message.action` key to extract the number of messages in the transaction +and the type of IBC transactions sent. For every IBC transaction within the string array for +`message.action`, the necessary information should be extracted from the other event fields. If +`send_packet` appears at index 2 in the value for `message.action`, a relayer will need to use the +value at index 2 of the key `send_packet.packet_sequence`. This process should be repeated for each +piece of information needed to relay a packet. + +## Example Implementations + +- [Golang Relayer](https://github.com/cosmos/relayer) +- [Hermes](https://github.com/informalsystems/ibc-rs/tree/master/crates/relayer) diff --git a/docs/versioned_docs/version-v9.0.x/01-ibc/09-proto-docs.md b/docs/versioned_docs/version-v9.0.x/01-ibc/09-proto-docs.md new file mode 100644 index 00000000000..1666d3b7dd2 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/01-ibc/09-proto-docs.md @@ -0,0 +1,11 @@ +--- +title: Protobuf Documentation +sidebar_label: Protobuf Documentation +sidebar_position: 9 +slug: /ibc/proto-docs +--- + + +# Protobuf documentation + +See [ibc-go Buf Protobuf documentation](https://buf.build/cosmos/ibc/docs/main). diff --git a/docs/versioned_docs/version-v9.0.x/01-ibc/10-roadmap.md b/docs/versioned_docs/version-v9.0.x/01-ibc/10-roadmap.md new file mode 100644 index 00000000000..88651908455 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/01-ibc/10-roadmap.md @@ -0,0 +1,50 @@ +--- +title: Roadmap +sidebar_label: Roadmap +sidebar_position: 10 +slug: /ibc/roadmap +--- + +# Roadmap ibc-go + +*Latest update: June 7th, 2024* + +This document endeavours to inform the wider IBC community about plans and priorities for work on ibc-go by the team at Interchain GmbH. It is intended to broadly inform all users of ibc-go, including developers and operators of IBC, relayer, chain and wallet applications. + +This roadmap should be read as a high-level guide, rather than a commitment to schedules and deliverables. The degree of specificity is inversely proportional to the timeline. We will update this document periodically to reflect the status and plans. For the latest expected release timelines, please check [here](https://github.com/cosmos/ibc-go/wiki/Release-timeline). + +## v9.0.0 + +### ICS20 v2 + +The transfer application will be updated to add support for [transferring multiple tokens in the same packet](https://github.com/cosmos/ibc/pull/1020) and support for [atomically route tokens series of paths with a single packet](https://github.com/cosmos/ibc/pull/1090). + +## v10.0.0 + +### ICA v2 + +This new version of ICS27 will address many of [the pain points with the current design](https://github.com/cosmos/ibc-go/pull/6281), including multiplexing all communication between controller and host through a single channel (instead of each interchain account on the host being associated to a different channel, as it is now). + +### Multipacket atomicity + +We will refactor the 05-port router to enable atomic sending of multiple packets belonging to different applications. + +--- + +And potentially later on... + +#### Multihop channels + +Multihop channels specify a way to route messages across a path of IBC enabled blockchains utilizing multiple pre-existing IBC connections. The current IBC protocol defines messaging in a point-to-point paradigm which allows message passing between two directly connected IBC chains, but as more IBC enabled chains come into existence there becomes a need to relay IBC packets across chains because IBC connections may not exist between the two chains wishing to exchange messages. IBC connections may not exist for a variety of reasons which could include economic inviability since connections require client state to be continuously exchanged between connection ends which carries a cost. Please see the [ICS 33 spec](https://github.com/cosmos/ibc/blob/main/spec/core/ics-033-multi-hop/README.md) for more information. + +--- + +This roadmap is also available as a [project board](https://github.com/orgs/cosmos/projects/7/views/25). + +For the latest expected release timelines, please check [here](https://github.com/cosmos/ibc-go/wiki/Release-timeline). + +For the latest information on the progress of the work or the decisions made that might influence the roadmap, please follow the [Announcements](https://github.com/cosmos/ibc-go/discussions/categories/announcements) category in the Discussions tab of the repository. + +--- + +**Note**: release version numbers may be subject to change. diff --git a/docs/versioned_docs/version-v9.0.x/01-ibc/11-troubleshooting.md b/docs/versioned_docs/version-v9.0.x/01-ibc/11-troubleshooting.md new file mode 100644 index 00000000000..4080f3b449b --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/01-ibc/11-troubleshooting.md @@ -0,0 +1,15 @@ +--- +title: Troubleshooting +sidebar_label: Troubleshooting +sidebar_position: 11 +slug: /ibc/troubleshooting +--- + +# 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 or the `AllowAllClients` wildcard (`"*"`) is used, all usage of clients of this type will be prevented. diff --git a/docs/versioned_docs/version-v9.0.x/01-ibc/13-best-practices.md b/docs/versioned_docs/version-v9.0.x/01-ibc/13-best-practices.md new file mode 100644 index 00000000000..47e10d36ac2 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/01-ibc/13-best-practices.md @@ -0,0 +1,25 @@ +--- +title: Best Practices +sidebar_label: Best Practices +sidebar_position: 13 +slug: /ibc/best-practices +--- + +# Best practices + +## Identifying legitimate channels + +Identifying which channel to use can be difficult as it requires verifying information about the chains you want to connect to. +Channels are based on a light client. A chain can be uniquely identified by its chain ID, validator set pairing. It is unsafe to rely only on the chain ID. +Any user can create a client with any chain ID, but only the chain with correct validator set and chain ID can produce headers which would update that client. + +Which channel to use is based on social consensus. The desired channel should have the following properties: + +- based on a valid client (can only be updated by the chain it connects to) +- has sizable activity +- the underlying client is active + +To verify if a client is valid. You will need to obtain a header from the chain you want to connect to. This can be done by running a full node for that chain or relying on a trusted rpc address. +Then you should query the light client you want to verify and obtain its latest consensus state. All consensus state fields must match the header queried for at same height as the consensus state (root, timestamp, next validator set hash). + +Explorers and wallets are highly encouraged to follow this practice. It is unsafe to algorithmically add new channels without following this process. diff --git a/docs/versioned_docs/version-v9.0.x/01-ibc/14-permissioning.md b/docs/versioned_docs/version-v9.0.x/01-ibc/14-permissioning.md new file mode 100644 index 00000000000..c96ecf3cc26 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/01-ibc/14-permissioning.md @@ -0,0 +1,32 @@ +--- +title: Permissioning +sidebar_label: Permissioning +sidebar_position: 14 +slug: /ibc/permissioning +--- + +# Permissioning + +IBC is designed at its base level to be a permissionless protocol. This does not mean that chains cannot add in permissioning on top of IBC. In ibc-go this can be accomplished by implementing and wiring an ante-decorator that checks if the IBC message is signed by a permissioned authority. If the signer address check passes, the tx can go through; otherwise it is rejected from the mempool. + +The antehandler runs before message-processing so it acts as a customizable filter that can reject messages before they get included in the block. The Cosmos SDK allows developers to write ante-decorators that can be stacked with others to add multiple independent customizable filters that run in sequence. Thus, chain developers that want to permission IBC messages are advised to implement their own custom permissioned IBC ante-decorator to add to the standard ante-decorator stack. + +## Best practices + +`MsgCreateClient`: permissioning the client creation is the most important for permissioned IBC. This will prevent malicious relayers from creating clients to fake chains. If a chain wants to control which chains are connected to it directly over IBC, the best way to do this is by controlling which clients get created. The permissioned authority can create clients only of counterparties that the chain approves of. The permissioned authority can be the governance account, however `MsgCreateClient` contains a consensus state that can be expired by the time governance passes the proposal to execute the message. Thus, if the voting period is longer than the unbonding period of the counterparty, it is advised to use a permissioned authority that can immediately execute the transaction (e.g. a trusted multisig). + +`MsgConnectionOpenInit`: permissioning this message will give the chain control over the connections that are opened and also will control which connection identifier is associated with which counterparty. + +`MsgConnectionOpenTry`: permissioning this message through a permissioned address check is ill-advised because it will prevent relayers from easily completing the handshake that was initialized on the counterparty. However, if the chain does want strict control of exactly which connections are opened, it can permission this message. Be aware, if two chains with strict permissions try to open a connection it may take much longer than expected. + +`MsgChannelOpenInit`: permissioning this message will give the chain control over the channels that are opened and also will control which channel identifier is associated with which counterparty. + +`MsgChannelOpenTry`: permissioning this message through a permissioned address check is ill-advised because it will prevent relayers from easily completing the handshake that was initialized on the counterparty. However, if the chain does want strict control of exactly which channels are opened, it can permission this message. Be aware, if two chains with strict permissions try to open a channel it may take much longer than expected. + +It is not advised to permission any other message from ibc-go. Permissionless relayers should still be allowed to complete handshakes that were authorized by permissioned parties, and to relay user packets on channels that were also authorized by permissioned parties. This provides the maximum liveness provided by a permissionless relayer network with the safety guarantees provided by permissioned client, connection, and channel creation. + +## Genesis setup + +Chains that are starting up from genesis have the option of initializing authorized clients, connections and channels from genesis. This allows chains to automatically connect to desired chains with a desired identifier. + +Note: The chain must be launched soon after the genesis file is created so that the client creation does not occur with an expired consensus state. The connections and channels must also simply have their `INIT` messages executed so that relayers can complete the rest of the handshake. diff --git a/docs/versioned_docs/version-v9.0.x/01-ibc/_category_.json b/docs/versioned_docs/version-v9.0.x/01-ibc/_category_.json new file mode 100644 index 00000000000..066f3af93b1 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/01-ibc/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Using IBC-Go", + "position": 1, + "link": null +} \ No newline at end of file diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/01-overview.md b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/01-overview.md new file mode 100644 index 00000000000..d61ac19dbfb --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/01-overview.md @@ -0,0 +1,181 @@ +--- +title: Overview +sidebar_label: Overview +sidebar_position: 1 +slug: /apps/transfer/overview +--- + +# Overview + +:::note Synopsis +Learn about what the token Transfer module is +::: + +## What is the Transfer module? + +Transfer is the Cosmos SDK implementation of the [ICS-20](https://github.com/cosmos/ibc/tree/master/spec/app/ics-020-fungible-token-transfer) protocol, which enables cross-chain fungible token transfers. + +## Concepts + +### Acknowledgements + +ICS20 uses the recommended acknowledgement format as specified by [ICS 04](https://github.com/cosmos/ibc/tree/master/spec/core/ics-004-channel-and-packet-semantics#acknowledgement-envelope). + +A successful receive of a transfer packet will result in a Result Acknowledgement being written +with the value `[]byte{byte(1)}` in the `Response` field. + +An unsuccessful receive of a transfer packet will result in an Error Acknowledgement being written +with the error message in the `Response` field. + +### Denomination trace + +The denomination trace corresponds to the information that allows a token to be traced back to its +origin chain. It contains a sequence of port and channel identifiers ordered from the most recent to +the oldest in the timeline of transfers. + +This information is included on the token's base denomination field in the form of a hash to prevent an +unbounded denomination length. For example, the token `transfer/channelToA/uatom` will be displayed +as `ibc/7F1D3FCF4AE79E1554D670D1AD949A9BA4E4A3C76C63093E17E446A46061A7A2`. The human readable denomination +is stored using `x/bank` module's [denom metadata](https://docs.cosmos.network/main/build/modules/bank#denom-metadata) +feature. You may display the human readable denominations by querying balances with the `--resolve-denom` flag, as in: + +```shell +simd query bank balances [address] --resolve-denom +``` + +Each send to any chain other than the one it was previously received from is a movement forwards in +the token's timeline. This causes trace to be added to the token's history and the destination port +and destination channel to be prefixed to the denomination. In these instances the sender chain is +acting as the "source zone". When the token is sent back to the chain it previously received from, the +prefix is removed. This is a backwards movement in the token's timeline and the sender chain is +acting as the "sink zone". + +It is strongly recommended to read the full details of [ADR 001: Coin Source Tracing](/architecture/adr-001-coin-source-tracing) to understand the implications and context of the IBC token representations. + +## UX suggestions for clients + +For clients (wallets, exchanges, applications, block explorers, etc) that want to display the source of the token, it is recommended to use the following alternatives for each of the cases below: + +### Direct connection + +If the denomination trace contains a single identifier prefix pair (as in the example above), then +the easiest way to retrieve the chain and light client identifier is to map the trace information +directly. In summary, this requires querying the channel from the denomination trace identifiers, +and then the counterparty client state using the counterparty port and channel identifiers from the +retrieved channel. + +A general pseudo algorithm would look like the following: + +1. Query the full denomination trace. +2. Query the channel with the `portID/channelID` pair, which corresponds to the first destination of the + token. +3. Query the client state using the identifiers pair. Note that this query will return a `"Not +Found"` response if the current chain is not connected to this channel. +4. Retrieve the client identifier or chain identifier from the client state (eg: on + Tendermint clients) and store it locally. + +Using the gRPC gateway client service the steps above would be, with a given IBC token `ibc/7F1D3FCF4AE79E1554D670D1AD949A9BA4E4A3C76C63093E17E446A46061A7A2` stored on `chainB`: + +1. `GET /ibc/apps/transfer/v1/denom_traces/7F1D3FCF4AE79E1554D670D1AD949A9BA4E4A3C76C63093E17E446A46061A7A2` -> `{"path": "transfer/channelToA", "base_denom": "uatom"}` +2. `GET /ibc/apps/transfer/v1/channels/channelToA/ports/transfer/client_state"` -> `{"client_id": "clientA", "chain-id": "chainA", ...}` +3. `GET /ibc/apps/transfer/v1/channels/channelToA/ports/transfer"` -> `{"channel_id": "channelToA", port_id": "transfer", counterparty: {"channel_id": "channelToB", port_id": "transfer"}, ...}` +4. `GET /ibc/apps/transfer/v1/channels/channelToB/ports/transfer/client_state" -> {"client_id": "clientB", "chain-id": "chainB", ...}` + +Then, the token transfer chain path for the `uatom` denomination would be: `chainA` -> `chainB`. + +### Multiple hops + +The multiple channel hops case applies when the token has passed through multiple chains between the original source and final destination chains. + +The IBC protocol doesn't know the topology of the overall network (i.e connections between chains and identifier names between them). For this reason, in the multiple hops case, a particular chain in the timeline of the individual transfers can't query the chain and client identifiers of the other chains. + +Take for example the following sequence of transfers `A -> B -> C` for an IBC token, with a final prefix path (trace info) of `transfer/channelChainC/transfer/channelChainB`. What the paragraph above means is that even in the case that chain `C` is directly connected to chain `A`, querying the port and channel identifiers that chain `B` uses to connect to chain `A` (eg: `transfer/channelChainA`) can be completely different from the one that chain `C` uses to connect to chain `A` (eg: `transfer/channelToChainA`). + +Thus the proposed solution for clients that the IBC team recommends are the following: + +- **Connect to all chains**: Connecting to all the chains in the timeline would allow clients to + perform the queries outlined in the [direct connection](#direct-connection) section to each + relevant chain. By repeatedly following the port and channel denomination trace transfer timeline, + clients should always be able to find all the relevant identifiers. This comes at the tradeoff + that the client must connect to nodes on each of the chains in order to perform the queries. +- **Relayer as a Service (RaaS)**: A longer term solution is to use/create a relayer service that + could map the denomination trace to the chain path timeline for each token (i.e `origin chain -> +chain #1 -> ... -> chain #(n-1) -> final chain`). These services could provide merkle proofs in + order to allow clients to optionally verify the path timeline correctness for themselves by + running light clients. If the proofs are not verified, they should be considered as trusted third + parties services. Additionally, client would be advised in the future to use RaaS that support the + largest number of connections between chains in the ecosystem. Unfortunately, none of the existing + public relayers (in [Golang](https://github.com/cosmos/relayer) and + [Rust](https://github.com/informalsystems/ibc-rs)), provide this service to clients. + +:::tip +The only viable alternative for clients (at the time of writing) to tokens with multiple connection hops, is to connect to all chains directly and perform relevant queries to each of them in the sequence. +::: + +## Forwarding + +:::info +Token forwarding and unwinding is supported only on ICS20 v2 transfer channels. +::: + +Forwarding allows tokens to be routed to a final destination through multiple (up to 8) intermediary +chains. With forwarding, it's also possible to unwind IBC vouchers to their native chain, and forward +them afterwards to another destination, all with just a single transfer transaction on the sending chain. + +### Forward tokens + +Native tokens or IBC vouchers on any chain can be forwarded through intermediary chains to reach their +final destination. For example, given the topology below, with 3 chains and a transfer channel between +chains A and B and between chains B and C: + +![Light Mode Forwarding](./images/forwarding-3-chains-light.png#gh-light-mode-only)![Dark Mode Forwarding](./images/forwarding-3-chains-dark.png#gh-dark-mode-only) + +Native tokens on chain `A` can be sent to chain `C` through chain `B`. The routing is specified by the +source port ID and channel ID of choice on every intermediary chain. In this example, there is only one +forwarding hop on chain `B` and the port ID, channel ID pair is `transfer`, `channelBToC`. Forwarding of +a multi-denom collections of tokens is also allowed (i.e. forwarding of tokens of different denominations). + +### Unwind tokens + +Taking again as an example the topology from the previous section, we assume that native tokens on chain `A` +have been transferred to chain `C`. The IBC vouchers on chain `C` have the denomination trace +`transfer/channelCtoB/transfer/channelBtoA`, and with forwarding it is possible to submit a transfer message +on chain `C` and automatically unwind the vouchers through chain `B` to chain `A`, so that the tokens recovered +on the origin chain regain their native denomination. In order to execute automatic unwinding, the transfer +module does not require extra user input: the unwind route is encoded in the denomination trace with the +pairs of destination port ID, channel ID that are added on every chain where the tokens are received. + +Please note that unwinding of vouchers is only allowed when vouchers transferred all share the same denomination +trace (signifying coins that all originate from the same source). It is not possible to unwind vouchers of two different +IBC denominations, since they come from different source chains. + +### Unwind tokens and then forward + +Unwinding and forwarding can be used in combination, so that vouchers are first unwound to their origin chain +and then forwarded to a final destination. The same restriction as in the unwinding case applies: only vouchers +of a single IBC denomination can be used. + +## Locked funds + +In some [exceptional cases](/architecture/adr-026-ibc-client-recovery-mechanisms#exceptional-cases), a client state associated with a given channel cannot be updated. This causes that funds from fungible tokens in that channel will be permanently locked and thus can no longer be transferred. + +To mitigate this, a client update governance proposal can be submitted to update the frozen client +with a new valid header. Once the proposal passes the client state will be unfrozen and the funds +from the associated channels will then be unlocked. This mechanism only applies to clients that +allow updates via governance, such as Tendermint clients. + +In addition to this, it's important to mention that a token must be sent back along the exact route +that it took originally in order to return it to its original form on the source chain (eg: the +Cosmos Hub for the `uatom`). Sending a token back to the same chain across a different channel will +**not** move the token back across its timeline. If a channel in the chain history closes before the +token can be sent back across that channel, then the token will not be returnable to its original +form. + +## Security considerations + +For safety, no other module must be capable of minting tokens with the `ibc/` prefix. The IBC +transfer module needs a subset of the denomination space that only it can create tokens in. + +## Channel Closure + +The IBC transfer module does not support channel closure. diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/02-state.md b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/02-state.md new file mode 100644 index 00000000000..916e99b46c3 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/02-state.md @@ -0,0 +1,13 @@ +--- +title: State +sidebar_label: State +sidebar_position: 2 +slug: /apps/transfer/state +--- + +# State + +The IBC transfer application module keeps state of the port to which the module is binded and the denomination trace information as outlined in [ADR 001](/architecture/adr-001-coin-source-tracing). + +- `Port`: `0x01 -> ProtocolBuffer(string)` +- `DenomTrace`: `0x02 | []bytes(traceHash) -> ProtocolBuffer(DenomTrace)` diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/03-state-transitions.md b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/03-state-transitions.md new file mode 100644 index 00000000000..7c73b8da21c --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/03-state-transitions.md @@ -0,0 +1,37 @@ +--- +title: State Transitions +sidebar_label: State Transitions +sidebar_position: 3 +slug: /apps/transfer/state-transitions +--- + +# State transitions + +## Send fungible tokens + +A successful fungible token send has two state transitions depending if the transfer is a movement forward or backwards in the token's timeline: + +1. Sender chain is the source chain, *i.e* a transfer to any chain other than the one it was previously received from is a movement forwards in the token's timeline. This results in the following state transitions: + + - The coins are transferred to an escrow address (i.e locked) on the sender chain. + - The coins are transferred to the receiving chain through IBC TAO logic. + +2. Sender chain is the sink chain, *i.e* the token is sent back to the chain it previously received from. This is a backwards movement in the token's timeline. This results in the following state transitions: + + - The coins (vouchers) are burned on the sender chain. + - The coins are transferred to the receiving chain through IBC TAO logic. + +## Receive fungible tokens + +A successful fungible token receive has two state transitions depending if the transfer is a movement forward or backwards in the token's timeline: + +1. Receiver chain is the source chain. This is a backwards movement in the token's timeline. This results in the following state transitions: + + - The leftmost port and channel identifier pair is removed from the token denomination prefix. + - The tokens are unescrowed and sent to the receiving address. + +2. Receiver chain is the sink chain. This is a movement forwards in the token's timeline. This results in the following state transitions: + + - Token vouchers are minted by prefixing the destination port and channel identifiers to the trace information. + - The receiving chain stores the new trace information in the store (if not set already). + - The vouchers are sent to the receiving address. diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/04-messages.md b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/04-messages.md new file mode 100644 index 00000000000..0118b3e8166 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/04-messages.md @@ -0,0 +1,86 @@ +--- +title: Messages +sidebar_label: Messages +sidebar_position: 4 +slug: /apps/transfer/messages +--- + +# Messages + +## `MsgTransfer` + +A fungible token cross chain transfer is achieved by using the `MsgTransfer`: + +```go +type MsgTransfer struct { + SourcePort string + SourceChannel string + // Deprecated: Use Tokens instead. + Token sdk.Coin + Sender string + Receiver string + TimeoutHeight ibcexported.Height + TimeoutTimestamp uint64 + Memo string + Tokens []sdk.Coin + Forwarding *Forwarding +} + +type Forwarding struct { + Unwind bool + Hops []Hop +} + +type Hop struct { + PortId string + ChannelId string +} +``` + +:::info +Multi-denom token transfers and token forwarding are features supported only on ICS20 v2 transfer channels. +::: + +If `Forwarding` is `nil`, this message is expected to fail if: + +- `SourcePort` is invalid (see [24-host naming requirements](https://github.com/cosmos/ibc/blob/master/spec/core/ics-024-host-requirements/README.md#paths-identifiers-separators). +- `SourceChannel` is invalid (see [24-host naming requirements](https://github.com/cosmos/ibc/blob/master/spec/core/ics-024-host-requirements/README.md#paths-identifiers-separators)). +- `Tokens` must not be empty. +- Each `Coin` in `Tokens` must satisfy the following: + - `Amount` must be positive. + - `Denom` must be a valid IBC denomination, as defined in [ADR 001 - Coin Source Tracing](/architecture/adr-001-coin-source-tracing). +- `Sender` is empty. +- `Receiver` is empty or contains more than 2048 bytes. +- `Memo` contains more than 32768 bytes. +- `TimeoutHeight` and `TimeoutTimestamp` are both zero. + +If `Forwarding` is not `nil`, then to use forwarding you must either set `Unwind` to true or provide a non-empty list of `Hops`. Setting both `Unwind` to true and providing a non-empty list of `Hops` is allowed, but the total number of hops that is formed as a combination of the hops needed to unwind the tokens and the hops to forward them afterwards to the final destination must not exceed 8. When using forwarding, timeout must be specified using only `TimeoutTimestamp` (i.e. `TimeoutHeight` must be zero). Please note that the timeout timestamp must take into account the time that it may take tokens to be forwarded through the intermediary chains. Additionally, please note that the `MsgTransfer` will fail if: + +- `Hops` is not empty, and the number of elements of `Hops` is greater than 8, or either the `PortId` or `ChannelId` of any of the `Hops` is not a valid identifier. +- `Unwind` is true, and either the coins to be transferred have different denomination traces, or `SourcePort` and `SourceChannel` are not empty strings (they must be empty because they are set by the transfer module, since it has access to the denomination trace information and is thus able to know the source port ID, channel ID to use in order to unwind the tokens). If `Unwind` is true, the transfer module expects the tokens in `MsgTransfer` to not be native to the sending chain (i.e. they must be IBC vouchers). + +Please note that the `Token` field is deprecated and users should now use `Tokens` instead. If `Token` is used then `Tokens` must be empty. Similarly, if `Tokens` is used then `Token` should be left empty. This message will send a fungible token to the counterparty chain represented by the counterparty Channel End connected to the Channel End with the identifiers `SourcePort` and `SourceChannel`. + +The denomination provided for transfer should correspond to the same denomination represented on this chain. The prefixes will be added as necessary upon by the receiving chain. + +If the `Amount` is set to the maximum value for a 256-bit unsigned integer (i.e. 2^256 - 1), then the whole balance of the corresponding denomination will be transferred. The helper function `UnboundedSpendLimit` in the `types` package of the `transfer` module provides the sentinel value that can be used. + +### Memo + +The memo field was added to allow applications and users to attach metadata to transfer packets. The field is optional and may be left empty. When it is used to attach metadata for a particular middleware, the memo field should be represented as a json object where different middlewares use different json keys. + +For example, the following memo field is used by the [callbacks middleware](../../04-middleware/02-callbacks/01-overview.md) to attach a source callback to a transfer packet: + +```jsonc +{ + "src_callback": { + "address": "callbackAddressString", + // optional + "gas_limit": "userDefinedGasLimitString", + } +} +``` + +You can find more information about other applications that use the memo field in the [chain registry](https://github.com/cosmos/chain-registry/blob/master/_memo_keys/ICS20_memo_keys.json). + +Please note that the memo field is always meant to be consumed only on the final destination chain. This means that the transfer module will guarantee that the memo field in the intermediary chains is empty. diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/05-events.md b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/05-events.md new file mode 100644 index 00000000000..3c5cf3782ec --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/05-events.md @@ -0,0 +1,57 @@ +--- +title: Events +sidebar_label: Events +sidebar_position: 5 +slug: /apps/transfer/events +--- + +# Events + +## `MsgTransfer` + +| Type | Attribute Key | Attribute Value | +|--------------|-----------------|------------------------| +| ibc_transfer | sender | \{sender\} | +| ibc_transfer | receiver | \{receiver\} | +| ibc_transfer | tokens | \{jsonTokens\} | +| ibc_transfer | memo | \{memo\} | +| ibc_transfer | forwarding_hops | \{jsonForwardingHops\} | +| message | module | transfer | + +## `OnRecvPacket` callback + +| Type | Attribute Key | Attribute Value | +|-----------------------|-----------------|------------------------| +| fungible_token_packet | sender | \{sender\} | +| fungible_token_packet | receiver | \{receiver\} | +| fungible_token_packet | tokens | \{jsonTokens\} | +| fungible_token_packet | memo | \{memo\} | +| fungible_token_packet | forwarding_hops | \{jsonForwardingHops\} | +| fungible_token_packet | success | \{ackSuccess\} | +| fungible_token_packet | error | \{ackError\} | +| denomination | trace_hash | \{hex_hash\} | +| denomination | denom | \{jsonDenom\} | +| message | module | transfer | + +## `OnAcknowledgePacket` callback + +| Type | Attribute Key | Attribute Value | +|-----------------------|-----------------|------------------------| +| fungible_token_packet | sender | \{sender\} | +| fungible_token_packet | receiver | \{receiver\} | +| fungible_token_packet | tokens | \{jsonTokens\} | +| fungible_token_packet | memo | \{memo\} | +| fungible_token_packet | forwarding_hops | \{jsonForwardingHops\} | +| fungible_token_packet | acknowledgement | \{ack.String()\} | +| fungible_token_packet | success / error | \{ack.Response\} | +| message | module | transfer | + +## `OnTimeoutPacket` callback + +| Type | Attribute Key | Attribute Value | +|---------|-----------------|------------------------| +| timeout | refund_receiver | \{receiver\} | +| timeout | refund_tokens | \{jsonTokens\} | +| timeout | memo | \{memo\} | +| timeout | forwarding_hops | \{jsonForwardingHops\} | +| message | module | transfer | diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/06-metrics.md b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/06-metrics.md new file mode 100644 index 00000000000..104e5b4d3bc --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/06-metrics.md @@ -0,0 +1,18 @@ +--- +title: Metrics +sidebar_label: Metrics +sidebar_position: 6 +slug: /apps/transfer/metrics +--- + + +# Metrics + +The IBC transfer application module exposes the following set of [metrics](https://github.com/cosmos/cosmos-sdk/blob/main/docs/learn/advanced/09-telemetry.md). + +| Metric | Description | Unit | Type | +|:--------------------------------|:------------------------------------------------------------------------------------------|:----------------|:--------| +| `tx_msg_ibc_transfer` | The total amount of tokens transferred via IBC in a `MsgTransfer` (source or sink chain) | token | gauge | +| `ibc_transfer_packet_receive` | The total amount of tokens received in a `FungibleTokenPacketData` (source or sink chain) | token | gauge | +| `ibc_transfer_send` | Total number of IBC transfers sent from a chain (source or sink) | transfer | counter | +| `ibc_transfer_receive` | Total number of IBC transfers received to a chain (source or sink) | transfer | counter | diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/07-params.md b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/07-params.md new file mode 100644 index 00000000000..f3aeee45d48 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/07-params.md @@ -0,0 +1,94 @@ +--- +title: Params +sidebar_label: Params +sidebar_position: 7 +slug: /apps/transfer/params +--- + + +# Parameters + +The IBC transfer application module contains the following parameters: + +| Name | Type | Default Value | +| ---------------- | ---- | ------------- | +| `SendEnabled` | bool | `true` | +| `ReceiveEnabled` | bool | `true` | + +The IBC transfer module stores its parameters in its keeper with the prefix of `0x03`. + +## `SendEnabled` + +The `SendEnabled` parameter controls send cross-chain transfer capabilities for all fungible tokens. + +To prevent a single token from being transferred from the chain, set the `SendEnabled` parameter to `true` and then, depending on the Cosmos SDK version, do one of the following: + +- For Cosmos SDK v0.46.x or earlier, set the bank module's [`SendEnabled` parameter](https://github.com/cosmos/cosmos-sdk/blob/release/v0.46.x/x/bank/spec/05_params.md#sendenabled) for the denomination to `false`. +- For Cosmos SDK versions above v0.46.x, set the bank module's `SendEnabled` entry for the denomination to `false` using `MsgSetSendEnabled` as a governance proposal. + +:::warning +Doing so will prevent the token from being transferred between any accounts in the blockchain. +::: + +## `ReceiveEnabled` + +The transfers enabled parameter controls receive cross-chain transfer capabilities for all fungible tokens. + +To prevent a single token from being transferred to the chain, set the `ReceiveEnabled` parameter to `true` and then, depending on the Cosmos SDK version, do one of the following: + +- For Cosmos SDK v0.46.x or earlier, set the bank module's [`SendEnabled` parameter](https://github.com/cosmos/cosmos-sdk/blob/release/v0.46.x/x/bank/spec/05_params.md#sendenabled) for the denomination to `false`. +- For Cosmos SDK versions above v0.46.x, set the bank module's `SendEnabled` entry for the denomination to `false` using `MsgSetSendEnabled` as a governance proposal. + +:::warning +Doing so will prevent the token from being transferred between any accounts in the blockchain. +::: + +## Queries + +Current parameter values can be queried via a query message. + + + +```protobuf +// proto/ibc/applications/transfer/v1/query.proto + +// QueryParamsRequest is the request type for the Query/Params RPC method. +message QueryParamsRequest {} + +// QueryParamsResponse is the response type for the Query/Params RPC method. +message QueryParamsResponse { + // params defines the parameters of the module. + Params params = 1; +} +``` + +To execute the query in `simd`, you use the following command: + +```bash +simd query ibc-transfer params +``` + +## Changing Parameters + +To change the parameter values, you must make a governance proposal that executes the `MsgUpdateParams` message. + + + +```protobuf +// proto/ibc/applications/transfer/v1/tx.proto + +// MsgUpdateParams is the Msg/UpdateParams request type. +message MsgUpdateParams { + // signer address (it may be the address that controls the module, which defaults to x/gov unless overwritten). + string signer = 1; + + // params defines the transfer parameters to update. + // + // NOTE: All parameters must be supplied. + Params params = 2 [(gogoproto.nullable) = false]; +} + +// MsgUpdateParamsResponse defines the response structure for executing a +// MsgUpdateParams message. +message MsgUpdateParamsResponse {} +``` diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/08-authorizations.md b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/08-authorizations.md new file mode 100644 index 00000000000..d9e71fac46f --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/08-authorizations.md @@ -0,0 +1,66 @@ +--- +title: Authorizations +sidebar_label: Authorizations +sidebar_position: 8 +slug: /apps/transfer/authorizations +--- + +# `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 transferred, 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`. +- an `AllowedPacketData` list that specifies the list of memo strings that are allowed to be included in the memo field of the packet. If this list is empty, then only an empty memo is allowed (a `memo` field with non-empty content will be denied). If this list includes a single element equal to `"*"`, then any content in `memo` field will be allowed. +- an `AllowedForwarding` list that specifies the combinations of source port ID/channel ID pairs through which the tokens are allowed to be forwarded until final destination. Please note that granters are expected to specify the unwinding route of IBC vouchers if they wish to allow grantees to unwind the vouchers to their native chain (i.e. grantees cannot make use of the `Unwind` flag and must also set the source port ID, channel ID pairs required to unwind the vouchers in the forwarding `Hops` field). + +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` +- the `memo` field is not allowed by `AllowedPacketData` +- the forwarding hops do not match any of the combinations specified in `AllowedForwarding` + +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 + // allow list of memo strings, an empty list prohibits all memo strings; + // a list only with "*" permits any memo string + AllowedPacketData []string + // Optional list of allowed combinations of source port ID/channel ID pairs + // through which the tokens are allowed to be forwarded until final + // destination + AllowedForwarding []AllowedForwarding +} + +type AllowedForwarding struct { + Hops []Hop +} +``` diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/09-client.md b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/09-client.md new file mode 100644 index 00000000000..3ba88e6dfc1 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/09-client.md @@ -0,0 +1,97 @@ +--- +title: Client +sidebar_label: Client +sidebar_position: 9 +slug: /apps/transfer/client +--- + +# 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 +``` + +#### Transactions + +The `tx` commands allow users to interact with the controller submodule. + +```shell +simd tx ibc-transfer --help +``` + +#### `transfer` + +The `transfer` command allows users to execute cross-chain token transfers from the source port ID and channel ID on the sending chain. + +```shell +simd tx ibc-transfer transfer [src-port] [src-channel] [receiver] [coins] [flags] +``` + +Multiple tokens can be transferred on the same transaction by specifying a comma-separated list +of amount and denomination (e.g. `100uatom,100uosmo`) in the `coins` option. + +The additional flags that can be used with the command are: + +- `--packet-timeout-height` to specify the timeout block height in the format `{revision}-{height}`. The default value is `0-0`, which effectively disables the timeout. Timeout height can only be absolute, therefore this option must be used in combination with `--absolute-timeouts` set to true. +- `--packet-timeout-timestamp` to specify the timeout timestamp in nanoseconds. The timeout can be either relative (fromthe current UTC time) or absolute. The default value is 10 minutes (and thus relative). The timeout is disabled when set to 0. +- `--absolute-timeouts` to interpret the timeout timestamp as an absolute value (when set to true). The default value is false (and thus the timeout timeout is considered relative to current UTC time). +- `--memo` to specify the memo string to be sent along with the transfer packet. If forwarding is used, then the memo string will be carried through the intermediary chains to the final destination. +- `--forwarding` to specify forwarding information in the form of a comma separated list of source port ID/channel ID pairs at each intermediary chain (e.g. `transfer/channel-0,transfer/channel-1`). +- `--unwind` to specify if the tokens must be automatically unwound to there origin chain. This option can be used in combination with `--forwarding` to forward the tokens to the final destination after unwinding. When this flag is true, the tokens specified in the `coins` option must all have the same denomination trace path (i.e. all tokens must be IBC vouchers sharing exactly the same set of destination port/channel IDs in their denomination trace path). Arguments `[src-port]` and `[src-channel]` must not be passed if the `--unwind` flag is specified. + +#### `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" +} +``` diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/01-overview.md b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/01-overview.md new file mode 100644 index 00000000000..fa98a8683bf --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/01-overview.md @@ -0,0 +1,142 @@ +--- +title: Overview +sidebar_label: Overview +sidebar_position: 1 +slug: /apps/transfer/ics20-v1/overview +--- + +:::warning +This document is relevant only for fungible token transfers over channels on v1 of the ICS-20 protocol. +::: + +# Overview + +:::note Synopsis +Learn about what the token Transfer module is +::: + +## What is the Transfer module? + +Transfer is the Cosmos SDK implementation of the [ICS-20](https://github.com/cosmos/ibc/tree/master/spec/app/ics-020-fungible-token-transfer) protocol, which enables cross-chain fungible token transfers. + +## Concepts + +### Acknowledgements + +ICS20 uses the recommended acknowledgement format as specified by [ICS 04](https://github.com/cosmos/ibc/tree/master/spec/core/ics-004-channel-and-packet-semantics#acknowledgement-envelope). + +A successful receive of a transfer packet will result in a Result Acknowledgement being written +with the value `[]byte{byte(1)}` in the `Response` field. + +An unsuccessful receive of a transfer packet will result in an Error Acknowledgement being written +with the error message in the `Response` field. + +### Denomination trace + +The denomination trace corresponds to the information that allows a token to be traced back to its +origin chain. It contains a sequence of port and channel identifiers ordered from the most recent to +the oldest in the timeline of transfers. + +This information is included on the token's base denomination field in the form of a hash to prevent an +unbounded denomination length. For example, the token `transfer/channelToA/uatom` will be displayed +as `ibc/7F1D3FCF4AE79E1554D670D1AD949A9BA4E4A3C76C63093E17E446A46061A7A2`. The human readable denomination +is stored using `x/bank` module's [denom metadata](https://docs.cosmos.network/main/build/modules/bank#denom-metadata) +feature. You may display the human readable denominations by querying balances with the `--resolve-denom` flag, as in: + +```shell +simd query bank balances [address] --resolve-denom +``` + +Each send to any chain other than the one it was previously received from is a movement forwards in +the token's timeline. This causes trace to be added to the token's history and the destination port +and destination channel to be prefixed to the denomination. In these instances the sender chain is +acting as the "source zone". When the token is sent back to the chain it previously received from, the +prefix is removed. This is a backwards movement in the token's timeline and the sender chain is +acting as the "sink zone". + +It is strongly recommended to read the full details of [ADR 001: Coin Source Tracing](/architecture/adr-001-coin-source-tracing) to understand the implications and context of the IBC token representations. + +## UX suggestions for clients + +For clients (wallets, exchanges, applications, block explorers, etc) that want to display the source of the token, it is recommended to use the following alternatives for each of the cases below: + +### Direct connection + +If the denomination trace contains a single identifier prefix pair (as in the example above), then +the easiest way to retrieve the chain and light client identifier is to map the trace information +directly. In summary, this requires querying the channel from the denomination trace identifiers, +and then the counterparty client state using the counterparty port and channel identifiers from the +retrieved channel. + +A general pseudo algorithm would look like the following: + +1. Query the full denomination trace. +2. Query the channel with the `portID/channelID` pair, which corresponds to the first destination of the + token. +3. Query the client state using the identifiers pair. Note that this query will return a `"Not +Found"` response if the current chain is not connected to this channel. +4. Retrieve the client identifier or chain identifier from the client state (eg: on + Tendermint clients) and store it locally. + +Using the gRPC gateway client service the steps above would be, with a given IBC token `ibc/7F1D3FCF4AE79E1554D670D1AD949A9BA4E4A3C76C63093E17E446A46061A7A2` stored on `chainB`: + +1. `GET /ibc/apps/transfer/v1/denom_traces/7F1D3FCF4AE79E1554D670D1AD949A9BA4E4A3C76C63093E17E446A46061A7A2` -> `{"path": "transfer/channelToA", "base_denom": "uatom"}` +2. `GET /ibc/apps/transfer/v1/channels/channelToA/ports/transfer/client_state"` -> `{"client_id": "clientA", "chain-id": "chainA", ...}` +3. `GET /ibc/apps/transfer/v1/channels/channelToA/ports/transfer"` -> `{"channel_id": "channelToA", port_id": "transfer", counterparty: {"channel_id": "channelToB", port_id": "transfer"}, ...}` +4. `GET /ibc/apps/transfer/v1/channels/channelToB/ports/transfer/client_state" -> {"client_id": "clientB", "chain-id": "chainB", ...}` + +Then, the token transfer chain path for the `uatom` denomination would be: `chainA` -> `chainB`. + +### Multiple hops + +The multiple channel hops case applies when the token has passed through multiple chains between the original source and final destination chains. + +The IBC protocol doesn't know the topology of the overall network (i.e connections between chains and identifier names between them). For this reason, in the multiple hops case, a particular chain in the timeline of the individual transfers can't query the chain and client identifiers of the other chains. + +Take for example the following sequence of transfers `A -> B -> C` for an IBC token, with a final prefix path (trace info) of `transfer/channelChainC/transfer/channelChainB`. What the paragraph above means is that even in the case that chain `C` is directly connected to chain `A`, querying the port and channel identifiers that chain `B` uses to connect to chain `A` (eg: `transfer/channelChainA`) can be completely different from the one that chain `C` uses to connect to chain `A` (eg: `transfer/channelToChainA`). + +Thus the proposed solution for clients that the IBC team recommends are the following: + +- **Connect to all chains**: Connecting to all the chains in the timeline would allow clients to + perform the queries outlined in the [direct connection](#direct-connection) section to each + relevant chain. By repeatedly following the port and channel denomination trace transfer timeline, + clients should always be able to find all the relevant identifiers. This comes at the tradeoff + that the client must connect to nodes on each of the chains in order to perform the queries. +- **Relayer as a Service (RaaS)**: A longer term solution is to use/create a relayer service that + could map the denomination trace to the chain path timeline for each token (i.e `origin chain -> +chain #1 -> ... -> chain #(n-1) -> final chain`). These services could provide merkle proofs in + order to allow clients to optionally verify the path timeline correctness for themselves by + running light clients. If the proofs are not verified, they should be considered as trusted third + parties services. Additionally, client would be advised in the future to use RaaS that support the + largest number of connections between chains in the ecosystem. Unfortunately, none of the existing + public relayers (in [Golang](https://github.com/cosmos/relayer) and + [Rust](https://github.com/informalsystems/ibc-rs)), provide this service to clients. + +:::tip +The only viable alternative for clients (at the time of writing) to tokens with multiple connection hops, is to connect to all chains directly and perform relevant queries to each of them in the sequence. +::: + +## Locked funds + +In some [exceptional cases](/architecture/adr-026-ibc-client-recovery-mechanisms#exceptional-cases), a client state associated with a given channel cannot be updated. This causes that funds from fungible tokens in that channel will be permanently locked and thus can no longer be transferred. + +To mitigate this, a client update governance proposal can be submitted to update the frozen client +with a new valid header. Once the proposal passes the client state will be unfrozen and the funds +from the associated channels will then be unlocked. This mechanism only applies to clients that +allow updates via governance, such as Tendermint clients. + +In addition to this, it's important to mention that a token must be sent back along the exact route +that it took originally in order to return it to its original form on the source chain (eg: the +Cosmos Hub for the `uatom`). Sending a token back to the same chain across a different channel will +**not** move the token back across its timeline. If a channel in the chain history closes before the +token can be sent back across that channel, then the token will not be returnable to its original +form. + +## Security considerations + +For safety, no other module must be capable of minting tokens with the `ibc/` prefix. The IBC +transfer module needs a subset of the denomination space that only it can create tokens in. + +## Channel Closure + +The IBC transfer module does not support channel closure. diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/02-state.md b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/02-state.md new file mode 100644 index 00000000000..1d8207b58ef --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/02-state.md @@ -0,0 +1,17 @@ +--- +title: State +sidebar_label: State +sidebar_position: 2 +slug: /apps/transfer/ics20-v1/state +--- + +:::warning +This document is relevant only for fungible token transfers over channels on v1 of the ICS-20 protocol. +::: + +# State + +The IBC transfer application module keeps state of the port to which the module is binded and the denomination trace information as outlined in [ADR 001](/architecture/adr-001-coin-source-tracing). + +- `Port`: `0x01 -> ProtocolBuffer(string)` +- `DenomTrace`: `0x02 | []bytes(traceHash) -> ProtocolBuffer(DenomTrace)` diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/03-state-transitions.md b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/03-state-transitions.md new file mode 100644 index 00000000000..6e31bd5c298 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/03-state-transitions.md @@ -0,0 +1,41 @@ +--- +title: State Transitions +sidebar_label: State Transitions +sidebar_position: 3 +slug: /apps/transfer/ics20-v1/state-transitions +--- + +:::warning +This document is relevant only for fungible token transfers over channels on v1 of the ICS-20 protocol. +::: + +# State transitions + +## Send fungible tokens + +A successful fungible token send has two state transitions depending if the transfer is a movement forward or backwards in the token's timeline: + +1. Sender chain is the source chain, *i.e* a transfer to any chain other than the one it was previously received from is a movement forwards in the token's timeline. This results in the following state transitions: + + - The coins are transferred to an escrow address (i.e locked) on the sender chain. + - The coins are transferred to the receiving chain through IBC TAO logic. + +2. Sender chain is the sink chain, *i.e* the token is sent back to the chain it previously received from. This is a backwards movement in the token's timeline. This results in the following state transitions: + + - The coins (vouchers) are burned on the sender chain. + - The coins are transferred to the receiving chain through IBC TAO logic. + +## Receive fungible tokens + +A successful fungible token receive has two state transitions depending if the transfer is a movement forward or backwards in the token's timeline: + +1. Receiver chain is the source chain. This is a backwards movement in the token's timeline. This results in the following state transitions: + + - The leftmost port and channel identifier pair is removed from the token denomination prefix. + - The tokens are unescrowed and sent to the receiving address. + +2. Receiver chain is the sink chain. This is a movement forwards in the token's timeline. This results in the following state transitions: + + - Token vouchers are minted by prefixing the destination port and channel identifiers to the trace information. + - The receiving chain stores the new trace information in the store (if not set already). + - The vouchers are sent to the receiving address. diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/04-messages.md b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/04-messages.md new file mode 100644 index 00000000000..c2826f54426 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/04-messages.md @@ -0,0 +1,65 @@ +--- +title: Messages +sidebar_label: Messages +sidebar_position: 4 +slug: /apps/transfer/ics20-v1/messages +--- + +:::warning +This document is relevant only for fungible token transfers over channels on v1 of the ICS-20 protocol. +::: + +# Messages + +## `MsgTransfer` + +A fungible token cross chain transfer is achieved by using the `MsgTransfer`: + +```go +type MsgTransfer struct { + SourcePort string + SourceChannel string + Token sdk.Coin + Sender string + Receiver string + TimeoutHeight ibcexported.Height + TimeoutTimestamp uint64 + Memo string +} +``` + +This message is expected to fail if: + +- `SourcePort` is invalid (see [24-host naming requirements](https://github.com/cosmos/ibc/blob/master/spec/core/ics-024-host-requirements/README.md#paths-identifiers-separators). +- `SourceChannel` is invalid (see [24-host naming requirements](https://github.com/cosmos/ibc/blob/master/spec/core/ics-024-host-requirements/README.md#paths-identifiers-separators)). +- `Token` is invalid: + - `Amount` is not positive. + - `Denom` is not a valid IBC denomination as per [ADR 001 - Coin Source Tracing](/architecture/adr-001-coin-source-tracing). +- `Sender` is empty. +- `Receiver` is empty or contains more than 2048 bytes. +- `Memo` contains more than 32768 bytes. +- `TimeoutHeight` and `TimeoutTimestamp` are both zero. + +This message will send a fungible token to the counterparty chain represented by the counterparty Channel End connected to the Channel End with the identifiers `SourcePort` and `SourceChannel`. + +The denomination provided for transfer should correspond to the same denomination represented on this chain. The prefixes will be added as necessary upon by the receiving chain. + +If the `Amount` is set to the maximum value for a 256-bit unsigned integer (i.e. 2^256 - 1), then the whole balance of the corresponding denomination will be transferred. The helper function `UnboundedSpendLimit` in the `types` package of the `transfer` module provides the sentinel value that can be used. + +### Memo + +The memo field was added to allow applications and users to attach metadata to transfer packets. The field is optional and may be left empty. When it is used to attach metadata for a particular middleware, the memo field should be represented as a json object where different middlewares use different json keys. + +For example, the following memo field is used by the [callbacks middleware](../../../04-middleware/02-callbacks/01-overview.md) to attach a source callback to a transfer packet: + +```jsonc +{ + "src_callback": { + "address": "callbackAddressString", + // optional + "gas_limit": "userDefinedGasLimitString", + } +} +``` + +You can find more information about other applications that use the memo field in the [chain registry](https://github.com/cosmos/chain-registry/blob/master/_memo_keys/ICS20_memo_keys.json). diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/05-events.md b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/05-events.md new file mode 100644 index 00000000000..cea5b596cf1 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/05-events.md @@ -0,0 +1,61 @@ +--- +title: Events +sidebar_label: Events +sidebar_position: 5 +slug: /apps/transfer/ics20-v1/events +--- + +:::warning +This document is relevant only for fungible token transfers over channels on v1 of the ICS-20 protocol. +::: + +# Events + +## `MsgTransfer` + +| Type | Attribute Key | Attribute Value | +|--------------|-----------------|-----------------| +| ibc_transfer | sender | \{sender\} | +| ibc_transfer | receiver | \{receiver\} | +| ibc_transfer | tokens | \{jsonTokens\} | +| ibc_transfer | memo | \{memo\} | +| ibc_transfer | forwarding_hops | `nil` | +| message | module | transfer | + +## `OnRecvPacket` callback + +| Type | Attribute Key | Attribute Value | +|-----------------------|-----------------|-----------------| +| fungible_token_packet | sender | \{sender\} | +| fungible_token_packet | receiver | \{receiver\} | +| fungible_token_packet | tokens | \{jsonTokens\} | +| fungible_token_packet | memo | \{memo\} | +| fungible_token_packet | forwarding_hops | `nil` | +| fungible_token_packet | success | \{ackSuccess\} | +| fungible_token_packet | error | \{ackError\} | +| denomination | trace_hash | \{hex_hash\} | +| denomination | denom | \{jsonDenom\} | +| message | module | transfer | + +## `OnAcknowledgePacket` callback + +| Type | Attribute Key | Attribute Value | +|-----------------------|-----------------|------------------| +| fungible_token_packet | sender | \{sender\} | +| fungible_token_packet | receiver | \{receiver\} | +| fungible_token_packet | tokens | \{jsonTokens\} | +| fungible_token_packet | memo | \{memo\} | +| fungible_token_packet | forwarding_hops | `nil` | +| fungible_token_packet | acknowledgement | \{ack.String()\} | +| fungible_token_packet | success / error | \{ack.Response\} | +| message | module | transfer | + +## `OnTimeoutPacket` callback + +| Type | Attribute Key | Attribute Value | +|---------|-----------------|-----------------| +| timeout | refund_receiver | \{receiver\} | +| timeout | refund_tokens | \{jsonTokens\} | +| timeout | memo | \{memo\} | +| timeout | forwarding_hops | `nil` | +| message | module | transfer | diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/06-metrics.md b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/06-metrics.md new file mode 100644 index 00000000000..f788429fd10 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/06-metrics.md @@ -0,0 +1,21 @@ +--- +title: Metrics +sidebar_label: Metrics +sidebar_position: 6 +slug: /apps/transfer/ics20-v1/metrics +--- + +:::warning +This document is relevant only for fungible token transfers over channels on v1 of the ICS-20 protocol. +::: + +# Metrics + +The IBC transfer application module exposes the following set of [metrics](https://github.com/cosmos/cosmos-sdk/blob/main/docs/learn/advanced/09-telemetry.md). + +| Metric | Description | Unit | Type | +|:--------------------------------|:------------------------------------------------------------------------------------------|:----------------|:--------| +| `tx_msg_ibc_transfer` | The total amount of tokens transferred via IBC in a `MsgTransfer` (source or sink chain) | token | gauge | +| `ibc_transfer_packet_receive` | The total amount of tokens received in a `FungibleTokenPacketData` (source or sink chain) | token | gauge | +| `ibc_transfer_send` | Total number of IBC transfers sent from a chain (source or sink) | transfer | counter | +| `ibc_transfer_receive` | Total number of IBC transfers received to a chain (source or sink) | transfer | counter | diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/07-params.md b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/07-params.md new file mode 100644 index 00000000000..ca3b20a5acd --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/07-params.md @@ -0,0 +1,97 @@ +--- +title: Params +sidebar_label: Params +sidebar_position: 7 +slug: /apps/transfer/ics20-v1/params +--- + +:::warning +This document is relevant only for fungible token transfers over channels on v1 of the ICS-20 protocol. +::: + +# Parameters + +The IBC transfer application module contains the following parameters: + +| Name | Type | Default Value | +| ---------------- | ---- | ------------- | +| `SendEnabled` | bool | `true` | +| `ReceiveEnabled` | bool | `true` | + +The IBC transfer module stores its parameters in its keeper with the prefix of `0x03`. + +## `SendEnabled` + +The `SendEnabled` parameter controls send cross-chain transfer capabilities for all fungible tokens. + +To prevent a single token from being transferred from the chain, set the `SendEnabled` parameter to `true` and then, depending on the Cosmos SDK version, do one of the following: + +- For Cosmos SDK v0.46.x or earlier, set the bank module's [`SendEnabled` parameter](https://github.com/cosmos/cosmos-sdk/blob/release/v0.46.x/x/bank/spec/05_params.md#sendenabled) for the denomination to `false`. +- For Cosmos SDK versions above v0.46.x, set the bank module's `SendEnabled` entry for the denomination to `false` using `MsgSetSendEnabled` as a governance proposal. + +:::warning +Doing so will prevent the token from being transferred between any accounts in the blockchain. +::: + +## `ReceiveEnabled` + +The transfers enabled parameter controls receive cross-chain transfer capabilities for all fungible tokens. + +To prevent a single token from being transferred to the chain, set the `ReceiveEnabled` parameter to `true` and then, depending on the Cosmos SDK version, do one of the following: + +- For Cosmos SDK v0.46.x or earlier, set the bank module's [`SendEnabled` parameter](https://github.com/cosmos/cosmos-sdk/blob/release/v0.46.x/x/bank/spec/05_params.md#sendenabled) for the denomination to `false`. +- For Cosmos SDK versions above v0.46.x, set the bank module's `SendEnabled` entry for the denomination to `false` using `MsgSetSendEnabled` as a governance proposal. + +:::warning +Doing so will prevent the token from being transferred between any accounts in the blockchain. +::: + +## Queries + +Current parameter values can be queried via a query message. + + + +```protobuf +// proto/ibc/applications/transfer/v1/query.proto + +// QueryParamsRequest is the request type for the Query/Params RPC method. +message QueryParamsRequest {} + +// QueryParamsResponse is the response type for the Query/Params RPC method. +message QueryParamsResponse { + // params defines the parameters of the module. + Params params = 1; +} +``` + +To execute the query in `simd`, you use the following command: + +```bash +simd query ibc-transfer params +``` + +## Changing Parameters + +To change the parameter values, you must make a governance proposal that executes the `MsgUpdateParams` message. + + + +```protobuf +// proto/ibc/applications/transfer/v1/tx.proto + +// MsgUpdateParams is the Msg/UpdateParams request type. +message MsgUpdateParams { + // signer address (it may be the address that controls the module, which defaults to x/gov unless overwritten). + string signer = 1; + + // params defines the transfer parameters to update. + // + // NOTE: All parameters must be supplied. + Params params = 2 [(gogoproto.nullable) = false]; +} + +// MsgUpdateParamsResponse defines the response structure for executing a +// MsgUpdateParams message. +message MsgUpdateParamsResponse {} +``` diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/08-authorizations.md b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/08-authorizations.md new file mode 100644 index 00000000000..6ba1de76ac4 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/08-authorizations.md @@ -0,0 +1,60 @@ +--- +title: Authorizations +sidebar_label: Authorizations +sidebar_position: 8 +slug: /apps/transfer/ics20-v1/authorizations +--- + +:::warning +This document is relevant only for fungible token transfers over channels on v1 of the ICS-20 protocol. +::: + +# `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 transferred, 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`. +- an `AllowedPacketData` list that specifies the list of memo strings that are allowed to be included in the memo field of the packet. If this list is empty, then only an empty memo is allowed (a `memo` field with non-empty content will be denied). If this list includes a single element equal to `"*"`, then any content in `memo` field will be allowed. + +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` +- the `memo` field is not allowed by `AllowedPacketData` + +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 + // allow list of memo strings, an empty list prohibits all memo strings; + // a list only with "*" permits any memo string + AllowedPacketData []string +} +``` diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/09-client.md b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/09-client.md new file mode 100644 index 00000000000..20d8c2f10a0 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/09-client.md @@ -0,0 +1,98 @@ +--- +title: Client +sidebar_label: Client +sidebar_position: 9 +slug: /apps/transfer/ics20-v1/client +--- + +:::warning +This document is relevant only for fungible token transfers over channels on v1 of the ICS-20 protocol. +::: + +# 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 +``` + +#### Transactions + +The `tx` commands allow users to interact with the controller submodule. + +```shell +simd tx ibc-transfer --help +``` + +#### `transfer` + +The `transfer` command allows users to execute cross-chain token transfers from the source port ID and channel ID on the sending chain. + +```shell +simd tx ibc-transfer transfer [src-port] [src-channel] [receiver] [coins] [flags] +``` + +The `coins` parameter accepts the amount and denomination (e.g. `100uatom`) of the tokens to be transferred. + +The additional flags that can be used with the command are: + +- `--packet-timeout-height` to specify the timeout block height in the format `{revision}-{height}`. The default value is `0-0`, which effectively disables the timeout. Timeout height can only be absolute, therefore this option must be used in combination with `--absolute-timeouts` set to true. +- `--packet-timeout-timestamp` to specify the timeout timestamp in nanoseconds. The timeout can be either relative (fromthe current UTC time) or absolute. The default value is 10 minutes (and thus relative). The timeout is disabled when set to 0. +- `--absolute-timeouts` to interpret the timeout timestamp as an absolute value (when set to true). The default value is false (and thus the timeout timeout is considered relative to current UTC time). +- `--memo` to specify the memo string to be sent along with the transfer packet. If forwarding is used, then the memo string will be carried through the intermediary chains to the final destination. + +#### `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" +} +``` diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/_category_.json b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/_category_.json new file mode 100644 index 00000000000..3ea1fff9668 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/10-ICS20-v1/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "ICS20 v1", + "position": 10, + "link": null +} diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/_category_.json b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/_category_.json new file mode 100644 index 00000000000..d643a498cdf --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Transfer", + "position": 1, + "link": null +} \ No newline at end of file diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/images/forwarding-3-chains-dark.png b/docs/versioned_docs/version-v9.0.x/02-apps/01-transfer/images/forwarding-3-chains-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..3da5c63f6ec542a2f25e031d23d38c46e6bd7be0 GIT binary patch literal 65220 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 z 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 Iv@`Di1LHQ5o&W#< literal 0 HcmV?d00001 diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/01-overview.md b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/01-overview.md new file mode 100644 index 00000000000..d09654230b9 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/01-overview.md @@ -0,0 +1,48 @@ +--- +title: Overview +sidebar_label: Overview +sidebar_position: 1 +slug: /apps/interchain-accounts/overview +--- + + +# Overview + +:::note Synopsis +Learn about what the Interchain Accounts module is +::: + +## What is the Interchain Accounts module? + +Interchain Accounts is the Cosmos SDK implementation of the ICS-27 protocol, which enables cross-chain account management built upon IBC. + +- How does an interchain account differ from a regular account? + +Regular accounts use a private key to sign transactions. Interchain Accounts are instead controlled programmatically by counterparty chains via IBC packets. + +## Concepts + +`Host Chain`: The chain where the interchain account is registered. The host chain listens for IBC packets from a controller chain which should contain instructions (e.g. Cosmos SDK messages) for which the interchain account will execute. + +`Controller Chain`: The chain registering and controlling an account on a host chain. The controller chain sends IBC packets to the host chain to control the account. + +`Interchain Account`: An account on a host chain created using the ICS-27 protocol. An interchain account has all the capabilities of a normal account. However, rather than signing transactions with a private key, a controller chain will send IBC packets to the host chain which signals what transactions the interchain account should execute. + +`Authentication Module`: A custom application module on the controller chain that uses the Interchain Accounts module to build custom logic for the creation & management of interchain accounts. It can be either an IBC application module using the [legacy API](10-legacy/03-keeper-api.md), or a regular Cosmos SDK application module sending messages to the controller submodule's `MsgServer` (this is the recommended approach from ibc-go v6 if access to packet callbacks is not needed). Please note that the legacy API will eventually be removed and IBC applications will not be able to use them in later releases. + +## SDK security model + +SDK modules on a chain are assumed to be trustworthy. For example, there are no checks to prevent an untrustworthy module from accessing the bank keeper. + +The implementation of ICS-27 in ibc-go uses this assumption in its security considerations. + +The implementation assumes other IBC application modules will not bind to ports within the ICS-27 namespace. + +## Channel Closure + +The provided interchain account host and controller implementations do not support `ChanCloseInit`. However, they do support `ChanCloseConfirm`. +This means that the host and controller modules cannot close channels, but they will confirm channel closures initiated by other implementations of ICS-27. + +In the event of a channel closing (due to a packet timeout in an ordered channel, for example), the interchain account associated with that channel can become accessible again if a new channel is created with a (JSON-formatted) version string that encodes the exact same `Metadata` information of the previous channel. The channel can be reopened using either [`MsgRegisterInterchainAccount`](./05-messages.md#msgregisterinterchainaccount) or `MsgChannelOpenInit`. If `MsgRegisterInterchainAccount` is used, then it is possible to leave the `version` field of the message empty, since it will be filled in by the controller submodule. If `MsgChannelOpenInit` is used, then the `version` field must be provided with the correct JSON-encoded `Metadata` string. See section [Understanding Active Channels](./09-active-channels.md#understanding-active-channels) for more information. + +When reopening a channel with the default controller submodule, the ordering of the channel cannot be changed. In order to change the ordering of the channel, the channel has to go through a [channel upgrade handshake](../../01-ibc/06-channel-upgrades.md) or reopen the channel with a custom controller implementation. diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/02-development.md b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/02-development.md new file mode 100644 index 00000000000..0440de5255b --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/02-development.md @@ -0,0 +1,40 @@ +--- +title: Development Use Cases +sidebar_label: Development Use Cases +sidebar_position: 2 +slug: /apps/interchain-accounts/development +--- + + +# Development use cases + +The initial version of Interchain Accounts allowed for the controller submodule to be extended by providing it with an underlying application which would handle all packet callbacks. +That functionality is now being deprecated in favor of alternative approaches. +This document will outline potential use cases and redirect each use case to the appropriate documentation. + +## Custom authentication + +Interchain accounts may be associated with alternative types of authentication relative to the traditional public/private key signing. +If you wish to develop or use Interchain Accounts with a custom authentication module and do not need to execute custom logic on the packet callbacks, we recommend you use ibc-go v6 or greater and that your custom authentication module interacts with the controller submodule via the [`MsgServer`](./05-messages.md). + +If you wish to consume and execute custom logic in the packet callbacks, then please read the section [Packet callbacks](#packet-callbacks) below. + +## Redirection to a smart contract + +It may be desirable to allow smart contracts to control an interchain account. +To facilitate such an action, the controller submodule may be provided an underlying application which redirects to smart contract callers. +An improved design has been suggested in [ADR 008](https://github.com/cosmos/ibc-go/pull/1976) which performs this action via middleware. + +Implementers of this use case are recommended to follow the ADR 008 approach. +The underlying application may continue to be used as a short term solution for ADR 008 and the [legacy API](./10-legacy/01-auth-modules.md) should continue to be utilized in such situations. + +## Packet callbacks + +If a developer requires access to packet callbacks for their use case, then they have the following options: + +1. Write a smart contract which is connected via an ADR 008 or equivalent IBC application (recommended). +2. Use the controller's underlying application to implement packet callback logic. + +In the first case, the smart contract should use the [`MsgServer`](./05-messages.md). + +In the second case, the underlying application should use the [legacy API](./10-legacy/03-keeper-api.md). diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/03-auth-modules.md b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/03-auth-modules.md new file mode 100644 index 00000000000..31231952208 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/03-auth-modules.md @@ -0,0 +1,27 @@ +--- +title: Authentication Modules +sidebar_label: Authentication Modules +sidebar_position: 3 +slug: /apps/interchain-accounts/auth-modules +--- + + +# Building an authentication module + +:::note Synopsis +Authentication modules enable application developers to perform custom logic when interacting with the Interchain Accounts controller sumbmodule's `MsgServer`. +::: + +The controller submodule is used for account registration and packet sending. It executes only logic required of all controllers of interchain accounts. The type of authentication used to manage the interchain accounts remains unspecified. There may exist many different types of authentication which are desirable for different use cases. Thus the purpose of the authentication module is to wrap the controller submodule with custom authentication logic. + +In ibc-go, authentication modules can communicate with the controller submodule by passing messages through `baseapp`'s `MsgServiceRouter`. To implement an authentication module, the `IBCModule` interface need not be fulfilled; it is only required to fulfill Cosmos SDK's `AppModuleBasic` interface, just like any regular Cosmos SDK application module. + +The authentication module must: + +- Authenticate interchain account owners. +- Track the associated interchain account address for an owner. +- Send packets on behalf of an owner (after authentication). + +## Integration into `app.go` file + +To integrate the authentication module into your chain, please follow the steps outlined in [`app.go` integration](04-integration.md#example-integration). diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/04-integration.md b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/04-integration.md new file mode 100644 index 00000000000..14117661086 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/04-integration.md @@ -0,0 +1,195 @@ +--- +title: Integration +sidebar_label: Integration +sidebar_position: 4 +slug: /apps/interchain-accounts/integration +--- + + +# Integration + +:::note Synopsis +Learn how to integrate Interchain Accounts host and controller functionality to your chain. The following document only applies for Cosmos SDK chains. +::: + +The Interchain Accounts module contains two submodules. Each submodule has its own IBC application. The Interchain Accounts module should be registered as an `AppModule` in the same way all SDK modules are registered on a chain, but each submodule should create its own `IBCModule` as necessary. A route should be added to the IBC router for each submodule which will be used. + +Chains who wish to support ICS-27 may elect to act as a host chain, a controller chain or both. Disabling host or controller functionality may be done statically by excluding the host or controller submodule entirely from the `app.go` file or it may be done dynamically by taking advantage of the on-chain parameters which enable or disable the host or controller submodules. + +Interchain Account authentication modules (both custom or generic, such as the `x/gov`, `x/group` or `x/auth` Cosmos SDK modules) can send messages to the controller submodule's [`MsgServer`](05-messages.md) to register interchain accounts and send packets to the interchain account. To accomplish this, the authentication module needs to be composed with `baseapp`'s `MsgServiceRouter`. + +![ica-v6.png](./images/ica-v6.png) + +## Example integration + +```go +// app.go + +// Register the AppModule for the Interchain Accounts module and the authentication module +// Note: No `icaauth` exists, this must be substituted with an actual Interchain Accounts authentication module +ModuleBasics = module.NewBasicManager( + ... + ica.AppModuleBasic{}, + icaauth.AppModuleBasic{}, + ... +) + +... + +// Add module account permissions for the Interchain Accounts module +// Only necessary for host chain functionality +// Each Interchain Account created on the host chain is derived from the module account created +maccPerms = map[string][]string{ + ... + icatypes.ModuleName: nil, +} + +... + +// Add Interchain Accounts Keepers for each submodule used and the authentication module +// If a submodule is being statically disabled, the associated Keeper does not need to be added. +type App struct { + ... + + ICAControllerKeeper icacontrollerkeeper.Keeper + ICAHostKeeper icahostkeeper.Keeper + ICAAuthKeeper icaauthkeeper.Keeper + + ... +} + +... + +// Create store keys for each submodule Keeper and the authentication module +keys := sdk.NewKVStoreKeys( + ... + icacontrollertypes.StoreKey, + icahosttypes.StoreKey, + icaauthtypes.StoreKey, + ... +) + +... + + +// Create the Keeper for each submodule +app.ICAControllerKeeper = icacontrollerkeeper.NewKeeper( + appCodec, keys[icacontrollertypes.StoreKey], app.GetSubspace(icacontrollertypes.SubModuleName), + app.IBCKeeper.ChannelKeeper, // may be replaced with middleware such as ics29 fee + app.IBCKeeper.ChannelKeeper, app.IBCKeeper.PortKeeper, + app.MsgServiceRouter(), + authtypes.NewModuleAddress(govtypes.ModuleName).String(), +) +app.ICAHostKeeper = icahostkeeper.NewKeeper( + appCodec, keys[icahosttypes.StoreKey], app.GetSubspace(icahosttypes.SubModuleName), + app.IBCKeeper.ChannelKeeper, // may be replaced with middleware such as ics29 fee + app.IBCKeeper.ChannelKeeper, app.IBCKeeper.PortKeeper, app.AccountKeeper, + app.MsgServiceRouter(), app.GRPCQueryRouter(), + authtypes.NewModuleAddress(govtypes.ModuleName).String(), +) + +// Create Interchain Accounts AppModule +icaModule := ica.NewAppModule(&app.ICAControllerKeeper, &app.ICAHostKeeper) + +// Create your Interchain Accounts authentication module +app.ICAAuthKeeper = icaauthkeeper.NewKeeper(appCodec, keys[icaauthtypes.StoreKey], app.MsgServiceRouter()) + +// ICA auth AppModule +icaAuthModule := icaauth.NewAppModule(appCodec, app.ICAAuthKeeper) + +// Create controller IBC application stack and host IBC module as desired +icaControllerStack := icacontroller.NewIBCMiddleware(app.ICAControllerKeeper) +icaHostIBCModule := icahost.NewIBCModule(app.ICAHostKeeper) + +// Register host and authentication routes +ibcRouter. + AddRoute(icacontrollertypes.SubModuleName, icaControllerStack). + AddRoute(icahosttypes.SubModuleName, icaHostIBCModule) +... + +// Register Interchain Accounts and authentication module AppModule's +app.moduleManager = module.NewManager( + ... + icaModule, + icaAuthModule, +) + +... + +// Add Interchain Accounts to begin blocker logic +app.moduleManager.SetOrderBeginBlockers( + ... + icatypes.ModuleName, + ... +) + +// Add Interchain Accounts to end blocker logic +app.moduleManager.SetOrderEndBlockers( + ... + icatypes.ModuleName, + ... +) + +// Add Interchain Accounts module InitGenesis logic +app.moduleManager.SetOrderInitGenesis( + ... + icatypes.ModuleName, + ... +) + +// initParamsKeeper init params keeper and its subspaces +func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey sdk.StoreKey) paramskeeper.Keeper { + ... + paramsKeeper.Subspace(icahosttypes.SubModuleName) + paramsKeeper.Subspace(icacontrollertypes.SubModuleName) + ... +} +``` + +If no custom athentication module is needed and a generic Cosmos SDK authentication module can be used, then from the sample integration code above all references to `ICAAuthKeeper` and `icaAuthModule` can be removed. That's it, the following code would not be needed: + +```go +// Create your Interchain Accounts authentication module +app.ICAAuthKeeper = icaauthkeeper.NewKeeper(appCodec, keys[icaauthtypes.StoreKey], app.MsgServiceRouter()) + +// ICA auth AppModule +icaAuthModule := icaauth.NewAppModule(appCodec, app.ICAAuthKeeper) +``` + +### Using submodules exclusively + +As described above, the Interchain Accounts application module is structured to support the ability of exclusively enabling controller or host functionality. +This can be achieved by simply omitting either controller or host `Keeper` from the Interchain Accounts `NewAppModule` constructor function, and mounting only the desired submodule via the `IBCRouter`. +Alternatively, submodules can be enabled and disabled dynamically using [on-chain parameters](06-parameters.md). + +The following snippets show basic examples of statically disabling submodules using `app.go`. + +#### Disabling controller chain functionality + +```go +// Create Interchain Accounts AppModule omitting the controller keeper +icaModule := ica.NewAppModule(nil, &app.ICAHostKeeper) + +// Create host IBC Module +icaHostIBCModule := icahost.NewIBCModule(app.ICAHostKeeper) + +// Register host route +ibcRouter.AddRoute(icahosttypes.SubModuleName, icaHostIBCModule) +``` + +#### Disabling host chain functionality + +```go +// Create Interchain Accounts AppModule omitting the host keeper +icaModule := ica.NewAppModule(&app.ICAControllerKeeper, nil) + + +// Optionally instantiate your custom authentication module if needed, or not otherwise +... + +// Create controller IBC application stack +icaControllerStack := icacontroller.NewIBCMiddleware(app.ICAControllerKeeper) + +// Register controller route +ibcRouter.AddRoute(icacontrollertypes.SubModuleName, icaControllerStack) +``` diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/05-messages.md b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/05-messages.md new file mode 100644 index 00000000000..eb671ab5e5e --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/05-messages.md @@ -0,0 +1,153 @@ +--- +title: Messages +sidebar_label: Messages +sidebar_position: 5 +slug: /apps/interchain-accounts/messages +--- + + +# Messages + +## `MsgRegisterInterchainAccount` + +An Interchain Accounts channel handshake can be initiated using `MsgRegisterInterchainAccount`: + +```go +type MsgRegisterInterchainAccount struct { + Owner string + ConnectionID string + Version string + Ordering channeltypes.Order +} +``` + +This message is expected to fail if: + +- `Owner` is an empty string or contains more than 2048 bytes. +- `ConnectionID` is invalid (see [24-host naming requirements](https://github.com/cosmos/ibc/blob/master/spec/core/ics-024-host-requirements/README.md#paths-identifiers-separators)). + +This message will construct a new `MsgChannelOpenInit` on chain and route it to the core IBC message server to initiate the opening step of the channel handshake. + +The controller submodule will generate a new port identifier. The caller is expected to provide an appropriate application version string. For example, this may be an ICS-27 JSON encoded [`Metadata`](https://github.com/cosmos/ibc-go/blob/v6.0.0/proto/ibc/applications/interchain_accounts/v1/metadata.proto#L11) type or an ICS-29 JSON encoded [`Metadata`](https://github.com/cosmos/ibc-go/blob/v6.0.0/proto/ibc/applications/fee/v1/metadata.proto#L11) type with a nested application version. +If the `Version` string is omitted, the controller submodule will construct a default version string in the `OnChanOpenInit` handshake callback. + +```go +type MsgRegisterInterchainAccountResponse struct { + ChannelID string + PortId string +} +``` + +The `ChannelID` and `PortID` are returned in the message response. + +## `MsgSendTx` + +An Interchain Accounts transaction can be executed on a remote host chain by sending a `MsgSendTx` from the corresponding controller chain: + +```go +type MsgSendTx struct { + Owner string + ConnectionID string + PacketData InterchainAccountPacketData + RelativeTimeout uint64 +} +``` + +This message is expected to fail if: + +- `Owner` is an empty string or contains more than 2048 bytes. +- `ConnectionID` is invalid (see [24-host naming requirements](https://github.com/cosmos/ibc/blob/master/spec/core/ics-024-host-requirements/README.md#paths-identifiers-separators)). +- `PacketData` contains an `UNSPECIFIED` type enum, the length of `Data` bytes is zero or the `Memo` field exceeds 256 characters in length. +- `RelativeTimeout` is zero. + +This message will create a new IBC packet with the provided `PacketData` and send it via the channel associated with the `Owner` and `ConnectionID`. +The `PacketData` is expected to contain a list of serialized `[]sdk.Msg` in the form of `CosmosTx`. Please note the signer field of each `sdk.Msg` must be the interchain account address. +When the packet is relayed to the host chain, the `PacketData` is unmarshalled and the messages are authenticated and executed. + +```go +type MsgSendTxResponse struct { + Sequence uint64 +} +``` + +The packet `Sequence` is returned in the message response. + +### Queries + +It is possible to use [`MsgModuleQuerySafe`](https://github.com/cosmos/ibc-go/blob/eecfa5c09a4c38a5c9f2cc2a322d2286f45911da/proto/ibc/applications/interchain_accounts/host/v1/tx.proto#L41-L51) to execute a list of queries on the host chain. This message can be included in the list of encoded `sdk.Msg`s of `InterchainPacketData`. The host chain will return on the acknowledgment the responses for all the queries. Please note that only module safe queries can be executed ([deterministic queries that are safe to be called from within the state machine](https://docs.cosmos.network/main/build/building-modules/query-services#calling-queries-from-the-state-machine)). + +The queries available from Cosmos SDK are: + +```plaintext +/cosmos.auth.v1beta1.Query/Accounts +/cosmos.auth.v1beta1.Query/Account +/cosmos.auth.v1beta1.Query/AccountAddressByID +/cosmos.auth.v1beta1.Query/Params +/cosmos.auth.v1beta1.Query/ModuleAccounts +/cosmos.auth.v1beta1.Query/ModuleAccountByName +/cosmos.auth.v1beta1.Query/AccountInfo +/cosmos.bank.v1beta1.Query/Balance +/cosmos.bank.v1beta1.Query/AllBalances +/cosmos.bank.v1beta1.Query/SpendableBalances +/cosmos.bank.v1beta1.Query/SpendableBalanceByDenom +/cosmos.bank.v1beta1.Query/TotalSupply +/cosmos.bank.v1beta1.Query/SupplyOf +/cosmos.bank.v1beta1.Query/Params +/cosmos.bank.v1beta1.Query/DenomMetadata +/cosmos.bank.v1beta1.Query/DenomMetadataByQueryString +/cosmos.bank.v1beta1.Query/DenomsMetadata +/cosmos.bank.v1beta1.Query/DenomOwners +/cosmos.bank.v1beta1.Query/SendEnabled +/cosmos.circuit.v1.Query/Account +/cosmos.circuit.v1.Query/Accounts +/cosmos.circuit.v1.Query/DisabledList +/cosmos.staking.v1beta1.Query/Validators +/cosmos.staking.v1beta1.Query/Validator +/cosmos.staking.v1beta1.Query/ValidatorDelegations +/cosmos.staking.v1beta1.Query/ValidatorUnbondingDelegations +/cosmos.staking.v1beta1.Query/Delegation +/cosmos.staking.v1beta1.Query/UnbondingDelegation +/cosmos.staking.v1beta1.Query/DelegatorDelegations +/cosmos.staking.v1beta1.Query/DelegatorUnbondingDelegations +/cosmos.staking.v1beta1.Query/Redelegations +/cosmos.staking.v1beta1.Query/DelegatorValidators +/cosmos.staking.v1beta1.Query/DelegatorValidator +/cosmos.staking.v1beta1.Query/HistoricalInfo +/cosmos.staking.v1beta1.Query/Pool +/cosmos.staking.v1beta1.Query/Params +``` + +And the query available from ibc-go is: + +```plaintext +/ibc.core.client.v1.Query/VerifyMembership +``` + +The following code block shows an example of how `MsgModuleQuerySafe` can be used to query the account balance of an account on the host chain. The resulting packet data variable is used to set the `PacketData` of `MsgSendTx`. + +```go +balanceQuery := banktypes.NewQueryBalanceRequest("cosmos1...", "uatom") +queryBz, err := balanceQuery.Marshal() + +// signer of message must be the interchain account on the host +queryMsg := icahosttypes.NewMsgModuleQuerySafe("cosmos2...", []icahosttypes.QueryRequest{ + { + Path: "/cosmos.bank.v1beta1.Query/Balance", + Data: queryBz, + }, +}) + +bz, err := icatypes.SerializeCosmosTx(cdc, []proto.Message{queryMsg}, icatypes.EncodingProtobuf) + +packetData := icatypes.InterchainAccountPacketData{ + Type: icatypes.EXECUTE_TX, + Data: bz, + Memo: "", +} +``` + +## Atomicity + +As the Interchain Accounts module supports the execution of multiple transactions using the Cosmos SDK `Msg` interface, it provides the same atomicity guarantees as Cosmos SDK-based applications, leveraging the [`CacheMultiStore`](https://docs.cosmos.network/main/learn/advanced/store#cachemultistore) architecture provided by the [`Context`](https://docs.cosmos.network/main/learn/advanced/context.html) type. + +This provides atomic execution of transactions when using Interchain Accounts, where state changes are only committed if all `Msg`s succeed. diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/06-parameters.md b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/06-parameters.md new file mode 100644 index 00000000000..5ab4fdd8478 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/06-parameters.md @@ -0,0 +1,65 @@ +--- +title: Parameters +sidebar_label: Parameters +sidebar_position: 6 +slug: /apps/interchain-accounts/parameters +--- + + +# Parameters + +The Interchain Accounts module contains the following on-chain parameters, logically separated for each distinct submodule: + +## Controller Submodule Parameters + +| Name | Type | Default Value | +|------------------------|------|---------------| +| `ControllerEnabled` | bool | `true` | + +### ControllerEnabled + +The `ControllerEnabled` parameter controls a chains ability to service ICS-27 controller specific logic. This includes the sending of Interchain Accounts packet data as well as the following ICS-26 callback handlers: + +- `OnChanOpenInit` +- `OnChanOpenAck` +- `OnChanCloseConfirm` +- `OnAcknowledgementPacket` +- `OnTimeoutPacket` + +## Host Submodule Parameters + +| Name | Type | Default Value | +|------------------------|----------|---------------| +| `HostEnabled` | bool | `true` | +| `AllowMessages` | []string | `["*"]` | + +### HostEnabled + +The `HostEnabled` parameter controls a chains ability to service ICS-27 host specific logic. This includes the following ICS-26 callback handlers: + +- `OnChanOpenTry` +- `OnChanOpenConfirm` +- `OnChanCloseConfirm` +- `OnRecvPacket` + +### AllowMessages + +The `AllowMessages` parameter provides the ability for a chain to limit the types of messages or transactions that hosted interchain accounts are authorized to execute by defining an allowlist using the Protobuf message type URL format. + +For example, a Cosmos SDK-based chain that elects to provide hosted Interchain Accounts with the ability of governance voting and staking delegations will define its parameters as follows: + +```json +"params": { + "host_enabled": true, + "allow_messages": ["/cosmos.staking.v1beta1.MsgDelegate", "/cosmos.gov.v1beta1.MsgVote"] +} +``` + +There is also a special wildcard `"*"` value which allows any type of message to be executed by the interchain account. This must be the only value in the `allow_messages` array. + +```json +"params": { + "host_enabled": true, + "allow_messages": ["*"] +} +``` diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/07-tx-encoding.md b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/07-tx-encoding.md new file mode 100644 index 00000000000..5be03af2f8e --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/07-tx-encoding.md @@ -0,0 +1,58 @@ +--- +title: Transaction Encoding +sidebar_label: Transaction Encoding +sidebar_position: 7 +slug: /apps/interchain-accounts/tx-encoding +--- + +# Transaction Encoding + +When orchestrating an interchain account transaction, which comprises multiple `sdk.Msg` objects represented as `Any` types, the transactions must be encoded as bytes within [`InterchainAccountPacketData`](https://github.com/cosmos/ibc-go/blob/v7.2.0/proto/ibc/applications/interchain_accounts/v1/packet.proto#L21-L26). + +```protobuf +// InterchainAccountPacketData is comprised of a raw transaction, type of transaction and optional memo field. +message InterchainAccountPacketData { + Type type = 1; + bytes data = 2; + string memo = 3; +} +``` + +The `data` field must be encoded as a [`CosmosTx`](https://github.com/cosmos/ibc-go/blob/v7.2.0/proto/ibc/applications/interchain_accounts/v1/packet.proto#L28-L31). + +```protobuf +// CosmosTx contains a list of sdk.Msg's. It should be used when sending transactions to an SDK host chain. +message CosmosTx { + repeated google.protobuf.Any messages = 1; +} +``` + +The encoding method for `CosmosTx` is determined during the channel handshake process. If the channel version [metadata's `encoding` field](https://github.com/cosmos/ibc-go/blob/v7.2.0/proto/ibc/applications/interchain_accounts/v1/metadata.proto#L22) is marked as `proto3`, then `CosmosTx` undergoes protobuf encoding. Conversely, if the field is set to `proto3json`, then [proto3 json](https://protobuf.dev/programming-guides/proto3/#json) encoding takes place, which generates a JSON representation of the protobuf message. + +## Protobuf Encoding + +Protobuf encoding serves as the standard encoding process for `CosmosTx`. This occurs if the channel handshake initiates with an empty channel version metadata or if the `encoding` field explicitly denotes `proto3`. In Golang, the protobuf encoding procedure utilizes the `proto.Marshal` function. Every protobuf autogenerated Golang type comes equipped with a `Marshal` method that can be employed to encode the message. + +## (Protobuf) JSON Encoding + +The proto3 JSON encoding presents an alternative encoding technique for `CosmosTx`. It is selected if the channel handshake begins with the channel version metadata `encoding` field labeled as `proto3json`. In Golang, the Proto3 canonical encoding in JSON is implemented by the `"github.com/cosmos/gogoproto/jsonpb"` package. Within Cosmos SDK, the `ProtoCodec` structure implements the `JSONCodec` interface, leveraging the `jsonpb` package. This method generates a JSON format as follows: + +```json +{ + "messages": [ + { + "@type": "/cosmos.bank.v1beta1.MsgSend", + "from_address": "cosmos1...", + "to_address": "cosmos1...", + "amount": [ + { + "denom": "uatom", + "amount": "1000000" + } + ] + } + ] +} +``` + +Here, the `"messages"` array is populated with transactions. Each transaction is represented as a JSON object with the `@type` field denoting the transaction type and the remaining fields representing the transaction's attributes. diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/08-client.md b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/08-client.md new file mode 100644 index 00000000000..82f00816285 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/08-client.md @@ -0,0 +1,202 @@ +--- +title: Client +sidebar_label: Client +sidebar_position: 8 +slug: /apps/interchain-accounts/client +--- + +# Client + +## CLI + +A user can query and interact with the Interchain Accounts module using the CLI. Use the `--help` flag to discover the available commands: + +```shell +simd query interchain-accounts --help +``` + +> Please not that this section does not document all the available commands, but only the ones that deserved extra documentation that was not possible to fit in the command line documentation. + +### Controller + +A user can query and interact with the controller submodule. + +#### Query + +The `query` commands allow users to query the controller submodule. + +```shell +simd query interchain-accounts controller --help +``` + +#### Transactions + +The `tx` commands allow users to interact with the controller submodule. + +```shell +simd tx interchain-accounts controller --help +``` + +#### `register` + +The `register` command allows users to register an interchain account on a host chain on the provided connection. + +```shell +simd tx interchain-accounts controller register [connection-id] [flags] +``` + +During registration a new channel is set up between controller and host. There are two flags available that influence the channel that is created: + +- `--version` to specify the (JSON-formatted) version string of the channel. For example: `{\"version\":\"ics27-1\",\"encoding\":\"proto3\",\"tx_type\":\"sdk_multi_msg\",\"controller_connection_id\":\"connection-0\",\"host_connection_id\":\"connection-0\"}`. Passing a custom version string is useful if you want to specify, for example, the encoding format of the interchain accounts packet data (either `proto3` or `proto3json`). If not specified the controller submodule will generate a default version string. +- `--ordering` to specify the ordering of the channel. Available options are `order_ordered` and `order_unordered` (default if not specified). + +Example: + +```shell +simd tx interchain-accounts controller register connection-0 --ordering order_ordered --from cosmos1.. +``` + +#### `send-tx` + +The `send-tx` command allows users to send a transaction on the provided connection to be executed using an interchain account on the host chain. + +```shell +simd tx interchain-accounts controller send-tx [connection-id] [path/to/packet_msg.json] +``` + +Example: + +```shell +simd tx interchain-accounts controller send-tx connection-0 packet-data.json --from cosmos1.. +``` + +See below for example contents of `packet-data.json`. The CLI handler will unmarshal the following into `InterchainAccountPacketData` appropriately. + +```json +{ + "type":"TYPE_EXECUTE_TX", + "data":"CqIBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEoEBCkFjb3Ntb3MxNWNjc2hobXAwZ3N4MjlxcHFxNmc0em1sdG5udmdteXU5dWV1YWRoOXkybmM1emowc3psczVndGRkehItY29zbW9zMTBoOXN0YzV2Nm50Z2V5Z2Y1eGY5NDVuanFxNWgzMnI1M3VxdXZ3Gg0KBXN0YWtlEgQxMDAw", + "memo":"" +} +``` + +Note the `data` field is a base64 encoded byte string as per the tx encoding agreed upon during the channel handshake. + +A helper CLI is provided in the host submodule which can be used to generate the packet data JSON using the counterparty chain's binary. See the [`generate-packet-data` command](#generate-packet-data) for an example. + +### Host + +A user can query and interact with the host submodule. + +#### Query + +The `query` commands allow users to query the host submodule. + +```shell +simd query interchain-accounts host --help +``` + +#### Transactions + +The `tx` commands allow users to interact with the controller submodule. + +```shell +simd tx interchain-accounts host --help +``` + +##### `generate-packet-data` + +The `generate-packet-data` command allows users to generate protobuf or proto3 JSON encoded interchain accounts packet data for input message(s). The packet data can then be used with the controller submodule's [`send-tx` command](#send-tx). The `--encoding` flag can be used to specify the encoding format (value must be either `proto3` or `proto3json`); if not specified, the default will be `proto3`. The `--memo` flag can be used to include a memo string in the interchain accounts packet data. + +```shell +simd tx interchain-accounts host generate-packet-data [message] +``` + +Example: + +```shell +simd tx interchain-accounts host generate-packet-data '[{ + "@type":"/cosmos.bank.v1beta1.MsgSend", + "from_address":"cosmos15ccshhmp0gsx29qpqq6g4zmltnnvgmyu9ueuadh9y2nc5zj0szls5gtddz", + "to_address":"cosmos10h9stc5v6ntgeygf5xf945njqq5h32r53uquvw", + "amount": [ + { + "denom": "stake", + "amount": "1000" + } + ] +}]' --memo memo +``` + +The command accepts a single `sdk.Msg` or a list of `sdk.Msg`s that will be encoded into the outputs `data` field. + +Example output: + +```json +{ + "type":"TYPE_EXECUTE_TX", + "data":"CqIBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEoEBCkFjb3Ntb3MxNWNjc2hobXAwZ3N4MjlxcHFxNmc0em1sdG5udmdteXU5dWV1YWRoOXkybmM1emowc3psczVndGRkehItY29zbW9zMTBoOXN0YzV2Nm50Z2V5Z2Y1eGY5NDVuanFxNWgzMnI1M3VxdXZ3Gg0KBXN0YWtlEgQxMDAw", + "memo":"memo" +} +``` + +## gRPC + +A user can query the interchain account module using gRPC endpoints. + +### Controller + +A user can query the controller submodule using gRPC endpoints. + +#### `InterchainAccount` + +The `InterchainAccount` endpoint allows users to query the controller submodule for the interchain account address for a given owner on a particular connection. + +```shell +ibc.applications.interchain_accounts.controller.v1.Query/InterchainAccount +``` + +Example: + +```shell +grpcurl -plaintext \ + -d '{"owner":"cosmos1..","connection_id":"connection-0"}' \ + localhost:9090 \ + ibc.applications.interchain_accounts.controller.v1.Query/InterchainAccount +``` + +#### `Params` + +The `Params` endpoint users to query the current controller submodule parameters. + +```shell +ibc.applications.interchain_accounts.controller.v1.Query/Params +``` + +Example: + +```shell +grpcurl -plaintext \ + localhost:9090 \ + ibc.applications.interchain_accounts.controller.v1.Query/Params +``` + +### Host + +A user can query the host submodule using gRPC endpoints. + +#### `Params` + +The `Params` endpoint users to query the current host submodule parameters. + +```shell +ibc.applications.interchain_accounts.host.v1.Query/Params +``` + +Example: + +```shell +grpcurl -plaintext \ + localhost:9090 \ + ibc.applications.interchain_accounts.host.v1.Query/Params +``` diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/09-active-channels.md b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/09-active-channels.md new file mode 100644 index 00000000000..0845c20ebe6 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/09-active-channels.md @@ -0,0 +1,45 @@ +--- +title: Active Channels +sidebar_label: Active Channels +sidebar_position: 9 +slug: /apps/interchain-accounts/active-channels +--- + +# Understanding Active Channels + +The Interchain Accounts module uses either [ORDERED or UNORDERED](https://github.com/cosmos/ibc/tree/master/spec/core/ics-004-channel-and-packet-semantics#ordering) channels. + +When using `ORDERED` channels, the order of transactions when sending packets from a controller to a host chain is maintained. + +When using `UNORDERED` channels, there is no guarantee that the order of transactions when sending packets from the controller to the host chain is maintained. If no ordering is specified in `MsgRegisterInterchainAccount`, then the default ordering for new ICA channels is `UNORDERED`. + +> A limitation when using ORDERED channels is that when a packet times out the channel will be closed. + +In the case of a channel closing, a controller chain needs to be able to regain access to the interchain account registered on this channel. `Active Channels` enable this functionality. + +When an Interchain Account is registered using `MsgRegisterInterchainAccount`, a new channel is created on a particular port. During the `OnChanOpenAck` and `OnChanOpenConfirm` steps (on controller & host chain respectively) the `Active Channel` for this interchain account is stored in state. + +It is possible to create a new channel using the same controller chain portID if the previously set `Active Channel` is now in a `CLOSED` state. This channel creation can be initialized programmatically by sending a new `MsgChannelOpenInit` message like so: + +```go +msg := channeltypes.NewMsgChannelOpenInit(portID, string(versionBytes), channeltypes.ORDERED, []string{connectionID}, icatypes.HostPortID, authtypes.NewModuleAddress(icatypes.ModuleName).String()) +handler := keeper.msgRouter.Handler(msg) +res, err := handler(ctx, msg) +if err != nil { + return err +} +``` + +Alternatively, any relayer operator may initiate a new channel handshake for this interchain account once the previously set `Active Channel` is in a `CLOSED` state. This is done by initiating the channel handshake on the controller chain using the same portID associated with the interchain account in question. + +It is important to note that once a channel has been opened for a given interchain account, new channels can not be opened for this account until the currently set `Active Channel` is set to `CLOSED`. + +## Future improvements + +Future versions of the ICS-27 protocol and the Interchain Accounts module will likely use a new channel type that provides ordering of packets without the channel closing in the event of a packet timing out, thus removing the need for `Active Channels` entirely. +The following is a list of issues which will provide the infrastructure to make this possible: + +- [IBC Channel Upgrades](https://github.com/cosmos/ibc-go/issues/1599) +- [Implement ORDERED_ALLOW_TIMEOUT logic in 04-channel](https://github.com/cosmos/ibc-go/issues/1661) +- [Add ORDERED_ALLOW_TIMEOUT as supported ordering in 03-connection](https://github.com/cosmos/ibc-go/issues/1662) +- [Allow ICA channels to be opened as ORDERED_ALLOW_TIMEOUT](https://github.com/cosmos/ibc-go/issues/1663) diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/10-legacy/01-auth-modules.md b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/10-legacy/01-auth-modules.md new file mode 100644 index 00000000000..38b0b753c10 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/10-legacy/01-auth-modules.md @@ -0,0 +1,268 @@ +--- +title: Authentication Modules +sidebar_label: Authentication Modules +sidebar_position: 1 +slug: /apps/interchain-accounts/legacy/auth-modules +--- + + +# Building an authentication module + +## Deprecation Notice + +**This document is deprecated and will be removed in future releases**. + +:::note Synopsis +Authentication modules play the role of the `Base Application` as described in [ICS-30 IBC Middleware](https://github.com/cosmos/ibc/tree/master/spec/app/ics-030-middleware), and enable application developers to perform custom logic when working with the Interchain Accounts controller API. +::: + +The controller submodule is used for account registration and packet sending. It executes only logic required of all controllers of interchain accounts. The type of authentication used to manage the interchain accounts remains unspecified. There may exist many different types of authentication which are desirable for different use cases. Thus the purpose of the authentication module is to wrap the controller submodule with custom authentication logic. + +In ibc-go, authentication modules are connected to the controller chain via a middleware stack. The controller submodule is implemented as [middleware](https://github.com/cosmos/ibc/tree/master/spec/app/ics-030-middleware) and the authentication module is connected to the controller submodule as the base application of the middleware stack. To implement an authentication module, the `IBCModule` interface must be fulfilled. By implementing the controller submodule as middleware, any amount of authentication modules can be created and connected to the controller submodule without writing redundant code. + +The authentication module must: + +- Authenticate interchain account owners. +- Track the associated interchain account address for an owner. +- Send packets on behalf of an owner (after authentication). + +## `IBCModule` implementation + +The following `IBCModule` callbacks must be implemented with appropriate custom logic: + +```go +// OnChanOpenInit implements the IBCModule interface +func (im IBCModule) OnChanOpenInit( + ctx sdk.Context, + order channeltypes.Order, + connectionHops []string, + portID string, + channelID string, + counterparty channeltypes.Counterparty, + version string, +) (string, error) { + // perform custom logic + + return version, nil +} + +// OnChanOpenAck implements the IBCModule interface +func (im IBCModule) OnChanOpenAck( + ctx sdk.Context, + portID, + channelID string, + counterpartyVersion string, +) error { + // perform custom logic + + return nil +} + +// OnChanCloseConfirm implements the IBCModule interface +func (im IBCModule) OnChanCloseConfirm( + ctx sdk.Context, + portID, + channelID string, +) error { + // perform custom logic + + return nil +} + +// OnAcknowledgementPacket implements the IBCModule interface +func (im IBCModule) OnAcknowledgementPacket( + ctx sdk.Context, + packet channeltypes.Packet, + acknowledgement []byte, + relayer sdk.AccAddress, +) error { + // perform custom logic + + return nil +} + +// OnTimeoutPacket implements the IBCModule interface. +func (im IBCModule) OnTimeoutPacket( + ctx sdk.Context, + packet channeltypes.Packet, + relayer sdk.AccAddress, +) error { + // perform custom logic + + return nil +} +``` + +The following functions must be defined to fulfill the `IBCModule` interface, but they will never be called by the controller submodule so they may error or panic. That is because in Interchain Accounts, the channel handshake is always initiated on the controller chain and packets are always sent to the host chain and never to the controller chain. + +```go +// OnChanOpenTry implements the IBCModule interface +func (im IBCModule) OnChanOpenTry( + ctx sdk.Context, + order channeltypes.Order, + connectionHops []string, + portID, + channelID string, + counterparty channeltypes.Counterparty, + counterpartyVersion string, +) (string, error) { + panic("UNIMPLEMENTED") +} + +// OnChanOpenConfirm implements the IBCModule interface +func (im IBCModule) OnChanOpenConfirm( + ctx sdk.Context, + portID, + channelID string, +) error { + panic("UNIMPLEMENTED") +} + +// OnChanCloseInit implements the IBCModule interface +func (im IBCModule) OnChanCloseInit( + ctx sdk.Context, + portID, + channelID string, +) error { + panic("UNIMPLEMENTED") +} + +// OnRecvPacket implements the IBCModule interface. A successful acknowledgement +// is returned if the packet data is successfully decoded and the receive application +// logic returns without error. +func (im IBCModule) OnRecvPacket( + ctx sdk.Context, + packet channeltypes.Packet, + relayer sdk.AccAddress, +) ibcexported.Acknowledgement { + panic("UNIMPLEMENTED") +} +``` + +## `OnAcknowledgementPacket` + +Controller chains will be able to access the acknowledgement written into the host chain state once a relayer relays the acknowledgement. +The acknowledgement bytes contain either the response of the execution of the message(s) on the host chain or an error. They will be passed to the auth module via the `OnAcknowledgementPacket` callback. Auth modules are expected to know how to decode the acknowledgement. + +If the controller chain is connected to a host chain using the host module on ibc-go, it may interpret the acknowledgement bytes as follows: + +Begin by unmarshaling the acknowledgement into `sdk.TxMsgData`: + +```go +var ack channeltypes.Acknowledgement +if err := channeltypes.SubModuleCdc.UnmarshalJSON(acknowledgement, &ack); err != nil { + return err +} + +txMsgData := &sdk.TxMsgData{} +if err := proto.Unmarshal(ack.GetResult(), txMsgData); err != nil { + return err +} +``` + +If the `txMsgData.Data` field is non nil, the host chain is using SDK version \<\= v0.45. +The auth module should interpret the `txMsgData.Data` as follows: + +```go +switch len(txMsgData.Data) { +case 0: + // see documentation below for SDK 0.46.x or greater +default: + for _, msgData := range txMsgData.Data { + if err := handler(msgData); err != nil { + return err + } + } +... +} +``` + +A handler will be needed to interpret what actions to perform based on the message type sent. +A router could be used, or more simply a switch statement. + +```go +func handler(msgData sdk.MsgData) error { +switch msgData.MsgType { +case sdk.MsgTypeURL(&banktypes.MsgSend{}): + msgResponse := &banktypes.MsgSendResponse{} + if err := proto.Unmarshal(msgData.Data, msgResponse}; err != nil { + return err + } + + handleBankSendMsg(msgResponse) + +case sdk.MsgTypeURL(&stakingtypes.MsgDelegate{}): + msgResponse := &stakingtypes.MsgDelegateResponse{} + if err := proto.Unmarshal(msgData.Data, msgResponse}; err != nil { + return err + } + + handleStakingDelegateMsg(msgResponse) + +case sdk.MsgTypeURL(&transfertypes.MsgTransfer{}): + msgResponse := &transfertypes.MsgTransferResponse{} + if err := proto.Unmarshal(msgData.Data, msgResponse}; err != nil { + return err + } + + handleIBCTransferMsg(msgResponse) + +default: + return +} +``` + +If the `txMsgData.Data` is empty, the host chain is using SDK version > v0.45. +The auth module should interpret the `txMsgData.Responses` as follows: + +```go +... +// switch statement from above +case 0: + for _, any := range txMsgData.MsgResponses { + if err := handleAny(any); err != nil { + return err + } + } +} +``` + +A handler will be needed to interpret what actions to perform based on the type URL of the Any. +A router could be used, or more simply a switch statement. +It may be possible to deduplicate logic between `handler` and `handleAny`. + +```go +func handleAny(any *codectypes.Any) error { +switch any.TypeURL { +case banktypes.MsgSend: + msgResponse, err := unpackBankMsgSendResponse(any) + if err != nil { + return err + } + + handleBankSendMsg(msgResponse) + +case stakingtypes.MsgDelegate: + msgResponse, err := unpackStakingDelegateResponse(any) + if err != nil { + return err + } + + handleStakingDelegateMsg(msgResponse) + + case transfertypes.MsgTransfer: + msgResponse, err := unpackIBCTransferMsgResponse(any) + if err != nil { + return err + } + + handleIBCTransferMsg(msgResponse) + +default: + return +} +``` + +## Integration into `app.go` file + +To integrate the authentication module into your chain, please follow the steps outlined in [`app.go` integration](02-integration.md#example-integration). diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/10-legacy/02-integration.md b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/10-legacy/02-integration.md new file mode 100644 index 00000000000..ae15c0ae197 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/10-legacy/02-integration.md @@ -0,0 +1,196 @@ +--- +title: Integration +sidebar_label: Integration +sidebar_position: 2 +slug: /apps/interchain-accounts/legacy/integration +--- + + +# Integration + +## Deprecation Notice + +**This document is deprecated and will be removed in future releases**. + +:::note Synopsis +Learn how to integrate Interchain Accounts host and controller functionality to your chain. The following document only applies for Cosmos SDK chains. +::: + +The Interchain Accounts module contains two submodules. Each submodule has its own IBC application. The Interchain Accounts module should be registered as an `AppModule` in the same way all SDK modules are registered on a chain, but each submodule should create its own `IBCModule` as necessary. A route should be added to the IBC router for each submodule which will be used. + +Chains who wish to support ICS-27 may elect to act as a host chain, a controller chain or both. Disabling host or controller functionality may be done statically by excluding the host or controller module entirely from the `app.go` file or it may be done dynamically by taking advantage of the on-chain parameters which enable or disable the host or controller submodules. + +Interchain Account authentication modules are the base application of a middleware stack. The controller submodule is the middleware in this stack. + +![ica-pre-v6.png](./images/ica-pre-v6.png) + +## Example integration + +```go +// app.go + +// Register the AppModule for the Interchain Accounts module and the authentication module +// Note: No `icaauth` exists, this must be substituted with an actual Interchain Accounts authentication module +ModuleBasics = module.NewBasicManager( + ... + ica.AppModuleBasic{}, + icaauth.AppModuleBasic{}, + ... +) + +... + +// Add module account permissions for the Interchain Accounts module +// Only necessary for host chain functionality +// Each Interchain Account created on the host chain is derived from the module account created +maccPerms = map[string][]string{ + ... + icatypes.ModuleName: nil, +} + +... + +// Add Interchain Accounts Keepers for each submodule used and the authentication module +// If a submodule is being statically disabled, the associated Keeper does not need to be added. +type App struct { + ... + + ICAControllerKeeper icacontrollerkeeper.Keeper + ICAHostKeeper icahostkeeper.Keeper + ICAAuthKeeper icaauthkeeper.Keeper + + ... +} + +... + +// Create store keys for each submodule Keeper and the authentication module +keys := sdk.NewKVStoreKeys( + ... + icacontrollertypes.StoreKey, + icahosttypes.StoreKey, + icaauthtypes.StoreKey, + ... +) + +... + + +... + +// Create the Keeper for each submodule +app.ICAControllerKeeper = icacontrollerkeeper.NewKeeper( + appCodec, keys[icacontrollertypes.StoreKey], app.GetSubspace(icacontrollertypes.SubModuleName), + app.IBCKeeper.ChannelKeeper, // may be replaced with middleware such as ics29 fee + app.IBCKeeper.ChannelKeeper, &app.IBCKeeper.PortKeeper, + app.MsgServiceRouter(), +) +app.ICAHostKeeper = icahostkeeper.NewKeeper( + appCodec, keys[icahosttypes.StoreKey], app.GetSubspace(icahosttypes.SubModuleName), + app.IBCKeeper.ChannelKeeper, // may be replaced with middleware such as ics29 fee + app.IBCKeeper.ChannelKeeper, &app.IBCKeeper.PortKeeper, + app.AccountKeeper, app.MsgServiceRouter(), +) + +// Create Interchain Accounts AppModule +icaModule := ica.NewAppModule(&app.ICAControllerKeeper, &app.ICAHostKeeper) + +// Create your Interchain Accounts authentication module +app.ICAAuthKeeper = icaauthkeeper.NewKeeper(appCodec, keys[icaauthtypes.StoreKey], app.ICAControllerKeeper) + +// ICA auth AppModule +icaAuthModule := icaauth.NewAppModule(appCodec, app.ICAAuthKeeper) + +// ICA auth IBC Module +icaAuthIBCModule := icaauth.NewIBCModule(app.ICAAuthKeeper) + +// Create controller IBC application stack and host IBC module as desired +icaControllerStack := icacontroller.NewIBCMiddlewareWithAuth(icaAuthIBCModule, app.ICAControllerKeeper) +icaHostIBCModule := icahost.NewIBCModule(app.ICAHostKeeper) + +// Register host and authentication routes +ibcRouter. + AddRoute(icacontrollertypes.SubModuleName, icaControllerStack). + AddRoute(icahosttypes.SubModuleName, icaHostIBCModule). + AddRoute(icaauthtypes.ModuleName, icaControllerStack) // Note, the authentication module is routed to the top level of the middleware stack + +... + +// Register Interchain Accounts and authentication module AppModule's +app.moduleManager = module.NewManager( + ... + icaModule, + icaAuthModule, +) + +... + +// Add fee middleware to begin blocker logic +app.moduleManager.SetOrderBeginBlockers( + ... + icatypes.ModuleName, + ... +) + +// Add fee middleware to end blocker logic +app.moduleManager.SetOrderEndBlockers( + ... + icatypes.ModuleName, + ... +) + +// Add Interchain Accounts module InitGenesis logic +app.moduleManager.SetOrderInitGenesis( + ... + icatypes.ModuleName, + ... +) + +// initParamsKeeper init params keeper and its subspaces +func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey sdk.StoreKey) paramskeeper.Keeper { + ... + paramsKeeper.Subspace(icahosttypes.SubModuleName) + paramsKeeper.Subspace(icacontrollertypes.SubModuleName) + ... +``` + +## Using submodules exclusively + +As described above, the Interchain Accounts application module is structured to support the ability of exclusively enabling controller or host functionality. +This can be achieved by simply omitting either controller or host `Keeper` from the Interchain Accounts `NewAppModule` constructor function, and mounting only the desired submodule via the `IBCRouter`. +Alternatively, submodules can be enabled and disabled dynamically using [on-chain parameters](../06-parameters.md). + +The following snippets show basic examples of statically disabling submodules using `app.go`. + +### Disabling controller chain functionality + +```go +// Create Interchain Accounts AppModule omitting the controller keeper +icaModule := ica.NewAppModule(nil, &app.ICAHostKeeper) + +// Create host IBC Module +icaHostIBCModule := icahost.NewIBCModule(app.ICAHostKeeper) + +// Register host route +ibcRouter.AddRoute(icahosttypes.SubModuleName, icaHostIBCModule) +``` + +### Disabling host chain functionality + +```go +// Create Interchain Accounts AppModule omitting the host keeper +icaModule := ica.NewAppModule(&app.ICAControllerKeeper, nil) + +// Create your Interchain Accounts authentication module, setting up the Keeper, AppModule and IBCModule appropriately +app.ICAAuthKeeper = icaauthkeeper.NewKeeper(appCodec, keys[icaauthtypes.StoreKey], app.ICAControllerKeeper) +icaAuthModule := icaauth.NewAppModule(appCodec, app.ICAAuthKeeper) +icaAuthIBCModule := icaauth.NewIBCModule(app.ICAAuthKeeper) + +// Create controller IBC application stack +icaControllerStack := icacontroller.NewIBCMiddlewareWithAuth(icaAuthIBCModule, app.ICAControllerKeeper) + +// Register controller and authentication routes +ibcRouter. + AddRoute(icacontrollertypes.SubModuleName, icaControllerStack). + AddRoute(icaauthtypes.ModuleName, icaControllerStack) // Note, the authentication module is routed to the top level of the middleware stack +``` diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/10-legacy/03-keeper-api.md b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/10-legacy/03-keeper-api.md new file mode 100644 index 00000000000..337ad1f71df --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/10-legacy/03-keeper-api.md @@ -0,0 +1,123 @@ +--- +title: Keeper API +sidebar_label: Keeper API +sidebar_position: 3 +slug: /apps/interchain-accounts/legacy/keeper-api +--- + + +# Keeper API + +## Deprecation Notice + +**This document is deprecated and will be removed in future releases**. + +The controller submodule keeper exposes two legacy functions that allow respectively for custom authentication modules to register interchain accounts and send packets to the interchain account. + +## `RegisterInterchainAccount` + +The authentication module can begin registering interchain accounts by calling `RegisterInterchainAccount`: + +```go +if err := keeper.icaControllerKeeper.RegisterInterchainAccount(ctx, connectionID, owner.String(), version, channeltypes.UNORDERED); err != nil { + return err +} + +return nil +``` + +The `version` argument is used to support ICS-29 fee middleware for relayer incentivization of ICS-27 packets. The `ordering` argument allows to specify the ordering of the channel that is created; if `NONE` is passed, then the default ordering will be `UNORDERED`. Consumers of the `RegisterInterchainAccount` are expected to build the appropriate JSON encoded version string themselves and pass it accordingly. If an empty string is passed in the `version` argument, then the version will be initialized to a default value in the `OnChanOpenInit` callback of the controller's handler, so that channel handshake can proceed. + +The following code snippet illustrates how to construct an appropriate interchain accounts `Metadata` and encode it as a JSON bytestring: + +```go +icaMetadata := icatypes.Metadata{ + Version: icatypes.Version, + ControllerConnectionId: controllerConnectionID, + HostConnectionId: hostConnectionID, + Encoding: icatypes.EncodingProtobuf, + TxType: icatypes.TxTypeSDKMultiMsg, +} + +appVersion, err := icatypes.ModuleCdc.MarshalJSON(&icaMetadata) +if err != nil { + return err +} + +if err := keeper.icaControllerKeeper.RegisterInterchainAccount(ctx, controllerConnectionID, owner.String(), string(appVersion), channeltypes.UNORDERED); err != nil { + return err +} +``` + +Similarly, if the application stack is configured to route through ICS-29 fee middleware and a fee enabled channel is desired, construct the appropriate ICS-29 `Metadata` type: + +```go +icaMetadata := icatypes.Metadata{ + Version: icatypes.Version, + ControllerConnectionId: controllerConnectionID, + HostConnectionId: hostConnectionID, + Encoding: icatypes.EncodingProtobuf, + TxType: icatypes.TxTypeSDKMultiMsg, +} + +appVersion, err := icatypes.ModuleCdc.MarshalJSON(&icaMetadata) +if err != nil { + return err +} + +feeMetadata := feetypes.Metadata{ + AppVersion: string(appVersion), + FeeVersion: feetypes.Version, +} + +feeEnabledVersion, err := feetypes.ModuleCdc.MarshalJSON(&feeMetadata) +if err != nil { + return err +} + +if err := keeper.icaControllerKeeper.RegisterInterchainAccount(ctx, controllerConnectionID, owner.String(), string(feeEnabledVersion), channeltypes.UNORDERED); err != nil { + return err +} +``` + +## `SendTx` + +The authentication module can attempt to send a packet by calling `SendTx`: + +```go +// Authenticate owner +// perform custom logic + +// Construct controller portID based on interchain account owner address +portID, err := icatypes.NewControllerPortID(owner.String()) +if err != nil { + return err +} + +// Obtain data to be sent to the host chain. +// In this example, the owner of the interchain account would like to send a bank MsgSend to the host chain. +// The appropriate serialization function should be called. The host chain must be able to deserialize the transaction. +// If the host chain is using the ibc-go host module, `SerializeCosmosTx` should be used. +msg := &banktypes.MsgSend{FromAddress: fromAddr, ToAddress: toAddr, Amount: amt} +data, err := icatypes.SerializeCosmosTx(keeper.cdc, []proto.Message{msg}) +if err != nil { + return err +} + +// Construct packet data +packetData := icatypes.InterchainAccountPacketData{ + Type: icatypes.EXECUTE_TX, + Data: data, +} + +// Obtain timeout timestamp +// An appropriate timeout timestamp must be determined based on the usage of the interchain account. +// If the packet times out, the channel will be closed requiring a new channel to be created. +timeoutTimestamp := obtainTimeoutTimestamp() + +// Send the interchain accounts packet, returning the packet sequence +seq, err = keeper.icaControllerKeeper.SendTx(ctx, portID, packetData, timeoutTimestamp) +``` + +The data within an `InterchainAccountPacketData` must be serialized using a format supported by the host chain. +If the host chain is using the ibc-go host chain submodule, `SerializeCosmosTx` should be used. If the `InterchainAccountPacketData.Data` is serialized using a format not supported by the host chain, the packet will not be successfully received. diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/10-legacy/_category_.json b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/10-legacy/_category_.json new file mode 100644 index 00000000000..70500795bf8 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/10-legacy/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Legacy", + "position": 10, + "link": null +} diff --git a/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/10-legacy/images/ica-pre-v6.png b/docs/versioned_docs/version-v9.0.x/02-apps/02-interchain-accounts/10-legacy/images/ica-pre-v6.png new file mode 100644 index 0000000000000000000000000000000000000000..acd00d1294b3e1034b5d75b0969a42cc4b342917 GIT binary patch literal 34698 zcmc$G^;?x&)a|AeQ9`5yN$EyPIs^oyQ<0LEmhKV-q@+u_Hv%FcT~Y!9N=k#2bV*8l zbD!_If5Cn3bAM3J!Ts)c#awfaG3Ho?si{21#UaN*AP~3;@-i9-1p0OOMTd|={J0cWM_{{yvpt=Vc#ipWWbytcoq>r5Vh<@^y9iATBfiA2@5-#8kf(Iq>^A!v`^dk<`TNeqt;52xI_HIBJ@ z>N}1rHZ!U{I;ws6@2UjZa2UaZ8o)PfX4D^QSpOe?Lm=VhlCQ;+!9eIrZg^^}uD9 z<;K%8=^l>!RJKw5n}>$s$5#DMO57Im^o-}K-;?XEH~H*Hj1xJhvjFL5!KM0 zu+MQ;c(+&nDa0qrH{IPEA&?sG@|@8$P1ID^&?@Voh-KbmUGSy#Y}684avvS#(!8S) zN4GhwSS+nu_lHSLW7x_$T$IN%Nk3BH@aHlEW79VS`;Y`~r5GgD& zzAa*WYm7v1S|Gni(1{gw=W*|l8_}{+mEadLy4=5tf!3)3I~L%qsh zHM45VM02#V#G!hfo?=OS$kz5#VJ1158q4S9tAf$)xfy)R^&8_0XMVg!8w}0D(nYF> zP*v8d$myx}ecWX)^O>B<&lWTtlGqMrtCQ}D$hHVoXNGFiw&>kSG!5f-rU7H zvezjQ6_*;-Phz~XMy5U~@!Lw>Fo_@9D0%trmwbdqw3wRv`}OCpfBPqGPi7{2odjv= zhdv%}<@;GydVMa6FHzglIjio}ODia-Et_O4cnW6@9hk-b$F)91h?}AACJ@drjq<=c%;NeX1%66e5?G# zM(I}hTW)@xvOCQMD!zwYt$0O=1L3FV*Q#v}4{n)Vj8};lxFsV4KaNqAUuDb4GQ_OD zC!joZMXO4+@@%+nM7$g$lj@ogkLmEr!`n$=%C}hMcK#@4mY#qA=z#aa{%P!=Q?@_I z!x<;)O;;?Wpp$Ay-iCid@|LRaaZ=!MIJlBx?!#w8t z2JrK$aaBcoh*j6%Mxvpj7nGpP84JlxdF>{nkdjw--5;C~!7T3pJX zN_?QB-DUH-gY0lQ?Z#*6&+DBl<4h+bPc)zMBNJnpYWgZ)aI0k+l-m{!#OWd$n}fe> z6wZFUW-Q@Bthcv8d_7d5qalt}gcvPr^1^Sdjy!^Zwf@;Q)>LO@LgGpnffiO%h8#Z+ zA0&?`0hjuQR~tvSo7*z2-!@u*;{9EdiI2OdVzBW+XRbU$ zxvPril@n^^r6_^2%1QT~ch?)htLK7aE0P;SKhk?ow| zv;+ZClkVqCL|LnG)@=)4kGuh^A*@Q8psEMjOr(iVGU|w#>s1hlTAbK#$sG}LQVv

-X0lt-%*Y^>T_m~>6d~+yx&*Qo+&8Y7S|QQ1 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 Lt8i2_F8RWS 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�6fslqOEhRSQJK6rLluuhu+>zDy@VbCsxkb|NX~ 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 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 [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. + +For an example of a `VerifyClientMessage` implementation, please check the [Tendermint light client](https://github.com/cosmos/ibc-go/blob/76730ff030b52a351096ee941b7e4da44af9f059/modules/light-clients/07-tendermint/update.go#L23). + +## `CheckForMisbehaviour` + +Checks for evidence of a misbehaviour in `Header` or `Misbehaviour` type. It assumes the `ClientMessage` has already been verified. + +For an example of a `CheckForMisbehaviour` implementation, please check the [Tendermint light client](https://github.com/cosmos/ibc-go/blob/76730ff030b52a351096ee941b7e4da44af9f059/modules/light-clients/07-tendermint/misbehaviour_handle.go#L22). + +> The Tendermint light client [defines `Misbehaviour`](https://github.com/cosmos/ibc-go/blob/v7.0.0/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`. + +For an example of a `UpdateStateOnMisbehaviour` implementation, please check the [Tendermint light client](https://github.com/cosmos/ibc-go/blob/76730ff030b52a351096ee941b7e4da44af9f059/modules/light-clients/07-tendermint/update.go#L202). + +## `UpdateState` + +`UpdateState` updates and stores as necessary any associated information for an IBC client, such as the `ClientState` and corresponding `ConsensusState`. It should perform a no-op on duplicate updates. + +It assumes the `ClientMessage` has already been verified. + +For an example of a `UpdateState` implementation, please check the [Tendermint light client](https://github.com/cosmos/ibc-go/blob/76730ff030b52a351096ee941b7e4da44af9f059/modules/light-clients/07-tendermint/update.go#L134). + +## 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/v7.0.0/modules/core/02-client/keeper/client.go#L48). + +```go +clientModule, found := k.router.GetRoute(clientID) +if !found { + return errorsmod.Wrap(types.ErrRouteNotFound, clientID) +} + +if err := clientModule.VerifyClientMessage(ctx, clientID, clientMsg); err != nil { + return err +} + +foundMisbehaviour := clientModule.CheckForMisbehaviour(ctx, clientID, clientMsg) +if foundMisbehaviour { + clientModule.UpdateStateOnMisbehaviour(ctx, clientID, clientMsg) + // emit misbehaviour event + return +} + +clientModule.UpdateState(ctx, clientID, clientMsg) // expects no-op on duplicate header +// emit update event +return +``` diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/06-upgrades.md b/docs/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/06-upgrades.md new file mode 100644 index 00000000000..b0be176ac5a --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/06-upgrades.md @@ -0,0 +1,62 @@ +--- +title: Handling Upgrades +sidebar_label: Handling Upgrades +sidebar_position: 6 +slug: /ibc/light-clients/upgrades +--- + + +# 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. + +## Implementing `VerifyUpgradeAndUpdateState` + +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. +func (l LightClientModule) VerifyUpgradeAndUpdateState( + ctx sdk.Context, + clientID string, + newClient []byte, + newConsState []byte, + upgradeClientProof, + upgradeConsensusStateProof []byte, +) error +``` + +> Please refer to the [Tendermint light client implementation](https://github.com/cosmos/ibc-go/blob/47162061bcbfe74df791161059715a635e31c604/modules/light-clients/07-tendermint/light_client_module.go#L257) as an example for implementation. + +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 `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. + +### Upgrade path + +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. + +## 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). + +When upgrading a client, 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. + +## 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. + +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 `MsgUpgradeClient` cannot alter the client-chosen parameters that the users are relying upon (examples in Tendermint client include `TrustLevel`, `MaxClockDrift`, etc). + +### 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/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/07-proofs.md b/docs/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/07-proofs.md new file mode 100644 index 00000000000..67663baff32 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/07-proofs.md @@ -0,0 +1,71 @@ +--- +title: Existence/Non-Existence Proofs +sidebar_label: Existence/Non-Existence Proofs +sidebar_position: 7 +slug: /ibc/light-clients/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 [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 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". + +## 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 is comprised 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 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 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` + +The state verification functions for all IBC data types have been consolidated into two generic methods, `VerifyMembership` and `VerifyNonMembership`. + +From the [`LightClientModule` interface definition](https://github.com/cosmos/ibc-go/blob/main/modules/core/exported/client.go#L56), we find: + +```go +// VerifyMembership is a generic proof verification method which verifies +// a proof of the existence of a value at a given CommitmentPath at the +// specified height. The caller is expected to construct the full CommitmentPath +// from a CommitmentPrefix and a standardized path (as defined in ICS 24). +VerifyMembership( + ctx sdk.Context, + clientID string, + 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/v7.0.0/modules/core/23-commitment/types/merkle.go#L131-L205) for a concrete example. diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/08-proposals.md b/docs/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/08-proposals.md new file mode 100644 index 00000000000..1015901ba73 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/08-proposals.md @@ -0,0 +1,36 @@ +--- +title: Handling Proposals +sidebar_label: Handling Proposals +sidebar_position: 8 +slug: /ibc/light-clients/proposals +--- + + +# 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](../../01-ibc/07-proposals.md) 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. `RecoverClient` should be implemented to handle the proposal. + +## Implementing `RecoverClient` + +In the [`LightClientModule` interface](https://github.com/cosmos/ibc-go/blob/501a8462345da099144efe91d495bfcfa18d760d/modules/core/exported/client.go#L51), we find: + +```go +// RecoverClient 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. +RecoverClient( + ctx sdk.Context, + clientID, + substituteClientID string, +) 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/47162061bcbfe74df791161059715a635e31c604/modules/light-clients/07-tendermint/proposal_handle.go#L34). +- 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/47162061bcbfe74df791161059715a635e31c604/modules/light-clients/07-tendermint/proposal_handle.go#L86) 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/v7.0.0/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/47162061bcbfe74df791161059715a635e31c604/modules/light-clients/07-tendermint/proposal_handle.go#L79) for reference. diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/09-setup.md b/docs/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/09-setup.md new file mode 100644 index 00000000000..23ced3cf80a --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/09-setup.md @@ -0,0 +1,135 @@ +--- +title: Setup +sidebar_label: Setup +sidebar_position: 9 +slug: /ibc/light-clients/setup +--- + + +# Setup + +:::note Synopsis +Learn how to configure light client modules and create clients using core IBC and the `02-client` submodule. +::: + +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 `InterfaceRegistry`. Please refer to the [`07-tendermint` codec registration](https://github.com/cosmos/ibc-go/blob/v7.0.0/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. + +Please refer to the [core IBC documentation](../../01-ibc/02-integration.md#integrating-light-clients) for how to configure additional light client modules alongside `07-tendermint` in `app.go`. + +See below for an example of the `07-tendermint` implementation of `AppModuleBasic`. + +```go +var _ module.AppModuleBasic = AppModuleBasic{} + +// AppModuleBasic defines the basic application module used by the tendermint light client. +// Only the RegisterInterfaces function needs to be implemented. All other function perform +// a no-op. +type AppModuleBasic struct{} + +// Name returns the tendermint module name. +func (AppModuleBasic) Name() string { + return ModuleName +} + +// RegisterLegacyAminoCodec performs a no-op. The Tendermint client does not support amino. +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) +} + +// DefaultGenesis performs a no-op. Genesis is not supported for the tendermint light client. +func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { + return nil +} + +// ValidateGenesis performs a no-op. Genesis is not supported for the tendermint light client. +func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config client.TxEncodingConfig, bz json.RawMessage) error { + return nil +} + +// RegisterGRPCGatewayRoutes performs a no-op. +func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) {} + +// GetTxCmd performs a no-op. Please see the 02-client cli commands. +func (AppModuleBasic) GetTxCmd() *cobra.Command { + return nil +} + +// GetQueryCmd performs a no-op. Please see the 02-client cli commands. +func (AppModuleBasic) GetQueryCmd() *cobra.Command { + 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 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: + +- [cosmos/relayer](https://github.com/cosmos/relayer) +- [informalsystems/hermes](https://github.com/informalsystems/hermes) +- [confio/ts-relayer](https://github.com/confio/ts-relayer) + +Stateless checks are performed within the [`ValidateBasic`](https://github.com/cosmos/ibc-go/blob/v7.0.0/modules/core/02-client/types/msgs.go#L48) method of `MsgCreateClient`. + +```protobuf +// MsgCreateClient defines a message to create an IBC client +message MsgCreateClient { + option (gogoproto.goproto_getters) = false; + + // light client state + google.protobuf.Any client_state = 1 [(gogoproto.moretags) = "yaml:\"client_state\""]; + // consensus state associated with the client that corresponds to a given + // height. + google.protobuf.Any consensus_state = 2 [(gogoproto.moretags) = "yaml:\"consensus_state\""]; + // signer address + string signer = 3; +} +``` + +Leveraging protobuf `Any` encoding allows core IBC to [unpack](https://github.com/cosmos/ibc-go/blob/47162061bcbfe74df791161059715a635e31c604/modules/core/keeper/msg_server.go#L38) the `ClientState` into its respective interface type registered previously using the light client module's `RegisterInterfaces` method. + +Within the `02-client` submodule, the [`ClientState` is then initialized](https://github.com/cosmos/ibc-go/blob/47162061bcbfe74df791161059715a635e31c604/modules/core/02-client/keeper/client.go#L40-L42) 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/v7.0.0/modules/core/02-client/keeper/client.go#L19-L25). 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 --from +``` + +where `proposal.json` contains: + +```json +{ + "title": "IBC Clients Param Change", + "summary": "Update allowed clients", + "messages": [ + { + "@type": "/ibc.core.client.v1.MsgUpdateParams", + "signer": "cosmos1...", // The gov module account address + "params": { + "allowed_clients": ["06-solomachine", "07-tendermint", "0x-new-client"] + } + } + ], + "metadata": "AQ==", + "deposit": "100stake" +} +``` + +If the `AllowedClients` list contains a single element that is equal to the wildcard `"*"`, then all client types are allowed and it is thus not necessary to submit a governance proposal to update the parameter. diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/_category_.json b/docs/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/_category_.json new file mode 100644 index 00000000000..9be9c3c3a08 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/01-developer-guide/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Developer Guide", + "position": 1, + "link": null +} \ No newline at end of file diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/02-localhost/01-overview.md b/docs/versioned_docs/version-v9.0.x/03-light-clients/02-localhost/01-overview.md new file mode 100644 index 00000000000..c6754004097 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/02-localhost/01-overview.md @@ -0,0 +1,56 @@ +--- +title: Overview +sidebar_label: Overview +sidebar_position: 1 +slug: /ibc/light-clients/localhost/overview +--- + + +# `09-localhost` + +## Overview + +:::note Synopsis +Learn about the 09-localhost light client module. +::: + +The 09-localhost light client module implements a stateless 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 localhost light client module which can be invoked with the client identifier `09-localhost`. The light +client is stateless, so the `ClientState` is constructed on demand when required. + +To supplement this, a [sentinel `ConnectionEnd` is stored in core IBC](04-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](05-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) | Implicitly made available by the 02-client submodule in core IBC | +| Client updates | Relayer submits headers using `MsgUpdateClient` | No client updates are required as the localhost implementation is stateless | +| 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 | +| `ClientState` storage | `ClientState` stored and directly provable with `VerifyMembership` | Stateless, so `ClientState` is not provable directly with `VerifyMembership` | diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/02-localhost/02-integration.md b/docs/versioned_docs/version-v9.0.x/03-light-clients/02-localhost/02-integration.md new file mode 100644 index 00000000000..e1fc491a332 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/02-localhost/02-integration.md @@ -0,0 +1,19 @@ +--- +title: Integration +sidebar_label: Integration +sidebar_position: 2 +slug: /ibc/light-clients/localhost/integration +--- + + +# 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 implicitly enabled by using the `AllowAllClients` wildcard (`"*"`) in the 02-client submodule default value for param [`allowed_clients`](https://github.com/cosmos/ibc-go/blob/v7.0.0/proto/ibc/core/client/v1/client.proto#L102). + +```go +// DefaultAllowedClients are the default clients for the AllowedClients parameter. +// By default it allows all client types. +var DefaultAllowedClients = []string{AllowAllClients} +``` diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/02-localhost/03-client-state.md b/docs/versioned_docs/version-v9.0.x/03-light-clients/02-localhost/03-client-state.md new file mode 100644 index 00000000000..3cbdf05442a --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/02-localhost/03-client-state.md @@ -0,0 +1,10 @@ +--- +title: ClientState +sidebar_label: ClientState +sidebar_position: 3 +slug: /ibc/light-clients/localhost/client-state +--- + +# `ClientState` + +The 09-localhost client is stateless and has no types. diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/02-localhost/04-connection.md b/docs/versioned_docs/version-v9.0.x/03-light-clients/02-localhost/04-connection.md new file mode 100644 index 00000000000..160c814d229 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/02-localhost/04-connection.md @@ -0,0 +1,29 @@ +--- +title: Connection +sidebar_label: Connection +sidebar_position: 4 +slug: /ibc/light-clients/localhost/connection +--- + + +# 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.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/versioned_docs/version-v9.0.x/03-light-clients/02-localhost/05-state-verification.md b/docs/versioned_docs/version-v9.0.x/03-light-clients/02-localhost/05-state-verification.md new file mode 100644 index 00000000000..82d10d6ff40 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/02-localhost/05-state-verification.md @@ -0,0 +1,23 @@ +--- +title: State Verification +sidebar_label: State Verification +sidebar_position: 5 +slug: /ibc/light-clients/localhost/state-verification +--- + +# State verification + +The localhost client handles state verification through the `LightClientModule` 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 sentinel proof value is not provided. + +```go +var SentinelProof = []byte{0x01} +``` + +The `ClientState` of `09-localhost` is stateless, so it is not directly provable with `VerifyMembership` or `VerifyNonMembership`. diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/02-localhost/_category_.json b/docs/versioned_docs/version-v9.0.x/03-light-clients/02-localhost/_category_.json new file mode 100644 index 00000000000..0dc062d29e6 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/02-localhost/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Localhost", + "position": 2, + "link": null +} \ No newline at end of file diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/03-solomachine/01-solomachine.md b/docs/versioned_docs/version-v9.0.x/03-light-clients/03-solomachine/01-solomachine.md new file mode 100644 index 00000000000..394e5ec6efb --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/03-solomachine/01-solomachine.md @@ -0,0 +1,26 @@ +--- +title: Solomachine +sidebar_label: Solomachine +sidebar_position: 1 +slug: /ibc/light-clients/solomachine/solomachine +--- + + +# `solomachine` + +## Abstract + +This paper defines the implementation of the ICS06 protocol on the Cosmos SDK. For the general +specification please refer to the [ICS06 Specification](https://github.com/cosmos/ibc/tree/master/spec/client/ics-006-solo-machine-client). + +This implementation of a solo machine light client supports single and multi-signature public +keys. The client is capable of handling public key updates by header and governance proposals. +The light client is capable of processing client misbehaviour. Proofs of the counterparty state +are generated by the solo machine client by signing over the desired state with a certain sequence, +diversifier, and timestamp. + +## Contents + +1. **[Concepts](02-concepts.md)** +2. **[State](03-state.md)** +3. **[State Transitions](04-state_transitions.md)** diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/03-solomachine/02-concepts.md b/docs/versioned_docs/version-v9.0.x/03-light-clients/03-solomachine/02-concepts.md new file mode 100644 index 00000000000..270dab232a6 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/03-solomachine/02-concepts.md @@ -0,0 +1,168 @@ +--- +title: Concepts +sidebar_label: Concepts +sidebar_position: 2 +slug: /ibc/light-clients/solomachine/concepts +--- + + +# Concepts + +## Client State + +The `ClientState` for a solo machine light client stores the latest sequence, the frozen sequence, +the latest consensus state, and client flag indicating if the client should be allowed to be updated +after a governance proposal. + +If the client is not frozen then the frozen sequence is 0. + +## Consensus State + +The consensus states stores the public key, diversifier, and timestamp of the solo machine light client. + +The diversifier is used to prevent accidental misbehaviour if the same public key is used across +different chains with the same client identifier. It should be unique to the chain the light client +is used on. + +## Public Key + +The public key can be a single public key or a multi-signature public key. The public key type used +must fulfill the tendermint public key interface (this will become the SDK public key interface in the +near future). The public key must be registered on the application codec otherwise encoding/decoding +errors will arise. The public key stored in the consensus state is represented as a protobuf `Any`. +This allows for flexibility in what other public key types can be supported in the future. + +## Counterparty Verification + +The solo machine light client can verify counterparty client state, consensus state, connection state, +channel state, packet commitments, packet acknowledgements, packet receipt absence, +and the next sequence receive. At the end of each successful verification call the light +client sequence number will be incremented. + +Successful verification requires the current public key to sign over the proof. + +## Proofs + +A solo machine proof should verify that the solomachine public key signed +over some specified data. The format for generating marshaled proofs for +the SDK's implementation of solo machine is as follows: + +1. Construct the data using the associated protobuf definition and marshal it. + +For example: + +```go +data := &ClientStateData{ + Path: []byte(path.String()), + ClientState: protoAny, +} + +dataBz, err := cdc.Marshal(data) +``` + +The helper functions `...DataBytes()` in [proof.go](https://github.com/cosmos/ibc-go/blob/main/modules/light-clients/06-solomachine/proof.go) handle this +functionality. + +2. Construct the `SignBytes` and marshal it. + +For example: + +```go +signBytes := &SignBytes{ + Sequence: sequence, + Timestamp: timestamp, + Diversifier: diversifier, + DataType: CLIENT, + Data: dataBz, +} + +signBz, err := cdc.Marshal(signBytes) +``` + +The helper functions `...SignBytes()` in [proof.go](https://github.com/cosmos/ibc-go/blob/main/modules/light-clients/06-solomachine/proof.go) handle this functionality. +The `DataType` field is used to disambiguate what type of data was signed to prevent potential +proto encoding overlap. + +3. Sign the sign bytes. Embed the signatures into either `SingleSignatureData` or `MultiSignatureData`. +Convert the `SignatureData` to proto and marshal it. + +For example: + +```go +sig, err := key.Sign(signBz) +sigData := &signing.SingleSignatureData{ + Signature: sig, +} + +protoSigData := signing.SignatureDataToProto(sigData) +bz, err := cdc.Marshal(protoSigData) +``` + +4. Construct a `TimestampedSignatureData` and marshal it. The marshaled result can be passed in +as the proof parameter to the verification functions. + +For example: + +```go +timestampedSignatureData := &solomachine.TimestampedSignatureData{ + SignatureData: sigData, + Timestamp: solomachine.Time, +} + +proof, err := cdc.Marshal(timestampedSignatureData) +``` + +NOTE: At the end of this process, the sequence associated with the key needs to be updated. +The sequence must be incremented each time proof is generated. + +## Updates By Header + +An update by a header will only succeed if: + +- the header provided is parseable to solo machine header +- the header sequence matches the current sequence +- the header timestamp is greater than or equal to the consensus state timestamp +- the currently registered public key generated the proof + +If the update is successful: + +- the public key is updated +- the diversifier is updated +- the timestamp is updated +- the sequence is incremented by 1 +- the new consensus state is set in the client state + +## Updates By Proposal + +An update by a governance proposal will only succeed if: + +- the substitute provided is parseable to solo machine client state +- the new consensus state public key does not equal the current consensus state public key + +If the update is successful: + +- the subject client state is updated to the substitute client state +- the subject consensus state is updated to the substitute consensus state +- the client is unfrozen (if it was previously frozen) + +NOTE: Previously, `AllowUpdateAfterProposal` was used to signal the update/recovery options for the solo machine client. However, this has now been deprecated because a code migration can overwrite the client and consensus states regardless of the value of this parameter. If governance would vote to overwrite a client or consensus state, it is likely that governance would also be willing to perform a code migration to do the same. + +## Misbehaviour + +Misbehaviour handling will only succeed if: + +- the misbehaviour provided is parseable to solo machine misbehaviour +- the client is not already frozen +- the current public key signed over two unique data messages at the same sequence and diversifier. + +If the misbehaviour is successfully processed: + +- the client is frozen by setting the frozen sequence to the misbehaviour sequence + +NOTE: Misbehaviour processing is data processing order dependent. A misbehaving solo machine +could update to a new public key to prevent being frozen before misbehaviour is submitted. + +## Upgrades + +Upgrades to solo machine light clients are not supported since an entirely different type of +public key can be set using normal client updates. diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/03-solomachine/03-state.md b/docs/versioned_docs/version-v9.0.x/03-light-clients/03-solomachine/03-state.md new file mode 100644 index 00000000000..90d017473c3 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/03-solomachine/03-state.md @@ -0,0 +1,12 @@ +--- +title: State +sidebar_label: State +sidebar_position: 3 +slug: /ibc/light-clients/solomachine/state +--- + + +# State + +The solo machine light client will only store consensus states for each update by a header +or a governance proposal. The latest client state is also maintained in the store. diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/03-solomachine/04-state_transitions.md b/docs/versioned_docs/version-v9.0.x/03-light-clients/03-solomachine/04-state_transitions.md new file mode 100644 index 00000000000..22a456fcc0e --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/03-solomachine/04-state_transitions.md @@ -0,0 +1,43 @@ +--- +title: State Transitions +sidebar_label: State Transitions +sidebar_position: 4 +slug: /ibc/light-clients/solomachine/state_transitions +--- + + +# State Transitions + +## Client State Verification Functions + +Successful state verification by a solo machine light client will result in: + +- the sequence being incremented by 1. + +## Update By Header + +A successful update of a solo machine light client by a header will result in: + +- the public key being updated to the new public key provided by the header. +- the diversifier being updated to the new diviersifier provided by the header. +- the timestamp being updated to the new timestamp provided by the header. +- the sequence being incremented by 1 +- the consensus state being updated (consensus state stores the public key, diversifier, and timestamp) + +## Update By Governance Proposal + +A successful update of a solo machine light client by a governance proposal will result in: + +- the client state being updated to the substitute client state +- the consensus state being updated to the substitute consensus state (consensus state stores the public key, diversifier, and timestamp) +- the frozen sequence being set to zero (client is unfrozen if it was previously frozen). + +## Upgrade + +Client udgrades are not supported for the solo machine light client. No state transition occurs. + +## Misbehaviour + +Successful misbehaviour processing of a solo machine light client will result in: + +- the frozen sequence being set to the sequence the misbehaviour occurred at diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/03-solomachine/_category_.json b/docs/versioned_docs/version-v9.0.x/03-light-clients/03-solomachine/_category_.json new file mode 100644 index 00000000000..de0a6927408 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/03-solomachine/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Solomachine", + "position": 3, + "link": null +} \ No newline at end of file diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/01-overview.md b/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/01-overview.md new file mode 100644 index 00000000000..a41f15e6793 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/01-overview.md @@ -0,0 +1,26 @@ +--- +title: Overview +sidebar_label: Overview +sidebar_position: 1 +slug: /ibc/light-clients/wasm/overview +--- + +# `08-wasm` + +## Overview + +Learn about the `08-wasm` light client proxy module. + +### Context + +Traditionally, light clients used by ibc-go have been implemented only in Go, and since ibc-go v7 (with the release of the 02-client refactor), they are [first-class Cosmos SDK modules](/architecture/adr-010-light-clients-as-sdk-modules). This means that updating existing light client implementations or adding support for new light clients is a multi-step, time-consuming process involving on-chain governance: it is necessary to modify the codebase of ibc-go (if the light client is part of its codebase), re-build chains' binaries, pass a governance proposal and have validators upgrade their nodes. + +### Motivation + +To break the limitation of being able to write light client implementations only in Go, the `08-wasm` adds support to run light clients written in a Wasm-compilable language. The light client byte code implements the entry points of a [CosmWasm](https://docs.cosmwasm.com/docs/) smart contract, and runs inside a Wasm VM. The `08-wasm` module exposes a proxy light client interface that routes incoming messages to the appropriate handler function, inside the Wasm VM, for execution. + +Adding a new light client to a chain is just as simple as submitting a governance proposal with the message that stores the byte code of the light client contract. No coordinated upgrade is needed. When the governance proposal passes and the message is executed, the contract is ready to be instantiated upon receiving a relayer-submitted `MsgCreateClient`. The process of creating a Wasm light client is the same as with a regular light client implemented in Go. + +### Use cases + +- Development of light clients for non-Cosmos ecosystem chains: state machines in other ecosystems are, in many cases, implemented in Rust, and thus there are probably libraries used in their light client implementations for which there is no equivalent in Go. This makes the development of a light client in Go very difficult, but relatively simple to do it in Rust. Therefore, writing a CosmWasm smart contract in Rust that implements the light client algorithm becomes a lower effort. diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/02-concepts.md b/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/02-concepts.md new file mode 100644 index 00000000000..978b77d3c73 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/02-concepts.md @@ -0,0 +1,90 @@ +--- +title: Concepts +sidebar_label: Concepts +sidebar_position: 2 +slug: /ibc/light-clients/wasm/concepts +--- + +# Concepts + +Learn about the differences between a proxy light client and a Wasm light client. + +## Proxy light client + +The `08-wasm` module is not a regular light client in the same sense as, for example, the 07-tendermint light client. `08-wasm` is instead a *proxy* light client module, and this means that the module acts a proxy to the actual implementations of light clients. The module will act as a wrapper for the actual light clients uploaded as Wasm byte code and will delegate all operations to them (i.e. `08-wasm` just passes through the requests to the Wasm light clients). Still, the `08-wasm` module implements all the required interfaces necessary to integrate with core IBC, so that 02-client can call into it as it would for any other light client module. These interfaces are `LightClientModule`, `ClientState`, `ConsensusState` and `ClientMessage`, and we will describe them in the context of `08-wasm` in the following sections. For more information about this set of interfaces, please read section [Overview of the light client module developer guide](../01-developer-guide/01-overview.md#overview). + +### `LightClientModule` + +The `08-wasm`'s `LightClientModule` data structure contains two fields: + +- `keeper` is the `08-wasm` module keeper. +- `storeProvider` encapsulates the IBC core store key and provides access to isolated prefix stores for each client so they can read/write in separate namespaces. + +```go +type LightClientModule struct { + keeper wasmkeeper.Keeper + storeProvider exported.ClientStoreProvider +} +``` + +See section [`LightClientModule` of the light client module developer guide](../01-developer-guide/01-overview.md#lightclientmodule) for more information about the `LightClientModule` interface. + +### `ClientState` + +The `08-wasm`'s `ClientState` data structure contains three fields: + +- `Data` contains the bytes of the Protobuf-encoded client state of the underlying light client implemented as a Wasm contract. For example, if the Wasm light client contract implements the GRANDPA light client algorithm, then `Data` will contain the bytes for a [GRANDPA client state](https://github.com/ComposableFi/composable-ibc/blob/02ce69e2843e7986febdcf795f69a757ce569272/light-clients/ics10-grandpa/src/proto/grandpa.proto#L35-L60). +- `Checksum` is the sha256 hash of the Wasm contract's byte code. This hash is used as an identifier to call the right contract. +- `LatestHeight` is the latest height of the counterparty state machine (i.e. the height of the blockchain), whose consensus state the light client tracks. + +```go +type ClientState struct { + // bytes encoding the client state of the underlying + // light client implemented as a Wasm contract + Data []byte + // sha256 hash of Wasm contract byte code + Checksum []byte + // latest height of the counterparty ledger + LatestHeight types.Height +} +``` + +See section [`ClientState` of the light client module developer guide](../01-developer-guide/01-overview.md#clientstate) for more information about the `ClientState` interface. + +### `ConsensusState` + +The `08-wasm`'s `ConsensusState` data structure maintains one field: + +- `Data` contains the bytes of the Protobuf-encoded consensus state of the underlying light client implemented as a Wasm contract. For example, if the Wasm light client contract implements the GRANDPA light client algorithm, then `Data` will contain the bytes for a [GRANDPA consensus state](https://github.com/ComposableFi/composable-ibc/blob/02ce69e2843e7986febdcf795f69a757ce569272/light-clients/ics10-grandpa/src/proto/grandpa.proto#L87-L94). + +```go +type ConsensusState struct { + // bytes encoding the consensus state of the underlying light client + // implemented as a Wasm contract. + Data []byte +} +``` + +See section [`ConsensusState` of the light client module developer guide](../01-developer-guide/01-overview.md#consensusstate) for more information about the `ConsensusState` interface. + +### `ClientMessage` + +`ClientMessage` is used for performing updates to a `ClientState` stored on chain. The `08-wasm`'s `ClientMessage` data structure maintains one field: + +- `Data` contains the bytes of the Protobuf-encoded header(s) or misbehaviour for the underlying light client implemented as a Wasm contract. For example, if the Wasm light client contract implements the GRANDPA light client algorithm, then `Data` will contain the bytes of either [header](https://github.com/ComposableFi/composable-ibc/blob/02ce69e2843e7986febdcf795f69a757ce569272/light-clients/ics10-grandpa/src/proto/grandpa.proto#L96-L104) or [misbehaviour](https://github.com/ComposableFi/composable-ibc/blob/02ce69e2843e7986febdcf795f69a757ce569272/light-clients/ics10-grandpa/src/proto/grandpa.proto#L106-L112) for a GRANDPA light client. + +```go +type ClientMessage struct { + // bytes encoding the header(s) or misbehaviour for the underlying light client + // implemented as a Wasm contract. + Data []byte +} +``` + +See section [`ClientMessage` of the light client module developer guide](../01-developer-guide/01-overview.md#clientmessage) for more information about the `ClientMessage` interface. + +## Wasm light client + +The actual light client can be implemented in any language that compiles to Wasm and implements the interfaces of a [CosmWasm](https://docs.cosmwasm.com/docs/) contract. Even though in theory other languages could be used, in practice (at least for the time being) the most suitable language to use would be Rust, since there is already good support for it for developing CosmWasm smart contracts. + +At the moment of writing there are two contracts available: one for [Tendermint](https://github.com/ComposableFi/composable-ibc/tree/master/light-clients/ics07-tendermint-cw) and one [GRANDPA](https://github.com/ComposableFi/composable-ibc/tree/master/light-clients/ics10-grandpa-cw) (which is being used in production in [Composable Finance's Centauri bridge](https://github.com/ComposableFi/composable-ibc)). And there are others in development (e.g. for Near). diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/03-integration.md b/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/03-integration.md new file mode 100644 index 00000000000..e005cd5ae4c --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/03-integration.md @@ -0,0 +1,405 @@ +--- +title: Integration +sidebar_label: Integration +sidebar_position: 3 +slug: /ibc/light-clients/wasm/integration +--- + +# Integration + +Learn how to integrate the `08-wasm` module in a chain binary and about the recommended approaches depending on whether the [`x/wasm` module](https://github.com/CosmWasm/wasmd/tree/main/x/wasm) is already used in the chain. The following document only applies for Cosmos SDK chains. + +## Importing the `08-wasm` module + +`08-wasm` has no stable releases yet. To use it, you need to import the git commit that contains the module with the compatible versions of `ibc-go` and `wasmvm`. To do so, run the following command with the desired git commit in your project: + +```sh +go get github.com/cosmos/ibc-go/modules/light-clients/08-wasm@7ee2a2452b79d0bc8316dc622a1243afa058e8cb +``` + +The following table shows the compatibility matrix between the `08-wasm` module, `ibc-go`, and `wasmvm`. + +| **Version** | **Git commit to import** | +|:--------------------------------:|:----------------------------------------:| +| `v0.4.1+ibc-go-v8.4-wasmvm-v2.0` | ccd4dc278e720be87418028026ebd93a80fa5ac0 | +| `v0.3.1+ibc-go-v7.4-wasmvm-v1.5` | 13c071f0b34d67342f0b7a8874d84d2e68b887e1 | + +## `app.go` setup + +The sample code below shows the relevant integration points in `app.go` required to set up the `08-wasm` module in a chain binary. Since `08-wasm` is a light client module itself, please check out as well the section [Integrating light clients](../../01-ibc/02-integration.md#integrating-light-clients) for more information: + +```go +// app.go +import ( + ... + "github.com/cosmos/cosmos-sdk/runtime" + + cmtos "github.com/cometbft/cometbft/libs/os" + + ibcwasm "github.com/cosmos/ibc-go/modules/light-clients/08-wasm" + ibcwasmkeeper "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/keeper" + ibcwasmtypes "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/types" + ... +) + +... + +// Register the AppModule for the 08-wasm module +ModuleBasics = module.NewBasicManager( + ... + ibcwasm.AppModuleBasic{}, + ... +) + +// Add 08-wasm Keeper +type SimApp struct { + ... + WasmClientKeeper ibcwasmkeeper.Keeper + ... +} + +func NewSimApp( + logger log.Logger, + db dbm.DB, + traceStore io.Writer, + loadLatest bool, + appOpts servertypes.AppOptions, + baseAppOptions ...func(*baseapp.BaseApp), +) *SimApp { + ... + keys := sdk.NewKVStoreKeys( + ... + ibcwasmtypes.StoreKey, + ) + + // Instantiate 08-wasm's keeper + // This sample code uses a constructor function that + // accepts a pointer to an existing instance of Wasm VM. + // This is the recommended approach when the chain + // also uses `x/wasm`, and then the Wasm VM instance + // can be shared. + app.WasmClientKeeper = ibcwasmkeeper.NewKeeperWithVM( + appCodec, + runtime.NewKVStoreService(keys[ibcwasmtypes.StoreKey]), + app.IBCKeeper.ClientKeeper, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + wasmVM, + app.GRPCQueryRouter(), + ) + + wasmLightClientModule := wasm.NewLightClientModule(app.WasmClientKeeper) + app.IBCKeeper.ClientKeeper.AddRoute(ibcwasmtypes.ModuleName, &wasmLightClientModule) + + app.ModuleManager = module.NewManager( + // SDK app modules + ... + ibcwasm.NewAppModule(app.WasmClientKeeper), + ) + app.ModuleManager.SetOrderBeginBlockers( + ... + ibcwasmtypes.ModuleName, + ... + ) + app.ModuleManager.SetOrderEndBlockers( + ... + ibcwasmtypes.ModuleName, + ... + ) + genesisModuleOrder := []string{ + ... + ibcwasmtypes.ModuleName, + ... + } + app.ModuleManager.SetOrderInitGenesis(genesisModuleOrder...) + app.ModuleManager.SetOrderExportGenesis(genesisModuleOrder...) + ... + + // initialize BaseApp + app.SetInitChainer(app.InitChainer) + ... + + // must be before Loading version + if manager := app.SnapshotManager(); manager != nil { + err := manager.RegisterExtensions( + ibcwasmkeeper.NewWasmSnapshotter(app.CommitMultiStore(), &app.WasmClientKeeper), + ) + if err != nil { + panic(fmt.Errorf("failed to register snapshot extension: %s", err)) + } + } + ... + + if loadLatest { + ... + + ctx := app.BaseApp.NewUncachedContext(true, cmtproto.Header{}) + + // Initialize pinned codes in wasmvm as they are not persisted there + if err := app.WasmClientKeeper.InitializePinnedCodes(ctx); err != nil { + cmtos.Exit(fmt.Sprintf("failed initialize pinned codes %s", err)) + } + } +} +``` + +## Keeper instantiation + +When it comes to instantiating `08-wasm`'s keeper, there are two recommended ways of doing it. Choosing one or the other will depend on whether the chain already integrates [`x/wasm`](https://github.com/CosmWasm/wasmd/tree/main/x/wasm) or not. + +### If `x/wasm` is present + +If the chain where the module is integrated uses `x/wasm` then we recommend that both `08-wasm` and `x/wasm` share the same Wasm VM instance. Having two separate Wasm VM instances is still possible, but care should be taken to make sure that both instances do not share the directory when the VM stores blobs and various caches, otherwise unexpected behaviour is likely to happen (from `x/wasm` v0.51 and `08-wasm` v0.2.0+ibc-go-v8.3-wasmvm-v2.0 this will be forbidden anyway, since wasmvm v2.0.0 and above will not allow two different Wasm VM instances to shared the same data folder). + +In order to share the Wasm VM instance, please follow the guideline below. Please note that this requires `x/wasm` v0.41 or above. + +- Instantiate the Wasm VM in `app.go` with the parameters of your choice. +- [Create an `Option` with this Wasm VM instance](https://github.com/CosmWasm/wasmd/blob/db93d7b6c7bb6f4a340d74b96a02cec885729b59/x/wasm/keeper/options.go#L21-L25). +- Add the option created in the previous step to a slice and [pass it to the `x/wasm NewKeeper` constructor function](https://github.com/CosmWasm/wasmd/blob/db93d7b6c7bb6f4a340d74b96a02cec885729b59/x/wasm/keeper/keeper_cgo.go#L36). +- Pass the pointer to the Wasm VM instance to `08-wasm` [`NewKeeperWithVM` constructor function](https://github.com/cosmos/ibc-go/blob/57fcdb9a9a9db9b206f7df2f955866dc4e10fef4/modules/light-clients/08-wasm/keeper/keeper.go#L39-L47). + +The code to set this up would look something like this: + +```go +// app.go +import ( + ... + "github.com/cosmos/cosmos-sdk/runtime" + + wasmvm "github.com/CosmWasm/wasmvm/v2" + wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" + wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" + + ibcwasmkeeper "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/keeper" + ibcwasmtypes "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/types" + ... +) + +... + +// instantiate the Wasm VM with the chosen parameters +wasmer, err := wasmvm.NewVM( + dataDir, + availableCapabilities, + contractMemoryLimit, // default of 32 + contractDebugMode, + memoryCacheSize, +) +if err != nil { + panic(err) +} + +// create an Option slice (or append to an existing one) +// with the option to use a custom Wasm VM instance +wasmOpts = []wasmkeeper.Option{ + wasmkeeper.WithWasmEngine(wasmer), +} + +// the keeper will use the provided Wasm VM instance, +// instead of instantiating a new one +app.WasmKeeper = wasmkeeper.NewKeeper( + appCodec, + keys[wasmtypes.StoreKey], + app.AccountKeeper, + app.BankKeeper, + app.StakingKeeper, + distrkeeper.NewQuerier(app.DistrKeeper), + app.IBCFeeKeeper, // ISC4 Wrapper: fee IBC middleware + app.IBCKeeper.ChannelKeeper, + &app.IBCKeeper.PortKeeper, + scopedWasmKeeper, + app.TransferKeeper, + app.MsgServiceRouter(), + app.GRPCQueryRouter(), + wasmDir, + wasmConfig, + availableCapabilities, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + wasmOpts..., +) + +app.WasmClientKeeper = ibcwasmkeeper.NewKeeperWithVM( + appCodec, + runtime.NewKVStoreService(keys[ibcwasmtypes.StoreKey]), + app.IBCKeeper.ClientKeeper, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + wasmer, // pass the Wasm VM instance to `08-wasm` keeper constructor + app.GRPCQueryRouter(), +) +... +``` + +### If `x/wasm` is not present + +If the chain does not use [`x/wasm`](https://github.com/CosmWasm/wasmd/tree/main/x/wasm), even though it is still possible to use the method above from the previous section +(e.g. instantiating a Wasm VM in app.go an pass it to 08-wasm's [`NewKeeperWithVM` constructor function](https://github.com/cosmos/ibc-go/blob/57fcdb9a9a9db9b206f7df2f955866dc4e10fef4/modules/light-clients/08-wasm/keeper/keeper.go#L39-L47), since there would be no need in this case to share the Wasm VM instance with another module, you can use the [`NewKeeperWithConfig` constructor function](https://github.com/cosmos/ibc-go/blob/57fcdb9a9a9db9b206f7df2f955866dc4e10fef4/modules/light-clients/08-wasm/keeper/keeper.go#L88-L96) and provide the Wasm VM configuration parameters of your choice instead. A Wasm VM instance will be created in `NewKeeperWithConfig`. The parameters that can set are: + +- `DataDir` is the [directory for Wasm blobs and various caches](https://github.com/CosmWasm/wasmvm/blob/v2.0.0/lib.go#L25). As an example, in `wasmd` this is set to the [`wasm` folder under the home directory](https://github.com/CosmWasm/wasmd/blob/36416def20effe47fb77f29f5ba35a003970fdba/app/app.go#L578). In the code snippet below we set this field to the `ibc_08-wasm_client_data` folder under the home directory. +- `SupportedCapabilities` is a [list of capabilities supported by the chain](https://github.com/CosmWasm/wasmvm/blob/v2.0.0/lib.go#L26). [`wasmd` sets this to all the available capabilities](https://github.com/CosmWasm/wasmd/blob/36416def20effe47fb77f29f5ba35a003970fdba/app/app.go#L586), but 08-wasm only requires `iterator`. +- `MemoryCacheSize` sets [the size in MiB of an in-memory cache for e.g. module caching](https://github.com/CosmWasm/wasmvm/blob/v2.0.0/lib.go#L29C16-L29C104). It is not consensus-critical and should be defined on a per-node basis, often in the range 100 to 1000 MB. [`wasmd` reads this value of](https://github.com/CosmWasm/wasmd/blob/36416def20effe47fb77f29f5ba35a003970fdba/app/app.go#L579). Default value is 256. +- `ContractDebugMode` is a [flag to enable/disable printing debug logs from the contract to STDOUT](https://github.com/CosmWasm/wasmvm/blob/v2.0.0/lib.go#L28). This should be false in production environments. Default value is false. + +Another configuration parameter of the Wasm VM is the contract memory limit (in MiB), which is [set to 32](https://github.com/cosmos/ibc-go/blob/57fcdb9a9a9db9b206f7df2f955866dc4e10fef4/modules/light-clients/08-wasm/types/config.go#L8), [following the example of `wasmd`](https://github.com/CosmWasm/wasmd/blob/36416def20effe47fb77f29f5ba35a003970fdba/x/wasm/keeper/keeper.go#L32-L34). This parameter is not configurable by users of `08-wasm`. + +The following sample code shows how the keeper would be constructed using this method: + +```go +// app.go +import ( + ... + "github.com/cosmos/cosmos-sdk/runtime" + + ibcwasmkeeper "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/keeper" + ibcwasmtypes "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/types" + ... +) + +... + +// homePath is the path to the directory where the data +// directory for Wasm blobs and caches will be created +wasmConfig := ibcwasmtypes.WasmConfig{ + DataDir: filepath.Join(homePath, "ibc_08-wasm_client_data"), + SupportedCapabilities: []string{"iterator"}, + ContractDebugMode: false, +} +app.WasmClientKeeper = ibcwasmkeeper.NewKeeperWithConfig( + appCodec, + runtime.NewKVStoreService(keys[ibcwasmtypes.StoreKey]), + app.IBCKeeper.ClientKeeper, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + wasmConfig, + app.GRPCQueryRouter(), +) +``` + +Check out also the [`WasmConfig` type definition](https://github.com/cosmos/ibc-go/blob/57fcdb9a9a9db9b206f7df2f955866dc4e10fef4/modules/light-clients/08-wasm/types/config.go#L21-L31) for more information on each of the configurable parameters. Some parameters allow node-level configurations. There is additionally the function [`DefaultWasmConfig`](https://github.com/cosmos/ibc-go/blob/57fcdb9a9a9db9b206f7df2f955866dc4e10fef4/modules/light-clients/08-wasm/types/config.go#L36-L42) available that returns a configuration with the default values. + +### Options + +The `08-wasm` module comes with an options API inspired by the one in `x/wasm`. +Currently the only option available is the `WithQueryPlugins` option, which allows registration of custom query plugins for the `08-wasm` module. The use of this API is optional and it is only required if the chain wants to register custom query plugins for the `08-wasm` module. + +#### `WithQueryPlugins` + +By default, the `08-wasm` module does not configure any querier options for light client contracts. However, it is possible to register custom query plugins for [`QueryRequest::Custom`](https://github.com/CosmWasm/cosmwasm/blob/v2.0.1/packages/std/src/query/mod.rs#L48) and [`QueryRequest::Stargate`](https://github.com/CosmWasm/cosmwasm/blob/v2.0.1/packages/std/src/query/mod.rs#L57-L65). + +Assuming that the keeper is not yet instantiated, the following sample code shows how to register query plugins for the `08-wasm` module. + +We first construct a [`QueryPlugins`](https://github.com/cosmos/ibc-go/blob/57fcdb9a9a9db9b206f7df2f955866dc4e10fef4/modules/light-clients/08-wasm/types/querier.go#L78-L87) object with the desired query plugins: + +```go +queryPlugins := ibcwasmtypes.QueryPlugins { + Custom: MyCustomQueryPlugin(), + // `myAcceptList` is a `[]string` containing the list of gRPC query paths that the chain wants to allow for the `08-wasm` module to query. + // These queries must be registered in the chain's gRPC query router, be deterministic, and track their gas usage. + // The `AcceptListStargateQuerier` function will return a query plugin that will only allow queries for the paths in the `myAcceptList`. + // The query responses are encoded in protobuf unlike the implementation in `x/wasm`. + Stargate: ibcwasmtypes.AcceptListStargateQuerier(myAcceptList), +} +``` + +Note that the `Stargate` querier appends the user defined accept list of query routes to a default list defined by the `08-wasm` module. +The `defaultAcceptList` defines a single query route: `"/ibc.core.client.v1.Query/VerifyMembership"`. This allows for light client smart contracts to delegate parts of their workflow to other light clients for auxiliary proof verification. For example, proof of inclusion of block and tx data by a data availability provider. + +```go +// defaultAcceptList defines a set of default allowed queries made available to the Querier. +var defaultAcceptList = []string{ + "/ibc.core.client.v1.Query/VerifyMembership", +} +``` + +You may leave any of the fields in the `QueryPlugins` object as `nil` if you do not want to register a query plugin for that query type. + +Then, we pass the `QueryPlugins` object to the `WithQueryPlugins` option: + +```go +querierOption := ibcwasmkeeper.WithQueryPlugins(&queryPlugins) +``` + +Finally, we pass the option to the `NewKeeperWithConfig` or `NewKeeperWithVM` constructor function during [Keeper instantiation](#keeper-instantiation): + +```diff +app.WasmClientKeeper = ibcwasmkeeper.NewKeeperWithConfig( + appCodec, + runtime.NewKVStoreService(keys[ibcwasmtypes.StoreKey]), + app.IBCKeeper.ClientKeeper, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + wasmConfig, + app.GRPCQueryRouter(), ++ querierOption, +) +``` + +```diff +app.WasmClientKeeper = ibcwasmkeeper.NewKeeperWithVM( + appCodec, + runtime.NewKVStoreService(keys[ibcwasmtypes.StoreKey]), + app.IBCKeeper.ClientKeeper, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + wasmer, // pass the Wasm VM instance to `08-wasm` keeper constructor + app.GRPCQueryRouter(), ++ querierOption, +) +``` + +## Updating `AllowedClients` + +If the chain's 02-client submodule parameter `AllowedClients` contains the single wildcard `"*"` element, then it is not necessary to do anything in order to allow the creation of `08-wasm` clients. However, if the parameter contains a list of client types (e.g. `["06-solomachine", "07-tendermint"]`), then in order to use the `08-wasm` module chains must update the [`AllowedClients` parameter](https://github.com/cosmos/ibc-go/blob/v8.0.0/proto/ibc/core/client/v1/client.proto#L64) of core IBC. This can be configured directly in the application upgrade handler with the sample code below: + +```go +import ( + ... + ibcwasmtypes "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/types" + ... +) + +... + +func CreateWasmUpgradeHandler( + mm *module.Manager, + configurator module.Configurator, + clientKeeper clientkeeper.Keeper, +) upgradetypes.UpgradeHandler { + return func(ctx context.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { + sdkCtx := sdk.UnwrapSDKContext(ctx) + // explicitly update the IBC 02-client params, adding the wasm client type + params := clientKeeper.GetParams(ctx) + params.AllowedClients = append(params.AllowedClients, ibcwasmtypes.Wasm) + clientKeeper.SetParams(ctx, params) + + return mm.RunMigrations(ctx, configurator, vm) + } +} +``` + +Or alternatively the parameter can be updated via a governance proposal (see at the bottom of section [`Creating clients`](../01-developer-guide/09-setup.md#creating-clients) for an example of how to do this). + +## Adding the module to the store + +As part of the upgrade migration you must also add the module to the upgrades store. + +```go +func (app SimApp) RegisterUpgradeHandlers() { + + ... + + if upgradeInfo.Name == UpgradeName && !app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) { + storeUpgrades := storetypes.StoreUpgrades{ + Added: []string{ + ibcwasmtypes.ModuleName, + }, + } + + // configure store loader that checks if version == upgradeHeight and applies store upgrades + app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades)) + } +} +``` + +## Adding snapshot support + +In order to use the `08-wasm` module chains are required to register the `WasmSnapshotter` extension in the snapshot manager. This snapshotter takes care of persisting the external state, in the form of contract code, of the Wasm VM instance to disk when the chain is snapshotted. [This code](https://github.com/cosmos/ibc-go/blob/57fcdb9a9a9db9b206f7df2f955866dc4e10fef4/modules/light-clients/08-wasm/testing/simapp/app.go#L775-L782) should be placed in `NewSimApp` function in `app.go`. + +## Pin byte codes at start + +Wasm byte codes should be pinned to the WasmVM cache on every application start, therefore [this code](https://github.com/cosmos/ibc-go/blob/57fcdb9a9a9db9b206f7df2f955866dc4e10fef4/modules/light-clients/08-wasm/testing/simapp/app.go#L825-L830) should be placed in `NewSimApp` function in `app.go`. diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/04-messages.md b/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/04-messages.md new file mode 100644 index 00000000000..cbb9571616b --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/04-messages.md @@ -0,0 +1,75 @@ +--- +title: Messages +sidebar_label: Messages +sidebar_position: 4 +slug: /ibc/light-clients/wasm/messages +--- + +# Messages + +## `MsgStoreCode` + +Uploading the Wasm light client contract to the Wasm VM storage is achieved by means of `MsgStoreCode`: + +```go +type MsgStoreCode struct { + // signer address + Signer string + // wasm byte code of light client contract. It can be raw or gzip compressed + WasmByteCode []byte +} +``` + +This message is expected to fail if: + +- `Signer` is an invalid Bech32 address, or it does not match the designated authority address. +- `WasmByteCode` is empty or it exceeds the maximum size, currently set to 3MB. + +Only light client contracts stored using `MsgStoreCode` are allowed to be instantiated. An attempt to create a light client from contracts uploaded via other means (e.g. through `x/wasm` if the module shares the same Wasm VM instance with 08-wasm) will fail. Due to the idempotent nature of the Wasm VM's `StoreCode` function, it is possible to store the same byte code multiple times. + +When execution of `MsgStoreCode` succeeds, the checksum of the contract (i.e. the sha256 hash of the contract's byte code) is stored in an allow list. When a relayer submits [`MsgCreateClient`](https://github.com/cosmos/ibc-go/blob/v8.0.0/proto/ibc/core/client/v1/tx.proto#L25-L37) with 08-wasm's `ClientState`, the client state includes the checksum of the Wasm byte code that should be called. Then 02-client calls [08-wasm's implementation of `Initialize` function](https://github.com/cosmos/ibc-go/blob/06fd8eb5ee1697e3b43be7528a6e42f5e4a4613c/modules/core/02-client/keeper/client.go#L40) (which is an interface function part of `LightClientModule`), and it will check that the checksum in the client state matches one of the checksums in the allow list. If a match is found, the light client is initialized; otherwise, the transaction is aborted. + +## `MsgMigrateContract` + +Migrating a contract to a new Wasm byte code is achieved by means of `MsgMigrateContract`: + +```go +type MsgMigrateContract struct { + // signer address + Signer string + // the client id of the contract + ClientId string + // the SHA-256 hash of the new wasm byte code for the contract + Checksum []byte + // the json-encoded migrate msg to be passed to the contract on migration + Msg []byte +} +``` + +This message is expected to fail if: + +- `Signer` is an invalid Bech32 address, or it does not match the designated authority address. +- `ClientId` is not a valid identifier prefixed by `08-wasm`. +- `Checksum` is not exactly 32 bytes long or it is not found in the list of allowed checksums (a new checksum is added to the list when executing `MsgStoreCode`), or it matches the current checksum of the contract. + +When a Wasm light client contract is migrated to a new Wasm byte code the checksum for the contract will be updated with the new checksum. + +## `MsgRemoveChecksum` + +Removing a checksum from the list of allowed checksums is achieved by means of `MsgRemoveChecksum`: + +```go +type MsgRemoveChecksum struct { + // signer address + Signer string + // Wasm byte code checksum to be removed from the store + Checksum []byte +} +``` + +This message is expected to fail if: + +- `Signer` is an invalid Bech32 address, or it does not match the designated authority address. +- `Checksum` is not exactly 32 bytes long or it is not found in the list of allowed checksums (a new checksum is added to the list when executing `MsgStoreCode`). + +When a checksum is removed from the list of allowed checksums, then the corresponding Wasm byte code will not be available for instantiation in [08-wasm's implementation of `Initialize` function](https://github.com/cosmos/ibc-go/blob/v8.0.0/modules/core/02-client/keeper/client.go#L36). diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/05-governance.md b/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/05-governance.md new file mode 100644 index 00000000000..19a0df5d6fb --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/05-governance.md @@ -0,0 +1,126 @@ +--- +title: Governance +sidebar_label: Governance +sidebar_position: 5 +slug: /ibc/light-clients/wasm/governance +--- + +# Governance + +Learn how to upload Wasm light client byte code on a chain, and how to migrate an existing Wasm light client contract. + +## Setting an authority + +Both the storage of Wasm light client byte code as well as the migration of an existing Wasm light client contract are permissioned (i.e. only allowed to an authority such as governance). The designated authority is specified when instantiating `08-wasm`'s keeper: both [`NewKeeperWithVM`](https://github.com/cosmos/ibc-go/blob/57fcdb9a9a9db9b206f7df2f955866dc4e10fef4/modules/light-clients/08-wasm/keeper/keeper.go#L39-L47) and [`NewKeeperWithConfig`](https://github.com/cosmos/ibc-go/blob/57fcdb9a9a9db9b206f7df2f955866dc4e10fef4/modules/light-clients/08-wasm/keeper/keeper.go#L88-L96) constructor functions accept an `authority` argument that must be the address of the authorized actor. For example, in `app.go`, when instantiating the keeper, you can pass the address of the governance module: + +```go +// app.go +import ( + ... + "github.com/cosmos/cosmos-sdk/runtime" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + + ibcwasmkeeper "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/keeper" + ibcwasmtypes "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/types" + ... +) + +// app.go +app.WasmClientKeeper = ibcwasmkeeper.NewKeeperWithVM( + appCodec, + runtime.NewKVStoreService(keys[ibcwasmtypes.StoreKey]), + app.IBCKeeper.ClientKeeper, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), // authority + wasmVM, + app.GRPCQueryRouter(), +) +``` + +## Storing new Wasm light client byte code + + If governance is the allowed authority, the governance v1 proposal that needs to be submitted to upload a new light client contract should contain the message [`MsgStoreCode`](https://github.com/cosmos/ibc-go/blob/57fcdb9a9a9db9b206f7df2f955866dc4e10fef4/proto/ibc/lightclients/wasm/v1/tx.proto#L23-L30) with the base64-encoded byte code of the Wasm contract. Use the following CLI command and JSON as an example: + +```shell +simd tx gov submit-proposal --from +``` + +where `proposal.json` contains: + +```json +{ + "title": "Upload IBC Wasm light client", + "summary": "Upload wasm client", + "messages": [ + { + "@type": "/ibc.lightclients.wasm.v1.MsgStoreCode", + "signer": "cosmos1...", // the authority address (e.g. the gov module account address) + "wasm_byte_code": "YWJ...PUB+" // standard base64 encoding of the Wasm contract byte code + } + ], + "metadata": "AQ==", + "deposit": "100stake" +} +``` + +To learn more about the `submit-proposal` CLI command, please check out [the relevant section in Cosmos SDK documentation](https://docs.cosmos.network/main/modules/gov#submit-proposal). + +Alternatively, the process of submitting the proposal may be simpler if you use the CLI command `store-code`. This CLI command accepts as argument the file of the Wasm light client contract and takes care of constructing the proposal message with `MsgStoreCode` and broadcasting it. See section [`store-code`](./08-client.md#store-code) for more information. + +## Migrating an existing Wasm light client contract + +If governance is the allowed authority, the governance v1 proposal that needs to be submitted to migrate an existing new Wasm light client contract should contain the message [`MsgMigrateContract`](https://github.com/cosmos/ibc-go/blob/57fcdb9a9a9db9b206f7df2f955866dc4e10fef4/proto/ibc/lightclients/wasm/v1/tx.proto#L52-L63) with the checksum of the Wasm byte code to migrate to. Use the following CLI command and JSON as an example: + +```shell +simd tx gov submit-proposal --from +``` + +where `proposal.json` contains: + +```json +{ + "title": "Migrate IBC Wasm light client", + "summary": "Migrate wasm client", + "messages": [ + { + "@type": "/ibc.lightclients.wasm.v1.MsgMigrateContract", + "signer": "cosmos1...", // the authority address (e.g. the gov module account address) + "client_id": "08-wasm-1", // client identifier of the Wasm light client contract that will be migrated + "checksum": "a8ad...4dc0", // SHA-256 hash of the Wasm byte code to migrate to, previously stored with MsgStoreCode + "msg": "{}" // JSON-encoded message to be passed to the contract on migration + } + ], + "metadata": "AQ==", + "deposit": "100stake" +} +``` + +To learn more about the `submit-proposal` CLI command, please check out [the relevant section in Cosmos SDK documentation](https://docs.cosmos.network/main/modules/gov#submit-proposal). + +## Removing an existing checksum + +If governance is the allowed authority, the governance v1 proposal that needs to be submitted to remove a specific checksum from the list of allowed checksums should contain the message [`MsgRemoveChecksum`](https://github.com/cosmos/ibc-go/blob/57fcdb9a9a9db9b206f7df2f955866dc4e10fef4/proto/ibc/lightclients/wasm/v1/tx.proto#L39-L46) with the checksum (of a corresponding Wasm byte code). Use the following CLI command and JSON as an example: + +```shell +simd tx gov submit-proposal --from +``` + +where `proposal.json` contains: + +```json +{ + "title": "Remove checksum of Wasm light client byte code", + "summary": "Remove checksum", + "messages": [ + { + "@type": "/ibc.lightclients.wasm.v1.MsgRemoveChecksum", + "signer": "cosmos1...", // the authority address (e.g. the gov module account address) + "checksum": "a8ad...4dc0", // SHA-256 hash of the Wasm byte code that should be removed from the list of allowed checksums + } + ], + "metadata": "AQ==", + "deposit": "100stake" +} +``` + +To learn more about the `submit-proposal` CLI command, please check out [the relevant section in Cosmos SDK documentation](https://docs.cosmos.network/main/modules/gov#submit-proposal). diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/06-events.md b/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/06-events.md new file mode 100644 index 00000000000..518a3a94c02 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/06-events.md @@ -0,0 +1,26 @@ +--- +title: Events +sidebar_label: Events +sidebar_position: 6 +slug: /ibc/light-clients/wasm/events +--- + +# Events + +The `08-wasm` module emits the following events: + +## `MsgStoreCode` + +| Type | Attribute Key | Attribute Value | +|------------------|----------------|--------------------------| +| store_wasm_code | wasm_checksum | \{hex.Encode(checksum)\} | +| message | module | 08-wasm | + +## `MsgMigrateContract` + +| Type | Attribute Key | Attribute Value | +|------------------|----------------|-----------------------------| +| migrate_contract | client_id | \{clientId\} | +| migrate_contract | wasm_checksum | \{hex.Encode(checksum)\} | +| migrate_contract | new_checksum | \{hex.Encode(newChecksum)\} | +| message | module | 08-wasm | diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/07-contracts.md b/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/07-contracts.md new file mode 100644 index 00000000000..7e88309124b --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/07-contracts.md @@ -0,0 +1,110 @@ +--- +title: Contracts +sidebar_label: Contracts +sidebar_position: 7 +slug: /ibc/light-clients/wasm/contracts +--- + +# Contracts + +Learn about the expected behaviour of Wasm light client contracts and the between with `08-wasm`. + +## API + +The `08-wasm` light client proxy performs calls to the Wasm light client via the Wasm VM. The calls require as input JSON-encoded payload messages that fall in the three categories described in the next sections. + +## `InstantiateMessage` + +This is the message sent to the contract's `instantiate` entry point. It contains the bytes of the protobuf-encoded client and consensus states of the underlying light client, both provided in [`MsgCreateClient`](https://github.com/cosmos/ibc-go/blob/v8.0.0/proto/ibc/core/client/v1/tx.proto#L40-L52). Please note that the bytes contained within the JSON message are represented as base64-encoded strings. + +```go +type InstantiateMessage struct { + ClientState []byte `json:"client_state"` + ConsensusState []byte `json:"consensus_state"` + Checksum []byte `json:"checksum" +} +``` + +The Wasm light client contract is expected to store the client and consensus state in the corresponding keys of the client-prefixed store. + +## `QueryMsg` + +`QueryMsg` acts as a discriminated union type that is used to encode the messages that are sent to the contract's `query` entry point. Only one of the fields of the type should be set at a time, so that the other fields are omitted in the encoded JSON and the payload can be correctly translated to the corresponding element of the enumeration in Rust. + +```go +type QueryMsg struct { + Status *StatusMsg `json:"status,omitempty"` + TimestampAtHeight *TimestampAtHeightMsg `json:"timestamp_at_height,omitempty"` + VerifyClientMessage *VerifyClientMessageMsg `json:"verify_client_message,omitempty"` + CheckForMisbehaviour *CheckForMisbehaviourMsg `json:"check_for_misbehaviour,omitempty"` +} +``` + +```rust +#[cw_serde] +pub enum QueryMsg { + Status(StatusMsg), + TimestampAtHeight(TimestampAtHeightMsg), + VerifyClientMessage(VerifyClientMessageRaw), + CheckForMisbehaviour(CheckForMisbehaviourMsgRaw), +} +``` + +To learn what it is expected from the Wasm light client contract when processing each message, please read the corresponding section of the [Light client developer guide](../01-developer-guide/01-overview.md): + +- For `StatusMsg`, see the section [`Status` method](../01-developer-guide/03-client-state.md#status-method). +- For `TimestampAtHeightMsg`, see the section [`GetTimestampAtHeight` method](../01-developer-guide/03-client-state.md#gettimestampatheight-method). +- For `VerifyClientMessageMsg`, see the section [`VerifyClientMessage`](../01-developer-guide/05-updates-and-misbehaviour.md#verifyclientmessage). +- For `CheckForMisbehaviourMsg`, see the section [`CheckForMisbehaviour` method](../01-developer-guide/03-client-state.md#checkformisbehaviour-method). + +## `SudoMsg` + +`SudoMsg` acts as a discriminated union type that is used to encode the messages that are sent to the contract's `sudo` entry point. Only one of the fields of the type should be set at a time, so that the other fields are omitted in the encoded JSON and the payload can be correctly translated to the corresponding element of the enumeration in Rust. + +The `sudo` entry point is able to perform state-changing writes in the client-prefixed store. + +```go +type SudoMsg struct { + UpdateState *UpdateStateMsg `json:"update_state,omitempty"` + UpdateStateOnMisbehaviour *UpdateStateOnMisbehaviourMsg `json:"update_state_on_misbehaviour,omitempty"` + VerifyUpgradeAndUpdateState *VerifyUpgradeAndUpdateStateMsg `json:"verify_upgrade_and_update_state,omitempty"` + VerifyMembership *VerifyMembershipMsg `json:"verify_membership,omitempty"` + VerifyNonMembership *VerifyNonMembershipMsg `json:"verify_non_membership,omitempty"` + MigrateClientStore *MigrateClientStoreMsg `json:"migrate_client_store,omitempty"` +} +``` + +```rust +#[cw_serde] +pub enum SudoMsg { + UpdateState(UpdateStateMsgRaw), + UpdateStateOnMisbehaviour(UpdateStateOnMisbehaviourMsgRaw), + VerifyUpgradeAndUpdateState(VerifyUpgradeAndUpdateStateMsgRaw), + VerifyMembership(VerifyMembershipMsgRaw), + VerifyNonMembership(VerifyNonMembershipMsgRaw), + MigrateClientStore(MigrateClientStoreMsgRaw), +} +``` + +To learn what it is expected from the Wasm light client contract when processing each message, please read the corresponding section of the [Light client developer guide](../01-developer-guide/01-overview.md): + +- For `UpdateStateMsg`, see the section [`UpdateState`](../01-developer-guide/05-updates-and-misbehaviour.md#updatestate). +- For `UpdateStateOnMisbehaviourMsg`, see the section [`UpdateStateOnMisbehaviour`](../01-developer-guide/05-updates-and-misbehaviour.md#updatestateonmisbehaviour). +- For `VerifyUpgradeAndUpdateStateMsg`, see the section [`GetTimestampAtHeight` method](../01-developer-guide/06-upgrades.md#implementing-verifyupgradeandupdatestate). +- For `VerifyMembershipMsg`, see the section [`VerifyMembership` method](../01-developer-guide/03-client-state.md#verifymembership-method). +- For `VerifyNonMembershipMsg`, see the section [`VerifyNonMembership` method](../01-developer-guide/03-client-state.md#verifynonmembership-method). +- For `MigrateClientStoreMsg`, see the section [Implementing `CheckSubstituteAndUpdateState`](../01-developer-guide/08-proposals.md#implementing-checksubstituteandupdatestate). + +### Migration + +The `08-wasm` proxy light client exposes the `MigrateContract` RPC endpoint that can be used to migrate a given Wasm light client contract (specified by the client identifier) to a new Wasm byte code (specified by the hash of the byte code). The expected use case for this RPC endpoint is to enable contracts to migrate to new byte code in case the current byte code is found to have a bug or vulnerability. The Wasm byte code that contracts are migrated have to be uploaded beforehand using `MsgStoreCode` and must implement the `migrate` entry point. See section[`MsgMigrateContract`](./04-messages.md#msgmigratecontract) for information about the request message for this RPC endpoint. + +## Expected behaviour + +The `08-wasm` proxy light client modules expects the following behaviour from the Wasm light client contracts when executing messages that perform state-changing writes: + +- The contract must not delete the client state from the store. +- The contract must not change the client state to a client state of another type. +- The contract must not change the checksum in the client state. + +Any violation of these rules will result in an error returned from `08-wasm` that will abort the transaction. diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/08-client.md b/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/08-client.md new file mode 100644 index 00000000000..1139d4e2510 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/08-client.md @@ -0,0 +1,151 @@ +--- +title: Client +sidebar_label: Client +sidebar_position: 7 +slug: /ibc/light-clients/wasm/client +--- + +# Client + +## CLI + +A user can query and interact with the `08-wasm` module using the CLI. Use the `--help` flag to discover the available commands: + +### Transactions + +The `tx` commands allow users to interact with the `08-wasm` submodule. + +```shell +simd tx ibc-wasm --help +``` + +#### `store-code` + +The `store-code` command allows users to submit a governance proposal with a `MsgStoreCode` to store the byte code of a Wasm light client contract. + +```shell +simd tx ibc-wasm store-code [path/to/wasm-file] [flags] +``` + +`path/to/wasm-file` is the path to the `.wasm` or `.wasm.gz` file. + +#### `migrate-contract` + +The `migrate-contract` command allows users to broadcast a transaction with a `MsgMigrateContract` to migrate the contract for a given light client to a new byte code denoted by the given checksum. + +```shell +simd tx ibc-wasm migrate-contract [client-id] [checksum] [migrate-msg] +``` + +The migrate message must not be emptied and is expected to be a JSON-encoded string. + +### Query + +The `query` commands allow users to query `08-wasm` state. + +```shell +simd query ibc-wasm --help +``` + +#### `checksums` + +The `checksums` command allows users to query the list of checksums of Wasm light client contracts stored in the Wasm VM via the `MsgStoreCode`. The checksums are hex-encoded. + +```shell +simd query ibc-wasm checksums [flags] +``` + +Example: + +```shell +simd query ibc-wasm checksums +``` + +Example Output: + +```shell +checksums: +- c64f75091a6195b036f472cd8c9f19a56780b9eac3c3de7ced0ec2e29e985b64 +pagination: + next_key: null + total: "1" +``` + +#### `code` + +The `code` command allows users to query the Wasm byte code of a light client contract given the provided input checksum. + +```shell +./simd q ibc-wasm code +``` + +Example: + +```shell +simd query ibc-wasm code c64f75091a6195b036f472cd8c9f19a56780b9eac3c3de7ced0ec2e29e985b64 +``` + +Example Output: + +```shell +code: AGFzb...AqBBE= +``` + +## gRPC + +A user can query the `08-wasm` module using gRPC endpoints. + +### `Checksums` + +The `Checksums` endpoint allows users to query the list of checksums of Wasm light client contracts stored in the Wasm VM via the `MsgStoreCode`. + +```shell +ibc.lightclients.wasm.v1.Query/Checksums +``` + +Example: + +```shell +grpcurl -plaintext \ + -d '{}' \ + localhost:9090 \ + ibc.lightclients.wasm.v1.Query/Checksums +``` + +Example output: + +```shell +{ + "checksums": [ + "c64f75091a6195b036f472cd8c9f19a56780b9eac3c3de7ced0ec2e29e985b64" + ], + "pagination": { + "total": "1" + } +} +``` + +### `Code` + +The `Code` endpoint allows users to query the Wasm byte code of a light client contract given the provided input checksum. + +```shell +ibc.lightclients.wasm.v1.Query/Code +``` + +Example: + +```shell +grpcurl -plaintext \ + -d '{"checksum":"c64f75091a6195b036f472cd8c9f19a56780b9eac3c3de7ced0ec2e29e985b64"}' \ + localhost:9090 \ + ibc.lightclients.wasm.v1.Query/Code +``` + +Example output: + +```shell +{ + "code": AGFzb...AqBBE= +} +``` diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/09-migrations.md b/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/09-migrations.md new file mode 100644 index 00000000000..35c43bd6721 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/09-migrations.md @@ -0,0 +1,239 @@ +--- +title: Migrations +sidebar_label: Migrations +sidebar_position: 9 +slug: /ibc/light-clients/wasm/migrations +--- + +# Migrations + +This guide provides instructions for migrating 08-wasm versions. + +Please note that the following releases are retracted. Please refer to the appropriate migrations section for upgrading. + +```bash +v0.3.1-0.20240717085919-bb71eef0f3bf => v0.3.0+ibc-go-v8.3-wasmvm-v2.0 +v0.2.1-0.20240717085554-570d057959e3 => v0.2.0+ibc-go-v7.6-wasmvm-v1.5 +v0.2.1-0.20240523101951-4b45d1822fb6 => v0.2.0+ibc-go-v8.3-wasmvm-v2.0 +v0.1.2-0.20240412103620-7ee2a2452b79 => v0.1.1+ibc-go-v7.3-wasmvm-v1.5 +v0.1.1-0.20231213092650-57fcdb9a9a9d => v0.1.0+ibc-go-v8.0-wasmvm-v1.5 +v0.1.1-0.20231213092633-b306e7a706e1 => v0.1.0+ibc-go-v7.3-wasmvm-v1.5 +``` + +## From ibc-go v8.4.x to ibc-go v9.0.x + +### Chains + +- The `Initialize`, `Status`, `GetTimestampAtHeight`, `GetLatestHeight`, `VerifyMembership`, `VerifyNonMembership`, `VerifyClientMessage`, `UpdateState` and `UpdateStateOnMisbehaviour` functions in `ClientState` have been removed and all their logic has been moved to functions of the `LightClientModule`. +- The `MigrateContract` function has been removed from `ClientState`. +- The `VerifyMembershipMsg` and `VerifyNonMembershipMsg` payloads for `SudoMsg` have been modified. The `Path` field of both structs has been updated from `v1.MerklePath` to `v2.MerklePath`. The new `v2.MerklePath` field contains a `KeyPath` of `[][]byte` as opposed to `[]string`, see [23-commitment](../../05-migrations/13-v8-to-v9.md#23-commitment). This supports proving values stored under keys which contain non-utf8 encoded symbols. As a result, the JSON field `path` containing `key_path` of both messages will marshal elements as a base64 encoded bytestrings. This is a breaking change for 08-wasm client contracts and they should be migrated to correctly support deserialisation of the `v2.MerklePath` field. +- The `ExportMetadataMsg` struct has been removed and is no longer required for contracts to implement. Core IBC will handle exporting all key/value's written to the store by a light client contract. +- The `ZeroCustomFields` interface function has been removed from the `ClientState` interface. Core IBC only used this function to set tendermint client states when scheduling an IBC software upgrade. The interface function has been replaced by a type assertion. +- The `MaxWasmByteSize` function has been removed in favor of the `MaxWasmSize` constant. +- The `HasChecksum`, `GetAllChecksums` and `Logger` functions have been moved from the `types` package to a method on the `Keeper` type in the `keeper` package. +- The `InitializePinnedCodes` function has been moved to a method on the `Keeper` type in the `keeper` package. +- The `CustomQuerier`, `StargateQuerier` and `QueryPlugins` types have been moved from the `types` package to the `keeper` package. +- The `NewDefaultQueryPlugins`, `AcceptListStargateQuerier` and `RejectCustomQuerier` functions has been moved from the `types` package to the `keeper` package. +- The `NewDefaultQueryPlugins` function signature has changed to take an argument: `queryRouter ibcwasm.QueryRouter`. +- The `AcceptListStargateQuerier` function signature has changed to take an additional argument: `queryRouter ibcwasm.QueryRouter`. +- The `WithQueryPlugins` function signature has changed to take in the `QueryPlugins` type from the `keeper` package (previously from the `types` package). +- The `VMGasRegister` variable has been moved from the `types` package to the `keeper` package. + +## From v0.3.0+ibc-go-v8.3-wasmvm-v2.0 to v0.4.1-ibc-go-v8.4-wasmvm-v2.0 + +### Contract developers + +Contract developers are required to update their JSON API message structure for the `SudoMsg` payloads `VerifyMembershipMsg` and `VerifyNonMembershipMsg`. +The `path` field on both JSON API messages has been renamed to `merkle_path`. + +A migration is required for existing 08-wasm client contracts in order to correctly handle the deserialisation of these fields. + +## From v0.2.0+ibc-go-v7.3-wasmvm-v1.5 to v0.3.1-ibc-go-v7.4-wasmvm-v1.5 + +### Contract developers + +Contract developers are required to update their JSON API message structure for the `SudoMsg` payloads `VerifyMembershipMsg` and `VerifyNonMembershipMsg`. +The `path` field on both JSON API messages has been renamed to `merkle_path`. + +A migration is required for existing 08-wasm client contracts in order to correctly handle the deserialisation of these fields. + +## From v0.2.0+ibc-go-v8.3-wasmvm-v2.0 to v0.3.0-ibc-go-v8.3-wasmvm-v2.0 + +### Contract developers + +The `v0.3.0` release of 08-wasm for ibc-go `v8.3.x` and above introduces a breaking change for client contract developers. + +The contract API `SudoMsg` payloads `VerifyMembershipMsg` and `VerifyNonMembershipMsg` have been modified. +The encoding of the `Path` field of both structs has been updated from `v1.MerklePath` to `v2.MerklePath` to support proving values stored under keys which contain non-utf8 encoded symbols. + +As a result, the `Path` field now contains a `MerklePath` composed of `key_path` of `[][]byte` as opposed to `[]string`. The JSON field `path` containing `key_path` of both `VerifyMembershipMsg` and `VerifyNonMembershipMsg` structs will now marshal elements as base64 encoded bytestrings. See below for example JSON diff. + +```diff +{ + "verify_membership": { + "height": { + "revision_height": 1 + }, + "delay_time_period": 0, + "delay_block_period": 0, + "proof":"dmFsaWQgcHJvb2Y=", + "path": { ++ "key_path":["L2liYw==","L2tleS9wYXRo"] +- "key_path":["/ibc","/key/path"] + }, + "value":"dmFsdWU=" + } +} +``` + +A migration is required for existing 08-wasm client contracts in order to correctly handle the deserialisation of `key_path` from `[]string` to `[][]byte`. +Contract developers should familiarise themselves with the migration path offered by 08-wasm [here](./05-governance.md#migrating-an-existing-wasm-light-client-contract). + +An example of the required changes in a client contract may look like: + +```diff +#[cw_serde] +pub struct MerklePath { ++ pub key_path: Vec, +- pub key_path: Vec, +} +``` + +Please refer to the [`cosmwasm_std`](https://docs.rs/cosmwasm-std/2.0.4/cosmwasm_std/struct.Binary.html) documentation for more information. + +## From v0.1.1+ibc-go-v7.3-wasmvm-v1.5 to v0.2.0-ibc-go-v7.3-wasmvm-v1.5 + +### Contract developers + +The `v0.2.0` release of 08-wasm for ibc-go `v7.6.x` and above introduces a breaking change for client contract developers. + +The contract API `SudoMsg` payloads `VerifyMembershipMsg` and `VerifyNonMembershipMsg` have been modified. +The encoding of the `Path` field of both structs has been updated from `v1.MerklePath` to `v2.MerklePath` to support proving values stored under keys which contain non-utf8 encoded symbols. + +As a result, the `Path` field now contains a `MerklePath` composed of `key_path` of `[][]byte` as opposed to `[]string`. The JSON field `path` containing `key_path` of both `VerifyMembershipMsg` and `VerifyNonMembershipMsg` structs will now marshal elements as base64 encoded bytestrings. See below for example JSON diff. + +```diff +{ + "verify_membership": { + "height": { + "revision_height": 1 + }, + "delay_time_period": 0, + "delay_block_period": 0, + "proof":"dmFsaWQgcHJvb2Y=", + "path": { ++ "key_path":["L2liYw==","L2tleS9wYXRo"] +- "key_path":["/ibc","/key/path"] + }, + "value":"dmFsdWU=" + } +} +``` + +A migration is required for existing 08-wasm client contracts in order to correctly handle the deserialisation of `key_path` from `[]string` to `[][]byte`. +Contract developers should familiarise themselves with the migration path offered by 08-wasm [here](./05-governance.md#migrating-an-existing-wasm-light-client-contract). + +An example of the required changes in a client contract may look like: + +```diff +#[cw_serde] +pub struct MerklePath { ++ pub key_path: Vec, +- pub key_path: Vec, +} +``` + +Please refer to the [`cosmwasm_std`](https://docs.rs/cosmwasm-std/2.0.4/cosmwasm_std/struct.Binary.html) documentation for more information. + +## From ibc-go v7.3.x to ibc-go v8.0.x + +### Chains + +In the 08-wasm versions compatible with ibc-go v7.3.x and above from the v7 release line, the checksums of the uploaded Wasm bytecodes are all stored under a single key. From ibc-go v8.0.x the checksums are stored using [`collections.KeySet`](https://docs.cosmos.network/v0.50/build/packages/collections#keyset), whose full functionality became available in Cosmos SDK v0.50. There is therefore an [automatic migration handler](https://github.com/cosmos/ibc-go/blob/57fcdb9a9a9db9b206f7df2f955866dc4e10fef4/modules/light-clients/08-wasm/module.go#L115-L118) configured in the 08-wasm module to migrate the stored checksums to `collections.KeySet`. + +## From v0.1.0+ibc-go-v8.0-wasmvm-v1.5 to v0.2.0-ibc-go-v8.3-wasmvm-v2.0 + +The `WasmEngine` interface has been updated to reflect changes in the function signatures of Wasm VM: + +```diff +type WasmEngine interface { +- StoreCode(code wasmvm.WasmCode) (wasmvm.Checksum, error) ++ StoreCode(code wasmvm.WasmCode, gasLimit uint64) (wasmvmtypes.Checksum, uint64, error) + + StoreCodeUnchecked(code wasmvm.WasmCode) (wasmvm.Checksum, error) + + Instantiate( + checksum wasmvm.Checksum, + env wasmvmtypes.Env, + info wasmvmtypes.MessageInfo, + initMsg []byte, + store wasmvm.KVStore, + goapi wasmvm.GoAPI, + querier wasmvm.Querier, + gasMeter wasmvm.GasMeter, + gasLimit uint64, + deserCost wasmvmtypes.UFraction, +- ) (*wasmvmtypes.Response, uint64, error) ++ ) (*wasmvmtypes.ContractResult, uint64, error) + + Query( + checksum wasmvm.Checksum, + env wasmvmtypes.Env, + queryMsg []byte, + store wasmvm.KVStore, + goapi wasmvm.GoAPI, + querier wasmvm.Querier, + gasMeter wasmvm.GasMeter, + gasLimit uint64, + deserCost wasmvmtypes.UFraction, +- ) ([]byte, uint64, error) ++ ) (*wasmvmtypes.QueryResult, uint64, error) + + Migrate( + checksum wasmvm.Checksum, + env wasmvmtypes.Env, + migrateMsg []byte, + store wasmvm.KVStore, + goapi wasmvm.GoAPI, + querier wasmvm.Querier, + gasMeter wasmvm.GasMeter, + gasLimit uint64, + deserCost wasmvmtypes.UFraction, +- ) (*wasmvmtypes.Response, uint64, error) ++ ) (*wasmvmtypes.ContractResult, uint64, error) + + Sudo( + checksum wasmvm.Checksum, + env wasmvmtypes.Env, + sudoMsg []byte, + store wasmvm.KVStore, + goapi wasmvm.GoAPI, + querier wasmvm.Querier, + gasMeter wasmvm.GasMeter, + gasLimit uint64, + deserCost wasmvmtypes.UFraction, +- ) (*wasmvmtypes.Response, uint64, error) ++ ) (*wasmvmtypes.ContractResult, uint64, error) + + GetCode(checksum wasmvm.Checksum) (wasmvm.WasmCode, error) + + Pin(checksum wasmvm.Checksum) error + + Unpin(checksum wasmvm.Checksum) error +} +``` + +Similar changes were required in the functions of `MockWasmEngine` interface. + +### Chains + +The `SupportedCapabilities` field of `WasmConfig` is now of type `[]string`: + +```diff +type WasmConfig struct { + DataDir string +- SupportedCapabilities string ++ SupportedCapabilities []string + ContractDebugMode bool +} +``` diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/_category_.json b/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/_category_.json new file mode 100644 index 00000000000..6dc3d24d11a --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/04-wasm/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Wasm", + "position": 4, + "link": null +} \ No newline at end of file diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/05-tendermint/01-overview.md b/docs/versioned_docs/version-v9.0.x/03-light-clients/05-tendermint/01-overview.md new file mode 100644 index 00000000000..9f94d77980a --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/05-tendermint/01-overview.md @@ -0,0 +1,167 @@ +--- +title: Overview +sidebar_label: Overview +sidebar_position: 1 +slug: /ibc/light-clients/tendermint/overview +--- + +# `07-tendermint` + +## Overview + +:::note Synopsis +Learn about the 07-tendermint light client module. +::: + +The Tendermint client is the first and most deployed light client in IBC. It implements the IBC [light client module interface](https://github.com/cosmos/ibc-go/blob/v9.0.0-beta.1/modules/core/exported/client.go#L41-L123) to track a counterparty running [CometBFT](https://github.com/cometbft/cometbft) consensus. + +:::note +Tendermint is the old name of CometBFT which has been retained in IBC to avoid expensive migration costs. +::: + +The Tendermint client consists of two important structs that keep track of the state of the counterparty chain and allow for future updates. The `ClientState` struct contains all the parameters necessary for CometBFT header verification. The `ConsensusState`, on the other hand, is a compressed view of a particular header of the counterparty chain. Unlike off chain light clients, IBC does not store full header. Instead it stores only the information it needs to prove verification of key/value pairs in the counterparty state (i.e. the header `AppHash`), and the information necessary to use the consensus state as the next root of trust to add a new consensus state to the client (i.e. the header `NextValidatorsHash` and `Timestamp`). The relayer provides the full trusted header on `UpdateClient`, which will get checked against the compressed root-of-trust consensus state. If the trusted header matches a previous consensus state, and the trusted header and new header pass the CometBFT light client update algorithm, then the new header is compressed into a consensus state and added to the IBC client. + +Each Tendermint Client is composed of a single `ClientState` keyed on the client ID, and multiple consensus states which are keyed on both the clientID and header height. Relayers can use the consensus states to verify merkle proofs of packet commitments, acknowledgements, and receipts against the `AppHash` of the counterparty chain in order to enable verified packet flow. + +If a counterparty chain violates the CometBFT protocol in a way that is detectable to off-chain light clients, this misbehaviour can also be submitted to an IBC client by any off-chain actor. Upon verification of this misbehaviour, the Tendermint IBC Client will freeze, preventing any further packet flow from this malicious chain from occuring. Governance or some other out-of-band protocol may then be used to unwind any damage that has already occurred. + +## Initialization + +The Tendermint light client is initialized with a `ClientState` that contains parameters necessary for CometBFT header verification along with a latest height and `ConsensusState` that encapsulates the application state root of a trusted header that will serve to verify future incoming headers from the counterparty. + +```proto +message ClientState { + // human readable chain-id that will be included in header + // and signed over by the validator set + string chain_id = 1; + // trust level is the fraction of the trusted validator set + // that must sign over a new untrusted header before it is accepted + // it can be a minimum of 1/3 and a maximum of 2/3 + // Note these are the bounds of liveness. 1/3 is the minimum + // honest stake needed to maintain liveness on a chain, + // requiring more than 2/3 to sign over the new header would + // break the BFT threshold of allowing 1/3 malicious validators + Fraction trust_level = 2; + // duration of the period since the LatestTimestamp during which the + // submitted headers are valid for update + google.protobuf.Duration trusting_period = 3; + // duration of the staking unbonding period + google.protobuf.Duration unbonding_period = 4; + // defines how much new (untrusted) header's Time can drift + // into the future relative to our local clock. + google.protobuf.Duration max_clock_drift = 5; + + // Block height when the client was frozen due to a misbehaviour + ibc.core.client.v1.Height frozen_height = 6; + // Latest height the client was updated to + ibc.core.client.v1.Height latest_height = 7; + + // Proof specifications used in verifying counterparty state + repeated cosmos.ics23.v1.ProofSpec proof_specs = 8; + + // Path at which next upgraded client will be committed. + // Each element corresponds to the key for a single CommitmentProof in the + // chained proof. NOTE: ClientState must stored under + // `{upgradePath}/{upgradeHeight}/clientState` ConsensusState must be stored + // under `{upgradepath}/{upgradeHeight}/consensusState` For SDK chains using + // the default upgrade module, upgrade_path should be []string{"upgrade", + // "upgradedIBCState"}` + repeated string upgrade_path = 9; +} +``` + +```proto +message ConsensusState { + // timestamp that corresponds to the block height in which the ConsensusState + // was stored. + google.protobuf.Timestamp timestamp = 1; + // commitment root (i.e app hash) that will be used + // to verify proofs of packet flow messages + ibc.core.commitment.v1.MerkleRoot root = 2; + // hash of the next validator set that will be used as + // a new updated source of trust to verify future updates + bytes next_validators_hash = 3; +} +``` + +## Updates + +Once the initial client state and consensus state are submitted, future consensus states can be added to the client by submitting IBC [headers](https://github.com/cosmos/ibc-go/blob/v9.0.0-beta.1/proto/ibc/lightclients/tendermint/v1/tendermint.proto#L76-L94). These headers contain all necessary information to run the CometBFT light client protocol. + +```proto +message Header { + // this is the new signed header that we want to add + // as a new consensus state to the ibc client. + // the signed header contains the commit signatures of the `validator_set` below + .tendermint.types.SignedHeader signed_header = 1; + + // the validator set which signed the new header + .tendermint.types.ValidatorSet validator_set = 2; + // the trusted height of the consensus state which we are updating from + ibc.core.client.v1.Height trusted_height = 3; + // the trusted validator set, the hash of the trusted validators must be equal to + // `next_validators_hash` of the current consensus state + .tendermint.types.ValidatorSet trusted_validators = 4; +} +``` + +For detailed information on the CometBFT light client protocol and its safety properties please refer to the [original Tendermint whitepaper](https://arxiv.org/abs/1807.04938). + +## Proofs + +As consensus states are added to the client, they can be used for proof verification by relayers wishing to prove packet flow messages against a particular height on the counterparty. This uses the `VerifyMembership` and `VerifyNonMembership` methods on the Tendermint client. + +```go +// VerifyMembership is a generic proof verification method +//which verifies a proof of the existence of a value at a +// given CommitmentPath at the specified height. The caller +// is expected to construct the full CommitmentPath from a +// CommitmentPrefix and a standardized path (as defined in ICS 24). +VerifyMembership( + ctx sdk.Context, + clientID string, + 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, + clientID string, + height Height, + delayTimePeriod uint64, + delayBlockPeriod uint64, + proof []byte, + path Path, +) error +``` + +The Tendermint client is initialized with an ICS23 proof spec. This allows the Tendermint implementation to support many different merkle tree structures so long as they can be represented in an [`ics23.ProofSpec`](https://github.com/cosmos/ics23/blob/go/v0.10.0/proto/cosmos/ics23/v1/proofs.proto#L145-L170). + +## Misbehaviour + +The Tendermint light client directly tracks consensus of a CometBFT counterparty chain. So long as the counterparty is Byzantine Fault Tolerant, that is to say, the malicious subset of the bonded validators does not exceed the trust level of the client, then the client is secure. + +In case the malicious subset of the validators exceeds the trust level of the client, then the client can be deceived into accepting invalid blocks and the connection is no longer secure. + +The Tendermint client has some mitigations in place to prevent this. If there are two valid blocks signed by the counterparty validator set at the same height [e.g. a valid block signed by an honest subset and an invalid block signed by a malicious one], then these conflicting headers can be submitted to the client as [misbehaviour](https://github.com/cosmos/ibc-go/blob/v9.0.0-beta.1/proto/ibc/lightclients/tendermint/v1/tendermint.proto#L65-L74). The client will verify the headers and freeze the client; preventing any future updates and proof verification from succeeding. This effectively halts communication with the compromised counterparty while out-of-band social consensus can unwind any damage done. + +Similarly, if the timestamps of the headers are not monotonically increasing, this can also be evidence of malicious behaviour and cause the client to freeze. + +Thus, any consensus faults that are detectable by a light client are part of the misbehaviour protocol and can be used to minimize the damage caused by a compromised counterparty chain. + +### Security model + +It is important to note that IBC is not a completely trustless protocol; it is **trust-minimized**. This means that the safety property of bilateral IBC communication between two chains is dependent on the safety properties of the two chains in question. If one of the chains is compromised completely, then the IBC connection to the other chain is liable to receive invalid packets from the malicious chain. For example, if a malicious validator set has taken over more than 2/3 of the validator power on a chain; that malicious validator set can create a single chain of blocks with arbitrary commitment roots and arbitrary commitments to the next validator set. This would seize complete control of the chain and prevent the honest subset from even being able to create a competing honest block. + +In this case, there is no ability for the IBC Tendermint client solely tracking CometBFT consensus to detect the misbehaviour and freeze the client. The IBC protocol would require out-of-band mechanisms to detect and fix such an egregious safety fault on the counterparty chain. Since the Tendermint light client is only tracking consensus and not also verifying the validity of state transitions, malicious behaviour from a validator set that is beyond the BFT fault threshold is an accepted risk of this light client implementation. + +The IBC protocol has principles of fault isolation (e.g. all tokens are prefixed by their channel, so tokens from different chains are not mutually fungible) and fault mitigation (e.g. ability to freeze the client if misbehaviour can be detected before complete malicious takeover) that make this risk as minimal as possible. diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/05-tendermint/_category_.json b/docs/versioned_docs/version-v9.0.x/03-light-clients/05-tendermint/_category_.json new file mode 100644 index 00000000000..e7c0c00613c --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/05-tendermint/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Tendermint", + "position": 5, + "link": null + } diff --git a/docs/versioned_docs/version-v9.0.x/03-light-clients/_category_.json b/docs/versioned_docs/version-v9.0.x/03-light-clients/_category_.json new file mode 100644 index 00000000000..8e1f221f353 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/03-light-clients/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "IBC Light Clients", + "position": 3, + "link": null +} \ No newline at end of file diff --git a/docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/01-overview.md b/docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/01-overview.md new file mode 100644 index 00000000000..c4b4a3e80e7 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/01-overview.md @@ -0,0 +1,55 @@ +--- +title: Overview +sidebar_label: Overview +sidebar_position: 1 +slug: /middleware/ics29-fee/overview +--- + +# Overview + +:::note Synopsis +Learn about what the Fee Middleware module is, and how to build custom modules that utilize the Fee Middleware functionality +::: + +## What is the Fee Middleware module? + +IBC does not depend on relayer operators for transaction verification. However, the relayer infrastructure ensures liveness of the Interchain network — operators listen for packets sent through channels opened between chains, and perform the vital service of ferrying these packets (and proof of the transaction on the sending chain/receipt on the receiving chain) to the clients on each side of the channel. + +Though relaying is permissionless and completely decentralized and accessible, it does come with operational costs. Running full nodes to query transaction proofs and paying for transaction fees associated with IBC packets are two of the primary cost burdens which have driven the overall discussion on **a general, in-protocol incentivization mechanism for relayers**. + +Initially, a [simple proposal](https://github.com/cosmos/ibc/pull/577/files) was created to incentivize relaying on ICS20 token transfers on the destination chain. However, the proposal was specific to ICS20 token transfers and would have to be reimplemented in this format on every other IBC application module. + +After much discussion, the proposal was expanded to a [general incentivisation design](https://github.com/cosmos/ibc/tree/master/spec/app/ics-029-fee-payment) that can be adopted by any ICS application protocol as [middleware](../../01-ibc/04-middleware/02-develop.md). + +## Concepts + +ICS29 fee payments in this middleware design are built on the assumption that sender chains are the source of incentives — the chain on which packets are incentivized is the chain that distributes fees to relayer operators. However, as part of the IBC packet flow, messages have to be submitted on both sender and destination chains. This introduces the requirement of a mapping of relayer operator's addresses on both chains. + +To achieve the stated requirements, the **fee middleware module has two main groups of functionality**: + +- Registering of relayer addresses associated with each party involved in relaying the packet on the source chain. This registration process can be automated on start up of relayer infrastructure and happens only once, not every packet flow. + + This is described in the [Fee distribution section](04-fee-distribution.md). + +- Escrowing fees by any party which will be paid out to each rightful party on completion of the packet lifecycle. + + This is described in the [Fee messages section](03-msgs.md). + +We complete the introduction by giving a list of definitions of relevant terminology. + +`Forward relayer`: The relayer that submits the `MsgRecvPacket` message for a given packet (on the destination chain). + +`Reverse relayer`: The relayer that submits the `MsgAcknowledgement` message for a given packet (on the source chain). + +`Timeout relayer`: The relayer that submits the `MsgTimeout` or `MsgTimeoutOnClose` messages for a given packet (on the source chain). + +`Payee`: The account address on the source chain to be paid on completion of the packet lifecycle. The packet lifecycle on the source chain completes with the receipt of a `MsgTimeout`/`MsgTimeoutOnClose` or a `MsgAcknowledgement`. + +`Counterparty payee`: The account address to be paid on completion of the packet lifecycle on the destination chain. The package lifecycle on the destination chain completes with a successful `MsgRecvPacket`. + +`Refund address`: The address of the account paying for the incentivization of packet relaying. The account is refunded timeout fees upon successful acknowledgement. In the event of a packet timeout, both acknowledgement and receive fees are refunded. + +## Known Limitations + +- At the time of the release of the feature (ibc-go v4) fee payments middleware only supported incentivisation of new channels; however, with the release of channel upgradeability (ibc-go v8.1) it is possible to enable incentivisation of all existing channels. +- Even though unlikely, there exists a DoS attack vector on a fee-enabled channel if 1) there exists a relayer software implementation that is incentivised to timeout packets if the timeout fee is greater than the sum of the fees to receive and acknowledge the packet, and 2) only this type of implementation is used by operators relaying on the channel. In this situation, an attacker could continuously incentivise the relayers to never deliver the packets by incrementing the timeout fee of the packets above the sum of the receive and acknowledge fees. However, this situation is unlikely to occur because 1) another relayer behaving honestly could relay the packets before they timeout, and 2) the attack would be costly because the attacker would need to incentivise the timeout fee of the packets with their own funds. Given the low impact and unlikelihood of the attack we have decided to accept this risk and not implement any mitigation mesaures. diff --git a/docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/02-integration.md b/docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/02-integration.md new file mode 100644 index 00000000000..343e09fb11e --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/02-integration.md @@ -0,0 +1,177 @@ +--- +title: Integration +sidebar_label: Integration +sidebar_position: 2 +slug: /middleware/ics29-fee/integration +--- + +# Integration + +:::note Synopsis +Learn how to configure the Fee Middleware module with IBC applications. The following document is intended for developers building on top of the Cosmos SDK and only applies for Cosmos SDK chains. +::: + +:::note + +## Pre-requisite Readings + +- [IBC middleware development](../../01-ibc/04-middleware/02-develop.md) +- [IBC middleware integration](../../01-ibc/04-middleware/03-integration.md) + +::: + +The Fee Middleware module, as the name suggests, plays the role of an IBC middleware and as such must be configured by chain developers to route and handle IBC messages correctly. +For Cosmos SDK chains this setup is done via the `app/app.go` file, where modules are constructed and configured in order to bootstrap the blockchain application. + +## Example integration of the Fee Middleware module + +```go +// app.go + +// Register the AppModule for the fee middleware module +ModuleBasics = module.NewBasicManager( + ... + ibcfee.AppModuleBasic{}, + ... +) + +... + +// Add module account permissions for the fee middleware module +maccPerms = map[string][]string{ + ... + ibcfeetypes.ModuleName: nil, +} + +... + +// Add fee middleware Keeper +type App struct { + ... + + IBCFeeKeeper ibcfeekeeper.Keeper + + ... +} + +... + +// Create store keys +keys := sdk.NewKVStoreKeys( + ... + ibcfeetypes.StoreKey, + ... +) + +... + +app.IBCFeeKeeper = ibcfeekeeper.NewKeeper( + appCodec, keys[ibcfeetypes.StoreKey], + app.IBCKeeper.ChannelKeeper, // may be replaced with IBC middleware + app.IBCKeeper.ChannelKeeper, + &app.IBCKeeper.PortKeeper, app.AccountKeeper, app.BankKeeper, +) + + +// See the section below for configuring an application stack with the fee middleware module + +... + +// Register fee middleware AppModule +app.moduleManager = module.NewManager( + ... + ibcfee.NewAppModule(app.IBCFeeKeeper), +) + +... + +// Add fee middleware to begin blocker logic +app.moduleManager.SetOrderBeginBlockers( + ... + ibcfeetypes.ModuleName, + ... +) + +// Add fee middleware to end blocker logic +app.moduleManager.SetOrderEndBlockers( + ... + ibcfeetypes.ModuleName, + ... +) + +// Add fee middleware to init genesis logic +app.moduleManager.SetOrderInitGenesis( + ... + ibcfeetypes.ModuleName, + ... +) +``` + +## Configuring an application stack with Fee Middleware + +As mentioned in [IBC middleware development](../../01-ibc/04-middleware/02-develop.md) an application stack may be composed of many or no middlewares that nest a base application. +These layers form the complete set of application logic that enable developers to build composable and flexible IBC application stacks. +For example, an application stack may be just a single base application like `transfer`, however, the same application stack composed with `29-fee` will nest the `transfer` base application +by wrapping it with the Fee Middleware module. + +### Transfer + +See below for an example of how to create an application stack using `transfer` and `29-fee`. +The following `transferStack` is configured in `app/app.go` and added to the IBC `Router`. +The in-line comments describe the execution flow of packets between the application stack and IBC core. + +```go +// Create Transfer Stack +// SendPacket, since it is originating from the application to core IBC: +// transferKeeper.SendPacket -> fee.SendPacket -> channel.SendPacket + +// RecvPacket, message that originates from core IBC and goes down to app, the flow is the other way +// channel.RecvPacket -> fee.OnRecvPacket -> transfer.OnRecvPacket + +// transfer stack contains (from top to bottom): +// - IBC Fee Middleware +// - Transfer + +// create IBC module from bottom to top of stack +var transferStack porttypes.IBCModule +transferStack = transfer.NewIBCModule(app.TransferKeeper) +transferStack = ibcfee.NewIBCMiddleware(transferStack, app.IBCFeeKeeper) + +// Add transfer stack to IBC Router +ibcRouter.AddRoute(ibctransfertypes.ModuleName, transferStack) +``` + +### Interchain Accounts + +See below for an example of how to create an application stack using `27-interchain-accounts` and `29-fee`. +The following `icaControllerStack` and `icaHostStack` are configured in `app/app.go` and added to the IBC `Router` with the associated authentication module. +The in-line comments describe the execution flow of packets between the application stack and IBC core. + +```go +// Create Interchain Accounts Stack +// SendPacket, since it is originating from the application to core IBC: +// icaAuthModuleKeeper.SendTx -> icaController.SendPacket -> fee.SendPacket -> channel.SendPacket + +// initialize ICA module with mock module as the authentication module on the controller side +var icaControllerStack porttypes.IBCModule +icaControllerStack = ibcmock.NewIBCModule(&mockModule, ibcmock.NewMockIBCApp("", scopedICAMockKeeper)) +app.ICAAuthModule = icaControllerStack.(ibcmock.IBCModule) +icaControllerStack = icacontroller.NewIBCMiddleware(icaControllerStack, app.ICAControllerKeeper) +icaControllerStack = ibcfee.NewIBCMiddleware(icaControllerStack, app.IBCFeeKeeper) + +// RecvPacket, message that originates from core IBC and goes down to app, the flow is: +// channel.RecvPacket -> fee.OnRecvPacket -> icaHost.OnRecvPacket + +var icaHostStack porttypes.IBCModule +icaHostStack = icahost.NewIBCModule(app.ICAHostKeeper) +icaHostStack = ibcfee.NewIBCMiddleware(icaHostStack, app.IBCFeeKeeper) + +// Add authentication module, controller and host to IBC router +ibcRouter. + // the ICA Controller middleware needs to be explicitly added to the IBC Router because the + // ICA controller module owns the port capability for ICA. The ICA authentication module + // owns the channel capability. + AddRoute(ibcmock.ModuleName+icacontrollertypes.SubModuleName, icaControllerStack) // ica with mock auth module stack route to ica (top level of middleware stack) + AddRoute(icacontrollertypes.SubModuleName, icaControllerStack). + AddRoute(icahosttypes.SubModuleName, icaHostStack). +``` diff --git a/docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/03-msgs.md b/docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/03-msgs.md new file mode 100644 index 00000000000..c9fe1df563b --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/03-msgs.md @@ -0,0 +1,97 @@ +--- +title: Fee Messages +sidebar_label: Fee Messages +sidebar_position: 3 +slug: /middleware/ics29-fee/msgs +--- + +# Fee messages + +:::note Synopsis +Learn about the different ways to pay for fees, how the fees are paid out and what happens when not enough escrowed fees are available for payout +::: + +## Escrowing fees + +The fee middleware module exposes two different ways to pay fees for relaying IBC packets: + +### `MsgPayPacketFee` + +`MsgPayPacketFee` enables the escrowing of fees for a packet at the next sequence send and should be combined into one `MultiMsgTx` with the message that will be paid for. Note that the `Relayers` field has been set up to allow for an optional whitelist of relayers permitted to receive this fee, however, this feature has not yet been enabled at this time. + +```go +type MsgPayPacketFee struct{ + // fee encapsulates the recv, ack and timeout fees associated with an IBC packet + Fee Fee + // the source port unique identifier + SourcePortId string + // the source channel unique identifier + SourceChannelId string + // account address to refund fee if necessary + Signer string + // optional list of relayers permitted to the receive packet fee + Relayers []string +} +``` + +The `Fee` message contained in this synchronous fee payment method configures different fees which will be paid out for `MsgRecvPacket`, `MsgAcknowledgement`, and `MsgTimeout`/`MsgTimeoutOnClose`. +The amount of fees escrowed in total is the denomwise maximum of `RecvFee + AckFee` and `TimeoutFee`. This is because we do not know whether the packet will be successfully received and acknowledged or whether it will timeout. + +```go +type Fee struct { + RecvFee types.Coins + AckFee types.Coins + TimeoutFee types.Coins +} +``` + +The diagram below shows the `MultiMsgTx` with the `MsgTransfer` coming from a token transfer message, along with `MsgPayPacketFee`. + +![msgpaypacket.png](./images/msgpaypacket.png) + +### `MsgPayPacketFeeAsync` + +`MsgPayPacketFeeAsync` enables the asynchronous escrowing of fees for a specified packet. Note that a packet can be 'topped up' multiple times with additional fees of any coin denomination by broadcasting multiple `MsgPayPacketFeeAsync` messages. + +```go +type MsgPayPacketFeeAsync struct { + // unique packet identifier comprised of the channel ID, port ID and sequence + PacketId channeltypes.PacketId + // the packet fee associated with a particular IBC packet + PacketFee PacketFee +} +``` + +where the `PacketFee` also specifies the `Fee` to be paid as well as the refund address for fees which are not paid out + +```go +type PacketFee struct { + Fee Fee + RefundAddress string + Relayers []string +} +``` + +The diagram below shows how multiple `MsgPayPacketFeeAsync` can be broadcasted asynchronously. Escrowing of the fee associated with a packet can be carried out by any party because ICS-29 does not dictate a particular fee payer. In fact, chains can choose to simply not expose this fee payment to end users at all and rely on a different module account or even the community pool as the source of relayer incentives. + +![paypacketfeeasync.png](./images/paypacketfeeasync.png) + +Please see our [wiki](https://github.com/cosmos/ibc-go/wiki/Fee-enabled-fungible-token-transfers) for example flows on how to use these messages to incentivise a token transfer channel using a CLI. + +## Paying out the escrowed fees + +Following diagram takes a look at the packet flow for an incentivized token transfer and investigates the several scenario's for paying out the escrowed fees. We assume that the relayers have registered their counterparty address, detailed in the [Fee distribution section](04-fee-distribution.md). + +![feeflow.png](./images/feeflow.png) + +- In the case of a successful transaction, `RecvFee` will be paid out to the designated counterparty payee address which has been registered on the receiver chain and sent back with the `MsgAcknowledgement`, `AckFee` will be paid out to the relayer address which has submitted the `MsgAcknowledgement` on the sending chain (or the registered payee in case one has been registered for the relayer address), and the remaining fees (if any) will be reimbursed to the account which escrowed the fee. (The reimbursed amount equals `EscrowedAmount - (RecvFee + AckFee)`). + +- In case of a timeout transaction, the `TimeoutFee` will be paid to the `Timeout Relayer` (who submits the timeout message to the source chain), and the remaining fees (if any) will be reimbursed to the account which escrowed the fee. (The reimbursed amount equals `EscrowedAmount - (TimeoutFee)`). + +> Please note that fee payments are built on the assumption that sender chains are the source of incentives — the chain that sends the packets is the same chain where fee payments will occur -- please see the [Fee distribution section](04-fee-distribution.md) to understand the flow for registering payee and counterparty payee (fee receiving) addresses. + +## A locked fee middleware module + +The fee middleware module can become locked if the situation arises that the escrow account for the fees does not have sufficient funds to pay out the fees which have been escrowed for each packet. *This situation indicates a severe bug.* In this case, the fee module will be locked until manual intervention fixes the issue. + +> A locked fee module will simply skip fee logic and continue on to the underlying packet flow. A channel with a locked fee module will temporarily function as a fee disabled channel, and the locking of a fee module will not affect the continued flow of packets over the channel. diff --git a/docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/04-fee-distribution.md b/docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/04-fee-distribution.md new file mode 100644 index 00000000000..a2f4c286276 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/04-fee-distribution.md @@ -0,0 +1,117 @@ +--- +title: Fee Distribution +sidebar_label: Fee Distribution +sidebar_position: 4 +slug: /middleware/ics29-fee/fee-distribution +--- + +# Fee distribution + +:::note Synopsis +Learn about payee registration for the distribution of packet fees. The following document is intended for relayer operators. +::: + +:::note + +## Pre-requisite readings + +- [Fee Middleware](01-overview.md) + +::: + +Packet fees are divided into 3 distinct amounts in order to compensate relayer operators for packet relaying on fee enabled IBC channels. + +- `RecvFee`: The sum of all packet receive fees distributed to a payee for successful execution of `MsgRecvPacket`. +- `AckFee`: The sum of all packet acknowledgement fees distributed to a payee for successful execution of `MsgAcknowledgement`. +- `TimeoutFee`: The sum of all packet timeout fees distributed to a payee for successful execution of `MsgTimeout`. + +## Register a counterparty payee address for forward relaying + +As mentioned in [ICS29 Concepts](01-overview.md#concepts), the forward relayer describes the actor who performs the submission of `MsgRecvPacket` on the destination chain. +Fee distribution for incentivized packet relays takes place on the packet source chain. + +> Relayer operators are expected to register a counterparty payee address, in order to be compensated accordingly with `RecvFee`s upon completion of a packet lifecycle. + +The counterparty payee address registered on the destination chain is encoded into the packet acknowledgement and communicated as such to the source chain for fee distribution. +**If a counterparty payee is not registered for the forward relayer on the destination chain, the escrowed fees will be refunded upon fee distribution.** + +### Relayer operator actions + +A transaction must be submitted **to the destination chain** including a `CounterpartyPayee` address of an account on the source chain. +The transaction must be signed by the `Relayer`. + +Note: If a module account address is used as the `CounterpartyPayee` but the module has been set as a blocked address in the `BankKeeper`, the refunding to the module account will fail. This is because many modules use invariants to compare internal tracking of module account balances against the actual balance of the account stored in the `BankKeeper`. If a token transfer to the module account occurs without going through this module and updating the account balance of the module on the `BankKeeper`, then invariants may break and unknown behaviour could occur depending on the module implementation. Therefore, if it is desirable to use a module account that is currently blocked, the module developers should be consulted to gauge to possibility of removing the module account from the blocked list. + +```go +type MsgRegisterCounterpartyPayee struct { + // unique port identifier + PortId string + // unique channel identifier + ChannelId string + // the relayer address + Relayer string + // the counterparty payee address + CounterpartyPayee string +} +``` + +> This message is expected to fail if: +> +> - `PortId` is invalid (see [24-host naming requirements](https://github.com/cosmos/ibc/blob/master/spec/core/ics-024-host-requirements/README.md#paths-identifiers-separators). +> - `ChannelId` is invalid (see [24-host naming requirements](https://github.com/cosmos/ibc/blob/master/spec/core/ics-024-host-requirements/README.md#paths-identifiers-separators)). +> - `Relayer` is an invalid address (see [Cosmos SDK Addresses](https://github.com/cosmos/cosmos-sdk/blob/main/docs/learn/beginner/03-accounts.md#addresses)). +> - `CounterpartyPayee` is empty or contains more than 2048 bytes. + +See below for an example CLI command: + +```bash +simd tx ibc-fee register-counterparty-payee transfer channel-0 \ + cosmos1rsp837a4kvtgp2m4uqzdge0zzu6efqgucm0qdh \ + osmo1v5y0tz01llxzf4c2afml8s3awue0ymju22wxx2 \ + --from cosmos1rsp837a4kvtgp2m4uqzdge0zzu6efqgucm0qdh +``` + +## Register an alternative payee address for reverse and timeout relaying + +As mentioned in [ICS29 Concepts](01-overview.md#concepts), the reverse relayer describes the actor who performs the submission of `MsgAcknowledgement` on the source chain. +Similarly the timeout relayer describes the actor who performs the submission of `MsgTimeout` (or `MsgTimeoutOnClose`) on the source chain. + +> Relayer operators **may choose** to register an optional payee address, in order to be compensated accordingly with `AckFee`s and `TimeoutFee`s upon completion of a packet life cycle. + +If a payee is not registered for the reverse or timeout relayer on the source chain, then fee distribution assumes the default behaviour, where fees are paid out to the relayer account which delivers `MsgAcknowledgement` or `MsgTimeout`/`MsgTimeoutOnClose`. + +### Relayer operator actions + +A transaction must be submitted **to the source chain** including a `Payee` address of an account on the source chain. +The transaction must be signed by the `Relayer`. + +Note: If a module account address is used as the `Payee` it is recommended to [turn off invariant checks](https://github.com/cosmos/ibc-go/blob/v7.0.0/testing/simapp/app.go#L727) for that module. + +```go +type MsgRegisterPayee struct { + // unique port identifier + PortId string + // unique channel identifier + ChannelId string + // the relayer address + Relayer string + // the payee address + Payee string +} +``` + +> This message is expected to fail if: +> +> - `PortId` is invalid (see [24-host naming requirements](https://github.com/cosmos/ibc/blob/master/spec/core/ics-024-host-requirements/README.md#paths-identifiers-separators). +> - `ChannelId` is invalid (see [24-host naming requirements](https://github.com/cosmos/ibc/blob/master/spec/core/ics-024-host-requirements/README.md#paths-identifiers-separators)). +> - `Relayer` is an invalid address (see [Cosmos SDK Addresses](https://github.com/cosmos/cosmos-sdk/blob/main/docs/learn/beginner/03-accounts.md#addresses)). +> - `Payee` is an invalid address (see [Cosmos SDK Addresses](https://github.com/cosmos/cosmos-sdk/blob/main/docs/learn/beginner/03-accounts.md#addresses)). + +See below for an example CLI command: + +```bash +simd tx ibc-fee register-payee transfer channel-0 \ + cosmos1rsp837a4kvtgp2m4uqzdge0zzu6efqgucm0qdh \ + cosmos153lf4zntqt33a4v0sm5cytrxyqn78q7kz8j8x5 \ + --from cosmos1rsp837a4kvtgp2m4uqzdge0zzu6efqgucm0qdh +``` diff --git a/docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/05-events.md b/docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/05-events.md new file mode 100644 index 00000000000..adb814143a9 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/05-events.md @@ -0,0 +1,43 @@ +--- +title: Events +sidebar_label: Events +sidebar_position: 5 +slug: /middleware/ics29-fee/events +--- + + +# Events + +:::note Synopsis +An overview of all events related to ICS-29 +::: + +## `MsgPayPacketFee`, `MsgPayPacketFeeAsync` + +| Type | Attribute Key | Attribute Value | +| ----------------------- | --------------- | --------------- | +| incentivized_ibc_packet | port_id | \{portID\} | +| incentivized_ibc_packet | channel_id | \{channelID\} | +| incentivized_ibc_packet | packet_sequence | \{sequence\} | +| incentivized_ibc_packet | recv_fee | \{recvFee\} | +| incentivized_ibc_packet | ack_fee | \{ackFee\} | +| incentivized_ibc_packet | timeout_fee | \{timeoutFee\} | +| message | module | fee-ibc | + +## `RegisterPayee` + +| Type | Attribute Key | Attribute Value | +| -------------- | ------------- | --------------- | +| register_payee | relayer | \{relayer\} | +| register_payee | payee | \{payee\} | +| register_payee | channel_id | \{channelID\} | +| message | module | fee-ibc | + +## `RegisterCounterpartyPayee` + +| Type | Attribute Key | Attribute Value | +| --------------------------- | ------------------ | --------------------- | +| register_counterparty_payee | relayer | \{relayer\} | +| register_counterparty_payee | counterparty_payee | \{counterpartyPayee\} | +| register_counterparty_payee | channel_id | \{channelID\} | +| message | module | fee-ibc | diff --git a/docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/06-end-users.md b/docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/06-end-users.md new file mode 100644 index 00000000000..f3985cc0358 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/06-end-users.md @@ -0,0 +1,39 @@ +--- +title: End Users +sidebar_label: End Users +sidebar_position: 6 +slug: /middleware/ics29-fee/end-users +--- + +# For end users + +:::note Synopsis +Learn how to incentivize IBC packets using the ICS29 Fee Middleware module. +::: + +:::note + +## Pre-requisite readings + +- [Fee Middleware](01-overview.md) + +::: + +## Summary + +Different types of end users: + +- CLI users who want to manually incentivize IBC packets +- Client developers + +The Fee Middleware module allows end users to add a 'tip' to each IBC packet which will incentivize relayer operators to relay packets between chains. gRPC endpoints are exposed for client developers as well as a simple CLI for manually incentivizing IBC packets. + +## CLI Users + +For an in depth guide on how to use the ICS29 Fee Middleware module using the CLI please take a look at the [wiki](https://github.com/cosmos/ibc-go/wiki/Fee-enabled-fungible-token-transfers#asynchronous-incentivization-of-a-fungible-token-transfer) on the `ibc-go` repo. + +## Client developers + +Client developers can read more about the relevant ICS29 message types in the [Fee messages section](03-msgs.md). + +[CosmJS](https://github.com/cosmos/cosmjs) is a useful client library for signing and broadcasting Cosmos SDK messages. diff --git a/docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/_category_.json b/docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/_category_.json new file mode 100644 index 00000000000..ddca8d29da6 --- /dev/null +++ b/docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Fee Middleware", + "position": 1, + "link": null +} \ No newline at end of file diff --git a/docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/images/feeflow.png b/docs/versioned_docs/version-v9.0.x/04-middleware/01-ics29-fee/images/feeflow.png new file mode 100644 index 0000000000000000000000000000000000000000..ba02071f4d8e8132ac527c279cf32da9d9dbe24d GIT binary patch literal 394717 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