From 73bb779e87442c13da2d70110fa9e83d85ecfcfe Mon Sep 17 00:00:00 2001 From: unknown unknown Date: Tue, 27 Aug 2024 14:41:49 +0200 Subject: [PATCH 1/9] bump ibc --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 16a799e0..a082bab3 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/cosmos/cosmos-sdk v0.50.7 github.com/cosmos/gogoproto v1.4.12 github.com/cosmos/ibc-go/modules/capability v1.0.0 - github.com/cosmos/ibc-go/v8 v8.3.2 + github.com/cosmos/ibc-go/v8 v8.4.0 github.com/dvsekhvalnov/jose2go v1.6.0 github.com/gogo/protobuf v1.3.2 github.com/golang/protobuf v1.5.4 diff --git a/go.sum b/go.sum index fffc5f70..889a9625 100644 --- a/go.sum +++ b/go.sum @@ -980,8 +980,8 @@ github.com/cosmos/iavl v1.1.2 h1:zL9FK7C4L/P4IF1Dm5fIwz0WXCnn7Bp1M2FxH0ayM7Y= github.com/cosmos/iavl v1.1.2/go.mod h1:jLeUvm6bGT1YutCaL2fIar/8vGUE8cPZvh/gXEWDaDM= github.com/cosmos/ibc-go/modules/capability v1.0.0 h1:r/l++byFtn7jHYa09zlAdSeevo8ci1mVZNO9+V0xsLE= github.com/cosmos/ibc-go/modules/capability v1.0.0/go.mod h1:D81ZxzjZAe0ZO5ambnvn1qedsFQ8lOwtqicG6liLBco= -github.com/cosmos/ibc-go/v8 v8.3.2 h1:8X1oHHKt2Bh9hcExWS89rntLaCKZp2EjFTUSxKlPhGI= -github.com/cosmos/ibc-go/v8 v8.3.2/go.mod h1:WVVIsG39jGrF9Cjggjci6LzySyWGloz194sjTxiGNIE= +github.com/cosmos/ibc-go/v8 v8.4.0 h1:K2PfX0AZ+1XKZytHGEMuSjQXG/MZshPb83RSTQt2+cE= +github.com/cosmos/ibc-go/v8 v8.4.0/go.mod h1:zh6x1osR0hNvEcFrC/lhGD08sMfQmr9wHVvZ/mRWMCs= github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= github.com/cosmos/ledger-cosmos-go v0.13.3 h1:7ehuBGuyIytsXbd4MP43mLeoN2LTOEnk5nvue4rK+yM= From 399a7cb32c2a26114b973f0a2584f7496c215aaa Mon Sep 17 00:00:00 2001 From: unknown unknown Date: Tue, 27 Aug 2024 14:48:06 +0200 Subject: [PATCH 2/9] add EstimateCallbackFees to whitelisted stargate queries --- app/app.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/app.go b/app/app.go index 0fb66514..7c391231 100644 --- a/app/app.go +++ b/app/app.go @@ -676,7 +676,7 @@ func NewArchwayApp( var icaControllerStack porttypes.IBCModule icaControllerStack = cwica.NewIBCModule(app.Keepers.CWICAKeeper) icaControllerStack = icacontroller.NewIBCMiddleware(icaControllerStack, app.Keepers.ICAControllerKeeper) - //icaControllerStack = ibcfee.NewIBCMiddleware(icaControllerStack, app.Keepers.IBCFeeKeeper) + // icaControllerStack = ibcfee.NewIBCMiddleware(icaControllerStack, app.Keepers.IBCFeeKeeper) // RecvPacket, message that originates from core IBC and goes down to app, the flow is: // channel.RecvPacket -> fee.OnRecvPacket -> icaHost.OnRecvPacket @@ -1203,6 +1203,7 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino func getAcceptedStargateQueries() wasmdKeeper.AcceptedStargateQueries { return wasmdKeeper.AcceptedStargateQueries{ - "/archway.cwerrors.v1.Query/Errors": &cwerrorsTypes.QueryErrorsRequest{}, + "/archway.cwerrors.v1.Query/Errors": &cwerrorsTypes.QueryErrorsRequest{}, + "/archway.callback.v1.Query/EstimateCallbackFees": &callbackTypes.QueryEstimateCallbackFeesRequest{}, } } From dfe17eac1bd0ad1e25904a53a5a505d6c83f2c0b Mon Sep 17 00:00:00 2001 From: unknown unknown Date: Tue, 27 Aug 2024 15:47:55 +0200 Subject: [PATCH 3/9] add ibc hooks --- app/app.go | 13 +++++++++++++ app/keepers/keepers.go | 2 ++ go.mod | 11 +++++++---- go.sum | 10 ++++++---- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/app/app.go b/app/app.go index 7c391231..8ea0f844 100644 --- a/app/app.go +++ b/app/app.go @@ -98,6 +98,9 @@ import ( stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/cosmos/gogoproto/proto" + ibchooks "github.com/cosmos/ibc-apps/modules/ibc-hooks/v8" + ibchookskeeper "github.com/cosmos/ibc-apps/modules/ibc-hooks/v8/keeper" + ibchookstypes "github.com/cosmos/ibc-apps/modules/ibc-hooks/v8/types" "github.com/cosmos/ibc-go/modules/capability" capabilitykeeper "github.com/cosmos/ibc-go/modules/capability/keeper" capabilitytypes "github.com/cosmos/ibc-go/modules/capability/types" @@ -211,6 +214,7 @@ var ( ibc.AppModuleBasic{}, ibccm.AppModuleBasic{}, ibcfee.AppModuleBasic{}, + ibchooks.AppModuleBasic{}, upgrade.AppModuleBasic{}, evidence.AppModuleBasic{}, transfer.AppModuleBasic{}, @@ -327,6 +331,7 @@ func NewArchwayApp( govtypes.StoreKey, paramstypes.StoreKey, ibcexported.StoreKey, upgradetypes.StoreKey, evidencetypes.StoreKey, ibctransfertypes.StoreKey, capabilitytypes.StoreKey, feegrant.StoreKey, authzkeeper.StoreKey, wasmdTypes.StoreKey, consensusparamtypes.StoreKey, + ibchookstypes.StoreKey, icacontrollertypes.StoreKey, icahosttypes.StoreKey, ibcfeetypes.StoreKey, crisistypes.StoreKey, group.StoreKey, nftkeeper.StoreKey, cwicatypes.StoreKey, trackingTypes.StoreKey, rewardsTypes.StoreKey, callbackTypes.StoreKey, cwfees.ModuleName, cwerrorsTypes.StoreKey, @@ -667,9 +672,14 @@ func NewArchwayApp( logger, ) + app.Keepers.IBCHooksKeeper = ibchookskeeper.NewKeeper(keys[ibchookstypes.StoreKey]) + ics20WasmHooks := ibchooks.NewWasmHooks(&app.Keepers.IBCHooksKeeper, nil, Bech32Prefix) + hooksIcs4Wrapper := ibchooks.NewICS4Middleware(app.Keepers.IBCKeeper.ChannelKeeper, ics20WasmHooks) + var transferStack porttypes.IBCModule transferStack = transfer.NewIBCModule(app.Keepers.TransferKeeper) transferStack = ibcfee.NewIBCMiddleware(transferStack, app.Keepers.IBCFeeKeeper) + transferStack = ibchooks.NewIBCMiddleware(transferStack, &hooksIcs4Wrapper) // Create Interchain Accounts Stack @@ -797,6 +807,7 @@ func NewArchwayApp( ibcfeetypes.ModuleName, icatypes.ModuleName, // wasm + ibchookstypes.ModuleName, wasmdTypes.ModuleName, ) @@ -826,6 +837,7 @@ func NewArchwayApp( vestingtypes.ModuleName, consensusparamtypes.ModuleName, // wasm + ibchookstypes.ModuleName, wasmdTypes.ModuleName, // wasm gas tracking trackingTypes.ModuleName, @@ -870,6 +882,7 @@ func NewArchwayApp( ibcfeetypes.ModuleName, icatypes.ModuleName, // wasm after ibc transfer + ibchookstypes.ModuleName, wasmdTypes.ModuleName, // wasm gas tracking cwfees.ModuleName, // depends on wasmd. diff --git a/app/keepers/keepers.go b/app/keepers/keepers.go index 0f2471b6..02b8de2f 100644 --- a/app/keepers/keepers.go +++ b/app/keepers/keepers.go @@ -22,6 +22,7 @@ import ( "github.com/archway-network/archway/x/cwfees" + ibchookskeeper "github.com/cosmos/ibc-apps/modules/ibc-hooks/v8/keeper" icacontrollerkeeper "github.com/cosmos/ibc-go/v8/modules/apps/27-interchain-accounts/controller/keeper" icahostkeeper "github.com/cosmos/ibc-go/v8/modules/apps/27-interchain-accounts/host/keeper" ibcfeekeeper "github.com/cosmos/ibc-go/v8/modules/apps/29-fee/keeper" @@ -52,6 +53,7 @@ type ArchwayKeepers struct { ConsensusParamsKeeper consensusparamkeeper.Keeper IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly IBCFeeKeeper ibcfeekeeper.Keeper + IBCHooksKeeper ibchookskeeper.Keeper ICAControllerKeeper icacontrollerkeeper.Keeper ICAHostKeeper icahostkeeper.Keeper EvidenceKeeper evidencekeeper.Keeper diff --git a/go.mod b/go.mod index a082bab3..3e71c7e7 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/archway-network/archway -go 1.21 +go 1.22 + +toolchain go1.23.0 require ( cosmossdk.io/api v0.7.5 @@ -18,13 +20,14 @@ require ( cosmossdk.io/x/tx v0.13.3 cosmossdk.io/x/upgrade v0.1.2 github.com/CosmWasm/cosmwasm-go v0.5.1-0.20220822092235-974247a04ac7 - github.com/CosmWasm/wasmd v0.50.0 + github.com/CosmWasm/wasmd v0.51.0 github.com/CosmWasm/wasmvm v1.5.4 github.com/cometbft/cometbft v0.38.10 github.com/cosmos/cosmos-db v1.0.2 github.com/cosmos/cosmos-proto v1.0.0-beta.5 github.com/cosmos/cosmos-sdk v0.50.7 github.com/cosmos/gogoproto v1.4.12 + github.com/cosmos/ibc-apps/modules/ibc-hooks/v8 v8.0.0-20240820215527-05462618a4e8 github.com/cosmos/ibc-go/modules/capability v1.0.0 github.com/cosmos/ibc-go/v8 v8.4.0 github.com/dvsekhvalnov/jose2go v1.6.0 @@ -53,7 +56,7 @@ require ( cosmossdk.io/depinject v1.0.0-alpha.4 // indirect filippo.io/edwards25519 v1.0.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect - github.com/99designs/keyring v1.2.1 // indirect + github.com/99designs/keyring v1.2.2 // indirect github.com/CosmWasm/tinyjson v0.9.0 // indirect github.com/DataDog/datadog-go v3.2.0+incompatible // indirect github.com/DataDog/zstd v1.5.5 // indirect @@ -74,7 +77,7 @@ require ( github.com/cockroachdb/pebble v1.1.0 // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect - github.com/cometbft/cometbft-db v0.9.1 // indirect + github.com/cometbft/cometbft-db v0.11.0 // indirect github.com/cosmos/btcutil v1.0.5 // indirect github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect diff --git a/go.sum b/go.sum index 889a9625..eff71861 100644 --- a/go.sum +++ b/go.sum @@ -802,8 +802,8 @@ gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zum git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= -github.com/99designs/keyring v1.2.1 h1:tYLp1ULvO7i3fI5vE21ReQuj99QFSs7lGm0xWyJo87o= -github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= +github.com/99designs/keyring v1.2.2 h1:pZd3neh/EmUzWONb35LxQfvuY7kiSXAq3HQd97+XBn0= +github.com/99designs/keyring v1.2.2/go.mod h1:wes/FrByc8j7lFOAGLGSNEg8f/PaI3cgTBqhFkHUrPk= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= @@ -951,8 +951,8 @@ github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1: github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/cometbft/cometbft v0.38.10 h1:2ePuglchT+j0Iao+cfmt/nw5U7K2lnGDzXSUPGVdXaU= github.com/cometbft/cometbft v0.38.10/go.mod h1:jHPx9vQpWzPHEAiYI/7EDKaB1NXhK6o3SArrrY8ExKc= -github.com/cometbft/cometbft-db v0.9.1 h1:MIhVX5ja5bXNHF8EYrThkG9F7r9kSfv8BX4LWaxWJ4M= -github.com/cometbft/cometbft-db v0.9.1/go.mod h1:iliyWaoV0mRwBJoizElCwwRA9Tf7jZJOURcRZF9m60U= +github.com/cometbft/cometbft-db v0.11.0 h1:M3Lscmpogx5NTbb1EGyGDaFRdsoLWrUWimFEyf7jej8= +github.com/cometbft/cometbft-db v0.11.0/go.mod h1:GDPJAC/iFHNjmZZPN8V8C1yr/eyityhi2W1hz2MGKSc= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -978,6 +978,8 @@ github.com/cosmos/gogoproto v1.4.12 h1:vB6Lbe/rtnYGjQuFxkPiPYiCybqFT8QvLipDZP8Jp github.com/cosmos/gogoproto v1.4.12/go.mod h1:LnZob1bXRdUoqMMtwYlcR3wjiElmlC+FkjaZRv1/eLY= github.com/cosmos/iavl v1.1.2 h1:zL9FK7C4L/P4IF1Dm5fIwz0WXCnn7Bp1M2FxH0ayM7Y= github.com/cosmos/iavl v1.1.2/go.mod h1:jLeUvm6bGT1YutCaL2fIar/8vGUE8cPZvh/gXEWDaDM= +github.com/cosmos/ibc-apps/modules/ibc-hooks/v8 v8.0.0-20240820215527-05462618a4e8 h1:n9Gn7E7g9ZxrAdXRAfHe3xOF5HmLnvdDUVgq3ea2IZw= +github.com/cosmos/ibc-apps/modules/ibc-hooks/v8 v8.0.0-20240820215527-05462618a4e8/go.mod h1:9+Z14xz3Y+5uEn5i1CvLcDN1aTthEhYUdI7pphySkY8= github.com/cosmos/ibc-go/modules/capability v1.0.0 h1:r/l++byFtn7jHYa09zlAdSeevo8ci1mVZNO9+V0xsLE= github.com/cosmos/ibc-go/modules/capability v1.0.0/go.mod h1:D81ZxzjZAe0ZO5ambnvn1qedsFQ8lOwtqicG6liLBco= github.com/cosmos/ibc-go/v8 v8.4.0 h1:K2PfX0AZ+1XKZytHGEMuSjQXG/MZshPb83RSTQt2+cE= From 3f9c4567b51533af7d09d285f4f33e0c55e05dd0 Mon Sep 17 00:00:00 2001 From: unknown unknown Date: Tue, 27 Aug 2024 15:52:38 +0200 Subject: [PATCH 4/9] chore: CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ac4efaf..258929db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,7 @@ Contains all the PRs that improved the code without changing the behaviors. ### Added - [#577](https://github.com/archway-network/archway/pull/577) - Adding a cute ascii art of Archway for the cli +- [#588](https://github.com/archway-network/archway/pull/588) - Add IBC hooks, bump IBC, allows contracts to query callback fee estimations. ### Changed - [#573](https://github.com/archway-network/archway/pull/573) - Bump cosmos-sdk to v0.50.6 and ibc to v8.2.1 From 2da246cac1813f9fe503d0585d163ae13c4d32a1 Mon Sep 17 00:00:00 2001 From: unknown unknown Date: Tue, 27 Aug 2024 15:55:48 +0200 Subject: [PATCH 5/9] minor lint --- cmd/archwayd/main.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/cmd/archwayd/main.go b/cmd/archwayd/main.go index 434afd11..37e1a5a8 100644 --- a/cmd/archwayd/main.go +++ b/cmd/archwayd/main.go @@ -14,14 +14,14 @@ import ( ) const ArchwayASCII = ` - ##### ##### ##### ## ## ## ## ##### ## ## -####### ####### ####### ## ## ## ## ####### ## ## -## ## ## ## ## ## ## ## # ## ## ## ## ## -## ## ###### ## #### ## ####### ## ## #### -####### ## ## ## ## ## ## ####### ####### ## -## ## ## ## ####### ## ## ### ### ## ## ## -## ## ## ## ##### ## ## ## ## ## ## ## - + ##### ##### ##### ## ## ## ## ##### ## ## +####### ####### ####### ## ## ## ## ####### ## ## +## ## ## ## ## ## ## ## # ## ## ## ## ## +## ## ###### ## #### ## ####### ## ## #### +####### ## ## ## ## ## ## ####### ####### ## +## ## ## ## ####### ## ## ### ### ## ## ## +## ## ## ## ##### ## ## ## ## ## ## ## + ` func main() { @@ -30,7 +30,7 @@ func main() { rootCmd.AddCommand(ensureLibWasmVM()) if err := svrcmd.Execute(rootCmd, "ARCHWAY", app.DefaultNodeHome); err != nil { - fmt.Fprintln(rootCmd.OutOrStderr(), err) + _, _ = fmt.Fprintln(rootCmd.OutOrStderr(), err) os.Exit(1) } } From f994046d509a2c25738e4115f21509589b17b3b6 Mon Sep 17 00:00:00 2001 From: unknown unknown Date: Tue, 27 Aug 2024 16:34:10 +0200 Subject: [PATCH 6/9] add ibc hooks testing --- e2e/ibchooks/ibchooks_test.go | 433 +++++++++++++++++++++++++++++ e2e/ibchooks/mocks/mocks.go | 43 +++ e2e/ibchooks/setup.go | 210 ++++++++++++++ e2e/ibchooks/testdata/counter.wasm | Bin 0 -> 177529 bytes e2e/ibchooks/testdata/echo.wasm | Bin 0 -> 138325 bytes 5 files changed, 686 insertions(+) create mode 100644 e2e/ibchooks/ibchooks_test.go create mode 100644 e2e/ibchooks/mocks/mocks.go create mode 100644 e2e/ibchooks/setup.go create mode 100644 e2e/ibchooks/testdata/counter.wasm create mode 100644 e2e/ibchooks/testdata/echo.wasm diff --git a/e2e/ibchooks/ibchooks_test.go b/e2e/ibchooks/ibchooks_test.go new file mode 100644 index 00000000..a28cb296 --- /dev/null +++ b/e2e/ibchooks/ibchooks_test.go @@ -0,0 +1,433 @@ +package ibchooks + +import ( + _ "embed" + "encoding/json" + "fmt" + "testing" + + wasmKeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" + "github.com/archway-network/archway/app" + ibc_hooks "github.com/cosmos/ibc-apps/modules/ibc-hooks/v8" + ibchookskeeper "github.com/cosmos/ibc-apps/modules/ibc-hooks/v8/keeper" + "github.com/cosmos/ibc-apps/modules/ibc-hooks/v8/tests/unit/mocks" + "github.com/stretchr/testify/suite" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth/types" + + capabilitytypes "github.com/cosmos/ibc-go/modules/capability/types" + ibctransfer "github.com/cosmos/ibc-go/v8/modules/apps/transfer" + transfertypes "github.com/cosmos/ibc-go/v8/modules/apps/transfer/types" + ibcclienttypes "github.com/cosmos/ibc-go/v8/modules/core/02-client/types" + channeltypes "github.com/cosmos/ibc-go/v8/modules/core/04-channel/types" + ibcmock "github.com/cosmos/ibc-go/v8/testing/mock" +) + +//go:embed testdata/counter.wasm +var counterWasm []byte + +//go:embed testdata/echo.wasm +var echoWasm []byte + +type HooksTestSuite struct { + suite.Suite + + App *app.ArchwayApp + Ctx sdk.Context + EchoContractAddr sdk.AccAddress + CounterContractAddr sdk.AccAddress + TestAddress *types.BaseAccount +} + +func TestIBCHooksTestSuite(t *testing.T) { + suite.Run(t, new(HooksTestSuite)) +} + +func (suite *HooksTestSuite) SetupEnv() { + // Setup the environment + app, ctx, acc := Setup(suite.T()) + + // create the echo contract + contractKeeper := wasmKeeper.NewDefaultPermissionKeeper(&app.Keepers.WASMKeeper) + contractID, _, err := contractKeeper.Create(ctx, acc.GetAddress(), counterWasm, nil) + suite.NoError(err) + counterContractAddr, _, err := contractKeeper.Instantiate( + ctx, + contractID, + acc.GetAddress(), + nil, + []byte(`{"count": 0}`), + "counter contract", + nil, + ) + suite.NoError(err) + suite.Equal("cosmos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4hmalr", counterContractAddr.String()) + + // create the counter contract + contractID, _, err = contractKeeper.Create(ctx, acc.GetAddress(), echoWasm, nil) + suite.NoError(err) + echoContractAddr, _, err := contractKeeper.Instantiate( + ctx, + contractID, + acc.GetAddress(), + nil, + []byte(`{}`), + "echo contract", + nil, + ) + suite.NoError(err) + suite.Equal("cosmos1nc5tatafv6eyq7llkr2gv50ff9e22mnf70qgjlv737ktmt4eswrqez7la9", echoContractAddr.String()) + + suite.App = app + suite.Ctx = ctx + suite.EchoContractAddr = echoContractAddr + suite.CounterContractAddr = counterContractAddr + suite.TestAddress = acc +} + +func (suite *HooksTestSuite) TestOnRecvPacketEcho() { + // create en env + suite.SetupEnv() + + // Create the packet + recvPacket := channeltypes.Packet{ + Data: transfertypes.FungibleTokenPacketData{ + Denom: "transfer/channel-0/stake", + Amount: "1", + Sender: suite.TestAddress.GetAddress().String(), + Receiver: suite.EchoContractAddr.String(), + Memo: fmt.Sprintf(`{"wasm":{"contract": "%s", "msg":{"echo":{"msg":"test"}}}}`, suite.EchoContractAddr.String()), + }.GetBytes(), + SourcePort: "transfer", + SourceChannel: "channel-0", + } + + // send funds to the escrow address to simulate a transfer from the ibc module + escrowAddress := transfertypes.GetEscrowAddress(recvPacket.GetDestPort(), recvPacket.GetDestChannel()) + testEscrowAmount := sdk.NewInt64Coin("stake", 2) + err := suite.App.Keepers.BankKeeper.SendCoins(suite.Ctx, suite.TestAddress.GetAddress(), escrowAddress, sdk.NewCoins(testEscrowAmount)) + suite.NoError(err) + + // since ibc-go >= 7.1.0 escrow needs to be explicitly tracked + if transferKeeper, ok := any(&suite.App.Keepers.TransferKeeper).(TransferKeeperWithTotalEscrowTracking); ok { + transferKeeper.SetTotalEscrowForDenom(suite.Ctx, testEscrowAmount) + } + + // create the wasm hooks + wasmHooks := ibc_hooks.NewWasmHooks( + &suite.App.Keepers.IBCHooksKeeper, + &suite.App.Keepers.WASMKeeper, + "cosmos", + ) + + // create the ics4 middleware + ics4Middleware := ibc_hooks.NewICS4Middleware( + suite.App.Keepers.IBCKeeper.ChannelKeeper, + wasmHooks, + ) + + // create the ibc middleware + transferIBCModule := ibctransfer.NewIBCModule(suite.App.Keepers.TransferKeeper) + ibcmiddleware := ibc_hooks.NewIBCMiddleware( + transferIBCModule, + &ics4Middleware, + ) + + // call the hook twice + res := ibcmiddleware.OnRecvPacket( + suite.Ctx, + recvPacket, + suite.TestAddress.GetAddress(), + ) + suite.True(res.Success()) + var ack map[string]string // This can't be unmarshalled to Acknowledgement because it's fetched from the events + err = json.Unmarshal(res.Acknowledgement(), &ack) + suite.Require().NoError(err) + suite.Require().NotContains(ack, "error") + suite.Require().Equal(ack["result"], "eyJjb250cmFjdF9yZXN1bHQiOiJkR2hwY3lCemFHOTFiR1FnWldOb2J3PT0iLCJpYmNfYWNrIjoiZXlKeVpYTjFiSFFpT2lKQlVUMDlJbjA9In0=") +} + +func (suite *HooksTestSuite) TestOnRecvPacketCounterContract() { + // create en env + suite.SetupEnv() + + // Create the packet + recvPacket := channeltypes.Packet{ + Data: transfertypes.FungibleTokenPacketData{ + Denom: "transfer/channel-0/stake", + Amount: "1", + Sender: suite.TestAddress.GetAddress().String(), + Receiver: suite.CounterContractAddr.String(), + Memo: fmt.Sprintf(`{"wasm":{"contract": "%s", "msg":{"increment":{}}}}`, suite.CounterContractAddr.String()), + }.GetBytes(), + SourcePort: "transfer", + SourceChannel: "channel-0", + } + + // send funds to the escrow address to simulate a transfer from the ibc module + escrowAddress := transfertypes.GetEscrowAddress(recvPacket.GetDestPort(), recvPacket.GetDestChannel()) + testEscrowAmount := sdk.NewInt64Coin("stake", 2) + err := suite.App.Keepers.BankKeeper.SendCoins(suite.Ctx, suite.TestAddress.GetAddress(), escrowAddress, sdk.NewCoins(testEscrowAmount)) + suite.NoError(err) + + // since ibc-go >= 7.1.0 escrow needs to be explicitly tracked + if transferKeeper, ok := any(&suite.App.Keepers.TransferKeeper).(TransferKeeperWithTotalEscrowTracking); ok { + transferKeeper.SetTotalEscrowForDenom(suite.Ctx, testEscrowAmount) + } + + // create the wasm hooks + wasmHooks := ibc_hooks.NewWasmHooks( + &suite.App.Keepers.IBCHooksKeeper, + &suite.App.Keepers.WASMKeeper, + "cosmos", + ) + + // create the ics4 middleware + ics4Middleware := ibc_hooks.NewICS4Middleware( + suite.App.Keepers.IBCKeeper.ChannelKeeper, + wasmHooks, + ) + + // create the ibc middleware + transferIBCModule := ibctransfer.NewIBCModule(suite.App.Keepers.TransferKeeper) + ibcmiddleware := ibc_hooks.NewIBCMiddleware( + transferIBCModule, + &ics4Middleware, + ) + + // call the hook twice + res := ibcmiddleware.OnRecvPacket( + suite.Ctx, + recvPacket, + suite.TestAddress.GetAddress(), + ) + suite.True(res.Success()) + res = ibcmiddleware.OnRecvPacket( + suite.Ctx, + recvPacket, + suite.TestAddress.GetAddress(), + ) + suite.True(res.Success()) + + // get the derived account to check the count + senderBech32, err := ibchookskeeper.DeriveIntermediateSender( + recvPacket.GetDestChannel(), + suite.TestAddress.GetAddress().String(), + "cosmos", + ) + suite.NoError(err) + // query the smart contract to assert the count + count, err := suite.App.Keepers.WASMKeeper.QuerySmart( + suite.Ctx, + suite.CounterContractAddr, + []byte(fmt.Sprintf(`{"get_count":{"addr": "%s"}}`, senderBech32)), + ) + suite.NoError(err) + suite.Equal(`{"count":1}`, string(count)) +} + +func (suite *HooksTestSuite) TestOnAcknowledgementPacketCounterContract() { + suite.SetupEnv() + + callbackPacket := channeltypes.Packet{ + Data: transfertypes.FungibleTokenPacketData{ + Denom: "transfer/channel-0/stake", + Amount: "1", + Sender: suite.TestAddress.GetAddress().String(), + Receiver: suite.CounterContractAddr.String(), + Memo: fmt.Sprintf(`{"ibc_callback": "%s"}`, suite.CounterContractAddr), + }.GetBytes(), + Sequence: 1, + SourcePort: "transfer", + SourceChannel: "channel-0", + } + + // send funds to the escrow address to simulate a transfer from the ibc module + escrowAddress := transfertypes.GetEscrowAddress(callbackPacket.GetDestPort(), callbackPacket.GetDestChannel()) + testEscrowAmount := sdk.NewInt64Coin("stake", 2) + err := suite.App.Keepers.BankKeeper.SendCoins(suite.Ctx, suite.TestAddress.GetAddress(), escrowAddress, sdk.NewCoins(testEscrowAmount)) + suite.NoError(err) + + // since ibc-go >= 7.1.0 escrow needs to be explicitly tracked + if transferKeeper, ok := any(&suite.App.Keepers.TransferKeeper).(TransferKeeperWithTotalEscrowTracking); ok { + transferKeeper.SetTotalEscrowForDenom(suite.Ctx, testEscrowAmount) + } + + // create the wasm hooks + wasmHooks := ibc_hooks.NewWasmHooks( + &suite.App.Keepers.IBCHooksKeeper, + &suite.App.Keepers.WASMKeeper, + "cosmos", + ) + + // create the ics4 middleware + ics4Middleware := ibc_hooks.NewICS4Middleware( + &mocks.ICS4WrapperMock{}, + wasmHooks, + ) + + // create the ibc middleware + transferIBCModule := ibctransfer.NewIBCModule(suite.App.Keepers.TransferKeeper) + ibcmiddleware := ibc_hooks.NewIBCMiddleware( + transferIBCModule, + &ics4Middleware, + ) + + // call the hook + seq, err := ibcmiddleware.SendPacket( + suite.Ctx, + &capabilitytypes.Capability{Index: 1}, + callbackPacket.SourcePort, + callbackPacket.SourceChannel, + ibcclienttypes.Height{ + RevisionNumber: 1, + RevisionHeight: 1, + }, + 1, + callbackPacket.Data, + ) + + // require to be the first sequence + suite.Equal(uint64(1), seq) + // assert the request was successful + suite.NoError(err) + + // Create the packet + recvPacket := channeltypes.Packet{ + Data: transfertypes.FungibleTokenPacketData{ + Denom: "transfer/channel-0/stake", + Amount: "1", + Sender: suite.TestAddress.GetAddress().String(), + Receiver: suite.CounterContractAddr.String(), + Memo: fmt.Sprintf(`{"wasm":{"contract": "%s", "msg":{"increment":{}}}}`, suite.CounterContractAddr.String()), + }.GetBytes(), + Sequence: 1, + SourcePort: "transfer", + SourceChannel: "channel-0", + } + suite.NoError(err) + err = wasmHooks.OnAcknowledgementPacketOverride( + ibcmiddleware, + suite.Ctx, + recvPacket, + ibcmock.MockAcknowledgement.Acknowledgement(), + suite.TestAddress.GetAddress(), + ) + // assert the request was successful + suite.NoError(err) + + // query the smart contract to assert the count + count, err := suite.App.Keepers.WASMKeeper.QuerySmart( + suite.Ctx, + suite.CounterContractAddr, + []byte(fmt.Sprintf(`{"get_count":{"addr": %q}}`, suite.CounterContractAddr.String())), + ) + suite.NoError(err) + suite.Equal(`{"count":1}`, string(count)) +} + +func (suite *HooksTestSuite) TestOnTimeoutPacketOverrideCounterContract() { + suite.SetupEnv() + callbackPacket := channeltypes.Packet{ + Data: transfertypes.FungibleTokenPacketData{ + Denom: "transfer/channel-0/stake", + Amount: "1", + Sender: suite.TestAddress.GetAddress().String(), + Receiver: suite.CounterContractAddr.String(), + Memo: fmt.Sprintf(`{"ibc_callback": "%s"}`, suite.CounterContractAddr), + }.GetBytes(), + Sequence: 1, + SourcePort: "transfer", + SourceChannel: "channel-0", + } + + // send funds to the escrow address to simulate a transfer from the ibc module + escrowAddress := transfertypes.GetEscrowAddress(callbackPacket.GetDestPort(), callbackPacket.GetDestChannel()) + testEscrowAmount := sdk.NewInt64Coin("stake", 2) + err := suite.App.Keepers.BankKeeper.SendCoins(suite.Ctx, suite.TestAddress.GetAddress(), escrowAddress, sdk.NewCoins(testEscrowAmount)) + suite.NoError(err) + + // since ibc-go >= 7.1.0 escrow needs to be explicitly tracked + if transferKeeper, ok := any(&suite.App.Keepers.TransferKeeper).(TransferKeeperWithTotalEscrowTracking); ok { + transferKeeper.SetTotalEscrowForDenom(suite.Ctx, testEscrowAmount) + } + + // create the wasm hooks + wasmHooks := ibc_hooks.NewWasmHooks( + &suite.App.Keepers.IBCHooksKeeper, + &suite.App.Keepers.WASMKeeper, + "cosmos", + ) + + // create the ics4 middleware + ics4Middleware := ibc_hooks.NewICS4Middleware( + &mocks.ICS4WrapperMock{}, + wasmHooks, + ) + + // create the ibc middleware + transferIBCModule := ibctransfer.NewIBCModule(suite.App.Keepers.TransferKeeper) + ibcmiddleware := ibc_hooks.NewIBCMiddleware( + transferIBCModule, + &ics4Middleware, + ) + + // call the hook + seq, err := ibcmiddleware.SendPacket( + suite.Ctx, + &capabilitytypes.Capability{Index: 1}, + callbackPacket.SourcePort, + callbackPacket.SourceChannel, + ibcclienttypes.Height{ + RevisionNumber: 1, + RevisionHeight: 1, + }, + 1, + callbackPacket.Data, + ) + + // require to be the first sequence + suite.Equal(uint64(1), seq) + // assert the request was successful + suite.NoError(err) + + // Create the packet + recvPacket := channeltypes.Packet{ + Data: transfertypes.FungibleTokenPacketData{ + Denom: "transfer/channel-0/stake", + Amount: "1", + Sender: suite.TestAddress.GetAddress().String(), + Receiver: suite.CounterContractAddr.String(), + Memo: fmt.Sprintf(`{"wasm":{"contract": "%s", "msg":{"increment":{}}}}`, suite.CounterContractAddr.String()), + }.GetBytes(), + Sequence: 1, + SourcePort: "transfer", + SourceChannel: "channel-0", + } + suite.NoError(err) + err = wasmHooks.OnTimeoutPacketOverride( + ibcmiddleware, + suite.Ctx, + recvPacket, + suite.TestAddress.GetAddress(), + ) + // assert the request was successful + suite.NoError(err) + + // query the smart contract to assert the count + count, err := suite.App.Keepers.WASMKeeper.QuerySmart( + suite.Ctx, + suite.CounterContractAddr, + []byte(fmt.Sprintf(`{"get_count":{"addr": %q}}`, suite.CounterContractAddr.String())), + ) + suite.NoError(err) + suite.Equal(`{"count":10}`, string(count)) +} + +// TransferKeeperWithTotalEscrowTracking defines an interface to check for existing methods +// in TransferKeeper. +type TransferKeeperWithTotalEscrowTracking interface { + SetTotalEscrowForDenom(ctx sdk.Context, coin sdk.Coin) + GetTotalEscrowForDenom(ctx sdk.Context, denom string) sdk.Coin +} diff --git a/e2e/ibchooks/mocks/mocks.go b/e2e/ibchooks/mocks/mocks.go new file mode 100644 index 00000000..7d5bbddf --- /dev/null +++ b/e2e/ibchooks/mocks/mocks.go @@ -0,0 +1,43 @@ +package mocks + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + + capabilitytypes "github.com/cosmos/ibc-go/modules/capability/types" + ibcclienttypes "github.com/cosmos/ibc-go/v8/modules/core/02-client/types" + porttypes "github.com/cosmos/ibc-go/v8/modules/core/05-port/types" + "github.com/cosmos/ibc-go/v8/modules/core/exported" +) + +var _ porttypes.ICS4Wrapper = &ICS4WrapperMock{} + +type ICS4WrapperMock struct{} + +func (m *ICS4WrapperMock) SendPacket( + ctx sdk.Context, + chanCap *capabilitytypes.Capability, + sourcePort string, + sourceChannel string, + timeoutHeight ibcclienttypes.Height, + timeoutTimestamp uint64, + data []byte, +) (sequence uint64, err error) { + return 1, nil +} + +func (m *ICS4WrapperMock) WriteAcknowledgement( + ctx sdk.Context, + chanCap *capabilitytypes.Capability, + packet exported.PacketI, + ack exported.Acknowledgement, +) error { + return nil +} + +func (m *ICS4WrapperMock) GetAppVersion( + ctx sdk.Context, + portID, + channelID string, +) (string, bool) { + return "", false +} diff --git a/e2e/ibchooks/setup.go b/e2e/ibchooks/setup.go new file mode 100644 index 00000000..207641dc --- /dev/null +++ b/e2e/ibchooks/setup.go @@ -0,0 +1,210 @@ +package ibchooks + +import ( + "encoding/json" + "fmt" + "testing" + "time" + + "cosmossdk.io/log" + sdkmath "cosmossdk.io/math" + wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" + "github.com/archway-network/archway/app" + abci "github.com/cometbft/cometbft/abci/types" + cmttypes "github.com/cometbft/cometbft/types" + dbm "github.com/cosmos/cosmos-db" + "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + "github.com/cosmos/cosmos-sdk/server" + simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" + sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/cosmos/ibc-go/v8/testing/mock" + "github.com/stretchr/testify/require" +) + +type App = app.ArchwayApp + +// Setup initializes a new SimApp. A Nop logger is set in SimApp. +func Setup(t *testing.T, opts ...wasmkeeper.Option) (*App, sdk.Context, *authtypes.BaseAccount) { + t.Helper() + + privVal := mock.NewPV() + pubKey, err := privVal.GetPubKey() + require.NoError(t, err) + + // create validator set with single validator + validator := cmttypes.NewValidator(pubKey, 1) + valSet := cmttypes.NewValidatorSet([]*cmttypes.Validator{validator}) + + // generate genesis account + senderPrivKey := secp256k1.GenPrivKey() + acc := authtypes.NewBaseAccount(senderPrivKey.PubKey().Address().Bytes(), senderPrivKey.PubKey(), 0, 0) + balance := banktypes.Balance{ + Address: acc.GetAddress().String(), + Coins: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdkmath.NewInt(100000000000000))), + } + chainID := "testing" + + app := SetupWithGenesisValSet(t, valSet, []authtypes.GenesisAccount{acc}, chainID, opts, balance) + + ctx := app.BaseApp.NewContext(false) + ctx = ctx.WithBlockTime(time.Now()) + + return app, ctx, acc +} + +// SetupWithGenesisValSet initializes a new App with a validator set and genesis accounts +// that also act as delegators. For simplicity, each validator is bonded with a delegation +// of one consensus engine unit in the default token of the App from first genesis +// account. A Nop logger is set in App. +func SetupWithGenesisValSet( + t *testing.T, + valSet *cmttypes.ValidatorSet, + genAccs []authtypes.GenesisAccount, + chainID string, + opts []wasmkeeper.Option, + balances ...banktypes.Balance, +) *app.ArchwayApp { + t.Helper() + + app, genesisState := setup(t, chainID, true, 5) + genesisState, err := GenesisStateWithValSet(app.AppCodec(), genesisState, valSet, genAccs, balances...) + require.NoError(t, err) + + stateBytes, err := json.MarshalIndent(genesisState, "", " ") + require.NoError(t, err) + + // init chain will set the validator set and initialize the genesis accounts + consensusParams := simtestutil.DefaultConsensusParams + consensusParams.Block.MaxGas = 100 * simtestutil.DefaultGenTxGas + _, err = app.InitChain(&abci.RequestInitChain{ + ChainId: chainID, + Time: time.Now().UTC(), + Validators: []abci.ValidatorUpdate{}, + ConsensusParams: consensusParams, + InitialHeight: app.LastBlockHeight() + 1, + AppStateBytes: stateBytes, + }) + require.NoError(t, err) + + _, err = app.FinalizeBlock(&abci.RequestFinalizeBlock{ + Height: app.LastBlockHeight() + 1, + Hash: app.LastCommitID().Hash, + NextValidatorsHash: valSet.Hash(), + }) + require.NoError(t, err) + + return app +} + +// initSetup initializes a new SimApp. A Nop logger is set in SimApp. +func setup(t *testing.T, chainID string, withGenesis bool, invCheckPeriod uint) (*app.ArchwayApp, map[string]json.RawMessage) { + appOptions := make(simtestutil.AppOptionsMap) + appOptions[flags.FlagHome] = app.DefaultNodeHome + appOptions[server.FlagInvCheckPeriod] = invCheckPeriod + + archApp := app.NewArchwayApp( + log.NewNopLogger(), + dbm.NewMemDB(), + nil, + true, map[int64]bool{}, + app.DefaultNodeHome, + 1, + app.MakeEncodingConfig(), + app.EmptyBaseAppOptions{}, + []wasmkeeper.Option{}, + baseapp.SetChainID(chainID), + ) + if withGenesis { + return archApp, app.NewDefaultGenesisState(archApp.AppCodec()) + } + return archApp, map[string]json.RawMessage{} +} + +// GenesisStateWithValSet returns a new genesis state with the validator set +// copied from simtestutil with delegation not added to supply +func GenesisStateWithValSet( + codec codec.Codec, + genesisState map[string]json.RawMessage, + valSet *cmttypes.ValidatorSet, + genAccs []authtypes.GenesisAccount, + balances ...banktypes.Balance, +) (map[string]json.RawMessage, error) { + // set genesis accounts + authGenesis := authtypes.NewGenesisState(authtypes.DefaultParams(), genAccs) + genesisState[authtypes.ModuleName] = codec.MustMarshalJSON(authGenesis) + + validators := make([]stakingtypes.Validator, 0, len(valSet.Validators)) + delegations := make([]stakingtypes.Delegation, 0, len(valSet.Validators)) + + bondAmt := sdk.DefaultPowerReduction + + for _, val := range valSet.Validators { + pk, err := cryptocodec.FromCmtPubKeyInterface(val.PubKey) + if err != nil { + return nil, fmt.Errorf("failed to convert pubkey: %w", err) + } + + pkAny, err := codectypes.NewAnyWithValue(pk) + if err != nil { + return nil, fmt.Errorf("failed to create new any: %w", err) + } + + validator := stakingtypes.Validator{ + OperatorAddress: sdk.ValAddress(val.Address).String(), + ConsensusPubkey: pkAny, + Jailed: false, + Status: stakingtypes.Bonded, + Tokens: bondAmt, + DelegatorShares: sdkmath.LegacyOneDec(), + Description: stakingtypes.Description{}, + UnbondingHeight: int64(0), + UnbondingTime: time.Unix(0, 0).UTC(), + Commission: stakingtypes.NewCommission(sdkmath.LegacyZeroDec(), sdkmath.LegacyZeroDec(), sdkmath.LegacyZeroDec()), + MinSelfDelegation: sdkmath.ZeroInt(), + } + validators = append(validators, validator) + delegations = append(delegations, stakingtypes.NewDelegation(genAccs[0].GetAddress().String(), sdk.ValAddress(val.Address).String(), sdkmath.LegacyOneDec())) + + } + + // set validators and delegations + stakingGenesis := stakingtypes.NewGenesisState(stakingtypes.DefaultParams(), validators, delegations) + genesisState[stakingtypes.ModuleName] = codec.MustMarshalJSON(stakingGenesis) + + signingInfos := make([]slashingtypes.SigningInfo, len(valSet.Validators)) + for i, val := range valSet.Validators { + signingInfos[i] = slashingtypes.SigningInfo{ + Address: sdk.ConsAddress(val.Address).String(), + ValidatorSigningInfo: slashingtypes.ValidatorSigningInfo{}, + } + } + slashingGenesis := slashingtypes.NewGenesisState(slashingtypes.DefaultParams(), signingInfos, nil) + genesisState[slashingtypes.ModuleName] = codec.MustMarshalJSON(slashingGenesis) + + // add bonded amount to bonded pool module account + balances = append(balances, banktypes.Balance{ + Address: authtypes.NewModuleAddress(stakingtypes.BondedPoolName).String(), + Coins: sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, bondAmt.MulRaw(int64(len(valSet.Validators))))}, + }) + + totalSupply := sdk.NewCoins() + for _, b := range balances { + // add genesis acc tokens to total supply + totalSupply = totalSupply.Add(b.Coins...) + } + + // update total supply + bankGenesis := banktypes.NewGenesisState(banktypes.DefaultGenesisState().Params, balances, totalSupply, []banktypes.Metadata{}, []banktypes.SendEnabled{}) + genesisState[banktypes.ModuleName] = codec.MustMarshalJSON(bankGenesis) + println(string(genesisState[banktypes.ModuleName])) + return genesisState, nil +} diff --git a/e2e/ibchooks/testdata/counter.wasm b/e2e/ibchooks/testdata/counter.wasm new file mode 100644 index 0000000000000000000000000000000000000000..407509573e89f0485978d34fd508165496cee4d9 GIT binary patch literal 177529 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 Za~7nNNw*8bR&2~xLJi@cv3ap4|364NWDo!V literal 0 HcmV?d00001 diff --git a/e2e/ibchooks/testdata/echo.wasm b/e2e/ibchooks/testdata/echo.wasm new file mode 100644 index 0000000000000000000000000000000000000000..e8a1bdecede1d623fc5ec5df21b71e6d58c4503d GIT binary patch literal 138325 zcmeFa3%q63UFW$U=XLM7k5ezWKn3?XmhqNCTX7ID(ptMF1*8)V+Ng{Z8%QXd+=~P% z1d|?ysw5cEL`6-M*cgeX1vPPK8%G>tcR7s?W79TvXQol3gVWKDpGiB+n6^=)>F@9N zUwfZ(AN7EMk58aJ+_U%EYp=)u{r|83T06V`P2ZYlS(e|MpLJbv>{xzGf3xe#W4_i; zc3rOGoQp2ED(J)y<#%3}W!DW{>?eNj&g*(nl4|mHKUHbkpopq>X4hpi4^?=l+Ar=@ zkKJQ;@?Tc`aIst-x%u|)^{;#5(c7}FuKPEDc=x)H>w;g@MZAY?Pw{w2@ zt#7>j$h7jCUVr_~S<$?D^O3jQ7OyT|f5Qz&uf6^Ho8EB4^}O%qcDRfe-gxsHUeA+% zbR^64X4Jj$&EIBZDx;Gqo-JAbm%w~A&n~xlQ>$R`H z@%lI1%y{oE-dW`QSC(aOp<5JrR%BVX$jV+>cDtD#>A$j{_j|pv*U!rwd@ts6MMe!U zPwl9}->ly&m-4xOznov1pXVKF&>ZAZmK~~PStlQ;E0Ij|--xEmoVrarKuay>dAA#{ z<=q|Gz@7BeS||Qf0oBsYoLcvPyj=Kw>JG}C%Q47a(d+D5&NQ4dTP%2OSTM^h+pU+1 za!=9e=eOkF&%Z9i+tE9xJeJqTkDthf$FllUZ~tZg9)AbF{bO^zZ$0v@Z#??eA{)Np z<~QAT{mr+%LD)a1f8;GkUjJsU&K+ET(@k%Dy$Wxezu`!G^X45#kKFp^Hyl0krfVU$ zqu1Z|#-rIk*!6~+x&D^xUw=eMd(#`#sd>^9^M_y!P4~k6eGt zwXeJWO-IUN?$?=Yoe#e+{}1_Bt(tFZ!8;*R-Kdi?4SMS!N75)EJD~AqMuQPEB{Sy{(b&r{;~Z3&7aQyDF6TR|Crxh zto&jAJ;kT;Kh6Iv|K8%y^H1l0k>69y|MWlYzq9zAq9~3PcYc0WA6TCh`?9L2SJ$e1 zbYEWQU?x?QXF3NylF%o3ZQDFs5(sKJ;k{(h_-7}iRr~a zY$<@Y{w055Cn(;ZH#B;wuy$YGKykZYq482f)>Gi_%R%aIXX{I! z-^qItWGDTvoA;PqSx?rNhRCk;Uzf5i^b-6qH!dN}7hKNe?_`%B<>xQ>S?mW! z3w|JOMgpbiM~F|vC8Aka5-l0-i|Pu*Xp*WqGHG^nxkEJ4O)b{XWU2&_6!l$sqK%?H z9+z~oTHG<_wbkM+i@mBN^2q8v>Wd!Ys>%;9E>z{{p?qOMy_yH3*UG*28u*QY-sK_# zv33Dba`hgrR*MzQM}ynT8!yjp;)V&`2uuo%aNL<;0TD=1eb~iAA z*pObhnwxa%3$Ez!r0N1tuB!fpSqJj&)Sb1uuX%KbbvEu&ki9(1xvToRvIy#FoMqMY zpcV!3XgeQwC6L^ZK@K(gMue&->QS?G;Vu=z>S8+@+#zN|qSSk$Mo!-vMzqKT%l*af zOJIVI>X-FiVTLB$nE1|g&R`KkFVBz*rgH)CEfPu>W^aWo)R-ltkyX_9=4%tcT;FZv zsx`?kP`$rI#NJ~>AlT|XS1b;M$RLe-UH+Cy9%D_|2h+U1zqsR)R!AiJQM;Krcmb&= zF$R`{91fTq`WoNM>OarurXhvZDJiTrq;P>r;p!lTtI~Li`iX39^hF?4a}_z76za}V zQE7cozNX8r2nQe>wuGioG8NUMydbRh=RonG_#!};h8hDkmln0&IvD~OGR)>tEzUQM2Px?ZK7c^mm9|3@}V+IJzlR^d6iYqg)+lkbvN!|`)kP5RPFZh4{W8zrhWPceMtEexeM%WD`nk2H}5cr$>2Y6OCHn!-z)=Wwh5C38-X6JTZ^ZyG#RSJ#ST zF@s?U@TiiHMk>8+yriF7gx}TTrZJ;rvhD-v&kUtQWU)c4#wJDa%1wGjxS&KLh8wUW zal%yaQtHm|eJaoNN=zOgJv{N)_h_|qY6>bU$LmlIO zP=62V?}@&rCSBEQDVwVu7#^)%+_M}LW%mH&c%kZvz`J@wAAz$R!`WA6Z;@iHok zcMeEJ@jIH#>t`X%fx+5%#3(TOyZbVAP|a8KHR^luRroI>Y!?7B*;VJa@!BE}7hiSW zWWHv&b;nnq`OIg&>eg!h^18fj%=5Z?+juvv>|%snQO`g_>sGsXaB;DltC1l*((t;T zCco8g+U^3^(SK8QdG43394DE0l``a%jc#AllZIB!tMO5VcS9dGOlUR?e$8|Ylkq$7 zu-5RZmTiBiF6dt7PkRqam+8N~2ja^NKizA(`I=FZaG`craPfwx#Y4axPeSeZnQiOOFn81tG2$dxI=jAPx~JgpCrrs)&cLJf78Ye#?(;R1ym^2}Q(`BuaOPQo?X+6~PV{ z?3KNPNV#p?)6XsAzJ6{RTL^E`Se`@~n&t7SW|0hf#Z)v)E_Vgefu|O8L6*gB%v9F+ zVy+3}QCu4*HnXwsKgl~>TPjk{pm zOi)V39Z<4R&IJBxIK?oWTHdmun zmIk>^<#C2Iz~UDKc#<{J01dS^#wZre=BC-fVbGjtws2E(5y$!%q;jmIFyTEIqywNV zY)?iNJ;-Jq$gdmA6_?Ta1a+)`1&q-KqqXX^ik&N&tb*%ECac^ru2Aff#GneX)|jj} zaRb0^q!LKxFXqGO0zE&T3xyqd$Ff?_<`TbSyrV881Vg*e{?$8glk?cIJ-AeMN^IC_ zVUgZaBlY(+wr9s4U#I>cPBx;d%rvI`#eKOvMWQu+L&L?j3}ch)d-KNH?9`8Yu)Ge; zg|X)K;!#ZxS$V?xrc3trdMx}%6^#?TI!RV#( zUh}%R93REyKdAB{<@oyx()lh;(|f7xZQ776R4KI3QOKZG&S=0}E-6z0d%&AL=xPWkOzRq-9y>JTZp<}ohvHu2hH0&J4bM{RjI%wS5U7k0hwZoJ$SluU1m{A zKquhV06&0vSyKoc9~Npm$P@X2s{fKh`FQU_KUN9OJCuK&!6y{8_|;WHR9-C`J>n=i z3UnW6V`!R~ah1p?`Vf-(Bi;f%hY`{ILT#!!C9N1YLcu6qOqNYx6F#zA0#QIgauy^< zW{9gBP{V2$4Cf9nE`}M5obYI%|1|0C>0hR*JubBk8?IRRbum1uIe}j8T8J=r{SpZ{ zkLY|!G6g&|{PO|hc>#f-`xf+`Is8TJpp=f){mNvakyj0DrOQqMTd2gqS%|O!pftsA z4@!jAg8N%7UNJ_xtQH5ya{+k+nOVw)Y=lj+z{4~ZzpYA#gk;#q$f4hE<4`bVjPSU{ z2(k0k_JISob6CU?>vyHIX#t$nyr`YSu`qhJB96e$$52T-0p|< z35s}!HOnn(=%F0njo*j!@lNTrM-pacRK2AZi>8vNNhhZ0I$VgPkclA~0c+PC?3h9k zN6Pa0j~t-uhqYs^QJ3Sn`W>(pMk?zeGJE*xj2GRwS4fsS2eIGgBq)etiB*6h`r$Q` zCHa^1g$Q6N4i$beZn+BQ>UoPq+FEKGv*jR#Y@yV1jmuwNwJsOo-b#8+!C-rN&PLCTTS^ zTE~IO3%EgXuYy=i22s-JOQN|0f+f!NtU^<}FPju~d23xVFDe#Hd#T7XL`k<1Zqi^s zDX|r?MEJ6-Kf2LTeDx*8?qD#4ipX(wQnZTc%Bf=dq@L>KWCK_+@$wC!h_4I%1W95O zdxhvaX(xNF?)DQKLxnMBKllpz25!sq4_%}dkH7Olqi7mz_#Erxb!DTI-*HUa1KhJvJ< zSuI{YHm|73mdZuT#1fTgkcM_y8yu0!ya-wu(!Op&^Pn1P-Vl7rd-^%rku?KkU7&tlEjhOV%E4^A+Q> z6pz43cYrh?xAQP=Ty<8&Ov5njNNl=YD0 z0VnD?7W_@EP_<)|swrT*4>yw}R2H697Cf(rua?c>1tERp%YhO;ND=s_WzmTw#5PKz z*^-r{sSXhNBQK>{QcXInh!#R#$2mW>f-oVo!;Z=7FJ50N^Fn4|QRl!^ti=_{V-j~L zNEShO1*c_egXr$!Z?`#wUDkn2DV@4dl22~q+by_Ba7~qLGN^hVzGKp_ z2Hyl5F|t&djvdzQgT>l{2us)P43+mI;fYqxw8o3Mq)8d5IE6xMyy1|~j+bX&$n;s_ zs7(js-%`g?? z7B2cZ&M5HDrtNipRpDKcPB>>sadV*9zQe(ZB!ULo0VqmT`oxs#*D5td<`b zFCoz8L<-QH^Fm=?RbH(^9}C*8M4K*ZptE{V|uT#Cn;o;op;RR}{AX zmA9S9_Gj58NZ4NeOVgW@<*i_rSSJ&UDy7nE{bKhE)(+hx?nj^o_cu17$J{P?+eXwx zG&T!G&$0E(oVsmU7|#*p0;)1e10UF9!P{Icz}uZ95rivow5(J~gbazWog9%w(A=P~ zSZtR3pv{dEAtu?4wrQDUh>!?m)uw?^6cVA3xdXSQ;aP<~*XhiHlfsSISXerx?R;6b|!1T=OOHR_BrQb5B zOpuKE#iE|0mp+zT$;zKEl{~MW_=!=etISa>XG{}n!G9t*9-m!rbZO`c8rn6sXC-bO zcVp(6OfI*h0WiBPT2lAznvQ$3G3NAoseQqA2P2F%ojzBwrju()eSvT>KT1R0DRqpR zL9#!A@Ts%WK8L+2+0m9%{n<=XBBw|QyMU3?i=j*l_LgHU)V|{mi4l9t64tW79o7QS z6#$g`AVU{n)gew*?-8c-NYQDi3VFG|*e4s_sUgWOP?I@8;?iTqbWJi0h@JUgvJTQhyaPyn+ z2#gA~Kh-J~2RW{}qj&QT2m}Idb!@cH?J3oY$KDz=K4E*yZ#s@UU;_9 zkUe>65*n`R#m^}CP>~k5%lbhslX3n*E|Vg?pUbnqlF63!eO%fhvlvTarv4O7I@!*H zzA^@_pw5#FUNmqovP;W%Pir#oDc0(beuoTwwfJuC9&GRK;_lt;-97Y%1Sk+WQTc8P z;!;1yB@x3={Ww(04dRx+l2L{ljXlEyP_?56i6Gv;QgD+~usb|C(v!H^)!eY&Iv07k z4ro2%=02+CWE)84DiHEGru9RX#`rQnDYR$>`ymZeh^Zekgc0M7V67i?2|~Orx!)z& z_DzW}bloK-S$3s#?FoJl(a$4{nvzE#faBkJA{+gsC&tU!=-YD!tJ@Rpn!e%x2>AvJ`do&sqP^5oj<_zkQe&TVSu05|yZW)bZ=)!-} zSAl$Ks~Oz?=eL9Vif%UIKGbL$v23#-9RaNgTbPiZJ-!F@1v&Ef#B;^@(o$ZKE^#uP zKNpN`q>lza8%rB(Y%FbHe>xl)8)txXuX3D0J+Ej{Z{uhzNgp%M!@@1vPPhc(YfC~d z@P1Pw=DoL(3LCjMNhnaZk%u9f;9)H|e-=1>s90hVJ}-u|IDNE;sWF-07kUdLjbTt` zY-}nsE;f}J?wiUC<4t9TCk?lFd^mFNpwl!GM&y-pb${ww1e`p`Q`bV_n(bz0B@axI zxi&j+gd7PO5{@liiPrc|>y^x;6BdWDMx0K_n`j9sdbO{9+MMJC`dPLLS(F3koR{tD zCDp@Ecr08<`|z_eqkxF|#$8Airinfq{apl+t!!#P~^X-8D_v~Et^jcWU29JTshlw5rY&z|Jj!+LfffBbCtwn=f;v2HkS z$ICNv+@6%Ml;dX4Zus#}wx8o+xJw8(gKn$j5rh-9HD%&DY zyKHh!vcZx&_lYPyH%c+zs<@=#r`ku?fme!W95?wzIBxxBGQ*3^%&gXNb2es% zT@O65Vwjj5x3l#l#|@kPC@$AI4~*^0JvnvU#3k~~&Y3!HbIEb@!URzqJtmy~+VI#| zrG*S*XU=u3)3`(ITzXoatVqr_jvM}27xzUz0M09HB=1d0M&snx^?BO2>z16Ge(T(D zm1DC{x_052c4WU8Q9<_6<{D%_PTt3f3cux zI=tHt-v}1aQ*#w=2VRV-%TvSwBb1-n0i#`aFzFHgmRLy5Gpmjk{$`7C4`_vWIBWcl z@rYL)cJ;;~EmF{cSg+^)QnXqgn&1Hq%O~S^VLS{cu*qTe-eg6wJt(=YLmbSh#V40g zUMsJ26?rTsHdZ|)*(_0cFyWE1bh+m#bc0f3(8${J9M!7rhVr-DEtgiiGmx#rQjV1w|3b_Xfk09`W> zks4)QM@an5jftBb91w0b2zHk$bNYHDp9=*tI&NaK>vunh;M=W@nkG20J@zW_^ z5+F418L?4$Z<#i{goyCo6!|2v2PUL~RvqQdN0lTeBy1q)34n()G$sQm7LX)S`hEv# zx6g3U!g-Y-LWFIvQqKwkF9>PTf-^5ACl#1bq0<)t3qns*E&@q~dhsTXLP!!&G^0XT z@4~qW4BJ$jHe@hBPHutS=m>TqFVTX>DjFz)Y>LQ>2ph5+m2s4>3hDy~0N zWwTHCDCfHCp9@T^`9IhbW_!G=PAbyY;D0X#RGf~)L8k!&wG84A= zAa~P{hRh?F(bS32#2wL+X%ORnJr+FOt=xta>W89x)DJcqDlP>yFhf+70vZqc4qL0f z2hWopb}XQ_a3k8VMr%mQusqwy0T&Ky$U;roDQ@QDo5LC(V&IaS2@BqAx-pvsPb(H6Bzvf*C%+ufiHcwV1yw+nKNiE>^fi5!QHOql^0(^73P9 z2E;sRMwzO(BuJR*gZVaL4MvX4DeI3ofZ(m&4Ae#RDfN`X8e2*o*4R>NCwWV$!x~#k z9oC=}Y=II+_@O4Oq0wkmK(PsHoI$;C-A>yVakANG41aat?T9fO_*IZ_yF8+^;E-iq(8!dMDxK#u%<;<@5{OITwg&Yug$HqwW~ z8ccO#X@iZ8r48&)hx2f+PmjxRxldouZupilq7o4yr@{FzD~u_>;;)0>x& znZbVwfo#BC3W01aYw$LM%}65L2-8TY+f>%T{**Y65D0Icx)$2oY<22dsB71n87)Q^ z?+~2euZ90^WKPJNC9amVFq=Eccbt_6vCx|3-1Y_HnIiF%gg_RhLu7SEFZTJ|k3uaG zMc*O2ZRg4AA^&DmawHG84S_^BB~c^OL<4RJfjp5yAb^rt*tpmb0>RI=2tt)LArOjY zLm+BVA&}!`8v>bWEY!2@xV9ne7{{O;0{Mh>=&Uk)$|bYPP(0^F+D1Jl5&FbT2n2SE z5Xci-Lm=1;n?oS?FBPNM#X3#+z~+wgIgWXIHSj32VczYyOu` z6mGzC;QE?ow?|%oTEwrxKpi6JW)!z^g%fp4_%2W^p3M%udy7_CQA%kPiMrF9?4@P= zF(Fc+1uNhnyvWasVGI=YP(y&t3$_4ve{q|fiFx@Z9#cCSaP(UHUicY`10*oMwCSXo zqEqHc6p8izK^xrAj-)IC8(gKGj043r?5z&8lTnAH&>@)#DMMwfb=Yu2*)}XUlmk^_ z)!W&Nc&YfBm&s4pBCTZFZS!QZAk!kWQS!?UE!lS z{m`2%wb5SV@OrS2#?HVN>@(EUl1&0TMu^Wwl#45fCAw)LhB=ZeVqp&`*Is2W;pTXO zaVCc=wCL)ZYJzTzGD(Niql|e5>2(RN#OPfF?Jt4l6b)!ef5`>A3H)@mM~N41AftpI zCA{%uuKF=M0*pntdB+0*P}R znnGH3C2ues-gqJyklCUI7rkVo!(54lM>;f>zxF&_;JDHLrs! zk1@;@ftNo(+c5>&eNC>UZCgH*l;UbUO%NVrt*yTbsNuwuF!rUAC)pSV$GTzS^h~La z5oNShL1G}Y9sXZMUMd5PV6p}(i)x%9R3nv4_;`)+!1x!0o)P=Q^n1Lc3~wSp^;g|W zrK2y;mVCExJ4*)KE%>f?d;6FzK9XB>Fd$PfnS7Ub2v~Dm!$mH~H4B@Lp(?4{!@-1L zr~|z_+uLH({t5S17vkO73d_FRc{@36+YP53Z8QAEx-%RzwPtAiYGpuBEe%x>Yu-RL z4YVpnc#uMz&nop_3b3LB1aT6~^pVGjV>Vmc51UZRkAvh6fl;+UDnlsJgJ zB;t5-197}a6=I|3hbsOk53-QSsnlk2XQ$gVVCak1bpA8tNV~L8L7Nk_p!M{(pMZem zBlF4y{Gj8tX+ars-n78=DhRA-RC^LGE)Mugn-x|mp%QC&ihdo`TWMjCvrj&WxQWCb zN$b)7@1;nFz=oiZa1LEs@)1I5%{ga}?#q^k^<8(Jh(%K@w)$R%S>MecFPeV3n9kSB zZZThsS9lx3BC3s;>9+G$XgcQIjd^$LN8TCp?#8@H_1C=G>jmS+d3>w0YHz@WI&;zQQ9pxZaFOBhd^2 z|A83EDt7^Xg~zuUNgg9v-3)!jxh+MIGu_abQ|Nb8z@@SdT2db2O&mNRP9^tL?qMlr;Vmqy z0Xy_jHBk_SC>>zNaq>mkfjG1?i2HC7oop-b!B(Rm&{H0(Vqts6dXP)K9+XNiQX`Xs zawVaR(Q;vl(%ZOTY%*4;q38Vgr2=b(RTx~0=6pOEs&1xDWuYCyFdC6gk8MVxt!3GC zp(0S}9VSO>?mGZVhKJ<>3~L8VwPB#0mK;IO6nJmi!B{lpfB}ncgKQ_{W{|g#O@Q%G#dJm zVeL+|SBGo!2!#vL;b%Qk?E&$mJu#4?X`}(Go0wqLX#i?!+cK}cuBPOPiJ%LCNNpHJ zVzmb1!(YoYq=*fFNt4-s7E)Uh`~*k^wI#|F$o4O;wSS4<_*cmodXD#-BBVkn@-2;O zL4k-4aLOG09GKKrGSI8!?)Nm1Gz>`&>${*;aqD#WXb z0%LQ5#9AQ;2&L9Bu$lKHJ5r+>7zy6B0x@tE{WK9~oo7Yka}mJF9W0hc>H0Gg3dmU| zXg^FI9cgJ_A{kew9kZIq2;(7Vb^4C|$q46B!09_GNMpc@FXK}Y7P@1s_mK4Cu2dii z6#8-U1TwHh0QMr->YyeONvfp~j@bkNI-4YHYuWuG`Z#w)fbrTv1jm7rP9kF$@wj7u zT5wa+fu>_1Dg{GhWiIhC1);X;$e}LK!Prs9d+`+z5NO{6=^6;sJ|!W`d#D}JZ0>eU z2*n7D#b&gHr`}@E^Eux8irm3`BbUyFI!BY#gId?ZfWnzv&T*C_M4dl7m6K5Q3mElv1@)3?f`C8e|{mmBS#WR^#=BoTRggHnYkqx5TbC-YI{+sJ&VxQw-wCnd(qMvTKnJo=c*a(1R#)TUzv4aMHcU+Ya@GcD;g zw1HJ3hH-e8*5oF?mgwTl>-?k?r@(X2nVdFnDmA%m5we_HGm2FZqSq28EU?7=^Fd}B z!tl=$nPFzUKti^&kf?A24#-kH??oTI%HFSv2J$-Vm9FZYVZxD3-0uL^nBtv^mOT0?~#_tO}V zGAsX3kK}P}Z$3^NwDI`aHTXG4!7sW;&suuU`YRk!wZ7EN%S_+&P0rDKB~TN+VzAeI z`HjeHmev252mD^X***GE%Fon2dO^GUoTL7a%Ih~O=c-48@J5_0^Ocaz>RpkM)s_FnMEBEsC@tD&&V+3-z^S8wmZS|Y6 zFrrAkTySEcae9=lG5Iuv$R;N6rI<`)I$O|y4yIPTOLQBR792M}S)NA-jwCkqFD_{C`_sBmyn>N4J{3SQu@ zXusdAHX{D0fjX+GmF6KZcG{7ap7vz{V(Rv{Pz943}vTqGE4 z9gd*}jPdWhP#KE~6T_IY7RI_Jo;wR;p8;CT!uVhHA_7j*ls;==--+Y~9)%!wB`bf`>czdcd2r+9y|^?i?|>aN%G zuhbAwlk<_V#K@xCs;db9d`bi3d2~D-?s}bnb$T~t3C+G+|JbLpukf%5VX`bRfK32G z4iH39nm^rgIpE;;@5_Z(iUkiv5Q$3Zs4B8kDeXXw99AkE-UPt=hoNi%ZQN&(O$;Q! zaM+km?hhCiEes*C?O-Sf2H!d^pvX*T^!<#2KEbQ=YROq6Cy|=aipYmCIay7W3&vPK z{q7UE_#o_JzoW=m`|OYPOlc(xYw5A4ri!%3CzeJZ2-jVif}|FT-<(+C*ig|XPl`vH zCvKi3+DV-Ir&sXEb)GE~hgBRIJWYG8*Dq+p%HGCKXc>?qhKTaB;99fD(;xbi@!1ul z`^~2y!kfR-c~a^*I#u*I_1)wUGcE?nyu78;Q_}(7-%C(Tg zd{jTG);T#aDFs=t4FC0XsZLw&H3h9x4hYaR%#>CutDXpf&sjhSs=*b)iTa6|zzn5g zCRS6X%%r!2nNI$`nQ7zu2tAFZ>N)$5z6fA_se2fwZmS+NL#c8qB_n&$G2pk3;LTtr z-mS$Cdl^bUAV=+_Jrx_8pX@B%RIp7re8=M>uFa@W+NW%kAGzF)=R|7cjTH+*9 ze_#y8)ZYBhVSrAhlb|Ys3ILx}Iw{=(MK0;Y5rCFXWKxuT!4OuOlXO~4(uq&rNjfdk zu85M_5Ty!PKq9f5;zX2lE`=yXl84v<5E3fRo_iiL@LiGcsFNqzexWT9x>^F5`Z!-GkuSWscz5W4;?8R6 z(DCEdH=&%gl3I;8-TIGz_Q_v<|NDRG@%J7(l#PBsI)zMgJ@~i3_fx<1pC0(%zvEA` z<^j2WG_c((2iN^z>nmhgG9nsXO~04wmrr|enpbrPr^zf`&0*O)bbIg)ig$3!$+bLB zIrDtIgJ)OWQ7!X?n%_Y6r9)qNHycrw4i)dLc5r={RLs($3*X7Ociny0prehJs++-SP$1u(HhpVYAW85szV^2bT9)j~B-eZ&J7NqqbJxAWVG?|F-F zvvU{~(iT;B)~Mh>ge^veK9EHpQr0k3YgCAJX7zP4KpK4=M#ZVyQvk+G2~r>!6+Q08 zSOYdHu-hA>g2lSe>$%&n#~|*j0%qC2rY<_ zG}VHtA9J5-L7nY^7W_mqDj26Et#zQxQY9}YdD!fp;EVMf8jq!TkquX;!pN9S^4m!; zHY!+-nHm*(JB*5xzi)ZC@qLe^>a5qLMMNDk^dJ=?wY`em`qZs{`J{m|v98*Zk;@u4C zppM~VFPd*ycT@8X`8@jW=VZD4Ns2q5v{)~b*P?$CVqYVT|~h>L<@`V8zOCOccj_rMONjpZlaFWz!AeyC zoPrHX^84?O|PlpdhoCtdA26FhO={M8LKNYJN-bYYgA*{4Dv zA<|Ze0mzD0c+0PXv|fBMgbznfzZl~4q6RbfoGyPT`#PUDHvwrt>W;~LHMshy$5q6* zoR&mx6dY0K>nJO&bffY0RS~w-Ud=h@d`HQ*bKigl8h+Dx`m~8w-)FuxVu?8?Yf<)e z#Rm$o9;7v$u!WlSS4T*12d`E7>WB}IGB<%l?Kw{vWy(To(?TS@oxxW~?tPc2lPwm? z@4Fhjc(=}$uaJE9pCI|(%kpzlz!POzA4l7X{XlnIr=#ofe)tI7q2mL2^<9S^6FmlD zV65+kY;Zg6hoEhxW`an=anD=FU66!!*El?nFcwC|3N2D1MJtY+=f%JH-V+)6?R#<& znk^~!b7t+nT+y-FCWD~kusZmxo7^t9jd@|$i_i6>;E+C4)Vf}>DaL2T)Rw@vzu1i> znaKbc=&<-?QY4P7<}}?L*X|;*D=r~P(&F1>Qb6`G(+NC|Nl}E0rMD+)_7v~iq}cer zY+7DfuLm+I=#|e!eW`mGr*5k`PHOsYfH`oe!d2GXx9l&;5WQ~SO3!3c#KdCMdOevG zek=q9Fyvb;^E%E`pPsn{tHas^{r4|~Xr^?V}rCu9v6Gf8&#u+u)6D%W5YFu%x=K@V0) zN`pmN@Seg{2wKpOQj>?Rx83Y1-Z%O;z8^+oo-9hmx@A$u$RI7cC4sxXU(*ST(p92w zrUGT3?XF!hQGu$63O2WrsKAd!1!5jE&`2N=g(GrfR}w9NNPT1wc_8hgwvY!2Mkj?( zBM6J$fn4n1 zUHQ5&)lf908dq0pea{eES5m&n>FSV)c-lI+q^GR|C!em4 zJV9$(AswsX3~~M!(k&b4h}Eb)@{{Q@xi|jEou*IAKtd}1q!0DTr%=l9^e0|gB8nl2 zN-a-=ytS`gL&a_lPMoScEvU_qcOtl7FnuHnH)Dx}S}H$%^INDqh_65dn%r!11+G(k z0IH3dLtQDj9{_47!~mKh4W<%wNYj>^ta+$yt)vM+jq{)0YXDp8fF3Fsb*G=mwy2|P za3gvRa!`BXtFb<#{Je>op9{82X2%O4W`x-0p99Denw_%9Guy7_{Xf(ohNDLG5VbfR z?|({fEOMw;D|)u!eVqb$I=+_CAcmj^21?->(Mx&t_(N_l22RGb(F{_i14IK5?~%n66%stSxcM}%tUvFwWPP*>?z*2wY2g5N+YQj*6Xf}WqKvO>`UFlICWbs ztkpqZHkMr_`Zkz2Xr~=`vX)du)>6zb2Cr6ocKwhyq}q)h;dp4HrpQ?Udx+)#|Eg&~umd(HWCVgK<;b&zcn&8OM{IImOL3F-vi0 zLanp!*1w?c#majdljT`A@z0wkI2}BUE~n9-PR_B2o9O;u8U)XV?)C1rbRSI`uv-Q4 znar#im6~|AfSrAJ8^B8WpH>=>Cvw_4VI9JityTbth!-! zcBM~vzrdEhuL&otBY8T;*=9&U^=D`+b_vH z*}xpLHXvM%(6k?GP0*O;&M}#q=2M`D`5i#lxsA#6`x^>$hh+pVg=J*^j+rjMAaSk! zkboXx8CQ9}fZp1dBVyGGz{tid^PbEz#$LUHcct*jtt_sY#Mg1<-=&Qht zTh#AVfoeQwWJ%@mMGc7n_I^283UNb8GAj9!tBiXkw-A|_bw-;f4p?Z(5HG`dNUkec z8H}lYQ>Sf@37)nNlRRA=5)VRrDb&UK=*Z`@uxXTt&>Yw6lev_3Rcu-zB@UM4%95r! zP3EbV+7;5-I)=)os*Ep0&so(H{lhq1q*l*TtEwMBnKI5&yrOU?x}C@g1sV zUKo9uBA}ziB+3-u+Z61CRyGAY*&3%{r<`3$cRRaWH1?bIr0q96H|)1!bFlN|?{5lr z>iuAxGUb!dtMf_JuToCcEr*xYKPF$Omx7&CA+Dx(9mmz_i6P2pCB;06u)~{MT8Ugo zb<*UMAZZj=T*mWts7}iZnmheBfltWWF(gSN_-;HTt^_G5@JarWKotp(Lq$7fN{)vq z+9~^y2$_^mn8XSos?Y&M$?(l4u>gwvW1)sP77c^XUXxD5Y#cc-{7)6L`c3655Poa| zR=l8wY{UEx&%l@oqiK){Gp11ek?u%I;^5|s9wNY*m;oHuJaOaV;P~W;qOa7|$55DG z3c#GMz1DCLtl>Q6agGZ!-iCC?;U>N_M|)8_iI|2%;3e^xB;AapIk}k8bgcL1oDc$1 zxk$`6r}<1-ddhr>U(H|AT3}6aQS+B35{n5C)F%FNzE$r0G69~2mmu^+492hdOF2^- znWM>GOi;6tueI&_oA^ubi%@xGz3#+f0&2hEjMOce@b!b@FTPSs-Xjgm6Z5;~FOZk` ztI5|=m6pF|T4~o5Qoa_9vdrN-6Rjwu*hOP0h#;5AU%-GAvnhXpALlRdyIV`oalE*b zk0lMcNC+{3ZEr@{`V>Oc9V>~VYrgf;XeLS$UC)PRQr->-o7GIs6APDF&E&cpHPdO^ z130Ix1C5@pPV-S1ubCm}wXO!lPPY^nF}K+@Gs2}SvIlmz=}Wr>fob}ZIOe1e^=L&3 zJyM%g*BO1uWK(+G8IG)36krasi-byaPIgO**2%0AF3+%Cg-b0qHaF{4Ew5+ci(BV> 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

>N{q@2NEYqjFJZ^$hc+va3O1hO%$5Vkht+$z7Dl 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 T-Cp~nb?!H{PiimKw4VG2-=`A) literal 0 HcmV?d00001 From 67ee80b8ff3b1abaa247287c8397e9d9ff7c2d36 Mon Sep 17 00:00:00 2001 From: unknown unknown Date: Tue, 27 Aug 2024 16:39:57 +0200 Subject: [PATCH 7/9] another additions --- app/app_upgrades.go | 5 +++-- app/upgrades/{8_0_0 => 9_0_0}/upgrades.go | 19 +++++++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) rename app/upgrades/{8_0_0 => 9_0_0}/upgrades.go (69%) diff --git a/app/app_upgrades.go b/app/app_upgrades.go index 43b6c744..509877a2 100644 --- a/app/app_upgrades.go +++ b/app/app_upgrades.go @@ -14,7 +14,7 @@ import ( upgrade4_0_2 "github.com/archway-network/archway/app/upgrades/4_0_2" upgrade6_0_0 "github.com/archway-network/archway/app/upgrades/6_0_0" upgrade7_0_0 "github.com/archway-network/archway/app/upgrades/7_0_0" - upgrade8_0_0 "github.com/archway-network/archway/app/upgrades/8_0_0" + upgrade9_0_0 "github.com/archway-network/archway/app/upgrades/9_0_0" ) // UPGRADES @@ -28,7 +28,8 @@ var Upgrades = []upgrades.Upgrade{ upgrade4_0_2.Upgrade, // v4.0.2 upgrade6_0_0.Upgrade, // v6.0.0 upgrade7_0_0.Upgrade, // v7.0.0 - upgrade8_0_0.Upgrade, // v8.0.0 + // upgrade8_0_0.Upgrade, // v8.0.0: was reserved for a consensus breaking wasmd upgrade + upgrade9_0_0.Upgrade, // v9.0.0 } func (app *ArchwayApp) RegisterUpgradeHandlers() { diff --git a/app/upgrades/8_0_0/upgrades.go b/app/upgrades/9_0_0/upgrades.go similarity index 69% rename from app/upgrades/8_0_0/upgrades.go rename to app/upgrades/9_0_0/upgrades.go index ee9e17d3..26371145 100644 --- a/app/upgrades/8_0_0/upgrades.go +++ b/app/upgrades/9_0_0/upgrades.go @@ -7,18 +7,19 @@ import ( upgradetypes "cosmossdk.io/x/upgrade/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" + ibchookstypes "github.com/cosmos/ibc-apps/modules/ibc-hooks/v8/types" "github.com/archway-network/archway/app/keepers" "github.com/archway-network/archway/app/upgrades" ) -const Name = "v8.0.0" -const NameAsciiArt = ` - ### ### ### - # # # # # # # # - # # ### # # # # - # # # # # # # - ### # ### # ### +const Name = "v9.0.0" +const NameAsciiArt = ` + ### ### ### + # # # # # # # # + # # ## # # # # + # # # # # # + ### # ### # ### ` @@ -35,5 +36,7 @@ var Upgrade = upgrades.Upgrade{ return migrations, nil } }, - StoreUpgrades: storetypes.StoreUpgrades{}, + StoreUpgrades: storetypes.StoreUpgrades{ + Added: []string{ibchookstypes.StoreKey}, + }, } From af1ca7e486ccc29a73478f12bff3274b36b7e917 Mon Sep 17 00:00:00 2001 From: unknown unknown Date: Tue, 27 Aug 2024 17:04:27 +0200 Subject: [PATCH 8/9] minor adjustment for testing --- interchaintest/setup.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interchaintest/setup.go b/interchaintest/setup.go index 8eda85d5..a7c56a24 100644 --- a/interchaintest/setup.go +++ b/interchaintest/setup.go @@ -5,14 +5,14 @@ import ( "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/types" - interchaintest "github.com/strangelove-ventures/interchaintest/v8" + "github.com/strangelove-ventures/interchaintest/v8" "github.com/strangelove-ventures/interchaintest/v8/chain/cosmos" "github.com/strangelove-ventures/interchaintest/v8/ibc" ) const ( initialVersion = "v7.0.1" // The last release of the chain. The one the mainnet is running on - upgradeName = "v8.0.0" // The next upgrade name. Should match the upgrade handler. + upgradeName = "v9.0.0" // The next upgrade name. Should match the upgrade handler. chainName = "archway" ) From 8ab834e7346e03ddc363c23dcb139e90ee15ae7d Mon Sep 17 00:00:00 2001 From: unknown unknown Date: Tue, 27 Aug 2024 17:41:21 +0200 Subject: [PATCH 9/9] ad params request to whitelisted queries --- app/app.go | 1 + 1 file changed, 1 insertion(+) diff --git a/app/app.go b/app/app.go index 8ea0f844..3418126e 100644 --- a/app/app.go +++ b/app/app.go @@ -1218,5 +1218,6 @@ func getAcceptedStargateQueries() wasmdKeeper.AcceptedStargateQueries { return wasmdKeeper.AcceptedStargateQueries{ "/archway.cwerrors.v1.Query/Errors": &cwerrorsTypes.QueryErrorsRequest{}, "/archway.callback.v1.Query/EstimateCallbackFees": &callbackTypes.QueryEstimateCallbackFeesRequest{}, + "/archway.callback.v1.Query/Params": &callbackTypes.QueryParamsRequest{}, } }