github.com/Finschia/finschia-sdk@v0.48.1/x/collection/genesis.go (about)

     1  package collection
     2  
     3  import (
     4  	codectypes "github.com/Finschia/finschia-sdk/codec/types"
     5  
     6  	sdk "github.com/Finschia/finschia-sdk/types"
     7  	sdkerrors "github.com/Finschia/finschia-sdk/types/errors"
     8  )
     9  
    10  const (
    11  	DefaultDepthLimit = 1
    12  	DefaultWidthLimit = 4
    13  )
    14  
    15  // ValidateGenesis check the given genesis state has no integrity issues
    16  func ValidateGenesis(data GenesisState) error {
    17  	if err := validateParams(data.Params); err != nil {
    18  		return err
    19  	}
    20  
    21  	for _, contract := range data.Contracts {
    22  		if err := ValidateContractID(contract.Id); err != nil {
    23  			return err
    24  		}
    25  
    26  		if err := validateName(contract.Name); err != nil {
    27  			return err
    28  		}
    29  		if err := validateURI(contract.Uri); err != nil {
    30  			return err
    31  		}
    32  		if err := validateMeta(contract.Meta); err != nil {
    33  			return err
    34  		}
    35  	}
    36  
    37  	for _, nextClassID := range data.NextClassIds {
    38  		if err := ValidateContractID(nextClassID.ContractId); err != nil {
    39  			return err
    40  		}
    41  	}
    42  
    43  	for _, contractClasses := range data.Classes {
    44  		if err := ValidateContractID(contractClasses.ContractId); err != nil {
    45  			return err
    46  		}
    47  
    48  		if len(contractClasses.Classes) == 0 {
    49  			return sdkerrors.ErrInvalidRequest.Wrap("classes cannot be empty")
    50  		}
    51  		for i := range contractClasses.Classes {
    52  			any := &contractClasses.Classes[i]
    53  			class := TokenClassFromAny(any)
    54  			if err := class.ValidateBasic(); err != nil {
    55  				return err
    56  			}
    57  		}
    58  	}
    59  
    60  	for _, contractNextTokenIDs := range data.NextTokenIds {
    61  		if err := ValidateContractID(contractNextTokenIDs.ContractId); err != nil {
    62  			return err
    63  		}
    64  
    65  		if len(contractNextTokenIDs.TokenIds) == 0 {
    66  			return sdkerrors.ErrInvalidRequest.Wrap("next token ids cannot be empty")
    67  		}
    68  		for _, nextTokenIDs := range contractNextTokenIDs.TokenIds {
    69  			if err := ValidateClassID(nextTokenIDs.ClassId); err != nil {
    70  				return err
    71  			}
    72  		}
    73  	}
    74  
    75  	for _, contractBalances := range data.Balances {
    76  		if err := ValidateContractID(contractBalances.ContractId); err != nil {
    77  			return err
    78  		}
    79  
    80  		if len(contractBalances.Balances) == 0 {
    81  			return sdkerrors.ErrInvalidRequest.Wrap("balances cannot be empty")
    82  		}
    83  		for _, balance := range contractBalances.Balances {
    84  			if _, err := sdk.AccAddressFromBech32(balance.Address); err != nil {
    85  				return err
    86  			}
    87  			if err := balance.Amount.ValidateBasic(); err != nil {
    88  				return err
    89  			}
    90  		}
    91  	}
    92  
    93  	for _, contractNFTs := range data.Nfts {
    94  		if err := ValidateContractID(contractNFTs.ContractId); err != nil {
    95  			return err
    96  		}
    97  
    98  		if len(contractNFTs.Nfts) == 0 {
    99  			return sdkerrors.ErrInvalidRequest.Wrap("nfts cannot be empty")
   100  		}
   101  		for _, token := range contractNFTs.Nfts {
   102  			if err := ValidateTokenID(token.TokenId); err != nil {
   103  				return err
   104  			}
   105  			if err := validateName(token.Name); err != nil {
   106  				return err
   107  			}
   108  			if err := validateMeta(token.Meta); err != nil {
   109  				return err
   110  			}
   111  		}
   112  	}
   113  
   114  	for _, contractParents := range data.Parents {
   115  		if err := ValidateContractID(contractParents.ContractId); err != nil {
   116  			return err
   117  		}
   118  
   119  		if len(contractParents.Relations) == 0 {
   120  			return sdkerrors.ErrInvalidRequest.Wrap("parents cannot be empty")
   121  		}
   122  		for _, relation := range contractParents.Relations {
   123  			if err := ValidateTokenID(relation.Self); err != nil {
   124  				return err
   125  			}
   126  			if err := ValidateTokenID(relation.Other); err != nil {
   127  				return err
   128  			}
   129  		}
   130  	}
   131  
   132  	for _, contractAuthorizations := range data.Authorizations {
   133  		if err := ValidateContractID(contractAuthorizations.ContractId); err != nil {
   134  			return err
   135  		}
   136  
   137  		if len(contractAuthorizations.Authorizations) == 0 {
   138  			return sdkerrors.ErrInvalidRequest.Wrap("authorizations cannot be empty")
   139  		}
   140  		for _, authorization := range contractAuthorizations.Authorizations {
   141  			if _, err := sdk.AccAddressFromBech32(authorization.Holder); err != nil {
   142  				return err
   143  			}
   144  			if _, err := sdk.AccAddressFromBech32(authorization.Operator); err != nil {
   145  				return err
   146  			}
   147  		}
   148  	}
   149  
   150  	for _, contractGrants := range data.Grants {
   151  		if err := ValidateContractID(contractGrants.ContractId); err != nil {
   152  			return err
   153  		}
   154  
   155  		if len(contractGrants.Grants) == 0 {
   156  			return sdkerrors.ErrInvalidRequest.Wrap("grants cannot be empty")
   157  		}
   158  		for _, grant := range contractGrants.Grants {
   159  			if _, err := sdk.AccAddressFromBech32(grant.Grantee); err != nil {
   160  				return err
   161  			}
   162  			if err := ValidatePermission(grant.Permission); err != nil {
   163  				return err
   164  			}
   165  		}
   166  	}
   167  
   168  	for _, contractSupplies := range data.Supplies {
   169  		if err := ValidateContractID(contractSupplies.ContractId); err != nil {
   170  			return err
   171  		}
   172  
   173  		if len(contractSupplies.Statistics) == 0 {
   174  			return sdkerrors.ErrInvalidRequest.Wrap("supplies cannot be empty")
   175  		}
   176  		for _, supply := range contractSupplies.Statistics {
   177  			if err := ValidateClassID(supply.ClassId); err != nil {
   178  				return err
   179  			}
   180  			if !supply.Amount.IsPositive() {
   181  				return sdkerrors.ErrInvalidRequest.Wrap("supply must be positive")
   182  			}
   183  		}
   184  	}
   185  
   186  	for _, contractBurnts := range data.Burnts {
   187  		if err := ValidateContractID(contractBurnts.ContractId); err != nil {
   188  			return err
   189  		}
   190  
   191  		if len(contractBurnts.Statistics) == 0 {
   192  			return sdkerrors.ErrInvalidRequest.Wrap("burnts cannot be empty")
   193  		}
   194  		for _, burnt := range contractBurnts.Statistics {
   195  			if err := ValidateClassID(burnt.ClassId); err != nil {
   196  				return err
   197  			}
   198  			if !burnt.Amount.IsPositive() {
   199  				return sdkerrors.ErrInvalidRequest.Wrap("burnt must be positive")
   200  			}
   201  		}
   202  	}
   203  
   204  	return nil
   205  }
   206  
   207  // DefaultGenesisState - Return a default genesis state
   208  func DefaultGenesisState() *GenesisState {
   209  	return &GenesisState{
   210  		Params: Params{
   211  			DepthLimit: DefaultDepthLimit,
   212  			WidthLimit: DefaultWidthLimit,
   213  		},
   214  	}
   215  }
   216  
   217  func (data GenesisState) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error {
   218  	for _, contractClasses := range data.Classes {
   219  		for i := range contractClasses.Classes {
   220  			any := &contractClasses.Classes[i]
   221  			if err := TokenClassUnpackInterfaces(any, unpacker); err != nil {
   222  				return err
   223  			}
   224  		}
   225  	}
   226  
   227  	return nil
   228  }