Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: ibc validation logic #318

Merged
merged 5 commits into from
Nov 15, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 21 additions & 6 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ import (
upgradeclient "github.com/cosmos/cosmos-sdk/x/upgrade/client"
upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper"
upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
"github.com/cosmos/ibc-go/v7/modules/apps/transfer"
ibctransferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper"
ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
ibc "github.com/cosmos/ibc-go/v7/modules/core"
ibcclientclient "github.com/cosmos/ibc-go/v7/modules/core/02-client/client"
Expand Down Expand Up @@ -160,7 +160,7 @@ var (
ibc.AppModuleBasic{},
upgrade.AppModuleBasic{},
evidence.AppModuleBasic{},
transfer.AppModuleBasic{},
ibctransfer.AppModuleBasic{},
vesting.AppModuleBasic{},
oracle.AppModuleBasic{},
gmp.AppModuleBasic{},
Expand Down Expand Up @@ -437,8 +437,8 @@ func New(
appCodec,
keys[gmptypes.ModuleName],
app.OracleKeeper,
app.TransferKeeper,
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
app.TransferKeeper,
)

app.AirdropKeeper = airdropkeeper.NewKeeper(
Expand Down Expand Up @@ -474,6 +474,17 @@ func New(
)

// Create Transfer Keepers
ibcTransferKeeper := ibctransferkeeper.NewKeeper(
appCodec,
keys[ibctransfertypes.StoreKey],
app.GetSubspace(ibctransfertypes.ModuleName),
app.IBCKeeper.ChannelKeeper,
app.IBCKeeper.ChannelKeeper,
&app.IBCKeeper.PortKeeper,
app.AccountKeeper,
app.BankKeeper,
scopedTransferKeeper,
)
app.TransferKeeper = ibctransfer.NewKeeper(
appCodec,
keys[ibctransfertypes.StoreKey],
Expand All @@ -484,10 +495,14 @@ func New(
app.AccountKeeper,
app.BankKeeper,
scopedTransferKeeper,
app.GmpKeeper,
)
transferModule := NewIBCTransferModule(app.TransferKeeper)
app.TransferKeeper.Keeper = ibcTransferKeeper

// Reassign the GMP transfer keeper
app.GmpKeeper.IBCKeeper = &app.TransferKeeper
var ibcStack ibcporttypes.IBCModule
ibcStack = NewIBCAppModule(app.TransferKeeper)
ibcStack = ibctransfer.NewIBCModule(app.TransferKeeper)

// Create evidence Keeper for to register the IBC light client misbehavior evidence route
evidenceKeeper := evidencekeeper.NewKeeper(
Expand Down Expand Up @@ -568,7 +583,7 @@ func New(
evidence.NewAppModule(app.EvidenceKeeper),
ibc.NewAppModule(app.IBCKeeper),
params.NewAppModule(app.ParamsKeeper),
transferModule,
ibctransfer.NewAppModule(app.TransferKeeper),
oracle.NewAppModule(appCodec, app.OracleKeeper, app.AccountKeeper, app.BankKeeper),
gmp.NewAppModule(appCodec, app.GmpKeeper, app.OracleKeeper),
airdrop.NewAppModule(appCodec, app.AirdropKeeper, app.AccountKeeper, app.BankKeeper),
Expand Down
18 changes: 18 additions & 0 deletions app/ibctransfer/expected_keepers.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package ibctransfer

import (
"context"

sdk "github.com/cosmos/cosmos-sdk/types"
ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
gmptypes "github.com/ojo-network/ojo/x/gmp/types"
)

// GmpKeeper defines the expected GmpKeeper interface needed by the IBCTransfer keeper.
type GmpKeeper interface {
GetParams(ctx sdk.Context) (params gmptypes.Params)
BuildGmpRequest(
goCtx context.Context,
msg *gmptypes.MsgRelayPrice,
) (*ibctransfertypes.MsgTransfer, error)
}
19 changes: 19 additions & 0 deletions app/ibctransfer/ibc_module.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package ibctransfer

import (
ibctransfer "github.com/cosmos/ibc-go/v7/modules/apps/transfer"
)

// IBCModule implements the ICS26 interface for transfer given the transfer keeper.
type IBCModule struct {
ibctransfer.IBCModule
keeper Keeper
}

// NewIBCModule creates a new IBCModule given the keeper
func NewIBCModule(k Keeper) IBCModule {
return IBCModule{
keeper: k,
IBCModule: ibctransfer.NewIBCModule(k.Keeper),
}
}
35 changes: 34 additions & 1 deletion app/ibctransfer/ibctransfer.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@ import (

"github.com/cosmos/cosmos-sdk/codec"
storetypes "github.com/cosmos/cosmos-sdk/store/types"
sdk "github.com/cosmos/cosmos-sdk/types"
paramtypes "github.com/cosmos/cosmos-sdk/x/params/types"
ibctransferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper"
types "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types"
"github.com/cosmos/ibc-go/v7/modules/core/exported"
gmptypes "github.com/ojo-network/ojo/x/gmp/types"
)

type Keeper struct {
Expand All @@ -25,10 +27,39 @@ type Keeper struct {
authKeeper types.AccountKeeper
bankKeeper types.BankKeeper
scopedKeeper exported.ScopedKeeper

GmpKeeper *GmpKeeper
}

// Transfer defines a wrapper function for the ICS20 Transfer method.
// If the receiver for the tx is axelar's GMP address,
// Then it expects a payload of the gmptypes.MsgRelayPrice msg.
// If it does not have this format, it will error out.
// If it does, it will build a MsgTransfer with the payload.
func (k Keeper) Transfer(goCtx context.Context, msg *types.MsgTransfer) (*types.MsgTransferResponse, error) {
// TODO: Custom IBC validation logic
ctx := sdk.UnwrapSDKContext(goCtx)
gmpKeeper := *k.GmpKeeper
gmpParams := gmpKeeper.GetParams(ctx)

if msg.Receiver == gmpParams.GmpAddress {
relayMsg := &gmptypes.MsgRelayPrice{}
// safe byte conversion for invalid UTF-8
bz := make([]byte, len(msg.Memo))
copy(bz, msg.Memo)
err := relayMsg.Unmarshal(bz)
if err != nil {
// If the payload is not a relayMsg type, then a user is trying to perform GMP
// without the proper payload. This transaction be considered to be by a bad actor.
k.Logger(ctx).With(err).Error("unexpected object while trying to relay data to GMP")
return nil, err
}

gmpTransferMsg, err := gmpKeeper.BuildGmpRequest(goCtx, relayMsg)
if err != nil {
return nil, err
}
return k.Keeper.Transfer(goCtx, gmpTransferMsg)
}
return k.Keeper.Transfer(goCtx, msg)
}

Expand All @@ -37,6 +68,7 @@ func NewKeeper(
cdc codec.BinaryCodec, key storetypes.StoreKey, paramSpace paramtypes.Subspace,
ics4Wrapper porttypes.ICS4Wrapper, channelKeeper types.ChannelKeeper, portKeeper types.PortKeeper,
authKeeper types.AccountKeeper, bankKeeper types.BankKeeper, scopedKeeper exported.ScopedKeeper,
gmpKeeper GmpKeeper,
) Keeper {
// ensure ibc transfer module account is set
if addr := authKeeper.GetModuleAddress(types.ModuleName); addr == nil {
Expand All @@ -58,5 +90,6 @@ func NewKeeper(
authKeeper: authKeeper,
bankKeeper: bankKeeper,
scopedKeeper: scopedKeeper,
GmpKeeper: &gmpKeeper,
}
}
34 changes: 34 additions & 0 deletions app/ibctransfer/module.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package ibctransfer

import (
"github.com/cosmos/cosmos-sdk/types/module"

porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types"

ibctransfer "github.com/cosmos/ibc-go/v7/modules/apps/transfer"
)

var (
_ module.AppModule = AppModule{}
_ module.AppModuleBasic = AppModuleBasic{}
_ porttypes.IBCModule = IBCModule{}
)

// AppModuleBasic is the IBC Transfer AppModuleBasic
type AppModuleBasic struct {
ibctransfer.AppModuleBasic
}

// AppModule represents the AppModule for this module
type AppModule struct {
ibctransfer.AppModule
keeper Keeper
}

// NewAppModule creates a new 20-transfer module
func NewAppModule(k Keeper) AppModule {
return AppModule{
keeper: k,
AppModule: ibctransfer.NewAppModule(k.Keeper),
}
}
30 changes: 0 additions & 30 deletions app/modules.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,7 @@ import (
slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types"
"github.com/cosmos/cosmos-sdk/x/staking"
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
"github.com/cosmos/ibc-go/v7/modules/apps/transfer"

"github.com/ojo-network/ojo/app/ibctransfer"
appparams "github.com/ojo-network/ojo/app/params"
)

Expand Down Expand Up @@ -132,31 +130,3 @@ func (SlashingModule) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage {

return cdc.MustMarshalJSON(genState)
}

// IBCTransferModule defines a custom wrapper around the IBC Transfer AppModuleBasic
// so that we can use a custom Keeper.
type IBCTransferModule struct {
transfer.AppModuleBasic
keeper ibctransfer.Keeper
}

// NewIBCTransferModule creates a new 20-transfer module
func NewIBCTransferModule(k ibctransfer.Keeper) IBCTransferModule {
return IBCTransferModule{
keeper: k,
}
}

// IBCAppModule is a custom wrapper around IBCModule, which
// implements the ICS26 interface for transfer given the transfer keeper.
type IBCAppModule struct {
transfer.IBCModule
keeper ibctransfer.Keeper
}

// NewIBCAppModule creates a new IBCModule given the keeper
func NewIBCAppModule(k ibctransfer.Keeper) IBCAppModule {
return IBCAppModule{
keeper: k,
}
}
21 changes: 10 additions & 11 deletions x/gmp/client/cli/tx.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package cli

import (
"encoding/base64"
"fmt"
"strconv"
"strings"
Expand Down Expand Up @@ -34,12 +35,9 @@ func GetCmdRelay() *cobra.Command {
cmd := &cobra.Command{
Use: `relay [destination-chain] [ojo-contract-address] [client-contract-address] ` +
`[command-selector] [command-params] [timestamp] [denoms] [amount]`,
Args: cobra.ExactArgs(4),
Args: cobra.ExactArgs(8),
Short: "Relay oracle data via Axelar GMP",
RunE: func(cmd *cobra.Command, args []string) error {
if err := cmd.Flags().Set(flags.FlagFrom, args[0]); err != nil {
return err
}
clientCtx, err := client.GetClientTxContext(cmd)
if err != nil {
return err
Expand Down Expand Up @@ -89,13 +87,14 @@ func GetCmdRelay() *cobra.Command {
return err
}

// convert command-selector to []byte
var commandSelector []byte
copy(commandSelector, args[3])

// convert command-params to []byte
var commandParams []byte
copy(commandParams, args[4])
commandSelector, err := base64.StdEncoding.DecodeString(args[3])
if err != nil {
return err
}
commandParams, err := base64.StdEncoding.DecodeString(args[4])
if err != nil {
return err
}

msg := types.NewMsgRelay(
clientCtx.GetFromAddress().String(),
Expand Down
Loading