Skip to content

Commit

Permalink
feat(ante): whitelisted relayers
Browse files Browse the repository at this point in the history
  • Loading branch information
keruch committed Oct 25, 2024
1 parent 21753d2 commit 9333376
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 8 deletions.
10 changes: 9 additions & 1 deletion app/ante.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ import (
"github.com/cosmos/cosmos-sdk/x/auth/ante"
conntypes "github.com/cosmos/ibc-go/v6/modules/core/03-connection/types"
ibckeeper "github.com/cosmos/ibc-go/v6/modules/core/keeper"
distrkeeper "github.com/dymensionxyz/dymension-rdk/x/dist/keeper"
seqkeeper "github.com/dymensionxyz/dymension-rdk/x/sequencers/keeper"
cosmosante "github.com/evmos/evmos/v12/app/ante/cosmos"
evmostypes "github.com/evmos/evmos/v12/types"
evmtypes "github.com/evmos/evmos/v12/x/evm/types"
Expand All @@ -31,6 +33,8 @@ type HandlerOptions struct {
WasmConfig *wasmtypes.WasmConfig
TxCounterStoreKey storetypes.StoreKey
GaslessKeeper gaslesskeeper.Keeper
DistrKeeper distrkeeper.Keeper
SequencersKeeper seqkeeper.Keeper
}

// NewAnteHandler returns an AnteHandler that checks and increments sequence
Expand Down Expand Up @@ -117,7 +121,11 @@ func cosmosHandler(options HandlerOptions, sigChecker sdk.AnteDecorator) sdk.Ant
ante.NewValidateMemoDecorator(options.AccountKeeper),
NewCreateAccountDecorator(options.AccountKeeper.(accountKeeper)),
ante.NewConsumeGasForTxSizeDecorator(options.AccountKeeper),
NewBypassIBCFeeDecorator(gasless.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper, options.TxFeeChecker, options.GaslessKeeper)),
NewBypassIBCFeeDecorator(
gasless.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper, options.TxFeeChecker, options.GaslessKeeper),
options.DistrKeeper,
options.SequencersKeeper,
),
ante.NewSetPubKeyDecorator(options.AccountKeeper), // SetPubKeyDecorator must be called before all signature verification decorators
ante.NewValidateSigCountDecorator(options.AccountKeeper),
ante.NewSigGasConsumeDecorator(options.AccountKeeper, sigGasConsumer),
Expand Down
72 changes: 65 additions & 7 deletions app/bypass_ibc_fee_decorator.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package app

import (
"fmt"

sdk "github.com/cosmos/cosmos-sdk/types"
clienttypes "github.com/cosmos/ibc-go/v6/modules/core/02-client/types"
conntypes "github.com/cosmos/ibc-go/v6/modules/core/03-connection/types"
channeltypes "github.com/cosmos/ibc-go/v6/modules/core/04-channel/types"
distrkeeper "github.com/dymensionxyz/dymension-rdk/x/dist/keeper"
seqkeeper "github.com/dymensionxyz/dymension-rdk/x/sequencers/keeper"
)

type anteHandler interface {
Expand All @@ -13,26 +17,71 @@ type anteHandler interface {

type BypassIBCFeeDecorator struct {
nextAnte anteHandler
dk distrkeeper.Keeper
sk seqkeeper.Keeper
}

func NewBypassIBCFeeDecorator(nextAnte anteHandler) BypassIBCFeeDecorator {
return BypassIBCFeeDecorator{nextAnte: nextAnte}
func NewBypassIBCFeeDecorator(nextAnte anteHandler, dk distrkeeper.Keeper, sk seqkeeper.Keeper) BypassIBCFeeDecorator {
return BypassIBCFeeDecorator{
nextAnte: nextAnte,
dk: dk,
sk: sk,
}
}

// SKIP FEE DEDUCT and MIN GAS PRICE Ante handlers for IBC relayer messages
func (n BypassIBCFeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (sdk.Context, error) {
// ======== HACK ================
if isIBCRelayerMsg(tx.GetMsgs()) {
// ================ HACK ================
whitelisted, err := n.isWhitelistedRelayer(ctx, tx.GetMsgs())
if err != nil {
return ctx, fmt.Errorf("is whitelisted relayer: %w", err)
}
if whitelisted {
return next(ctx, tx, simulate)
}
// ==============================
// ======================================

// If it's not an IBC Relayer transfer, proceed with the default fee handling
return n.nextAnte.AnteHandle(ctx, tx, simulate, next)
}

// isIBCRelayerMsg checks if all the messages in the transaction are IBC relayer messages
func isIBCRelayerMsg(msgs []sdk.Msg) bool {
for _, msg := range msgs {
switch msg.(type) {
// IBC Client Messages
case *clienttypes.MsgCreateClient, *clienttypes.MsgUpdateClient,
*clienttypes.MsgUpgradeClient, *clienttypes.MsgSubmitMisbehaviour:
// IBC Connection Messages
case *conntypes.MsgConnectionOpenInit, *conntypes.MsgConnectionOpenTry,
*conntypes.MsgConnectionOpenAck, *conntypes.MsgConnectionOpenConfirm:
// IBC Channel Messages
case *channeltypes.MsgChannelOpenInit, *channeltypes.MsgChannelOpenTry,
*channeltypes.MsgChannelOpenAck, *channeltypes.MsgChannelOpenConfirm,
*channeltypes.MsgChannelCloseInit, *channeltypes.MsgChannelCloseConfirm:
// IBC Packet Messages
case *channeltypes.MsgRecvPacket, *channeltypes.MsgAcknowledgement,
*channeltypes.MsgTimeout, *channeltypes.MsgTimeoutOnClose:
default:
return false
}
}

return true
}

// isWhitelistedRelayer checks if all the messages in the transaction are from whitelisted IBC relayer
func (n BypassIBCFeeDecorator) isWhitelistedRelayer(ctx sdk.Context, msgs []sdk.Msg) (bool, error) {
consAddr := n.dk.GetPreviousProposerConsAddr(ctx)
wlRelayers, err := n.sk.GetWhitelistedRelayersByConsAddr(ctx, consAddr)
if err != nil {
return false, fmt.Errorf("get whitelisted relayers by consensus addr: %w", err)
}
wlRelayersMap := make(map[string]struct{}, len(msgs))
for _, relayerAddr := range wlRelayers.Relayers {
wlRelayersMap[relayerAddr] = struct{}{}
}

for _, msg := range msgs {
switch msg.(type) {
// IBC Client Messages
Expand All @@ -51,10 +100,19 @@ func isIBCRelayerMsg(msgs []sdk.Msg) bool {
// IBC Packet Messages
case *channeltypes.MsgRecvPacket, *channeltypes.MsgAcknowledgement,
*channeltypes.MsgTimeout, *channeltypes.MsgTimeoutOnClose:

default:
return false
return false, nil
}

signers := msg.GetSigners()
for _, signer := range signers {
_, ok := wlRelayersMap[signer.String()]
if !ok {
return false, nil
}
}
}

return true
return true, nil
}
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -361,4 +361,5 @@ replace (
github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7
// use cometbft
github.com/tendermint/tendermint => github.com/dymensionxyz/cometbft v0.34.29-0.20241008141942-63af9d24107f
github.com/dymensionxyz/dymension-rdk => ../dymension-rdk
)

0 comments on commit 9333376

Please sign in to comment.