github.com/Finschia/finschia-sdk@v0.48.1/x/token/validation.go (about) 1 package token 2 3 import ( 4 "fmt" 5 "regexp" 6 "unicode/utf8" 7 8 sdk "github.com/Finschia/finschia-sdk/types" 9 sdkerrors "github.com/Finschia/finschia-sdk/types/errors" 10 "github.com/Finschia/finschia-sdk/x/token/class" 11 ) 12 13 const ( 14 maxName = 20 15 maxURI = 1000 16 maxMeta = 1000 17 ) 18 19 var ( 20 reSymbolString = `[A-Z][A-Z0-9]{1,4}` 21 reSymbol = regexp.MustCompile(fmt.Sprintf(`^%s$`, reSymbolString)) 22 ) 23 24 func stringInSize(str string, size int) bool { 25 return utf8.RuneCountInString(str) <= size 26 } 27 28 func validateName(name string) error { 29 if len(name) == 0 { 30 return ErrInvalidTokenName.Wrap("name cannot be empty") 31 } else if !stringInSize(name, maxName) { 32 return ErrInvalidNameLength.Wrapf("name cannot be longer than %d", maxName) 33 } 34 return nil 35 } 36 37 func validateSymbol(symbol string) error { 38 if !reSymbol.MatchString(symbol) { 39 return ErrInvalidTokenSymbol.Wrapf("invalid symbol: %s, valid expression is: %s", symbol, reSymbolString) 40 } 41 return nil 42 } 43 44 func validateURI(uri string) error { 45 if !stringInSize(uri, maxURI) { 46 return ErrInvalidImageURILength.Wrapf("uri cannot be longer than %d", maxURI) 47 } 48 return nil 49 } 50 51 func validateMeta(meta string) error { 52 if !stringInSize(meta, maxMeta) { 53 return ErrInvalidMetaLength.Wrapf("meta cannot be longer than %d", maxMeta) 54 } 55 return nil 56 } 57 58 func validateDecimals(decimals int32) error { 59 if decimals < 0 || decimals > 18 { 60 return ErrInvalidTokenDecimals.Wrapf("invalid decimals: %d", decimals) 61 } 62 return nil 63 } 64 65 func validateAmount(amount sdk.Int) error { 66 if !amount.IsPositive() { 67 return ErrInvalidAmount.Wrapf("amount must be positive: %s", amount) 68 } 69 return nil 70 } 71 72 func validateLegacyPermission(permission string) error { 73 return ValidatePermission(Permission(LegacyPermissionFromString(permission))) 74 } 75 76 func ValidatePermission(permission Permission) error { 77 if p := Permission_value[Permission_name[int32(permission)]]; p == 0 { 78 return sdkerrors.ErrInvalidPermission.Wrap(permission.String()) 79 } 80 return nil 81 } 82 83 func validateChange(change Attribute) error { 84 validators := map[string]func(string) error{ 85 AttributeKeyName.String(): validateName, 86 AttributeKeyImageURI.String(): validateURI, 87 AttributeKeyMeta.String(): validateMeta, 88 AttributeKeyURI.String(): validateURI, 89 } 90 91 validator, ok := validators[change.Key] 92 if !ok { 93 return ErrInvalidChangesField.Wrapf("invalid field of key: %s", change.Key) 94 } 95 return validator(change.Value) 96 } 97 98 func ValidateContractID(id string) error { 99 return class.ValidateID(id) 100 } 101 102 func canonicalKey(key string) string { 103 convert := map[string]string{ 104 AttributeKeyImageURI.String(): AttributeKeyURI.String(), 105 } 106 if converted, ok := convert[key]; ok { 107 return converted 108 } 109 return key 110 }