From e3092ad0e0fff8c19964c5835bbc216d82604bc3 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Thu, 28 Oct 2021 10:24:13 +0200 Subject: [PATCH] Move wasm handler setup to app package --- app/app.go | 2 ++ app/wasm.go | 50 +++++++++++++++++++++++++++ x/poe/keeper/test_common.go | 25 +++++++++++++- x/poe/wasm/query_plugin.go | 9 ++++- x/twasm/keeper/handler_plugin.go | 10 +++--- x/twasm/keeper/handler_plugin_test.go | 2 +- x/twasm/keeper/keeper.go | 30 ---------------- x/twasm/keeper/test_common.go | 23 +++++++++++- 8 files changed, 113 insertions(+), 38 deletions(-) create mode 100644 app/wasm.go diff --git a/app/app.go b/app/app.go index 9010fddb..5bb4ed2d 100644 --- a/app/app.go +++ b/app/app.go @@ -280,6 +280,8 @@ func NewTgradeApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest // TODO: add tgrade here soon supportedFeatures := "staking,stargate,iterator" + wasmOpts = append(SetupWasmHandlers(appCodec, app.bankKeeper, govRouter, &app.twasmKeeper, &app.poeKeeper), wasmOpts...) + stakingAdapter := stakingKeeper app.twasmKeeper = twasmkeeper.NewKeeper( appCodec, diff --git a/app/wasm.go b/app/wasm.go new file mode 100644 index 00000000..0b2358f3 --- /dev/null +++ b/app/wasm.go @@ -0,0 +1,50 @@ +package app + +import ( + "github.com/CosmWasm/wasmd/x/wasm" + wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" + wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" + wasmvmtypes "github.com/CosmWasm/wasmvm/types" + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + + poewasm "github.com/confio/tgrade/x/poe/wasm" + twasmkeeper "github.com/confio/tgrade/x/twasm/keeper" + twasmtypes "github.com/confio/tgrade/x/twasm/types" +) + +func SetupWasmHandlers(cdc codec.Marshaler, + bankKeeper twasmtypes.BankKeeper, + govRouter govtypes.Router, + result twasmkeeper.TgradeWasmHandlerKeeper, + poeKeeper poewasm.ViewKeeper, +) []wasmkeeper.Option { + extMessageHandlerOpt := wasmkeeper.WithMessageHandlerDecorator(func(nested wasmkeeper.Messenger) wasmkeeper.Messenger { + return wasmkeeper.NewMessageHandlerChain( + // disable staking messages + wasmkeeper.MessageHandlerFunc(func(ctx sdk.Context, contractAddr sdk.AccAddress, contractIBCPortID string, msg wasmvmtypes.CosmosMsg) (events []sdk.Event, data [][]byte, err error) { + if msg.Staking != nil { + return nil, nil, sdkerrors.Wrap(wasmtypes.ErrExecuteFailed, "not supported, yet") + } + return nil, nil, wasmtypes.ErrUnknownMsg + }), + nested, + // append our custom message handler + twasmkeeper.NewTgradeHandler(cdc, result, bankKeeper, govRouter), + ) + }) + extQueryHandlerOpt := wasmkeeper.WithQueryHandlerDecorator(func(nested wasmkeeper.WasmVMQueryHandler) wasmkeeper.WasmVMQueryHandler { + return wasmkeeper.WasmVMQueryHandlerFn(func(ctx sdk.Context, caller sdk.AccAddress, request wasmvmtypes.QueryRequest) ([]byte, error) { + if request.Staking != nil { + return poewasm.StakingQuerier(poeKeeper)(ctx, request.Staking) + } + return nested.HandleQuery(ctx, caller, request) + }) + }) + return []wasm.Option{ + extMessageHandlerOpt, + extQueryHandlerOpt, + } +} diff --git a/x/poe/keeper/test_common.go b/x/poe/keeper/test_common.go index 2935cae3..196af72c 100644 --- a/x/poe/keeper/test_common.go +++ b/x/poe/keeper/test_common.go @@ -4,6 +4,10 @@ import ( "testing" "time" + wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" + wasmvmtypes "github.com/CosmWasm/wasmvm/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/CosmWasm/wasmd/x/wasm" wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" "github.com/CosmWasm/wasmd/x/wasm/keeper/wasmtesting" @@ -202,7 +206,26 @@ func createTestInput( stakingAdapter := stakingadapter.NewStakingAdapter(nil, nil) twasmSubspace := paramsKeeper.Subspace(twasmtypes.DefaultParamspace) - twasmKeeper := twasmkeeper.NewKeeper( + + var twasmKeeper twasmkeeper.Keeper + handler := wasmkeeper.WithMessageHandlerDecorator(func(nested wasmkeeper.Messenger) wasmkeeper.Messenger { + return wasmkeeper.NewMessageHandlerChain( + // disable staking messages + wasmkeeper.MessageHandlerFunc(func(ctx sdk.Context, contractAddr sdk.AccAddress, contractIBCPortID string, msg wasmvmtypes.CosmosMsg) (events []sdk.Event, data [][]byte, err error) { + if msg.Staking != nil { + return nil, nil, sdkerrors.Wrap(wasmtypes.ErrExecuteFailed, "not supported, yet") + } + return nil, nil, wasmtypes.ErrUnknownMsg + }), + nested, + // append our custom message handler + twasmkeeper.NewTgradeHandler(appCodec, &twasmKeeper, bankKeeper, nil), + ) + }) + + opts = append([]wasmkeeper.Option{handler}, opts...) + + twasmKeeper = twasmkeeper.NewKeeper( appCodec, keyWasm, twasmSubspace, diff --git a/x/poe/wasm/query_plugin.go b/x/poe/wasm/query_plugin.go index 7d8c8371..087109bf 100644 --- a/x/poe/wasm/query_plugin.go +++ b/x/poe/wasm/query_plugin.go @@ -10,7 +10,14 @@ import ( "github.com/confio/tgrade/x/poe/keeper" ) -func StakingQuerier(poeKeeper keeper.Keeper) func(ctx sdk.Context, request *wasmvmtypes.StakingQuery) ([]byte, error) { +type ViewKeeper interface { + GetBondDenom(ctx sdk.Context) string + DistributionContract(ctx sdk.Context) keeper.DistributionContract + ValsetContract(ctx sdk.Context) keeper.ValsetContract + StakeContract(ctx sdk.Context) keeper.StakeContract +} + +func StakingQuerier(poeKeeper ViewKeeper) func(ctx sdk.Context, request *wasmvmtypes.StakingQuery) ([]byte, error) { return func(ctx sdk.Context, request *wasmvmtypes.StakingQuery) ([]byte, error) { if request.BondedDenom != nil { denom := poeKeeper.GetBondDenom(ctx) diff --git a/x/twasm/keeper/handler_plugin.go b/x/twasm/keeper/handler_plugin.go index f6b7d5e4..360568e6 100644 --- a/x/twasm/keeper/handler_plugin.go +++ b/x/twasm/keeper/handler_plugin.go @@ -13,14 +13,16 @@ import ( "github.com/confio/tgrade/x/twasm/types" ) -// tgradeKeeper defines a subset of Keeper -type tgradeKeeper interface { +// TgradeWasmHandlerKeeper defines a subset of Keeper +type TgradeWasmHandlerKeeper interface { IsPrivileged(ctx sdk.Context, contract sdk.AccAddress) bool appendToPrivilegedContracts(ctx sdk.Context, privilegeType types.PrivilegeType, contractAddress sdk.AccAddress) (uint8, error) removePrivilegeRegistration(ctx sdk.Context, privilegeType types.PrivilegeType, pos uint8, contractAddr sdk.AccAddress) bool setContractDetails(ctx sdk.Context, contract sdk.AccAddress, details *types.TgradeContractDetails) error GetContractInfo(ctx sdk.Context, contractAddress sdk.AccAddress) *wasmtypes.ContractInfo } + +// minter is a subset of bank keeper type minter interface { MintCoins(ctx sdk.Context, moduleName string, amt sdk.Coins) error SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error @@ -30,14 +32,14 @@ var _ wasmkeeper.Messenger = TgradeHandler{} // TgradeHandler is a custom message handler plugin for wasmd. type TgradeHandler struct { - keeper tgradeKeeper + keeper TgradeWasmHandlerKeeper minter minter govRouter govtypes.Router cdc codec.Marshaler } // NewTgradeHandler constructor -func NewTgradeHandler(cdc codec.Marshaler, keeper tgradeKeeper, bankKeeper minter, govRouter govtypes.Router) *TgradeHandler { +func NewTgradeHandler(cdc codec.Marshaler, keeper TgradeWasmHandlerKeeper, bankKeeper minter, govRouter govtypes.Router) *TgradeHandler { return &TgradeHandler{cdc: cdc, keeper: keeper, govRouter: govRouter, minter: bankKeeper} } diff --git a/x/twasm/keeper/handler_plugin_test.go b/x/twasm/keeper/handler_plugin_test.go index a2372604..a629ea58 100644 --- a/x/twasm/keeper/handler_plugin_test.go +++ b/x/twasm/keeper/handler_plugin_test.go @@ -601,7 +601,7 @@ func noopRegisterHook(m *handlerTgradeKeeperMock, mutators ...func(*wasmtypes.Co } } -var _ tgradeKeeper = handlerTgradeKeeperMock{} +var _ TgradeWasmHandlerKeeper = handlerTgradeKeeperMock{} type handlerTgradeKeeperMock struct { IsPrivilegedFn func(ctx sdk.Context, contract sdk.AccAddress) bool diff --git a/x/twasm/keeper/keeper.go b/x/twasm/keeper/keeper.go index 0dc5b332..0365c9ab 100644 --- a/x/twasm/keeper/keeper.go +++ b/x/twasm/keeper/keeper.go @@ -3,10 +3,8 @@ package keeper import ( "fmt" - "github.com/CosmWasm/wasmd/x/wasm" wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -54,34 +52,6 @@ func NewKeeper( govRouter: govRouter, } // configure wasm keeper via options - - extMessageHandlerOpt := wasmkeeper.WithMessageHandlerDecorator(func(nested wasmkeeper.Messenger) wasmkeeper.Messenger { - return wasmkeeper.NewMessageHandlerChain( - // disable staking messages - wasmkeeper.MessageHandlerFunc(func(ctx sdk.Context, contractAddr sdk.AccAddress, contractIBCPortID string, msg wasmvmtypes.CosmosMsg) (events []sdk.Event, data [][]byte, err error) { - if msg.Staking != nil { - return nil, nil, sdkerrors.Wrap(wasmtypes.ErrExecuteFailed, "not supported, yet") - } - return nil, nil, wasmtypes.ErrUnknownMsg - }), - nested, - // append our custom message handler - NewTgradeHandler(cdc, &result, bankKeeper, govRouter), - ) - }) - extQueryHandlerOpt := wasmkeeper.WithQueryHandlerDecorator(func(nested wasmkeeper.WasmVMQueryHandler) wasmkeeper.WasmVMQueryHandler { - return wasmkeeper.WasmVMQueryHandlerFn(func(ctx sdk.Context, caller sdk.AccAddress, request wasmvmtypes.QueryRequest) ([]byte, error) { - if request.Staking != nil { - return nil, wasmvmtypes.UnsupportedRequest{Kind: "not supported, yet"} - } - return nested.HandleQuery(ctx, caller, request) - }) - }) - opts = append([]wasm.Option{ - extMessageHandlerOpt, - extQueryHandlerOpt, - }, opts...) - result.Keeper = wasmkeeper.NewKeeper( cdc, storeKey, diff --git a/x/twasm/keeper/test_common.go b/x/twasm/keeper/test_common.go index 064136d6..b0db5c1c 100644 --- a/x/twasm/keeper/test_common.go +++ b/x/twasm/keeper/test_common.go @@ -4,6 +4,10 @@ import ( "testing" "time" + wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" + wasmvmtypes "github.com/CosmWasm/wasmvm/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" "github.com/CosmWasm/wasmd/x/wasm/keeper/wasmtesting" "github.com/cosmos/cosmos-sdk/baseapp" @@ -257,7 +261,24 @@ func createTestInput( stakingtypes.RegisterQueryServer(querier, stakingkeeper.Querier{Keeper: stakingKeeper}) distributiontypes.RegisterQueryServer(querier, distKeeper) - keeper := NewKeeper( + var keeper Keeper + handler := wasmkeeper.WithMessageHandlerDecorator(func(nested wasmkeeper.Messenger) wasmkeeper.Messenger { + return wasmkeeper.NewMessageHandlerChain( + // disable staking messages + wasmkeeper.MessageHandlerFunc(func(ctx sdk.Context, contractAddr sdk.AccAddress, contractIBCPortID string, msg wasmvmtypes.CosmosMsg) (events []sdk.Event, data [][]byte, err error) { + if msg.Staking != nil { + return nil, nil, sdkerrors.Wrap(wasmtypes.ErrExecuteFailed, "not supported, yet") + } + return nil, nil, wasmtypes.ErrUnknownMsg + }), + nested, + // append our custom message handler + NewTgradeHandler(appCodec, &keeper, bankKeeper, nil), + ) + }) + + opts = append([]wasmkeeper.Option{handler}, opts...) + keeper = NewKeeper( appCodec, keyWasm, paramsKeeper.Subspace(types.DefaultParamspace),