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!: add msg filter antehandler for gov min deposit ratio #159

Merged
merged 3 commits into from
Jun 19, 2023
Merged
Changes from 1 commit
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
7 changes: 7 additions & 0 deletions app/ante_handler.go
Original file line number Diff line number Diff line change
@@ -1,19 +1,25 @@
package app

import (
"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
"github.com/cosmos/cosmos-sdk/x/auth/ante"
govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper"

ibcante "github.com/cosmos/ibc-go/v3/modules/core/ante"
ibckeeper "github.com/cosmos/ibc-go/v3/modules/core/keeper"

"github.com/crescent-network/crescent/v5/app/anteplus"
crypin marked this conversation as resolved.
Show resolved Hide resolved
)

// HandlerOptions extend the SDK's AnteHandler options by requiring the IBC
// channel keeper.
type HandlerOptions struct {
ante.HandlerOptions

Codec codec.BinaryCodec
GovKeeper *govkeeper.Keeper
IBCKeeper *ibckeeper.Keeper
}

@@ -41,6 +47,7 @@ func NewAnteHandler(options HandlerOptions) (sdk.AnteHandler, error) {
ante.NewTxTimeoutHeightDecorator(),
ante.NewValidateMemoDecorator(options.AccountKeeper),
ante.NewConsumeGasForTxSizeDecorator(options.AccountKeeper),
anteplus.NewMsgFilterDecorator(options.Codec, options.GovKeeper),
ante.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper),
// SetPubKeyDecorator must be called before all signature verification decorators
ante.NewSetPubKeyDecorator(options.AccountKeeper),
119 changes: 119 additions & 0 deletions app/anteplus/msg_ante.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
package anteplus

import (
"fmt"

"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
"github.com/cosmos/cosmos-sdk/x/authz"
govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper"
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"

claimtypes "github.com/crescent-network/crescent/v5/x/claim/types"
)

// initial deposit must be greater than or equal to 50% of the minimum deposit
var minInitialDepositFraction = sdk.NewDecWithPrec(50, 2)

type MsgFilterDecorator struct {
govKeeper *govkeeper.Keeper
cdc codec.BinaryCodec
}

func NewMsgFilterDecorator(cdc codec.BinaryCodec, govKeeper *govkeeper.Keeper) MsgFilterDecorator {
return MsgFilterDecorator{
govKeeper: govKeeper,
cdc: cdc,
}
}

func (d MsgFilterDecorator) AnteHandle(
ctx sdk.Context, tx sdk.Tx,
simulate bool, next sdk.AnteHandler,
) (newCtx sdk.Context, err error) {
msgs := tx.GetMsgs()
if err = d.ValidateMsgs(ctx, msgs); err != nil {
return ctx, err
}

return next(ctx, tx, simulate)
}

func (d MsgFilterDecorator) ValidateMsgs(ctx sdk.Context, msgs []sdk.Msg) error {
var minInitialDeposit sdk.Coins
validateMsg := func(msg sdk.Msg, nested bool) error {
// mempool(check tx) level msg filter
if ctx.IsCheckTx() {
switch msg := msg.(type) {
// prevent messages with insufficient initial deposit amount
case *govtypes.MsgSubmitProposal:
if minInitialDeposit.Empty() {
fmt.Println("update")
depositParams := d.govKeeper.GetDepositParams(ctx)
minInitialDeposit = CalcMinInitialDeposit(depositParams.MinDeposit, minInitialDepositFraction)
}

if !msg.InitialDeposit.IsAllGTE(minInitialDeposit) {
return sdkerrors.Wrapf(sdkerrors.ErrInsufficientFunds, "insufficient initial deposit amount - required: %v", minInitialDeposit)
}
kingcre marked this conversation as resolved.
Show resolved Hide resolved
}
}

// deliver tx level msg filter
switch msg := msg.(type) {
// deprecated msg
case *claimtypes.MsgClaim:
return fmt.Errorf("%s is deprecated msg type", msg.Type())
// block double nested MsgExec
case *authz.MsgExec:
if nested {
return fmt.Errorf("double nested %s is not allowed", msg.Type())
}
}

// TODO: on next PR
// - add other deprecated msg types
// - prevent authz nested midblock, batch msgs
// - prevent multi msgs midblock, batch msgs with normal msg

return nil
}

validateAuthz := func(execMsg *authz.MsgExec) error {
for _, v := range execMsg.Msgs {
var innerMsg sdk.Msg
if err := d.cdc.UnpackAny(v, &innerMsg); err != nil {
return sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "cannot unmarshal authz exec msgs")
}

if err := validateMsg(innerMsg, true); err != nil {
return err
}
}
return nil
}

for _, m := range msgs {
if authzMsg, ok := m.(*authz.MsgExec); ok {
if err := validateAuthz(authzMsg); err != nil {
return err
}
continue
}

// validate normal msgs
if err := validateMsg(m, false); err != nil {
return err
}
}
return nil
}

func CalcMinInitialDeposit(minDeposit sdk.Coins, minInitialDepositFraction sdk.Dec) (minInitialDeposit sdk.Coins) {
for _, coin := range minDeposit {
minInitialCoins := minInitialDepositFraction.MulInt(coin.Amount).RoundInt()
minInitialDeposit = minInitialDeposit.Add(sdk.NewCoin(coin.Denom, minInitialCoins))
}
return
}
Loading