Skip to content

Commit 704ab77

Browse files
authored
Integration of wasm module to application (#92)
1 parent 34ab07e commit 704ab77

8 files changed

Lines changed: 281 additions & 6 deletions

File tree

app/ante.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package app
2+
3+
import (
4+
"errors"
5+
6+
corestoretypes "cosmossdk.io/core/store"
7+
circuitante "cosmossdk.io/x/circuit/ante"
8+
circuitkeeper "cosmossdk.io/x/circuit/keeper"
9+
wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper"
10+
wasmTypes "github.com/CosmWasm/wasmd/x/wasm/types"
11+
sdk "github.com/cosmos/cosmos-sdk/types"
12+
"github.com/cosmos/cosmos-sdk/x/auth/ante"
13+
ibcante "github.com/cosmos/ibc-go/v8/modules/core/ante"
14+
"github.com/cosmos/ibc-go/v8/modules/core/keeper"
15+
)
16+
17+
// HandlerOptions extend the SDK's AnteHandler options by requiring the IBC
18+
// channel keeper.
19+
type HandlerOptions struct {
20+
ante.HandlerOptions
21+
22+
IBCKeeper *keeper.Keeper
23+
WasmConfig *wasmTypes.WasmConfig
24+
WasmKeeper *wasmkeeper.Keeper
25+
TXCounterStoreService corestoretypes.KVStoreService
26+
CircuitKeeper *circuitkeeper.Keeper
27+
}
28+
29+
// NewAnteHandler constructor
30+
func NewAnteHandler(options HandlerOptions) (sdk.AnteHandler, error) {
31+
if options.AccountKeeper == nil {
32+
return nil, errors.New("account keeper is required for ante builder")
33+
}
34+
if options.BankKeeper == nil {
35+
return nil, errors.New("bank keeper is required for ante builder")
36+
}
37+
if options.SignModeHandler == nil {
38+
return nil, errors.New("sign mode handler is required for ante builder")
39+
}
40+
if options.WasmConfig == nil {
41+
return nil, errors.New("wasm config is required for ante builder")
42+
}
43+
if options.TXCounterStoreService == nil {
44+
return nil, errors.New("wasm store service is required for ante builder")
45+
}
46+
if options.CircuitKeeper == nil {
47+
return nil, errors.New("circuit keeper is required for ante builder")
48+
}
49+
50+
anteDecorators := []sdk.AnteDecorator{
51+
ante.NewSetUpContextDecorator(), // outermost AnteDecorator. SetUpContext must be called first
52+
wasmkeeper.NewLimitSimulationGasDecorator(options.WasmConfig.SimulationGasLimit), // after setup context to enforce limits early
53+
wasmkeeper.NewCountTXDecorator(options.TXCounterStoreService),
54+
wasmkeeper.NewGasRegisterDecorator(options.WasmKeeper.GetGasRegister()),
55+
circuitante.NewCircuitBreakerDecorator(options.CircuitKeeper),
56+
ante.NewExtensionOptionsDecorator(options.ExtensionOptionChecker),
57+
ante.NewValidateBasicDecorator(),
58+
ante.NewTxTimeoutHeightDecorator(),
59+
ante.NewValidateMemoDecorator(options.AccountKeeper),
60+
ante.NewConsumeGasForTxSizeDecorator(options.AccountKeeper),
61+
ante.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper, options.TxFeeChecker),
62+
ante.NewSetPubKeyDecorator(options.AccountKeeper), // SetPubKeyDecorator must be called before all signature verification decorators
63+
ante.NewValidateSigCountDecorator(options.AccountKeeper),
64+
ante.NewSigGasConsumeDecorator(options.AccountKeeper, options.SigGasConsumer),
65+
ante.NewSigVerificationDecorator(options.AccountKeeper, options.SignModeHandler),
66+
ante.NewIncrementSequenceDecorator(options.AccountKeeper),
67+
ibcante.NewRedundantRelayDecorator(options.IBCKeeper),
68+
}
69+
70+
return sdk.ChainAnteDecorators(anteDecorators...), nil
71+
}

