Skip to content

Commit

Permalink
feat: enable wasm light clients on IBC (08-wasm) (#2068)
Browse files Browse the repository at this point in the history
* feat: enable wasm light clients on IBC (08-wasm)

* chore: check if wasm client is already on params

* chore(changelog): move to before evm audit

---------

Co-authored-by: Kevin Yang <[email protected]>
  • Loading branch information
helder-moreira and k-yang authored Oct 31, 2024
1 parent bf70839 commit ee5e29f
Show file tree
Hide file tree
Showing 14 changed files with 118 additions and 13 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ for (1) ERC20 transfers with tokens that return false success values instead of
throwing an error and (2) ERC20 transfers with other operations that don't bring
about the expected resulting balance for the transfer recipient.
- [#2092](https://github.com/NibiruChain/nibiru/pull/2092) - feat(evm): add validation for wasm multi message execution
- [#2068](https://github.com/NibiruChain/nibiru/pull/2068) - feat: enable wasm light clients on IBC (08-wasm)
- [#2101](https://github.com/NibiruChain/nibiru/pull/2101) - fix(evm): tx receipt proper marshalling

#### Nibiru EVM | Before Audit 1 - 2024-10-18
Expand Down
14 changes: 14 additions & 0 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ import (

wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper"
wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types"
cmtos "github.com/cometbft/cometbft/libs/os"
cmtproto "github.com/cometbft/cometbft/proto/tendermint/types"
ibcwasmkeeper "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/keeper"

"github.com/NibiruChain/nibiru/v2/app/ante"
"github.com/NibiruChain/nibiru/v2/app/wasmext"
Expand Down Expand Up @@ -240,6 +243,10 @@ func NewNibiruApp(
app.CommitMultiStore(),
&app.WasmKeeper,
),
ibcwasmkeeper.NewWasmSnapshotter(
app.CommitMultiStore(),
&app.WasmClientKeeper,
),
); err != nil {
panic("failed to add wasm snapshot extension.")
}
Expand All @@ -250,6 +257,13 @@ func NewNibiruApp(
tmos.Exit(err.Error())
}

ctx := app.BaseApp.NewUncachedContext(true, cmtproto.Header{})

// Initialize pinned codes in wasmvm as they are not persisted there
if err := ibcwasmkeeper.InitializePinnedCodes(ctx, app.appCodec); err != nil {
cmtos.Exit(fmt.Sprintf("failed to initialize pinned codes %s", err))
}

/* Applications that wish to enforce statically created ScopedKeepers should
call `Seal` after creating their scoped modules in `NewApp` with
`capabilityKeeper.ScopeToModule`.
Expand Down
34 changes: 30 additions & 4 deletions app/keepers.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import (
"path/filepath"
"strings"

ibcwasm "github.com/cosmos/ibc-go/modules/light-clients/08-wasm"
ibcwasmkeeper "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/keeper"
ica "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts"
icacontroller "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller"
icacontrollerkeeper "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/keeper"
Expand All @@ -16,6 +18,7 @@ import (
"github.com/CosmWasm/wasmd/x/wasm"
wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper"
wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types"
wasmvm "github.com/CosmWasm/wasmvm"
_ "github.com/cosmos/cosmos-sdk/client/docs/statik"
"github.com/cosmos/cosmos-sdk/client/flags"
"github.com/cosmos/cosmos-sdk/codec"
Expand Down Expand Up @@ -84,6 +87,7 @@ import (
// ---------------------------------------------------------------
// IBC imports

ibcwasmtypes "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/types"
icahostkeeper "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/keeper"
ibcfee "github.com/cosmos/ibc-go/v7/modules/apps/29-fee"
ibcfeekeeper "github.com/cosmos/ibc-go/v7/modules/apps/29-fee/keeper"
Expand Down Expand Up @@ -121,19 +125,21 @@ import (
"github.com/NibiruChain/nibiru/v2/x/inflation"
inflationkeeper "github.com/NibiruChain/nibiru/v2/x/inflation/keeper"
inflationtypes "github.com/NibiruChain/nibiru/v2/x/inflation/types"
oracle "github.com/NibiruChain/nibiru/v2/x/oracle"
"github.com/NibiruChain/nibiru/v2/x/oracle"
oraclekeeper "github.com/NibiruChain/nibiru/v2/x/oracle/keeper"
oracletypes "github.com/NibiruChain/nibiru/v2/x/oracle/types"

"github.com/NibiruChain/nibiru/v2/x/sudo"
"github.com/NibiruChain/nibiru/v2/x/sudo/keeper"
sudotypes "github.com/NibiruChain/nibiru/v2/x/sudo/types"

tokenfactory "github.com/NibiruChain/nibiru/v2/x/tokenfactory"
"github.com/NibiruChain/nibiru/v2/x/tokenfactory"
tokenfactorykeeper "github.com/NibiruChain/nibiru/v2/x/tokenfactory/keeper"
tokenfactorytypes "github.com/NibiruChain/nibiru/v2/x/tokenfactory/types"
)

const wasmVmContractMemoryLimit = 32

type AppKeepers struct {
keepers.PublicKeepers
privateKeepers
Expand Down Expand Up @@ -193,6 +199,7 @@ func initStoreKeys() (
ibcexported.StoreKey,
icahosttypes.StoreKey,
icacontrollertypes.StoreKey,
ibcwasmtypes.StoreKey,

// nibiru x/ keys
oracletypes.StoreKey,
Expand Down Expand Up @@ -253,7 +260,7 @@ func (app *NibiruApp) InitKeepers(
// seal capability keeper after scoping modules
// app.capabilityKeeper.Seal()

// TODO: chore(upgrade): Potential breaking change on AccountKeeper dur
// TODO: chore(upgrade): Potential breaking change on AccountKeeper due
// to ProtoBaseAccount replacement.
app.AccountKeeper = authkeeper.NewAccountKeeper(
appCodec,
Expand Down Expand Up @@ -450,6 +457,13 @@ func (app *NibiruApp) InitKeepers(
// For example, if there are bindings for the x/inflation module, then the app
// passed to GetWasmOpts must already have a non-nil InflationKeeper.
supportedFeatures := strings.Join(wasmdapp.AllCapabilities(), ",")

// Create wasm VM outside keeper so it can be re-used in client keeper
wasmVM, err := wasmvm.NewVM(filepath.Join(wasmDir, "wasm"), supportedFeatures, wasmVmContractMemoryLimit, wasmConfig.ContractDebugMode, wasmConfig.MemoryCacheSize)
if err != nil {
panic(err)
}

app.WasmKeeper = wasmkeeper.NewKeeper(
appCodec,
keys[wasmtypes.StoreKey],
Expand All @@ -468,7 +482,16 @@ func (app *NibiruApp) InitKeepers(
wasmConfig,
supportedFeatures,
govModuleAddr,
GetWasmOpts(*app, appOpts)...,
append(GetWasmOpts(*app, appOpts), wasmkeeper.WithWasmEngine(wasmVM))...,
)

app.WasmClientKeeper = ibcwasmkeeper.NewKeeperWithVM(
appCodec,
keys[ibcwasmtypes.StoreKey],
app.ibcKeeper.ClientKeeper,
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
wasmVM,
app.GRPCQueryRouter(),
)

// DevGas uses WasmKeeper
Expand Down Expand Up @@ -632,6 +655,7 @@ func (app *NibiruApp) initAppModules(
ibctransfer.NewAppModule(app.ibcTransferKeeper),
ibcfee.NewAppModule(app.ibcFeeKeeper),
ica.NewAppModule(&app.icaControllerKeeper, &app.icaHostKeeper),
ibcwasm.NewAppModule(app.WasmClientKeeper),

evmmodule.NewAppModule(&app.EvmKeeper, app.AccountKeeper),

Expand Down Expand Up @@ -703,6 +727,7 @@ func orderedModuleNames() []string {
ibcexported.ModuleName,
ibcfeetypes.ModuleName,
icatypes.ModuleName,
ibcwasmtypes.ModuleName,

// --------------------------------------------------------------------
evm.ModuleName,
Expand Down Expand Up @@ -809,6 +834,7 @@ func ModuleBasicManager() module.BasicManager {
ibctransfer.AppModuleBasic{},
ibctm.AppModuleBasic{},
ica.AppModuleBasic{},
ibcwasm.AppModuleBasic{},
// native x/
evmmodule.AppModuleBasic{},
oracle.AppModuleBasic{},
Expand Down
2 changes: 2 additions & 0 deletions app/keepers/all_keepers.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper"
feegrantkeeper "github.com/cosmos/cosmos-sdk/x/feegrant/keeper"
govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper"
ibcwasmkeeper "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/keeper"

stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper"

Expand Down Expand Up @@ -68,4 +69,5 @@ type PublicKeepers struct {
// WASM keepers
WasmKeeper wasmkeeper.Keeper
ScopedWasmKeeper capabilitykeeper.ScopedKeeper
WasmClientKeeper ibcwasmkeeper.Keeper
}
4 changes: 3 additions & 1 deletion app/upgrades.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,15 @@ import (
"github.com/NibiruChain/nibiru/v2/app/upgrades/v1_2_0"
"github.com/NibiruChain/nibiru/v2/app/upgrades/v1_3_0"
"github.com/NibiruChain/nibiru/v2/app/upgrades/v1_4_0"
"github.com/NibiruChain/nibiru/v2/app/upgrades/v2_1_0"
)

var Upgrades = []upgrades.Upgrade{
v1_1_0.Upgrade,
v1_2_0.Upgrade,
v1_3_0.Upgrade,
v1_4_0.Upgrade,
v2_1_0.Upgrade,
}

func (app *NibiruApp) setupUpgrades() {
Expand All @@ -26,7 +28,7 @@ func (app *NibiruApp) setupUpgrades() {

func (app *NibiruApp) setUpgradeHandlers() {
for _, u := range Upgrades {
app.upgradeKeeper.SetUpgradeHandler(u.UpgradeName, u.CreateUpgradeHandler(app.ModuleManager, app.configurator))
app.upgradeKeeper.SetUpgradeHandler(u.UpgradeName, u.CreateUpgradeHandler(app.ModuleManager, app.configurator, app.ibcKeeper.ClientKeeper))
}
}

Expand Down
4 changes: 3 additions & 1 deletion app/upgrades/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@ import (
store "github.com/cosmos/cosmos-sdk/store/types"
"github.com/cosmos/cosmos-sdk/types/module"
"github.com/cosmos/cosmos-sdk/x/upgrade/types"

clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper"
)

type Upgrade struct {
UpgradeName string

CreateUpgradeHandler func(*module.Manager, module.Configurator) types.UpgradeHandler
CreateUpgradeHandler func(*module.Manager, module.Configurator, clientkeeper.Keeper) types.UpgradeHandler

StoreUpgrades store.StoreUpgrades
}
3 changes: 2 additions & 1 deletion app/upgrades/v1_1_0/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/module"
upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper"

"github.com/NibiruChain/nibiru/v2/app/upgrades"
inflationtypes "github.com/NibiruChain/nibiru/v2/x/inflation/types"
Expand All @@ -14,7 +15,7 @@ const UpgradeName = "v1.1.0"

var Upgrade = upgrades.Upgrade{
UpgradeName: UpgradeName,
CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler {
CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator, clientKeeper clientkeeper.Keeper) upgradetypes.UpgradeHandler {
return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) {
return mm.RunMigrations(ctx, cfg, fromVM)
}
Expand Down
3 changes: 2 additions & 1 deletion app/upgrades/v1_2_0/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/module"
upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper"

"github.com/NibiruChain/nibiru/v2/app/upgrades"
)
Expand All @@ -13,7 +14,7 @@ const UpgradeName = "v1.2.0"

var Upgrade = upgrades.Upgrade{
UpgradeName: UpgradeName,
CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler {
CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator, clientKeeper clientkeeper.Keeper) upgradetypes.UpgradeHandler {
return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) {
return mm.RunMigrations(ctx, cfg, fromVM)
}
Expand Down
3 changes: 2 additions & 1 deletion app/upgrades/v1_3_0/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
icahosttypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/types"
icatypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/types"
ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper"

"github.com/NibiruChain/nibiru/v2/app/upgrades"
)
Expand All @@ -22,7 +23,7 @@ const UpgradeName = "v1.3.0"

var Upgrade = upgrades.Upgrade{
UpgradeName: UpgradeName,
CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler {
CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator, clientKeeper clientkeeper.Keeper) upgradetypes.UpgradeHandler {
return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) {
// set the ICS27 consensus version so InitGenesis is not run
fromVM[icatypes.ModuleName] = mm.GetVersionMap()[icatypes.ModuleName]
Expand Down
3 changes: 2 additions & 1 deletion app/upgrades/v1_4_0/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/module"
upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper"

"github.com/NibiruChain/nibiru/v2/app/upgrades"
)
Expand All @@ -13,7 +14,7 @@ const UpgradeName = "v1.4.0"

var Upgrade = upgrades.Upgrade{
UpgradeName: UpgradeName,
CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler {
CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator, clientKeeper clientkeeper.Keeper) upgradetypes.UpgradeHandler {
return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) {
return mm.RunMigrations(ctx, cfg, fromVM)
}
Expand Down
42 changes: 42 additions & 0 deletions app/upgrades/v2_1_0/constants.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package v2_1_0

import (
"github.com/cosmos/cosmos-sdk/store/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/module"
upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
ibcwasmtypes "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/types"
clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper"

"github.com/NibiruChain/nibiru/v2/app/upgrades"
)

const UpgradeName = "v2.1.0"

var Upgrade = upgrades.Upgrade{
UpgradeName: UpgradeName,
CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator, clientKeeper clientkeeper.Keeper) upgradetypes.UpgradeHandler {
return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) {
// explicitly update the IBC 02-client params, adding the wasm client type if it is not there
params := clientKeeper.GetParams(ctx)

hasWasmClient := false
for _, client := range params.AllowedClients {
if client == ibcwasmtypes.Wasm {
hasWasmClient = true
break
}
}

if !hasWasmClient {
params.AllowedClients = append(params.AllowedClients, ibcwasmtypes.Wasm)
clientKeeper.SetParams(ctx, params)
}

return mm.RunMigrations(ctx, cfg, fromVM)
}
},
StoreUpgrades: types.StoreUpgrades{
Added: []string{ibcwasmtypes.ModuleName},
},
}
9 changes: 9 additions & 0 deletions cmd/nibid/cmd/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"path/filepath"

tmcfg "github.com/cometbft/cometbft/config"
ibcwasmtypes "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/types"

"github.com/NibiruChain/nibiru/v2/app/appconst"

Expand All @@ -25,6 +26,9 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/module"
"github.com/cosmos/cosmos-sdk/x/genutil"

ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported"
ibctypes "github.com/cosmos/ibc-go/v7/modules/core/types"
)

const (
Expand Down Expand Up @@ -129,6 +133,11 @@ func InitCmd(mbm module.BasicManager, defaultNodeHome string) *cobra.Command {
}
appGenState := mbm.DefaultGenesis(cdc)

// add 08-wasm to AllowedClients
ibcState := ibctypes.DefaultGenesisState()
ibcState.ClientGenesis.Params.AllowedClients = append(ibcState.ClientGenesis.Params.AllowedClients, ibcwasmtypes.Wasm)
appGenState[ibcexported.ModuleName] = cdc.MustMarshalJSON(ibcState)

appState, err := json.MarshalIndent(appGenState, "", " ")
if err != nil {
return errors.Wrap(err, "Failed to marshal default genesis state")
Expand Down
3 changes: 2 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ require (
// Cosmos-SDK and IBC
github.com/cosmos/cosmos-proto v1.0.0-beta.5
github.com/cosmos/cosmos-sdk v0.47.11
github.com/cosmos/ibc-go/v7 v7.3.2
github.com/cosmos/ibc-go/v7 v7.4.0
github.com/ethereum/go-ethereum v1.10.17
)

Expand Down Expand Up @@ -57,6 +57,7 @@ require (
require (
cosmossdk.io/collections v0.4.0
cosmossdk.io/tools/rosetta v0.2.1
github.com/cosmos/ibc-go/modules/light-clients/08-wasm v0.3.2-0.20240730185603-13c071f0b34d
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc
github.com/gorilla/websocket v1.5.0
github.com/rs/cors v1.8.3
Expand Down
6 changes: 4 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -438,8 +438,10 @@ github.com/cosmos/gogoproto v1.4.10 h1:QH/yT8X+c0F4ZDacDv3z+xE3WU1P1Z3wQoLMBRJoK
github.com/cosmos/gogoproto v1.4.10/go.mod h1:3aAZzeRWpAwr+SS/LLkICX2/kDFyaYVzckBDzygIxek=
github.com/cosmos/iavl v0.20.0 h1:fTVznVlepH0KK8NyKq8w+U7c2L6jofa27aFX6YGlm38=
github.com/cosmos/iavl v0.20.0/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XHcl7A=
github.com/cosmos/ibc-go/v7 v7.3.2 h1:FeUDcBX7VYY0e0iRmcVkPPUjYfAqIc//QuHXo8JHz9c=
github.com/cosmos/ibc-go/v7 v7.3.2/go.mod h1:IMeOXb7gwpZ+/nOG5BuUkdW4weM1ezvN4PQPws4uzOI=
github.com/cosmos/ibc-go/modules/light-clients/08-wasm v0.3.2-0.20240730185603-13c071f0b34d h1:QJK/Zr0HblNx6z1x5LXIHEblY7DCCftMkUBcjpKe1qY=
github.com/cosmos/ibc-go/modules/light-clients/08-wasm v0.3.2-0.20240730185603-13c071f0b34d/go.mod h1:5oIHokzX6RJ6q93tLcWZ7Thkrt9vrMGIz3He9HFE660=
github.com/cosmos/ibc-go/v7 v7.4.0 h1:8FqYMptvksgMvlbN4UW9jFxTXzsPyfAzEZurujXac8M=
github.com/cosmos/ibc-go/v7 v7.4.0/go.mod h1:L/KaEhzV5TGUCTfGysVgMBQtl5Dm7hHitfpk+GIeoAo=
github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM=
github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0=
github.com/cosmos/ledger-cosmos-go v0.12.4 h1:drvWt+GJP7Aiw550yeb3ON/zsrgW0jgh5saFCr7pDnw=
Expand Down

0 comments on commit ee5e29f

Please sign in to comment.