Skip to content

Commit

Permalink
Move wasm handler setup to app package
Browse files Browse the repository at this point in the history
  • Loading branch information
alpe committed Oct 28, 2021
1 parent dc4a0c2 commit e3092ad
Show file tree
Hide file tree
Showing 8 changed files with 113 additions and 38 deletions.
2 changes: 2 additions & 0 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
50 changes: 50 additions & 0 deletions app/wasm.go
Original file line number Diff line number Diff line change
@@ -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,
}
}
25 changes: 24 additions & 1 deletion x/poe/keeper/test_common.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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,
Expand Down
9 changes: 8 additions & 1 deletion x/poe/wasm/query_plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
10 changes: 6 additions & 4 deletions x/twasm/keeper/handler_plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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}
}

Expand Down
2 changes: 1 addition & 1 deletion x/twasm/keeper/handler_plugin_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
30 changes: 0 additions & 30 deletions x/twasm/keeper/keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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,
Expand Down
23 changes: 22 additions & 1 deletion x/twasm/keeper/test_common.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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),
Expand Down

0 comments on commit e3092ad

Please sign in to comment.