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 }