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 }