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  }