github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/gov/ante/ante.go (about)

     1  package ante
     2  
     3  import (
     4  	"fmt"
     5  	ethcmn "github.com/ethereum/go-ethereum/common"
     6  	ethermint "github.com/fibonacci-chain/fbc/app/types"
     7  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     8  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth"
     9  	evmtypes "github.com/fibonacci-chain/fbc/x/evm/types"
    10  	"github.com/fibonacci-chain/fbc/x/gov/types"
    11  	"github.com/fibonacci-chain/fbc/x/params"
    12  	paramstypes "github.com/fibonacci-chain/fbc/x/params/types"
    13  	stakingkeeper "github.com/fibonacci-chain/fbc/x/staking"
    14  )
    15  
    16  type AnteDecorator struct {
    17  	sk stakingkeeper.Keeper
    18  	ak auth.AccountKeeper
    19  	pk params.Keeper
    20  }
    21  
    22  func NewAnteDecorator(k stakingkeeper.Keeper, ak auth.AccountKeeper, pk params.Keeper) AnteDecorator {
    23  	return AnteDecorator{sk: k, ak: ak, pk: pk}
    24  }
    25  
    26  func (ad AnteDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (sdk.Context, error) {
    27  	for _, m := range tx.GetMsgs() {
    28  		switch msg := m.(type) {
    29  		case types.MsgSubmitProposal:
    30  			switch proposalType := msg.Content.(type) {
    31  			case evmtypes.ManageContractByteCodeProposal:
    32  				if !ad.sk.IsValidator(ctx, msg.Proposer) {
    33  					return ctx, evmtypes.ErrCodeProposerMustBeValidator()
    34  				}
    35  
    36  				// check operation contract
    37  				contract := ad.ak.GetAccount(ctx, proposalType.Contract)
    38  				contractAcc, ok := contract.(*ethermint.EthAccount)
    39  				if !ok || !contractAcc.IsContract() {
    40  					return ctx, evmtypes.ErrNotContracAddress(fmt.Errorf(ethcmn.BytesToAddress(proposalType.Contract).String()))
    41  				}
    42  
    43  				//check substitute contract
    44  				substitute := ad.ak.GetAccount(ctx, proposalType.SubstituteContract)
    45  				substituteAcc, ok := substitute.(*ethermint.EthAccount)
    46  				if !ok || !substituteAcc.IsContract() {
    47  					return ctx, evmtypes.ErrNotContracAddress(fmt.Errorf(ethcmn.BytesToAddress(proposalType.SubstituteContract).String()))
    48  				}
    49  
    50  			case paramstypes.UpgradeProposal:
    51  				if err := ad.pk.CheckMsgSubmitProposal(ctx, msg); err != nil {
    52  					return ctx, err
    53  				}
    54  			}
    55  		}
    56  	}
    57  
    58  	return next(ctx, tx, simulate)
    59  }