Repository: ovrclk/akash
Pull request #884 (2020-10-23 18:06:26)

Update Cosmos SDK to v0.40.0-rc3
This PR is now ready for review. It updates the SDK version to the latest RC. This RC should be substantially the release version as the SDK and tendermint teams have everything in for 0.40.0. Only the IBC team has remaining issues. We anticipate a v0.40.0-rc3 late next week containing the last items that will be 0.40.0 final.

hydrogen18: @jackzampolin What's the goal of this? It looks like it moving us from v0.40 to v0.34
jackzampolin: @hydrogen18 there are some changes between the current `rc0` commit and the upcoming `rc2`. This PR updates the code to incorporate those changes. I'm using this to test the relayer. Will move PR out of WIP when there is new RC from the SDK team.
jackzampolin: Ok @anilCSE and @akhilkumarpilli I've done some work to try to impl `ADR31` (I think) and I'm getting the following error when trying to run `akash start` with a properly configured node:

```
I[2020-10-28|16:53:42.223] starting ABCI with Tendermint                module=main 
panic: type_url /cosmos.vesting.v1beta1.Msg/CreateVestingAccount has not been registered yet. Before calling RegisterService, you must register all interfaces by calling the `RegisterInterfaces` method on module.BasicManager. Each module should call `msgservice.RegisterMsgServiceDesc` inside its `RegisterInterfaces` method with the `_Msg_serviceDesc` generated by proto-gen

goroutine 1 [running]:
github.com/cosmos/cosmos-sdk/baseapp.(*MsgServiceRouter).RegisterService(0xc0001589e0, 0x79563e0, 0x629cf20, 0xc000d18960)
	github.com/cosmos/cosmos-sdk@v0.34.4-0.20201028192045-82f15f306e8a/baseapp/msg_service_router.go:58 +0x33a
github.com/cosmos/cosmos-sdk/x/auth/vesting/types.RegisterMsgServer(...)
	github.com/cosmos/cosmos-sdk@v0.34.4-0.20201028192045-82f15f306e8a/x/auth/vesting/types/tx.pb.go:277
github.com/cosmos/cosmos-sdk/x/auth/vesting.AppModule.RegisterServices(0x682fd60, 0xc0002688a0, 0x6891d00, 0xc000e56ed0, 0x6891d00, 0xc000e56ed0, 0xc0011c0500, 0x682fd60, 0xc000268910, 0x682fde0, ...)
	github.com/cosmos/cosmos-sdk@v0.34.4-0.20201028192045-82f15f306e8a/x/auth/vesting/module.go:105 +0x145
github.com/cosmos/cosmos-sdk/types/module.(*Manager).RegisterServices(0xc00102ce00, 0x6837e20, 0xc000158fe0)
	github.com/cosmos/cosmos-sdk@v0.34.4-0.20201028192045-82f15f306e8a/types/module/module.go:293 +0xa7
github.com/ovrclk/akash/app.NewApp(0x68750a0, 0xc000e58680, 0x689b0c0, 0xc000612200, 0x0, 0x0, 0x0, 0xc000e825a0, 0x7ffeefbffa35, 0xb, ...)
	github.com/ovrclk/akash/app/app.go:359 +0x55e5
github.com/ovrclk/akash/cmd/akash/cmd.newApp(0x68750a0, 0xc000e58680, 0x689b0c0, 0xc000612200, 0x0, 0x0, 0x680fbe0, 0xc000259c20, 0xb0af59b300000000, 0xc001066f00)
	github.com/ovrclk/akash/cmd/akash/cmd/root.go:140 +0x93d
github.com/cosmos/cosmos-sdk/server.startInProcess(0xc001059a80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6874c20, 0xc000240030, ...)
	github.com/cosmos/cosmos-sdk@v0.34.4-0.20201028192045-82f15f306e8a/server/start.go:208 +0x18d
github.com/cosmos/cosmos-sdk/server.StartCmd.func2(0xc000d12b00, 0xc0000b6880, 0x0, 0x4, 0x0, 0x0)
	github.com/cosmos/cosmos-sdk@v0.34.4-0.20201028192045-82f15f306e8a/server/start.go:117 +0x154
github.com/spf13/cobra.(*Command).execute(0xc000d12b00, 0xc0000b6840, 0x4, 0x4, 0xc000d12b00, 0xc0000b6840)
	github.com/spf13/cobra@v1.1.1/command.go:850 +0x47c
github.com/spf13/cobra.(*Command).ExecuteC(0xc00057d8c0, 0x630775a, 0x5, 0xc001122800)
	github.com/spf13/cobra@v1.1.1/command.go:958 +0x375
github.com/spf13/cobra.(*Command).Execute(...)
	github.com/spf13/cobra@v1.1.1/command.go:895
github.com/spf13/cobra.(*Command).ExecuteContext(...)
	github.com/spf13/cobra@v1.1.1/command.go:888
github.com/ovrclk/akash/cmd/akash/cmd.Execute(0xc00057d8c0, 0x6888ee0, 0xc00112eec0)
	github.com/ovrclk/akash/cmd/akash/cmd/root.go:87 +0x165
main.main()
	github.com/ovrclk/akash/cmd/akash/main.go:12 +0x2a
```
akhilkumarpilli: @jackzampolin , fixed above issue. Please cross check once.
jackzampolin: Thank you @akhilkumarpilli! Working again.
codecov[bot]: # [Codecov](https://codecov.io/gh/ovrclk/akash/pull/884?src=pr&el=h1) Report
> Merging [#884](https://codecov.io/gh/ovrclk/akash/pull/884?src=pr&el=desc) into [master](https://codecov.io/gh/ovrclk/akash/commit/8f77a64d14e2d6ba7fd773fd291f37240918d986?el=desc) will **increase** coverage by `0.01%`.
> The diff coverage is `36.17%`.

```diff
@@            Coverage Diff             @@
##           master     #884      +/-   ##
==========================================
+ Coverage   39.78%   39.79%   +0.01%     
==========================================
  Files         175      175              
  Lines        8986     8998      +12     
==========================================
+ Hits         3575     3581       +6     
- Misses       4997     5001       +4     
- Partials      414      416       +2     
```


boz: @akhilkumarpilli can you update this to `v0.40.0-rc4`?  I believe that version includes a fix from @hydrogen18 related to viper configuration that we can't do without.
akhilkumarpilli: > @akhilkumarpilli can you update this to `v0.40.0-rc4`? I believe that version includes a fix from @hydrogen18 related to viper configuration that we can't do without.

@boz , `v0.40.0-rc4` is not yet released. I think we need to wait for release.
boz: Thanks @akhilkumarpilli .   @hydrogen18 is your change in `0.40.0-rc3`?

Patch:
diff --git a/Makefile b/Makefile
index a72b52b9..b3d68a4c 100644
--- a/Makefile
+++ b/Makefile
@@ -39,6 +39,7 @@ DOCKER_BUF            := $(DOCKER_RUN) bufbuild/buf:$(BUF_VERSION)
 DOCKER_CLANG          := $(DOCKER_RUN) tendermintdev/docker-build-proto
 GOLANGCI_LINT          = $(DOCKER_RUN) golangci/golangci-lint:$(GOLANGCI_LINT_VERSION)-alpine golangci-lint run
 LINT                   = $(GOLANGCI_LINT) ./... --disable-all --deadline=5m --enable
+TEST_DOCKER_REPO      := jackzampolin/akashtest
 
 GORELEASER_CONFIG=.goreleaser.yaml
 # BUILD_TAGS are for builds withing this makefile
@@ -101,3 +102,13 @@ include make/test-simulation.mk
 include make/tools.mk
 include make/environment.mk
 include make/codegen.mk
+
+test-docker:
+	@docker build -f _build/Dockerfile.test -t ${TEST_DOCKER_REPO}:$(shell git rev-parse --short HEAD) .
+	@docker tag ${TEST_DOCKER_REPO}:$(shell git rev-parse --short HEAD) ${TEST_DOCKER_REPO}:$(shell git rev-parse --abbrev-ref HEAD | sed 's#/#_#g')
+	@docker tag ${TEST_DOCKER_REPO}:$(shell git rev-parse --short HEAD) ${TEST_DOCKER_REPO}:latest
+
+test-docker-push: test-docker
+	@docker push ${TEST_DOCKER_REPO}:$(shell git rev-parse --short HEAD)
+	@docker push ${TEST_DOCKER_REPO}:$(shell git rev-parse --abbrev-ref HEAD | sed 's#/#_#g')
+	@docker push ${TEST_DOCKER_REPO}:latest
diff --git a/_build/single-node.sh b/_build/single-node.sh
new file mode 100755
index 00000000..1cacb139
--- /dev/null
+++ b/_build/single-node.sh
@@ -0,0 +1,32 @@
+#!/bin/sh
+
+CHAINID=$1
+GENACCT=$2
+
+if [ -z "$1" ]; then
+  echo "Need to input chain id..."
+  exit 1
+fi
+
+if [ -z "$2" ]; then
+  echo "Need to input genesis account address..."
+  exit 1
+fi
+
+# Build genesis file incl account for passed address
+coins="10000000000stake,100000000000samoleans"
+akash init --chain-id "$CHAINID" "$CHAINID"
+akash keys add validator --keyring-backend="test"
+akash add-genesis-account "$(akash keys show validator -a --keyring-backend="test")" $coins
+akash add-genesis-account "$GENACCT" $coins
+akash gentx validator --keyring-backend="test" --chain-id "$CHAINID"
+akash collect-gentxs
+
+# Set proper defaults and change ports
+sed -i 's#"tcp://127.0.0.1:26657"#"tcp://0.0.0.0:26657"#g' ~/.akash/config/config.toml
+sed -i 's/timeout_commit = "5s"/timeout_commit = "1s"/g' ~/.akash/config/config.toml
+sed -i 's/timeout_propose = "3s"/timeout_propose = "1s"/g' ~/.akash/config/config.toml
+sed -i 's/index_all_keys = false/index_all_keys = true/g' ~/.akash/config/config.toml
+
+# Start the akash
+akash start --pruning=nothing
\ No newline at end of file
diff --git a/app/app.go b/app/app.go
index db714fe5..3cc7cf3a 100644
--- a/app/app.go
+++ b/app/app.go
@@ -13,6 +13,7 @@ import (
 	"github.com/cosmos/cosmos-sdk/server/api"
 	"github.com/cosmos/cosmos-sdk/server/config"
 	"github.com/cosmos/cosmos-sdk/simapp"
+	"github.com/cosmos/cosmos-sdk/testutil/testdata"
 	sdk "github.com/cosmos/cosmos-sdk/types"
 	"github.com/cosmos/cosmos-sdk/types/module"
 	"github.com/cosmos/cosmos-sdk/x/auth"
@@ -20,6 +21,7 @@ import (
 	authrest "github.com/cosmos/cosmos-sdk/x/auth/client/rest"
 	authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper"
 	authsims "github.com/cosmos/cosmos-sdk/x/auth/simulation"
+	authtx "github.com/cosmos/cosmos-sdk/x/auth/tx"
 	authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
 	"github.com/cosmos/cosmos-sdk/x/auth/vesting"
 	"github.com/cosmos/cosmos-sdk/x/bank"
@@ -49,6 +51,8 @@ import (
 	upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
 	"github.com/gorilla/mux"
 	"github.com/rakyll/statik/fs"
+	"github.com/spf13/cast"
+	tmjson "github.com/tendermint/tendermint/libs/json"
 
 	"github.com/cosmos/cosmos-sdk/x/params"
 	paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper"
@@ -69,6 +73,7 @@ import (
 	abci "github.com/tendermint/tendermint/abci/types"
 	tmos "github.com/tendermint/tendermint/libs/os"
 
+	servertypes "github.com/cosmos/cosmos-sdk/server/types"
 	"github.com/cosmos/cosmos-sdk/version"
 	capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types"
 	distr "github.com/cosmos/cosmos-sdk/x/distribution"
@@ -90,7 +95,10 @@ const (
 	AppName = "akash"
 )
 
-var DefaultHome = os.ExpandEnv("$HOME/.akash")
+var (
+	DefaultHome                         = os.ExpandEnv("$HOME/.akash")
+	_           servertypes.Application = (*AkashApp)(nil)
+)
 
 // AkashApp extends ABCI appplication
 type AkashApp struct {
@@ -142,7 +150,7 @@ type AkashApp struct {
 // NewApp creates and returns a new Akash App.
 func NewApp(
 	logger log.Logger, db dbm.DB, tio io.Writer, loadLatest bool, invCheckPeriod uint, skipUpgradeHeights map[int64]bool,
-	homePath string, options ...func(*bam.BaseApp),
+	homePath string, appOpts servertypes.AppOptions, options ...func(*bam.BaseApp),
 ) *AkashApp {
 
 	// TODO: Remove cdc in favor of appCodec once all modules are migrated.
@@ -154,8 +162,7 @@ func NewApp(
 	bapp := bam.NewBaseApp(AppName, logger, db, encodingConfig.TxConfig.TxDecoder(), options...)
 	bapp.SetCommitMultiStoreTracer(tio)
 	bapp.SetAppVersion(version.Version)
-	bapp.GRPCQueryRouter().SetInterfaceRegistry(interfaceRegistry)
-	bapp.GRPCQueryRouter().RegisterSimulateService(bapp.Simulate, interfaceRegistry)
+	bapp.SetInterfaceRegistry(interfaceRegistry)
 
 	keys := kvStoreKeys()
 	tkeys := transientStoreKeys()
@@ -297,6 +304,10 @@ func NewApp(
 
 	app.setAkashKeepers()
 
+	// NOTE: we may consider parsing `appOpts` inside module constructors. For the moment
+	// we prefer to be more strict in what arguments the modules expect.
+	var skipGenesisInvariants = cast.ToBool(appOpts.Get(crisis.FlagSkipGenesisInvariants))
+
 	app.mm = module.NewManager(
 		append([]module.AppModule{
 			genutil.NewAppModule(app.keeper.acct, app.keeper.staking, app.BaseApp.DeliverTx, encodingConfig.TxConfig),
@@ -304,7 +315,7 @@ func NewApp(
 			vesting.NewAppModule(app.keeper.acct, app.keeper.bank),
 			bank.NewAppModule(appCodec, app.keeper.bank, app.keeper.acct),
 			capability.NewAppModule(appCodec, *app.keeper.cap),
-			crisis.NewAppModule(&app.keeper.crisis),
+			crisis.NewAppModule(&app.keeper.crisis, skipGenesisInvariants),
 			gov.NewAppModule(appCodec, app.keeper.gov, app.keeper.acct, app.keeper.bank),
 			mint.NewAppModule(appCodec, app.keeper.mint, app.keeper.acct),
 			slashing.NewAppModule(appCodec, app.keeper.slashing, app.keeper.acct, app.keeper.bank, app.keeper.staking),
@@ -354,7 +365,10 @@ func NewApp(
 
 	app.mm.RegisterInvariants(&app.keeper.crisis)
 	app.mm.RegisterRoutes(app.Router(), app.QueryRouter(), encodingConfig.Amino)
-	app.mm.RegisterQueryServices(app.GRPCQueryRouter())
+	app.mm.RegisterServices(module.NewConfigurator(app.MsgServiceRouter(), app.GRPCQueryRouter()))
+
+	// add test gRPC service for testing gRPC queries in isolation
+	testdata.RegisterQueryServer(app.GRPCQueryRouter(), testdata.QueryImpl{})
 
 	app.sm = module.NewSimulationManager(
 		append([]module.AppModuleSimulation{
@@ -433,7 +447,9 @@ func (app *AkashApp) Name() string { return app.BaseApp.Name() }
 // InitChainer application update at chain initialization
 func (app *AkashApp) InitChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain {
 	var genesisState simapp.GenesisState
-	app.cdc.MustUnmarshalJSON(req.AppStateBytes, &genesisState)
+	if err := tmjson.Unmarshal(req.AppStateBytes, &genesisState); err != nil {
+		panic(err)
+	}
 	return app.mm.InitGenesis(ctx, app.appCodec, genesisState)
 }
 
@@ -495,10 +511,14 @@ func (app *AkashApp) SimulationManager() *module.SimulationManager {
 func (app *AkashApp) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIConfig) {
 	clientCtx := apiSvr.ClientCtx
 	rpc.RegisterRoutes(clientCtx, apiSvr.Router)
+	// Register legacy tx routes
 	authrest.RegisterTxRoutes(clientCtx, apiSvr.Router)
+	// Register new tx routes from grpc-gateway
+	authtx.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCRouter)
 
+	// Register legacy and grpc-gateway routes for all modules.
 	ModuleBasics().RegisterRESTRoutes(clientCtx, apiSvr.Router)
-	ModuleBasics().RegisterGRPCRoutes(apiSvr.ClientCtx, apiSvr.GRPCRouter)
+	ModuleBasics().RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCRouter)
 
 	// register swagger API from root so that other applications can override easily
 	if apiConfig.Swagger {
@@ -506,6 +526,11 @@ func (app *AkashApp) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIC
 	}
 }
 
+// RegisterTxService implements the Application.RegisterTxService method.
+func (app *AkashApp) RegisterTxService(clientCtx client.Context) {
+	authtx.RegisterTxService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.BaseApp.Simulate, app.interfaceRegistry)
+}
+
 // RegisterSwaggerAPI registers swagger route with API Server
 func RegisterSwaggerAPI(ctx client.Context, rtr *mux.Router) {
 	statikFS, err := fs.New()
diff --git a/app/config.go b/app/config.go
index ccf6e714..57408162 100644
--- a/app/config.go
+++ b/app/config.go
@@ -7,6 +7,7 @@ import (
 	"github.com/cosmos/cosmos-sdk/types/module"
 	"github.com/cosmos/cosmos-sdk/x/auth"
 	authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
+	"github.com/cosmos/cosmos-sdk/x/auth/vesting"
 	"github.com/cosmos/cosmos-sdk/x/bank"
 	banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
 	"github.com/cosmos/cosmos-sdk/x/capability"
@@ -68,6 +69,7 @@ var (
 			upgrade.AppModuleBasic{},
 			evidence.AppModuleBasic{},
 			transfer.AppModuleBasic{},
+			vesting.AppModuleBasic{},
 		},
 			// akash
 			akashModuleBasics()...,
diff --git a/app/export.go b/app/export.go
index 292627d6..a43677e8 100644
--- a/app/export.go
+++ b/app/export.go
@@ -10,10 +10,10 @@ import (
 	dbm "github.com/tendermint/tm-db"
 
 	servertypes "github.com/cosmos/cosmos-sdk/server/types"
+	"github.com/cosmos/cosmos-sdk/simapp"
 	sdk "github.com/cosmos/cosmos-sdk/types"
 	slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types"
 	"github.com/cosmos/cosmos-sdk/x/staking"
-	"github.com/cosmos/cosmos-sdk/x/staking/exported"
 	stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
 )
 
@@ -41,7 +41,10 @@ func (app *AkashApp) ExportAppStateAndValidators(
 		return servertypes.ExportedApp{}, err
 	}
 
-	validators := staking.WriteValidators(ctx, app.keeper.staking)
+	validators, err := staking.WriteValidators(ctx, app.keeper.staking)
+	if err != nil {
+		return servertypes.ExportedApp{}, err
+	}
 	return servertypes.ExportedApp{
 		AppState:        appState,
 		Validators:      validators,
@@ -77,7 +80,7 @@ func (app *AkashApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs
 	/* Handle fee distribution state. */
 
 	// withdraw all validator commission
-	app.keeper.staking.IterateValidators(ctx, func(_ int64, val exported.ValidatorI) (stop bool) {
+	app.keeper.staking.IterateValidators(ctx, func(_ int64, val stakingtypes.ValidatorI) (stop bool) {
 		_, _ = app.keeper.distr.WithdrawValidatorCommission(ctx, val.GetOperator())
 		return false
 	})
@@ -108,7 +111,7 @@ func (app *AkashApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs
 	ctx = ctx.WithBlockHeight(0)
 
 	// reinitialize all validators
-	app.keeper.staking.IterateValidators(ctx, func(_ int64, val exported.ValidatorI) (stop bool) {
+	app.keeper.staking.IterateValidators(ctx, func(_ int64, val stakingtypes.ValidatorI) (stop bool) {
 		// donate any unwithdrawn outstanding reward fraction tokens to the community pool
 		scraps := app.keeper.distr.GetValidatorOutstandingRewardsCoins(ctx, val.GetOperator())
 		feePool := app.keeper.distr.GetFeePool(ctx)
@@ -181,7 +184,7 @@ func (app *AkashApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs
 
 	iter.Close()
 
-	_ = app.keeper.staking.ApplyAndReturnValidatorSetUpdates(ctx)
+	_, _ = app.keeper.staking.ApplyAndReturnValidatorSetUpdates(ctx)
 
 	/* Handle slashing state. */
 
@@ -199,7 +202,9 @@ func (app *AkashApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs
 // Setup initializes a new AkashApp. A Nop logger is set in AkashApp.
 func Setup(isCheckTx bool) *AkashApp {
 	db := dbm.NewMemDB()
-	app := NewApp(logger.NewNopLogger(), db, nil, true, 5, map[int64]bool{}, DefaultHome)
+
+	// TODO: make this configurable via config or flag.
+	app := NewApp(logger.NewNopLogger(), db, nil, true, 5, map[int64]bool{}, DefaultHome, simapp.EmptyAppOptions{})
 	if !isCheckTx {
 		// init chain must be called to stop deliverState from being nil
 		genesisState := NewDefaultGenesisState()
diff --git a/buf.yaml b/buf.yaml
index b60a1cfe..cec80d11 100644
--- a/buf.yaml
+++ b/buf.yaml
@@ -19,6 +19,7 @@ lint:
     - ENUM_VALUE_PREFIX
     - ENUM_VALUE_UPPER_SNAKE_CASE
     - ENUM_ZERO_VALUE_SUFFIX
+    - RPC_REQUEST_STANDARD_NAME
   ignore:
     - ibc
     - cosmos
diff --git a/cmd/akash/cmd/root.go b/cmd/akash/cmd/root.go
index 56b9d25e..78bcf98f 100644
--- a/cmd/akash/cmd/root.go
+++ b/cmd/akash/cmd/root.go
@@ -24,6 +24,7 @@ import (
 	vestingcli "github.com/cosmos/cosmos-sdk/x/auth/vesting/client/cli"
 	bankcmd "github.com/cosmos/cosmos-sdk/x/bank/client/cli"
 	banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
+	"github.com/cosmos/cosmos-sdk/x/crisis"
 	genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli"
 	"github.com/ovrclk/akash/app"
 	ecmd "github.com/ovrclk/akash/events/cmd"
@@ -77,11 +78,13 @@ func Execute(rootCmd *cobra.Command) error {
 	// and a Tendermint RPC. This requires the use of a pointer reference when
 	// getting and setting the client.Context. Ideally, we utilize
 	// https://github.com/spf13/cobra/pull/1118.
-
+	srvCtx := server.NewDefaultContext()
 	ctx := context.Background()
 	ctx = context.WithValue(ctx, client.ClientContextKey, &client.Context{})
 	ctx = context.WithValue(ctx, server.ServerContextKey, server.NewDefaultContext())
 
+	rootCmd.PersistentFlags().String("log_level", srvCtx.Config.LogLevel, "The logging level in the format of <module>:<level>,...")
+
 	executor := tmcli.PrepareBaseCmd(rootCmd, "AKASH", app.DefaultHome)
 	return executor.ExecuteContext(ctx)
 }
@@ -106,7 +109,11 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) {
 		debug.Cmd(),
 	)
 
-	server.AddCommands(rootCmd, app.DefaultHome, newApp, createAppAndExport)
+	server.AddCommands(rootCmd, app.DefaultHome, newApp, createAppAndExport, addModuleInitFlags)
+}
+
+func addModuleInitFlags(startCmd *cobra.Command) {
+	crisis.AddModuleInitFlags(startCmd)
 }
 
 func newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, appOpts servertypes.AppOptions) servertypes.Application {
@@ -139,6 +146,7 @@ func newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, appOpts serverty
 	return app.NewApp(
 		logger, db, traceStore, true, cast.ToUint(appOpts.Get(server.FlagInvCheckPeriod)), skipUpgradeHeights,
 		cast.ToString(appOpts.Get(flags.FlagHome)),
+		appOpts,
 		baseapp.SetPruning(pruningOpts),
 		baseapp.SetMinGasPrices(cast.ToString(appOpts.Get(server.FlagMinGasPrices))),
 		baseapp.SetHaltHeight(cast.ToUint64(appOpts.Get(server.FlagHaltHeight))),
@@ -154,18 +162,18 @@ func newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, appOpts serverty
 }
 
 func createAppAndExport(
-	logger log.Logger, db dbm.DB, tio io.Writer, height int64, forZeroHeight bool, jailAllowedAddrs []string,
-) (servertypes.ExportedApp, error) {
+	logger log.Logger, db dbm.DB, tio io.Writer, height int64, forZeroHeight bool, jailAllowedAddrs []string, appOpts servertypes.AppOptions) (servertypes.ExportedApp, error) {
 
 	var akashApp *app.AkashApp
+
 	if height != -1 {
-		akashApp = app.NewApp(logger, db, tio, false, uint(1), map[int64]bool{}, "")
+		akashApp = app.NewApp(logger, db, tio, false, uint(1), map[int64]bool{}, "", appOpts)
 
 		if err := akashApp.LoadHeight(height); err != nil {
 			return servertypes.ExportedApp{}, err
 		}
 	} else {
-		akashApp = app.NewApp(logger, db, tio, true, uint(1), map[int64]bool{}, "")
+		akashApp = app.NewApp(logger, db, tio, true, uint(1), map[int64]bool{}, "", appOpts)
 	}
 
 	return akashApp.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs)
diff --git a/go.mod b/go.mod
index 530536e6..c9995787 100644
--- a/go.mod
+++ b/go.mod
@@ -6,12 +6,11 @@ require (
 	github.com/blang/semver v3.5.1+incompatible
 	github.com/boz/go-lifecycle v0.1.1-0.20190620234137-5139c86739b8
 	github.com/caarlos0/env v3.3.0+incompatible
-	github.com/cosmos/cosmos-sdk v0.40.0-rc0
+	github.com/cosmos/cosmos-sdk v0.40.0-rc3
 	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
 	github.com/go-kit/kit v0.10.0
 	github.com/gogo/protobuf v1.3.1
-	github.com/golang/protobuf v1.4.2
-	github.com/google/uuid v1.1.2-0.20190416172445-c2e93f3ae59f // indirect
+	github.com/golang/protobuf v1.4.3
 	github.com/gorilla/context v1.1.1
 	github.com/gorilla/mux v1.8.0
 	github.com/gorilla/websocket v1.4.2
@@ -26,20 +25,20 @@ require (
 	github.com/regen-network/cosmos-proto v0.3.0
 	github.com/rs/cors v1.7.1-0.20191011001009-dcbccb712443 // indirect
 	github.com/spf13/cast v1.3.1
-	github.com/spf13/cobra v1.0.0
+	github.com/spf13/cobra v1.1.1
 	github.com/spf13/pflag v1.0.5
 	github.com/spf13/viper v1.7.1
 	github.com/stretchr/objx v0.2.1-0.20190415111823-35313a95ee26 // indirect
 	github.com/stretchr/testify v1.6.1
 	github.com/subosito/gotenv v1.2.1-0.20190917103637-de67a6614a4d // indirect
-	github.com/tendermint/tendermint v0.34.0-rc4.0.20201005135527-d7d0ffea13c6
+	github.com/tendermint/tendermint v0.34.0-rc6
 	github.com/tendermint/tm-db v0.6.2
 	github.com/vektra/mockery v1.1.2
 	golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e
 	golang.org/x/tools v0.0.0-20200323144430-8dcfad9e016e
 	google.golang.org/appengine v1.6.6-0.20191016204603-16bce7d3dc4e // indirect
-	google.golang.org/genproto v0.0.0-20200825200019-8632dd797987
-	google.golang.org/grpc v1.32.0
+	google.golang.org/genproto v0.0.0-20201014134559-03b6142f0dc9
+	google.golang.org/grpc v1.33.0
 	gopkg.in/yaml.v2 v2.3.0
 	gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c
 	k8s.io/api v0.18.2
@@ -55,5 +54,3 @@ replace github.com/keybase/go-keychain => github.com/99designs/go-keychain v0.0.
 replace github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.2-alpha.regen.4
 
 replace github.com/grpc-ecosystem/grpc-gateway => github.com/grpc-ecosystem/grpc-gateway v1.14.7
-
-replace github.com/cosmos/cosmos-sdk => github.com/ovrclk/cosmos-sdk v0.40.0-akash.rc0
diff --git a/go.sum b/go.sum
index 30d9faca..dcd86f17 100644
--- a/go.sum
+++ b/go.sum
@@ -32,6 +32,8 @@ github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:
 github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
 github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM=
 github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
+github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ=
+github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
 github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
 github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
 github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE=
@@ -125,8 +127,9 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk
 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
 github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
 github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
-github.com/confio/ics23/go v0.0.0-20200817220745-f173e6211efb h1:+7FsS1gZ1Km5LRjGV2hztpier/5i6ngNjvNpxbWP5I0=
 github.com/confio/ics23/go v0.0.0-20200817220745-f173e6211efb/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg=
+github.com/confio/ics23/go v0.6.3 h1:PuGK2V1NJWZ8sSkNDq91jgT/cahFEW9RGp4Y5jxulf0=
+github.com/confio/ics23/go v0.6.3/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg=
 github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s=
 github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
 github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04=
@@ -141,10 +144,13 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7
 github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg=
 github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
+github.com/cosmos/cosmos-sdk v0.40.0-rc3 h1:sS9BZ82dOxXiZPZdfrzSniEAzLLN0oTP5lFVyjnq2x4=
+github.com/cosmos/cosmos-sdk v0.40.0-rc3/go.mod h1:eKgbkQO4FEvC+a1+eyRuL7UgluGK1ad4PufPTpQc6ZA=
 github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d h1:49RLWk1j44Xu4fjHb6JFYmeUnDORVwHNkDxaQ0ctCVU=
 github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y=
-github.com/cosmos/iavl v0.15.0-rc3 h1:rSm60IFfDCD9qDfvXKEmaJhcv0rB5uCbVlBDKsynxqw=
-github.com/cosmos/iavl v0.15.0-rc3/go.mod h1:rQ2zK/LuivThMjve3Yr6VkjvCqCXl+fgHCY7quiUA68=
+github.com/cosmos/iavl v0.15.0-rc3.0.20201009144442-230e9bdf52cd/go.mod h1:3xOIaNNX19p0QrX0VqWa6voPRoJRGGYtny+DH8NEPvE=
+github.com/cosmos/iavl v0.15.0-rc4 h1:P1wmET7BueqCzfxsn+BzVkDWDLY9ij2JNwkbIdM7RG8=
+github.com/cosmos/iavl v0.15.0-rc4/go.mod h1:5CsecJdh44Uj4vZ6WSPeWq84hNW5BwRI36ZsAbfJvRw=
 github.com/cosmos/ledger-cosmos-go v0.11.1 h1:9JIYsGnXP613pb2vPjFeMMjBI5lEDsEaF6oYorTy6J4=
 github.com/cosmos/ledger-cosmos-go v0.11.1/go.mod h1:J8//BsAGTo3OC/vDLjMRFLW6q0WAaXvHnVc7ZmE8iUY=
 github.com/cosmos/ledger-go v0.9.2 h1:Nnao/dLwaVTk1Q5U9THldpUMMXU94BOTWPddSmVB6pI=
@@ -161,18 +167,20 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218=
-github.com/dgraph-io/badger/v2 v2.0.3 h1:inzdf6VF/NZ+tJ8RwwYMjJMvsOALTHYdozn0qSl6XJI=
-github.com/dgraph-io/badger/v2 v2.0.3/go.mod h1:3KY8+bsP8wI0OEnQJAKpd4wIJW/Mm32yw2j/9FUVnIM=
 github.com/dgraph-io/badger/v2 v2.2007.1 h1:t36VcBCpo4SsmAD5M8wVv1ieVzcALyGfaJ92z4ccULM=
 github.com/dgraph-io/badger/v2 v2.2007.1/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE=
-github.com/dgraph-io/ristretto v0.0.2-0.20200115201040-8f368f2f2ab3 h1:MQLRM35Pp0yAyBYksjbj1nZI/w6eyRY/mWoM1sFf4kU=
-github.com/dgraph-io/ristretto v0.0.2-0.20200115201040-8f368f2f2ab3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E=
+github.com/dgraph-io/badger/v2 v2.2007.2 h1:EjjK0KqwaFMlPin1ajhP943VPENHJdEz1KLIegjaI3k=
+github.com/dgraph-io/badger/v2 v2.2007.2/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE=
 github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de h1:t0UHb5vdojIDUqktM6+xJAfScFBsVpXZmqC9dsgJmeA=
 github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E=
+github.com/dgraph-io/ristretto v0.0.3 h1:jh22xisGBjrEVnRZ1DVTpBVQm0Xndu8sMl0CWDzSIBI=
+github.com/dgraph-io/ristretto v0.0.3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E=
 github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA=
 github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
+github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y=
+github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
 github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
@@ -281,9 +289,13 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq
 github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
 github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
 github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
 github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
 github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.2 h1:aeE13tS0IiQgFjYdoL8qN3K1N2bXXtI6Vi51/y7BpMw=
+github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
@@ -303,8 +315,8 @@ github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OI
 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
 github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.1.2-0.20190416172445-c2e93f3ae59f h1:XXzyYlFbxK3kWfcmu3Wc+Tv8/QQl/VqwsWuSYF1Rj0s=
-github.com/google/uuid v1.1.2-0.20190416172445-c2e93f3ae59f/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
@@ -329,6 +341,7 @@ github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:Fecb
 github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
 github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
 github.com/grpc-ecosystem/go-grpc-middleware v1.2.1/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI=
+github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI=
 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
 github.com/grpc-ecosystem/grpc-gateway v1.14.7 h1:Nk5kuHrnWUTf/0GL1a/vchH/om9Ap2/HnVna+jYZgTY=
 github.com/grpc-ecosystem/grpc-gateway v1.14.7/go.mod h1:oYZKL012gGh6LMyg/xA7Q2yq6j8bu0wa+9w14EEthWU=
@@ -438,8 +451,6 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5
 github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
 github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643 h1:hLDRPB66XQT/8+wG9WsDpiCvZf1yKO7sz7scAjSlBa0=
 github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM=
-github.com/minio/highwayhash v1.0.0 h1:iMSDhgUILCr0TNm8LWlSjF8N0ZIj2qbO8WHp6Q/J2BA=
-github.com/minio/highwayhash v1.0.0/go.mod h1:xQboMTeM9nY9v/LlAOxFctujiv5+Aq2hR5dxBpaMbdc=
 github.com/minio/highwayhash v1.0.1 h1:dZ6IIu8Z14VlC0VpfKofAhCy74wu/Qb5gcn52yWoz/0=
 github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY=
 github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
@@ -512,8 +523,6 @@ github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6
 github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
 github.com/otiai10/mint v1.3.1 h1:BCmzIS3n71sGfHB5NMNDB3lHYPz8fWSkCAErHed//qc=
 github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc=
-github.com/ovrclk/cosmos-sdk v0.40.0-akash.rc0 h1:1M+brY5h7rUSlo0/kQ+9+tNcrRz3QNNBwdzPBRZKw8I=
-github.com/ovrclk/cosmos-sdk v0.40.0-akash.rc0/go.mod h1:YZcO00Tq/qqj4ncsfn+PobyTelsot7wEMGPpxEbEAT0=
 github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
 github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=
@@ -546,6 +555,8 @@ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeD
 github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
 github.com/prometheus/client_golang v1.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA=
 github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_golang v1.8.0 h1:zvJNkoCFAnYFNC24FV8nW4JdRJ3GIFcLbg65lL/JDcw=
+github.com/prometheus/client_golang v1.8.0/go.mod h1:O9VU6huf47PktckDQfMTX0Y8tY0/7TSWwj+ITvv0TnM=
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
@@ -569,6 +580,8 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT
 github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
 github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8=
 github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4=
+github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
 github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
 github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ=
 github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=
@@ -615,6 +628,8 @@ github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3
 github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
 github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8=
 github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
+github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4=
+github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI=
 github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
 github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
@@ -625,6 +640,7 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
 github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
+github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
 github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk=
 github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
 github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
@@ -643,8 +659,6 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
 github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
 github.com/subosito/gotenv v1.2.1-0.20190917103637-de67a6614a4d h1:YN4gX82mT31qsizy2jRheOCrGLCs15VF9SV5XPuBvkQ=
 github.com/subosito/gotenv v1.2.1-0.20190917103637-de67a6614a4d/go.mod h1:GVSeM7r0P1RI1gOKYyN9IuNkhMmQwKGsjVf3ulDrdzo=
-github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d h1:gZZadD8H+fF+n9CmNhYL1Y0dJB+kLOmKd7FbPJLeGHs=
-github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA=
 github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca h1:Ld/zXl5t4+D69SiV4JoN7kkfvJdOWlPpfxrzxpLMoUk=
 github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM=
 github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok=
@@ -655,12 +669,9 @@ github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 h1:hqAk8riJvK4RM
 github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15/go.mod h1:z4YtwM70uOnk8h0pjJYlj3zdYwi9l03By6iAIF5j/Pk=
 github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E=
 github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME=
-github.com/tendermint/tendermint v0.34.0-rc3 h1:d7Fsd5rdbxq4GmJ0kRfx7l7LesQM7e70f0ytWLTQ/Go=
-github.com/tendermint/tendermint v0.34.0-rc3/go.mod h1:BoHcEpjfpBHc1Be7RQz3AHaXFNObcDG7SNHCev6Or4g=
-github.com/tendermint/tendermint v0.34.0-rc4.0.20201005135527-d7d0ffea13c6 h1:gqZ0WDpDYgMm/iaiMEXvI1nt/GoWCuwtBomVpUMiAIs=
-github.com/tendermint/tendermint v0.34.0-rc4.0.20201005135527-d7d0ffea13c6/go.mod h1:BSXqR6vWbOecet726v66qVwSkFDLfEeBrq+EhkKbij4=
-github.com/tendermint/tm-db v0.6.1 h1:w3X87itMPXopcRPlFiqspEKhw4FXihPk2rnFFkP0zGk=
-github.com/tendermint/tm-db v0.6.1/go.mod h1:m3x9kRP4UFd7JODJL0yBAZqE7wTw+S37uAE90cTx7OA=
+github.com/tendermint/tendermint v0.34.0-rc4/go.mod h1:yotsojf2C1QBOw4dZrTcxbyxmPUrT4hNuOQWX9XUwB4=
+github.com/tendermint/tendermint v0.34.0-rc6 h1:SVuKGvvE22KxfuK8QUHctUrmOWJsncZSYXIYtcnoKN0=
+github.com/tendermint/tendermint v0.34.0-rc6/go.mod h1:ugzyZO5foutZImv0Iyx/gOFCX6mjJTgbLHTwi17VDVg=
 github.com/tendermint/tm-db v0.6.2 h1:DOn8jwCdjJblrCFJbtonEIPD1IuJWpbRUUdR8GWE4RM=
 github.com/tendermint/tm-db v0.6.2/go.mod h1:GYtQ67SUvATOcoY8/+x6ylk8Qo02BQyLrAs+yAcLvGI=
 github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
@@ -709,13 +720,13 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200406173513-056763e48d71/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 h1:DZhuSZLsGlFL4CmhA8BcRA0mnthyA/nZ00AqCUo7vHg=
 golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM=
 golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee h1:4yd7jl+vXjalO5ztz6Vc1VADv+S/80LGJmyl1ROJ2AI=
+golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -770,6 +781,8 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrS
 golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc h1:zK/HqS5bZxDptfPJNq8v7vJfXtkU7r9TLIoSr1bXaP4=
 golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200930145003-4acb6c075d10 h1:YfxMZzv3PjGonQYNUaeU2+DhAdqOxerQ30JFB6WgAXo=
+golang.org/x/net v0.0.0-20200930145003-4acb6c075d10/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -825,6 +838,8 @@ golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae h1:Ih9Yo4hSPImZOpfGuA4bR/ORK
 golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed h1:J22ig1FUekjjkmZUM7pTKixYm8DvrYsvrBZdunYeIuQ=
 golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211 h1:9UQO31fZ+0aKQOFldThf7BKPMJTiBfWycGh/u3UoO88=
+golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -902,8 +917,9 @@ google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfG
 google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=
 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/genproto v0.0.0-20200825200019-8632dd797987 h1:PDIOdWxZ8eRizhKa1AAvY53xsvLB1cWorMjslvY3VA8=
 google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201014134559-03b6142f0dc9 h1:fG84H9C3EXfuDlzkG+VEPDYHHExklP6scH1QZ5gQTqU=
+google.golang.org/genproto v0.0.0-20201014134559-03b6142f0dc9/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
@@ -925,6 +941,8 @@ google.golang.org/grpc v1.31.1 h1:SfXqXS5hkufcdZ/mHtYCh53P2b+92WQq/DZcKLgsFRs=
 google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
 google.golang.org/grpc v1.32.0 h1:zWTV+LMdc3kaiJMSTOFz2UgSBgx8RNQoTGiZu3fR9S0=
 google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.33.0 h1:IBKSUNL2uBS2DkJBncPP+TwT0sp9tgA8A75NjHt6umg=
+google.golang.org/grpc v1.33.0/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -940,8 +958,9 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U=
+gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
diff --git a/proto/akash/deployment/v1beta1/deployment.proto b/proto/akash/deployment/v1beta1/deployment.proto
index 91636c12..1901f4e5 100644
--- a/proto/akash/deployment/v1beta1/deployment.proto
+++ b/proto/akash/deployment/v1beta1/deployment.proto
@@ -6,6 +6,21 @@ import "akash/deployment/v1beta1/group.proto";
 
 option go_package = "github.com/ovrclk/akash/x/deployment/types";
 
+// Msg defines the deployment Msg service.
+service Msg {
+  // CreateDeployment defines a method to create new deployment given proper inputs.
+  rpc CreateDeployment(MsgCreateDeployment) returns (MsgCreateDeploymentResponse);
+
+  // UpdateDeployment defines a method to update a deployment given proper inputs.
+  rpc UpdateDeployment(MsgUpdateDeployment) returns (MsgUpdateDeploymentResponse);
+
+  // CloseDeployment defines a method to close a deployment given proper inputs.
+  rpc CloseDeployment(MsgCloseDeployment) returns (MsgCloseDeploymentResponse);
+
+  // CloseGroup defines a method to close a group of a deployment given proper inputs.
+  rpc CloseGroup(MsgCloseGroup) returns (MsgCloseGroupResponse);
+}
+
 // MsgCreateDeployment defines an SDK message for creating deployment
 message MsgCreateDeployment {
   option (gogoproto.equal) = false;
@@ -21,6 +36,9 @@ message MsgCreateDeployment {
   bytes version = 3 [(gogoproto.jsontag) = "version", (gogoproto.moretags) = "yaml:\"version\""];
 }
 
+// MsgCreateDeploymentResponse defines the Msg/CreateDeployment response type.
+message MsgCreateDeploymentResponse {}
+
 // MsgUpdateDeployment defines an SDK message for updating deployment
 message MsgUpdateDeployment {
   option (gogoproto.equal) = false;
@@ -36,6 +54,9 @@ message MsgUpdateDeployment {
   bytes version = 3 [(gogoproto.jsontag) = "version", (gogoproto.moretags) = "yaml:\"version\""];
 }
 
+// MsgUpdateDeploymentResponse defines the Msg/UpdateDeployment response type.
+message MsgUpdateDeploymentResponse {}
+
 // MsgCloseDeployment defines an SDK message for closing deployment
 message MsgCloseDeployment {
   option (gogoproto.equal) = false;
@@ -48,6 +69,9 @@ message MsgCloseDeployment {
   ];
 }
 
+// MsgCloseDeploymentResponse defines the Msg/CloseDeployment response type.
+message MsgCloseDeploymentResponse {}
+
 // DeploymentID stores owner and sequence number
 message DeploymentID {
   option (gogoproto.equal)            = false;
diff --git a/proto/akash/deployment/v1beta1/group.proto b/proto/akash/deployment/v1beta1/group.proto
index a4c9f562..017b533f 100644
--- a/proto/akash/deployment/v1beta1/group.proto
+++ b/proto/akash/deployment/v1beta1/group.proto
@@ -20,6 +20,9 @@ message MsgCloseGroup {
   ];
 }
 
+// MsgCloseGroupResponse defines the Msg/CloseGroup response type.
+message MsgCloseGroupResponse {}
+
 // GroupID stores owner, deployment sequence number and group sequence number
 message GroupID {
   option (gogoproto.equal)            = false;
diff --git a/proto/akash/market/v1beta1/bid.proto b/proto/akash/market/v1beta1/bid.proto
index 4c86be87..a74b716c 100644
--- a/proto/akash/market/v1beta1/bid.proto
+++ b/proto/akash/market/v1beta1/bid.proto
@@ -7,6 +7,18 @@ import "cosmos/base/v1beta1/coin.proto";
 
 option go_package = "github.com/ovrclk/akash/x/market/types";
 
+// Msg defines the market Msg service
+service Msg {
+  // CreateBid defines a method to create a bid given proper inputs.
+  rpc CreateBid(MsgCreateBid) returns (MsgCreateBidResponse);
+
+  // CloseBid defines a method to close a bid given proper inputs.
+  rpc CloseBid(MsgCloseBid) returns (MsgCloseBidResponse);
+
+  // CloseOrder defines a method to close an order given proper inputs.
+  rpc CloseOrder(MsgCloseOrder) returns (MsgCloseOrderResponse);
+}
+
 // MsgCreateBid defines an SDK message for creating Bid
 message MsgCreateBid {
   option (gogoproto.equal) = false;
@@ -22,6 +34,9 @@ message MsgCreateBid {
       [(gogoproto.nullable) = false, (gogoproto.jsontag) = "price", (gogoproto.moretags) = "yaml:\"price\""];
 }
 
+// MsgCreateBidResponse defines the Msg/CreateBid response type.
+message MsgCreateBidResponse {}
+
 // MsgCloseBid defines an SDK message for closing bid
 message MsgCloseBid {
   option (gogoproto.equal) = false;
@@ -34,6 +49,9 @@ message MsgCloseBid {
   ];
 }
 
+// MsgCloseBidResponse defines the Msg/CloseBid response type.
+message MsgCloseBidResponse {}
+
 // BidID stores owner and all other seq numbers
 // A successful bid becomes a Lease(ID).
 message BidID {
diff --git a/proto/akash/market/v1beta1/order.proto b/proto/akash/market/v1beta1/order.proto
index d33a4d08..5096afb7 100644
--- a/proto/akash/market/v1beta1/order.proto
+++ b/proto/akash/market/v1beta1/order.proto
@@ -18,6 +18,9 @@ message MsgCloseOrder {
   ];
 }
 
+// MsgCloseOrderResponse defines the Msg/CloseOrder response type.
+message MsgCloseOrderResponse {}
+
 // OrderID stores owner and all other seq numbers
 message OrderID {
   option (gogoproto.equal)            = false;
diff --git a/proto/akash/provider/v1beta1/provider.proto b/proto/akash/provider/v1beta1/provider.proto
index 528158b1..2addc316 100644
--- a/proto/akash/provider/v1beta1/provider.proto
+++ b/proto/akash/provider/v1beta1/provider.proto
@@ -6,6 +6,18 @@ import "akash/base/v1beta1/attribute.proto";
 
 option go_package = "github.com/ovrclk/akash/x/provider/types";
 
+// Msg defines the provider Msg service
+service Msg {
+  // CreateProvider defines a method that creates a provider given the proper inputs
+  rpc CreateProvider(MsgCreateProvider) returns (MsgCreateProviderResponse);
+
+  // UpdateProvider defines a method that updates a provider given the proper inputs
+  rpc UpdateProvider(MsgUpdateProvider) returns (MsgUpdateProviderResponse);
+
+  // DeleteProvider defines a method that deletes a provider given the proper inputs
+  rpc DeleteProvider(MsgDeleteProvider) returns (MsgDeleteProviderResponse);
+}
+
 // MsgCreateProvider defines an SDK message for creating a provider
 message MsgCreateProvider {
   option (gogoproto.equal) = false;
@@ -24,6 +36,9 @@ message MsgCreateProvider {
   ];
 }
 
+// MsgCreateProviderResponse defines the Msg/CreateProvider response type.
+message MsgCreateProviderResponse {}
+
 // MsgUpdateProvider defines an SDK message for updating a provider
 message MsgUpdateProvider {
   option (gogoproto.equal) = false;
@@ -42,6 +57,9 @@ message MsgUpdateProvider {
   ];
 }
 
+// MsgUpdateProviderResponse defines the Msg/UpdateProvider response type.
+message MsgUpdateProviderResponse {}
+
 // MsgDeleteProvider defines an SDK message for deleting a provider
 message MsgDeleteProvider {
   option (gogoproto.equal) = false;
@@ -49,6 +67,9 @@ message MsgDeleteProvider {
   string owner = 1 [(gogoproto.jsontag) = "owner", (gogoproto.moretags) = "yaml:\"owner\""];
 }
 
+// MsgDeleteProviderResponse defines the Msg/DeleteProvider response type.
+message MsgDeleteProviderResponse {}
+
 // Provider stores owner and host details
 message Provider {
   option (gogoproto.equal)            = false;
diff --git a/x/deployment/handler/handler.go b/x/deployment/handler/handler.go
index f0de8d7b..10f537a8 100644
--- a/x/deployment/handler/handler.go
+++ b/x/deployment/handler/handler.go
@@ -1,135 +1,37 @@
 package handler
 
 import (
-	"bytes"
-
 	sdk "github.com/cosmos/cosmos-sdk/types"
 	sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
-	"github.com/pkg/errors"
 
-	"github.com/ovrclk/akash/validation"
 	"github.com/ovrclk/akash/x/deployment/keeper"
 	"github.com/ovrclk/akash/x/deployment/types"
 )
 
 // NewHandler returns a handler for "deployment" type messages
 func NewHandler(keeper keeper.Keeper, mkeeper MarketKeeper) sdk.Handler {
+	ms := NewMsgServerImpl(keeper, mkeeper)
+
 	return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) {
 		switch msg := msg.(type) {
 		case *types.MsgCreateDeployment:
-			return handleMsgCreate(ctx, keeper, mkeeper, msg)
+			res, err := ms.CreateDeployment(sdk.WrapSDKContext(ctx), msg)
+			return sdk.WrapServiceResult(ctx, res, err)
+
 		case *types.MsgUpdateDeployment:
-			return handleMsgUpdate(ctx, keeper, mkeeper, msg)
+			res, err := ms.UpdateDeployment(sdk.WrapSDKContext(ctx), msg)
+			return sdk.WrapServiceResult(ctx, res, err)
+
 		case *types.MsgCloseDeployment:
-			return handleMsgCloseDeployment(ctx, keeper, mkeeper, msg)
+			res, err := ms.CloseDeployment(sdk.WrapSDKContext(ctx), msg)
+			return sdk.WrapServiceResult(ctx, res, err)
+
 		case *types.MsgCloseGroup:
-			return handleMsgCloseGroup(ctx, keeper, mkeeper, msg)
+			res, err := ms.CloseGroup(sdk.WrapSDKContext(ctx), msg)
+			return sdk.WrapServiceResult(ctx, res, err)
+
 		default:
 			return nil, sdkerrors.ErrUnknownRequest
 		}
 	}
 }
-
-func handleMsgCreate(ctx sdk.Context, keeper keeper.Keeper, _ MarketKeeper, msg *types.MsgCreateDeployment) (*sdk.Result, error) {
-	if _, found := keeper.GetDeployment(ctx, msg.ID); found {
-		return nil, types.ErrDeploymentExists
-	}
-
-	deployment := types.Deployment{
-		DeploymentID: msg.ID,
-		State:        types.DeploymentActive,
-		Version:      msg.Version,
-	}
-
-	if err := validation.ValidateDeploymentGroups(msg.Groups); err != nil {
-		return nil, errors.Wrap(types.ErrInvalidGroups, err.Error())
-	}
-
-	groups := make([]types.Group, 0, len(msg.Groups))
-
-	for idx, spec := range msg.Groups {
-		groups = append(groups, types.Group{
-			GroupID:   types.MakeGroupID(deployment.ID(), uint32(idx+1)),
-			State:     types.GroupOpen,
-			GroupSpec: spec,
-		})
-	}
-
-	if err := keeper.Create(ctx, deployment, groups); err != nil {
-		return nil, errors.Wrap(types.ErrInternal, err.Error())
-	}
-
-	return &sdk.Result{
-		Events: ctx.EventManager().ABCIEvents(),
-	}, nil
-}
-
-func handleMsgUpdate(ctx sdk.Context, keeper keeper.Keeper, _ MarketKeeper, msg *types.MsgUpdateDeployment) (*sdk.Result, error) {
-	deployment, found := keeper.GetDeployment(ctx, msg.ID)
-	if !found {
-		return nil, types.ErrDeploymentNotFound
-	}
-
-	if !bytes.Equal(msg.Version, deployment.Version) {
-		deployment.Version = msg.Version
-	}
-
-	if err := keeper.UpdateDeployment(ctx, deployment); err != nil {
-		return nil, errors.Wrap(types.ErrInternal, err.Error())
-	}
-
-	return &sdk.Result{
-		Events: ctx.EventManager().ABCIEvents(),
-	}, nil
-}
-
-func handleMsgCloseDeployment(ctx sdk.Context, keeper keeper.Keeper, mkeeper MarketKeeper, msg *types.MsgCloseDeployment) (*sdk.Result, error) {
-
-	deployment, found := keeper.GetDeployment(ctx, msg.ID)
-	if !found {
-		return nil, types.ErrDeploymentNotFound
-	}
-
-	if deployment.State == types.DeploymentClosed {
-		return nil, types.ErrDeploymentClosed
-	}
-
-	deployment.State = types.DeploymentClosed
-
-	if err := keeper.UpdateDeployment(ctx, deployment); err != nil {
-		return nil, errors.Wrap(types.ErrInternal, err.Error())
-	}
-
-	for _, group := range keeper.GetGroups(ctx, deployment.ID()) {
-		keeper.OnDeploymentClosed(ctx, group)
-		mkeeper.OnGroupClosed(ctx, group.ID())
-	}
-
-	return &sdk.Result{
-		Events: ctx.EventManager().ABCIEvents(),
-	}, nil
-}
-
-func handleMsgCloseGroup(ctx sdk.Context, keeper keeper.Keeper, mkeeper MarketKeeper, msg *types.MsgCloseGroup) (*sdk.Result, error) {
-	group, found := keeper.GetGroup(ctx, msg.ID)
-	if !found {
-		return nil, types.ErrGroupNotFound
-	}
-
-	// if Group already closed; return the validation error
-	err := group.ValidateClosable()
-	if err != nil {
-		return nil, err
-	}
-
-	// Update the Group's state
-	err = keeper.OnCloseGroup(ctx, group)
-	if err != nil {
-		return nil, err
-	}
-	mkeeper.OnGroupClosed(ctx, group.ID())
-
-	return &sdk.Result{
-		Events: ctx.EventManager().ABCIEvents(),
-	}, nil
-}
diff --git a/x/deployment/handler/msg_server.go b/x/deployment/handler/msg_server.go
new file mode 100644
index 00000000..b7f30786
--- /dev/null
+++ b/x/deployment/handler/msg_server.go
@@ -0,0 +1,129 @@
+package handler
+
+import (
+	"bytes"
+	"context"
+
+	sdk "github.com/cosmos/cosmos-sdk/types"
+	"github.com/pkg/errors"
+
+	"github.com/ovrclk/akash/validation"
+	"github.com/ovrclk/akash/x/deployment/keeper"
+	"github.com/ovrclk/akash/x/deployment/types"
+)
+
+type msgServer struct {
+	deployment keeper.Keeper
+	market     MarketKeeper
+}
+
+// NewMsgServerImpl returns an implementation of the deployment MsgServer interface
+// for the provided Keeper.
+func NewMsgServerImpl(k keeper.Keeper, mkeeper MarketKeeper) types.MsgServer {
+	return &msgServer{deployment: k, market: mkeeper}
+}
+
+var _ types.MsgServer = msgServer{}
+
+func (ms msgServer) CreateDeployment(goCtx context.Context, msg *types.MsgCreateDeployment) (*types.MsgCreateDeploymentResponse, error) {
+	ctx := sdk.UnwrapSDKContext(goCtx)
+
+	if _, found := ms.deployment.GetDeployment(ctx, msg.ID); found {
+		return nil, types.ErrDeploymentExists
+	}
+
+	deployment := types.Deployment{
+		DeploymentID: msg.ID,
+		State:        types.DeploymentActive,
+		Version:      msg.Version,
+	}
+
+	if err := validation.ValidateDeploymentGroups(msg.Groups); err != nil {
+		return nil, errors.Wrap(types.ErrInvalidGroups, err.Error())
+	}
+
+	groups := make([]types.Group, 0, len(msg.Groups))
+
+	for idx, spec := range msg.Groups {
+		groups = append(groups, types.Group{
+			GroupID:   types.MakeGroupID(deployment.ID(), uint32(idx+1)),
+			State:     types.GroupOpen,
+			GroupSpec: spec,
+		})
+	}
+
+	if err := ms.deployment.Create(ctx, deployment, groups); err != nil {
+		return nil, errors.Wrap(types.ErrInternal, err.Error())
+	}
+
+	return &types.MsgCreateDeploymentResponse{}, nil
+}
+
+func (ms msgServer) UpdateDeployment(goCtx context.Context, msg *types.MsgUpdateDeployment) (*types.MsgUpdateDeploymentResponse, error) {
+	ctx := sdk.UnwrapSDKContext(goCtx)
+
+	deployment, found := ms.deployment.GetDeployment(ctx, msg.ID)
+	if !found {
+		return nil, types.ErrDeploymentNotFound
+	}
+
+	if !bytes.Equal(msg.Version, deployment.Version) {
+		deployment.Version = msg.Version
+	}
+
+	if err := ms.deployment.UpdateDeployment(ctx, deployment); err != nil {
+		return nil, errors.Wrap(types.ErrInternal, err.Error())
+	}
+
+	return &types.MsgUpdateDeploymentResponse{}, nil
+}
+
+func (ms msgServer) CloseDeployment(goCtx context.Context, msg *types.MsgCloseDeployment) (*types.MsgCloseDeploymentResponse, error) {
+	ctx := sdk.UnwrapSDKContext(goCtx)
+
+	deployment, found := ms.deployment.GetDeployment(ctx, msg.ID)
+	if !found {
+		return nil, types.ErrDeploymentNotFound
+	}
+
+	if deployment.State == types.DeploymentClosed {
+		return nil, types.ErrDeploymentClosed
+	}
+
+	deployment.State = types.DeploymentClosed
+
+	if err := ms.deployment.UpdateDeployment(ctx, deployment); err != nil {
+		return nil, errors.Wrap(types.ErrInternal, err.Error())
+	}
+
+	for _, group := range ms.deployment.GetGroups(ctx, deployment.ID()) {
+		ms.deployment.OnDeploymentClosed(ctx, group)
+		ms.market.OnGroupClosed(ctx, group.ID())
+	}
+
+	return &types.MsgCloseDeploymentResponse{}, nil
+}
+
+func (ms msgServer) CloseGroup(goCtx context.Context, msg *types.MsgCloseGroup) (*types.MsgCloseGroupResponse, error) {
+	ctx := sdk.UnwrapSDKContext(goCtx)
+
+	group, found := ms.deployment.GetGroup(ctx, msg.ID)
+	if !found {
+		return nil, types.ErrGroupNotFound
+	}
+
+	// if Group already closed; return the validation error
+	err := group.ValidateClosable()
+	if err != nil {
+		return nil, err
+	}
+
+	// Update the Group's state
+	err = ms.deployment.OnCloseGroup(ctx, group)
+	if err != nil {
+		return nil, err
+	}
+	ms.market.OnGroupClosed(ctx, group.ID())
+
+	return &types.MsgCloseGroupResponse{}, nil
+}
diff --git a/x/deployment/module.go b/x/deployment/module.go
index 86747e54..0dc14229 100644
--- a/x/deployment/module.go
+++ b/x/deployment/module.go
@@ -12,7 +12,6 @@ import (
 	"github.com/cosmos/cosmos-sdk/types/module"
 	bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"
 	govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
-	"github.com/gogo/protobuf/grpc"
 	"github.com/gorilla/mux"
 	"github.com/grpc-ecosystem/grpc-gateway/runtime"
 	"github.com/ovrclk/akash/x/deployment/client/cli"
@@ -79,8 +78,8 @@ func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Rout
 	rest.RegisterRoutes(clientCtx, rtr, StoreKey)
 }
 
-// RegisterGRPCRoutes registers the gRPC Gateway routes for the deployment module.
-func (AppModuleBasic) RegisterGRPCRoutes(clientCtx client.Context, mux *runtime.ServeMux) {
+// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the deployment module.
+func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) {
 	err := types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx))
 	if err != nil {
 		panic(fmt.Sprintf("couldn't register deployment grpc routes: %s", err.Error()))
@@ -143,11 +142,11 @@ func (am AppModule) LegacyQuerierHandler(legacyQuerierCdc *codec.LegacyAmino) sd
 	return query.NewQuerier(am.keeper, legacyQuerierCdc)
 }
 
-// RegisterQueryService registers a GRPC query service to respond to the
-// module-specific GRPC queries.
-func (am AppModule) RegisterQueryService(server grpc.Server) {
+// RegisterServices registers the module's services
+func (am AppModule) RegisterServices(cfg module.Configurator) {
+	types.RegisterMsgServer(cfg.MsgServer(), handler.NewMsgServerImpl(am.keeper, am.mkeeper))
 	querier := keeper.Querier{Keeper: am.keeper}
-	types.RegisterQueryServer(server, querier)
+	types.RegisterQueryServer(cfg.QueryServer(), querier)
 }
 
 // BeginBlock performs no-op
diff --git a/x/deployment/simulation/operations.go b/x/deployment/simulation/operations.go
index 8dbfe884..ed21495c 100644
--- a/x/deployment/simulation/operations.go
+++ b/x/deployment/simulation/operations.go
@@ -130,7 +130,7 @@ func SimulateMsgCreateDeployment(ak govtypes.AccountKeeper, bk bankkeeper.Keeper
 			msg.Groups = append(msg.Groups, *spec)
 		}
 
-		txGen := simappparams.MakeEncodingConfig().TxConfig
+		txGen := simappparams.MakeTestEncodingConfig().TxConfig
 		tx, err := helpers.GenTx(
 			txGen,
 			[]sdk.Msg{msg},
@@ -145,7 +145,7 @@ func SimulateMsgCreateDeployment(ak govtypes.AccountKeeper, bk bankkeeper.Keeper
 			return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err
 		}
 
-		_, _, err = app.Deliver(tx)
+		_, _, err = app.Deliver(txGen.TxEncoder(), tx)
 		if err != nil {
 			return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to deliver mock tx"), nil, err
 		}
@@ -215,7 +215,7 @@ func SimulateMsgUpdateDeployment(ak govtypes.AccountKeeper, bk bankkeeper.Keeper
 			msg.Groups = append(msg.Groups, *spec)
 		}
 
-		txGen := simappparams.MakeEncodingConfig().TxConfig
+		txGen := simappparams.MakeTestEncodingConfig().TxConfig
 		tx, err := helpers.GenTx(
 			txGen,
 			[]sdk.Msg{msg},
@@ -230,7 +230,7 @@ func SimulateMsgUpdateDeployment(ak govtypes.AccountKeeper, bk bankkeeper.Keeper
 			return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err
 		}
 
-		_, _, err = app.Deliver(tx)
+		_, _, err = app.Deliver(txGen.TxEncoder(), tx)
 		if err != nil {
 			return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to deliver mock tx"), nil, err
 		}
@@ -282,7 +282,7 @@ func SimulateMsgCloseDeployment(ak govtypes.AccountKeeper, bk bankkeeper.Keeper,
 
 		msg := types.NewMsgCloseDeployment(deployment.ID())
 
-		txGen := simappparams.MakeEncodingConfig().TxConfig
+		txGen := simappparams.MakeTestEncodingConfig().TxConfig
 		tx, err := helpers.GenTx(
 			txGen,
 			[]sdk.Msg{msg},
@@ -297,7 +297,7 @@ func SimulateMsgCloseDeployment(ak govtypes.AccountKeeper, bk bankkeeper.Keeper,
 			return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err
 		}
 
-		_, _, err = app.Deliver(tx)
+		_, _, err = app.Deliver(txGen.TxEncoder(), tx)
 		if err != nil {
 			return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to deliver mock tx"), nil, err
 		}
@@ -367,7 +367,7 @@ func SimulateMsgCloseGroup(ak govtypes.AccountKeeper, bk bankkeeper.Keeper, k ke
 			return simtypes.NoOpMsg(types.ModuleName, types.MsgTypeCloseGroup, "msg validation failure"), nil, err
 		}
 
-		txGen := simappparams.MakeEncodingConfig().TxConfig
+		txGen := simappparams.MakeTestEncodingConfig().TxConfig
 		tx, err := helpers.GenTx(
 			txGen,
 			[]sdk.Msg{msg},
@@ -382,7 +382,7 @@ func SimulateMsgCloseGroup(ak govtypes.AccountKeeper, bk bankkeeper.Keeper, k ke
 			return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err
 		}
 
-		_, _, err = app.Deliver(tx)
+		_, _, err = app.Deliver(txGen.TxEncoder(), tx)
 		if err != nil {
 			err = errors.Wrapf(err, "%s: msg delivery error closing group: %v", types.ModuleName, group.ID())
 			return simtypes.NoOpMsg(types.ModuleName, msg.Type(), err.Error()), nil, err
diff --git a/x/deployment/types/codec.go b/x/deployment/types/codec.go
index 1052af01..759f4584 100644
--- a/x/deployment/types/codec.go
+++ b/x/deployment/types/codec.go
@@ -5,6 +5,7 @@ import (
 	cdctypes "github.com/cosmos/cosmos-sdk/codec/types"
 	cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec"
 	sdk "github.com/cosmos/cosmos-sdk/types"
+	"github.com/cosmos/cosmos-sdk/types/msgservice"
 )
 
 var (
@@ -41,4 +42,6 @@ func RegisterInterfaces(registry cdctypes.InterfaceRegistry) {
 		&MsgCloseDeployment{},
 		&MsgCloseGroup{},
 	)
+
+	msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc)
 }
diff --git a/x/deployment/types/deployment.pb.go b/x/deployment/types/deployment.pb.go
index 080860c6..1e80f23a 100644
--- a/x/deployment/types/deployment.pb.go
+++ b/x/deployment/types/deployment.pb.go
@@ -4,9 +4,14 @@
 package types
 
 import (
+	context "context"
 	fmt "fmt"
 	_ "github.com/gogo/protobuf/gogoproto"
+	grpc1 "github.com/gogo/protobuf/grpc"
 	proto "github.com/gogo/protobuf/proto"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
 	io "io"
 	math "math"
 	math_bits "math/bits"
@@ -52,7 +57,7 @@ func (x Deployment_State) String() string {
 }
 
 func (Deployment_State) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_bfe50ba12f1404bf, []int{4, 0}
+	return fileDescriptor_bfe50ba12f1404bf, []int{7, 0}
 }
 
 // MsgCreateDeployment defines an SDK message for creating deployment
@@ -116,6 +121,43 @@ func (m *MsgCreateDeployment) GetVersion() []byte {
 	return nil
 }
 
+// MsgCreateDeploymentResponse defines the Msg/CreateDeployment response type.
+type MsgCreateDeploymentResponse struct {
+}
+
+func (m *MsgCreateDeploymentResponse) Reset()         { *m = MsgCreateDeploymentResponse{} }
+func (m *MsgCreateDeploymentResponse) String() string { return proto.CompactTextString(m) }
+func (*MsgCreateDeploymentResponse) ProtoMessage()    {}
+func (*MsgCreateDeploymentResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_bfe50ba12f1404bf, []int{1}
+}
+func (m *MsgCreateDeploymentResponse) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *MsgCreateDeploymentResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_MsgCreateDeploymentResponse.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalToSizedBuffer(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *MsgCreateDeploymentResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MsgCreateDeploymentResponse.Merge(m, src)
+}
+func (m *MsgCreateDeploymentResponse) XXX_Size() int {
+	return m.Size()
+}
+func (m *MsgCreateDeploymentResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MsgCreateDeploymentResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MsgCreateDeploymentResponse proto.InternalMessageInfo
+
 // MsgUpdateDeployment defines an SDK message for updating deployment
 type MsgUpdateDeployment struct {
 	ID      DeploymentID `protobuf:"bytes,1,opt,name=id,proto3" json:"id" yaml:"id"`
@@ -127,7 +169,7 @@ func (m *MsgUpdateDeployment) Reset()         { *m = MsgUpdateDeployment{} }
 func (m *MsgUpdateDeployment) String() string { return proto.CompactTextString(m) }
 func (*MsgUpdateDeployment) ProtoMessage()    {}
 func (*MsgUpdateDeployment) Descriptor() ([]byte, []int) {
-	return fileDescriptor_bfe50ba12f1404bf, []int{1}
+	return fileDescriptor_bfe50ba12f1404bf, []int{2}
 }
 func (m *MsgUpdateDeployment) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -177,6 +219,43 @@ func (m *MsgUpdateDeployment) GetVersion() []byte {
 	return nil
 }
 
+// MsgUpdateDeploymentResponse defines the Msg/UpdateDeployment response type.
+type MsgUpdateDeploymentResponse struct {
+}
+
+func (m *MsgUpdateDeploymentResponse) Reset()         { *m = MsgUpdateDeploymentResponse{} }
+func (m *MsgUpdateDeploymentResponse) String() string { return proto.CompactTextString(m) }
+func (*MsgUpdateDeploymentResponse) ProtoMessage()    {}
+func (*MsgUpdateDeploymentResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_bfe50ba12f1404bf, []int{3}
+}
+func (m *MsgUpdateDeploymentResponse) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *MsgUpdateDeploymentResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_MsgUpdateDeploymentResponse.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalToSizedBuffer(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *MsgUpdateDeploymentResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MsgUpdateDeploymentResponse.Merge(m, src)
+}
+func (m *MsgUpdateDeploymentResponse) XXX_Size() int {
+	return m.Size()
+}
+func (m *MsgUpdateDeploymentResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MsgUpdateDeploymentResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MsgUpdateDeploymentResponse proto.InternalMessageInfo
+
 // MsgCloseDeployment defines an SDK message for closing deployment
 type MsgCloseDeployment struct {
 	ID DeploymentID `protobuf:"bytes,1,opt,name=id,proto3" json:"id" yaml:"id"`
@@ -186,7 +265,7 @@ func (m *MsgCloseDeployment) Reset()         { *m = MsgCloseDeployment{} }
 func (m *MsgCloseDeployment) String() string { return proto.CompactTextString(m) }
 func (*MsgCloseDeployment) ProtoMessage()    {}
 func (*MsgCloseDeployment) Descriptor() ([]byte, []int) {
-	return fileDescriptor_bfe50ba12f1404bf, []int{2}
+	return fileDescriptor_bfe50ba12f1404bf, []int{4}
 }
 func (m *MsgCloseDeployment) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -222,6 +301,43 @@ func (m *MsgCloseDeployment) GetID() DeploymentID {
 	return DeploymentID{}
 }
 
+// MsgCloseDeploymentResponse defines the Msg/CloseDeployment response type.
+type MsgCloseDeploymentResponse struct {
+}
+
+func (m *MsgCloseDeploymentResponse) Reset()         { *m = MsgCloseDeploymentResponse{} }
+func (m *MsgCloseDeploymentResponse) String() string { return proto.CompactTextString(m) }
+func (*MsgCloseDeploymentResponse) ProtoMessage()    {}
+func (*MsgCloseDeploymentResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_bfe50ba12f1404bf, []int{5}
+}
+func (m *MsgCloseDeploymentResponse) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *MsgCloseDeploymentResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_MsgCloseDeploymentResponse.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalToSizedBuffer(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *MsgCloseDeploymentResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MsgCloseDeploymentResponse.Merge(m, src)
+}
+func (m *MsgCloseDeploymentResponse) XXX_Size() int {
+	return m.Size()
+}
+func (m *MsgCloseDeploymentResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MsgCloseDeploymentResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MsgCloseDeploymentResponse proto.InternalMessageInfo
+
 // DeploymentID stores owner and sequence number
 type DeploymentID struct {
 	Owner string `protobuf:"bytes,1,opt,name=owner,proto3" json:"owner" yaml:"owner"`
@@ -231,7 +347,7 @@ type DeploymentID struct {
 func (m *DeploymentID) Reset()      { *m = DeploymentID{} }
 func (*DeploymentID) ProtoMessage() {}
 func (*DeploymentID) Descriptor() ([]byte, []int) {
-	return fileDescriptor_bfe50ba12f1404bf, []int{3}
+	return fileDescriptor_bfe50ba12f1404bf, []int{6}
 }
 func (m *DeploymentID) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -285,7 +401,7 @@ func (m *Deployment) Reset()         { *m = Deployment{} }
 func (m *Deployment) String() string { return proto.CompactTextString(m) }
 func (*Deployment) ProtoMessage()    {}
 func (*Deployment) Descriptor() ([]byte, []int) {
-	return fileDescriptor_bfe50ba12f1404bf, []int{4}
+	return fileDescriptor_bfe50ba12f1404bf, []int{7}
 }
 func (m *Deployment) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -345,7 +461,7 @@ type DeploymentResponse struct {
 func (m *DeploymentResponse) Reset()      { *m = DeploymentResponse{} }
 func (*DeploymentResponse) ProtoMessage() {}
 func (*DeploymentResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_bfe50ba12f1404bf, []int{5}
+	return fileDescriptor_bfe50ba12f1404bf, []int{8}
 }
 func (m *DeploymentResponse) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -406,7 +522,7 @@ func (m *DeploymentFilters) Reset()         { *m = DeploymentFilters{} }
 func (m *DeploymentFilters) String() string { return proto.CompactTextString(m) }
 func (*DeploymentFilters) ProtoMessage()    {}
 func (*DeploymentFilters) Descriptor() ([]byte, []int) {
-	return fileDescriptor_bfe50ba12f1404bf, []int{6}
+	return fileDescriptor_bfe50ba12f1404bf, []int{9}
 }
 func (m *DeploymentFilters) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -459,8 +575,11 @@ func (m *DeploymentFilters) GetState() string {
 func init() {
 	proto.RegisterEnum("akash.deployment.v1beta1.Deployment_State", Deployment_State_name, Deployment_State_value)
 	proto.RegisterType((*MsgCreateDeployment)(nil), "akash.deployment.v1beta1.MsgCreateDeployment")
+	proto.RegisterType((*MsgCreateDeploymentResponse)(nil), "akash.deployment.v1beta1.MsgCreateDeploymentResponse")
 	proto.RegisterType((*MsgUpdateDeployment)(nil), "akash.deployment.v1beta1.MsgUpdateDeployment")
+	proto.RegisterType((*MsgUpdateDeploymentResponse)(nil), "akash.deployment.v1beta1.MsgUpdateDeploymentResponse")
 	proto.RegisterType((*MsgCloseDeployment)(nil), "akash.deployment.v1beta1.MsgCloseDeployment")
+	proto.RegisterType((*MsgCloseDeploymentResponse)(nil), "akash.deployment.v1beta1.MsgCloseDeploymentResponse")
 	proto.RegisterType((*DeploymentID)(nil), "akash.deployment.v1beta1.DeploymentID")
 	proto.RegisterType((*Deployment)(nil), "akash.deployment.v1beta1.Deployment")
 	proto.RegisterType((*DeploymentResponse)(nil), "akash.deployment.v1beta1.DeploymentResponse")
@@ -472,47 +591,250 @@ func init() {
 }
 
 var fileDescriptor_bfe50ba12f1404bf = []byte{
-	// 637 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x55, 0x31, 0x6f, 0xd3, 0x4e,
-	0x1c, 0xb5, 0x9d, 0xb4, 0xfd, 0xf7, 0x9a, 0x56, 0xe9, 0xfd, 0x2b, 0x14, 0x2c, 0xd5, 0x67, 0x99,
-	0x8a, 0x86, 0x0e, 0xb6, 0xda, 0x0e, 0x48, 0xdd, 0x30, 0x11, 0x28, 0x03, 0x8b, 0xab, 0x4a, 0x08,
-	0x90, 0x90, 0x13, 0x9f, 0x52, 0xab, 0x4e, 0xce, 0xb1, 0xdd, 0x40, 0x18, 0x98, 0xa1, 0x13, 0x23,
-	0x42, 0xaa, 0x14, 0x89, 0x2f, 0xc0, 0xc7, 0xe8, 0xd8, 0x91, 0xe9, 0x84, 0x92, 0x05, 0x79, 0xf4,
-	0x27, 0x40, 0xbe, 0x73, 0x6a, 0x53, 0x11, 0x28, 0x48, 0x74, 0x62, 0xf3, 0xbd, 0x7b, 0xbf, 0xdf,
-	0xf3, 0xef, 0xdd, 0x3b, 0x1d, 0xb8, 0x63, 0x1f, 0xd9, 0xe1, 0xa1, 0xe1, 0x60, 0xdf, 0x23, 0xc3,
-	0x2e, 0xee, 0x45, 0xc6, 0x60, 0xbb, 0x85, 0x23, 0x7b, 0xbb, 0x00, 0xe9, 0x7e, 0x40, 0x22, 0x02,
-	0x6b, 0x8c, 0xaa, 0x17, 0xf0, 0x8c, 0x2a, 0xaf, 0x75, 0x48, 0x87, 0x30, 0x92, 0x91, 0x7e, 0x71,
-	0xbe, 0xbc, 0x31, 0xb3, 0x75, 0x27, 0x20, 0xc7, 0x3e, 0x67, 0x69, 0x6f, 0x25, 0xf0, 0xff, 0xa3,
-	0xb0, 0x73, 0x3f, 0xc0, 0x76, 0x84, 0x1b, 0x17, 0x5c, 0x78, 0x00, 0x24, 0xd7, 0xa9, 0x89, 0xaa,
-	0x58, 0x5f, 0xda, 0xb9, 0xad, 0xcf, 0x92, 0xd6, 0xf3, 0x8a, 0x66, 0xc3, 0x5c, 0x3f, 0xa3, 0x48,
-	0x18, 0x53, 0x24, 0x35, 0x1b, 0x31, 0x45, 0x92, 0xeb, 0x24, 0x14, 0x2d, 0x0e, 0xed, 0xae, 0xb7,
-	0xa7, 0xb9, 0x8e, 0x66, 0x49, 0xae, 0x03, 0x9f, 0x81, 0x79, 0xa6, 0x1e, 0xd6, 0x24, 0xb5, 0x54,
-	0x5f, 0xda, 0xb9, 0x35, 0xbb, 0xf5, 0xc3, 0x94, 0xb7, 0xef, 0xe3, 0xb6, 0x89, 0xd2, 0xbe, 0x31,
-	0x45, 0x59, 0x69, 0x42, 0xd1, 0x32, 0xef, 0xca, 0xd7, 0x9a, 0x95, 0x6d, 0xc0, 0xbb, 0x60, 0x61,
-	0x80, 0x83, 0xd0, 0x25, 0xbd, 0x5a, 0x49, 0x15, 0xeb, 0x15, 0x73, 0x3d, 0xa6, 0x68, 0x0a, 0x25,
-	0x14, 0xad, 0xf0, 0xb2, 0x0c, 0xd0, 0xac, 0xe9, 0xd6, 0x5e, 0xf9, 0xeb, 0x08, 0x09, 0x53, 0x2f,
-	0x0e, 0x7c, 0xe7, 0x9f, 0x17, 0x7d, 0x00, 0xd3, 0x58, 0x78, 0x24, 0xfc, 0xfb, 0x4e, 0x64, 0x92,
-	0xaf, 0x41, 0xa5, 0x58, 0x08, 0x0d, 0x30, 0x47, 0x5e, 0xf4, 0x70, 0xc0, 0xf4, 0x16, 0xcd, 0x9b,
-	0x31, 0x45, 0x1c, 0x48, 0x28, 0xaa, 0xf0, 0x06, 0x6c, 0xa9, 0x59, 0x1c, 0x86, 0xbb, 0xa0, 0xec,
-	0x84, 0xb8, 0x5f, 0x93, 0x54, 0xb1, 0x5e, 0x36, 0xd1, 0x98, 0xa2, 0x72, 0x63, 0x1f, 0xf7, 0x63,
-	0x8a, 0x18, 0x9e, 0x50, 0xb4, 0xc4, 0xcb, 0xd2, 0x95, 0x66, 0x31, 0x70, 0xef, 0xbf, 0xf7, 0x23,
-	0x24, 0x30, 0xfd, 0x0f, 0x25, 0x00, 0x0a, 0xb3, 0x46, 0x60, 0x39, 0x1f, 0xed, 0xf9, 0x6f, 0x8f,
-	0xbd, 0x99, 0x8d, 0xfd, 0xdd, 0x4c, 0x3f, 0x32, 0xa0, 0x92, 0x77, 0x6a, 0x3a, 0xf0, 0x29, 0x98,
-	0x0b, 0x23, 0x3b, 0xc2, 0x6c, 0x88, 0x95, 0x9d, 0xad, 0xab, 0xa8, 0xe9, 0xfb, 0x69, 0x05, 0x37,
-	0x88, 0x15, 0xe7, 0x06, 0xb1, 0xa5, 0x66, 0x71, 0xf8, 0x8f, 0x33, 0xa1, 0xbd, 0x02, 0x73, 0x4c,
-	0x03, 0x6e, 0x82, 0x05, 0xb7, 0x37, 0xb0, 0x3d, 0xd7, 0xa9, 0x0a, 0xb2, 0x7c, 0x72, 0xaa, 0xde,
-	0xc8, 0x7f, 0x83, 0x31, 0x9a, 0x7c, 0x17, 0xaa, 0x60, 0xde, 0x6e, 0x47, 0xee, 0x00, 0x57, 0x45,
-	0x79, 0xed, 0xe4, 0x54, 0xad, 0xe6, 0xbc, 0x7b, 0x0c, 0x4f, 0x19, 0xed, 0x34, 0x5e, 0x4e, 0x55,
-	0xba, 0xcc, 0x60, 0xb1, 0x73, 0xe4, 0xf2, 0x9b, 0x8f, 0x8a, 0x90, 0x85, 0x63, 0x24, 0x01, 0x98,
-	0x13, 0x2c, 0x1c, 0xfa, 0xa4, 0x17, 0x62, 0xd8, 0x05, 0x20, 0xb7, 0x26, 0x3b, 0xa1, 0x8d, 0xab,
-	0x78, 0xc6, 0xcf, 0x27, 0xa6, 0xa8, 0x50, 0x9f, 0x50, 0xb4, 0x9a, 0x05, 0xe4, 0x02, 0xd3, 0xac,
-	0x02, 0x01, 0x3e, 0xbe, 0x74, 0x65, 0xd1, 0x2f, 0xae, 0xec, 0x35, 0x5c, 0xd7, 0x3c, 0xbf, 0x9f,
-	0x44, 0xb0, 0x9a, 0x0f, 0xf8, 0xc0, 0xf5, 0x22, 0x1c, 0x84, 0xd7, 0x73, 0x8b, 0x52, 0x15, 0x1e,
-	0xdb, 0x52, 0xae, 0xf2, 0xb3, 0x28, 0xf2, 0x53, 0x35, 0x1b, 0x67, 0x63, 0x45, 0x3c, 0x1f, 0x2b,
-	0xe2, 0x97, 0xb1, 0x22, 0xbe, 0x9b, 0x28, 0xc2, 0xf9, 0x44, 0x11, 0x3e, 0x4f, 0x14, 0xe1, 0xc9,
-	0x56, 0xc7, 0x8d, 0x0e, 0x8f, 0x5b, 0x7a, 0x9b, 0x74, 0x0d, 0x32, 0x08, 0xda, 0xde, 0x91, 0xc1,
-	0xdf, 0xb3, 0x97, 0xc5, 0x17, 0x2d, 0x1a, 0xfa, 0x38, 0x6c, 0xcd, 0xb3, 0xa7, 0x6c, 0xf7, 0x5b,
-	0x00, 0x00, 0x00, 0xff, 0xff, 0xa1, 0xae, 0xbd, 0xbd, 0x4d, 0x07, 0x00, 0x00,
+	// 738 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x56, 0x4f, 0x4f, 0x13, 0x4f,
+	0x18, 0xde, 0xdd, 0x16, 0xf8, 0xf1, 0x52, 0xf8, 0x95, 0x91, 0x98, 0xba, 0x4a, 0x67, 0xb3, 0x12,
+	0xa9, 0x44, 0xbb, 0xa1, 0x68, 0x4c, 0xb8, 0x59, 0x1b, 0x4d, 0x0f, 0x5c, 0x96, 0x90, 0x18, 0x35,
+	0x31, 0x4b, 0x77, 0x2c, 0x1b, 0xda, 0xee, 0xb2, 0xbb, 0x54, 0xf0, 0xe0, 0x59, 0x39, 0x79, 0x34,
+	0x26, 0x24, 0x24, 0x7e, 0x01, 0x3f, 0x06, 0x47, 0x8e, 0x9c, 0x26, 0xa6, 0x5c, 0x4c, 0x8f, 0xfd,
+	0x04, 0x66, 0x67, 0xb6, 0xdd, 0xa5, 0xa5, 0xfc, 0x31, 0x91, 0x93, 0xb7, 0xce, 0x33, 0xcf, 0xfb,
+	0x3e, 0x33, 0xcf, 0x3e, 0xd3, 0x19, 0xb8, 0x6f, 0x6c, 0x1a, 0xde, 0x86, 0x66, 0x12, 0xa7, 0x66,
+	0xef, 0xd6, 0x49, 0xc3, 0xd7, 0x9a, 0x8b, 0xeb, 0xc4, 0x37, 0x16, 0x63, 0x50, 0xde, 0x71, 0x6d,
+	0xdf, 0x46, 0x19, 0x46, 0xcd, 0xc7, 0xf0, 0x90, 0x2a, 0xcf, 0x54, 0xed, 0xaa, 0xcd, 0x48, 0x5a,
+	0xf0, 0x8b, 0xf3, 0xe5, 0xb9, 0xa1, 0xad, 0xab, 0xae, 0xbd, 0xed, 0x70, 0x96, 0xfa, 0x59, 0x82,
+	0x1b, 0x2b, 0x5e, 0xf5, 0x99, 0x4b, 0x0c, 0x9f, 0x94, 0x7a, 0x5c, 0xb4, 0x06, 0x92, 0x65, 0x66,
+	0x44, 0x45, 0xcc, 0x4d, 0x14, 0xee, 0xe5, 0x87, 0x49, 0xe7, 0xa3, 0x8a, 0x72, 0xa9, 0x38, 0x7b,
+	0x48, 0xb1, 0xd0, 0xa2, 0x58, 0x2a, 0x97, 0xda, 0x14, 0x4b, 0x96, 0xd9, 0xa1, 0x78, 0x7c, 0xd7,
+	0xa8, 0xd7, 0x96, 0x55, 0xcb, 0x54, 0x75, 0xc9, 0x32, 0xd1, 0x1b, 0x18, 0x65, 0xea, 0x5e, 0x46,
+	0x52, 0x12, 0xb9, 0x89, 0xc2, 0xdd, 0xe1, 0xad, 0x5f, 0x04, 0xbc, 0x55, 0x87, 0x54, 0x8a, 0x38,
+	0xe8, 0xdb, 0xa6, 0x38, 0x2c, 0xed, 0x50, 0x3c, 0xc9, 0xbb, 0xf2, 0xb1, 0xaa, 0x87, 0x13, 0xe8,
+	0x09, 0x8c, 0x35, 0x89, 0xeb, 0x59, 0x76, 0x23, 0x93, 0x50, 0xc4, 0x5c, 0xaa, 0x38, 0xdb, 0xa6,
+	0xb8, 0x0b, 0x75, 0x28, 0x9e, 0xe2, 0x65, 0x21, 0xa0, 0xea, 0xdd, 0xa9, 0xe5, 0xe4, 0xaf, 0x03,
+	0x2c, 0xa8, 0xb3, 0x70, 0xfb, 0x0c, 0x2b, 0x74, 0xe2, 0x39, 0x76, 0xc3, 0x23, 0x5d, 0xab, 0xd6,
+	0x1c, 0xf3, 0x9f, 0x55, 0xdc, 0xaa, 0x7e, 0x2b, 0x7a, 0x56, 0x6d, 0x01, 0x0a, 0x9c, 0xac, 0xd9,
+	0xde, 0xdf, 0x37, 0x2a, 0x5c, 0xd1, 0x1d, 0x90, 0x07, 0x25, 0x7b, 0x0b, 0xfa, 0x08, 0xa9, 0x78,
+	0x5b, 0xa4, 0xc1, 0x88, 0xfd, 0xbe, 0x41, 0x5c, 0xb6, 0x9a, 0xf1, 0xe2, 0xad, 0x36, 0xc5, 0x1c,
+	0xe8, 0x50, 0x9c, 0xe2, 0xed, 0xd9, 0x50, 0xd5, 0x39, 0x8c, 0x96, 0x20, 0x69, 0x7a, 0x64, 0x2b,
+	0x23, 0x29, 0x62, 0x2e, 0x59, 0xc4, 0x2d, 0x8a, 0x93, 0xa5, 0x55, 0xb2, 0xd5, 0xa6, 0x98, 0xe1,
+	0x1d, 0x8a, 0x27, 0x78, 0x59, 0x30, 0x52, 0x75, 0x06, 0x2e, 0xff, 0xf7, 0xf5, 0x00, 0x0b, 0x6c,
+	0x75, 0xdf, 0x12, 0x00, 0x31, 0x27, 0x7c, 0x98, 0x8c, 0x36, 0xfe, 0xf6, 0xca, 0xa6, 0xcc, 0x87,
+	0xa6, 0x9c, 0xda, 0xd3, 0x59, 0xf6, 0xa4, 0xa2, 0x4e, 0x65, 0x13, 0xbd, 0x86, 0x11, 0xcf, 0x37,
+	0x7c, 0xc2, 0x36, 0x31, 0x55, 0x58, 0xb8, 0x8c, 0x5a, 0x7e, 0x35, 0xa8, 0xe0, 0x06, 0xb1, 0xe2,
+	0xc8, 0x20, 0x36, 0x54, 0x75, 0x0e, 0xff, 0x71, 0xa0, 0xd4, 0x0f, 0x30, 0xc2, 0x34, 0xd0, 0x3c,
+	0x8c, 0x59, 0x8d, 0xa6, 0x51, 0xb3, 0xcc, 0xb4, 0x20, 0xcb, 0x7b, 0xfb, 0xca, 0xcd, 0x68, 0x19,
+	0x8c, 0x51, 0xe6, 0xb3, 0x48, 0x81, 0x51, 0xa3, 0xe2, 0x5b, 0x4d, 0x92, 0x16, 0xe5, 0x99, 0xbd,
+	0x7d, 0x25, 0x1d, 0xf1, 0x9e, 0x32, 0x3c, 0x60, 0x54, 0x82, 0x24, 0x98, 0x69, 0xa9, 0x9f, 0xc1,
+	0x12, 0x62, 0xca, 0xc9, 0x4f, 0xdf, 0xb3, 0x42, 0x18, 0x9d, 0x03, 0x09, 0xd0, 0x60, 0x66, 0x50,
+	0x1d, 0x20, 0xb2, 0x26, 0xfc, 0x42, 0x73, 0x97, 0xf1, 0x8c, 0x7f, 0x9f, 0x36, 0xc5, 0xb1, 0xfa,
+	0x0e, 0xc5, 0xd3, 0x61, 0x40, 0x7a, 0x98, 0xaa, 0xc7, 0x08, 0xe8, 0x65, 0xdf, 0x79, 0xc7, 0x17,
+	0x9c, 0xf7, 0x6b, 0x38, 0xeb, 0x51, 0x7e, 0x7f, 0x88, 0x30, 0x1d, 0x6d, 0xf0, 0xb9, 0x55, 0xf3,
+	0x89, 0xeb, 0x5d, 0xcf, 0x29, 0x0a, 0x54, 0x78, 0x6c, 0x13, 0x91, 0xca, 0x79, 0x51, 0xe4, 0x5f,
+	0xb5, 0x70, 0x9c, 0x80, 0xc4, 0x8a, 0x57, 0x45, 0x3b, 0x90, 0x1e, 0xb8, 0xdd, 0x1e, 0x0e, 0xf7,
+	0xf6, 0x8c, 0x1b, 0x40, 0x7e, 0x7c, 0x25, 0x7a, 0x2f, 0x40, 0x3b, 0x90, 0x1e, 0xb8, 0x2c, 0xce,
+	0x57, 0xee, 0xa7, 0x5f, 0xa0, 0x3c, 0xec, 0xff, 0x17, 0x6d, 0xc3, 0xff, 0xfd, 0x7f, 0xbe, 0x0f,
+	0xce, 0xdf, 0xc3, 0x69, 0xb6, 0xfc, 0xe8, 0x2a, 0xec, 0x9e, 0xec, 0x3b, 0x00, 0x36, 0xc5, 0xf2,
+	0x89, 0xe6, 0x2f, 0xee, 0xc1, 0x88, 0xb2, 0x76, 0x49, 0x62, 0x57, 0xa7, 0x58, 0x3a, 0x6c, 0x65,
+	0xc5, 0xa3, 0x56, 0x56, 0xfc, 0xd9, 0xca, 0x8a, 0x5f, 0x4e, 0xb2, 0xc2, 0xd1, 0x49, 0x56, 0x38,
+	0x3e, 0xc9, 0x0a, 0xaf, 0x16, 0xaa, 0x96, 0xbf, 0xb1, 0xbd, 0x9e, 0xaf, 0xd8, 0x75, 0xcd, 0x6e,
+	0xba, 0x95, 0xda, 0xa6, 0xc6, 0x9f, 0x41, 0x3b, 0xf1, 0x87, 0x90, 0xbf, 0xeb, 0x10, 0x6f, 0x7d,
+	0x94, 0xbd, 0x80, 0x96, 0x7e, 0x07, 0x00, 0x00, 0xff, 0xff, 0x83, 0x51, 0x5d, 0xf5, 0x84, 0x09,
+	0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConn
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion4
+
+// MsgClient is the client API for Msg service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type MsgClient interface {
+	// CreateDeployment defines a method to create new deployment given proper inputs.
+	CreateDeployment(ctx context.Context, in *MsgCreateDeployment, opts ...grpc.CallOption) (*MsgCreateDeploymentResponse, error)
+	// UpdateDeployment defines a method to update a deployment given proper inputs.
+	UpdateDeployment(ctx context.Context, in *MsgUpdateDeployment, opts ...grpc.CallOption) (*MsgUpdateDeploymentResponse, error)
+	// CloseDeployment defines a method to close a deployment given proper inputs.
+	CloseDeployment(ctx context.Context, in *MsgCloseDeployment, opts ...grpc.CallOption) (*MsgCloseDeploymentResponse, error)
+	// CloseGroup defines a method to close a group of a deployment given proper inputs.
+	CloseGroup(ctx context.Context, in *MsgCloseGroup, opts ...grpc.CallOption) (*MsgCloseGroupResponse, error)
+}
+
+type msgClient struct {
+	cc grpc1.ClientConn
+}
+
+func NewMsgClient(cc grpc1.ClientConn) MsgClient {
+	return &msgClient{cc}
+}
+
+func (c *msgClient) CreateDeployment(ctx context.Context, in *MsgCreateDeployment, opts ...grpc.CallOption) (*MsgCreateDeploymentResponse, error) {
+	out := new(MsgCreateDeploymentResponse)
+	err := c.cc.Invoke(ctx, "/akash.deployment.v1beta1.Msg/CreateDeployment", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *msgClient) UpdateDeployment(ctx context.Context, in *MsgUpdateDeployment, opts ...grpc.CallOption) (*MsgUpdateDeploymentResponse, error) {
+	out := new(MsgUpdateDeploymentResponse)
+	err := c.cc.Invoke(ctx, "/akash.deployment.v1beta1.Msg/UpdateDeployment", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *msgClient) CloseDeployment(ctx context.Context, in *MsgCloseDeployment, opts ...grpc.CallOption) (*MsgCloseDeploymentResponse, error) {
+	out := new(MsgCloseDeploymentResponse)
+	err := c.cc.Invoke(ctx, "/akash.deployment.v1beta1.Msg/CloseDeployment", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *msgClient) CloseGroup(ctx context.Context, in *MsgCloseGroup, opts ...grpc.CallOption) (*MsgCloseGroupResponse, error) {
+	out := new(MsgCloseGroupResponse)
+	err := c.cc.Invoke(ctx, "/akash.deployment.v1beta1.Msg/CloseGroup", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// MsgServer is the server API for Msg service.
+type MsgServer interface {
+	// CreateDeployment defines a method to create new deployment given proper inputs.
+	CreateDeployment(context.Context, *MsgCreateDeployment) (*MsgCreateDeploymentResponse, error)
+	// UpdateDeployment defines a method to update a deployment given proper inputs.
+	UpdateDeployment(context.Context, *MsgUpdateDeployment) (*MsgUpdateDeploymentResponse, error)
+	// CloseDeployment defines a method to close a deployment given proper inputs.
+	CloseDeployment(context.Context, *MsgCloseDeployment) (*MsgCloseDeploymentResponse, error)
+	// CloseGroup defines a method to close a group of a deployment given proper inputs.
+	CloseGroup(context.Context, *MsgCloseGroup) (*MsgCloseGroupResponse, error)
+}
+
+// UnimplementedMsgServer can be embedded to have forward compatible implementations.
+type UnimplementedMsgServer struct {
+}
+
+func (*UnimplementedMsgServer) CreateDeployment(ctx context.Context, req *MsgCreateDeployment) (*MsgCreateDeploymentResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method CreateDeployment not implemented")
+}
+func (*UnimplementedMsgServer) UpdateDeployment(ctx context.Context, req *MsgUpdateDeployment) (*MsgUpdateDeploymentResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method UpdateDeployment not implemented")
+}
+func (*UnimplementedMsgServer) CloseDeployment(ctx context.Context, req *MsgCloseDeployment) (*MsgCloseDeploymentResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method CloseDeployment not implemented")
+}
+func (*UnimplementedMsgServer) CloseGroup(ctx context.Context, req *MsgCloseGroup) (*MsgCloseGroupResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method CloseGroup not implemented")
+}
+
+func RegisterMsgServer(s grpc1.Server, srv MsgServer) {
+	s.RegisterService(&_Msg_serviceDesc, srv)
+}
+
+func _Msg_CreateDeployment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MsgCreateDeployment)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MsgServer).CreateDeployment(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/akash.deployment.v1beta1.Msg/CreateDeployment",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MsgServer).CreateDeployment(ctx, req.(*MsgCreateDeployment))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _Msg_UpdateDeployment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MsgUpdateDeployment)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MsgServer).UpdateDeployment(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/akash.deployment.v1beta1.Msg/UpdateDeployment",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MsgServer).UpdateDeployment(ctx, req.(*MsgUpdateDeployment))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _Msg_CloseDeployment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MsgCloseDeployment)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MsgServer).CloseDeployment(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/akash.deployment.v1beta1.Msg/CloseDeployment",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MsgServer).CloseDeployment(ctx, req.(*MsgCloseDeployment))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _Msg_CloseGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MsgCloseGroup)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MsgServer).CloseGroup(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/akash.deployment.v1beta1.Msg/CloseGroup",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MsgServer).CloseGroup(ctx, req.(*MsgCloseGroup))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _Msg_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "akash.deployment.v1beta1.Msg",
+	HandlerType: (*MsgServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "CreateDeployment",
+			Handler:    _Msg_CreateDeployment_Handler,
+		},
+		{
+			MethodName: "UpdateDeployment",
+			Handler:    _Msg_UpdateDeployment_Handler,
+		},
+		{
+			MethodName: "CloseDeployment",
+			Handler:    _Msg_CloseDeployment_Handler,
+		},
+		{
+			MethodName: "CloseGroup",
+			Handler:    _Msg_CloseGroup_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "akash/deployment/v1beta1/deployment.proto",
 }
 
 func (m *MsgCreateDeployment) Marshal() (dAtA []byte, err error) {
@@ -569,6 +891,29 @@ func (m *MsgCreateDeployment) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	return len(dAtA) - i, nil
 }
 
+func (m *MsgCreateDeploymentResponse) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalToSizedBuffer(dAtA[:size])
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *MsgCreateDeploymentResponse) MarshalTo(dAtA []byte) (int, error) {
+	size := m.Size()
+	return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *MsgCreateDeploymentResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+	i := len(dAtA)
+	_ = i
+	var l int
+	_ = l
+	return len(dAtA) - i, nil
+}
+
 func (m *MsgUpdateDeployment) Marshal() (dAtA []byte, err error) {
 	size := m.Size()
 	dAtA = make([]byte, size)
@@ -623,6 +968,29 @@ func (m *MsgUpdateDeployment) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	return len(dAtA) - i, nil
 }
 
+func (m *MsgUpdateDeploymentResponse) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalToSizedBuffer(dAtA[:size])
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *MsgUpdateDeploymentResponse) MarshalTo(dAtA []byte) (int, error) {
+	size := m.Size()
+	return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *MsgUpdateDeploymentResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+	i := len(dAtA)
+	_ = i
+	var l int
+	_ = l
+	return len(dAtA) - i, nil
+}
+
 func (m *MsgCloseDeployment) Marshal() (dAtA []byte, err error) {
 	size := m.Size()
 	dAtA = make([]byte, size)
@@ -656,6 +1024,29 @@ func (m *MsgCloseDeployment) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	return len(dAtA) - i, nil
 }
 
+func (m *MsgCloseDeploymentResponse) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalToSizedBuffer(dAtA[:size])
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *MsgCloseDeploymentResponse) MarshalTo(dAtA []byte) (int, error) {
+	size := m.Size()
+	return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *MsgCloseDeploymentResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+	i := len(dAtA)
+	_ = i
+	var l int
+	_ = l
+	return len(dAtA) - i, nil
+}
+
 func (m *DeploymentID) Marshal() (dAtA []byte, err error) {
 	size := m.Size()
 	dAtA = make([]byte, size)
@@ -864,6 +1255,15 @@ func (m *MsgCreateDeployment) Size() (n int) {
 	return n
 }
 
+func (m *MsgCreateDeploymentResponse) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	return n
+}
+
 func (m *MsgUpdateDeployment) Size() (n int) {
 	if m == nil {
 		return 0
@@ -885,6 +1285,15 @@ func (m *MsgUpdateDeployment) Size() (n int) {
 	return n
 }
 
+func (m *MsgUpdateDeploymentResponse) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	return n
+}
+
 func (m *MsgCloseDeployment) Size() (n int) {
 	if m == nil {
 		return 0
@@ -896,6 +1305,15 @@ func (m *MsgCloseDeployment) Size() (n int) {
 	return n
 }
 
+func (m *MsgCloseDeploymentResponse) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	return n
+}
+
 func (m *DeploymentID) Size() (n int) {
 	if m == nil {
 		return 0
@@ -1131,6 +1549,59 @@ func (m *MsgCreateDeployment) Unmarshal(dAtA []byte) error {
 	}
 	return nil
 }
+func (m *MsgCreateDeploymentResponse) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowDeployment
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: MsgCreateDeploymentResponse: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: MsgCreateDeploymentResponse: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		default:
+			iNdEx = preIndex
+			skippy, err := skipDeployment(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthDeployment
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthDeployment
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
 func (m *MsgUpdateDeployment) Unmarshal(dAtA []byte) error {
 	l := len(dAtA)
 	iNdEx := 0
@@ -1285,6 +1756,59 @@ func (m *MsgUpdateDeployment) Unmarshal(dAtA []byte) error {
 	}
 	return nil
 }
+func (m *MsgUpdateDeploymentResponse) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowDeployment
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: MsgUpdateDeploymentResponse: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: MsgUpdateDeploymentResponse: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		default:
+			iNdEx = preIndex
+			skippy, err := skipDeployment(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthDeployment
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthDeployment
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
 func (m *MsgCloseDeployment) Unmarshal(dAtA []byte) error {
 	l := len(dAtA)
 	iNdEx := 0
@@ -1371,6 +1895,59 @@ func (m *MsgCloseDeployment) Unmarshal(dAtA []byte) error {
 	}
 	return nil
 }
+func (m *MsgCloseDeploymentResponse) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowDeployment
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: MsgCloseDeploymentResponse: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: MsgCloseDeploymentResponse: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		default:
+			iNdEx = preIndex
+			skippy, err := skipDeployment(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthDeployment
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthDeployment
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
 func (m *DeploymentID) Unmarshal(dAtA []byte) error {
 	l := len(dAtA)
 	iNdEx := 0
diff --git a/x/deployment/types/group.pb.go b/x/deployment/types/group.pb.go
index 4ef0444e..17fbf212 100644
--- a/x/deployment/types/group.pb.go
+++ b/x/deployment/types/group.pb.go
@@ -66,7 +66,7 @@ func (x Group_State) String() string {
 }
 
 func (Group_State) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_92581ef27257da99, []int{3, 0}
+	return fileDescriptor_92581ef27257da99, []int{4, 0}
 }
 
 // MsgCloseGroup defines SDK message to close a single Group within a Deployment.
@@ -114,6 +114,43 @@ func (m *MsgCloseGroup) GetID() GroupID {
 	return GroupID{}
 }
 
+// MsgCloseGroupResponse defines the Msg/CloseGroup response type.
+type MsgCloseGroupResponse struct {
+}
+
+func (m *MsgCloseGroupResponse) Reset()         { *m = MsgCloseGroupResponse{} }
+func (m *MsgCloseGroupResponse) String() string { return proto.CompactTextString(m) }
+func (*MsgCloseGroupResponse) ProtoMessage()    {}
+func (*MsgCloseGroupResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_92581ef27257da99, []int{1}
+}
+func (m *MsgCloseGroupResponse) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *MsgCloseGroupResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_MsgCloseGroupResponse.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalToSizedBuffer(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *MsgCloseGroupResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MsgCloseGroupResponse.Merge(m, src)
+}
+func (m *MsgCloseGroupResponse) XXX_Size() int {
+	return m.Size()
+}
+func (m *MsgCloseGroupResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MsgCloseGroupResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MsgCloseGroupResponse proto.InternalMessageInfo
+
 // GroupID stores owner, deployment sequence number and group sequence number
 type GroupID struct {
 	Owner string `protobuf:"bytes,1,opt,name=owner,proto3" json:"owner" yaml:"owner"`
@@ -124,7 +161,7 @@ type GroupID struct {
 func (m *GroupID) Reset()      { *m = GroupID{} }
 func (*GroupID) ProtoMessage() {}
 func (*GroupID) Descriptor() ([]byte, []int) {
-	return fileDescriptor_92581ef27257da99, []int{1}
+	return fileDescriptor_92581ef27257da99, []int{2}
 }
 func (m *GroupID) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -186,7 +223,7 @@ func (m *GroupSpec) Reset()         { *m = GroupSpec{} }
 func (m *GroupSpec) String() string { return proto.CompactTextString(m) }
 func (*GroupSpec) ProtoMessage()    {}
 func (*GroupSpec) Descriptor() ([]byte, []int) {
-	return fileDescriptor_92581ef27257da99, []int{2}
+	return fileDescriptor_92581ef27257da99, []int{3}
 }
 func (m *GroupSpec) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -226,7 +263,7 @@ func (m *Group) Reset()         { *m = Group{} }
 func (m *Group) String() string { return proto.CompactTextString(m) }
 func (*Group) ProtoMessage()    {}
 func (*Group) Descriptor() ([]byte, []int) {
-	return fileDescriptor_92581ef27257da99, []int{3}
+	return fileDescriptor_92581ef27257da99, []int{4}
 }
 func (m *Group) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -287,7 +324,7 @@ func (m *Resource) Reset()         { *m = Resource{} }
 func (m *Resource) String() string { return proto.CompactTextString(m) }
 func (*Resource) ProtoMessage()    {}
 func (*Resource) Descriptor() ([]byte, []int) {
-	return fileDescriptor_92581ef27257da99, []int{4}
+	return fileDescriptor_92581ef27257da99, []int{5}
 }
 func (m *Resource) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -340,6 +377,7 @@ func (m *Resource) GetPrice() types1.Coin {
 func init() {
 	proto.RegisterEnum("akash.deployment.v1beta1.Group_State", Group_State_name, Group_State_value)
 	proto.RegisterType((*MsgCloseGroup)(nil), "akash.deployment.v1beta1.MsgCloseGroup")
+	proto.RegisterType((*MsgCloseGroupResponse)(nil), "akash.deployment.v1beta1.MsgCloseGroupResponse")
 	proto.RegisterType((*GroupID)(nil), "akash.deployment.v1beta1.GroupID")
 	proto.RegisterType((*GroupSpec)(nil), "akash.deployment.v1beta1.GroupSpec")
 	proto.RegisterType((*Group)(nil), "akash.deployment.v1beta1.Group")
@@ -351,62 +389,63 @@ func init() {
 }
 
 var fileDescriptor_92581ef27257da99 = []byte{
-	// 873 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x55, 0xcf, 0x8f, 0xdb, 0x44,
-	0x14, 0x8e, 0x13, 0xa7, 0xbb, 0x99, 0xec, 0x82, 0x19, 0x7e, 0x34, 0xeb, 0x6a, 0x33, 0xee, 0x40,
-	0xa5, 0x88, 0xaa, 0x89, 0x9a, 0xde, 0xf6, 0x86, 0x1b, 0xb1, 0xda, 0x43, 0x29, 0xf2, 0x0a, 0x0e,
-	0x08, 0x29, 0x38, 0x9e, 0x59, 0xef, 0xa8, 0x89, 0xc7, 0x6b, 0x8f, 0x17, 0xf6, 0xce, 0xa1, 0xca,
-	0x09, 0x71, 0xe2, 0x12, 0xa9, 0x12, 0x77, 0xfe, 0x8e, 0x1e, 0x7b, 0x84, 0x8b, 0x85, 0xb2, 0x17,
-	0x94, 0x0b, 0x52, 0xfe, 0x02, 0x34, 0x33, 0x76, 0x9d, 0x40, 0xab, 0x15, 0xa7, 0xe4, 0x7d, 0xef,
-	0xfb, 0xde, 0x3c, 0xbf, 0xf7, 0x79, 0x0c, 0x3e, 0xf1, 0x9f, 0xf9, 0xe9, 0xf9, 0x80, 0xd0, 0x78,
-	0xca, 0xaf, 0x66, 0x34, 0x12, 0x83, 0xcb, 0x87, 0x13, 0x2a, 0xfc, 0x87, 0x83, 0x30, 0xe1, 0x59,
-	0xdc, 0x8f, 0x13, 0x2e, 0x38, 0xec, 0x28, 0x56, 0xbf, 0x62, 0xf5, 0x0b, 0x96, 0xfd, 0x41, 0xc8,
-	0x43, 0xae, 0x48, 0x03, 0xf9, 0x4f, 0xf3, 0xed, 0xbb, 0xba, 0xea, 0xc4, 0x4f, 0xe9, 0xeb, 0x7a,
-	0x09, 0x4d, 0x79, 0x96, 0x04, 0xb4, 0xa0, 0xe0, 0x37, 0x50, 0x7c, 0x21, 0x12, 0x36, 0xc9, 0x44,
-	0xc9, 0xe9, 0x06, 0x3c, 0x9d, 0xf1, 0x74, 0x9b, 0x14, 0x70, 0x16, 0xe9, 0x3c, 0x0e, 0xc1, 0xfe,
-	0x93, 0x34, 0x7c, 0x3c, 0xe5, 0x29, 0x3d, 0x96, 0xdd, 0xc2, 0x2f, 0x41, 0x9d, 0x91, 0x8e, 0xe1,
-	0x18, 0xbd, 0xf6, 0xf0, 0x6e, 0xff, 0x6d, 0x4d, 0xf7, 0x15, 0xf9, 0x64, 0xe4, 0x1e, 0xbe, 0xcc,
-	0x51, 0x6d, 0x99, 0xa3, 0xfa, 0xc9, 0x68, 0x95, 0xa3, 0x3a, 0x23, 0xeb, 0x1c, 0xb5, 0xae, 0xfc,
-	0xd9, 0xf4, 0x08, 0x33, 0x82, 0xbd, 0x3a, 0x23, 0x47, 0xe6, 0x5f, 0x2f, 0x50, 0x0d, 0xff, 0x66,
-	0x80, 0x9d, 0x42, 0x04, 0x07, 0xa0, 0xc9, 0xbf, 0x8f, 0x68, 0xa2, 0x8e, 0x69, 0xb9, 0x07, 0xab,
-	0x1c, 0x69, 0x60, 0x9d, 0xa3, 0x3d, 0x2d, 0x56, 0x21, 0xf6, 0x34, 0x0c, 0x1f, 0x01, 0x93, 0xa4,
-	0xf4, 0xa2, 0x53, 0x77, 0x8c, 0x9e, 0xe9, 0xa2, 0x65, 0x8e, 0xcc, 0xd1, 0x29, 0xbd, 0x58, 0xe5,
-	0x48, 0xe1, 0xeb, 0x1c, 0xb5, 0xb5, 0x4c, 0x46, 0xd8, 0x53, 0xa0, 0x14, 0x85, 0x52, 0xd4, 0x70,
-	0x8c, 0xde, 0xbe, 0x16, 0x1d, 0x17, 0xa2, 0x70, 0x4b, 0x14, 0x6a, 0x91, 0xfc, 0x39, 0xda, 0xfd,
-	0xe5, 0x05, 0xaa, 0xa9, 0x86, 0x7f, 0x6e, 0x80, 0x96, 0x6a, 0xf8, 0x34, 0xa6, 0x01, 0xbc, 0x0f,
-	0xcc, 0xc8, 0x9f, 0xd1, 0xa2, 0xe3, 0xdb, 0xb2, 0x88, 0x8c, 0xab, 0x22, 0x32, 0xc2, 0x9e, 0x02,
-	0x61, 0x04, 0xf6, 0x12, 0x7a, 0x91, 0xb1, 0x84, 0xca, 0x99, 0xa5, 0x9d, 0xba, 0xd3, 0xe8, 0xb5,
-	0x87, 0x87, 0xc5, 0x34, 0xe5, 0x2a, 0x5e, 0xcf, 0xf1, 0xb3, 0x72, 0x5f, 0xee, 0x7d, 0x39, 0xc9,
-	0x55, 0x8e, 0xb6, 0xa4, 0xeb, 0x1c, 0xbd, 0xaf, 0xeb, 0x6f, 0xa2, 0xd8, 0xdb, 0x22, 0xc1, 0x10,
-	0xb4, 0x4a, 0x6b, 0xa4, 0x9d, 0x86, 0x3a, 0x0c, 0xbf, 0x7d, 0x75, 0x5e, 0x41, 0x75, 0xef, 0x15,
-	0x27, 0x56, 0xe2, 0x75, 0x8e, 0xac, 0xf2, 0xb8, 0x02, 0xc2, 0x5e, 0x95, 0x86, 0x19, 0x80, 0x3c,
-	0x21, 0x34, 0x19, 0x4f, 0x18, 0x19, 0x93, 0x2c, 0xf1, 0x05, 0xe3, 0x51, 0xc7, 0x74, 0x8c, 0x5e,
-	0xc3, 0x3d, 0x5e, 0xe6, 0xc8, 0x7a, 0x2a, 0xb3, 0x2e, 0x23, 0xa3, 0x22, 0xb7, 0xca, 0x91, 0x56,
-	0x3c, 0x98, 0x30, 0xf2, 0xa0, 0x54, 0xac, 0x73, 0x74, 0x50, 0xac, 0xf9, 0x3f, 0x39, 0xec, 0x59,
-	0xfc, 0x5f, 0x45, 0x8e, 0x76, 0x9f, 0x97, 0x4b, 0xf9, 0xd1, 0x04, 0x4d, 0xed, 0xd3, 0xef, 0xc0,
-	0xae, 0x7a, 0xbd, 0xc6, 0xff, 0xc7, 0xad, 0xb8, 0x70, 0x6b, 0xe9, 0xc4, 0x37, 0x59, 0x76, 0x47,
-	0x95, 0x3d, 0x21, 0xf0, 0x6b, 0xd0, 0x4c, 0x85, 0x2f, 0xa8, 0x72, 0xdd, 0x3b, 0xc3, 0x7b, 0x37,
-	0x94, 0xef, 0x9f, 0x4a, 0xb2, 0x36, 0xb3, 0xd2, 0x55, 0x66, 0x56, 0x21, 0xf6, 0x34, 0x0c, 0xc7,
-	0x00, 0xe8, 0xce, 0xd3, 0x98, 0x06, 0xca, 0x9d, 0xed, 0xe1, 0xc7, 0x37, 0x14, 0x97, 0x1e, 0x74,
-	0xef, 0x14, 0xfb, 0x32, 0xa5, 0xb0, 0x72, 0x9e, 0x8c, 0xb0, 0xd7, 0x0a, 0x4b, 0x1e, 0xfe, 0xc3,
-	0x00, 0x4d, 0xd5, 0x0c, 0xc4, 0x60, 0x87, 0x45, 0x97, 0xfe, 0x94, 0x11, 0xab, 0x66, 0x7f, 0x38,
-	0x5f, 0x38, 0xef, 0xe9, 0x6a, 0x32, 0x79, 0xa2, 0x13, 0xf0, 0x36, 0x30, 0x79, 0x4c, 0x23, 0xcb,
-	0xb0, 0xf7, 0xe7, 0x0b, 0x47, 0x5b, 0xfe, 0x69, 0x4c, 0x23, 0x78, 0x08, 0x76, 0xd4, 0x26, 0x28,
-	0xb1, 0xea, 0xb6, 0x35, 0x5f, 0x38, 0x7b, 0x3a, 0xa7, 0x31, 0x99, 0x9e, 0xf9, 0x22, 0x38, 0xa7,
-	0xc4, 0x6a, 0x6c, 0xa4, 0x9f, 0x68, 0x0c, 0x0e, 0x01, 0x64, 0x51, 0x9a, 0x9d, 0x9d, 0xb1, 0x80,
-	0xd1, 0x48, 0x8c, 0xcf, 0xb2, 0x88, 0xa4, 0x96, 0x69, 0xdb, 0xf3, 0x85, 0xf3, 0x91, 0x1e, 0xff,
-	0x46, 0xfa, 0x73, 0x99, 0x85, 0x77, 0xc0, 0xad, 0x40, 0xde, 0x44, 0xc4, 0x6a, 0xda, 0xef, 0xce,
-	0x17, 0x4e, 0x5b, 0xf1, 0xd4, 0xe5, 0x44, 0x6c, 0xf3, 0xf9, 0xaf, 0xdd, 0x5a, 0x71, 0x99, 0xfc,
-	0x6d, 0x80, 0xdd, 0xd2, 0xc6, 0xf0, 0xdb, 0x4d, 0xf7, 0x6f, 0x5b, 0x61, 0xeb, 0x55, 0x2b, 0x05,
-	0x5f, 0x45, 0x4c, 0xa4, 0xd5, 0x30, 0xb3, 0x88, 0x89, 0x6a, 0x98, 0x32, 0xda, 0xb2, 0xfc, 0x00,
-	0x34, 0x03, 0x9e, 0x45, 0x42, 0xb9, 0x60, 0x5f, 0xaf, 0x57, 0x01, 0xd5, 0x7a, 0x55, 0x88, 0x3d,
-	0x0d, 0xc3, 0x2f, 0x40, 0x33, 0x4e, 0x58, 0x40, 0x8b, 0xcd, 0x1e, 0xf4, 0xf5, 0x0d, 0xbc, 0xdd,
-	0xcb, 0x63, 0xce, 0x22, 0x7d, 0x77, 0xca, 0x7a, 0x8a, 0x5f, 0xd5, 0x53, 0x21, 0xf6, 0x34, 0xac,
-	0x9f, 0xd8, 0x1d, 0xbd, 0x5c, 0x76, 0x8d, 0x57, 0xcb, 0xae, 0xf1, 0xe7, 0xb2, 0x6b, 0xfc, 0x74,
-	0xdd, 0xad, 0xbd, 0xba, 0xee, 0xd6, 0x7e, 0xbf, 0xee, 0xd6, 0xbe, 0xf9, 0x34, 0x64, 0xe2, 0x3c,
-	0x9b, 0xf4, 0x03, 0x3e, 0x1b, 0xf0, 0xcb, 0x24, 0x98, 0x3e, 0x1b, 0xe8, 0xef, 0xc2, 0x0f, 0x9b,
-	0x9f, 0x24, 0x71, 0x15, 0xd3, 0x74, 0x72, 0x4b, 0x5d, 0xfa, 0x8f, 0xfe, 0x09, 0x00, 0x00, 0xff,
-	0xff, 0xed, 0x4c, 0x8e, 0x60, 0xb3, 0x06, 0x00, 0x00,
+	// 886 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x55, 0xc1, 0x8f, 0xdb, 0xc4,
+	0x17, 0x8e, 0x13, 0xa7, 0xbb, 0x99, 0xec, 0xfe, 0x7e, 0x66, 0xa0, 0x6c, 0x36, 0xd5, 0x66, 0xdc,
+	0x81, 0x4a, 0x11, 0x55, 0x13, 0x35, 0xbd, 0xed, 0x0d, 0x37, 0x62, 0xb5, 0x87, 0x52, 0xe4, 0x15,
+	0x1c, 0x10, 0x52, 0x70, 0x3c, 0xb3, 0xde, 0x51, 0x13, 0x8f, 0xd7, 0x63, 0x2f, 0xec, 0x9d, 0x43,
+	0x95, 0x13, 0xe2, 0xc4, 0x25, 0x52, 0x25, 0xee, 0xfc, 0x1d, 0x3d, 0xf6, 0x08, 0x17, 0x0b, 0x65,
+	0x2f, 0x28, 0x17, 0xa4, 0xfc, 0x05, 0x68, 0x66, 0xec, 0x3a, 0x86, 0x56, 0x15, 0xa7, 0xe4, 0xbd,
+	0xf7, 0x7d, 0xdf, 0x3c, 0xbf, 0xf7, 0x79, 0x0c, 0x3e, 0xf6, 0x9e, 0x79, 0xe2, 0x62, 0x48, 0x68,
+	0x34, 0xe3, 0xd7, 0x73, 0x1a, 0x26, 0xc3, 0xab, 0x87, 0x53, 0x9a, 0x78, 0x0f, 0x87, 0x41, 0xcc,
+	0xd3, 0x68, 0x10, 0xc5, 0x3c, 0xe1, 0xb0, 0xa3, 0x50, 0x83, 0x12, 0x35, 0xc8, 0x51, 0xdd, 0x0f,
+	0x02, 0x1e, 0x70, 0x05, 0x1a, 0xca, 0x7f, 0x1a, 0xdf, 0xbd, 0xab, 0x55, 0xa7, 0x9e, 0xa0, 0xaf,
+	0xf5, 0x62, 0x2a, 0x78, 0x1a, 0xfb, 0x34, 0x87, 0xe0, 0x37, 0x40, 0xbc, 0x24, 0x89, 0xd9, 0x34,
+	0x4d, 0x0a, 0x4c, 0xcf, 0xe7, 0x62, 0xce, 0x45, 0x15, 0xe4, 0x73, 0x16, 0xea, 0x3a, 0x0e, 0xc0,
+	0xfe, 0x13, 0x11, 0x3c, 0x9e, 0x71, 0x41, 0x4f, 0x64, 0xb7, 0xf0, 0x0b, 0x50, 0x67, 0xa4, 0x63,
+	0xd8, 0x46, 0xbf, 0x3d, 0xba, 0x3b, 0x78, 0x5b, 0xd3, 0x03, 0x05, 0x3e, 0x1d, 0x3b, 0x47, 0x2f,
+	0x33, 0x54, 0x5b, 0x65, 0xa8, 0x7e, 0x3a, 0x5e, 0x67, 0xa8, 0xce, 0xc8, 0x26, 0x43, 0xad, 0x6b,
+	0x6f, 0x3e, 0x3b, 0xc6, 0x8c, 0x60, 0xb7, 0xce, 0xc8, 0xb1, 0xf9, 0xe7, 0x0b, 0x54, 0xc3, 0x07,
+	0xe0, 0x76, 0xe5, 0x20, 0x97, 0x8a, 0x88, 0x87, 0x82, 0xe2, 0x5f, 0x0d, 0xb0, 0x93, 0xab, 0xc1,
+	0x21, 0x68, 0xf2, 0xef, 0x42, 0x1a, 0xab, 0xf3, 0x5b, 0xce, 0xe1, 0x3a, 0x43, 0x3a, 0xb1, 0xc9,
+	0xd0, 0x9e, 0x56, 0x55, 0x21, 0x76, 0x75, 0x1a, 0x3e, 0x02, 0x26, 0x11, 0xf4, 0xb2, 0x53, 0xb7,
+	0x8d, 0xbe, 0xe9, 0xa0, 0x55, 0x86, 0xcc, 0xf1, 0x19, 0xbd, 0x5c, 0x67, 0x48, 0xe5, 0x37, 0x19,
+	0x6a, 0x6b, 0x9a, 0x8c, 0xb0, 0xab, 0x92, 0x92, 0x14, 0x48, 0x52, 0xc3, 0x36, 0xfa, 0xfb, 0x9a,
+	0x74, 0x92, 0x93, 0x82, 0x0a, 0x29, 0xd0, 0x24, 0xf9, 0x73, 0xbc, 0xfb, 0xf3, 0x0b, 0x54, 0x53,
+	0x4f, 0xf2, 0x53, 0x03, 0xb4, 0x54, 0xc3, 0x67, 0x11, 0xf5, 0xe1, 0x7d, 0x60, 0x86, 0xde, 0x9c,
+	0xe6, 0x1d, 0x1f, 0x48, 0x11, 0x19, 0x97, 0x22, 0x32, 0xc2, 0xae, 0x4a, 0xc2, 0x10, 0xec, 0xc5,
+	0xf4, 0x32, 0x65, 0x31, 0x95, 0xc3, 0x14, 0x9d, 0xba, 0xdd, 0xe8, 0xb7, 0x47, 0x47, 0xf9, 0x98,
+	0xe5, 0x8e, 0x5e, 0x0f, 0xf8, 0xd3, 0x62, 0x91, 0xce, 0x7d, 0x39, 0xe2, 0x75, 0x86, 0x2a, 0xd4,
+	0x4d, 0x86, 0xde, 0xd7, 0xfa, 0xdb, 0x59, 0xec, 0x56, 0x40, 0x30, 0x00, 0xad, 0xc2, 0x33, 0xa2,
+	0xd3, 0x50, 0x87, 0xe1, 0xb7, 0xef, 0xd4, 0xcd, 0xa1, 0xce, 0xbd, 0xfc, 0xc4, 0x92, 0xbc, 0xc9,
+	0x90, 0x55, 0x1c, 0x97, 0xa7, 0xb0, 0x5b, 0x96, 0x61, 0x0a, 0x20, 0x8f, 0x09, 0x8d, 0x27, 0x53,
+	0x46, 0x26, 0x24, 0x8d, 0xbd, 0x84, 0xf1, 0xb0, 0x63, 0xda, 0x46, 0xbf, 0xe1, 0x9c, 0xac, 0x32,
+	0x64, 0x3d, 0x95, 0x55, 0x87, 0x91, 0x71, 0x5e, 0x5b, 0x67, 0x48, 0x33, 0x1e, 0x4c, 0x19, 0x79,
+	0x50, 0x30, 0x36, 0x19, 0x3a, 0xcc, 0xd7, 0xfc, 0xaf, 0x1a, 0x76, 0x2d, 0xfe, 0x0f, 0x91, 0xe3,
+	0xdd, 0xe7, 0xc5, 0x52, 0x7e, 0x30, 0x41, 0x53, 0x1b, 0xf8, 0x5b, 0xb0, 0xab, 0xde, 0xbb, 0xc9,
+	0x7f, 0xb1, 0x31, 0xce, 0x6d, 0x5c, 0x38, 0xf1, 0x4d, 0x5e, 0xde, 0x51, 0xb2, 0xa7, 0x04, 0x7e,
+	0x05, 0x9a, 0x22, 0xf1, 0x12, 0xaa, 0x5c, 0xf7, 0xbf, 0xd1, 0xbd, 0x77, 0xc8, 0x0f, 0xce, 0x24,
+	0x58, 0x9b, 0x59, 0xf1, 0x4a, 0x33, 0xab, 0x10, 0xbb, 0x3a, 0x0d, 0x27, 0x00, 0xe8, 0xce, 0x45,
+	0x44, 0x7d, 0xe5, 0xce, 0xf6, 0xe8, 0xa3, 0x77, 0x88, 0x4b, 0x0f, 0x3a, 0x77, 0xf2, 0x7d, 0x99,
+	0x92, 0x58, 0x3a, 0x4f, 0x46, 0xd8, 0x6d, 0x05, 0x05, 0x0e, 0xff, 0x6e, 0x80, 0xa6, 0x6a, 0x06,
+	0x62, 0xb0, 0xc3, 0xc2, 0x2b, 0x6f, 0xc6, 0x88, 0x55, 0xeb, 0xde, 0x5e, 0x2c, 0xed, 0xf7, 0xb4,
+	0x9a, 0x2c, 0x9e, 0xea, 0x02, 0x3c, 0x00, 0x26, 0x8f, 0x68, 0x68, 0x19, 0xdd, 0xfd, 0xc5, 0xd2,
+	0xd6, 0x96, 0x7f, 0x1a, 0xd1, 0x10, 0x1e, 0x81, 0x1d, 0xb5, 0x09, 0x4a, 0xac, 0x7a, 0xd7, 0x5a,
+	0x2c, 0xed, 0x3d, 0x5d, 0xd3, 0x39, 0x59, 0x9e, 0x7b, 0x89, 0x7f, 0x41, 0x89, 0xd5, 0xd8, 0x2a,
+	0x3f, 0xd1, 0x39, 0x38, 0x02, 0x90, 0x85, 0x22, 0x3d, 0x3f, 0x67, 0x3e, 0xa3, 0x61, 0x32, 0x39,
+	0x4f, 0x43, 0x22, 0x2c, 0xb3, 0xdb, 0x5d, 0x2c, 0xed, 0x0f, 0xf5, 0xf8, 0xb7, 0xca, 0x9f, 0xc9,
+	0x2a, 0xbc, 0x03, 0x6e, 0xf9, 0xf2, 0xe6, 0x20, 0x56, 0xb3, 0xfb, 0xff, 0xc5, 0xd2, 0x6e, 0x2b,
+	0x9c, 0xba, 0x4c, 0x48, 0xd7, 0x7c, 0xfe, 0x4b, 0xaf, 0x96, 0xdf, 0x32, 0x7f, 0x19, 0x60, 0xb7,
+	0xb0, 0x31, 0xfc, 0x66, 0xdb, 0xfd, 0x55, 0x2b, 0x54, 0x5e, 0xb5, 0x82, 0xf0, 0x65, 0xc8, 0x12,
+	0x51, 0x0e, 0x33, 0x0d, 0x59, 0x52, 0x0e, 0x53, 0x46, 0x15, 0xcb, 0x0f, 0x41, 0xd3, 0xe7, 0x69,
+	0x98, 0x28, 0x17, 0xec, 0xeb, 0xf5, 0xaa, 0x44, 0xb9, 0x5e, 0x15, 0x62, 0x57, 0xa7, 0xe1, 0xe7,
+	0xa0, 0x19, 0xc5, 0xcc, 0xa7, 0xf9, 0x66, 0x0f, 0x07, 0xfa, 0x6a, 0xae, 0xf6, 0xf2, 0x98, 0xb3,
+	0x50, 0x5f, 0xaa, 0x52, 0x4f, 0xe1, 0x4b, 0x3d, 0x15, 0x62, 0x57, 0xa7, 0xf5, 0x13, 0x3b, 0xe3,
+	0x97, 0xab, 0x9e, 0xf1, 0x6a, 0xd5, 0x33, 0xfe, 0x58, 0xf5, 0x8c, 0x1f, 0x6f, 0x7a, 0xb5, 0x57,
+	0x37, 0xbd, 0xda, 0x6f, 0x37, 0xbd, 0xda, 0xd7, 0x9f, 0x04, 0x2c, 0xb9, 0x48, 0xa7, 0x03, 0x9f,
+	0xcf, 0x87, 0xfc, 0x2a, 0xf6, 0x67, 0xcf, 0x86, 0xfa, 0x83, 0xf1, 0xfd, 0xf6, 0xb7, 0x2a, 0xb9,
+	0x8e, 0xa8, 0x98, 0xde, 0x52, 0x5f, 0x83, 0x47, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x43, 0xff,
+	0xcb, 0xc0, 0xcc, 0x06, 0x00, 0x00,
 }
 
 func (m *MsgCloseGroup) Marshal() (dAtA []byte, err error) {
@@ -442,6 +481,29 @@ func (m *MsgCloseGroup) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	return len(dAtA) - i, nil
 }
 
+func (m *MsgCloseGroupResponse) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalToSizedBuffer(dAtA[:size])
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *MsgCloseGroupResponse) MarshalTo(dAtA []byte) (int, error) {
+	size := m.Size()
+	return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *MsgCloseGroupResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+	i := len(dAtA)
+	_ = i
+	var l int
+	_ = l
+	return len(dAtA) - i, nil
+}
+
 func (m *GroupID) Marshal() (dAtA []byte, err error) {
 	size := m.Size()
 	dAtA = make([]byte, size)
@@ -663,6 +725,15 @@ func (m *MsgCloseGroup) Size() (n int) {
 	return n
 }
 
+func (m *MsgCloseGroupResponse) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	return n
+}
+
 func (m *GroupID) Size() (n int) {
 	if m == nil {
 		return 0
@@ -834,6 +905,59 @@ func (m *MsgCloseGroup) Unmarshal(dAtA []byte) error {
 	}
 	return nil
 }
+func (m *MsgCloseGroupResponse) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowGroup
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: MsgCloseGroupResponse: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: MsgCloseGroupResponse: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		default:
+			iNdEx = preIndex
+			skippy, err := skipGroup(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthGroup
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthGroup
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
 func (m *GroupID) Unmarshal(dAtA []byte) error {
 	l := len(dAtA)
 	iNdEx := 0
diff --git a/x/market/handler/handler.go b/x/market/handler/handler.go
index b012d2e6..05c06fdc 100644
--- a/x/market/handler/handler.go
+++ b/x/market/handler/handler.go
@@ -5,122 +5,28 @@ import (
 	sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
 
 	"github.com/ovrclk/akash/x/market/types"
-	ptypes "github.com/ovrclk/akash/x/provider/types"
 )
 
 // NewHandler returns a handler for "market" type messages
 func NewHandler(keepers Keepers) sdk.Handler {
+	ms := NewMsgServerImpl(keepers)
+
 	return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) {
 		switch msg := msg.(type) {
 		case *types.MsgCreateBid:
-			return handleMsgCreateBid(ctx, keepers, msg)
+			res, err := ms.CreateBid(sdk.WrapSDKContext(ctx), msg)
+			return sdk.WrapServiceResult(ctx, res, err)
+
 		case *types.MsgCloseBid:
-			return handleMsgCloseBid(ctx, keepers, msg)
+			res, err := ms.CloseBid(sdk.WrapSDKContext(ctx), msg)
+			return sdk.WrapServiceResult(ctx, res, err)
+
 		case *types.MsgCloseOrder:
-			return handleMsgCloseOrder(ctx, keepers, msg)
+			res, err := ms.CloseOrder(sdk.WrapSDKContext(ctx), msg)
+			return sdk.WrapServiceResult(ctx, res, err)
+
 		default:
 			return nil, sdkerrors.ErrUnknownRequest
 		}
 	}
 }
-
-func handleMsgCreateBid(ctx sdk.Context, keepers Keepers, msg *types.MsgCreateBid) (*sdk.Result, error) {
-	order, found := keepers.Market.GetOrder(ctx, msg.Order)
-	if !found {
-		return nil, types.ErrInvalidOrder
-	}
-
-	if err := order.ValidateCanBid(); err != nil {
-		return nil, err
-	}
-
-	if !msg.Price.IsValid() {
-		return nil, types.ErrBidInvalidPrice
-	}
-
-	if order.Price().IsLT(msg.Price) {
-		return nil, types.ErrBidOverOrder
-	}
-
-	provider, err := sdk.AccAddressFromBech32(msg.Provider)
-	if err != nil {
-		return nil, types.ErrEmptyProvider
-	}
-
-	var prov ptypes.Provider
-	if prov, found = keepers.Provider.Get(ctx, provider); !found {
-		return nil, types.ErrEmptyProvider
-	}
-
-	if !order.MatchAttributes(prov.Attributes) {
-		return nil, types.ErrAttributeMismatch
-	}
-
-	if _, err := keepers.Market.CreateBid(ctx, msg.Order, provider, msg.Price); err != nil {
-		return nil, err
-	}
-
-	return &sdk.Result{
-		Events: ctx.EventManager().ABCIEvents(),
-	}, nil
-}
-
-func handleMsgCloseBid(ctx sdk.Context, keepers Keepers, msg *types.MsgCloseBid) (*sdk.Result, error) {
-	bid, found := keepers.Market.GetBid(ctx, msg.BidID)
-	if !found {
-		return nil, types.ErrUnknownBid
-	}
-
-	order, found := keepers.Market.GetOrder(ctx, msg.BidID.OrderID())
-	if !found {
-		return nil, types.ErrUnknownOrderForBid
-	}
-
-	if bid.State == types.BidOpen {
-		keepers.Market.OnBidClosed(ctx, bid)
-		return &sdk.Result{
-			Events: ctx.EventManager().ABCIEvents(),
-		}, nil
-	}
-
-	lease, found := keepers.Market.GetLease(ctx, types.LeaseID(msg.BidID))
-	if !found {
-		return nil, types.ErrUnknownLeaseForBid
-	}
-
-	if lease.State != types.LeaseActive {
-		return nil, types.ErrLeaseNotActive
-	}
-
-	if bid.State != types.BidMatched {
-		return nil, types.ErrBidNotMatched
-	}
-
-	keepers.Market.OnBidClosed(ctx, bid)
-	keepers.Market.OnLeaseClosed(ctx, lease)
-	keepers.Market.OnOrderClosed(ctx, order)
-	keepers.Deployment.OnLeaseClosed(ctx, order.ID().GroupID())
-
-	return &sdk.Result{
-		Events: ctx.EventManager().ABCIEvents(),
-	}, nil
-}
-
-func handleMsgCloseOrder(ctx sdk.Context, keepers Keepers, msg *types.MsgCloseOrder) (*sdk.Result, error) {
-	order, found := keepers.Market.GetOrder(ctx, msg.OrderID)
-	if !found {
-		return nil, types.ErrUnknownOrder
-	}
-
-	lease, found := keepers.Market.LeaseForOrder(ctx, order.ID())
-	if !found {
-		return nil, types.ErrNoLeaseForOrder
-	}
-
-	keepers.Market.OnOrderClosed(ctx, order)
-	keepers.Market.OnLeaseClosed(ctx, lease)
-	keepers.Deployment.OnLeaseClosed(ctx, order.ID().GroupID())
-	return &sdk.Result{
-		Events: ctx.EventManager().ABCIEvents(),
-	}, nil
-}
diff --git a/x/market/handler/msg_server.go b/x/market/handler/msg_server.go
new file mode 100644
index 00000000..7cecb7aa
--- /dev/null
+++ b/x/market/handler/msg_server.go
@@ -0,0 +1,122 @@
+package handler
+
+import (
+	"context"
+
+	sdk "github.com/cosmos/cosmos-sdk/types"
+
+	"github.com/ovrclk/akash/x/market/types"
+	ptypes "github.com/ovrclk/akash/x/provider/types"
+)
+
+type msgServer struct {
+	keepers Keepers
+}
+
+// NewMsgServerImpl returns an implementation of the market MsgServer interface
+// for the provided Keeper.
+func NewMsgServerImpl(k Keepers) types.MsgServer {
+	return &msgServer{keepers: k}
+}
+
+var _ types.MsgServer = msgServer{}
+
+func (ms msgServer) CreateBid(goCtx context.Context, msg *types.MsgCreateBid) (*types.MsgCreateBidResponse, error) {
+	ctx := sdk.UnwrapSDKContext(goCtx)
+
+	order, found := ms.keepers.Market.GetOrder(ctx, msg.Order)
+	if !found {
+		return nil, types.ErrInvalidOrder
+	}
+
+	if err := order.ValidateCanBid(); err != nil {
+		return nil, err
+	}
+
+	if !msg.Price.IsValid() {
+		return nil, types.ErrBidInvalidPrice
+	}
+
+	if order.Price().IsLT(msg.Price) {
+		return nil, types.ErrBidOverOrder
+	}
+
+	provider, err := sdk.AccAddressFromBech32(msg.Provider)
+	if err != nil {
+		return nil, types.ErrEmptyProvider
+	}
+
+	var prov ptypes.Provider
+	if prov, found = ms.keepers.Provider.Get(ctx, provider); !found {
+		return nil, types.ErrEmptyProvider
+	}
+
+	if !order.MatchAttributes(prov.Attributes) {
+		return nil, types.ErrAttributeMismatch
+	}
+
+	if _, err := ms.keepers.Market.CreateBid(ctx, msg.Order, provider, msg.Price); err != nil {
+		return nil, err
+	}
+
+	return &types.MsgCreateBidResponse{}, nil
+}
+
+func (ms msgServer) CloseBid(goCtx context.Context, msg *types.MsgCloseBid) (*types.MsgCloseBidResponse, error) {
+	ctx := sdk.UnwrapSDKContext(goCtx)
+
+	bid, found := ms.keepers.Market.GetBid(ctx, msg.BidID)
+	if !found {
+		return nil, types.ErrUnknownBid
+	}
+
+	order, found := ms.keepers.Market.GetOrder(ctx, msg.BidID.OrderID())
+	if !found {
+		return nil, types.ErrUnknownOrderForBid
+	}
+
+	if bid.State == types.BidOpen {
+		ms.keepers.Market.OnBidClosed(ctx, bid)
+		return &types.MsgCloseBidResponse{}, nil
+	}
+
+	lease, found := ms.keepers.Market.GetLease(ctx, types.LeaseID(msg.BidID))
+	if !found {
+		return nil, types.ErrUnknownLeaseForBid
+	}
+
+	if lease.State != types.LeaseActive {
+		return nil, types.ErrLeaseNotActive
+	}
+
+	if bid.State != types.BidMatched {
+		return nil, types.ErrBidNotMatched
+	}
+
+	ms.keepers.Market.OnBidClosed(ctx, bid)
+	ms.keepers.Market.OnLeaseClosed(ctx, lease)
+	ms.keepers.Market.OnOrderClosed(ctx, order)
+	ms.keepers.Deployment.OnLeaseClosed(ctx, order.ID().GroupID())
+
+	return &types.MsgCloseBidResponse{}, nil
+}
+
+func (ms msgServer) CloseOrder(goCtx context.Context, msg *types.MsgCloseOrder) (*types.MsgCloseOrderResponse, error) {
+	ctx := sdk.UnwrapSDKContext(goCtx)
+
+	order, found := ms.keepers.Market.GetOrder(ctx, msg.OrderID)
+	if !found {
+		return nil, types.ErrUnknownOrder
+	}
+
+	lease, found := ms.keepers.Market.LeaseForOrder(ctx, order.ID())
+	if !found {
+		return nil, types.ErrNoLeaseForOrder
+	}
+
+	ms.keepers.Market.OnOrderClosed(ctx, order)
+	ms.keepers.Market.OnLeaseClosed(ctx, lease)
+	ms.keepers.Deployment.OnLeaseClosed(ctx, order.ID().GroupID())
+
+	return &types.MsgCloseOrderResponse{}, nil
+}
diff --git a/x/market/module.go b/x/market/module.go
index f9a1ba72..a03839cd 100644
--- a/x/market/module.go
+++ b/x/market/module.go
@@ -11,7 +11,6 @@ import (
 	cdctypes "github.com/cosmos/cosmos-sdk/codec/types"
 	"github.com/cosmos/cosmos-sdk/types/module"
 	bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"
-	"github.com/gogo/protobuf/grpc"
 	"github.com/gorilla/mux"
 	"github.com/grpc-ecosystem/grpc-gateway/runtime"
 	"github.com/ovrclk/akash/x/market/client/cli"
@@ -76,8 +75,8 @@ func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Rout
 	rest.RegisterRoutes(clientCtx, rtr, StoreKey)
 }
 
-// RegisterGRPCRoutes registers the gRPC Gateway routes for the market module.
-func (AppModuleBasic) RegisterGRPCRoutes(clientCtx client.Context, mux *runtime.ServeMux) {
+// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the market module.
+func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) {
 	err := types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx))
 	if err != nil {
 		panic(fmt.Sprintf("couldn't register market grpc routes: %s", err.Error()))
@@ -147,11 +146,11 @@ func (am AppModule) LegacyQuerierHandler(legacyQuerierCdc *codec.LegacyAmino) sd
 	return query.NewQuerier(am.keepers.Market, legacyQuerierCdc)
 }
 
-// RegisterQueryService registers a GRPC query service to respond to the
-// module-specific GRPC queries.
-func (am AppModule) RegisterQueryService(server grpc.Server) {
+// RegisterServices registers the module's services
+func (am AppModule) RegisterServices(cfg module.Configurator) {
+	types.RegisterMsgServer(cfg.MsgServer(), handler.NewMsgServerImpl(am.keepers))
 	querier := keeper.Querier{Keeper: am.keepers.Market}
-	types.RegisterQueryServer(server, querier)
+	types.RegisterQueryServer(cfg.QueryServer(), querier)
 }
 
 // BeginBlock performs no-op
diff --git a/x/market/simulation/operations.go b/x/market/simulation/operations.go
index 56e80145..2bb0b406 100644
--- a/x/market/simulation/operations.go
+++ b/x/market/simulation/operations.go
@@ -118,7 +118,7 @@ func SimulateMsgCreateBid(ak govtypes.AccountKeeper, ks keepers.Keepers) simtype
 
 		msg := types.NewMsgCreateBid(order.OrderID, simAccount.Address, order.Price())
 
-		txGen := simappparams.MakeEncodingConfig().TxConfig
+		txGen := simappparams.MakeTestEncodingConfig().TxConfig
 		tx, err := helpers.GenTx(
 			txGen,
 			[]sdk.Msg{msg},
@@ -133,7 +133,7 @@ func SimulateMsgCreateBid(ak govtypes.AccountKeeper, ks keepers.Keepers) simtype
 			return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err
 		}
 
-		_, _, err = app.Deliver(tx)
+		_, _, err = app.Deliver(txGen.TxEncoder(), tx)
 		switch {
 		case err == nil:
 			return simtypes.NewOperationMsg(msg, true, ""), nil, nil
@@ -192,7 +192,7 @@ func SimulateMsgCloseBid(ak govtypes.AccountKeeper, ks keepers.Keepers) simtypes
 
 		msg := types.NewMsgCloseBid(bid.BidID)
 
-		txGen := simappparams.MakeEncodingConfig().TxConfig
+		txGen := simappparams.MakeTestEncodingConfig().TxConfig
 		tx, err := helpers.GenTx(
 			txGen,
 			[]sdk.Msg{msg},
@@ -207,7 +207,7 @@ func SimulateMsgCloseBid(ak govtypes.AccountKeeper, ks keepers.Keepers) simtypes
 			return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err
 		}
 
-		_, _, err = app.Deliver(tx)
+		_, _, err = app.Deliver(txGen.TxEncoder(), tx)
 		if err != nil {
 			return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to deliver tx"), nil, err
 		}
@@ -250,7 +250,7 @@ func SimulateMsgCloseOrder(ak govtypes.AccountKeeper, ks keepers.Keepers) simtyp
 
 		msg := types.NewMsgCloseOrder(order.OrderID)
 
-		txGen := simappparams.MakeEncodingConfig().TxConfig
+		txGen := simappparams.MakeTestEncodingConfig().TxConfig
 		tx, err := helpers.GenTx(
 			txGen,
 			[]sdk.Msg{msg},
@@ -265,7 +265,7 @@ func SimulateMsgCloseOrder(ak govtypes.AccountKeeper, ks keepers.Keepers) simtyp
 			return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err
 		}
 
-		_, _, err = app.Deliver(tx)
+		_, _, err = app.Deliver(txGen.TxEncoder(), tx)
 		if err != nil {
 			return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to deliver tx"), nil, err
 		}
diff --git a/x/market/types/bid.pb.go b/x/market/types/bid.pb.go
index 5dec0d34..e1063d02 100644
--- a/x/market/types/bid.pb.go
+++ b/x/market/types/bid.pb.go
@@ -4,10 +4,15 @@
 package types
 
 import (
+	context "context"
 	fmt "fmt"
 	types "github.com/cosmos/cosmos-sdk/types"
 	_ "github.com/gogo/protobuf/gogoproto"
+	grpc1 "github.com/gogo/protobuf/grpc"
 	proto "github.com/gogo/protobuf/proto"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
 	io "io"
 	math "math"
 	math_bits "math/bits"
@@ -61,7 +66,7 @@ func (x Bid_State) String() string {
 }
 
 func (Bid_State) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_057fd80e533b030c, []int{3, 0}
+	return fileDescriptor_057fd80e533b030c, []int{5, 0}
 }
 
 // MsgCreateBid defines an SDK message for creating Bid
@@ -125,6 +130,43 @@ func (m *MsgCreateBid) GetPrice() types.Coin {
 	return types.Coin{}
 }
 
+// MsgCreateBidResponse defines the Msg/CreateBid response type.
+type MsgCreateBidResponse struct {
+}
+
+func (m *MsgCreateBidResponse) Reset()         { *m = MsgCreateBidResponse{} }
+func (m *MsgCreateBidResponse) String() string { return proto.CompactTextString(m) }
+func (*MsgCreateBidResponse) ProtoMessage()    {}
+func (*MsgCreateBidResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_057fd80e533b030c, []int{1}
+}
+func (m *MsgCreateBidResponse) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *MsgCreateBidResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_MsgCreateBidResponse.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalToSizedBuffer(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *MsgCreateBidResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MsgCreateBidResponse.Merge(m, src)
+}
+func (m *MsgCreateBidResponse) XXX_Size() int {
+	return m.Size()
+}
+func (m *MsgCreateBidResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MsgCreateBidResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MsgCreateBidResponse proto.InternalMessageInfo
+
 // MsgCloseBid defines an SDK message for closing bid
 type MsgCloseBid struct {
 	BidID BidID `protobuf:"bytes,1,opt,name=bid_id,json=bidId,proto3" json:"id" yaml:"id"`
@@ -134,7 +176,7 @@ func (m *MsgCloseBid) Reset()         { *m = MsgCloseBid{} }
 func (m *MsgCloseBid) String() string { return proto.CompactTextString(m) }
 func (*MsgCloseBid) ProtoMessage()    {}
 func (*MsgCloseBid) Descriptor() ([]byte, []int) {
-	return fileDescriptor_057fd80e533b030c, []int{1}
+	return fileDescriptor_057fd80e533b030c, []int{2}
 }
 func (m *MsgCloseBid) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -170,6 +212,43 @@ func (m *MsgCloseBid) GetBidID() BidID {
 	return BidID{}
 }
 
+// MsgCloseBidResponse defines the Msg/CloseBid response type.
+type MsgCloseBidResponse struct {
+}
+
+func (m *MsgCloseBidResponse) Reset()         { *m = MsgCloseBidResponse{} }
+func (m *MsgCloseBidResponse) String() string { return proto.CompactTextString(m) }
+func (*MsgCloseBidResponse) ProtoMessage()    {}
+func (*MsgCloseBidResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_057fd80e533b030c, []int{3}
+}
+func (m *MsgCloseBidResponse) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *MsgCloseBidResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_MsgCloseBidResponse.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalToSizedBuffer(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *MsgCloseBidResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MsgCloseBidResponse.Merge(m, src)
+}
+func (m *MsgCloseBidResponse) XXX_Size() int {
+	return m.Size()
+}
+func (m *MsgCloseBidResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MsgCloseBidResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MsgCloseBidResponse proto.InternalMessageInfo
+
 // BidID stores owner and all other seq numbers
 // A successful bid becomes a Lease(ID).
 type BidID struct {
@@ -183,7 +262,7 @@ type BidID struct {
 func (m *BidID) Reset()      { *m = BidID{} }
 func (*BidID) ProtoMessage() {}
 func (*BidID) Descriptor() ([]byte, []int) {
-	return fileDescriptor_057fd80e533b030c, []int{2}
+	return fileDescriptor_057fd80e533b030c, []int{4}
 }
 func (m *BidID) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -257,7 +336,7 @@ type Bid struct {
 func (m *Bid) Reset()      { *m = Bid{} }
 func (*Bid) ProtoMessage() {}
 func (*Bid) Descriptor() ([]byte, []int) {
-	return fileDescriptor_057fd80e533b030c, []int{3}
+	return fileDescriptor_057fd80e533b030c, []int{5}
 }
 func (m *Bid) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -321,7 +400,7 @@ func (m *BidFilters) Reset()         { *m = BidFilters{} }
 func (m *BidFilters) String() string { return proto.CompactTextString(m) }
 func (*BidFilters) ProtoMessage()    {}
 func (*BidFilters) Descriptor() ([]byte, []int) {
-	return fileDescriptor_057fd80e533b030c, []int{4}
+	return fileDescriptor_057fd80e533b030c, []int{6}
 }
 func (m *BidFilters) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -395,7 +474,9 @@ func (m *BidFilters) GetState() string {
 func init() {
 	proto.RegisterEnum("akash.market.v1beta1.Bid_State", Bid_State_name, Bid_State_value)
 	proto.RegisterType((*MsgCreateBid)(nil), "akash.market.v1beta1.MsgCreateBid")
+	proto.RegisterType((*MsgCreateBidResponse)(nil), "akash.market.v1beta1.MsgCreateBidResponse")
 	proto.RegisterType((*MsgCloseBid)(nil), "akash.market.v1beta1.MsgCloseBid")
+	proto.RegisterType((*MsgCloseBidResponse)(nil), "akash.market.v1beta1.MsgCloseBidResponse")
 	proto.RegisterType((*BidID)(nil), "akash.market.v1beta1.BidID")
 	proto.RegisterType((*Bid)(nil), "akash.market.v1beta1.Bid")
 	proto.RegisterType((*BidFilters)(nil), "akash.market.v1beta1.BidFilters")
@@ -404,49 +485,213 @@ func init() {
 func init() { proto.RegisterFile("akash/market/v1beta1/bid.proto", fileDescriptor_057fd80e533b030c) }
 
 var fileDescriptor_057fd80e533b030c = []byte{
-	// 672 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x94, 0xbf, 0x6f, 0xd3, 0x40,
-	0x14, 0xc7, 0xed, 0xc4, 0x4e, 0x9b, 0x4b, 0x7f, 0x44, 0xa6, 0x48, 0xad, 0xab, 0xfa, 0x2c, 0x0f,
-	0x55, 0x27, 0x5b, 0x6d, 0xb7, 0xb2, 0xa0, 0x6b, 0x05, 0x8a, 0x44, 0x29, 0x4a, 0x99, 0x60, 0x40,
-	0xb6, 0xef, 0xe4, 0x9e, 0x9a, 0xe4, 0x52, 0xfb, 0x08, 0xf4, 0x3f, 0x40, 0x99, 0x58, 0x90, 0x58,
-	0x02, 0x95, 0xf8, 0x67, 0x3a, 0x76, 0x64, 0xb2, 0x50, 0xba, 0xa0, 0x8c, 0xf9, 0x03, 0x10, 0xba,
-	0x3b, 0x27, 0x69, 0xa5, 0x82, 0x84, 0x04, 0x1b, 0x93, 0xf3, 0xbe, 0xef, 0x7d, 0xee, 0xde, 0x8f,
-	0xcb, 0x03, 0x4e, 0x78, 0x1a, 0x66, 0x27, 0x41, 0x3b, 0x4c, 0x4f, 0x09, 0x0f, 0x7a, 0xdb, 0x11,
-	0xe1, 0xe1, 0x76, 0x10, 0x51, 0xec, 0x77, 0x53, 0xc6, 0x99, 0xb5, 0x22, 0xfd, 0xbe, 0xf2, 0xfb,
-	0x85, 0xdf, 0x5e, 0x49, 0x58, 0xc2, 0x64, 0x40, 0x20, 0x7e, 0xa9, 0x58, 0xdb, 0xbd, 0xf3, 0x2c,
-	0x96, 0x62, 0x92, 0x16, 0x11, 0x4e, 0xcc, 0xb2, 0x36, 0xcb, 0x82, 0x28, 0xcc, 0xc8, 0x34, 0x20,
-	0x66, 0xb4, 0xa3, 0xfc, 0xde, 0x0f, 0x1d, 0x2c, 0x1c, 0x66, 0xc9, 0x7e, 0x4a, 0x42, 0x4e, 0x10,
-	0xc5, 0xd6, 0x4b, 0x60, 0x4a, 0x7e, 0x55, 0x77, 0xf5, 0xad, 0xda, 0xce, 0x86, 0x7f, 0x57, 0x3a,
-	0xfe, 0x91, 0x08, 0x69, 0x1c, 0xa0, 0xcd, 0xcb, 0x1c, 0x6a, 0xc3, 0x1c, 0x9a, 0x52, 0x18, 0xe5,
-	0x50, 0xc1, 0xe3, 0x1c, 0x2e, 0x9c, 0x87, 0xed, 0xd6, 0x9e, 0x27, 0x4d, 0xaf, 0xa9, 0x64, 0xeb,
-	0x01, 0x98, 0xef, 0xa6, 0xac, 0x47, 0xc5, 0xf9, 0x25, 0x57, 0xdf, 0xaa, 0x22, 0x38, 0xca, 0xe1,
-	0x54, 0x1b, 0xe7, 0x70, 0x59, 0x61, 0x13, 0xc5, 0x6b, 0x4e, 0x9d, 0xd6, 0x53, 0x60, 0x76, 0x53,
-	0x1a, 0x93, 0xd5, 0xb2, 0xcc, 0x6c, 0xcd, 0x57, 0xa5, 0xf9, 0xa2, 0xb4, 0x69, 0x62, 0xfb, 0x8c,
-	0x76, 0xd0, 0x86, 0xc8, 0x4a, 0x24, 0x23, 0xe3, 0x67, 0xc9, 0x48, 0xd3, 0x6b, 0x2a, 0x79, 0xcf,
-	0xf8, 0x7e, 0x01, 0x35, 0x8f, 0x82, 0x9a, 0xa8, 0xbf, 0xc5, 0x32, 0x59, 0xfe, 0x73, 0x50, 0x89,
-	0x28, 0x7e, 0x45, 0x71, 0x51, 0xff, 0xfa, 0xdd, 0xf5, 0x23, 0x8a, 0x1b, 0x07, 0xc8, 0x9d, 0x54,
-	0x2f, 0xcd, 0x51, 0x0e, 0x4b, 0x14, 0x8f, 0x73, 0x58, 0x55, 0xb7, 0x51, 0xec, 0x35, 0xcd, 0x88,
-	0xe2, 0x06, 0x2e, 0xae, 0xfa, 0x54, 0x02, 0x2a, 0xd2, 0x0a, 0x80, 0xc9, 0xde, 0x74, 0x8a, 0x26,
-	0x57, 0xd1, 0x9a, 0x6c, 0x9c, 0x10, 0x6e, 0x34, 0x4e, 0x98, 0xa2, 0x71, 0xe2, 0x6b, 0xed, 0x02,
-	0x03, 0x67, 0xe4, 0x4c, 0x36, 0xcd, 0x40, 0x70, 0x98, 0x43, 0xe3, 0xe0, 0x98, 0x9c, 0x8d, 0x72,
-	0x28, 0xf5, 0x71, 0x0e, 0x6b, 0x0a, 0x13, 0x96, 0xd7, 0x94, 0xa2, 0x80, 0x12, 0x01, 0x89, 0x7e,
-	0x2d, 0x2a, 0xe8, 0x71, 0x01, 0x25, 0xb7, 0xa0, 0x44, 0x41, 0x49, 0x01, 0x31, 0x01, 0x19, 0x33,
-	0xe8, 0xa8, 0x80, 0xd8, 0x2d, 0x88, 0x29, 0x48, 0x7c, 0x6e, 0xcd, 0xd5, 0xfc, 0xc3, 0xb9, 0xee,
-	0xcd, 0x7f, 0xbc, 0x80, 0x9a, 0x6c, 0xd0, 0xe7, 0x32, 0x28, 0xff, 0xb3, 0x21, 0x58, 0xcf, 0x80,
-	0x99, 0xf1, 0x90, 0x13, 0xd9, 0xc4, 0xa5, 0x1d, 0xf8, 0xcb, 0x43, 0xfd, 0x63, 0x11, 0xa6, 0xa6,
-	0x22, 0x89, 0xd9, 0x54, 0xa4, 0xe9, 0x35, 0x95, 0xfc, 0xb7, 0x5f, 0xa4, 0xf7, 0x41, 0x07, 0xa6,
-	0xbc, 0xdb, 0x72, 0xc1, 0x1c, 0xed, 0xf4, 0xc2, 0x16, 0xc5, 0x75, 0xcd, 0xbe, 0xd7, 0x1f, 0xb8,
-	0xcb, 0x88, 0x62, 0xe9, 0x6a, 0x28, 0xd9, 0xba, 0x0f, 0x0c, 0xd6, 0x25, 0x9d, 0xba, 0x6e, 0xd7,
-	0xfa, 0x03, 0x77, 0x0e, 0x51, 0x7c, 0xd4, 0x25, 0x1d, 0x6b, 0x1d, 0xcc, 0xb5, 0x43, 0x1e, 0x9f,
-	0x10, 0x5c, 0x2f, 0xd9, 0x4b, 0xfd, 0x81, 0x0b, 0x10, 0xc5, 0x87, 0x4a, 0x11, 0x4c, 0x8b, 0x65,
-	0xbc, 0x5e, 0x9e, 0x32, 0x4f, 0x58, 0xc6, 0xad, 0x35, 0x50, 0x89, 0xc5, 0xfb, 0xc7, 0x75, 0xc3,
-	0x5e, 0xec, 0x0f, 0xdc, 0x2a, 0xa2, 0x58, 0xfe, 0x21, 0xb0, 0x6d, 0xbc, 0xfb, 0xe2, 0x68, 0x37,
-	0x26, 0x74, 0x55, 0x02, 0xe2, 0xc0, 0x47, 0xb4, 0xc5, 0x49, 0x9a, 0xfd, 0x7f, 0xc7, 0x37, 0xf7,
-	0x53, 0x30, 0x79, 0x5f, 0x95, 0x59, 0x33, 0x7e, 0xf7, 0x7c, 0xd4, 0x56, 0x40, 0x0f, 0x2f, 0x87,
-	0x8e, 0x7e, 0x35, 0x74, 0xf4, 0x6f, 0x43, 0x47, 0x7f, 0x7f, 0xed, 0x68, 0x57, 0xd7, 0x8e, 0xf6,
-	0xf5, 0xda, 0xd1, 0x5e, 0x6c, 0x26, 0x94, 0x9f, 0xbc, 0x8e, 0xfc, 0x98, 0xb5, 0x03, 0xd6, 0x4b,
-	0xe3, 0xd6, 0x69, 0xa0, 0xf6, 0xfd, 0xdb, 0xc9, 0xc6, 0xe7, 0xe7, 0x5d, 0x92, 0x45, 0x15, 0xb9,
-	0xca, 0x77, 0x7f, 0x06, 0x00, 0x00, 0xff, 0xff, 0x33, 0x30, 0xee, 0x93, 0x5a, 0x06, 0x00, 0x00,
+	// 758 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x55, 0x4f, 0x6f, 0xd3, 0x4e,
+	0x10, 0xb5, 0x13, 0x3b, 0x6d, 0x36, 0xfd, 0x13, 0xb9, 0xed, 0x4f, 0xad, 0xab, 0x7a, 0xfd, 0x33,
+	0x52, 0x55, 0x40, 0xb2, 0xd5, 0xf6, 0x56, 0x2e, 0xc8, 0xad, 0x40, 0x91, 0x28, 0x45, 0x29, 0x07,
+	0x44, 0x25, 0x90, 0x93, 0x5d, 0xb9, 0xab, 0x26, 0xd9, 0xd4, 0x36, 0x81, 0x7e, 0x03, 0x94, 0x13,
+	0x17, 0x24, 0x0e, 0x04, 0x2a, 0xf1, 0x65, 0x7a, 0xec, 0x91, 0x93, 0x85, 0xd2, 0x0b, 0xca, 0x31,
+	0x1f, 0x00, 0xa1, 0xdd, 0x75, 0x9c, 0x54, 0x4a, 0x5b, 0x90, 0xe0, 0xc6, 0x29, 0x99, 0x37, 0xef,
+	0x8d, 0x67, 0xdf, 0x8e, 0x66, 0x81, 0xe1, 0x1d, 0x79, 0xe1, 0xa1, 0x53, 0xf7, 0x82, 0x23, 0x1c,
+	0x39, 0xad, 0xf5, 0x0a, 0x8e, 0xbc, 0x75, 0xa7, 0x42, 0x90, 0xdd, 0x0c, 0x68, 0x44, 0xb5, 0x79,
+	0x9e, 0xb7, 0x45, 0xde, 0x4e, 0xf2, 0xfa, 0xbc, 0x4f, 0x7d, 0xca, 0x09, 0x0e, 0xfb, 0x27, 0xb8,
+	0xba, 0x39, 0xb6, 0x16, 0x0d, 0x10, 0x0e, 0x12, 0x86, 0x51, 0xa5, 0x61, 0x9d, 0x86, 0x4e, 0xc5,
+	0x0b, 0x71, 0x4a, 0xa8, 0x52, 0xd2, 0x10, 0x79, 0xeb, 0x87, 0x0c, 0xa6, 0x76, 0x43, 0x7f, 0x3b,
+	0xc0, 0x5e, 0x84, 0x5d, 0x82, 0xb4, 0x03, 0xa0, 0x72, 0xfd, 0xa2, 0x6c, 0xca, 0x6b, 0x85, 0x8d,
+	0x15, 0x7b, 0x5c, 0x3b, 0xf6, 0x1e, 0xa3, 0x94, 0x76, 0xdc, 0xd5, 0xb3, 0x18, 0x4a, 0xdd, 0x18,
+	0xaa, 0x1c, 0xe8, 0xc5, 0x50, 0x88, 0xfb, 0x31, 0x9c, 0x3a, 0xf1, 0xea, 0xb5, 0x2d, 0x8b, 0x87,
+	0x56, 0x59, 0xc0, 0xda, 0x3d, 0x30, 0xd9, 0x0c, 0x68, 0x8b, 0xb0, 0xfa, 0x19, 0x53, 0x5e, 0xcb,
+	0xbb, 0xb0, 0x17, 0xc3, 0x14, 0xeb, 0xc7, 0x70, 0x56, 0xc8, 0x06, 0x88, 0x55, 0x4e, 0x93, 0xda,
+	0x63, 0xa0, 0x36, 0x03, 0x52, 0xc5, 0x8b, 0x59, 0xde, 0xd9, 0x92, 0x2d, 0x8e, 0x66, 0xb3, 0xa3,
+	0xa5, 0x8d, 0x6d, 0x53, 0xd2, 0x70, 0x57, 0x58, 0x57, 0xac, 0x19, 0xce, 0x1f, 0x36, 0xc3, 0x43,
+	0xab, 0x2c, 0xe0, 0x2d, 0xe5, 0xfb, 0x29, 0x94, 0xac, 0xff, 0xc0, 0xfc, 0xe8, 0xf9, 0xcb, 0x38,
+	0x6c, 0xd2, 0x46, 0x88, 0x2d, 0x02, 0x0a, 0x0c, 0xaf, 0xd1, 0x90, 0xdb, 0xf2, 0x14, 0xe4, 0x2a,
+	0x04, 0xbd, 0x24, 0x28, 0xf1, 0x65, 0x79, 0xbc, 0x2f, 0x2e, 0x41, 0xa5, 0x1d, 0xd7, 0x1c, 0xb8,
+	0xc2, 0xc3, 0x5e, 0x0c, 0x33, 0x04, 0xf5, 0x63, 0x98, 0x17, 0x5d, 0x10, 0x64, 0x95, 0xd5, 0x0a,
+	0x41, 0x25, 0x94, 0xb4, 0xb0, 0x00, 0xe6, 0x46, 0x3e, 0x95, 0x76, 0xf0, 0x29, 0x03, 0x44, 0x01,
+	0xcd, 0x01, 0x2a, 0x7d, 0xdd, 0x48, 0xee, 0x24, 0xef, 0x2e, 0x71, 0x9f, 0x19, 0x30, 0xe2, 0x33,
+	0x0b, 0x99, 0xcf, 0xec, 0x57, 0xdb, 0x04, 0x0a, 0x0a, 0xf1, 0x31, 0xf7, 0x58, 0x71, 0x61, 0x37,
+	0x86, 0xca, 0xce, 0x3e, 0x3e, 0xee, 0xc5, 0x90, 0xe3, 0xfd, 0x18, 0x16, 0x84, 0x8c, 0x45, 0x56,
+	0x99, 0x83, 0x4c, 0xe4, 0x33, 0x11, 0xb3, 0x77, 0x5a, 0x88, 0x1e, 0x26, 0x22, 0xff, 0x92, 0xc8,
+	0x17, 0x22, 0x3f, 0x11, 0x51, 0x26, 0x52, 0x86, 0xa2, 0xbd, 0x44, 0x44, 0x2f, 0x89, 0xa8, 0x10,
+	0xb1, 0x9f, 0x4b, 0x63, 0xa0, 0xfe, 0xe6, 0x18, 0x6c, 0x4d, 0x7e, 0x38, 0x85, 0x12, 0xf7, 0xed,
+	0x73, 0x16, 0x64, 0xff, 0xda, 0xdd, 0x68, 0x4f, 0x80, 0x1a, 0x46, 0x5e, 0x84, 0xb9, 0x89, 0x33,
+	0x1b, 0xf0, 0xca, 0xa2, 0xf6, 0x3e, 0xa3, 0x89, 0x5b, 0xe1, 0x8a, 0xe1, 0xad, 0xf0, 0xd0, 0x2a,
+	0x0b, 0xf8, 0x4f, 0x0f, 0xb0, 0xf5, 0x5e, 0x06, 0x2a, 0xff, 0xb6, 0x66, 0x82, 0x09, 0xd2, 0x68,
+	0x79, 0x35, 0x82, 0x8a, 0x92, 0x3e, 0xd7, 0xee, 0x98, 0xb3, 0x2e, 0x41, 0x3c, 0x55, 0x12, 0xb0,
+	0xb6, 0x00, 0x14, 0xda, 0xc4, 0x8d, 0xa2, 0xac, 0x17, 0xda, 0x1d, 0x73, 0xc2, 0x25, 0x68, 0xaf,
+	0x89, 0x1b, 0xda, 0x32, 0x98, 0xa8, 0x7b, 0x51, 0xf5, 0x10, 0xa3, 0x62, 0x46, 0x9f, 0x69, 0x77,
+	0x4c, 0xe0, 0x12, 0xb4, 0x2b, 0x10, 0xa6, 0xa9, 0xd1, 0x30, 0x2a, 0x66, 0x53, 0xcd, 0x23, 0x1a,
+	0x46, 0xda, 0x12, 0xc8, 0x55, 0xd9, 0xac, 0xa2, 0xa2, 0xa2, 0x4f, 0xb7, 0x3b, 0x66, 0xde, 0x25,
+	0x88, 0x0f, 0x2f, 0xd2, 0x95, 0xb7, 0x5f, 0x0c, 0x69, 0xe4, 0x86, 0xce, 0x33, 0x80, 0x15, 0x7c,
+	0x40, 0x6a, 0x11, 0x0e, 0xc2, 0x7f, 0x73, 0x3c, 0xba, 0xce, 0x9c, 0xc1, 0x7c, 0xe5, 0x86, 0x66,
+	0x5c, 0x37, 0x3e, 0x62, 0x59, 0x6c, 0x7c, 0xcc, 0x80, 0xec, 0x6e, 0xe8, 0x6b, 0x07, 0x20, 0x3f,
+	0x5c, 0xda, 0xd6, 0xf8, 0xe1, 0x1c, 0x5d, 0x6c, 0xfa, 0x9d, 0x9b, 0x39, 0x83, 0xd5, 0xa3, 0x3d,
+	0x03, 0x93, 0xe9, 0xe6, 0xfb, 0xff, 0x6a, 0x5d, 0x42, 0xd1, 0x6f, 0xdf, 0x48, 0x49, 0x2b, 0xbf,
+	0x00, 0x80, 0x63, 0xfc, 0xbd, 0xd0, 0x6e, 0x5d, 0x2f, 0xe4, 0x24, 0xfd, 0xee, 0x2f, 0x90, 0x06,
+	0xf5, 0xdd, 0xfb, 0x67, 0x5d, 0x43, 0x3e, 0xef, 0x1a, 0xf2, 0xb7, 0xae, 0x21, 0xbf, 0xbb, 0x30,
+	0xa4, 0xf3, 0x0b, 0x43, 0xfa, 0x7a, 0x61, 0x48, 0xcf, 0x57, 0x7d, 0x12, 0x1d, 0xbe, 0xaa, 0xd8,
+	0x55, 0x5a, 0x77, 0x68, 0x2b, 0xa8, 0xd6, 0x8e, 0x1c, 0xf1, 0x7a, 0xbe, 0x19, 0xbc, 0x9f, 0xd1,
+	0x49, 0x13, 0x87, 0x95, 0x1c, 0x7f, 0x18, 0x37, 0x7f, 0x06, 0x00, 0x00, 0xff, 0xff, 0x71, 0x94,
+	0x2b, 0xf3, 0xa8, 0x07, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConn
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion4
+
+// MsgClient is the client API for Msg service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type MsgClient interface {
+	// CreateBid defines a method to create a bid given proper inputs.
+	CreateBid(ctx context.Context, in *MsgCreateBid, opts ...grpc.CallOption) (*MsgCreateBidResponse, error)
+	// CloseBid defines a method to close a bid given proper inputs.
+	CloseBid(ctx context.Context, in *MsgCloseBid, opts ...grpc.CallOption) (*MsgCloseBidResponse, error)
+	// CloseOrder defines a method to close an order given proper inputs.
+	CloseOrder(ctx context.Context, in *MsgCloseOrder, opts ...grpc.CallOption) (*MsgCloseOrderResponse, error)
+}
+
+type msgClient struct {
+	cc grpc1.ClientConn
+}
+
+func NewMsgClient(cc grpc1.ClientConn) MsgClient {
+	return &msgClient{cc}
+}
+
+func (c *msgClient) CreateBid(ctx context.Context, in *MsgCreateBid, opts ...grpc.CallOption) (*MsgCreateBidResponse, error) {
+	out := new(MsgCreateBidResponse)
+	err := c.cc.Invoke(ctx, "/akash.market.v1beta1.Msg/CreateBid", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *msgClient) CloseBid(ctx context.Context, in *MsgCloseBid, opts ...grpc.CallOption) (*MsgCloseBidResponse, error) {
+	out := new(MsgCloseBidResponse)
+	err := c.cc.Invoke(ctx, "/akash.market.v1beta1.Msg/CloseBid", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *msgClient) CloseOrder(ctx context.Context, in *MsgCloseOrder, opts ...grpc.CallOption) (*MsgCloseOrderResponse, error) {
+	out := new(MsgCloseOrderResponse)
+	err := c.cc.Invoke(ctx, "/akash.market.v1beta1.Msg/CloseOrder", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// MsgServer is the server API for Msg service.
+type MsgServer interface {
+	// CreateBid defines a method to create a bid given proper inputs.
+	CreateBid(context.Context, *MsgCreateBid) (*MsgCreateBidResponse, error)
+	// CloseBid defines a method to close a bid given proper inputs.
+	CloseBid(context.Context, *MsgCloseBid) (*MsgCloseBidResponse, error)
+	// CloseOrder defines a method to close an order given proper inputs.
+	CloseOrder(context.Context, *MsgCloseOrder) (*MsgCloseOrderResponse, error)
+}
+
+// UnimplementedMsgServer can be embedded to have forward compatible implementations.
+type UnimplementedMsgServer struct {
+}
+
+func (*UnimplementedMsgServer) CreateBid(ctx context.Context, req *MsgCreateBid) (*MsgCreateBidResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method CreateBid not implemented")
+}
+func (*UnimplementedMsgServer) CloseBid(ctx context.Context, req *MsgCloseBid) (*MsgCloseBidResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method CloseBid not implemented")
+}
+func (*UnimplementedMsgServer) CloseOrder(ctx context.Context, req *MsgCloseOrder) (*MsgCloseOrderResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method CloseOrder not implemented")
+}
+
+func RegisterMsgServer(s grpc1.Server, srv MsgServer) {
+	s.RegisterService(&_Msg_serviceDesc, srv)
+}
+
+func _Msg_CreateBid_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MsgCreateBid)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MsgServer).CreateBid(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/akash.market.v1beta1.Msg/CreateBid",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MsgServer).CreateBid(ctx, req.(*MsgCreateBid))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _Msg_CloseBid_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MsgCloseBid)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MsgServer).CloseBid(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/akash.market.v1beta1.Msg/CloseBid",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MsgServer).CloseBid(ctx, req.(*MsgCloseBid))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _Msg_CloseOrder_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MsgCloseOrder)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MsgServer).CloseOrder(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/akash.market.v1beta1.Msg/CloseOrder",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MsgServer).CloseOrder(ctx, req.(*MsgCloseOrder))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _Msg_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "akash.market.v1beta1.Msg",
+	HandlerType: (*MsgServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "CreateBid",
+			Handler:    _Msg_CreateBid_Handler,
+		},
+		{
+			MethodName: "CloseBid",
+			Handler:    _Msg_CloseBid_Handler,
+		},
+		{
+			MethodName: "CloseOrder",
+			Handler:    _Msg_CloseOrder_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "akash/market/v1beta1/bid.proto",
 }
 
 func (m *MsgCreateBid) Marshal() (dAtA []byte, err error) {
@@ -499,6 +744,29 @@ func (m *MsgCreateBid) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	return len(dAtA) - i, nil
 }
 
+func (m *MsgCreateBidResponse) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalToSizedBuffer(dAtA[:size])
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *MsgCreateBidResponse) MarshalTo(dAtA []byte) (int, error) {
+	size := m.Size()
+	return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *MsgCreateBidResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+	i := len(dAtA)
+	_ = i
+	var l int
+	_ = l
+	return len(dAtA) - i, nil
+}
+
 func (m *MsgCloseBid) Marshal() (dAtA []byte, err error) {
 	size := m.Size()
 	dAtA = make([]byte, size)
@@ -532,6 +800,29 @@ func (m *MsgCloseBid) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	return len(dAtA) - i, nil
 }
 
+func (m *MsgCloseBidResponse) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalToSizedBuffer(dAtA[:size])
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *MsgCloseBidResponse) MarshalTo(dAtA []byte) (int, error) {
+	size := m.Size()
+	return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *MsgCloseBidResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+	i := len(dAtA)
+	_ = i
+	var l int
+	_ = l
+	return len(dAtA) - i, nil
+}
+
 func (m *BidID) Marshal() (dAtA []byte, err error) {
 	size := m.Size()
 	dAtA = make([]byte, size)
@@ -719,6 +1010,15 @@ func (m *MsgCreateBid) Size() (n int) {
 	return n
 }
 
+func (m *MsgCreateBidResponse) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	return n
+}
+
 func (m *MsgCloseBid) Size() (n int) {
 	if m == nil {
 		return 0
@@ -730,6 +1030,15 @@ func (m *MsgCloseBid) Size() (n int) {
 	return n
 }
 
+func (m *MsgCloseBidResponse) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	return n
+}
+
 func (m *BidID) Size() (n int) {
 	if m == nil {
 		return 0
@@ -959,6 +1268,59 @@ func (m *MsgCreateBid) Unmarshal(dAtA []byte) error {
 	}
 	return nil
 }
+func (m *MsgCreateBidResponse) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowBid
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: MsgCreateBidResponse: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: MsgCreateBidResponse: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		default:
+			iNdEx = preIndex
+			skippy, err := skipBid(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthBid
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthBid
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
 func (m *MsgCloseBid) Unmarshal(dAtA []byte) error {
 	l := len(dAtA)
 	iNdEx := 0
@@ -1045,6 +1407,59 @@ func (m *MsgCloseBid) Unmarshal(dAtA []byte) error {
 	}
 	return nil
 }
+func (m *MsgCloseBidResponse) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowBid
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: MsgCloseBidResponse: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: MsgCloseBidResponse: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		default:
+			iNdEx = preIndex
+			skippy, err := skipBid(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthBid
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthBid
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
 func (m *BidID) Unmarshal(dAtA []byte) error {
 	l := len(dAtA)
 	iNdEx := 0
diff --git a/x/market/types/codec.go b/x/market/types/codec.go
index b575e364..62dc2fcd 100644
--- a/x/market/types/codec.go
+++ b/x/market/types/codec.go
@@ -5,6 +5,7 @@ import (
 	cdctypes "github.com/cosmos/cosmos-sdk/codec/types"
 	cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec"
 	sdk "github.com/cosmos/cosmos-sdk/types"
+	"github.com/cosmos/cosmos-sdk/types/msgservice"
 )
 
 var (
@@ -40,4 +41,6 @@ func RegisterInterfaces(registry cdctypes.InterfaceRegistry) {
 		&MsgCloseBid{},
 		&MsgCloseOrder{},
 	)
+
+	msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc)
 }
diff --git a/x/market/types/order.pb.go b/x/market/types/order.pb.go
index a269f0aa..2489d8a8 100644
--- a/x/market/types/order.pb.go
+++ b/x/market/types/order.pb.go
@@ -57,7 +57,7 @@ func (x Order_State) String() string {
 }
 
 func (Order_State) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_0d97b6ff257f8a05, []int{2, 0}
+	return fileDescriptor_0d97b6ff257f8a05, []int{3, 0}
 }
 
 // MsgCloseOrder defines an SDK message for closing order
@@ -105,6 +105,43 @@ func (m *MsgCloseOrder) GetOrderID() OrderID {
 	return OrderID{}
 }
 
+// MsgCloseOrderResponse defines the Msg/CloseOrder response type.
+type MsgCloseOrderResponse struct {
+}
+
+func (m *MsgCloseOrderResponse) Reset()         { *m = MsgCloseOrderResponse{} }
+func (m *MsgCloseOrderResponse) String() string { return proto.CompactTextString(m) }
+func (*MsgCloseOrderResponse) ProtoMessage()    {}
+func (*MsgCloseOrderResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0d97b6ff257f8a05, []int{1}
+}
+func (m *MsgCloseOrderResponse) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *MsgCloseOrderResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_MsgCloseOrderResponse.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalToSizedBuffer(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *MsgCloseOrderResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MsgCloseOrderResponse.Merge(m, src)
+}
+func (m *MsgCloseOrderResponse) XXX_Size() int {
+	return m.Size()
+}
+func (m *MsgCloseOrderResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MsgCloseOrderResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MsgCloseOrderResponse proto.InternalMessageInfo
+
 // OrderID stores owner and all other seq numbers
 type OrderID struct {
 	Owner string `protobuf:"bytes,1,opt,name=owner,proto3" json:"owner" yaml:"owner"`
@@ -116,7 +153,7 @@ type OrderID struct {
 func (m *OrderID) Reset()      { *m = OrderID{} }
 func (*OrderID) ProtoMessage() {}
 func (*OrderID) Descriptor() ([]byte, []int) {
-	return fileDescriptor_0d97b6ff257f8a05, []int{1}
+	return fileDescriptor_0d97b6ff257f8a05, []int{2}
 }
 func (m *OrderID) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -185,7 +222,7 @@ type Order struct {
 func (m *Order) Reset()      { *m = Order{} }
 func (*Order) ProtoMessage() {}
 func (*Order) Descriptor() ([]byte, []int) {
-	return fileDescriptor_0d97b6ff257f8a05, []int{2}
+	return fileDescriptor_0d97b6ff257f8a05, []int{3}
 }
 func (m *Order) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -262,7 +299,7 @@ func (m *OrderFilters) Reset()         { *m = OrderFilters{} }
 func (m *OrderFilters) String() string { return proto.CompactTextString(m) }
 func (*OrderFilters) ProtoMessage()    {}
 func (*OrderFilters) Descriptor() ([]byte, []int) {
-	return fileDescriptor_0d97b6ff257f8a05, []int{3}
+	return fileDescriptor_0d97b6ff257f8a05, []int{4}
 }
 func (m *OrderFilters) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -329,6 +366,7 @@ func (m *OrderFilters) GetState() string {
 func init() {
 	proto.RegisterEnum("akash.market.v1beta1.Order_State", Order_State_name, Order_State_value)
 	proto.RegisterType((*MsgCloseOrder)(nil), "akash.market.v1beta1.MsgCloseOrder")
+	proto.RegisterType((*MsgCloseOrderResponse)(nil), "akash.market.v1beta1.MsgCloseOrderResponse")
 	proto.RegisterType((*OrderID)(nil), "akash.market.v1beta1.OrderID")
 	proto.RegisterType((*Order)(nil), "akash.market.v1beta1.Order")
 	proto.RegisterType((*OrderFilters)(nil), "akash.market.v1beta1.OrderFilters")
@@ -337,47 +375,48 @@ func init() {
 func init() { proto.RegisterFile("akash/market/v1beta1/order.proto", fileDescriptor_0d97b6ff257f8a05) }
 
 var fileDescriptor_0d97b6ff257f8a05 = []byte{
-	// 629 bytes of a gzipped FileDescriptorProto
+	// 641 bytes of a gzipped FileDescriptorProto
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x54, 0x4f, 0x4b, 0xdc, 0x4e,
-	0x18, 0x4e, 0xd6, 0xac, 0xd1, 0x59, 0xfd, 0xb9, 0xbf, 0x60, 0xa9, 0x8d, 0x98, 0x49, 0xa7, 0xa5,
-	0x78, 0x69, 0x82, 0x7a, 0xdb, 0x53, 0x4d, 0xa5, 0xe2, 0x41, 0x84, 0xd8, 0x53, 0x29, 0x48, 0x4c,
-	0x86, 0x18, 0xcc, 0xee, 0xc4, 0x64, 0xb4, 0xf5, 0x0b, 0x94, 0xb2, 0xa7, 0x5e, 0x0a, 0xa5, 0xb0,
-	0x20, 0xf4, 0xcb, 0x78, 0xf4, 0xd8, 0x53, 0x28, 0xbb, 0x97, 0xb2, 0xc7, 0xfd, 0x04, 0x65, 0xde,
-	0x89, 0xa6, 0x0b, 0xc5, 0x63, 0x0f, 0x3d, 0x65, 0xe6, 0x99, 0xe7, 0x79, 0xff, 0x3c, 0xbc, 0x79,
-	0x91, 0x1d, 0x9c, 0x06, 0xc5, 0x89, 0xdb, 0x0d, 0xf2, 0x53, 0xca, 0xdd, 0x8b, 0x8d, 0x63, 0xca,
-	0x83, 0x0d, 0x97, 0xe5, 0x11, 0xcd, 0x9d, 0x2c, 0x67, 0x9c, 0x19, 0xcb, 0xc0, 0x70, 0x24, 0xc3,
-	0xa9, 0x18, 0xe6, 0x72, 0xcc, 0x62, 0x06, 0x04, 0x57, 0x9c, 0x24, 0xd7, 0x7c, 0x2a, 0xa3, 0x45,
-	0x34, 0x4b, 0xd9, 0x65, 0x97, 0xf6, 0xea, 0x88, 0x71, 0xce, 0xce, 0x33, 0xc9, 0x22, 0x05, 0x5a,
-	0xdc, 0x2f, 0xe2, 0x97, 0x29, 0x2b, 0xe8, 0x81, 0x48, 0x64, 0xbc, 0x45, 0x73, 0x90, 0xf1, 0x28,
-	0x89, 0x56, 0x54, 0x5b, 0x5d, 0x6f, 0x6d, 0xae, 0x39, 0x7f, 0xca, 0xea, 0x00, 0x7d, 0x6f, 0xc7,
-	0x23, 0xd7, 0x25, 0x56, 0x86, 0x25, 0xd6, 0x2b, 0x60, 0x5c, 0xe2, 0x46, 0x12, 0x4d, 0x4a, 0x3c,
-	0x7f, 0x19, 0x74, 0xd3, 0x0e, 0x49, 0x22, 0xe2, 0xeb, 0x10, 0x72, 0x2f, 0xea, 0x68, 0x3f, 0xaf,
-	0xb0, 0x42, 0x46, 0x2a, 0xba, 0x65, 0x1b, 0x2e, 0x6a, 0xb2, 0x77, 0x3d, 0x9a, 0x43, 0xb2, 0x79,
-	0xef, 0xd1, 0xb8, 0xc4, 0x12, 0x98, 0x94, 0x78, 0x41, 0x46, 0x80, 0x2b, 0xf1, 0x25, 0x6c, 0x6c,
-	0x21, 0x2d, 0x2a, 0xe8, 0xd9, 0x4a, 0xc3, 0x56, 0xd7, 0x35, 0x0f, 0x0f, 0x4b, 0xac, 0xed, 0x1c,
-	0xd2, 0xb3, 0x71, 0x89, 0x01, 0x9f, 0x94, 0xb8, 0x25, 0x65, 0xe2, 0x46, 0x7c, 0x00, 0x85, 0x28,
-	0x16, 0xa2, 0x19, 0x5b, 0x5d, 0x5f, 0x94, 0xa2, 0xdd, 0x4a, 0x14, 0x4f, 0x89, 0x62, 0x29, 0x8a,
-	0x2b, 0x11, 0x13, 0x22, 0xad, 0x16, 0x1d, 0x54, 0x22, 0x36, 0x25, 0x62, 0x52, 0x24, 0x3e, 0x9d,
-	0xb9, 0x2f, 0x57, 0x58, 0x81, 0x2e, 0xbf, 0x6a, 0xa8, 0xf9, 0x17, 0x3c, 0x35, 0x7c, 0xd4, 0x2c,
-	0x78, 0xc0, 0x29, 0x38, 0xf2, 0xdf, 0xe6, 0xe3, 0x7b, 0x42, 0x3b, 0x87, 0x82, 0x28, 0x4d, 0x06,
-	0x4d, 0x6d, 0x32, 0x5c, 0x89, 0x2f, 0x61, 0xa3, 0x83, 0xe6, 0x0a, 0x1e, 0xe4, 0xfc, 0x28, 0xe0,
-	0xe0, 0xd9, 0x8c, 0x87, 0xc7, 0x25, 0x96, 0xd8, 0xf3, 0x80, 0x4f, 0x4a, 0xbc, 0x74, 0x27, 0x03,
-	0x84, 0xf8, 0x3a, 0x1c, 0xb7, 0xb9, 0xf1, 0x1a, 0x69, 0x45, 0x46, 0x43, 0xb0, 0xad, 0xb5, 0xf9,
-	0xa4, 0x2a, 0xa7, 0x9e, 0xc3, 0xbb, 0x92, 0x76, 0xc5, 0x1c, 0x1e, 0x66, 0x34, 0xf4, 0x56, 0x45,
-	0xbf, 0xc2, 0x57, 0x21, 0xac, 0x7d, 0x15, 0x37, 0xe2, 0x03, 0x28, 0x2a, 0x0a, 0xc5, 0x94, 0x8a,
-	0x8a, 0x9a, 0x75, 0x45, 0x80, 0x4d, 0x55, 0x74, 0x8b, 0x10, 0x5f, 0x87, 0xe3, 0x36, 0x27, 0x1f,
-	0x54, 0xd4, 0x84, 0xce, 0x0d, 0x82, 0xf4, 0xa4, 0x77, 0x11, 0xa4, 0x49, 0xd4, 0x56, 0xcc, 0x07,
-	0xfd, 0x81, 0xfd, 0x3f, 0xf8, 0x02, 0x8f, 0x7b, 0xf2, 0xc1, 0x78, 0x88, 0x34, 0x96, 0xd1, 0x5e,
-	0x5b, 0x35, 0x17, 0xfb, 0x03, 0x7b, 0x1e, 0x08, 0x07, 0x19, 0xed, 0x19, 0x6b, 0x48, 0xef, 0x06,
-	0x3c, 0x3c, 0xa1, 0x51, 0xbb, 0x61, 0xb6, 0xfb, 0x03, 0x7b, 0x01, 0xde, 0xf6, 0x25, 0x66, 0xac,
-	0xa2, 0x59, 0x48, 0x18, 0xb5, 0x67, 0xcc, 0xa5, 0xfe, 0xc0, 0x6e, 0xc1, 0x2b, 0xfc, 0x5a, 0x91,
-	0xa9, 0x7d, 0xfc, 0x66, 0x29, 0xbf, 0x0d, 0xc7, 0xe7, 0x06, 0x92, 0xea, 0x57, 0x49, 0xca, 0x69,
-	0x5e, 0xfc, 0x6b, 0xff, 0x81, 0xe8, 0x47, 0x4e, 0x65, 0xb3, 0xee, 0xe7, 0xbe, 0x91, 0x93, 0xab,
-	0xc1, 0x7b, 0x71, 0x3d, 0xb4, 0xd4, 0x9b, 0xa1, 0xa5, 0xfe, 0x18, 0x5a, 0xea, 0xa7, 0x91, 0xa5,
-	0xdc, 0x8c, 0x2c, 0xe5, 0xfb, 0xc8, 0x52, 0xde, 0x3c, 0x8b, 0x13, 0x7e, 0x72, 0x7e, 0xec, 0x84,
-	0xac, 0xeb, 0xb2, 0x8b, 0x3c, 0x4c, 0x4f, 0x5d, 0xb9, 0xe1, 0xde, 0xdf, 0x6e, 0x4c, 0x7e, 0x99,
-	0xd1, 0xe2, 0x78, 0x16, 0x16, 0xdb, 0xd6, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xca, 0x54, 0xb3,
-	0x1d, 0x4e, 0x05, 0x00, 0x00,
+	0x18, 0x4e, 0xd6, 0xac, 0xab, 0xb3, 0xfa, 0x73, 0x7f, 0x41, 0xd1, 0x46, 0xcc, 0xa4, 0xd3, 0x52,
+	0xbc, 0x34, 0x41, 0xbd, 0xed, 0xa9, 0x6e, 0xa5, 0xe2, 0x41, 0x84, 0xd8, 0x53, 0x29, 0x48, 0xdc,
+	0x0c, 0x31, 0xb8, 0x9b, 0x89, 0x99, 0xd1, 0xd6, 0x2f, 0x50, 0xca, 0x9e, 0x7a, 0x29, 0x94, 0xc2,
+	0x82, 0xd0, 0x2f, 0xe3, 0xd1, 0x63, 0x4f, 0xa1, 0xec, 0x5e, 0xca, 0x1e, 0xf7, 0x13, 0x94, 0x79,
+	0x27, 0x6b, 0xba, 0x50, 0x3c, 0xf6, 0xd0, 0x53, 0x66, 0x9e, 0x79, 0x9e, 0xf7, 0xcf, 0xc3, 0x9b,
+	0x17, 0x39, 0xc1, 0x79, 0xc0, 0xcf, 0xbc, 0x6e, 0x90, 0x9d, 0x53, 0xe1, 0x5d, 0x6d, 0x9d, 0x52,
+	0x11, 0x6c, 0x79, 0x2c, 0x0b, 0x69, 0xe6, 0xa6, 0x19, 0x13, 0xcc, 0x5c, 0x06, 0x86, 0xab, 0x18,
+	0x6e, 0xc1, 0xb0, 0x96, 0x23, 0x16, 0x31, 0x20, 0x78, 0xf2, 0xa4, 0xb8, 0xd6, 0x53, 0x15, 0x2d,
+	0xa4, 0x69, 0x87, 0x5d, 0x77, 0x69, 0x52, 0x46, 0x8c, 0x32, 0x76, 0x99, 0x2a, 0x16, 0xe1, 0x68,
+	0xf1, 0x90, 0x47, 0x2f, 0x3b, 0x8c, 0xd3, 0x23, 0x99, 0xc8, 0x7c, 0x8b, 0xe6, 0x20, 0xe3, 0x49,
+	0x1c, 0xae, 0xe9, 0x8e, 0xbe, 0x59, 0xdf, 0xde, 0x70, 0xff, 0x94, 0xd5, 0x05, 0xfa, 0xc1, 0x5e,
+	0x8b, 0xdc, 0xe6, 0x58, 0x1b, 0xe4, 0xb8, 0x56, 0x00, 0xa3, 0x1c, 0x57, 0xe2, 0x70, 0x9c, 0xe3,
+	0xf9, 0xeb, 0xa0, 0xdb, 0x69, 0x92, 0x38, 0x24, 0x7e, 0x0d, 0x42, 0x1e, 0x84, 0x4d, 0xe3, 0xe7,
+	0x0d, 0xd6, 0xc8, 0x2a, 0x5a, 0x99, 0x4a, 0xea, 0x53, 0x9e, 0xb2, 0x84, 0x53, 0x32, 0xd4, 0xd1,
+	0x24, 0x8c, 0xe9, 0xa1, 0x2a, 0x7b, 0x97, 0xd0, 0x0c, 0xaa, 0x98, 0x6f, 0x3d, 0x1a, 0xe5, 0x58,
+	0x01, 0xe3, 0x1c, 0x2f, 0xa8, 0xd0, 0x70, 0x25, 0xbe, 0x82, 0xcd, 0x1d, 0x64, 0x84, 0x9c, 0x5e,
+	0xac, 0x55, 0x1c, 0x7d, 0xd3, 0x68, 0xe1, 0x41, 0x8e, 0x8d, 0xbd, 0x63, 0x7a, 0x31, 0xca, 0x31,
+	0xe0, 0xe3, 0x1c, 0xd7, 0x95, 0x4c, 0xde, 0x88, 0x0f, 0xa0, 0x14, 0x45, 0x52, 0x34, 0xe3, 0xe8,
+	0x9b, 0x8b, 0x4a, 0xb4, 0x5f, 0x88, 0xa2, 0x29, 0x51, 0xa4, 0x44, 0x51, 0x21, 0x62, 0x52, 0x64,
+	0x94, 0xa2, 0xa3, 0x42, 0xc4, 0xa6, 0x44, 0x4c, 0x89, 0xe4, 0xa7, 0x39, 0xf7, 0xe5, 0x06, 0x6b,
+	0xd0, 0xfe, 0x57, 0x03, 0x55, 0xff, 0x82, 0xd9, 0xa6, 0x8f, 0xaa, 0x5c, 0x04, 0x82, 0x82, 0x23,
+	0xff, 0x6d, 0x3f, 0x7e, 0x20, 0xb4, 0x7b, 0x2c, 0x89, 0xca, 0x64, 0xd0, 0x94, 0x26, 0xc3, 0x95,
+	0xf8, 0x0a, 0x36, 0x9b, 0x68, 0x8e, 0x8b, 0x20, 0x13, 0x27, 0x81, 0x00, 0xcf, 0x66, 0x5a, 0x78,
+	0x94, 0x63, 0x85, 0x3d, 0x0f, 0xc4, 0x38, 0xc7, 0x4b, 0xf7, 0x32, 0x40, 0x88, 0x5f, 0x83, 0xe3,
+	0xae, 0x30, 0x5f, 0x23, 0x83, 0xa7, 0xb4, 0x0d, 0xb6, 0xd5, 0xb7, 0x9f, 0x14, 0xe5, 0x94, 0x03,
+	0x7a, 0x5f, 0xd2, 0xbe, 0x1c, 0xd0, 0xe3, 0x94, 0xb6, 0x5b, 0xeb, 0xb2, 0x5f, 0xe9, 0xab, 0x14,
+	0x96, 0xbe, 0xca, 0x1b, 0xf1, 0x01, 0x94, 0x15, 0xb5, 0xe5, 0x24, 0xc9, 0x8a, 0xaa, 0x65, 0x45,
+	0x80, 0x4d, 0x55, 0x34, 0x41, 0x88, 0x5f, 0x83, 0xe3, 0xae, 0x20, 0x1f, 0x74, 0x54, 0x85, 0xce,
+	0x4d, 0x82, 0x6a, 0x71, 0x72, 0x15, 0x74, 0xe2, 0xb0, 0xa1, 0x59, 0x2b, 0xbd, 0xbe, 0xf3, 0x3f,
+	0xf8, 0x02, 0x8f, 0x07, 0xea, 0xc1, 0x5c, 0x45, 0x06, 0x4b, 0x69, 0xd2, 0xd0, 0xad, 0xc5, 0x5e,
+	0xdf, 0x99, 0x07, 0xc2, 0x51, 0x4a, 0x13, 0x73, 0x03, 0xd5, 0xba, 0x81, 0x68, 0x9f, 0xd1, 0xb0,
+	0x51, 0xb1, 0x1a, 0xbd, 0xbe, 0xb3, 0x00, 0x6f, 0x87, 0x0a, 0x33, 0xd7, 0xd1, 0x2c, 0x24, 0x0c,
+	0x1b, 0x33, 0xd6, 0x52, 0xaf, 0xef, 0xd4, 0xe1, 0x15, 0xc6, 0x3f, 0xb4, 0x8c, 0x8f, 0xdf, 0x6c,
+	0xed, 0xb7, 0xe1, 0xf8, 0x5c, 0x41, 0x4a, 0xfd, 0x2a, 0xee, 0x08, 0x9a, 0xf1, 0x7f, 0xed, 0x3f,
+	0x90, 0xfd, 0xa8, 0xa9, 0xac, 0x96, 0xfd, 0x3c, 0x34, 0x72, 0x6a, 0x67, 0xb4, 0x5e, 0xdc, 0x0e,
+	0x6c, 0xfd, 0x6e, 0x60, 0xeb, 0x3f, 0x06, 0xb6, 0xfe, 0x69, 0x68, 0x6b, 0x77, 0x43, 0x5b, 0xfb,
+	0x3e, 0xb4, 0xb5, 0x37, 0xcf, 0xa2, 0x58, 0x9c, 0x5d, 0x9e, 0xba, 0x6d, 0xd6, 0xf5, 0xd8, 0x55,
+	0xd6, 0xee, 0x9c, 0x7b, 0x6a, 0xf5, 0xbd, 0x9f, 0xac, 0x52, 0x71, 0x9d, 0x52, 0x7e, 0x3a, 0x0b,
+	0x1b, 0x6f, 0xe7, 0x57, 0x00, 0x00, 0x00, 0xff, 0xff, 0xaf, 0xc5, 0x47, 0x0c, 0x67, 0x05, 0x00,
+	0x00,
 }
 
 func (m *MsgCloseOrder) Marshal() (dAtA []byte, err error) {
@@ -413,6 +452,29 @@ func (m *MsgCloseOrder) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	return len(dAtA) - i, nil
 }
 
+func (m *MsgCloseOrderResponse) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalToSizedBuffer(dAtA[:size])
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *MsgCloseOrderResponse) MarshalTo(dAtA []byte) (int, error) {
+	size := m.Size()
+	return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *MsgCloseOrderResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+	i := len(dAtA)
+	_ = i
+	var l int
+	_ = l
+	return len(dAtA) - i, nil
+}
+
 func (m *OrderID) Marshal() (dAtA []byte, err error) {
 	size := m.Size()
 	dAtA = make([]byte, size)
@@ -590,6 +652,15 @@ func (m *MsgCloseOrder) Size() (n int) {
 	return n
 }
 
+func (m *MsgCloseOrderResponse) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	return n
+}
+
 func (m *OrderID) Size() (n int) {
 	if m == nil {
 		return 0
@@ -752,6 +823,59 @@ func (m *MsgCloseOrder) Unmarshal(dAtA []byte) error {
 	}
 	return nil
 }
+func (m *MsgCloseOrderResponse) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowOrder
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: MsgCloseOrderResponse: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: MsgCloseOrderResponse: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		default:
+			iNdEx = preIndex
+			skippy, err := skipOrder(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthOrder
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthOrder
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
 func (m *OrderID) Unmarshal(dAtA []byte) error {
 	l := len(dAtA)
 	iNdEx := 0
diff --git a/x/provider/handler/handler.go b/x/provider/handler/handler.go
index 3808ec4f..bf62556e 100644
--- a/x/provider/handler/handler.go
+++ b/x/provider/handler/handler.go
@@ -3,117 +3,32 @@ package handler
 import (
 	sdk "github.com/cosmos/cosmos-sdk/types"
 	sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
-	"github.com/pkg/errors"
 
 	mkeeper "github.com/ovrclk/akash/x/market/keeper"
-	mtypes "github.com/ovrclk/akash/x/market/types"
 	"github.com/ovrclk/akash/x/provider/keeper"
 	"github.com/ovrclk/akash/x/provider/types"
 )
 
 // NewHandler returns a handler for "provider" type messages.
 func NewHandler(keeper keeper.Keeper, mkeeper mkeeper.Keeper) sdk.Handler {
+	ms := NewMsgServerImpl(keeper, mkeeper)
+
 	return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) {
 		switch msg := msg.(type) {
 		case *types.MsgCreateProvider:
-			return handleMsgCreate(ctx, keeper, msg)
+			res, err := ms.CreateProvider(sdk.WrapSDKContext(ctx), msg)
+			return sdk.WrapServiceResult(ctx, res, err)
+
 		case *types.MsgUpdateProvider:
-			return handleMsgUpdate(ctx, keeper, mkeeper, msg)
+			res, err := ms.UpdateProvider(sdk.WrapSDKContext(ctx), msg)
+			return sdk.WrapServiceResult(ctx, res, err)
+
 		case *types.MsgDeleteProvider:
-			return handleMsgDelete(ctx, keeper, msg)
+			res, err := ms.DeleteProvider(sdk.WrapSDKContext(ctx), msg)
+			return sdk.WrapServiceResult(ctx, res, err)
+
 		default:
 			return nil, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "unrecognized bank message type: %T", msg)
 		}
 	}
 }
-
-var (
-	// ErrInternal defines registered error code for internal error
-	ErrInternal = sdkerrors.Register(types.ModuleName, 10, "internal error")
-)
-
-func handleMsgCreate(ctx sdk.Context, keeper keeper.Keeper, msg *types.MsgCreateProvider) (*sdk.Result, error) {
-	owner, err := sdk.AccAddressFromBech32(msg.Owner)
-	if err != nil {
-		return nil, err
-	}
-
-	if _, ok := keeper.Get(ctx, owner); ok {
-		return nil, errors.Wrapf(types.ErrProviderExists, "id: %s", msg.Owner)
-	}
-
-	if err := msg.Attributes.Validate(); err != nil {
-		return nil, err
-	}
-
-	if err := keeper.Create(ctx, types.Provider(*msg)); err != nil {
-		return nil, sdkerrors.Wrapf(ErrInternal, "err: %v", err)
-	}
-
-	return &sdk.Result{
-		Events: ctx.EventManager().ABCIEvents(),
-	}, nil
-}
-
-func handleMsgUpdate(ctx sdk.Context, keeper keeper.Keeper, mkeeper mkeeper.Keeper, msg *types.MsgUpdateProvider) (*sdk.Result, error) {
-	owner, err := sdk.AccAddressFromBech32(msg.Owner)
-	if err != nil {
-		return nil, err
-	}
-
-	prov, found := keeper.Get(ctx, owner)
-	if !found {
-		return nil, errors.Wrapf(types.ErrProviderNotFound, "id: %s", msg.Owner)
-	}
-
-	if err := msg.Attributes.Validate(); err != nil {
-		return nil, err
-	}
-
-	// all filtering code below is madness!. should make an index to not melt the cpu
-	// TODO: use WithActiveLeases, filter by lease.Provider
-	mkeeper.WithLeases(ctx, func(lease mtypes.Lease) bool {
-		if prov.Owner == lease.ID().Provider && (lease.State == mtypes.LeaseActive) {
-			var order mtypes.Order
-			order, found = mkeeper.GetOrder(ctx, lease.ID().OrderID())
-			if !found {
-				err = errors.Wrapf(ErrInternal,
-					"order \"%s\" for lease \"%s\" has not been found",
-					order.ID(),
-					lease.ID())
-				return true
-			}
-			if !order.MatchAttributes(msg.Attributes) {
-				err = types.ErrIncompatibleAttributes
-				return true
-			}
-		}
-		return false
-	})
-
-	if err != nil {
-		return nil, err
-	}
-
-	if err := keeper.Update(ctx, types.Provider(*msg)); err != nil {
-		return nil, sdkerrors.Wrapf(ErrInternal, "err: %v", err)
-	}
-
-	return &sdk.Result{
-		Events: ctx.EventManager().ABCIEvents(),
-	}, nil
-}
-
-func handleMsgDelete(ctx sdk.Context, keeper keeper.Keeper, msg *types.MsgDeleteProvider) (*sdk.Result, error) {
-	owner, err := sdk.AccAddressFromBech32(msg.Owner)
-	if err != nil {
-		return nil, err
-	}
-
-	if _, ok := keeper.Get(ctx, owner); !ok {
-		return nil, types.ErrProviderNotFound
-	}
-
-	// TODO: cancel leases
-	return nil, sdkerrors.Wrapf(ErrInternal, "NOTIMPLEMENTED")
-}
diff --git a/x/provider/handler/msg_server.go b/x/provider/handler/msg_server.go
new file mode 100644
index 00000000..39dcdcff
--- /dev/null
+++ b/x/provider/handler/msg_server.go
@@ -0,0 +1,120 @@
+package handler
+
+import (
+	"context"
+
+	sdk "github.com/cosmos/cosmos-sdk/types"
+	sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
+	"github.com/pkg/errors"
+
+	mkeeper "github.com/ovrclk/akash/x/market/keeper"
+	mtypes "github.com/ovrclk/akash/x/market/types"
+	"github.com/ovrclk/akash/x/provider/keeper"
+	"github.com/ovrclk/akash/x/provider/types"
+)
+
+var (
+	// ErrInternal defines registered error code for internal error
+	ErrInternal = sdkerrors.Register(types.ModuleName, 10, "internal error")
+)
+
+type msgServer struct {
+	provider keeper.Keeper
+	market   mkeeper.Keeper
+}
+
+// NewMsgServerImpl returns an implementation of the market MsgServer interface
+// for the provided Keeper.
+func NewMsgServerImpl(k keeper.Keeper, mk mkeeper.Keeper) types.MsgServer {
+	return &msgServer{provider: k, market: mk}
+}
+
+var _ types.MsgServer = msgServer{}
+
+func (ms msgServer) CreateProvider(goCtx context.Context, msg *types.MsgCreateProvider) (*types.MsgCreateProviderResponse, error) {
+	ctx := sdk.UnwrapSDKContext(goCtx)
+
+	owner, err := sdk.AccAddressFromBech32(msg.Owner)
+	if err != nil {
+		return nil, err
+	}
+
+	if _, ok := ms.provider.Get(ctx, owner); ok {
+		return nil, errors.Wrapf(types.ErrProviderExists, "id: %s", msg.Owner)
+	}
+
+	if err := msg.Attributes.Validate(); err != nil {
+		return nil, err
+	}
+
+	if err := ms.provider.Create(ctx, types.Provider(*msg)); err != nil {
+		return nil, sdkerrors.Wrapf(ErrInternal, "err: %v", err)
+	}
+
+	return &types.MsgCreateProviderResponse{}, nil
+}
+
+func (ms msgServer) UpdateProvider(goCtx context.Context, msg *types.MsgUpdateProvider) (*types.MsgUpdateProviderResponse, error) {
+	ctx := sdk.UnwrapSDKContext(goCtx)
+
+	owner, err := sdk.AccAddressFromBech32(msg.Owner)
+	if err != nil {
+		return nil, err
+	}
+
+	prov, found := ms.provider.Get(ctx, owner)
+	if !found {
+		return nil, errors.Wrapf(types.ErrProviderNotFound, "id: %s", msg.Owner)
+	}
+
+	if err := msg.Attributes.Validate(); err != nil {
+		return nil, err
+	}
+
+	// all filtering code below is madness!. should make an index to not melt the cpu
+	// TODO: use WithActiveLeases, filter by lease.Provider
+	ms.market.WithLeases(ctx, func(lease mtypes.Lease) bool {
+		if prov.Owner == lease.ID().Provider && (lease.State == mtypes.LeaseActive) {
+			var order mtypes.Order
+			order, found = ms.market.GetOrder(ctx, lease.ID().OrderID())
+			if !found {
+				err = errors.Wrapf(ErrInternal,
+					"order \"%s\" for lease \"%s\" has not been found",
+					order.ID(),
+					lease.ID())
+				return true
+			}
+			if !order.MatchAttributes(msg.Attributes) {
+				err = types.ErrIncompatibleAttributes
+				return true
+			}
+		}
+		return false
+	})
+
+	if err != nil {
+		return nil, err
+	}
+
+	if err := ms.provider.Update(ctx, types.Provider(*msg)); err != nil {
+		return nil, sdkerrors.Wrapf(ErrInternal, "err: %v", err)
+	}
+
+	return &types.MsgUpdateProviderResponse{}, nil
+}
+
+func (ms msgServer) DeleteProvider(goCtx context.Context, msg *types.MsgDeleteProvider) (*types.MsgDeleteProviderResponse, error) {
+	ctx := sdk.UnwrapSDKContext(goCtx)
+
+	owner, err := sdk.AccAddressFromBech32(msg.Owner)
+	if err != nil {
+		return nil, err
+	}
+
+	if _, ok := ms.provider.Get(ctx, owner); !ok {
+		return nil, types.ErrProviderNotFound
+	}
+
+	// TODO: cancel leases
+	return nil, sdkerrors.Wrapf(ErrInternal, "NOTIMPLEMENTED")
+}
diff --git a/x/provider/module.go b/x/provider/module.go
index 38c8e01f..f379e576 100644
--- a/x/provider/module.go
+++ b/x/provider/module.go
@@ -16,7 +16,6 @@ import (
 	cdctypes "github.com/cosmos/cosmos-sdk/codec/types"
 	"github.com/cosmos/cosmos-sdk/types/module"
 	bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"
-	"github.com/gogo/protobuf/grpc"
 	"github.com/gorilla/mux"
 	"github.com/grpc-ecosystem/grpc-gateway/runtime"
 	"github.com/pkg/errors"
@@ -79,8 +78,8 @@ func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Rout
 	rest.RegisterRoutes(clientCtx, rtr, StoreKey)
 }
 
-// RegisterGRPCRoutes registers the gRPC Gateway routes for the provider module.
-func (AppModuleBasic) RegisterGRPCRoutes(clientCtx client.Context, mux *runtime.ServeMux) {
+// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the provider module.
+func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) {
 	err := types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx))
 	if err != nil {
 		panic(fmt.Sprintf("couldn't register provider grpc routes: %s", err.Error()))
@@ -143,11 +142,11 @@ func (am AppModule) LegacyQuerierHandler(legacyQuerierCdc *codec.LegacyAmino) sd
 	return query.NewQuerier(am.keeper, legacyQuerierCdc)
 }
 
-// RegisterQueryService registers a GRPC query service to respond to the
-// module-specific GRPC queries.
-func (am AppModule) RegisterQueryService(server grpc.Server) {
+// RegisterServices registers the module's servicess
+func (am AppModule) RegisterServices(cfg module.Configurator) {
+	types.RegisterMsgServer(cfg.MsgServer(), handler.NewMsgServerImpl(am.keeper, am.mkeeper))
 	querier := keeper.Querier{Keeper: am.keeper}
-	types.RegisterQueryServer(server, querier)
+	types.RegisterQueryServer(cfg.QueryServer(), querier)
 }
 
 // BeginBlock performs no-op
diff --git a/x/provider/simulation/operations.go b/x/provider/simulation/operations.go
index 6b49fac4..f8129cb9 100644
--- a/x/provider/simulation/operations.go
+++ b/x/provider/simulation/operations.go
@@ -87,7 +87,7 @@ func SimulateMsgCreate(ak govtypes.AccountKeeper, bk bankkeeper.Keeper, k keeper
 
 		msg := types.NewMsgCreateProvider(simAccount.Address, cfg.Host, cfg.GetAttributes())
 
-		txGen := simappparams.MakeEncodingConfig().TxConfig
+		txGen := simappparams.MakeTestEncodingConfig().TxConfig
 		tx, err := helpers.GenTx(
 			txGen,
 			[]sdk.Msg{msg},
@@ -103,7 +103,7 @@ func SimulateMsgCreate(ak govtypes.AccountKeeper, bk bankkeeper.Keeper, k keeper
 			return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err
 		}
 
-		_, _, err = app.Deliver(tx)
+		_, _, err = app.Deliver(txGen.TxEncoder(), tx)
 		if err != nil {
 			return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to deliver mock tx"), nil, err
 		}
@@ -158,7 +158,7 @@ func SimulateMsgUpdate(ak govtypes.AccountKeeper, bk bankkeeper.Keeper, k keeper
 			HostURI: provider.HostURI,
 		}
 
-		txGen := simappparams.MakeEncodingConfig().TxConfig
+		txGen := simappparams.MakeTestEncodingConfig().TxConfig
 		tx, err := helpers.GenTx(
 			txGen,
 			[]sdk.Msg{msg},
@@ -174,7 +174,7 @@ func SimulateMsgUpdate(ak govtypes.AccountKeeper, bk bankkeeper.Keeper, k keeper
 			return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err
 		}
 
-		_, _, err = app.Deliver(tx)
+		_, _, err = app.Deliver(txGen.TxEncoder(), tx)
 		if err != nil {
 			return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to deliver mock tx"), nil, err
 		}
diff --git a/x/provider/types/codec.go b/x/provider/types/codec.go
index 26f58198..167288e8 100644
--- a/x/provider/types/codec.go
+++ b/x/provider/types/codec.go
@@ -5,6 +5,7 @@ import (
 	cdctypes "github.com/cosmos/cosmos-sdk/codec/types"
 	cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec"
 	sdk "github.com/cosmos/cosmos-sdk/types"
+	"github.com/cosmos/cosmos-sdk/types/msgservice"
 )
 
 var (
@@ -39,4 +40,6 @@ func RegisterInterfaces(registry cdctypes.InterfaceRegistry) {
 		&MsgUpdateProvider{},
 		&MsgDeleteProvider{},
 	)
+
+	msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc)
 }
diff --git a/x/provider/types/provider.pb.go b/x/provider/types/provider.pb.go
index 2aa8a384..605ef35e 100644
--- a/x/provider/types/provider.pb.go
+++ b/x/provider/types/provider.pb.go
@@ -4,10 +4,15 @@
 package types
 
 import (
+	context "context"
 	fmt "fmt"
 	_ "github.com/gogo/protobuf/gogoproto"
+	grpc1 "github.com/gogo/protobuf/grpc"
 	proto "github.com/gogo/protobuf/proto"
 	types "github.com/ovrclk/akash/types"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
 	io "io"
 	math "math"
 	math_bits "math/bits"
@@ -85,6 +90,43 @@ func (m *MsgCreateProvider) GetAttributes() Attributes {
 	return nil
 }
 
+// MsgCreateProviderResponse defines the Msg/CreateProvider response type.
+type MsgCreateProviderResponse struct {
+}
+
+func (m *MsgCreateProviderResponse) Reset()         { *m = MsgCreateProviderResponse{} }
+func (m *MsgCreateProviderResponse) String() string { return proto.CompactTextString(m) }
+func (*MsgCreateProviderResponse) ProtoMessage()    {}
+func (*MsgCreateProviderResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_12a8109840398be6, []int{1}
+}
+func (m *MsgCreateProviderResponse) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *MsgCreateProviderResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_MsgCreateProviderResponse.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalToSizedBuffer(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *MsgCreateProviderResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MsgCreateProviderResponse.Merge(m, src)
+}
+func (m *MsgCreateProviderResponse) XXX_Size() int {
+	return m.Size()
+}
+func (m *MsgCreateProviderResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MsgCreateProviderResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MsgCreateProviderResponse proto.InternalMessageInfo
+
 // MsgUpdateProvider defines an SDK message for updating a provider
 type MsgUpdateProvider struct {
 	Owner      string     `protobuf:"bytes,1,opt,name=owner,proto3" json:"owner" yaml:"owner"`
@@ -96,7 +138,7 @@ func (m *MsgUpdateProvider) Reset()         { *m = MsgUpdateProvider{} }
 func (m *MsgUpdateProvider) String() string { return proto.CompactTextString(m) }
 func (*MsgUpdateProvider) ProtoMessage()    {}
 func (*MsgUpdateProvider) Descriptor() ([]byte, []int) {
-	return fileDescriptor_12a8109840398be6, []int{1}
+	return fileDescriptor_12a8109840398be6, []int{2}
 }
 func (m *MsgUpdateProvider) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -146,6 +188,43 @@ func (m *MsgUpdateProvider) GetAttributes() Attributes {
 	return nil
 }
 
+// MsgUpdateProviderResponse defines the Msg/UpdateProvider response type.
+type MsgUpdateProviderResponse struct {
+}
+
+func (m *MsgUpdateProviderResponse) Reset()         { *m = MsgUpdateProviderResponse{} }
+func (m *MsgUpdateProviderResponse) String() string { return proto.CompactTextString(m) }
+func (*MsgUpdateProviderResponse) ProtoMessage()    {}
+func (*MsgUpdateProviderResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_12a8109840398be6, []int{3}
+}
+func (m *MsgUpdateProviderResponse) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *MsgUpdateProviderResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_MsgUpdateProviderResponse.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalToSizedBuffer(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *MsgUpdateProviderResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MsgUpdateProviderResponse.Merge(m, src)
+}
+func (m *MsgUpdateProviderResponse) XXX_Size() int {
+	return m.Size()
+}
+func (m *MsgUpdateProviderResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MsgUpdateProviderResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MsgUpdateProviderResponse proto.InternalMessageInfo
+
 // MsgDeleteProvider defines an SDK message for deleting a provider
 type MsgDeleteProvider struct {
 	Owner string `protobuf:"bytes,1,opt,name=owner,proto3" json:"owner" yaml:"owner"`
@@ -155,7 +234,7 @@ func (m *MsgDeleteProvider) Reset()         { *m = MsgDeleteProvider{} }
 func (m *MsgDeleteProvider) String() string { return proto.CompactTextString(m) }
 func (*MsgDeleteProvider) ProtoMessage()    {}
 func (*MsgDeleteProvider) Descriptor() ([]byte, []int) {
-	return fileDescriptor_12a8109840398be6, []int{2}
+	return fileDescriptor_12a8109840398be6, []int{4}
 }
 func (m *MsgDeleteProvider) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -191,6 +270,43 @@ func (m *MsgDeleteProvider) GetOwner() string {
 	return ""
 }
 
+// MsgDeleteProviderResponse defines the Msg/DeleteProvider response type.
+type MsgDeleteProviderResponse struct {
+}
+
+func (m *MsgDeleteProviderResponse) Reset()         { *m = MsgDeleteProviderResponse{} }
+func (m *MsgDeleteProviderResponse) String() string { return proto.CompactTextString(m) }
+func (*MsgDeleteProviderResponse) ProtoMessage()    {}
+func (*MsgDeleteProviderResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_12a8109840398be6, []int{5}
+}
+func (m *MsgDeleteProviderResponse) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *MsgDeleteProviderResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_MsgDeleteProviderResponse.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalToSizedBuffer(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *MsgDeleteProviderResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MsgDeleteProviderResponse.Merge(m, src)
+}
+func (m *MsgDeleteProviderResponse) XXX_Size() int {
+	return m.Size()
+}
+func (m *MsgDeleteProviderResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MsgDeleteProviderResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MsgDeleteProviderResponse proto.InternalMessageInfo
+
 // Provider stores owner and host details
 type Provider struct {
 	Owner      string     `protobuf:"bytes,1,opt,name=owner,proto3" json:"owner" yaml:"owner"`
@@ -201,7 +317,7 @@ type Provider struct {
 func (m *Provider) Reset()      { *m = Provider{} }
 func (*Provider) ProtoMessage() {}
 func (*Provider) Descriptor() ([]byte, []int) {
-	return fileDescriptor_12a8109840398be6, []int{3}
+	return fileDescriptor_12a8109840398be6, []int{6}
 }
 func (m *Provider) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -253,8 +369,11 @@ func (m *Provider) GetAttributes() Attributes {
 
 func init() {
 	proto.RegisterType((*MsgCreateProvider)(nil), "akash.provider.v1beta1.MsgCreateProvider")
+	proto.RegisterType((*MsgCreateProviderResponse)(nil), "akash.provider.v1beta1.MsgCreateProviderResponse")
 	proto.RegisterType((*MsgUpdateProvider)(nil), "akash.provider.v1beta1.MsgUpdateProvider")
+	proto.RegisterType((*MsgUpdateProviderResponse)(nil), "akash.provider.v1beta1.MsgUpdateProviderResponse")
 	proto.RegisterType((*MsgDeleteProvider)(nil), "akash.provider.v1beta1.MsgDeleteProvider")
+	proto.RegisterType((*MsgDeleteProviderResponse)(nil), "akash.provider.v1beta1.MsgDeleteProviderResponse")
 	proto.RegisterType((*Provider)(nil), "akash.provider.v1beta1.Provider")
 }
 
@@ -263,7 +382,7 @@ func init() {
 }
 
 var fileDescriptor_12a8109840398be6 = []byte{
-	// 371 bytes of a gzipped FileDescriptorProto
+	// 455 bytes of a gzipped FileDescriptorProto
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4d, 0xcc, 0x4e, 0x2c,
 	0xce, 0xd0, 0x2f, 0x28, 0xca, 0x2f, 0xcb, 0x4c, 0x49, 0x2d, 0xd2, 0x2f, 0x33, 0x4c, 0x4a, 0x2d,
 	0x49, 0x34, 0x84, 0x0b, 0xe8, 0x15, 0x14, 0xe5, 0x97, 0xe4, 0x0b, 0x89, 0x81, 0x95, 0xe9, 0xc1,
@@ -280,14 +399,177 @@ var fileDescriptor_12a8109840398be6 = []byte{
 	0x59, 0x3d, 0x88, 0xa7, 0x41, 0xde, 0x80, 0x79, 0x58, 0xcf, 0x11, 0xa6, 0xca, 0xc9, 0xf4, 0xc4,
 	0x3d, 0x79, 0x86, 0x57, 0xf7, 0xe4, 0x91, 0x34, 0x7e, 0xba, 0x27, 0x2f, 0x08, 0xb1, 0x02, 0x21,
 	0xa6, 0xb4, 0xea, 0xbe, 0x3c, 0x17, 0x5c, 0x57, 0x71, 0x10, 0x92, 0x72, 0x2b, 0x96, 0x17, 0x0b,
-	0xe4, 0x19, 0x60, 0x21, 0x11, 0x5a, 0x90, 0x32, 0xd2, 0x43, 0xc2, 0x0b, 0x1c, 0x10, 0x2e, 0xa9,
-	0x39, 0xa9, 0x14, 0x04, 0x04, 0xd4, 0xac, 0x26, 0x26, 0x2e, 0x8e, 0x11, 0x1a, 0x98, 0x1c, 0x33,
-	0x16, 0xc8, 0x33, 0x80, 0x02, 0xc1, 0xc9, 0xe9, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, 0xe4, 0x18,
-	0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, 0x39, 0x86, 0x1b, 0x8f, 0xe5,
-	0x18, 0xa2, 0x34, 0xd2, 0x33, 0x4b, 0x32, 0x4a, 0x93, 0xf4, 0x92, 0xf3, 0x73, 0xf5, 0xf3, 0xcb,
-	0x8a, 0x92, 0x73, 0xb2, 0xf5, 0x21, 0x99, 0xb6, 0x02, 0x51, 0x16, 0x94, 0x54, 0x16, 0xa4, 0x16,
-	0x27, 0xb1, 0x81, 0xf3, 0xab, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0x46, 0x85, 0x37, 0xf3, 0x2a,
-	0x04, 0x00, 0x00,
+	0xe4, 0x19, 0x94, 0xa4, 0xb9, 0x24, 0x31, 0x02, 0x22, 0x28, 0xb5, 0xb8, 0x20, 0x3f, 0xaf, 0x38,
+	0x15, 0x16, 0x4c, 0xa1, 0x05, 0x29, 0xa3, 0xc1, 0x24, 0x89, 0x11, 0x10, 0xf0, 0x60, 0xf2, 0x02,
+	0x87, 0x92, 0x4b, 0x6a, 0x4e, 0x2a, 0x05, 0xa1, 0x84, 0x62, 0x11, 0xaa, 0x59, 0x70, 0x8b, 0x9a,
+	0x98, 0xb8, 0x38, 0x46, 0x68, 0x34, 0x70, 0xcc, 0x58, 0x20, 0xcf, 0x00, 0x0a, 0x21, 0xa3, 0xab,
+	0x4c, 0x5c, 0xcc, 0xbe, 0xc5, 0xe9, 0x42, 0x79, 0x5c, 0x7c, 0x68, 0xf9, 0x57, 0x53, 0x0f, 0x7b,
+	0x41, 0xa1, 0x87, 0x91, 0xc2, 0xa5, 0x0c, 0x89, 0x56, 0x0a, 0x0b, 0x7c, 0x90, 0x7d, 0x68, 0x19,
+	0x01, 0x9f, 0x7d, 0xa8, 0x4a, 0xf1, 0xda, 0x87, 0x3d, 0x55, 0x81, 0xec, 0x43, 0x4b, 0x52, 0xf8,
+	0xec, 0x43, 0x55, 0x8a, 0xd7, 0x3e, 0xec, 0x89, 0xcb, 0xc9, 0xe9, 0xc4, 0x23, 0x39, 0xc6, 0x0b,
+	0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, 0x39, 0x86,
+	0x1b, 0x8f, 0xe5, 0x18, 0xa2, 0x34, 0xd2, 0x33, 0x4b, 0x32, 0x4a, 0x93, 0xf4, 0x92, 0xf3, 0x73,
+	0xf5, 0xf3, 0xcb, 0x8a, 0x92, 0x73, 0xb2, 0xf5, 0x21, 0x65, 0x6c, 0x05, 0xa2, 0xe8, 0x2e, 0xa9,
+	0x2c, 0x48, 0x2d, 0x4e, 0x62, 0x03, 0x17, 0xaf, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9e,
+	0x09, 0x16, 0xf1, 0xd9, 0x05, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConn
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion4
+
+// MsgClient is the client API for Msg service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type MsgClient interface {
+	// CreateProvider defines a method that creates a provider given the proper inputs
+	CreateProvider(ctx context.Context, in *MsgCreateProvider, opts ...grpc.CallOption) (*MsgCreateProviderResponse, error)
+	// UpdateProvider defines a method that updates a provider given the proper inputs
+	UpdateProvider(ctx context.Context, in *MsgUpdateProvider, opts ...grpc.CallOption) (*MsgUpdateProviderResponse, error)
+	// DeleteProvider defines a method that deletes a provider given the proper inputs
+	DeleteProvider(ctx context.Context, in *MsgDeleteProvider, opts ...grpc.CallOption) (*MsgDeleteProviderResponse, error)
+}
+
+type msgClient struct {
+	cc grpc1.ClientConn
+}
+
+func NewMsgClient(cc grpc1.ClientConn) MsgClient {
+	return &msgClient{cc}
+}
+
+func (c *msgClient) CreateProvider(ctx context.Context, in *MsgCreateProvider, opts ...grpc.CallOption) (*MsgCreateProviderResponse, error) {
+	out := new(MsgCreateProviderResponse)
+	err := c.cc.Invoke(ctx, "/akash.provider.v1beta1.Msg/CreateProvider", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *msgClient) UpdateProvider(ctx context.Context, in *MsgUpdateProvider, opts ...grpc.CallOption) (*MsgUpdateProviderResponse, error) {
+	out := new(MsgUpdateProviderResponse)
+	err := c.cc.Invoke(ctx, "/akash.provider.v1beta1.Msg/UpdateProvider", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *msgClient) DeleteProvider(ctx context.Context, in *MsgDeleteProvider, opts ...grpc.CallOption) (*MsgDeleteProviderResponse, error) {
+	out := new(MsgDeleteProviderResponse)
+	err := c.cc.Invoke(ctx, "/akash.provider.v1beta1.Msg/DeleteProvider", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// MsgServer is the server API for Msg service.
+type MsgServer interface {
+	// CreateProvider defines a method that creates a provider given the proper inputs
+	CreateProvider(context.Context, *MsgCreateProvider) (*MsgCreateProviderResponse, error)
+	// UpdateProvider defines a method that updates a provider given the proper inputs
+	UpdateProvider(context.Context, *MsgUpdateProvider) (*MsgUpdateProviderResponse, error)
+	// DeleteProvider defines a method that deletes a provider given the proper inputs
+	DeleteProvider(context.Context, *MsgDeleteProvider) (*MsgDeleteProviderResponse, error)
+}
+
+// UnimplementedMsgServer can be embedded to have forward compatible implementations.
+type UnimplementedMsgServer struct {
+}
+
+func (*UnimplementedMsgServer) CreateProvider(ctx context.Context, req *MsgCreateProvider) (*MsgCreateProviderResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method CreateProvider not implemented")
+}
+func (*UnimplementedMsgServer) UpdateProvider(ctx context.Context, req *MsgUpdateProvider) (*MsgUpdateProviderResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method UpdateProvider not implemented")
+}
+func (*UnimplementedMsgServer) DeleteProvider(ctx context.Context, req *MsgDeleteProvider) (*MsgDeleteProviderResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DeleteProvider not implemented")
+}
+
+func RegisterMsgServer(s grpc1.Server, srv MsgServer) {
+	s.RegisterService(&_Msg_serviceDesc, srv)
+}
+
+func _Msg_CreateProvider_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MsgCreateProvider)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MsgServer).CreateProvider(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/akash.provider.v1beta1.Msg/CreateProvider",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MsgServer).CreateProvider(ctx, req.(*MsgCreateProvider))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _Msg_UpdateProvider_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MsgUpdateProvider)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MsgServer).UpdateProvider(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/akash.provider.v1beta1.Msg/UpdateProvider",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MsgServer).UpdateProvider(ctx, req.(*MsgUpdateProvider))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _Msg_DeleteProvider_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MsgDeleteProvider)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MsgServer).DeleteProvider(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/akash.provider.v1beta1.Msg/DeleteProvider",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MsgServer).DeleteProvider(ctx, req.(*MsgDeleteProvider))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _Msg_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "akash.provider.v1beta1.Msg",
+	HandlerType: (*MsgServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "CreateProvider",
+			Handler:    _Msg_CreateProvider_Handler,
+		},
+		{
+			MethodName: "UpdateProvider",
+			Handler:    _Msg_UpdateProvider_Handler,
+		},
+		{
+			MethodName: "DeleteProvider",
+			Handler:    _Msg_DeleteProvider_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "akash/provider/v1beta1/provider.proto",
 }
 
 func (m *MsgCreateProvider) Marshal() (dAtA []byte, err error) {
@@ -341,6 +623,29 @@ func (m *MsgCreateProvider) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	return len(dAtA) - i, nil
 }
 
+func (m *MsgCreateProviderResponse) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalToSizedBuffer(dAtA[:size])
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *MsgCreateProviderResponse) MarshalTo(dAtA []byte) (int, error) {
+	size := m.Size()
+	return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *MsgCreateProviderResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+	i := len(dAtA)
+	_ = i
+	var l int
+	_ = l
+	return len(dAtA) - i, nil
+}
+
 func (m *MsgUpdateProvider) Marshal() (dAtA []byte, err error) {
 	size := m.Size()
 	dAtA = make([]byte, size)
@@ -392,6 +697,29 @@ func (m *MsgUpdateProvider) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	return len(dAtA) - i, nil
 }
 
+func (m *MsgUpdateProviderResponse) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalToSizedBuffer(dAtA[:size])
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *MsgUpdateProviderResponse) MarshalTo(dAtA []byte) (int, error) {
+	size := m.Size()
+	return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *MsgUpdateProviderResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+	i := len(dAtA)
+	_ = i
+	var l int
+	_ = l
+	return len(dAtA) - i, nil
+}
+
 func (m *MsgDeleteProvider) Marshal() (dAtA []byte, err error) {
 	size := m.Size()
 	dAtA = make([]byte, size)
@@ -422,6 +750,29 @@ func (m *MsgDeleteProvider) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	return len(dAtA) - i, nil
 }
 
+func (m *MsgDeleteProviderResponse) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalToSizedBuffer(dAtA[:size])
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *MsgDeleteProviderResponse) MarshalTo(dAtA []byte) (int, error) {
+	size := m.Size()
+	return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *MsgDeleteProviderResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+	i := len(dAtA)
+	_ = i
+	var l int
+	_ = l
+	return len(dAtA) - i, nil
+}
+
 func (m *Provider) Marshal() (dAtA []byte, err error) {
 	size := m.Size()
 	dAtA = make([]byte, size)
@@ -507,6 +858,15 @@ func (m *MsgCreateProvider) Size() (n int) {
 	return n
 }
 
+func (m *MsgCreateProviderResponse) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	return n
+}
+
 func (m *MsgUpdateProvider) Size() (n int) {
 	if m == nil {
 		return 0
@@ -530,6 +890,15 @@ func (m *MsgUpdateProvider) Size() (n int) {
 	return n
 }
 
+func (m *MsgUpdateProviderResponse) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	return n
+}
+
 func (m *MsgDeleteProvider) Size() (n int) {
 	if m == nil {
 		return 0
@@ -543,6 +912,15 @@ func (m *MsgDeleteProvider) Size() (n int) {
 	return n
 }
 
+func (m *MsgDeleteProviderResponse) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	return n
+}
+
 func (m *Provider) Size() (n int) {
 	if m == nil {
 		return 0
@@ -723,6 +1101,59 @@ func (m *MsgCreateProvider) Unmarshal(dAtA []byte) error {
 	}
 	return nil
 }
+func (m *MsgCreateProviderResponse) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowProvider
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: MsgCreateProviderResponse: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: MsgCreateProviderResponse: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		default:
+			iNdEx = preIndex
+			skippy, err := skipProvider(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthProvider
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthProvider
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
 func (m *MsgUpdateProvider) Unmarshal(dAtA []byte) error {
 	l := len(dAtA)
 	iNdEx := 0
@@ -874,6 +1305,59 @@ func (m *MsgUpdateProvider) Unmarshal(dAtA []byte) error {
 	}
 	return nil
 }
+func (m *MsgUpdateProviderResponse) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowProvider
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: MsgUpdateProviderResponse: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: MsgUpdateProviderResponse: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		default:
+			iNdEx = preIndex
+			skippy, err := skipProvider(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthProvider
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthProvider
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
 func (m *MsgDeleteProvider) Unmarshal(dAtA []byte) error {
 	l := len(dAtA)
 	iNdEx := 0
@@ -959,6 +1443,59 @@ func (m *MsgDeleteProvider) Unmarshal(dAtA []byte) error {
 	}
 	return nil
 }
+func (m *MsgDeleteProviderResponse) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowProvider
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: MsgDeleteProviderResponse: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: MsgDeleteProviderResponse: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		default:
+			iNdEx = preIndex
+			skippy, err := skipProvider(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthProvider
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthProvider
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
 func (m *Provider) Unmarshal(dAtA []byte) error {
 	l := len(dAtA)
 	iNdEx := 0


Test patch:
diff --git a/_build/Dockerfile.test b/_build/Dockerfile.test
new file mode 100644
index 00000000..37b8015c
--- /dev/null
+++ b/_build/Dockerfile.test
@@ -0,0 +1,35 @@
+# Simple usage with a mounted data directory:
+# > docker build -t gaia .
+# > docker run -it -p 46657:46657 -p 46656:46656 -v ~/.gaiad:/root/.gaiad -v ~/.gaiacli:/root/.gaiacli gaia gaiad init
+# > docker run -it -p 46657:46657 -p 46656:46656 -v ~/.gaiad:/root/.gaiad -v ~/.gaiacli:/root/.gaiacli gaia gaiad start
+FROM golang:alpine AS build-env
+
+# Set up dependencies
+ENV PACKAGES curl make git libc-dev bash gcc linux-headers eudev-dev python2
+
+# Set working directory for the build
+WORKDIR /go/src/github.com/ovrclk/akash
+
+# Add source files
+COPY . .
+
+# Install minimum necessary dependencies, build Cosmos SDK, remove packages
+RUN apk add --no-cache $PACKAGES && \
+    make install
+
+# Final image
+FROM alpine:edge
+
+# Install ca-certificates
+RUN apk add --update ca-certificates
+WORKDIR /root
+
+# Copy over binaries from the build-env
+COPY --from=build-env /go/bin/akash /usr/bin/akash
+
+COPY ./_build/single-node.sh .
+
+EXPOSE 26657
+
+ENTRYPOINT [ "./single-node.sh" ]
+# NOTE: to run this image, docker run -d -p 26657:26657 ./single-node.sh {{chain_id}} {{genesis_account}}
\ No newline at end of file
diff --git a/app/app_test.go b/app/app_test.go
index 1f9b6353..e7854152 100644
--- a/app/app_test.go
+++ b/app/app_test.go
@@ -9,6 +9,7 @@ import (
 	"github.com/tendermint/tendermint/libs/log"
 	dbm "github.com/tendermint/tm-db"
 
+	"github.com/cosmos/cosmos-sdk/simapp"
 	"github.com/ovrclk/akash/app"
 	abci "github.com/tendermint/tendermint/abci/types"
 )
@@ -16,7 +17,7 @@ import (
 func TestAppExport(t *testing.T) {
 	db := dbm.NewMemDB()
 	app1 := app.NewApp(log.NewTMLogger(log.NewSyncWriter(os.Stdout)),
-		db, nil, true, 0, map[int64]bool{}, app.DefaultHome)
+		db, nil, true, 0, map[int64]bool{}, app.DefaultHome, simapp.EmptyAppOptions{})
 
 	genesisState := app.NewDefaultGenesisState()
 	stateBytes, err := json.MarshalIndent(genesisState, "", "  ")
@@ -32,7 +33,7 @@ func TestAppExport(t *testing.T) {
 	app1.Commit()
 
 	// Making a new app object with the db, so that initchain hasn't been called
-	app2 := app.NewApp(log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, 0, map[int64]bool{}, app.DefaultHome)
+	app2 := app.NewApp(log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, 0, map[int64]bool{}, app.DefaultHome, simapp.EmptyAppOptions{})
 	_, err = app2.ExportAppStateAndValidators(false, []string{})
 	require.NoError(t, err, "ExportAppStateAndValidators should not have an error")
 }
diff --git a/app/sim_test.go b/app/sim_test.go
index c96c699e..962fecef 100644
--- a/app/sim_test.go
+++ b/app/sim_test.go
@@ -66,6 +66,7 @@ func simulateFromSeedFunc(t *testing.T, newApp *AkashApp, config simtypes.Config
 		simtypes.RandomAccounts, // Replace with own random account function if using keys other than secp256k1
 		simapp.SimulationOperations(newApp, newApp.AppCodec(), config),
 		newApp.ModuleAccountAddrs(), config,
+		newApp.AppCodec(),
 	)
 }
 
@@ -82,7 +83,7 @@ func TestFullAppSimulation(t *testing.T) {
 		require.NoError(t, os.RemoveAll(dir))
 	}()
 
-	app1 := NewApp(logger, db, nil, true, simapp.FlagPeriodValue, map[int64]bool{}, DefaultHome, fauxMerkleModeOpt)
+	app1 := NewApp(logger, db, nil, true, simapp.FlagPeriodValue, map[int64]bool{}, DefaultHome, simapp.EmptyAppOptions{}, fauxMerkleModeOpt)
 	require.Equal(t, "akash", app1.Name())
 
 	fmt.Printf("config-------- %v", config)
@@ -111,7 +112,7 @@ func TestAppImportExport(t *testing.T) {
 		require.NoError(t, os.RemoveAll(dir))
 	}()
 
-	app := NewApp(logger, db, nil, true, simapp.FlagPeriodValue, map[int64]bool{}, DefaultHome, fauxMerkleModeOpt)
+	app := NewApp(logger, db, nil, true, simapp.FlagPeriodValue, map[int64]bool{}, DefaultHome, simapp.EmptyAppOptions{}, fauxMerkleModeOpt)
 	require.Equal(t, AppName, app.Name())
 
 	// Run randomized simulation
@@ -141,7 +142,7 @@ func TestAppImportExport(t *testing.T) {
 		require.NoError(t, os.RemoveAll(newDir))
 	}()
 
-	newApp := NewApp(log.NewNopLogger(), newDB, nil, true, simapp.FlagPeriodValue, map[int64]bool{}, DefaultHome, fauxMerkleModeOpt)
+	newApp := NewApp(log.NewNopLogger(), newDB, nil, true, simapp.FlagPeriodValue, map[int64]bool{}, DefaultHome, simapp.EmptyAppOptions{}, fauxMerkleModeOpt)
 	require.Equal(t, AppName, newApp.Name())
 
 	var genesisState simapp.GenesisState
@@ -201,7 +202,7 @@ func TestAppSimulationAfterImport(t *testing.T) {
 		require.NoError(t, os.RemoveAll(dir))
 	}()
 
-	app := NewApp(logger, db, nil, true, simapp.FlagPeriodValue, map[int64]bool{}, DefaultHome, fauxMerkleModeOpt)
+	app := NewApp(logger, db, nil, true, simapp.FlagPeriodValue, map[int64]bool{}, DefaultHome, simapp.EmptyAppOptions{}, fauxMerkleModeOpt)
 	require.Equal(t, AppName, app.Name())
 
 	// Run randomized simulation
@@ -236,7 +237,7 @@ func TestAppSimulationAfterImport(t *testing.T) {
 		require.NoError(t, os.RemoveAll(newDir))
 	}()
 
-	newApp := NewApp(log.NewNopLogger(), newDB, nil, true, simapp.FlagPeriodValue, map[int64]bool{}, DefaultHome, fauxMerkleModeOpt)
+	newApp := NewApp(log.NewNopLogger(), newDB, nil, true, simapp.FlagPeriodValue, map[int64]bool{}, DefaultHome, simapp.EmptyAppOptions{}, fauxMerkleModeOpt)
 	require.Equal(t, AppName, newApp.Name())
 
 	newApp.InitChain(abci.RequestInitChain{
@@ -276,7 +277,7 @@ func TestAppStateDeterminism(t *testing.T) {
 
 			db := dbm.NewMemDB()
 
-			app := NewApp(logger, db, nil, true, simapp.FlagPeriodValue, map[int64]bool{}, DefaultHome, interBlockCacheOpt())
+			app := NewApp(logger, db, nil, true, simapp.FlagPeriodValue, map[int64]bool{}, DefaultHome, simapp.EmptyAppOptions{}, interBlockCacheOpt())
 
 			fmt.Printf(
 				"running non-determinism simulation; seed %d: %d/%d, attempt: %d/%d\n",
diff --git a/testutil/types.go b/testutil/types.go
index 35e303cc..8378b6df 100644
--- a/testutil/types.go
+++ b/testutil/types.go
@@ -17,6 +17,7 @@ import (
 	tmrand "github.com/tendermint/tendermint/libs/rand"
 	dbm "github.com/tendermint/tm-db"
 
+	"github.com/cosmos/cosmos-sdk/simapp"
 	"github.com/ovrclk/akash/app"
 	"github.com/ovrclk/akash/types"
 )
@@ -51,6 +52,7 @@ func ResourceUnits(_ testing.TB) types.ResourceUnits {
 func NewApp(val network.Validator) servertypes.Application {
 	return app.NewApp(
 		val.Ctx.Logger, dbm.NewMemDB(), nil, true, 0, make(map[int64]bool), val.Ctx.Config.RootDir,
+		simapp.EmptyAppOptions{},
 		baseapp.SetPruning(storetypes.NewPruningOptionsFromString(val.AppConfig.Pruning)),
 		baseapp.SetMinGasPrices(val.AppConfig.MinGasPrices),
 	)