From 03bf7b0adf670277fca46a6d4c32c6ca08d4fd5c Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Mon, 22 Mar 2021 16:01:55 +0100 Subject: [PATCH 1/4] Introduce new interfaces for extendability --- app/app.go | 2 +- x/wasm/alias.go | 6 +-- x/wasm/handler.go | 2 +- x/wasm/ibc.go | 12 ++--- x/wasm/keeper/handler_plugin.go | 8 +-- x/wasm/keeper/handler_plugin_test.go | 14 ++--- x/wasm/keeper/keeper.go | 30 +++++++---- x/wasm/keeper/legacy_querier.go | 22 ++++---- x/wasm/keeper/legacy_querier_test.go | 15 ++++-- x/wasm/keeper/msg_server.go | 4 +- x/wasm/keeper/options.go | 4 +- x/wasm/keeper/querier.go | 36 +++++++------ x/wasm/keeper/querier_test.go | 14 ++--- x/wasm/keeper/query_plugins.go | 4 +- x/wasm/keeper/recurse_test.go | 7 +-- x/wasm/keeper/relay_test.go | 10 ++-- x/wasm/module.go | 2 +- x/wasm/types/events.go | 1 - x/wasm/types/exported_keepers.go | 76 ++++++++++++++++++++++++++++ x/wasm/types/keys.go | 4 +- 20 files changed, 184 insertions(+), 89 deletions(-) create mode 100644 x/wasm/types/exported_keepers.go diff --git a/app/app.go b/app/app.go index 32d633330f..bb32d3c531 100644 --- a/app/app.go +++ b/app/app.go @@ -379,7 +379,7 @@ func NewWasmApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest b if len(enabledProposals) != 0 { govRouter.AddRoute(wasm.RouterKey, wasm.NewWasmProposalHandler(app.wasmKeeper, enabledProposals)) } - ibcRouter.AddRoute(wasm.ModuleName, wasm.NewIBCHandler(app.wasmKeeper)) + ibcRouter.AddRoute(wasm.ModuleName, wasm.NewIBCHandler(app.wasmKeeper, app.ibcKeeper.ChannelKeeper)) app.ibcKeeper.SetRouter(ibcRouter) app.govKeeper = govkeeper.NewKeeper( diff --git a/x/wasm/alias.go b/x/wasm/alias.go index 50129990a8..59ff271023 100644 --- a/x/wasm/alias.go +++ b/x/wasm/alias.go @@ -1,8 +1,8 @@ // nolint // autogenerated code using github.com/rigelrozanski/multitool // aliases generated for the following subdirectories: -// ALIASGEN: github.com/cosmwasm/wasmd/x/wasm/types -// ALIASGEN: github.com/cosmwasm/wasmd/x/wasm/keeper +// ALIASGEN: github.com/Cosmwasm/wasmd/x/wasm/types +// ALIASGEN: github.com/CosmWasm/wasmd/x/wasm/keeper package wasm import ( @@ -76,7 +76,7 @@ var ( CreateTestInput = keeper.CreateTestInput TestHandler = keeper.TestHandler NewWasmProposalHandler = keeper.NewWasmProposalHandler - NewQuerier = keeper.NewQuerier + NewQuerier = keeper.Querier ContractFromPortID = keeper.ContractFromPortID WithWasmEngine = keeper.WithWasmEngine diff --git a/x/wasm/handler.go b/x/wasm/handler.go index a3190cdd2f..34ae264330 100644 --- a/x/wasm/handler.go +++ b/x/wasm/handler.go @@ -12,7 +12,7 @@ import ( ) // NewHandler returns a handler for "bank" type messages. -func NewHandler(k *Keeper) sdk.Handler { +func NewHandler(k types.MsgOpsKeeper) sdk.Handler { msgServer := keeper.NewMsgServerImpl(k) return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { diff --git a/x/wasm/ibc.go b/x/wasm/ibc.go index 6529aac67a..f9b45d72df 100644 --- a/x/wasm/ibc.go +++ b/x/wasm/ibc.go @@ -1,7 +1,7 @@ package wasm import ( - wasmTypes "github.com/CosmWasm/wasmd/x/wasm/types" + types "github.com/CosmWasm/wasmd/x/wasm/types" wasmvmtypes "github.com/CosmWasm/wasmvm/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -15,12 +15,12 @@ import ( var _ porttypes.IBCModule = IBCHandler{} type IBCHandler struct { - keeper Keeper - channelKeeper wasmTypes.ChannelKeeper + keeper types.IBCContractKeeper + channelKeeper types.ChannelKeeper } -func NewIBCHandler(keeper Keeper) IBCHandler { - return IBCHandler{keeper: keeper, channelKeeper: keeper.ChannelKeeper} +func NewIBCHandler(k types.IBCContractKeeper, ck types.ChannelKeeper) IBCHandler { + return IBCHandler{keeper: k, channelKeeper: ck} } // OnChanOpenInit implements the IBCModule interface @@ -265,7 +265,7 @@ func ValidateChannelParams(channelID string) error { return err } if channelSequence > math.MaxUint32 { - return sdkerrors.Wrapf(wasmTypes.ErrMaxIBCChannels, "channel sequence %d is greater than max allowed transfer channels %d", channelSequence, math.MaxUint32) + return sdkerrors.Wrapf(types.ErrMaxIBCChannels, "channel sequence %d is greater than max allowed transfer channels %d", channelSequence, math.MaxUint32) } return nil } diff --git a/x/wasm/keeper/handler_plugin.go b/x/wasm/keeper/handler_plugin.go index cc8c5b3ccd..daf38339eb 100644 --- a/x/wasm/keeper/handler_plugin.go +++ b/x/wasm/keeper/handler_plugin.go @@ -24,7 +24,7 @@ type SDKMessageHandler struct { encoders msgEncoder } -func NewDefaultMessageHandler(router sdk.Router, channelKeeper types.ChannelKeeper, capabilityKeeper types.CapabilityKeeper, unpacker codectypes.AnyUnpacker, portSource types.ICS20TransferPortSource, customEncoders ...*MessageEncoders) messenger { +func NewDefaultMessageHandler(router sdk.Router, channelKeeper types.ChannelKeeper, capabilityKeeper types.CapabilityKeeper, unpacker codectypes.AnyUnpacker, portSource types.ICS20TransferPortSource, customEncoders ...*MessageEncoders) Messenger { encoders := DefaultEncoders(unpacker, portSource) for _, e := range customEncoders { encoders = encoders.Merge(e) @@ -89,11 +89,11 @@ func (h SDKMessageHandler) handleSdkMessage(ctx sdk.Context, contractAddr sdk.Ad // MessageHandlerChain defines a chain of handlers that are called one by one until it can be handled. type MessageHandlerChain struct { - handlers []messenger + handlers []Messenger } -func NewMessageHandlerChain(first messenger, others ...messenger) *MessageHandlerChain { - r := &MessageHandlerChain{handlers: append([]messenger{first}, others...)} +func NewMessageHandlerChain(first Messenger, others ...Messenger) *MessageHandlerChain { + r := &MessageHandlerChain{handlers: append([]Messenger{first}, others...)} for i := range r.handlers { if r.handlers[i] == nil { panic(fmt.Sprintf("handler must not be nil at position : %d", i)) diff --git a/x/wasm/keeper/handler_plugin_test.go b/x/wasm/keeper/handler_plugin_test.go index f8cbe9c8b5..e46989f0f7 100644 --- a/x/wasm/keeper/handler_plugin_test.go +++ b/x/wasm/keeper/handler_plugin_test.go @@ -33,28 +33,28 @@ func TestMessageHandlerChainDispatch(t *testing.T) { myMsg := wasmvmtypes.CosmosMsg{Custom: []byte(`{}`)} specs := map[string]struct { - handlers []messenger + handlers []Messenger expErr *sdkerrors.Error expEvents []sdk.Event }{ "single handler": { - handlers: []messenger{capturingHandler}, + handlers: []Messenger{capturingHandler}, }, "passed to next handler": { - handlers: []messenger{alwaysUnknownMsgHandler, capturingHandler}, + handlers: []Messenger{alwaysUnknownMsgHandler, capturingHandler}, }, "stops iteration when handled": { - handlers: []messenger{capturingHandler, assertNotCalledHandler}, + handlers: []Messenger{capturingHandler, assertNotCalledHandler}, }, "stops iteration on handler error": { - handlers: []messenger{&wasmtesting.MockMessageHandler{ + handlers: []Messenger{&wasmtesting.MockMessageHandler{ DispatchMsgFn: func(ctx sdk.Context, contractAddr sdk.AccAddress, contractIBCPortID string, msg wasmvmtypes.CosmosMsg) (events []sdk.Event, data [][]byte, err error) { return nil, nil, types.ErrInvalidMsg }}, assertNotCalledHandler}, expErr: types.ErrInvalidMsg, }, "return events when handle": { - handlers: []messenger{&wasmtesting.MockMessageHandler{ + handlers: []Messenger{&wasmtesting.MockMessageHandler{ DispatchMsgFn: func(ctx sdk.Context, contractAddr sdk.AccAddress, contractIBCPortID string, msg wasmvmtypes.CosmosMsg) (events []sdk.Event, data [][]byte, err error) { _, data, _ = capturingHandler.DispatchMsg(ctx, contractAddr, contractIBCPortID, msg) return []sdk.Event{sdk.NewEvent("myEvent", sdk.NewAttribute("foo", "bar"))}, data, nil @@ -63,7 +63,7 @@ func TestMessageHandlerChainDispatch(t *testing.T) { expEvents: []sdk.Event{sdk.NewEvent("myEvent", sdk.NewAttribute("foo", "bar"))}, }, "return error when none can handle": { - handlers: []messenger{alwaysUnknownMsgHandler}, + handlers: []Messenger{alwaysUnknownMsgHandler}, expErr: types.ErrUnknownMsg, }, } diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index ba458e001f..f597eba219 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -51,13 +51,13 @@ type Option interface { } // WasmVMQueryHandler is an extension point for custom query handler implementations -type wasmVMQueryHandler interface { +type WASMVMQueryHandler interface { // HandleQuery executes the requested query HandleQuery(ctx sdk.Context, caller sdk.AccAddress, request wasmvmtypes.QueryRequest) ([]byte, error) } -// messenger is an extension point for custom wasmVM message handling -type messenger interface { +// Messenger is an extension point for custom wasmVM message handling +type Messenger interface { // DispatchMsg encodes the wasmVM message and dispatches it. DispatchMsg(ctx sdk.Context, contractAddr sdk.AccAddress, contractIBCPortID string, msg wasmvmtypes.CosmosMsg) (events []sdk.Event, data [][]byte, err error) } @@ -73,12 +73,11 @@ type Keeper struct { cdc codec.Marshaler accountKeeper types.AccountKeeper bank coinTransferrer - ChannelKeeper types.ChannelKeeper portKeeper types.PortKeeper capabilityKeeper types.CapabilityKeeper wasmVM types.WasmerEngine - wasmVMQueryHandler wasmVMQueryHandler - messenger messenger + wasmVMQueryHandler WASMVMQueryHandler + messenger Messenger // queryGasLimit is the max wasmvm gas that can be spent on executing a query with a contract queryGasLimit uint64 authZPolicy AuthorizationPolicy @@ -121,7 +120,6 @@ func NewKeeper( wasmVM: wasmer, accountKeeper: accountKeeper, bank: NewBankCoinTransferrer(bankKeeper), - ChannelKeeper: channelKeeper, portKeeper: portKeeper, capabilityKeeper: capabilityKeeper, messenger: NewDefaultMessageHandler(router, channelKeeper, capabilityKeeper, cdc, portSource), @@ -647,7 +645,7 @@ func (k Keeper) GetContractInfo(ctx sdk.Context, contractAddress sdk.AccAddress) return &contract } -func (k Keeper) containsContractInfo(ctx sdk.Context, contractAddress sdk.AccAddress) bool { +func (k Keeper) HasContractInfo(ctx sdk.Context, contractAddress sdk.AccAddress) bool { store := ctx.KVStore(k.storeKey) return store.Has(types.GetContractAddressKey(contractAddress)) } @@ -1003,7 +1001,7 @@ func (k Keeper) importContract(ctx sdk.Context, contractAddr sdk.AccAddress, c * if !k.containsCodeInfo(ctx, c.CodeID) { return sdkerrors.Wrapf(types.ErrNotFound, "code id: %d", c.CodeID) } - if k.containsContractInfo(ctx, contractAddr) { + if k.HasContractInfo(ctx, contractAddr) { return sdkerrors.Wrapf(types.ErrDuplicate, "contract: %s", contractAddr) } @@ -1039,9 +1037,23 @@ func gasMeter(ctx sdk.Context) MultipliedGasMeter { // Logger returns a module-specific logger. func (k Keeper) Logger(ctx sdk.Context) log.Logger { + return moduleLogger(ctx) +} + +func moduleLogger(ctx sdk.Context) log.Logger { return ctx.Logger().With("module", fmt.Sprintf("x/%s", types.ModuleName)) } +// Querier creates a new grpc querier instance +func Querier(k *Keeper) *grpcQuerier { + return NewGrpcQuerier(k.cdc, k.storeKey, k, k.queryGasLimit) +} + +// QueryGasLimit returns the gas limit for smart queries. +func (k Keeper) QueryGasLimit() sdk.Gas { + return k.queryGasLimit +} + // CoinTransferrer replicates the cosmos-sdk behaviour as in // https://github.com/cosmos/cosmos-sdk/blob/v0.41.4/x/bank/keeper/msg_server.go#L26 type CoinTransferrer struct { diff --git a/x/wasm/keeper/legacy_querier.go b/x/wasm/keeper/legacy_querier.go index ac66f2236f..6dc9debdef 100644 --- a/x/wasm/keeper/legacy_querier.go +++ b/x/wasm/keeper/legacy_querier.go @@ -29,7 +29,7 @@ const ( ) // NewLegacyQuerier creates a new querier -func NewLegacyQuerier(keeper *Keeper) sdk.Querier { +func NewLegacyQuerier(keeper types.ViewKeeper, gasLimit sdk.Gas) sdk.Querier { return func(ctx sdk.Context, path []string, req abci.RequestQuery) ([]byte, error) { var ( rsp interface{} @@ -41,18 +41,18 @@ func NewLegacyQuerier(keeper *Keeper) sdk.Querier { if err != nil { return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, err.Error()) } - rsp, err = queryContractInfo(ctx, addr, *keeper) + rsp, err = queryContractInfo(ctx, addr, keeper) case QueryListContractByCode: codeID, err := strconv.ParseUint(path[1], 10, 64) if err != nil { return nil, sdkerrors.Wrapf(types.ErrInvalid, "code id: %s", err.Error()) } - rsp, err = queryContractListByCode(ctx, codeID, *keeper) + rsp, err = queryContractListByCode(ctx, codeID, keeper) case QueryGetContractState: if len(path) < 3 { return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, "unknown data query endpoint") } - return queryContractState(ctx, path[1], path[2], req.Data, keeper) + return queryContractState(ctx, path[1], path[2], req.Data, gasLimit, keeper) case QueryGetCode: codeID, err := strconv.ParseUint(path[1], 10, 64) if err != nil { @@ -60,13 +60,13 @@ func NewLegacyQuerier(keeper *Keeper) sdk.Querier { } rsp, err = queryCode(ctx, codeID, keeper) case QueryListCode: - rsp, err = queryCodeList(ctx, *keeper) + rsp, err = queryCodeList(ctx, keeper) case QueryContractHistory: contractAddr, err := sdk.AccAddressFromBech32(path[1]) if err != nil { return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, err.Error()) } - rsp, err = queryContractHistory(ctx, contractAddr, *keeper) + rsp, err = queryContractHistory(ctx, contractAddr, keeper) default: return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, "unknown data query endpoint") } @@ -84,7 +84,7 @@ func NewLegacyQuerier(keeper *Keeper) sdk.Querier { } } -func queryContractState(ctx sdk.Context, bech, queryMethod string, data []byte, keeper *Keeper) (json.RawMessage, error) { +func queryContractState(ctx sdk.Context, bech, queryMethod string, data []byte, gasLimit sdk.Gas, keeper types.ViewKeeper) (json.RawMessage, error) { contractAddr, err := sdk.AccAddressFromBech32(bech) if err != nil { return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, bech) @@ -108,7 +108,7 @@ func queryContractState(ctx sdk.Context, bech, queryMethod string, data []byte, return keeper.QueryRaw(ctx, contractAddr, data), nil case QueryMethodContractStateSmart: // we enforce a subjective gas limit on all queries to avoid infinite loops - ctx = ctx.WithGasMeter(sdk.NewGasMeter(keeper.queryGasLimit)) + ctx = ctx.WithGasMeter(sdk.NewGasMeter(gasLimit)) // this returns raw bytes (must be base64-encoded) return keeper.QuerySmart(ctx, contractAddr, data) default: @@ -121,7 +121,7 @@ func queryContractState(ctx sdk.Context, bech, queryMethod string, data []byte, return bz, nil } -func queryCodeList(ctx sdk.Context, keeper Keeper) ([]types.CodeInfoResponse, error) { +func queryCodeList(ctx sdk.Context, keeper types.ViewKeeper) ([]types.CodeInfoResponse, error) { var info []types.CodeInfoResponse keeper.IterateCodeInfos(ctx, func(i uint64, res types.CodeInfo) bool { info = append(info, types.CodeInfoResponse{ @@ -136,7 +136,7 @@ func queryCodeList(ctx sdk.Context, keeper Keeper) ([]types.CodeInfoResponse, er return info, nil } -func queryContractHistory(ctx sdk.Context, contractAddr sdk.AccAddress, keeper Keeper) ([]types.ContractCodeHistoryEntry, error) { +func queryContractHistory(ctx sdk.Context, contractAddr sdk.AccAddress, keeper types.ViewKeeper) ([]types.ContractCodeHistoryEntry, error) { history := keeper.GetContractHistory(ctx, contractAddr) // redact response for i := range history { @@ -145,7 +145,7 @@ func queryContractHistory(ctx sdk.Context, contractAddr sdk.AccAddress, keeper K return history, nil } -func queryContractListByCode(ctx sdk.Context, codeID uint64, keeper Keeper) ([]types.ContractInfoWithAddress, error) { +func queryContractListByCode(ctx sdk.Context, codeID uint64, keeper types.ViewKeeper) ([]types.ContractInfoWithAddress, error) { var contracts []types.ContractInfoWithAddress keeper.IterateContractInfo(ctx, func(addr sdk.AccAddress, info types.ContractInfo) bool { if info.CodeID == codeID { diff --git a/x/wasm/keeper/legacy_querier_test.go b/x/wasm/keeper/legacy_querier_test.go index f056189981..35bade2a1f 100644 --- a/x/wasm/keeper/legacy_querier_test.go +++ b/x/wasm/keeper/legacy_querier_test.go @@ -48,7 +48,9 @@ func TestLegacyQueryContractState(t *testing.T) { keeper.importContractState(ctx, addr, contractModel) // this gets us full error, not redacted sdk.Error - q := NewLegacyQuerier(keeper) + var defaultQueryGasLimit sdk.Gas = 3000000 + q := NewLegacyQuerier(keeper, defaultQueryGasLimit) + specs := map[string]struct { srcPath []string srcReq abci.RequestQuery @@ -195,7 +197,9 @@ func TestLegacyQueryContractListByCodeOrdering(t *testing.T) { } // query and check the results are properly sorted - q := NewLegacyQuerier(keeper) + var defaultQueryGasLimit sdk.Gas = 3000000 + q := NewLegacyQuerier(keeper, defaultQueryGasLimit) + query := []string{QueryListContractByCode, fmt.Sprintf("%d", codeID)} data := abci.RequestQuery{} res, err := q(ctx, query, data) @@ -287,7 +291,9 @@ func TestLegacyQueryContractHistory(t *testing.T) { t.Run(msg, func(t *testing.T) { _, _, myContractAddr := keyPubAddr() keeper.appendToContractHistory(ctx, myContractAddr, spec.srcHistory...) - q := NewLegacyQuerier(keeper) + + var defaultQueryGasLimit sdk.Gas = 3000000 + q := NewLegacyQuerier(keeper, defaultQueryGasLimit) queryContractAddr := spec.srcQueryAddr if queryContractAddr == nil { queryContractAddr = myContractAddr @@ -336,7 +342,8 @@ func TestLegacyQueryCodeList(t *testing.T) { wasmCode), ) } - q := NewLegacyQuerier(keeper) + var defaultQueryGasLimit sdk.Gas = 3000000 + q := NewLegacyQuerier(keeper, defaultQueryGasLimit) // when query := []string{QueryListCode} data := abci.RequestQuery{} diff --git a/x/wasm/keeper/msg_server.go b/x/wasm/keeper/msg_server.go index 47ac36a344..50f5d013e7 100644 --- a/x/wasm/keeper/msg_server.go +++ b/x/wasm/keeper/msg_server.go @@ -11,10 +11,10 @@ import ( var _ types.MsgServer = msgServer{} type msgServer struct { - keeper *Keeper + keeper types.MsgOpsKeeper } -func NewMsgServerImpl(k *Keeper) types.MsgServer { +func NewMsgServerImpl(k types.MsgOpsKeeper) types.MsgServer { return &msgServer{keeper: k} } diff --git a/x/wasm/keeper/options.go b/x/wasm/keeper/options.go index 3e399efad3..2501544d52 100644 --- a/x/wasm/keeper/options.go +++ b/x/wasm/keeper/options.go @@ -21,7 +21,7 @@ func WithWasmEngine(x types.WasmerEngine) Option { // WithMessageHandler is an optional constructor parameter to set a custom handler for wasmVM messages. // This option should not be combined with Option `WithMessageEncoders`. -func WithMessageHandler(x messenger) Option { +func WithMessageHandler(x Messenger) Option { return optsFn(func(k *Keeper) { k.messenger = x }) @@ -29,7 +29,7 @@ func WithMessageHandler(x messenger) Option { // WithQueryHandler is an optional constructor parameter to set custom query handler for wasmVM requests. // This option should not be combined with Option `WithQueryPlugins`. -func WithQueryHandler(x wasmVMQueryHandler) Option { +func WithQueryHandler(x WASMVMQueryHandler) Option { return optsFn(func(k *Keeper) { k.wasmVMQueryHandler = x }) diff --git a/x/wasm/keeper/querier.go b/x/wasm/keeper/querier.go index 1ac865b5b1..7423ee2720 100644 --- a/x/wasm/keeper/querier.go +++ b/x/wasm/keeper/querier.go @@ -3,6 +3,7 @@ package keeper import ( "context" "encoding/binary" + "github.com/cosmos/cosmos-sdk/codec" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "runtime/debug" @@ -17,11 +18,14 @@ import ( var _ types.QueryServer = &grpcQuerier{} type grpcQuerier struct { - keeper *Keeper + cdc codec.Marshaler + storeKey sdk.StoreKey + keeper types.ViewKeeper + queryGasLimit sdk.Gas } -func NewQuerier(keeper *Keeper) grpcQuerier { - return grpcQuerier{keeper: keeper} +func NewGrpcQuerier(cdc codec.Marshaler, storeKey sdk.StoreKey, keeper types.ViewKeeper, queryGasLimit sdk.Gas) *grpcQuerier { + return &grpcQuerier{cdc: cdc, storeKey: storeKey, keeper: keeper, queryGasLimit: queryGasLimit} } func (q grpcQuerier) ContractInfo(c context.Context, req *types.QueryContractInfoRequest) (*types.QueryContractInfoResponse, error) { @@ -32,7 +36,7 @@ func (q grpcQuerier) ContractInfo(c context.Context, req *types.QueryContractInf if err != nil { return nil, err } - rsp, err := queryContractInfo(sdk.UnwrapSDKContext(c), contractAddr, *q.keeper) + rsp, err := queryContractInfo(sdk.UnwrapSDKContext(c), contractAddr, q.keeper) switch { case err != nil: return nil, err @@ -57,11 +61,11 @@ func (q grpcQuerier) ContractHistory(c context.Context, req *types.QueryContract ctx := sdk.UnwrapSDKContext(c) r := make([]types.ContractCodeHistoryEntry, 0) - prefixStore := prefix.NewStore(ctx.KVStore(q.keeper.storeKey), types.GetContractCodeHistoryElementPrefix(contractAddr)) + prefixStore := prefix.NewStore(ctx.KVStore(q.storeKey), types.GetContractCodeHistoryElementPrefix(contractAddr)) pageRes, err := query.FilteredPaginate(prefixStore, req.Pagination, func(key []byte, value []byte, accumulate bool) (bool, error) { if accumulate { var e types.ContractCodeHistoryEntry - if err := q.keeper.cdc.UnmarshalBinaryBare(value, &e); err != nil { + if err := q.cdc.UnmarshalBinaryBare(value, &e); err != nil { return false, err } e.Updated = nil // redact @@ -88,7 +92,7 @@ func (q grpcQuerier) ContractsByCode(c context.Context, req *types.QueryContract ctx := sdk.UnwrapSDKContext(c) r := make([]types.ContractInfoWithAddress, 0) - prefixStore := prefix.NewStore(ctx.KVStore(q.keeper.storeKey), types.GetContractByCodeIDSecondaryIndexPrefix(req.CodeId)) + prefixStore := prefix.NewStore(ctx.KVStore(q.storeKey), types.GetContractByCodeIDSecondaryIndexPrefix(req.CodeId)) pageRes, err := query.FilteredPaginate(prefixStore, req.Pagination, func(key []byte, value []byte, accumulate bool) (bool, error) { var contractAddr sdk.AccAddress = key[types.AbsoluteTxPositionLen:] c := q.keeper.GetContractInfo(ctx, contractAddr) @@ -122,12 +126,12 @@ func (q grpcQuerier) AllContractState(c context.Context, req *types.QueryAllCont return nil, err } ctx := sdk.UnwrapSDKContext(c) - if !q.keeper.containsContractInfo(ctx, contractAddr) { + if !q.keeper.HasContractInfo(ctx, contractAddr) { return nil, types.ErrNotFound } r := make([]types.Model, 0) - prefixStore := prefix.NewStore(ctx.KVStore(q.keeper.storeKey), types.GetContractStorePrefix(contractAddr)) + prefixStore := prefix.NewStore(ctx.KVStore(q.storeKey), types.GetContractStorePrefix(contractAddr)) pageRes, err := query.FilteredPaginate(prefixStore, req.Pagination, func(key []byte, value []byte, accumulate bool) (bool, error) { if accumulate { r = append(r, types.Model{ @@ -157,7 +161,7 @@ func (q grpcQuerier) RawContractState(c context.Context, req *types.QueryRawCont return nil, err } - if !q.keeper.containsContractInfo(ctx, contractAddr) { + if !q.keeper.HasContractInfo(ctx, contractAddr) { return nil, types.ErrNotFound } rsp := q.keeper.QueryRaw(ctx, contractAddr, req.QueryData) @@ -172,7 +176,7 @@ func (q grpcQuerier) SmartContractState(c context.Context, req *types.QuerySmart if err != nil { return nil, err } - ctx := sdk.UnwrapSDKContext(c).WithGasMeter(sdk.NewGasMeter(q.keeper.queryGasLimit)) + ctx := sdk.UnwrapSDKContext(c).WithGasMeter(sdk.NewGasMeter(q.queryGasLimit)) // recover from out-of-gas panic defer func() { if r := recover(); r != nil { @@ -186,7 +190,7 @@ func (q grpcQuerier) SmartContractState(c context.Context, req *types.QuerySmart err = sdkerrors.ErrPanic } rsp = nil - q.keeper.Logger(ctx). + moduleLogger(ctx). Debug("smart query contract", "error", "recovering panic", "contract-address", req.Address, @@ -231,11 +235,11 @@ func (q grpcQuerier) Codes(c context.Context, req *types.QueryCodesRequest) (*ty } ctx := sdk.UnwrapSDKContext(c) r := make([]types.CodeInfoResponse, 0) - prefixStore := prefix.NewStore(ctx.KVStore(q.keeper.storeKey), types.CodeKeyPrefix) + prefixStore := prefix.NewStore(ctx.KVStore(q.storeKey), types.CodeKeyPrefix) pageRes, err := query.FilteredPaginate(prefixStore, req.Pagination, func(key []byte, value []byte, accumulate bool) (bool, error) { if accumulate { var c types.CodeInfo - if err := q.keeper.cdc.UnmarshalBinaryBare(value, &c); err != nil { + if err := q.cdc.UnmarshalBinaryBare(value, &c); err != nil { return false, err } r = append(r, types.CodeInfoResponse{ @@ -254,7 +258,7 @@ func (q grpcQuerier) Codes(c context.Context, req *types.QueryCodesRequest) (*ty return &types.QueryCodesResponse{CodeInfos: r, Pagination: pageRes}, nil } -func queryContractInfo(ctx sdk.Context, addr sdk.AccAddress, keeper Keeper) (*types.ContractInfoWithAddress, error) { +func queryContractInfo(ctx sdk.Context, addr sdk.AccAddress, keeper types.ViewKeeper) (*types.ContractInfoWithAddress, error) { info := keeper.GetContractInfo(ctx, addr) if info == nil { return nil, types.ErrNotFound @@ -267,7 +271,7 @@ func queryContractInfo(ctx sdk.Context, addr sdk.AccAddress, keeper Keeper) (*ty }, nil } -func queryCode(ctx sdk.Context, codeID uint64, keeper *Keeper) (*types.QueryCodeResponse, error) { +func queryCode(ctx sdk.Context, codeID uint64, keeper types.ViewKeeper) (*types.QueryCodeResponse, error) { if codeID == 0 { return nil, nil } diff --git a/x/wasm/keeper/querier_test.go b/x/wasm/keeper/querier_test.go index 1c9c5e2064..8f501bbb8c 100644 --- a/x/wasm/keeper/querier_test.go +++ b/x/wasm/keeper/querier_test.go @@ -31,7 +31,7 @@ func TestQueryAllContractState(t *testing.T) { } require.NoError(t, keeper.importContractState(ctx, contractAddr, contractModel)) - q := NewQuerier(keeper) + q := Querier(keeper) specs := map[string]struct { srcQuery *types.QueryAllContractStateRequest expModelContains []types.Model @@ -113,7 +113,7 @@ func TestQuerySmartContractState(t *testing.T) { exampleContract := InstantiateHackatomExampleContract(t, ctx, keepers) contractAddr := exampleContract.Contract.String() - q := NewQuerier(keeper) + q := Querier(keeper) specs := map[string]struct { srcAddr sdk.AccAddress srcQuery *types.QuerySmartContractStateRequest @@ -183,7 +183,7 @@ func TestQuerySmartContractPanics(t *testing.T) { return nil, 0, nil }} // when - q := NewQuerier(keepers.WasmKeeper) + q := Querier(keepers.WasmKeeper) got, err := q.SmartContractState(sdk.WrapSDKContext(ctx), &types.QuerySmartContractStateRequest{ Address: contractAddr.String(), }) @@ -205,7 +205,7 @@ func TestQueryRawContractState(t *testing.T) { } require.NoError(t, keeper.importContractState(ctx, exampleContract.Contract, contractModel)) - q := NewQuerier(keeper) + q := Querier(keeper) specs := map[string]struct { srcQuery *types.QueryRawContractStateRequest expData []byte @@ -293,7 +293,7 @@ func TestQueryContractListByCodeOrdering(t *testing.T) { } // query and check the results are properly sorted - q := NewQuerier(keeper) + q := Querier(keeper) res, err := q.ContractsByCode(sdk.WrapSDKContext(ctx), &types.QueryContractsByCodeRequest{CodeId: codeID}) require.NoError(t, err) @@ -434,7 +434,7 @@ func TestQueryContractHistory(t *testing.T) { keeper.appendToContractHistory(xCtx, cAddr, spec.srcHistory...) // when - q := NewQuerier(keeper) + q := Querier(keeper) got, err := q.ContractHistory(sdk.WrapSDKContext(xCtx), &spec.req) // then @@ -509,7 +509,7 @@ func TestQueryCodeList(t *testing.T) { ) } // when - q := NewQuerier(keeper) + q := Querier(keeper) got, err := q.Codes(sdk.WrapSDKContext(xCtx), &spec.req) // then diff --git a/x/wasm/keeper/query_plugins.go b/x/wasm/keeper/query_plugins.go index b1f038359e..f469fdc266 100644 --- a/x/wasm/keeper/query_plugins.go +++ b/x/wasm/keeper/query_plugins.go @@ -16,11 +16,11 @@ import ( type QueryHandler struct { Ctx sdk.Context - Plugins wasmVMQueryHandler + Plugins WASMVMQueryHandler Caller sdk.AccAddress } -func NewQueryHandler(ctx sdk.Context, vmQueryHandler wasmVMQueryHandler, caller sdk.AccAddress) QueryHandler { +func NewQueryHandler(ctx sdk.Context, vmQueryHandler WASMVMQueryHandler, caller sdk.AccAddress) QueryHandler { return QueryHandler{ Ctx: ctx, Plugins: vmQueryHandler, diff --git a/x/wasm/keeper/recurse_test.go b/x/wasm/keeper/recurse_test.go index 92788ae436..b0f45c384b 100644 --- a/x/wasm/keeper/recurse_test.go +++ b/x/wasm/keeper/recurse_test.go @@ -189,9 +189,6 @@ func TestGasOnExternalQuery(t *testing.T) { for name, tc := range cases { t.Run(name, func(t *testing.T) { - // set the external gas limit (normally from config file) - keeper.queryGasLimit = tc.gasLimit - recurse := tc.msg recurse.Contract = contractAddr msg := buildRecurseQuery(t, recurse) @@ -202,12 +199,12 @@ func TestGasOnExternalQuery(t *testing.T) { if tc.expectPanic { require.Panics(t, func() { // this should run out of gas - _, err := NewLegacyQuerier(keeper)(ctx, path, req) + _, err := NewLegacyQuerier(keeper, tc.gasLimit)(ctx, path, req) t.Logf("%v", err) }) } else { // otherwise, make sure we get a good success - _, err := NewLegacyQuerier(keeper)(ctx, path, req) + _, err := NewLegacyQuerier(keeper, tc.gasLimit)(ctx, path, req) require.NoError(t, err) } }) diff --git a/x/wasm/keeper/relay_test.go b/x/wasm/keeper/relay_test.go index 330e948112..889792b79e 100644 --- a/x/wasm/keeper/relay_test.go +++ b/x/wasm/keeper/relay_test.go @@ -82,7 +82,7 @@ func TestOnConnectChannel(t *testing.T) { contractGas sdk.Gas contractResp *wasmvmtypes.IBCBasicResponse contractErr error - overwriteMessenger messenger + overwriteMessenger Messenger expErr bool expContractEventAttrs int expNoEvents bool @@ -192,7 +192,7 @@ func TestOnCloseChannel(t *testing.T) { contractGas sdk.Gas contractResp *wasmvmtypes.IBCBasicResponse contractErr error - overwriteMessenger messenger + overwriteMessenger Messenger expErr bool expContractEventAttrs int expNoEvents bool @@ -302,7 +302,7 @@ func TestOnRecvPacket(t *testing.T) { contractGas sdk.Gas contractResp *wasmvmtypes.IBCReceiveResponse contractErr error - overwriteMessenger messenger + overwriteMessenger Messenger expErr bool expContractEventAttrs int expNoEvents bool @@ -427,7 +427,7 @@ func TestOnAckPacket(t *testing.T) { contractGas sdk.Gas contractResp *wasmvmtypes.IBCBasicResponse contractErr error - overwriteMessenger messenger + overwriteMessenger Messenger expErr bool expContractEventAttrs int expNoEvents bool @@ -538,7 +538,7 @@ func TestOnTimeoutPacket(t *testing.T) { contractGas sdk.Gas contractResp *wasmvmtypes.IBCBasicResponse contractErr error - overwriteMessenger messenger + overwriteMessenger Messenger expErr bool expContractEventAttrs int expNoEvents bool diff --git a/x/wasm/module.go b/x/wasm/module.go index 4a36fb23be..102c69165f 100644 --- a/x/wasm/module.go +++ b/x/wasm/module.go @@ -116,7 +116,7 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { } func (am AppModule) LegacyQuerierHandler(amino *codec.LegacyAmino) sdk.Querier { - return keeper.NewLegacyQuerier(am.keeper) + return keeper.NewLegacyQuerier(am.keeper, am.keeper.QueryGasLimit()) } // RegisterInvariants registers the wasm module invariants. diff --git a/x/wasm/types/events.go b/x/wasm/types/events.go index 2f48e5847c..2ca36b9a72 100644 --- a/x/wasm/types/events.go +++ b/x/wasm/types/events.go @@ -7,6 +7,5 @@ const ( const ( // event attributes AttributeKeyContract = "contract_address" AttributeKeyCodeID = "code_id" - AttributeKeyCodeIDs = "code_ids" AttributeKeySigner = "signer" ) diff --git a/x/wasm/types/exported_keepers.go b/x/wasm/types/exported_keepers.go new file mode 100644 index 0000000000..348ca29a90 --- /dev/null +++ b/x/wasm/types/exported_keepers.go @@ -0,0 +1,76 @@ +package types + +import ( + types2 "github.com/CosmWasm/wasmvm/types" + "github.com/cosmos/cosmos-sdk/types" + sdk "github.com/cosmos/cosmos-sdk/types" + capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" +) + +// ViewKeeper provides read only operations +type ViewKeeper interface { + GetContractHistory(ctx types.Context, contractAddr types.AccAddress) []ContractCodeHistoryEntry + QuerySmart(ctx types.Context, contractAddr types.AccAddress, req []byte) ([]byte, error) + QueryRaw(ctx types.Context, contractAddress types.AccAddress, key []byte) []byte + GetContractInfo(ctx types.Context, contractAddress types.AccAddress) *ContractInfo + IterateContractInfo(ctx types.Context, cb func(types.AccAddress, ContractInfo) bool) + GetContractState(ctx types.Context, contractAddress types.AccAddress) types.Iterator + GetCodeInfo(ctx types.Context, codeID uint64) *CodeInfo + IterateCodeInfos(ctx types.Context, cb func(uint64, CodeInfo) bool) + GetByteCode(ctx types.Context, codeID uint64) ([]byte, error) + IsPinnedCode(ctx types.Context, codeID uint64) bool + HasContractInfo(ctx sdk.Context, contractAddress sdk.AccAddress) bool +} + +// MsgOpsKeeper contains mutable operations that are triggered by messages normally +type MsgOpsKeeper interface { + Create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, source string, builder string, instantiateAccess *AccessConfig) (codeID uint64, err error) + Instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.AccAddress, initMsg []byte, label string, deposit sdk.Coins) (sdk.AccAddress, []byte, error) + Execute(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, msg []byte, coins sdk.Coins) (*sdk.Result, error) + Migrate(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, newCodeID uint64, msg []byte) (*sdk.Result, error) + UpdateContractAdmin(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, newAdmin sdk.AccAddress) error + + // ClearContractAdmin sets the admin value on the ContractInfo to nil, to disable further migrations/ updates. + ClearContractAdmin(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress) error + PinCode(ctx sdk.Context, codeID uint64) error + UnpinCode(ctx sdk.Context, codeID uint64) error +} + +// IBCContractKeeper IBC lifecycle event handler +type IBCContractKeeper interface { + OnOpenChannel( + ctx sdk.Context, + contractAddr sdk.AccAddress, + channel types2.IBCChannel, + ) error + OnConnectChannel( + ctx sdk.Context, + contractAddr sdk.AccAddress, + channel types2.IBCChannel, + ) error + OnCloseChannel( + ctx sdk.Context, + contractAddr sdk.AccAddress, + channel types2.IBCChannel, + ) error + OnRecvPacket( + ctx sdk.Context, + contractAddr sdk.AccAddress, + packet types2.IBCPacket, + ) ([]byte, error) + OnAckPacket( + ctx sdk.Context, + contractAddr sdk.AccAddress, + acknowledgement types2.IBCAcknowledgement, + ) error + OnTimeoutPacket( + ctx sdk.Context, + contractAddr sdk.AccAddress, + packet types2.IBCPacket, + ) error + // ClaimCapability allows the transfer module to claim a capability + //that IBC module passes to it + ClaimCapability(ctx sdk.Context, cap *capabilitytypes.Capability, name string) error + // AuthenticateCapability wraps the scopedKeeper's AuthenticateCapability function + AuthenticateCapability(ctx sdk.Context, cap *capabilitytypes.Capability, name string) bool +} diff --git a/x/wasm/types/keys.go b/x/wasm/types/keys.go index e0415ca0d4..ff9bcb68a8 100644 --- a/x/wasm/types/keys.go +++ b/x/wasm/types/keys.go @@ -14,10 +14,10 @@ const ( // TStoreKey is the string transient store representation TStoreKey = "transient_" + ModuleName - // QuerierRoute is the querier route for the staking module + // QuerierRoute is the querier route for the wasm module QuerierRoute = ModuleName - // RouterKey is the msg router key for the staking module + // RouterKey is the msg router key for the wasm module RouterKey = ModuleName ) From 408bba14a5c6d583abe32ffb235a364130136298 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Tue, 23 Mar 2021 15:04:01 +0100 Subject: [PATCH 2/4] Extract contract keeper --- x/wasm/handler.go | 2 +- x/wasm/keeper/bench_test.go | 2 +- x/wasm/keeper/contract_keeper.go | 68 +++++++++++++++ x/wasm/keeper/genesis.go | 4 +- x/wasm/keeper/genesis_test.go | 34 ++++---- x/wasm/keeper/ibc_test.go | 2 +- x/wasm/keeper/keeper.go | 33 +------ x/wasm/keeper/keeper_test.go | 124 +++++++++++++-------------- x/wasm/keeper/legacy_querier_test.go | 8 +- x/wasm/keeper/msg_server.go | 4 +- x/wasm/keeper/proposal_handler.go | 77 +++++++---------- x/wasm/keeper/querier_test.go | 4 +- x/wasm/keeper/reflect_test.go | 20 ++--- x/wasm/keeper/staking_test.go | 63 +++++++------- x/wasm/keeper/submsg_test.go | 22 ++--- x/wasm/keeper/test_common.go | 57 ++++++------ x/wasm/module.go | 4 +- x/wasm/types/exported_keepers.go | 19 +++- x/wasm/types/proposal.go | 14 +-- 19 files changed, 305 insertions(+), 256 deletions(-) create mode 100644 x/wasm/keeper/contract_keeper.go diff --git a/x/wasm/handler.go b/x/wasm/handler.go index 34ae264330..434520d06e 100644 --- a/x/wasm/handler.go +++ b/x/wasm/handler.go @@ -12,7 +12,7 @@ import ( ) // NewHandler returns a handler for "bank" type messages. -func NewHandler(k types.MsgOpsKeeper) sdk.Handler { +func NewHandler(k types.ContractOpsKeeper) sdk.Handler { msgServer := keeper.NewMsgServerImpl(k) return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { diff --git a/x/wasm/keeper/bench_test.go b/x/wasm/keeper/bench_test.go index 341236887a..21b16649eb 100644 --- a/x/wasm/keeper/bench_test.go +++ b/x/wasm/keeper/bench_test.go @@ -43,7 +43,7 @@ func BenchmarkExecution(b *testing.B) { ctx, keepers := createTestInput(b, false, SupportedFeatures, wasmConfig, spec.db()) example := InstantiateHackatomExampleContract(b, ctx, keepers) if spec.pinned { - require.NoError(b, keepers.WasmKeeper.PinCode(ctx, example.CodeID)) + require.NoError(b, keepers.ContractKeeper.PinCode(ctx, example.CodeID)) } b.ResetTimer() for i := 0; i < b.N; i++ { diff --git a/x/wasm/keeper/contract_keeper.go b/x/wasm/keeper/contract_keeper.go new file mode 100644 index 0000000000..4d26831125 --- /dev/null +++ b/x/wasm/keeper/contract_keeper.go @@ -0,0 +1,68 @@ +package keeper + +import ( + "github.com/CosmWasm/wasmd/x/wasm/types" + sdk "github.com/cosmos/cosmos-sdk/types" +) + +var _ types.ContractOpsKeeper = PermissionedKeeper{} + +// decoratedKeeper contains a subset of the wasm keeper that are already or can be guarded by an authorization policy in the future +type decoratedKeeper interface { + create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, source string, builder string, instantiateAccess *types.AccessConfig, authZ AuthorizationPolicy) (codeID uint64, err error) + instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.AccAddress, initMsg []byte, label string, deposit sdk.Coins, authZ AuthorizationPolicy) (sdk.AccAddress, []byte, error) + migrate(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, newCodeID uint64, msg []byte, authZ AuthorizationPolicy) (*sdk.Result, error) + setContractAdmin(ctx sdk.Context, contractAddress, caller, newAdmin sdk.AccAddress, authZ AuthorizationPolicy) error + pinCode(ctx sdk.Context, codeID uint64) error + unpinCode(ctx sdk.Context, codeID uint64) error + execute(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, msg []byte, coins sdk.Coins) (*sdk.Result, error) +} + +type PermissionedKeeper struct { + authZPolicy AuthorizationPolicy + nested decoratedKeeper +} + +func NewPermissionedKeeper(nested decoratedKeeper, authZPolicy AuthorizationPolicy) *PermissionedKeeper { + return &PermissionedKeeper{authZPolicy: authZPolicy, nested: nested} +} + +func NewGovPermissionKeeper(nested decoratedKeeper) *PermissionedKeeper { + return NewPermissionedKeeper(nested, GovAuthorizationPolicy{}) +} + +func NewDefaultPermissionKeeper(nested decoratedKeeper) *PermissionedKeeper { + return NewPermissionedKeeper(nested, DefaultAuthorizationPolicy{}) +} + +func (p PermissionedKeeper) Create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, source string, builder string, instantiateAccess *types.AccessConfig) (codeID uint64, err error) { + return p.nested.create(ctx, creator, wasmCode, source, builder, instantiateAccess, p.authZPolicy) +} + +func (p PermissionedKeeper) Instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.AccAddress, initMsg []byte, label string, deposit sdk.Coins) (sdk.AccAddress, []byte, error) { + return p.nested.instantiate(ctx, codeID, creator, admin, initMsg, label, deposit, p.authZPolicy) +} + +func (p PermissionedKeeper) Execute(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, msg []byte, coins sdk.Coins) (*sdk.Result, error) { + return p.nested.execute(ctx, contractAddress, caller, msg, coins) +} + +func (p PermissionedKeeper) Migrate(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, newCodeID uint64, msg []byte) (*sdk.Result, error) { + return p.nested.migrate(ctx, contractAddress, caller, newCodeID, msg, p.authZPolicy) +} + +func (p PermissionedKeeper) UpdateContractAdmin(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, newAdmin sdk.AccAddress) error { + return p.nested.setContractAdmin(ctx, contractAddress, caller, newAdmin, p.authZPolicy) +} + +func (p PermissionedKeeper) ClearContractAdmin(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress) error { + return p.nested.setContractAdmin(ctx, contractAddress, caller, nil, p.authZPolicy) +} + +func (p PermissionedKeeper) PinCode(ctx sdk.Context, codeID uint64) error { + return p.nested.pinCode(ctx, codeID) +} + +func (p PermissionedKeeper) UnpinCode(ctx sdk.Context, codeID uint64) error { + return p.nested.unpinCode(ctx, codeID) +} diff --git a/x/wasm/keeper/genesis.go b/x/wasm/keeper/genesis.go index 49d71ae8c1..adf362fe52 100644 --- a/x/wasm/keeper/genesis.go +++ b/x/wasm/keeper/genesis.go @@ -16,8 +16,8 @@ type ValidatorSetSource interface { // // CONTRACT: all types of accounts must have been already initialized/created func InitGenesis(ctx sdk.Context, keeper *Keeper, data types.GenesisState, stakingKeeper ValidatorSetSource, msgHandler sdk.Handler) ([]abci.ValidatorUpdate, error) { + contractKeeper := NewGovPermissionKeeper(keeper) keeper.setParams(ctx, data.Params) - var maxCodeID uint64 for i, code := range data.Codes { err := keeper.importCode(ctx, code.CodeID, code.CodeInfo, code.CodeBytes) @@ -28,7 +28,7 @@ func InitGenesis(ctx sdk.Context, keeper *Keeper, data types.GenesisState, staki maxCodeID = code.CodeID } if code.Pinned { - if err := keeper.PinCode(ctx, code.CodeID); err != nil { + if err := contractKeeper.PinCode(ctx, code.CodeID); err != nil { return nil, sdkerrors.Wrapf(err, "contract number %d", i) } } diff --git a/x/wasm/keeper/genesis_test.go b/x/wasm/keeper/genesis_test.go index 2dc2fa6821..38893cb141 100644 --- a/x/wasm/keeper/genesis_test.go +++ b/x/wasm/keeper/genesis_test.go @@ -35,7 +35,8 @@ import ( const firstCodeID = 1 func TestGenesisExportImport(t *testing.T) { - srcKeeper, srcCtx, srcStoreKeys := setupKeeper(t) + wasmKeeper, srcCtx, srcStoreKeys := setupKeeper(t) + contractKeeper := NewGovPermissionKeeper(wasmKeeper) wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) @@ -43,7 +44,7 @@ func TestGenesisExportImport(t *testing.T) { // store some test data f := fuzz.New().Funcs(ModelFuzzers...) - srcKeeper.setParams(srcCtx, types.DefaultParams()) + wasmKeeper.setParams(srcCtx, types.DefaultParams()) for i := 0; i < 25; i++ { var ( @@ -60,24 +61,24 @@ func TestGenesisExportImport(t *testing.T) { f.Fuzz(&pinned) creatorAddr, err := sdk.AccAddressFromBech32(codeInfo.Creator) require.NoError(t, err) - codeID, err := srcKeeper.Create(srcCtx, creatorAddr, wasmCode, codeInfo.Source, codeInfo.Builder, &codeInfo.InstantiateConfig) + codeID, err := contractKeeper.Create(srcCtx, creatorAddr, wasmCode, codeInfo.Source, codeInfo.Builder, &codeInfo.InstantiateConfig) require.NoError(t, err) if pinned { - srcKeeper.PinCode(srcCtx, codeID) + contractKeeper.PinCode(srcCtx, codeID) } contract.CodeID = codeID - contractAddr := srcKeeper.generateContractAddress(srcCtx, codeID) - srcKeeper.storeContractInfo(srcCtx, contractAddr, &contract) - srcKeeper.appendToContractHistory(srcCtx, contractAddr, history...) - srcKeeper.importContractState(srcCtx, contractAddr, stateModels) + contractAddr := wasmKeeper.generateContractAddress(srcCtx, codeID) + wasmKeeper.storeContractInfo(srcCtx, contractAddr, &contract) + wasmKeeper.appendToContractHistory(srcCtx, contractAddr, history...) + wasmKeeper.importContractState(srcCtx, contractAddr, stateModels) } var wasmParams types.Params f.NilChance(0).Fuzz(&wasmParams) - srcKeeper.setParams(srcCtx, wasmParams) + wasmKeeper.setParams(srcCtx, wasmParams) // export - exportedState := ExportGenesis(srcCtx, srcKeeper) + exportedState := ExportGenesis(srcCtx, wasmKeeper) // order should not matter rand.Shuffle(len(exportedState.Codes), func(i, j int) { exportedState.Codes[i], exportedState.Codes[j] = exportedState.Codes[j], exportedState.Codes[i] @@ -92,10 +93,10 @@ func TestGenesisExportImport(t *testing.T) { require.NoError(t, err) // reset ContractInfo in source DB for comparison with dest DB - srcKeeper.IterateContractInfo(srcCtx, func(address sdk.AccAddress, info wasmTypes.ContractInfo) bool { - srcKeeper.deleteContractSecondIndex(srcCtx, address, &info) + wasmKeeper.IterateContractInfo(srcCtx, func(address sdk.AccAddress, info wasmTypes.ContractInfo) bool { + wasmKeeper.deleteContractSecondIndex(srcCtx, address, &info) info.ResetFromGenesis(srcCtx) - srcKeeper.storeContractInfo(srcCtx, address, &info) + wasmKeeper.storeContractInfo(srcCtx, address, &info) return false }) @@ -105,7 +106,7 @@ func TestGenesisExportImport(t *testing.T) { var importState wasmTypes.GenesisState err = json.Unmarshal(exportedGenesis, &importState) require.NoError(t, err) - InitGenesis(dstCtx, dstKeeper, importState, &StakingKeeperMock{}, TestHandler(dstKeeper)) + InitGenesis(dstCtx, dstKeeper, importState, &StakingKeeperMock{}, TestHandler(contractKeeper)) // compare whole DB for j := range srcStoreKeys { @@ -479,6 +480,7 @@ func TestImportContractWithCodeHistoryReset(t *testing.T) { ] }` keeper, ctx, _ := setupKeeper(t) + contractKeeper := NewGovPermissionKeeper(keeper) wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) @@ -497,7 +499,7 @@ func TestImportContractWithCodeHistoryReset(t *testing.T) { ctx = ctx.WithBlockHeight(0).WithGasMeter(sdk.NewInfiniteGasMeter()) // when - _, err = InitGenesis(ctx, keeper, importState, &StakingKeeperMock{}, TestHandler(keeper)) + _, err = InitGenesis(ctx, keeper, importState, &StakingKeeperMock{}, TestHandler(contractKeeper)) require.NoError(t, err) // verify wasm code @@ -597,7 +599,7 @@ func TestSupportedGenMsgTypes(t *testing.T) { ctx = ctx.WithBlockHeight(0).WithGasMeter(sdk.NewInfiniteGasMeter()) fundAccounts(t, ctx, keepers.AccountKeeper, keepers.BankKeeper, myAddress, sdk.NewCoins(sdk.NewCoin(denom, sdk.NewInt(100)))) // when - _, err = InitGenesis(ctx, keeper, importState, &StakingKeeperMock{}, TestHandler(keeper)) + _, err = InitGenesis(ctx, keeper, importState, &StakingKeeperMock{}, TestHandler(keepers.ContractKeeper)) require.NoError(t, err) // verify code stored diff --git a/x/wasm/keeper/ibc_test.go b/x/wasm/keeper/ibc_test.go index fc94f7ecac..a25c6715a2 100644 --- a/x/wasm/keeper/ibc_test.go +++ b/x/wasm/keeper/ibc_test.go @@ -29,7 +29,7 @@ func TestBindingPortForIBCContractOnInstantiate(t *testing.T) { // create a second contract should give yet another portID (and different address) creator := RandomAccountAddress(t) - addr, _, err := keepers.WasmKeeper.Instantiate(ctx, example.CodeID, creator, nil, initMsgBz, "ibc-reflect-2", nil) + addr, _, err := keepers.ContractKeeper.Instantiate(ctx, example.CodeID, creator, nil, initMsgBz, "ibc-reflect-2", nil) require.NoError(t, err) require.NotEqual(t, example.Contract, addr) diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index f597eba219..471c95b913 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -80,7 +80,6 @@ type Keeper struct { messenger Messenger // queryGasLimit is the max wasmvm gas that can be spent on executing a query with a contract queryGasLimit uint64 - authZPolicy AuthorizationPolicy paramSpace paramtypes.Subspace } @@ -124,7 +123,6 @@ func NewKeeper( capabilityKeeper: capabilityKeeper, messenger: NewDefaultMessageHandler(router, channelKeeper, capabilityKeeper, cdc, portSource), queryGasLimit: wasmConfig.SmartQueryGasLimit, - authZPolicy: DefaultAuthorizationPolicy{}, paramSpace: paramSpace, } keeper.wasmVMQueryHandler = DefaultQueryPlugins(bankKeeper, stakingKeeper, distKeeper, channelKeeper, queryRouter, &keeper) @@ -163,11 +161,6 @@ func (k Keeper) setParams(ctx sdk.Context, ps types.Params) { k.paramSpace.SetParamSet(ctx, &ps) } -// Create uploads and compiles a WASM contract, returning a short identifier for the contract -func (k Keeper) Create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, source string, builder string, instantiateAccess *types.AccessConfig) (codeID uint64, err error) { - return k.create(ctx, creator, wasmCode, source, builder, instantiateAccess, k.authZPolicy) -} - func (k Keeper) create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, source string, builder string, instantiateAccess *types.AccessConfig, authZ AuthorizationPolicy) (codeID uint64, err error) { if !authZ.CanCreateCode(k.getUploadAccessConfig(ctx), creator) { return 0, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "can not create code") @@ -221,11 +214,6 @@ func (k Keeper) importCode(ctx sdk.Context, codeID uint64, codeInfo types.CodeIn return nil } -// Instantiate creates an instance of a WASM contract -func (k Keeper) Instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.AccAddress, initMsg []byte, label string, deposit sdk.Coins) (sdk.AccAddress, []byte, error) { - return k.instantiate(ctx, codeID, creator, admin, initMsg, label, deposit, k.authZPolicy) -} - func (k Keeper) instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.AccAddress, initMsg []byte, label string, deposit sdk.Coins, authZ AuthorizationPolicy) (sdk.AccAddress, []byte, error) { defer telemetry.MeasureSince(time.Now(), "wasm", "contract", "instantiate") if !k.IsPinnedCode(ctx, codeID) { @@ -321,7 +309,7 @@ func (k Keeper) instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.A } // Execute executes the contract instance -func (k Keeper) Execute(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, msg []byte, coins sdk.Coins) (*sdk.Result, error) { +func (k Keeper) execute(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, msg []byte, coins sdk.Coins) (*sdk.Result, error) { defer telemetry.MeasureSince(time.Now(), "wasm", "contract", "execute") contractInfo, codeInfo, prefixStore, err := k.contractInstance(ctx, contractAddress) if err != nil { @@ -366,11 +354,6 @@ func (k Keeper) Execute(ctx sdk.Context, contractAddress sdk.AccAddress, caller }, nil } -// Migrate allows to upgrade a contract to a new code with data migration. -func (k Keeper) Migrate(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, newCodeID uint64, msg []byte) (*sdk.Result, error) { - return k.migrate(ctx, contractAddress, caller, newCodeID, msg, k.authZPolicy) -} - func (k Keeper) migrate(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, newCodeID uint64, msg []byte, authZ AuthorizationPolicy) (*sdk.Result, error) { defer telemetry.MeasureSince(time.Now(), "wasm", "contract", "migrate") if !k.IsPinnedCode(ctx, newCodeID) { @@ -528,16 +511,6 @@ func (k Keeper) deleteContractSecondIndex(ctx sdk.Context, contractAddress sdk.A ctx.KVStore(k.storeKey).Delete(types.GetContractByCreatedSecondaryIndexKey(contractAddress, contractInfo)) } -// UpdateContractAdmin sets the admin value on the ContractInfo. It must be a valid address (use ClearContractAdmin to remove it) -func (k Keeper) UpdateContractAdmin(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, newAdmin sdk.AccAddress) error { - return k.setContractAdmin(ctx, contractAddress, caller, newAdmin, k.authZPolicy) -} - -// ClearContractAdmin sets the admin value on the ContractInfo to nil, to disable further migrations/ updates. -func (k Keeper) ClearContractAdmin(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress) error { - return k.setContractAdmin(ctx, contractAddress, caller, nil, k.authZPolicy) -} - func (k Keeper) setContractAdmin(ctx sdk.Context, contractAddress, caller, newAdmin sdk.AccAddress, authZ AuthorizationPolicy) error { contractInfo := k.GetContractInfo(ctx, contractAddress) if contractInfo == nil { @@ -731,7 +704,7 @@ func (k Keeper) GetByteCode(ctx sdk.Context, codeID uint64) ([]byte, error) { } // PinCode pins the wasm contract in wasmvm cache -func (k Keeper) PinCode(ctx sdk.Context, codeID uint64) error { +func (k Keeper) pinCode(ctx sdk.Context, codeID uint64) error { codeInfo := k.GetCodeInfo(ctx, codeID) if codeInfo == nil { return sdkerrors.Wrap(types.ErrNotFound, "code info") @@ -747,7 +720,7 @@ func (k Keeper) PinCode(ctx sdk.Context, codeID uint64) error { } // UnpinCode removes the wasm contract from wasmvm cache -func (k Keeper) UnpinCode(ctx sdk.Context, codeID uint64) error { +func (k Keeper) unpinCode(ctx sdk.Context, codeID uint64) error { codeInfo := k.GetCodeInfo(ctx, codeID) if codeInfo == nil { return sdkerrors.Wrap(types.ErrNotFound, "code info") diff --git a/x/wasm/keeper/keeper_test.go b/x/wasm/keeper/keeper_test.go index 85de5c861d..9302fae123 100644 --- a/x/wasm/keeper/keeper_test.go +++ b/x/wasm/keeper/keeper_test.go @@ -26,12 +26,12 @@ const SupportedFeatures = "staking,stargate" func TestNewKeeper(t *testing.T) { _, keepers := CreateTestInput(t, false, SupportedFeatures) - require.NotNil(t, keepers.WasmKeeper) + require.NotNil(t, keepers.ContractKeeper) } func TestCreate(t *testing.T) { ctx, keepers := CreateTestInput(t, false, SupportedFeatures) - accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.WasmKeeper, keepers.BankKeeper + accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) creator := createFakeFundedAccount(t, ctx, accKeeper, bankKeeper, deposit) @@ -43,7 +43,7 @@ func TestCreate(t *testing.T) { require.NoError(t, err) require.Equal(t, uint64(1), contractID) // and verify content - storedCode, err := keeper.GetByteCode(ctx, contractID) + storedCode, err := keepers.WasmKeeper.GetByteCode(ctx, contractID) require.NoError(t, err) require.Equal(t, wasmCode, storedCode) } @@ -80,8 +80,8 @@ func TestCreateStoresInstantiatePermission(t *testing.T) { for msg, spec := range specs { t.Run(msg, func(t *testing.T) { ctx, keepers := CreateTestInput(t, false, SupportedFeatures) - accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.WasmKeeper, keepers.BankKeeper - keeper.setParams(ctx, types.Params{ + accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper + keepers.WasmKeeper.setParams(ctx, types.Params{ CodeUploadAccess: types.AllowEverybody, InstantiateDefaultPermission: spec.srcPermission, MaxWasmCodeSize: types.DefaultMaxWasmCodeSize, @@ -91,7 +91,7 @@ func TestCreateStoresInstantiatePermission(t *testing.T) { codeID, err := keeper.Create(ctx, myAddr, wasmCode, "https://github.com/CosmWasm/wasmd/blob/master/x/wasm/testdata/escrow.wasm", "any/builder:tag", nil) require.NoError(t, err) - codeInfo := keeper.GetCodeInfo(ctx, codeID) + codeInfo := keepers.WasmKeeper.GetCodeInfo(ctx, codeID) require.NotNil(t, codeInfo) assert.True(t, spec.expInstConf.Equals(codeInfo.InstantiateConfig), "got %#v", codeInfo.InstantiateConfig) }) @@ -100,7 +100,7 @@ func TestCreateStoresInstantiatePermission(t *testing.T) { func TestCreateWithParamPermissions(t *testing.T) { ctx, keepers := CreateTestInput(t, false, SupportedFeatures) - accKeeper, bankKeeper, keeper := keepers.AccountKeeper, keepers.BankKeeper, keepers.WasmKeeper + accKeeper, bankKeeper, keeper := keepers.AccountKeeper, keepers.BankKeeper, keepers.ContractKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) creator := createFakeFundedAccount(t, ctx, accKeeper, bankKeeper, deposit) @@ -135,7 +135,7 @@ func TestCreateWithParamPermissions(t *testing.T) { t.Run(msg, func(t *testing.T) { params := types.DefaultParams() params.CodeUploadAccess = spec.srcPermission - keeper.setParams(ctx, params) + keepers.WasmKeeper.setParams(ctx, params) _, err := keeper.Create(ctx, creator, wasmCode, "https://github.com/CosmWasm/wasmd/blob/master/x/wasm/testdata/escrow.wasm", "any/builder:tag", nil) require.True(t, spec.expError.Is(err), err) if spec.expError != nil { @@ -147,7 +147,7 @@ func TestCreateWithParamPermissions(t *testing.T) { func TestCreateDuplicate(t *testing.T) { ctx, keepers := CreateTestInput(t, false, SupportedFeatures) - accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.WasmKeeper, keepers.BankKeeper + accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) creator := createFakeFundedAccount(t, ctx, accKeeper, bankKeeper, deposit) @@ -166,17 +166,17 @@ func TestCreateDuplicate(t *testing.T) { require.Equal(t, uint64(2), duplicateID) // and verify both content is proper - storedCode, err := keeper.GetByteCode(ctx, contractID) + storedCode, err := keepers.WasmKeeper.GetByteCode(ctx, contractID) require.NoError(t, err) require.Equal(t, wasmCode, storedCode) - storedCode, err = keeper.GetByteCode(ctx, duplicateID) + storedCode, err = keepers.WasmKeeper.GetByteCode(ctx, duplicateID) require.NoError(t, err) require.Equal(t, wasmCode, storedCode) } func TestCreateWithSimulation(t *testing.T) { ctx, keepers := CreateTestInput(t, false, SupportedFeatures) - accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.WasmKeeper, keepers.BankKeeper + accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper ctx = ctx.WithBlockHeader(tmproto.Header{Height: 1}). WithGasMeter(stypes.NewInfiniteGasMeter()) @@ -194,13 +194,13 @@ func TestCreateWithSimulation(t *testing.T) { // then try to create it in non-simulation mode (should not fail) ctx, keepers = CreateTestInput(t, false, SupportedFeatures) - accKeeper, keeper = keepers.AccountKeeper, keepers.WasmKeeper + accKeeper, keeper = keepers.AccountKeeper, keepers.ContractKeeper contractID, err = keeper.Create(ctx, creator, wasmCode, "https://github.com/CosmWasm/wasmd/blob/master/x/wasm/testdata/escrow.wasm", "any/builder:tag", nil) require.NoError(t, err) require.Equal(t, uint64(1), contractID) // and verify content - code, err := keeper.GetByteCode(ctx, contractID) + code, err := keepers.WasmKeeper.GetByteCode(ctx, contractID) require.NoError(t, err) require.Equal(t, code, wasmCode) } @@ -232,7 +232,7 @@ func TestIsSimulationMode(t *testing.T) { func TestCreateWithGzippedPayload(t *testing.T) { ctx, keepers := CreateTestInput(t, false, SupportedFeatures) - accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.WasmKeeper, keepers.BankKeeper + accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) creator := createFakeFundedAccount(t, ctx, accKeeper, bankKeeper, deposit) @@ -244,7 +244,7 @@ func TestCreateWithGzippedPayload(t *testing.T) { require.NoError(t, err) require.Equal(t, uint64(1), contractID) // and verify content - storedCode, err := keeper.GetByteCode(ctx, contractID) + storedCode, err := keepers.WasmKeeper.GetByteCode(ctx, contractID) require.NoError(t, err) rawCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) @@ -253,7 +253,7 @@ func TestCreateWithGzippedPayload(t *testing.T) { func TestInstantiate(t *testing.T) { ctx, keepers := CreateTestInput(t, false, SupportedFeatures) - accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.WasmKeeper, keepers.BankKeeper + accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) creator := createFakeFundedAccount(t, ctx, accKeeper, bankKeeper, deposit) @@ -277,7 +277,7 @@ func TestInstantiate(t *testing.T) { gasBefore := ctx.GasMeter().GasConsumed() // create with no balance is also legal - gotContractAddr, _, err := keeper.Instantiate(ctx, codeID, creator, nil, initMsgBz, "demo contract 1", nil) + gotContractAddr, _, err := keepers.ContractKeeper.Instantiate(ctx, codeID, creator, nil, initMsgBz, "demo contract 1", nil) require.NoError(t, err) require.Equal(t, "cosmos18vd8fpwxzck93qlwghaj6arh4p7c5n89uzcee5", gotContractAddr.String()) @@ -287,7 +287,7 @@ func TestInstantiate(t *testing.T) { } // ensure it is stored properly - info := keeper.GetContractInfo(ctx, gotContractAddr) + info := keepers.WasmKeeper.GetContractInfo(ctx, gotContractAddr) require.NotNil(t, info) assert.Equal(t, creator.String(), info.Creator) assert.Equal(t, codeID, info.CodeID) @@ -299,7 +299,7 @@ func TestInstantiate(t *testing.T) { Updated: types.NewAbsoluteTxPosition(ctx), Msg: json.RawMessage(initMsgBz), }} - assert.Equal(t, exp, keeper.GetContractHistory(ctx, gotContractAddr)) + assert.Equal(t, exp, keepers.WasmKeeper.GetContractHistory(ctx, gotContractAddr)) } func TestInstantiateWithDeposit(t *testing.T) { @@ -339,7 +339,7 @@ func TestInstantiateWithDeposit(t *testing.T) { for msg, spec := range specs { t.Run(msg, func(t *testing.T) { ctx, keepers := CreateTestInput(t, false, SupportedFeatures) - accKeeper, bankKeeper, keeper := keepers.AccountKeeper, keepers.BankKeeper, keepers.WasmKeeper + accKeeper, bankKeeper, keeper := keepers.AccountKeeper, keepers.BankKeeper, keepers.ContractKeeper if spec.fundAddr { fundAccounts(t, ctx, accKeeper, bankKeeper, spec.srcActor, sdk.NewCoins(sdk.NewInt64Coin("denom", 200))) @@ -348,7 +348,7 @@ func TestInstantiateWithDeposit(t *testing.T) { require.NoError(t, err) // when - addr, _, err := keeper.Instantiate(ctx, contractID, spec.srcActor, nil, initMsgBz, "my label", deposit) + addr, _, err := keepers.ContractKeeper.Instantiate(ctx, contractID, spec.srcActor, nil, initMsgBz, "my label", deposit) // then if spec.expError { require.Error(t, err) @@ -409,13 +409,13 @@ func TestInstantiateWithPermissions(t *testing.T) { for msg, spec := range specs { t.Run(msg, func(t *testing.T) { ctx, keepers := CreateTestInput(t, false, SupportedFeatures) - accKeeper, bankKeeper, keeper := keepers.AccountKeeper, keepers.BankKeeper, keepers.WasmKeeper + accKeeper, bankKeeper, keeper := keepers.AccountKeeper, keepers.BankKeeper, keepers.ContractKeeper fundAccounts(t, ctx, accKeeper, bankKeeper, spec.srcActor, deposit) contractID, err := keeper.Create(ctx, myAddr, wasmCode, "https://github.com/CosmWasm/wasmd/blob/master/x/wasm/testdata/escrow.wasm", "", &spec.srcPermission) require.NoError(t, err) - _, _, err = keeper.Instantiate(ctx, contractID, spec.srcActor, nil, initMsgBz, "demo contract 1", nil) + _, _, err = keepers.ContractKeeper.Instantiate(ctx, contractID, spec.srcActor, nil, initMsgBz, "demo contract 1", nil) assert.True(t, spec.expError.Is(err), "got %+v", err) }) } @@ -423,7 +423,7 @@ func TestInstantiateWithPermissions(t *testing.T) { func TestInstantiateWithNonExistingCodeID(t *testing.T) { ctx, keepers := CreateTestInput(t, false, SupportedFeatures) - accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.WasmKeeper, keepers.BankKeeper + accKeeper, bankKeeper := keepers.AccountKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) creator := createFakeFundedAccount(t, ctx, accKeeper, bankKeeper, deposit) @@ -433,7 +433,7 @@ func TestInstantiateWithNonExistingCodeID(t *testing.T) { require.NoError(t, err) const nonExistingCodeID = 9999 - addr, _, err := keeper.Instantiate(ctx, nonExistingCodeID, creator, nil, initMsgBz, "demo contract 2", nil) + addr, _, err := keepers.ContractKeeper.Instantiate(ctx, nonExistingCodeID, creator, nil, initMsgBz, "demo contract 2", nil) require.True(t, types.ErrNotFound.Is(err), err) require.Nil(t, addr) } @@ -450,14 +450,14 @@ func TestInstantiateWithContractDataResponse(t *testing.T) { } example := StoreRandomContract(t, ctx, keepers, wasmerMock) - _, data, err := keepers.WasmKeeper.Instantiate(ctx, example.CodeID, example.CreatorAddr, nil, nil, "test", nil) + _, data, err := keepers.ContractKeeper.Instantiate(ctx, example.CodeID, example.CreatorAddr, nil, nil, "test", nil) require.NoError(t, err) assert.Equal(t, []byte("my-response-data"), data) } func TestExecute(t *testing.T) { ctx, keepers := CreateTestInput(t, false, SupportedFeatures) - accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.WasmKeeper, keepers.BankKeeper + accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000)) @@ -478,7 +478,7 @@ func TestExecute(t *testing.T) { initMsgBz, err := json.Marshal(initMsg) require.NoError(t, err) - addr, _, err := keeper.Instantiate(ctx, contractID, creator, nil, initMsgBz, "demo contract 3", deposit) + addr, _, err := keepers.ContractKeeper.Instantiate(ctx, contractID, creator, nil, initMsgBz, "demo contract 3", deposit) require.NoError(t, err) require.Equal(t, "cosmos18vd8fpwxzck93qlwghaj6arh4p7c5n89uzcee5", addr.String()) @@ -499,7 +499,7 @@ func TestExecute(t *testing.T) { // unauthorized - trialCtx so we don't change state trialCtx := ctx.WithMultiStore(ctx.MultiStore().CacheWrap().(sdk.MultiStore)) - res, err := keeper.Execute(trialCtx, addr, creator, []byte(`{"release":{}}`), nil) + res, err := keepers.ContractKeeper.Execute(trialCtx, addr, creator, []byte(`{"release":{}}`), nil) require.Error(t, err) require.True(t, errors.Is(err, types.ErrExecuteFailed)) require.Equal(t, "Unauthorized: execute wasm contract failed", err.Error()) @@ -508,7 +508,7 @@ func TestExecute(t *testing.T) { start := time.Now() gasBefore := ctx.GasMeter().GasConsumed() - res, err = keeper.Execute(ctx, addr, fred, []byte(`{"release":{}}`), topUp) + res, err = keepers.ContractKeeper.Execute(ctx, addr, fred, []byte(`{"release":{}}`), topUp) diff := time.Now().Sub(start) require.NoError(t, err) require.NotNil(t, res) @@ -593,7 +593,7 @@ func TestExecuteWithDeposit(t *testing.T) { for msg, spec := range specs { t.Run(msg, func(t *testing.T) { ctx, keepers := CreateTestInput(t, false, SupportedFeatures) - accKeeper, bankKeeper, keeper := keepers.AccountKeeper, keepers.BankKeeper, keepers.WasmKeeper + accKeeper, bankKeeper, keeper := keepers.AccountKeeper, keepers.BankKeeper, keepers.ContractKeeper if spec.newBankParams != nil { bankKeeper.SetParams(ctx, *spec.newBankParams) } @@ -607,11 +607,11 @@ func TestExecuteWithDeposit(t *testing.T) { initMsgBz, err := json.Marshal(initMsg) require.NoError(t, err) - contractAddr, _, err := keeper.Instantiate(ctx, codeID, spec.srcActor, nil, initMsgBz, "my label", nil) + contractAddr, _, err := keepers.ContractKeeper.Instantiate(ctx, codeID, spec.srcActor, nil, initMsgBz, "my label", nil) require.NoError(t, err) // when - _, err = keeper.Execute(ctx, contractAddr, spec.srcActor, []byte(`{"release":{}}`), deposit) + _, err = keepers.ContractKeeper.Execute(ctx, contractAddr, spec.srcActor, []byte(`{"release":{}}`), deposit) // then if spec.expError { @@ -627,7 +627,7 @@ func TestExecuteWithDeposit(t *testing.T) { func TestExecuteWithNonExistingAddress(t *testing.T) { ctx, keepers := CreateTestInput(t, false, SupportedFeatures) - accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.WasmKeeper, keepers.BankKeeper + accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) creator := createFakeFundedAccount(t, ctx, accKeeper, bankKeeper, deposit.Add(deposit...)) @@ -640,7 +640,7 @@ func TestExecuteWithNonExistingAddress(t *testing.T) { func TestExecuteWithPanic(t *testing.T) { ctx, keepers := CreateTestInput(t, false, SupportedFeatures) - accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.WasmKeeper, keepers.BankKeeper + accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000)) @@ -661,11 +661,11 @@ func TestExecuteWithPanic(t *testing.T) { initMsgBz, err := json.Marshal(initMsg) require.NoError(t, err) - addr, _, err := keeper.Instantiate(ctx, contractID, creator, nil, initMsgBz, "demo contract 4", deposit) + addr, _, err := keepers.ContractKeeper.Instantiate(ctx, contractID, creator, nil, initMsgBz, "demo contract 4", deposit) require.NoError(t, err) // let's make sure we get a reasonable error, no panic/crash - _, err = keeper.Execute(ctx, addr, fred, []byte(`{"panic":{}}`), topUp) + _, err = keepers.ContractKeeper.Execute(ctx, addr, fred, []byte(`{"panic":{}}`), topUp) require.Error(t, err) require.True(t, errors.Is(err, types.ErrExecuteFailed)) // test with contains as "Display" implementation of the Wasmer "RuntimeError" is different for Mac and Linux @@ -674,7 +674,7 @@ func TestExecuteWithPanic(t *testing.T) { func TestExecuteWithCpuLoop(t *testing.T) { ctx, keepers := CreateTestInput(t, false, SupportedFeatures) - accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.WasmKeeper, keepers.BankKeeper + accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000)) @@ -695,7 +695,7 @@ func TestExecuteWithCpuLoop(t *testing.T) { initMsgBz, err := json.Marshal(initMsg) require.NoError(t, err) - addr, _, err := keeper.Instantiate(ctx, contractID, creator, nil, initMsgBz, "demo contract 5", deposit) + addr, _, err := keepers.ContractKeeper.Instantiate(ctx, contractID, creator, nil, initMsgBz, "demo contract 5", deposit) require.NoError(t, err) // make sure we set a limit before calling @@ -712,14 +712,14 @@ func TestExecuteWithCpuLoop(t *testing.T) { }() // this should throw out of gas exception (panic) - _, err = keeper.Execute(ctx, addr, fred, []byte(`{"cpu_loop":{}}`), nil) + _, err = keepers.ContractKeeper.Execute(ctx, addr, fred, []byte(`{"cpu_loop":{}}`), nil) require.True(t, false, "We must panic before this line") } func TestExecuteWithStorageLoop(t *testing.T) { ctx, keepers := CreateTestInput(t, false, SupportedFeatures) - accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.WasmKeeper, keepers.BankKeeper + accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000)) @@ -740,7 +740,7 @@ func TestExecuteWithStorageLoop(t *testing.T) { initMsgBz, err := json.Marshal(initMsg) require.NoError(t, err) - addr, _, err := keeper.Instantiate(ctx, contractID, creator, nil, initMsgBz, "demo contract 6", deposit) + addr, _, err := keepers.ContractKeeper.Instantiate(ctx, contractID, creator, nil, initMsgBz, "demo contract 6", deposit) require.NoError(t, err) // make sure we set a limit before calling @@ -757,13 +757,13 @@ func TestExecuteWithStorageLoop(t *testing.T) { }() // this should throw out of gas exception (panic) - _, err = keeper.Execute(ctx, addr, fred, []byte(`{"storage_loop":{}}`), nil) + _, err = keepers.ContractKeeper.Execute(ctx, addr, fred, []byte(`{"storage_loop":{}}`), nil) require.True(t, false, "We must panic before this line") } func TestMigrate(t *testing.T) { ctx, keepers := CreateTestInput(t, false, SupportedFeatures) - accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.WasmKeeper, keepers.BankKeeper + accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000)) @@ -901,7 +901,7 @@ func TestMigrate(t *testing.T) { t.Run(msg, func(t *testing.T) { // given a contract instance ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) - contractAddr, _, err := keeper.Instantiate(ctx, spec.fromCodeID, creator, spec.admin, spec.initMsg, "demo contract", nil) + contractAddr, _, err := keepers.ContractKeeper.Instantiate(ctx, spec.fromCodeID, creator, spec.admin, spec.initMsg, "demo contract", nil) require.NoError(t, err) if spec.overrideContractAddr != nil { contractAddr = spec.overrideContractAddr @@ -914,7 +914,7 @@ func TestMigrate(t *testing.T) { if spec.expErr != nil { return } - cInfo := keeper.GetContractInfo(ctx, contractAddr) + cInfo := keepers.WasmKeeper.GetContractInfo(ctx, contractAddr) assert.Equal(t, spec.toCodeID, cInfo.CodeID) assert.Equal(t, spec.expIBCPort, cInfo.IBCPortID != "", cInfo.IBCPortID) @@ -929,10 +929,10 @@ func TestMigrate(t *testing.T) { Updated: types.NewAbsoluteTxPosition(ctx), Msg: spec.migrateMsg, }} - assert.Equal(t, expHistory, keeper.GetContractHistory(ctx, contractAddr)) + assert.Equal(t, expHistory, keepers.WasmKeeper.GetContractHistory(ctx, contractAddr)) // and verify contract state - raw := keeper.QueryRaw(ctx, contractAddr, []byte("config")) + raw := keepers.WasmKeeper.QueryRaw(ctx, contractAddr, []byte("config")) var stored map[string][]byte require.NoError(t, json.Unmarshal(raw, &stored)) require.Contains(t, stored, "verifier") @@ -956,7 +956,7 @@ func TestMigrateReplacesTheSecondIndex(t *testing.T) { // when do migrate newCodeExample := StoreBurnerExampleContract(t, ctx, keepers) migMsgBz := BurnerExampleInitMsg{Payout: example.CreatorAddr}.GetBytes(t) - _, err := keepers.WasmKeeper.Migrate(ctx, example.Contract, example.CreatorAddr, newCodeExample.CodeID, migMsgBz) + _, err := keepers.ContractKeeper.Migrate(ctx, example.Contract, example.CreatorAddr, newCodeExample.CodeID, migMsgBz) require.NoError(t, err) // then the new index exists newContractInfo := keepers.WasmKeeper.GetContractInfo(ctx, example.Contract) @@ -969,7 +969,7 @@ func TestMigrateReplacesTheSecondIndex(t *testing.T) { func TestMigrateWithDispatchedMessage(t *testing.T) { ctx, keepers := CreateTestInput(t, false, SupportedFeatures) - accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.WasmKeeper, keepers.BankKeeper + accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) creator := createFakeFundedAccount(t, ctx, accKeeper, bankKeeper, deposit.Add(deposit...)) @@ -994,7 +994,7 @@ func TestMigrateWithDispatchedMessage(t *testing.T) { initMsgBz := initMsg.GetBytes(t) ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) - contractAddr, _, err := keeper.Instantiate(ctx, originalContractID, creator, fred, initMsgBz, "demo contract", deposit) + contractAddr, _, err := keepers.ContractKeeper.Instantiate(ctx, originalContractID, creator, fred, initMsgBz, "demo contract", deposit) require.NoError(t, err) migMsgBz := BurnerExampleInitMsg{Payout: myPayoutAddr}.GetBytes(t) @@ -1038,7 +1038,7 @@ func TestMigrateWithDispatchedMessage(t *testing.T) { assert.JSONEq(t, expJSONEvts, prettyEvents(t, ctx.EventManager().Events())) // all persistent data cleared - m := keeper.QueryRaw(ctx, contractAddr, []byte("config")) + m := keepers.WasmKeeper.QueryRaw(ctx, contractAddr, []byte("config")) require.Len(t, m, 0) // and all deposit tokens sent to myPayoutAddr @@ -1065,7 +1065,7 @@ type stealFundsMsg struct { func TestSudo(t *testing.T) { ctx, keepers := CreateTestInput(t, false, SupportedFeatures) - accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.WasmKeeper, keepers.BankKeeper + accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) creator := createFakeFundedAccount(t, ctx, accKeeper, bankKeeper, deposit.Add(deposit...)) @@ -1084,7 +1084,7 @@ func TestSudo(t *testing.T) { initMsgBz, err := json.Marshal(initMsg) require.NoError(t, err) - addr, _, err := keeper.Instantiate(ctx, contractID, creator, nil, initMsgBz, "demo contract 3", deposit) + addr, _, err := keepers.ContractKeeper.Instantiate(ctx, contractID, creator, nil, initMsgBz, "demo contract 3", deposit) require.NoError(t, err) require.Equal(t, "cosmos18vd8fpwxzck93qlwghaj6arh4p7c5n89uzcee5", addr.String()) @@ -1106,7 +1106,7 @@ func TestSudo(t *testing.T) { sudoMsg, err := json.Marshal(msg) require.NoError(t, err) - res, err := keeper.Sudo(ctx, addr, sudoMsg) + res, err := keepers.WasmKeeper.Sudo(ctx, addr, sudoMsg) require.NoError(t, err) require.NotNil(t, res) @@ -1144,7 +1144,7 @@ func mustMarshal(t *testing.T, r interface{}) []byte { func TestUpdateContractAdmin(t *testing.T) { ctx, keepers := CreateTestInput(t, false, SupportedFeatures) - accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.WasmKeeper, keepers.BankKeeper + accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000)) @@ -1197,7 +1197,7 @@ func TestUpdateContractAdmin(t *testing.T) { } for msg, spec := range specs { t.Run(msg, func(t *testing.T) { - addr, _, err := keeper.Instantiate(ctx, originalContractID, creator, spec.instAdmin, initMsgBz, "demo contract", nil) + addr, _, err := keepers.ContractKeeper.Instantiate(ctx, originalContractID, creator, spec.instAdmin, initMsgBz, "demo contract", nil) require.NoError(t, err) if spec.overrideContractAddr != nil { addr = spec.overrideContractAddr @@ -1207,7 +1207,7 @@ func TestUpdateContractAdmin(t *testing.T) { if spec.expErr != nil { return } - cInfo := keeper.GetContractInfo(ctx, addr) + cInfo := keepers.WasmKeeper.GetContractInfo(ctx, addr) assert.Equal(t, spec.newAdmin.String(), cInfo.Admin) }) } @@ -1215,7 +1215,7 @@ func TestUpdateContractAdmin(t *testing.T) { func TestClearContractAdmin(t *testing.T) { ctx, keepers := CreateTestInput(t, false, SupportedFeatures) - accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.WasmKeeper, keepers.BankKeeper + accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000)) @@ -1263,7 +1263,7 @@ func TestClearContractAdmin(t *testing.T) { } for msg, spec := range specs { t.Run(msg, func(t *testing.T) { - addr, _, err := keeper.Instantiate(ctx, originalContractID, creator, spec.instAdmin, initMsgBz, "demo contract", nil) + addr, _, err := keepers.ContractKeeper.Instantiate(ctx, originalContractID, creator, spec.instAdmin, initMsgBz, "demo contract", nil) require.NoError(t, err) if spec.overrideContractAddr != nil { addr = spec.overrideContractAddr @@ -1273,7 +1273,7 @@ func TestClearContractAdmin(t *testing.T) { if spec.expErr != nil { return } - cInfo := keeper.GetContractInfo(ctx, addr) + cInfo := keepers.WasmKeeper.GetContractInfo(ctx, addr) assert.Empty(t, cInfo.Admin) }) } diff --git a/x/wasm/keeper/legacy_querier_test.go b/x/wasm/keeper/legacy_querier_test.go index 35bade2a1f..7c366c2672 100644 --- a/x/wasm/keeper/legacy_querier_test.go +++ b/x/wasm/keeper/legacy_querier_test.go @@ -27,7 +27,7 @@ func TestLegacyQueryContractState(t *testing.T) { wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) - contractID, err := keeper.Create(ctx, creator, wasmCode, "", "", nil) + contractID, err := keepers.ContractKeeper.Create(ctx, creator, wasmCode, "", "", nil) require.NoError(t, err) _, _, bob := keyPubAddr() @@ -38,7 +38,7 @@ func TestLegacyQueryContractState(t *testing.T) { initMsgBz, err := json.Marshal(initMsg) require.NoError(t, err) - addr, _, err := keeper.Instantiate(ctx, contractID, creator, nil, initMsgBz, "demo contract to query", deposit) + addr, _, err := keepers.ContractKeeper.Instantiate(ctx, contractID, creator, nil, initMsgBz, "demo contract to query", deposit) require.NoError(t, err) contractModel := []types.Model{ @@ -164,7 +164,7 @@ func TestLegacyQueryContractListByCodeOrdering(t *testing.T) { wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) - codeID, err := keeper.Create(ctx, creator, wasmCode, "", "", nil) + codeID, err := keepers.ContractKeeper.Create(ctx, creator, wasmCode, "", "", nil) require.NoError(t, err) _, _, bob := keyPubAddr() @@ -192,7 +192,7 @@ func TestLegacyQueryContractListByCodeOrdering(t *testing.T) { ctx = setBlock(ctx, h) h++ } - _, _, err = keeper.Instantiate(ctx, codeID, creator, nil, initMsgBz, fmt.Sprintf("contract %d", i), topUp) + _, _, err = keepers.ContractKeeper.Instantiate(ctx, codeID, creator, nil, initMsgBz, fmt.Sprintf("contract %d", i), topUp) require.NoError(t, err) } diff --git a/x/wasm/keeper/msg_server.go b/x/wasm/keeper/msg_server.go index 50f5d013e7..67ed3ee0c8 100644 --- a/x/wasm/keeper/msg_server.go +++ b/x/wasm/keeper/msg_server.go @@ -11,10 +11,10 @@ import ( var _ types.MsgServer = msgServer{} type msgServer struct { - keeper types.MsgOpsKeeper + keeper types.ContractOpsKeeper } -func NewMsgServerImpl(k types.MsgOpsKeeper) types.MsgServer { +func NewMsgServerImpl(k types.ContractOpsKeeper) types.MsgServer { return &msgServer{keeper: k} } diff --git a/x/wasm/keeper/proposal_handler.go b/x/wasm/keeper/proposal_handler.go index adc584a3d5..32b7eb28d7 100644 --- a/x/wasm/keeper/proposal_handler.go +++ b/x/wasm/keeper/proposal_handler.go @@ -2,27 +2,20 @@ package keeper import ( "fmt" - "strconv" - "strings" - "github.com/CosmWasm/wasmd/x/wasm/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + "strconv" ) -// governing contains a subset of the wasm keeper used by gov processes -type governing interface { - create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, source string, builder string, instantiateAccess *types.AccessConfig, authZ AuthorizationPolicy) (codeID uint64, err error) - instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.AccAddress, initMsg []byte, label string, deposit sdk.Coins, authZ AuthorizationPolicy) (sdk.AccAddress, []byte, error) - migrate(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, newCodeID uint64, msg []byte, authZ AuthorizationPolicy) (*sdk.Result, error) - setContractAdmin(ctx sdk.Context, contractAddress, caller, newAdmin sdk.AccAddress, authZ AuthorizationPolicy) error - PinCode(ctx sdk.Context, codeID uint64) error - UnpinCode(ctx sdk.Context, codeID uint64) error +// NewWasmProposalHandler creates a new governance Handler for wasm proposals +func NewWasmProposalHandler(k decoratedKeeper, enabledProposalTypes []types.ProposalType) govtypes.Handler { + return NewWasmProposalHandlerX(NewGovPermissionKeeper(k), enabledProposalTypes) } -// NewWasmProposalHandler creates a new governance Handler for wasm proposals -func NewWasmProposalHandler(k governing, enabledProposalTypes []types.ProposalType) govtypes.Handler { +// NewWasmProposalHandlerX creates a new governance Handler for wasm proposals +func NewWasmProposalHandlerX(k types.ContractOpsKeeper, enabledProposalTypes []types.ProposalType) govtypes.Handler { enabledTypes := make(map[string]struct{}, len(enabledProposalTypes)) for i := range enabledProposalTypes { enabledTypes[string(enabledProposalTypes[i])] = struct{}{} @@ -55,7 +48,7 @@ func NewWasmProposalHandler(k governing, enabledProposalTypes []types.ProposalTy } } -func handleStoreCodeProposal(ctx sdk.Context, k governing, p types.StoreCodeProposal) error { +func handleStoreCodeProposal(ctx sdk.Context, k types.ContractOpsKeeper, p types.StoreCodeProposal) error { if err := p.ValidateBasic(); err != nil { return err } @@ -64,7 +57,7 @@ func handleStoreCodeProposal(ctx sdk.Context, k governing, p types.StoreCodeProp if err != nil { return sdkerrors.Wrap(err, "run as address") } - codeID, err := k.create(ctx, runAsAddr, p.WASMByteCode, p.Source, p.Builder, p.InstantiatePermission, GovAuthorizationPolicy{}) + codeID, err := k.Create(ctx, runAsAddr, p.WASMByteCode, p.Source, p.Builder, p.InstantiatePermission) if err != nil { return err } @@ -78,7 +71,7 @@ func handleStoreCodeProposal(ctx sdk.Context, k governing, p types.StoreCodeProp return nil } -func handleInstantiateProposal(ctx sdk.Context, k governing, p types.InstantiateContractProposal) error { +func handleInstantiateProposal(ctx sdk.Context, k types.ContractOpsKeeper, p types.InstantiateContractProposal) error { if err := p.ValidateBasic(); err != nil { return err } @@ -91,7 +84,7 @@ func handleInstantiateProposal(ctx sdk.Context, k governing, p types.Instantiate return sdkerrors.Wrap(err, "admin") } - contractAddr, _, err := k.instantiate(ctx, p.CodeID, runAsAddr, adminAddr, p.InitMsg, p.Label, p.Funds, GovAuthorizationPolicy{}) + contractAddr, _, err := k.Instantiate(ctx, p.CodeID, runAsAddr, adminAddr, p.InitMsg, p.Label, p.Funds) if err != nil { return err } @@ -106,7 +99,7 @@ func handleInstantiateProposal(ctx sdk.Context, k governing, p types.Instantiate return nil } -func handleMigrateProposal(ctx sdk.Context, k governing, p types.MigrateContractProposal) error { +func handleMigrateProposal(ctx sdk.Context, k types.ContractOpsKeeper, p types.MigrateContractProposal) error { if err := p.ValidateBasic(); err != nil { return err } @@ -119,7 +112,7 @@ func handleMigrateProposal(ctx sdk.Context, k governing, p types.MigrateContract if err != nil { return sdkerrors.Wrap(err, "run as address") } - res, err := k.migrate(ctx, contractAddr, runAsAddr, p.CodeID, p.MigrateMsg, GovAuthorizationPolicy{}) + res, err := k.Migrate(ctx, contractAddr, runAsAddr, p.CodeID, p.MigrateMsg) if err != nil { return err } @@ -141,7 +134,7 @@ func handleMigrateProposal(ctx sdk.Context, k governing, p types.MigrateContract return nil } -func handleUpdateAdminProposal(ctx sdk.Context, k governing, p types.UpdateAdminProposal) error { +func handleUpdateAdminProposal(ctx sdk.Context, k types.ContractOpsKeeper, p types.UpdateAdminProposal) error { if err := p.ValidateBasic(); err != nil { return err } @@ -154,7 +147,7 @@ func handleUpdateAdminProposal(ctx sdk.Context, k governing, p types.UpdateAdmin return sdkerrors.Wrap(err, "run as address") } - if err := k.setContractAdmin(ctx, contractAddr, nil, newAdminAddr, GovAuthorizationPolicy{}); err != nil { + if err := k.UpdateContractAdmin(ctx, contractAddr, nil, newAdminAddr); err != nil { return err } @@ -167,7 +160,7 @@ func handleUpdateAdminProposal(ctx sdk.Context, k governing, p types.UpdateAdmin return nil } -func handleClearAdminProposal(ctx sdk.Context, k governing, p types.ClearAdminProposal) error { +func handleClearAdminProposal(ctx sdk.Context, k types.ContractOpsKeeper, p types.ClearAdminProposal) error { if err := p.ValidateBasic(); err != nil { return err } @@ -176,7 +169,7 @@ func handleClearAdminProposal(ctx sdk.Context, k governing, p types.ClearAdminPr if err != nil { return sdkerrors.Wrap(err, "contract") } - if err := k.setContractAdmin(ctx, contractAddr, nil, nil, GovAuthorizationPolicy{}); err != nil { + if err := k.ClearContractAdmin(ctx, contractAddr, nil); err != nil { return err } ourEvent := sdk.NewEvent( @@ -188,7 +181,7 @@ func handleClearAdminProposal(ctx sdk.Context, k governing, p types.ClearAdminPr return nil } -func handlePinCodesProposal(ctx sdk.Context, k governing, p types.PinCodesProposal) error { +func handlePinCodesProposal(ctx sdk.Context, k types.ContractOpsKeeper, p types.PinCodesProposal) error { if err := p.ValidateBasic(); err != nil { return err } @@ -197,21 +190,18 @@ func handlePinCodesProposal(ctx sdk.Context, k governing, p types.PinCodesPropos return sdkerrors.Wrapf(err, "code id: %d", v) } } - s := make([]string, len(p.CodeIDs)) - for i, v := range p.CodeIDs { - s[i] = strconv.FormatUint(v, 10) + for _, v := range p.CodeIDs { + ourEvent := sdk.NewEvent( + types.EventTypePinCode, + sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), + sdk.NewAttribute(types.AttributeKeyCodeID, strconv.FormatUint(v, 10)), + ) + ctx.EventManager().EmitEvent(ourEvent) } - ourEvent := sdk.NewEvent( - types.EventTypePinCode, - sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), - sdk.NewAttribute(types.AttributeKeyCodeIDs, strings.Join(s, ",")), - ) - ctx.EventManager().EmitEvent(ourEvent) - return nil } -func handleUnpinCodesProposal(ctx sdk.Context, k governing, p types.UnpinCodesProposal) error { +func handleUnpinCodesProposal(ctx sdk.Context, k types.ContractOpsKeeper, p types.UnpinCodesProposal) error { if err := p.ValidateBasic(); err != nil { return err } @@ -220,16 +210,13 @@ func handleUnpinCodesProposal(ctx sdk.Context, k governing, p types.UnpinCodesPr return sdkerrors.Wrapf(err, "code id: %d", v) } } - s := make([]string, len(p.CodeIDs)) - for i, v := range p.CodeIDs { - s[i] = strconv.FormatUint(v, 10) + for _, v := range p.CodeIDs { + ourEvent := sdk.NewEvent( + types.EventTypeUnpinCode, + sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), + sdk.NewAttribute(types.AttributeKeyCodeID, strconv.FormatUint(v, 10)), + ) + ctx.EventManager().EmitEvent(ourEvent) } - ourEvent := sdk.NewEvent( - types.EventTypeUnpinCode, - sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), - sdk.NewAttribute(types.AttributeKeyCodeIDs, strings.Join(s, ",")), - ) - ctx.EventManager().EmitEvent(ourEvent) - return nil } diff --git a/x/wasm/keeper/querier_test.go b/x/wasm/keeper/querier_test.go index 8f501bbb8c..0a9552cff8 100644 --- a/x/wasm/keeper/querier_test.go +++ b/x/wasm/keeper/querier_test.go @@ -260,7 +260,7 @@ func TestQueryContractListByCodeOrdering(t *testing.T) { wasmCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) - codeID, err := keeper.Create(ctx, creator, wasmCode, "", "", nil) + codeID, err := keepers.ContractKeeper.Create(ctx, creator, wasmCode, "", "", nil) require.NoError(t, err) _, _, bob := keyPubAddr() @@ -288,7 +288,7 @@ func TestQueryContractListByCodeOrdering(t *testing.T) { ctx = setBlock(ctx, h) h++ } - _, _, err = keeper.Instantiate(ctx, codeID, creator, nil, initMsgBz, fmt.Sprintf("contract %d", i), topUp) + _, _, err = keepers.ContractKeeper.Instantiate(ctx, codeID, creator, nil, initMsgBz, fmt.Sprintf("contract %d", i), topUp) require.NoError(t, err) } diff --git a/x/wasm/keeper/reflect_test.go b/x/wasm/keeper/reflect_test.go index 3bacea8352..1e60db4c85 100644 --- a/x/wasm/keeper/reflect_test.go +++ b/x/wasm/keeper/reflect_test.go @@ -85,7 +85,7 @@ const ReflectFeatures = "staking,mask,stargate" func TestReflectContractSend(t *testing.T) { cdc := MakeEncodingConfig(t).Marshaler ctx, keepers := CreateTestInput(t, false, ReflectFeatures, WithMessageEncoders(reflectEncoders(cdc))) - accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.WasmKeeper, keepers.BankKeeper + accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) creator := createFakeFundedAccount(t, ctx, accKeeper, bankKeeper, deposit) @@ -167,7 +167,7 @@ func TestReflectContractSend(t *testing.T) { func TestReflectCustomMsg(t *testing.T) { cdc := MakeEncodingConfig(t).Marshaler ctx, keepers := CreateTestInput(t, false, ReflectFeatures, WithMessageEncoders(reflectEncoders(cdc)), WithQueryPlugins(reflectPlugins())) - accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.WasmKeeper, keepers.BankKeeper + accKeeper, keeper, bankKeeper := keepers.AccountKeeper, keepers.ContractKeeper, keepers.BankKeeper deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) creator := createFakeFundedAccount(t, ctx, accKeeper, bankKeeper, deposit) @@ -268,13 +268,13 @@ func TestMaskReflectCustomQuery(t *testing.T) { // upload code reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") require.NoError(t, err) - codeID, err := keeper.Create(ctx, creator, reflectCode, "", "", nil) + codeID, err := keepers.ContractKeeper.Create(ctx, creator, reflectCode, "", "", nil) require.NoError(t, err) require.Equal(t, uint64(1), codeID) // creator instantiates a contract and gives it tokens contractStart := sdk.NewCoins(sdk.NewInt64Coin("denom", 40000)) - contractAddr, _, err := keeper.Instantiate(ctx, codeID, creator, nil, []byte("{}"), "reflect contract 1", contractStart) + contractAddr, _, err := keepers.ContractKeeper.Instantiate(ctx, codeID, creator, nil, []byte("{}"), "reflect contract 1", contractStart) require.NoError(t, err) require.NotEmpty(t, contractAddr) @@ -320,12 +320,12 @@ func TestReflectStargateQuery(t *testing.T) { // upload code reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") require.NoError(t, err) - codeID, err := keeper.Create(ctx, creator, reflectCode, "", "", nil) + codeID, err := keepers.ContractKeeper.Create(ctx, creator, reflectCode, "", "", nil) require.NoError(t, err) require.Equal(t, uint64(1), codeID) // creator instantiates a contract and gives it tokens - contractAddr, _, err := keeper.Instantiate(ctx, codeID, creator, nil, []byte("{}"), "reflect contract 1", contractStart) + contractAddr, _, err := keepers.ContractKeeper.Instantiate(ctx, codeID, creator, nil, []byte("{}"), "reflect contract 1", contractStart) require.NoError(t, err) require.NotEmpty(t, contractAddr) @@ -395,13 +395,13 @@ func TestMaskReflectWasmQueries(t *testing.T) { // upload reflect code reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") require.NoError(t, err) - reflectID, err := keeper.Create(ctx, creator, reflectCode, "", "", nil) + reflectID, err := keepers.ContractKeeper.Create(ctx, creator, reflectCode, "", "", nil) require.NoError(t, err) require.Equal(t, uint64(1), reflectID) // creator instantiates a contract and gives it tokens reflectStart := sdk.NewCoins(sdk.NewInt64Coin("denom", 40000)) - reflectAddr, _, err := keeper.Instantiate(ctx, reflectID, creator, nil, []byte("{}"), "reflect contract 2", reflectStart) + reflectAddr, _, err := keepers.ContractKeeper.Instantiate(ctx, reflectID, creator, nil, []byte("{}"), "reflect contract 2", reflectStart) require.NoError(t, err) require.NotEmpty(t, reflectAddr) @@ -467,13 +467,13 @@ func TestWasmRawQueryWithNil(t *testing.T) { // upload reflect code reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") require.NoError(t, err) - reflectID, err := keeper.Create(ctx, creator, reflectCode, "", "", nil) + reflectID, err := keepers.ContractKeeper.Create(ctx, creator, reflectCode, "", "", nil) require.NoError(t, err) require.Equal(t, uint64(1), reflectID) // creator instantiates a contract and gives it tokens reflectStart := sdk.NewCoins(sdk.NewInt64Coin("denom", 40000)) - reflectAddr, _, err := keeper.Instantiate(ctx, reflectID, creator, nil, []byte("{}"), "reflect contract 2", reflectStart) + reflectAddr, _, err := keepers.ContractKeeper.Instantiate(ctx, reflectID, creator, nil, []byte("{}"), "reflect contract 2", reflectStart) require.NoError(t, err) require.NotEmpty(t, reflectAddr) diff --git a/x/wasm/keeper/staking_test.go b/x/wasm/keeper/staking_test.go index 4cd2006310..b90fed75a4 100644 --- a/x/wasm/keeper/staking_test.go +++ b/x/wasm/keeper/staking_test.go @@ -2,6 +2,7 @@ package keeper import ( "encoding/json" + wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" "io/ioutil" "testing" @@ -91,7 +92,7 @@ type InvestmentResponse struct { func TestInitializeStaking(t *testing.T) { ctx, k := CreateTestInput(t, false, SupportedFeatures) - accKeeper, stakingKeeper, keeper, bankKeeper := k.AccountKeeper, k.StakingKeeper, k.WasmKeeper, k.BankKeeper + accKeeper, stakingKeeper, keeper, bankKeeper := k.AccountKeeper, k.StakingKeeper, k.ContractKeeper, k.BankKeeper valAddr := addValidator(t, ctx, stakingKeeper, accKeeper, bankKeeper, sdk.NewInt64Coin("stake", 1234567)) ctx = nextBlock(ctx, stakingKeeper) @@ -121,7 +122,7 @@ func TestInitializeStaking(t *testing.T) { initBz, err := json.Marshal(&initMsg) require.NoError(t, err) - stakingAddr, _, err := keeper.Instantiate(ctx, stakingID, creator, nil, initBz, "staking derivates - DRV", nil) + stakingAddr, _, err := k.ContractKeeper.Instantiate(ctx, stakingID, creator, nil, initBz, "staking derivates - DRV", nil) require.NoError(t, err) require.NotEmpty(t, stakingAddr) @@ -141,7 +142,7 @@ func TestInitializeStaking(t *testing.T) { badBz, err := json.Marshal(&badInitMsg) require.NoError(t, err) - _, _, err = keeper.Instantiate(ctx, stakingID, creator, nil, badBz, "missing validator", nil) + _, _, err = k.ContractKeeper.Instantiate(ctx, stakingID, creator, nil, badBz, "missing validator", nil) require.Error(t, err) // no changes to bonding shares @@ -154,12 +155,13 @@ type initInfo struct { creator sdk.AccAddress contractAddr sdk.AccAddress - ctx sdk.Context - accKeeper authkeeper.AccountKeeper - stakingKeeper stakingkeeper.Keeper - distKeeper distributionkeeper.Keeper - wasmKeeper Keeper - bankKeeper bankkeeper.Keeper + ctx sdk.Context + accKeeper authkeeper.AccountKeeper + stakingKeeper stakingkeeper.Keeper + distKeeper distributionkeeper.Keeper + wasmKeeper Keeper + contractKeeper wasmtypes.ContractOpsKeeper + bankKeeper bankkeeper.Keeper } func initializeStaking(t *testing.T) initInfo { @@ -186,7 +188,7 @@ func initializeStaking(t *testing.T) initInfo { // upload staking derivates code stakingCode, err := ioutil.ReadFile("./testdata/staking.wasm") require.NoError(t, err) - stakingID, err := keeper.Create(ctx, creator, stakingCode, "", "", nil) + stakingID, err := k.ContractKeeper.Create(ctx, creator, stakingCode, "", "", nil) require.NoError(t, err) require.Equal(t, uint64(1), stakingID) @@ -202,20 +204,21 @@ func initializeStaking(t *testing.T) initInfo { initBz, err := json.Marshal(&initMsg) require.NoError(t, err) - stakingAddr, _, err := keeper.Instantiate(ctx, stakingID, creator, nil, initBz, "staking derivates - DRV", nil) + stakingAddr, _, err := k.ContractKeeper.Instantiate(ctx, stakingID, creator, nil, initBz, "staking derivates - DRV", nil) require.NoError(t, err) require.NotEmpty(t, stakingAddr) return initInfo{ - valAddr: valAddr, - creator: creator, - contractAddr: stakingAddr, - ctx: ctx, - accKeeper: accKeeper, - stakingKeeper: stakingKeeper, - wasmKeeper: *keeper, - distKeeper: k.DistKeeper, - bankKeeper: bankKeeper, + valAddr: valAddr, + creator: creator, + contractAddr: stakingAddr, + ctx: ctx, + accKeeper: accKeeper, + stakingKeeper: stakingKeeper, + wasmKeeper: *keeper, + distKeeper: k.DistKeeper, + bankKeeper: bankKeeper, + contractKeeper: k.ContractKeeper, } } @@ -244,7 +247,7 @@ func TestBonding(t *testing.T) { } bondBz, err := json.Marshal(bond) require.NoError(t, err) - _, err = keeper.Execute(ctx, contractAddr, bob, bondBz, funds) + _, err = initInfo.contractKeeper.Execute(ctx, contractAddr, bob, bondBz, funds) require.NoError(t, err) // check some account values - the money is on neither account (cuz it is bonded) @@ -287,7 +290,7 @@ func TestUnbonding(t *testing.T) { } bondBz, err := json.Marshal(bond) require.NoError(t, err) - _, err = keeper.Execute(ctx, contractAddr, bob, bondBz, funds) + _, err = initInfo.contractKeeper.Execute(ctx, contractAddr, bob, bondBz, funds) require.NoError(t, err) // update height a bit @@ -301,7 +304,7 @@ func TestUnbonding(t *testing.T) { } unbondBz, err := json.Marshal(unbond) require.NoError(t, err) - _, err = keeper.Execute(ctx, contractAddr, bob, unbondBz, nil) + _, err = initInfo.contractKeeper.Execute(ctx, contractAddr, bob, unbondBz, nil) require.NoError(t, err) // check some account values - the money is on neither account (cuz it is bonded) @@ -356,7 +359,7 @@ func TestReinvest(t *testing.T) { } bondBz, err := json.Marshal(bond) require.NoError(t, err) - _, err = keeper.Execute(ctx, contractAddr, bob, bondBz, funds) + _, err = initInfo.contractKeeper.Execute(ctx, contractAddr, bob, bondBz, funds) require.NoError(t, err) // update height a bit to solidify the delegation @@ -370,7 +373,7 @@ func TestReinvest(t *testing.T) { } reinvestBz, err := json.Marshal(reinvest) require.NoError(t, err) - _, err = keeper.Execute(ctx, contractAddr, bob, reinvestBz, nil) + _, err = initInfo.contractKeeper.Execute(ctx, contractAddr, bob, reinvestBz, nil) require.NoError(t, err) // check some account values - the money is on neither account (cuz it is bonded) @@ -424,7 +427,7 @@ func TestQueryStakingInfo(t *testing.T) { } bondBz, err := json.Marshal(bond) require.NoError(t, err) - _, err = keeper.Execute(ctx, contractAddr, bob, bondBz, funds) + _, err = initInfo.contractKeeper.Execute(ctx, contractAddr, bob, bondBz, funds) require.NoError(t, err) // update height a bit to solidify the delegation @@ -442,12 +445,12 @@ func TestQueryStakingInfo(t *testing.T) { // upload mask code maskCode, err := ioutil.ReadFile("./testdata/reflect.wasm") require.NoError(t, err) - maskID, err := keeper.Create(ctx, creator, maskCode, "", "", nil) + maskID, err := initInfo.contractKeeper.Create(ctx, creator, maskCode, "", "", nil) require.NoError(t, err) require.Equal(t, uint64(2), maskID) // creator instantiates a contract and gives it tokens - maskAddr, _, err := keeper.Instantiate(ctx, maskID, creator, nil, []byte("{}"), "mask contract 2", nil) + maskAddr, _, err := initInfo.contractKeeper.Instantiate(ctx, maskID, creator, nil, []byte("{}"), "mask contract 2", nil) require.NoError(t, err) require.NotEmpty(t, maskAddr) @@ -546,7 +549,7 @@ func TestQueryStakingPlugin(t *testing.T) { // STEP 1: take a lot of setup from TestReinvest so we have non-zero info initInfo := initializeStaking(t) ctx, valAddr, contractAddr := initInfo.ctx, initInfo.valAddr, initInfo.contractAddr - keeper, stakingKeeper, accKeeper := initInfo.wasmKeeper, initInfo.stakingKeeper, initInfo.accKeeper + stakingKeeper, accKeeper := initInfo.stakingKeeper, initInfo.accKeeper distKeeper := initInfo.distKeeper // initial checks of bonding state @@ -566,7 +569,7 @@ func TestQueryStakingPlugin(t *testing.T) { } bondBz, err := json.Marshal(bond) require.NoError(t, err) - _, err = keeper.Execute(ctx, contractAddr, bob, bondBz, funds) + _, err = initInfo.contractKeeper.Execute(ctx, contractAddr, bob, bondBz, funds) require.NoError(t, err) // update height a bit to solidify the delegation diff --git a/x/wasm/keeper/submsg_test.go b/x/wasm/keeper/submsg_test.go index 086ff45353..bc0fa98ea3 100644 --- a/x/wasm/keeper/submsg_test.go +++ b/x/wasm/keeper/submsg_test.go @@ -30,12 +30,12 @@ func TestDispatchSubMsgSuccessCase(t *testing.T) { // upload code reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") require.NoError(t, err) - codeID, err := keeper.Create(ctx, creator, reflectCode, "", "", nil) + codeID, err := keepers.ContractKeeper.Create(ctx, creator, reflectCode, "", "", nil) require.NoError(t, err) require.Equal(t, uint64(1), codeID) // creator instantiates a contract and gives it tokens - contractAddr, _, err := keeper.Instantiate(ctx, codeID, creator, nil, []byte("{}"), "reflect contract 1", contractStart) + contractAddr, _, err := keepers.ContractKeeper.Instantiate(ctx, codeID, creator, nil, []byte("{}"), "reflect contract 1", contractStart) require.NoError(t, err) require.NotEmpty(t, contractAddr) @@ -66,7 +66,7 @@ func TestDispatchSubMsgSuccessCase(t *testing.T) { } reflectSendBz, err := json.Marshal(reflectSend) require.NoError(t, err) - _, err = keeper.Execute(ctx, contractAddr, creator, reflectSendBz, nil) + _, err = keepers.ContractKeeper.Execute(ctx, contractAddr, creator, reflectSendBz, nil) require.NoError(t, err) // fred got coins @@ -135,13 +135,13 @@ func TestDispatchSubMsgErrorHandling(t *testing.T) { // upload code reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") require.NoError(t, err) - reflectID, err := keeper.Create(ctx, uploader, reflectCode, "", "", nil) + reflectID, err := keepers.ContractKeeper.Create(ctx, uploader, reflectCode, "", "", nil) require.NoError(t, err) // create hackatom contract for testing (for infinite loop) hackatomCode, err := ioutil.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) - hackatomID, err := keeper.Create(ctx, uploader, hackatomCode, "", "", nil) + hackatomID, err := keepers.ContractKeeper.Create(ctx, uploader, hackatomCode, "", "", nil) require.NoError(t, err) _, _, bob := keyPubAddr() _, _, fred := keyPubAddr() @@ -151,7 +151,7 @@ func TestDispatchSubMsgErrorHandling(t *testing.T) { } initMsgBz, err := json.Marshal(initMsg) require.NoError(t, err) - hackatomAddr, _, err := keeper.Instantiate(ctx, hackatomID, uploader, nil, initMsgBz, "hackatom demo", contractStart) + hackatomAddr, _, err := keepers.ContractKeeper.Instantiate(ctx, hackatomID, uploader, nil, initMsgBz, "hackatom demo", contractStart) require.NoError(t, err) validBankSend := func(contract, emptyAccount string) wasmvmtypes.CosmosMsg { @@ -312,7 +312,7 @@ func TestDispatchSubMsgErrorHandling(t *testing.T) { creator := createFakeFundedAccount(t, ctx, accKeeper, bankKeeper, contractStart) _, _, empty := keyPubAddr() - contractAddr, _, err := keeper.Instantiate(ctx, reflectID, creator, nil, []byte("{}"), fmt.Sprintf("contract %s", name), contractStart) + contractAddr, _, err := keepers.ContractKeeper.Instantiate(ctx, reflectID, creator, nil, []byte("{}"), fmt.Sprintf("contract %s", name), contractStart) require.NoError(t, err) msg := tc.msg(contractAddr.String(), empty.String()) @@ -338,7 +338,7 @@ func TestDispatchSubMsgErrorHandling(t *testing.T) { } } }() - _, err = keeper.Execute(execCtx, contractAddr, creator, reflectSendBz, nil) + _, err = keepers.ContractKeeper.Execute(execCtx, contractAddr, creator, reflectSendBz, nil) if tc.executeError { require.Error(t, err) @@ -398,11 +398,11 @@ func TestDispatchSubMsgEncodeToNoSdkMsg(t *testing.T) { // upload code reflectCode, err := ioutil.ReadFile("./testdata/reflect.wasm") require.NoError(t, err) - codeID, err := keeper.Create(ctx, creator, reflectCode, "", "", nil) + codeID, err := keepers.ContractKeeper.Create(ctx, creator, reflectCode, "", "", nil) require.NoError(t, err) // creator instantiates a contract and gives it tokens - contractAddr, _, err := keeper.Instantiate(ctx, codeID, creator, nil, []byte("{}"), "reflect contract 1", contractStart) + contractAddr, _, err := keepers.ContractKeeper.Instantiate(ctx, codeID, creator, nil, []byte("{}"), "reflect contract 1", contractStart) require.NoError(t, err) require.NotEmpty(t, contractAddr) @@ -428,7 +428,7 @@ func TestDispatchSubMsgEncodeToNoSdkMsg(t *testing.T) { } reflectSendBz, err := json.Marshal(reflectSend) require.NoError(t, err) - _, err = keeper.Execute(ctx, contractAddr, creator, reflectSendBz, nil) + _, err = keepers.ContractKeeper.Execute(ctx, contractAddr, creator, reflectSendBz, nil) require.NoError(t, err) // query the reflect state to ensure the result was stored diff --git a/x/wasm/keeper/test_common.go b/x/wasm/keeper/test_common.go index a1cc7cd93c..31c70d1053 100644 --- a/x/wasm/keeper/test_common.go +++ b/x/wasm/keeper/test_common.go @@ -127,14 +127,15 @@ var TestingStakeParams = stakingtypes.Params{ } type TestKeepers struct { - AccountKeeper authkeeper.AccountKeeper - StakingKeeper stakingkeeper.Keeper - DistKeeper distributionkeeper.Keeper - BankKeeper bankkeeper.Keeper - GovKeeper govkeeper.Keeper - WasmKeeper *Keeper - IBCKeeper *ibckeeper.Keeper - Router *baseapp.Router + AccountKeeper authkeeper.AccountKeeper + StakingKeeper stakingkeeper.Keeper + DistKeeper distributionkeeper.Keeper + BankKeeper bankkeeper.Keeper + GovKeeper govkeeper.Keeper + ContractKeeper types.ContractOpsKeeper + WasmKeeper *Keeper + IBCKeeper *ibckeeper.Keeper + Router *baseapp.Router } // CreateDefaultTestInput common settings for CreateTestInput @@ -303,7 +304,8 @@ func createTestInput( ) keeper.setParams(ctx, types.DefaultParams()) // add wasm handler so we can loop-back (contracts calling contracts) - router.AddRoute(sdk.NewRoute(types.RouterKey, TestHandler(&keeper))) + contractKeeper := NewDefaultPermissionKeeper(&keeper) + router.AddRoute(sdk.NewRoute(types.RouterKey, TestHandler(contractKeeper))) govRouter := govtypes.NewRouter(). AddRoute(govtypes.RouterKey, govtypes.ProposalHandler). @@ -321,20 +323,21 @@ func createTestInput( govKeeper.SetTallyParams(ctx, govtypes.DefaultTallyParams()) keepers := TestKeepers{ - AccountKeeper: authKeeper, - StakingKeeper: stakingKeeper, - DistKeeper: distKeeper, - WasmKeeper: &keeper, - BankKeeper: bankKeeper, - GovKeeper: govKeeper, - IBCKeeper: ibcKeeper, - Router: router, + AccountKeeper: authKeeper, + StakingKeeper: stakingKeeper, + DistKeeper: distKeeper, + ContractKeeper: contractKeeper, + WasmKeeper: &keeper, + BankKeeper: bankKeeper, + GovKeeper: govKeeper, + IBCKeeper: ibcKeeper, + Router: router, } return ctx, keepers } // TestHandler returns a wasm handler for tests (to avoid circular imports) -func TestHandler(k *Keeper) sdk.Handler { +func TestHandler(k types.ContractOpsKeeper) sdk.Handler { return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { ctx = ctx.WithEventManager(sdk.NewEventManager()) switch msg := msg.(type) { @@ -351,7 +354,7 @@ func TestHandler(k *Keeper) sdk.Handler { } } -func handleStoreCode(ctx sdk.Context, k *Keeper, msg *types.MsgStoreCode) (*sdk.Result, error) { +func handleStoreCode(ctx sdk.Context, k types.ContractOpsKeeper, msg *types.MsgStoreCode) (*sdk.Result, error) { senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) if err != nil { return nil, sdkerrors.Wrap(err, "sender") @@ -367,7 +370,7 @@ func handleStoreCode(ctx sdk.Context, k *Keeper, msg *types.MsgStoreCode) (*sdk. }, nil } -func handleInstantiate(ctx sdk.Context, k *Keeper, msg *types.MsgInstantiateContract) (*sdk.Result, error) { +func handleInstantiate(ctx sdk.Context, k types.ContractOpsKeeper, msg *types.MsgInstantiateContract) (*sdk.Result, error) { senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) if err != nil { return nil, sdkerrors.Wrap(err, "sender") @@ -390,7 +393,7 @@ func handleInstantiate(ctx sdk.Context, k *Keeper, msg *types.MsgInstantiateCont }, nil } -func handleExecute(ctx sdk.Context, k *Keeper, msg *types.MsgExecuteContract) (*sdk.Result, error) { +func handleExecute(ctx sdk.Context, k types.ContractOpsKeeper, msg *types.MsgExecuteContract) (*sdk.Result, error) { senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) if err != nil { return nil, sdkerrors.Wrap(err, "sender") @@ -441,7 +444,7 @@ func StoreReflectContract(t TestingT, ctx sdk.Context, keepers TestKeepers) uint require.NoError(t, err) _, _, creatorAddr := keyPubAddr() - codeID, err := keepers.WasmKeeper.Create(ctx, creatorAddr, wasmCode, "", "", nil) + codeID, err := keepers.ContractKeeper.Create(ctx, creatorAddr, wasmCode, "", "", nil) require.NoError(t, err) return codeID } @@ -454,7 +457,7 @@ func StoreExampleContract(t TestingT, ctx sdk.Context, keepers TestKeepers, wasm wasmCode, err := ioutil.ReadFile(wasmFile) require.NoError(t, err) - codeID, err := keepers.WasmKeeper.Create(ctx, creatorAddr, wasmCode, "", "", nil) + codeID, err := keepers.ContractKeeper.Create(ctx, creatorAddr, wasmCode, "", "", nil) require.NoError(t, err) return ExampleContract{anyAmount, creator, creatorAddr, codeID} } @@ -470,7 +473,7 @@ type ExampleContractInstance struct { func SeedNewContractInstance(t TestingT, ctx sdk.Context, keepers TestKeepers, mock types.WasmerEngine) ExampleContractInstance { t.Helper() exampleContract := StoreRandomContract(t, ctx, keepers, mock) - contractAddr, _, err := keepers.WasmKeeper.Instantiate(ctx, exampleContract.CodeID, exampleContract.CreatorAddr, exampleContract.CreatorAddr, []byte(`{}`), "", nil) + contractAddr, _, err := keepers.ContractKeeper.Instantiate(ctx, exampleContract.CodeID, exampleContract.CreatorAddr, exampleContract.CreatorAddr, []byte(`{}`), "", nil) require.NoError(t, err) return ExampleContractInstance{ ExampleContract: exampleContract, @@ -486,7 +489,7 @@ func StoreRandomContract(t TestingT, ctx sdk.Context, keepers TestKeepers, mock fundAccounts(t, ctx, keepers.AccountKeeper, keepers.BankKeeper, creatorAddr, anyAmount) keepers.WasmKeeper.wasmVM = mock wasmCode := append(wasmIdent, rand.Bytes(10)...) - codeID, err := keepers.WasmKeeper.Create(ctx, creatorAddr, wasmCode, "", "", nil) + codeID, err := keepers.ContractKeeper.Create(ctx, creatorAddr, wasmCode, "", "", nil) require.NoError(t, err) exampleContract := ExampleContract{InitialAmount: anyAmount, Creator: creator, CreatorAddr: creatorAddr, CodeID: codeID} return exampleContract @@ -516,7 +519,7 @@ func InstantiateHackatomExampleContract(t TestingT, ctx sdk.Context, keepers Tes initialAmount := sdk.NewCoins(sdk.NewInt64Coin("denom", 100)) adminAddr := contract.CreatorAddr - contractAddr, _, err := keepers.WasmKeeper.Instantiate(ctx, contract.CodeID, contract.CreatorAddr, adminAddr, initMsgBz, "demo contract to query", initialAmount) + contractAddr, _, err := keepers.ContractKeeper.Instantiate(ctx, contract.CodeID, contract.CreatorAddr, adminAddr, initMsgBz, "demo contract to query", initialAmount) require.NoError(t, err) return HackatomExampleInstance{ ExampleContract: contract, @@ -556,7 +559,7 @@ func InstantiateIBCReflectContract(t TestingT, ctx sdk.Context, keepers TestKeep }.GetBytes(t) adminAddr := RandomAccountAddress(t) - contractAddr, _, err := keepers.WasmKeeper.Instantiate(ctx, ibcReflectID, adminAddr, adminAddr, initMsgBz, "ibc-reflect-factory", nil) + contractAddr, _, err := keepers.ContractKeeper.Instantiate(ctx, ibcReflectID, adminAddr, adminAddr, initMsgBz, "ibc-reflect-factory", nil) require.NoError(t, err) return IBCReflectExampleInstance{ Admin: adminAddr, diff --git a/x/wasm/module.go b/x/wasm/module.go index 102c69165f..aa794d2013 100644 --- a/x/wasm/module.go +++ b/x/wasm/module.go @@ -111,7 +111,7 @@ func NewAppModule(cdc codec.Marshaler, keeper *Keeper, validatorSetSource keeper } func (am AppModule) RegisterServices(cfg module.Configurator) { - types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) + types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(keeper.NewDefaultPermissionKeeper(am.keeper))) types.RegisterQueryServer(cfg.QueryServer(), NewQuerier(am.keeper)) } @@ -124,7 +124,7 @@ func (am AppModule) RegisterInvariants(ir sdk.InvariantRegistry) {} // Route returns the message routing key for the wasm module. func (am AppModule) Route() sdk.Route { - return sdk.NewRoute(RouterKey, NewHandler(am.keeper)) + return sdk.NewRoute(RouterKey, NewHandler(keeper.NewDefaultPermissionKeeper(am.keeper))) } // QuerierRoute returns the wasm module's querier route name. diff --git a/x/wasm/types/exported_keepers.go b/x/wasm/types/exported_keepers.go index 348ca29a90..ee63c21904 100644 --- a/x/wasm/types/exported_keepers.go +++ b/x/wasm/types/exported_keepers.go @@ -12,6 +12,7 @@ type ViewKeeper interface { GetContractHistory(ctx types.Context, contractAddr types.AccAddress) []ContractCodeHistoryEntry QuerySmart(ctx types.Context, contractAddr types.AccAddress, req []byte) ([]byte, error) QueryRaw(ctx types.Context, contractAddress types.AccAddress, key []byte) []byte + HasContractInfo(ctx sdk.Context, contractAddress sdk.AccAddress) bool GetContractInfo(ctx types.Context, contractAddress types.AccAddress) *ContractInfo IterateContractInfo(ctx types.Context, cb func(types.AccAddress, ContractInfo) bool) GetContractState(ctx types.Context, contractAddress types.AccAddress) types.Iterator @@ -19,20 +20,32 @@ type ViewKeeper interface { IterateCodeInfos(ctx types.Context, cb func(uint64, CodeInfo) bool) GetByteCode(ctx types.Context, codeID uint64) ([]byte, error) IsPinnedCode(ctx types.Context, codeID uint64) bool - HasContractInfo(ctx sdk.Context, contractAddress sdk.AccAddress) bool } -// MsgOpsKeeper contains mutable operations that are triggered by messages normally -type MsgOpsKeeper interface { +// ContractOpsKeeper contains mutable operations on a contract. +type ContractOpsKeeper interface { + // Create uploads and compiles a WASM contract, returning a short identifier for the contract Create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, source string, builder string, instantiateAccess *AccessConfig) (codeID uint64, err error) + + // Instantiate creates an instance of a WASM contract Instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.AccAddress, initMsg []byte, label string, deposit sdk.Coins) (sdk.AccAddress, []byte, error) + + // Execute executes the contract instance Execute(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, msg []byte, coins sdk.Coins) (*sdk.Result, error) + + // Migrate allows to upgrade a contract to a new code with data migration. Migrate(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, newCodeID uint64, msg []byte) (*sdk.Result, error) + + // UpdateContractAdmin sets the admin value on the ContractInfo. It must be a valid address (use ClearContractAdmin to remove it) UpdateContractAdmin(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, newAdmin sdk.AccAddress) error // ClearContractAdmin sets the admin value on the ContractInfo to nil, to disable further migrations/ updates. ClearContractAdmin(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress) error + + // PinCode pins the wasm contract in wasmvm cache PinCode(ctx sdk.Context, codeID uint64) error + + // UnpinCode removes the wasm contract from wasmvm cache UnpinCode(ctx sdk.Context, codeID uint64) error } diff --git a/x/wasm/types/proposal.go b/x/wasm/types/proposal.go index 57d8c36b1e..21cf84299d 100644 --- a/x/wasm/types/proposal.go +++ b/x/wasm/types/proposal.go @@ -62,13 +62,13 @@ func init() { // register new content types with the sdk govtypes.RegisterProposalType(string(ProposalTypeClearAdmin)) govtypes.RegisterProposalType(string(ProposalTypePinCodes)) govtypes.RegisterProposalType(string(ProposalTypeUnpinCodes)) - govtypes.RegisterProposalTypeCodec(StoreCodeProposal{}, "wasm/StoreCodeProposal") - govtypes.RegisterProposalTypeCodec(InstantiateContractProposal{}, "wasm/InstantiateContractProposal") - govtypes.RegisterProposalTypeCodec(MigrateContractProposal{}, "wasm/MigrateContractProposal") - govtypes.RegisterProposalTypeCodec(UpdateAdminProposal{}, "wasm/UpdateAdminProposal") - govtypes.RegisterProposalTypeCodec(ClearAdminProposal{}, "wasm/ClearAdminProposal") - govtypes.RegisterProposalTypeCodec(PinCodesProposal{}, "wasm/PinCodesProposal") - govtypes.RegisterProposalTypeCodec(UnpinCodesProposal{}, "wasm/UnpinCodesProposal") + govtypes.RegisterProposalTypeCodec(&StoreCodeProposal{}, "wasm/StoreCodeProposal") + govtypes.RegisterProposalTypeCodec(&InstantiateContractProposal{}, "wasm/InstantiateContractProposal") + govtypes.RegisterProposalTypeCodec(&MigrateContractProposal{}, "wasm/MigrateContractProposal") + govtypes.RegisterProposalTypeCodec(&UpdateAdminProposal{}, "wasm/UpdateAdminProposal") + govtypes.RegisterProposalTypeCodec(&ClearAdminProposal{}, "wasm/ClearAdminProposal") + govtypes.RegisterProposalTypeCodec(&PinCodesProposal{}, "wasm/PinCodesProposal") + govtypes.RegisterProposalTypeCodec(&UnpinCodesProposal{}, "wasm/UnpinCodesProposal") } // ProposalRoute returns the routing key of a parameter change proposal. From 55ac19bc7e212742066943e836ccf96b0ebe0daa Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Tue, 23 Mar 2021 18:45:14 +0100 Subject: [PATCH 3/4] Public CoinTransferrer interface --- x/wasm/keeper/keeper.go | 14 +++++++------- x/wasm/keeper/options.go | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index 471c95b913..43b4e4be3d 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -62,7 +62,7 @@ type Messenger interface { DispatchMsg(ctx sdk.Context, contractAddr sdk.AccAddress, contractIBCPortID string, msg wasmvmtypes.CosmosMsg) (events []sdk.Event, data [][]byte, err error) } -type coinTransferrer interface { +type CoinTransferrer interface { // TransferCoins sends the coin amounts from the source to the destination with rules applied. TransferCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error } @@ -72,7 +72,7 @@ type Keeper struct { storeKey sdk.StoreKey cdc codec.Marshaler accountKeeper types.AccountKeeper - bank coinTransferrer + bank CoinTransferrer portKeeper types.PortKeeper capabilityKeeper types.CapabilityKeeper wasmVM types.WasmerEngine @@ -1027,21 +1027,21 @@ func (k Keeper) QueryGasLimit() sdk.Gas { return k.queryGasLimit } -// CoinTransferrer replicates the cosmos-sdk behaviour as in +// BankCoinTransferrer replicates the cosmos-sdk behaviour as in // https://github.com/cosmos/cosmos-sdk/blob/v0.41.4/x/bank/keeper/msg_server.go#L26 -type CoinTransferrer struct { +type BankCoinTransferrer struct { keeper types.BankKeeper } -func NewBankCoinTransferrer(keeper types.BankKeeper) CoinTransferrer { - return CoinTransferrer{ +func NewBankCoinTransferrer(keeper types.BankKeeper) BankCoinTransferrer { + return BankCoinTransferrer{ keeper: keeper, } } // TransferCoins transfers coins from source to destination account when coin send was enabled for them and the recipient // is not in the blocked address list. -func (c CoinTransferrer) TransferCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error { +func (c BankCoinTransferrer) TransferCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error { if err := c.keeper.SendEnabledCoins(ctx, amt...); err != nil { return err } diff --git a/x/wasm/keeper/options.go b/x/wasm/keeper/options.go index 2501544d52..9486a225ba 100644 --- a/x/wasm/keeper/options.go +++ b/x/wasm/keeper/options.go @@ -69,7 +69,7 @@ func WithMessageEncoders(x *MessageEncoders) Option { } // WithCoinTransferrer is an optional constructor parameter to set a custom coin transferrer -func WithCoinTransferrer(x coinTransferrer) Option { +func WithCoinTransferrer(x CoinTransferrer) Option { return optsFn(func(k *Keeper) { k.bank = x }) From 48df71f87359433324e57474ad84cfb74651644f Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Mon, 29 Mar 2021 13:50:48 +0200 Subject: [PATCH 4/4] Review comment --- x/wasm/handler.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/wasm/handler.go b/x/wasm/handler.go index 434520d06e..30139fa3be 100644 --- a/x/wasm/handler.go +++ b/x/wasm/handler.go @@ -11,7 +11,7 @@ import ( sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ) -// NewHandler returns a handler for "bank" type messages. +// NewHandler returns a handler for "wasm" type messages. func NewHandler(k types.ContractOpsKeeper) sdk.Handler { msgServer := keeper.NewMsgServerImpl(k)