github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/evm/keeper/proposal.go (about) 1 package keeper 2 3 import ( 4 "fmt" 5 "time" 6 7 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 8 "github.com/fibonacci-chain/fbc/x/evm/types" 9 sdkGov "github.com/fibonacci-chain/fbc/x/gov" 10 govKeeper "github.com/fibonacci-chain/fbc/x/gov/keeper" 11 govTypes "github.com/fibonacci-chain/fbc/x/gov/types" 12 ) 13 14 var _ govKeeper.ProposalHandler = (*Keeper)(nil) 15 16 // GetMinDeposit returns min deposit 17 func (k Keeper) GetMinDeposit(ctx sdk.Context, content sdkGov.Content) (minDeposit sdk.SysCoins) { 18 switch content.(type) { 19 case types.ManageContractDeploymentWhitelistProposal, types.ManageContractBlockedListProposal, 20 types.ManageContractMethodBlockedListProposal, types.ManageSysContractAddressProposal, types.ManageContractByteCodeProposal: 21 minDeposit = k.govKeeper.GetDepositParams(ctx).MinDeposit 22 } 23 24 return 25 } 26 27 // GetMaxDepositPeriod returns max deposit period 28 func (k Keeper) GetMaxDepositPeriod(ctx sdk.Context, content sdkGov.Content) (maxDepositPeriod time.Duration) { 29 switch content.(type) { 30 case types.ManageContractDeploymentWhitelistProposal, types.ManageContractBlockedListProposal, 31 types.ManageContractMethodBlockedListProposal, types.ManageSysContractAddressProposal, types.ManageContractByteCodeProposal: 32 maxDepositPeriod = k.govKeeper.GetDepositParams(ctx).MaxDepositPeriod 33 } 34 35 return 36 } 37 38 // GetVotingPeriod returns voting period 39 func (k Keeper) GetVotingPeriod(ctx sdk.Context, content sdkGov.Content) (votingPeriod time.Duration) { 40 switch content.(type) { 41 case types.ManageContractDeploymentWhitelistProposal, types.ManageContractBlockedListProposal, 42 types.ManageContractMethodBlockedListProposal, types.ManageSysContractAddressProposal, types.ManageContractByteCodeProposal: 43 votingPeriod = k.govKeeper.GetVotingParams(ctx).VotingPeriod 44 } 45 46 return 47 } 48 49 // CheckMsgSubmitProposal validates MsgSubmitProposal 50 func (k Keeper) CheckMsgSubmitProposal(ctx sdk.Context, msg govTypes.MsgSubmitProposal) sdk.Error { 51 switch content := msg.Content.(type) { 52 case types.ManageContractDeploymentWhitelistProposal, types.ManageContractBlockedListProposal: 53 // whole target address list will be added/deleted to/from the contract deployment whitelist/contract blocked list. 54 // It's not necessary to check the existence in CheckMsgSubmitProposal 55 return nil 56 case types.ManageContractMethodBlockedListProposal: 57 csdb := types.CreateEmptyCommitStateDB(k.GeneratePureCSDBParams(), ctx) 58 // can not delete address is not exist 59 if !content.IsAdded { 60 for i, _ := range content.ContractList { 61 bc := csdb.GetContractMethodBlockedByAddress(content.ContractList[i].Address) 62 if bc == nil { 63 return types.ErrBlockedContractMethodIsNotExist(content.ContractList[i].Address, types.ErrorContractMethodBlockedIsNotExist) 64 } 65 if _, err := bc.BlockMethods.DeleteContractMethodMap(content.ContractList[i].BlockMethods); err != nil { 66 return types.ErrBlockedContractMethodIsNotExist(content.ContractList[i].Address, err) 67 } 68 } 69 } 70 return nil 71 case types.ManageSysContractAddressProposal: 72 if !k.stakingKeeper.IsValidator(ctx, msg.Proposer) { 73 return types.ErrCodeProposerMustBeValidator() 74 } 75 // can not delete system contract address that is not exist 76 if !content.IsAdded { 77 _, err := k.GetSysContractAddress(ctx) 78 return err 79 } 80 if !k.IsContractAccount(ctx, content.ContractAddr) { 81 return types.ErrNotContracAddress(fmt.Errorf(content.ContractAddr.String())) 82 } 83 return nil 84 case types.ManageContractByteCodeProposal: 85 if !k.stakingKeeper.IsValidator(ctx, msg.Proposer) { 86 return types.ErrCodeProposerMustBeValidator() 87 } 88 if !k.IsContractAccount(ctx, content.Contract) { 89 return types.ErrNotContracAddress(fmt.Errorf(content.Contract.String())) 90 } 91 if !k.IsContractAccount(ctx, content.SubstituteContract) { 92 return types.ErrNotContracAddress(fmt.Errorf(content.SubstituteContract.String())) 93 } 94 return nil 95 default: 96 return sdk.ErrUnknownRequest(fmt.Sprintf("unrecognized %s proposal content type: %T", types.DefaultCodespace, content)) 97 } 98 } 99 100 // nolint 101 func (k Keeper) AfterSubmitProposalHandler(_ sdk.Context, _ govTypes.Proposal) {} 102 func (k Keeper) AfterDepositPeriodPassed(_ sdk.Context, _ govTypes.Proposal) {} 103 func (k Keeper) RejectedHandler(_ sdk.Context, _ govTypes.Content) {} 104 func (k Keeper) VoteHandler(_ sdk.Context, _ govTypes.Proposal, _ govTypes.Vote) (string, sdk.Error) { 105 return "", nil 106 }