app/app.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ import (
7878
overlockmodulekeeper "overlock/x/crossplane/keeper"
7979
storagemodulekeeper "overlock/x/storage/keeper"
8080

81+
wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper"
82+
tmproto "github.com/cometbft/cometbft/proto/tendermint/types"
83+
8184
// this line is used by starport scaffolding # stargate/app/moduleImport
8285

8386
"overlock/docs"
@@ -145,6 +148,10 @@ type App struct {
145148

146149
OverlockKeeper overlockmodulekeeper.Keeper
147150
StorageKeeper storagemodulekeeper.Keeper
151+
152+
// CosmWasm
153+
WasmKeeper wasmkeeper.Keeper
154+
ScopedWasmKeeper capabilitykeeper.ScopedKeeper
148155
// this line is used by starport scaffolding # stargate/app/keeperDeclaration
149156

150157
// simulation manager
@@ -298,7 +305,8 @@ func New(
298305
return nil, err
299306
}
300307

301-
return app, nil
308+
return app, app.WasmKeeper.
309+
InitializePinnedCodes(app.NewUncachedContext(true, tmproto.Header{}))
302310
}
303311

304312
// LegacyAmino returns App's amino codec.

app/app_config.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
"cosmossdk.io/x/feegrant"
3232
"cosmossdk.io/x/nft"
3333
upgradetypes "cosmossdk.io/x/upgrade/types"
34+
wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types"
3435
"github.com/cosmos/cosmos-sdk/runtime"
3536
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
3637
vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types"
@@ -103,6 +104,7 @@ var (
103104
// chain modules
104105
overlockmoduletypes.ModuleName,
105106
storagemoduletypes.ModuleName,
107+
wasmtypes.ModuleName,
106108
// this line is used by starport scaffolding # stargate/app/initGenesis
107109
}
108110

@@ -129,6 +131,7 @@ var (
129131
// chain modules
130132
overlockmoduletypes.ModuleName,
131133
storagemoduletypes.ModuleName,
134+
wasmtypes.ModuleName,
132135
// this line is used by starport scaffolding # stargate/app/beginBlockers
133136
}
134137

@@ -149,6 +152,7 @@ var (
149152
// chain modules
150153
overlockmoduletypes.ModuleName,
151154
storagemoduletypes.ModuleName,
155+
wasmtypes.ModuleName,
152156
// this line is used by starport scaffolding # stargate/app/endBlockers
153157
}
154158

@@ -169,6 +173,7 @@ var (
169173
{Account: ibctransfertypes.ModuleName, Permissions: []string{authtypes.Minter, authtypes.Burner}},
170174
{Account: ibcfeetypes.ModuleName},
171175
{Account: icatypes.ModuleName},
176+
{Account: wasmtypes.ModuleName, Permissions: []string{authtypes.Burner}},
172177
// this line is used by starport scaffolding # stargate/app/maccPerms
173178
}
174179

app/ibc.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ package app
33
import (
44
"cosmossdk.io/core/appmodule"
55
storetypes "cosmossdk.io/store/types"
6+
"github.com/CosmWasm/wasmd/x/wasm"
7+
wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types"
68
cdctypes "github.com/cosmos/cosmos-sdk/codec/types"
79
servertypes "github.com/cosmos/cosmos-sdk/server/types"
8-
"github.com/cosmos/cosmos-sdk/types/module"
910
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
1011
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
1112
govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1"
@@ -160,6 +161,11 @@ func (app *App) registerIBCModules(appOpts servertypes.AppOptions) error {
160161
AddRoute(icacontrollertypes.SubModuleName, icaControllerIBCModule).
161162
AddRoute(icahosttypes.SubModuleName, icaHostIBCModule)
162163

164+
wasmStack, err := app.registerWasmModules(appOpts)
165+
if err != nil {
166+
return err
167+
}
168+
ibcRouter.AddRoute(wasmtypes.ModuleName, wasmStack)
163169
// this line is used by starport scaffolding # ibc/app/module
164170

165171
app.IBCKeeper.SetRouter(ibcRouter)
@@ -197,10 +203,15 @@ func RegisterIBC(registry cdctypes.InterfaceRegistry) map[string]appmodule.AppMo
197203
capabilitytypes.ModuleName: capability.AppModule{},
198204
ibctm.ModuleName: ibctm.AppModule{},
199205
solomachine.ModuleName: solomachine.AppModule{},
206+
wasmtypes.ModuleName: wasm.AppModule{},
200207
}
201208

202-
for name, m := range modules {
203-
module.CoreAppModuleBasicAdaptor(name, m).RegisterInterfaces(registry)
209+
for _, module := range modules {
210+
if mod, ok := module.(interface {
211+
RegisterInterfaces(registry cdctypes.InterfaceRegistry)
212+
}); ok {
213+
mod.RegisterInterfaces(registry)
214+
}
204215
}
205216

206217
return modules

app/wasm.go

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
package app
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
7+
storetypes "cosmossdk.io/store/types"
8+
"github.com/CosmWasm/wasmd/x/wasm"
9+
wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper"
10+
wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types"
11+
"github.com/cosmos/cosmos-sdk/client"
12+
"github.com/cosmos/cosmos-sdk/runtime"
13+
servertypes "github.com/cosmos/cosmos-sdk/server/types"
14+
"github.com/cosmos/cosmos-sdk/types/msgservice"
15+
"github.com/cosmos/cosmos-sdk/x/auth/ante"
16+
"github.com/cosmos/cosmos-sdk/x/auth/posthandler"
17+
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
18+
distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper"
19+
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
20+
"github.com/cosmos/gogoproto/proto"
21+
ibcfee "github.com/cosmos/ibc-go/v8/modules/apps/29-fee"
22+
porttypes "github.com/cosmos/ibc-go/v8/modules/core/05-port/types"
23+
)
24+
25+
// AllCapabilities returns all capabilities available with the current wasmvm
26+
// See https://github.com/CosmWasm/cosmwasm/blob/main/docs/CAPABILITIES-BUILT-IN.md
27+
// This functionality is going to be moved upstream: https://github.com/CosmWasm/wasmvm/issues/425
28+
func AllCapabilities() []string {
29+
return []string{
30+
"iterator",
31+
"staking",
32+
"stargate",
33+
"cosmwasm_1_1",
34+
"cosmwasm_1_2",
35+
"cosmwasm_1_3",
36+
"cosmwasm_1_4",
37+
}
38+
}
39+
40+
// registerWasmModules register CosmWasm keepers and non dependency inject modules.
41+
func (app *App) registerWasmModules(
42+
appOpts servertypes.AppOptions,
43+
wasmOpts ...wasmkeeper.Option,
44+
) (porttypes.IBCModule, error) {
45+
// set up non depinject support modules store keys
46+
if err := app.RegisterStores(
47+
storetypes.NewKVStoreKey(wasmtypes.StoreKey),
48+
); err != nil {
49+
panic(err)
50+
}
51+
52+
scopedWasmKeeper := app.CapabilityKeeper.ScopeToModule(wasmtypes.ModuleName)
53+
54+
wasmConfig, err := wasm.ReadWasmConfig(appOpts)
55+
if err != nil {
56+
return nil, fmt.Errorf("error while reading wasm config: %s", err)
57+
}
58+
59+
availableCapabilities := strings.Join(AllCapabilities(), ",")
60+
app.WasmKeeper = wasmkeeper.NewKeeper(
61+
app.AppCodec(),
62+
runtime.NewKVStoreService(app.GetKey(wasmtypes.StoreKey)),
63+
app.AccountKeeper,
64+
app.BankKeeper,
65+
app.StakingKeeper,
66+
distrkeeper.NewQuerier(app.DistrKeeper),
67+
app.IBCFeeKeeper, // ISC4 Wrapper: fee IBC middleware
68+
app.IBCKeeper.ChannelKeeper,
69+
app.IBCKeeper.PortKeeper,
70+
scopedWasmKeeper,
71+
app.TransferKeeper,
72+
app.MsgServiceRouter(),
73+
app.GRPCQueryRouter(),
74+
DefaultNodeHome,
75+
wasmConfig,
76+
availableCapabilities,
77+
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
78+
wasmOpts...,
79+
)
80+
81+
// register IBC modules
82+
if err := app.RegisterModules(
83+
wasm.NewAppModule(
84+
app.AppCodec(),
85+
&app.WasmKeeper,
86+
app.StakingKeeper,
87+
app.AccountKeeper,
88+
app.BankKeeper,
89+
app.MsgServiceRouter(),
90+
app.GetSubspace(wasmtypes.ModuleName),
91+
)); err != nil {
92+
return nil, err
93+
}
94+
95+
if err := app.setAnteHandler(app.txConfig, wasmConfig, app.GetKey(wasmtypes.StoreKey)); err != nil {
96+
return nil, err
97+
}
98+
99+
if manager := app.SnapshotManager(); manager != nil {
100+
err := manager.RegisterExtensions(
101+
wasmkeeper.NewWasmSnapshotter(app.CommitMultiStore(), &app.WasmKeeper),
102+
)
103+
if err != nil {
104+
return nil, fmt.Errorf("failed to register snapshot extension: %s", err)
105+
}
106+
}
107+
app.ScopedWasmKeeper = scopedWasmKeeper
108+
109+
if err := app.setPostHandler(); err != nil {
110+
return nil, err
111+
}
112+
113+
// At startup, after all modules have been registered, check that all proto
114+
// annotations are correct.
115+
protoFiles, err := proto.MergedRegistry()
116+
if err != nil {
117+
return nil, err
118+
}
119+
err = msgservice.ValidateProtoAnnotations(protoFiles)
120+
if err != nil {
121+
return nil, err
122+
}
123+
124+
// Create fee enabled wasm ibc Stack
125+
var wasmStack porttypes.IBCModule
126+
wasmStack = wasm.NewIBCHandler(app.WasmKeeper, app.IBCKeeper.ChannelKeeper, app.IBCFeeKeeper)
127+
wasmStack = ibcfee.NewIBCMiddleware(wasmStack, app.IBCFeeKeeper)
128+
129+
return wasmStack, nil
130+
}
131+
132+
func (app *App) setPostHandler() error {
133+
postHandler, err := posthandler.NewPostHandler(
134+
posthandler.HandlerOptions{},
135+
)
136+
if err != nil {
137+
return err
138+
}
139+
app.SetPostHandler(postHandler)
140+
return nil
141+
}
142+
143+
func (app *App) setAnteHandler(txConfig client.TxConfig, wasmConfig wasmtypes.WasmConfig, txCounterStoreKey *storetypes.KVStoreKey) error {
144+
anteHandler, err := NewAnteHandler(
145+
HandlerOptions{
146+
HandlerOptions: ante.HandlerOptions{
147+
AccountKeeper: app.AccountKeeper,
148+
BankKeeper: app.BankKeeper,
149+
SignModeHandler: txConfig.SignModeHandler(),
150+
FeegrantKeeper: app.FeeGrantKeeper,
151+
SigGasConsumer: ante.DefaultSigVerificationGasConsumer,
152+
},
153+
IBCKeeper: app.IBCKeeper,
154+
WasmConfig: &wasmConfig,
155+
WasmKeeper: &app.WasmKeeper,
156+
TXCounterStoreService: runtime.NewKVStoreService(txCounterStoreKey),
157+
CircuitKeeper: &app.CircuitBreakerKeeper,
158+
},
159+
)
160+
if err != nil {
161+
return fmt.Errorf("failed to create AnteHandler: %s", err)
162+
}
163+
164+
// Set the AnteHandler for the app
165+
app.SetAnteHandler(anteHandler)
166+
return nil
167+
}

cmd/overlockd/cmd/commands.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@ import (
44
"errors"
55
"io"
66

7+
"overlock/app"
8+
79
"cosmossdk.io/log"
810
confixcmd "cosmossdk.io/tools/confix/cmd"
11+
"github.com/CosmWasm/wasmd/x/wasm"
12+
wasmcli "github.com/CosmWasm/wasmd/x/wasm/client/cli"
913
dbm "github.com/cosmos/cosmos-db"
1014
"github.com/cosmos/cosmos-sdk/client"
1115
"github.com/cosmos/cosmos-sdk/client/debug"
@@ -23,8 +27,6 @@ import (
2327
genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli"
2428
"github.com/spf13/cobra"
2529
"github.com/spf13/viper"
26-
27-
"overlock/app"
2830
)
2931

3032
func initRootCmd(
@@ -52,10 +54,14 @@ func initRootCmd(
5254
txCommand(),
5355
keys.Commands(),
5456
)
57+
wasmcli.ExtendUnsafeResetAllCmd(
58+
rootCmd,
59+
)
5560
}
5661

5762
func addModuleInitFlags(startCmd *cobra.Command) {
5863
crisis.AddModuleInitFlags(startCmd)
64+
wasm.AddModuleInitFlags(startCmd)
5965
}
6066

6167
// genesisCommand builds genesis-related `overlockd genesis` command. Users may provide application specific commands as a parameter

0 commit comments

Comments
 (0)