From 2fe56bffaf8f6e792969352963cac44f514a6f0d Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Mon, 13 Sep 2021 09:48:31 +0200 Subject: [PATCH] Fix query handler instantiation --- x/wasm/keeper/keeper.go | 5 +---- x/wasm/keeper/keeper_test.go | 42 +++++++++++++++++++++++++++++------- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index c35cfe7045..1e7b4f9434 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -487,10 +487,7 @@ func (k Keeper) reply(ctx sdk.Context, contractAddress sdk.AccAddress, reply was env := types.NewEnv(ctx, contractAddress) // prepare querier - querier := QueryHandler{ - Ctx: ctx, - Plugins: k.wasmVMQueryHandler, - } + querier := k.newQueryHandler(ctx, contractAddress) gas := k.runtimeGasForContract(ctx) res, gasUsed, execErr := k.wasmVM.Reply(codeInfo.CodeHash, env, reply, prefixStore, cosmwasmAPI, querier, k.gasMeter(ctx), gas, costJsonDeserialization) k.consumeRuntimeGas(ctx, gasUsed) diff --git a/x/wasm/keeper/keeper_test.go b/x/wasm/keeper/keeper_test.go index e2e5a71758..4a43059b33 100644 --- a/x/wasm/keeper/keeper_test.go +++ b/x/wasm/keeper/keeper_test.go @@ -1591,28 +1591,54 @@ func TestReply(t *testing.T) { example := SeedNewContractInstance(t, ctx, keepers, &mock) specs := map[string]struct { - rsp wasmvmtypes.Response + replyFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, reply wasmvmtypes.Reply, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) expData []byte expErr bool expEvt sdk.Events }{ "all good": { - rsp: wasmvmtypes.Response{Data: []byte("foo")}, + replyFn: func(codeID wasmvm.Checksum, env wasmvmtypes.Env, reply wasmvmtypes.Reply, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) { + return &wasmvmtypes.Response{Data: []byte("foo")}, 1, nil + }, + expData: []byte("foo"), + expEvt: sdk.Events{sdk.NewEvent("reply", sdk.NewAttribute("_contract_address", example.Contract.String()))}, + }, + "with query": { + replyFn: func(codeID wasmvm.Checksum, env wasmvmtypes.Env, reply wasmvmtypes.Reply, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) { + bzRsp, err := querier.Query(wasmvmtypes.QueryRequest{ + Bank: &wasmvmtypes.BankQuery{ + Balance: &wasmvmtypes.BalanceQuery{Address: env.Contract.Address, Denom: "stake"}, + }, + }, 1_000_000) + require.NoError(t, err) + var gotBankRsp wasmvmtypes.BalanceResponse + require.NoError(t, json.Unmarshal(bzRsp, &gotBankRsp)) + assert.Equal(t, wasmvmtypes.BalanceResponse{Amount: wasmvmtypes.NewCoin(0, "stake")}, gotBankRsp) + return &wasmvmtypes.Response{Data: []byte("foo")}, 1, nil + }, + expData: []byte("foo"), + expEvt: sdk.Events{sdk.NewEvent("reply", sdk.NewAttribute("_contract_address", example.Contract.String()))}, + }, + "with query error handled": { + replyFn: func(codeID wasmvm.Checksum, env wasmvmtypes.Env, reply wasmvmtypes.Reply, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) { + bzRsp, err := querier.Query(wasmvmtypes.QueryRequest{}, 0) + require.Error(t, err) + assert.Nil(t, bzRsp) + return &wasmvmtypes.Response{Data: []byte("foo")}, 1, nil + }, expData: []byte("foo"), expEvt: sdk.Events{sdk.NewEvent("reply", sdk.NewAttribute("_contract_address", example.Contract.String()))}, }, "error": { + replyFn: func(codeID wasmvm.Checksum, env wasmvmtypes.Env, reply wasmvmtypes.Reply, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) { + return nil, 1, errors.New("testing") + }, expErr: true, }, } for name, spec := range specs { t.Run(name, func(t *testing.T) { - mock.ReplyFn = func(codeID wasmvm.Checksum, env wasmvmtypes.Env, reply wasmvmtypes.Reply, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) { - if spec.expErr { - return nil, 1, errors.New("testing") - } - return &spec.rsp, 1, nil - } + mock.ReplyFn = spec.replyFn em := sdk.NewEventManager() gotData, gotErr := k.reply(ctx.WithEventManager(em), example.Contract, wasmvmtypes.Reply{}) if spec.expErr {