github.com/Finschia/finschia-sdk@v0.49.1/x/fbridge/types/genesis.go (about)

     1  package types
     2  
     3  import (
     4  	"errors"
     5  
     6  	sdk "github.com/Finschia/finschia-sdk/types"
     7  	authtypes "github.com/Finschia/finschia-sdk/x/auth/types"
     8  	foundationtypes "github.com/Finschia/finschia-sdk/x/foundation"
     9  	govtypes "github.com/Finschia/finschia-sdk/x/gov/types"
    10  )
    11  
    12  func DefaultGenesisState() *GenesisState {
    13  	return &GenesisState{
    14  		Params: DefaultParams(),
    15  		SendingState: SendingState{
    16  			NextSeq: 1,
    17  		},
    18  		ReceivingState:     ReceivingState{},
    19  		NextRoleProposalId: 1,
    20  	}
    21  }
    22  
    23  func DefaultAuthority() sdk.AccAddress {
    24  	return authtypes.NewModuleAddress(govtypes.ModuleName)
    25  }
    26  
    27  func AuthorityCandiates() []sdk.AccAddress {
    28  	return []sdk.AccAddress{
    29  		authtypes.NewModuleAddress(govtypes.ModuleName),
    30  		authtypes.NewModuleAddress(foundationtypes.ModuleName),
    31  	}
    32  }
    33  
    34  func ValidateGenesis(data GenesisState) error {
    35  	if err := data.Params.ValidateParams(); err != nil {
    36  		return err
    37  	}
    38  
    39  	if err := validateSendingState(data.SendingState); err != nil {
    40  		return err
    41  	}
    42  
    43  	if data.NextRoleProposalId < 1 {
    44  		return errors.New("next role proposal ID must be positive")
    45  	}
    46  
    47  	for _, v := range data.RoleProposals {
    48  		if v.Id < 1 {
    49  			return errors.New("role proposal ID must be positive")
    50  		}
    51  		sdk.MustAccAddressFromBech32(v.Proposer)
    52  		sdk.MustAccAddressFromBech32(v.Target)
    53  		if err := IsValidRole(v.Role); err != nil {
    54  			return err
    55  		}
    56  	}
    57  
    58  	for _, v := range data.Votes {
    59  		if v.ProposalId < 1 {
    60  			return errors.New("role proposal ID must be positive")
    61  		}
    62  		sdk.MustAccAddressFromBech32(v.Voter)
    63  		if err := IsValidVoteOption(v.Option); err != nil {
    64  			return err
    65  		}
    66  	}
    67  
    68  	for _, v := range data.Roles {
    69  		sdk.MustAccAddressFromBech32(v.Address)
    70  		if err := IsValidRole(v.Role); err != nil {
    71  			return err
    72  		}
    73  	}
    74  
    75  	for _, v := range data.BridgeSwitches {
    76  		sdk.MustAccAddressFromBech32(v.Guardian)
    77  		if err := IsValidBridgeStatus(v.Status); err != nil {
    78  			return err
    79  		}
    80  	}
    81  
    82  	return nil
    83  }
    84  
    85  func validateSendingState(state SendingState) error {
    86  	if state.NextSeq < 1 {
    87  		return errors.New("next sequence must be positive")
    88  	}
    89  
    90  	if state.NextSeq-1 != uint64(len(state.SeqToBlocknum)) {
    91  		return errors.New("sequence to blocknum mapping is invalid")
    92  	}
    93  
    94  	chkSeq := make(map[uint64]struct{})
    95  	for _, v := range state.SeqToBlocknum {
    96  		if v.Blocknum == 0 || v.Seq == 0 {
    97  			return errors.New("blocknum and seq must be positive")
    98  		}
    99  
   100  		if _, ok := chkSeq[v.Seq]; ok {
   101  			return errors.New("duplicate sequence")
   102  		}
   103  
   104  		chkSeq[v.Seq] = struct{}{}
   105  	}
   106  
   107  	return nil
   108  }