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  }