github.com/status-im/status-go@v1.1.0/protocol/requests/create_community_token_permission_request.go (about)

     1  package requests
     2  
     3  import (
     4  	"errors"
     5  	"math"
     6  	"math/big"
     7  
     8  	"github.com/status-im/status-go/eth-node/types"
     9  	"github.com/status-im/status-go/protocol/protobuf"
    10  )
    11  
    12  const maxTokenCriteriaPerPermission = 5
    13  
    14  var (
    15  	ErrCreateCommunityTokenPermissionInvalidCommunityID    = errors.New("create community token permission needs a valid community id")
    16  	ErrCreateCommunityTokenPermissionTooManyTokenCriteria  = errors.New("too many token criteria")
    17  	ErrCreateCommunityTokenPermissionInvalidPermissionType = errors.New("invalid community token permission type")
    18  	ErrCreateCommunityTokenPermissionInvalidTokenCriteria  = errors.New("invalid community permission token criteria data")
    19  )
    20  
    21  type CreateCommunityTokenPermission struct {
    22  	CommunityID   types.HexBytes                         `json:"communityId"`
    23  	Type          protobuf.CommunityTokenPermission_Type `json:"type"`
    24  	TokenCriteria []*protobuf.TokenCriteria              `json:"tokenCriteria"`
    25  	IsPrivate     bool                                   `json:"isPrivate"`
    26  	ChatIds       []string                               `json:"chat_ids"`
    27  }
    28  
    29  func (p *CreateCommunityTokenPermission) Validate() error {
    30  	if len(p.CommunityID) == 0 {
    31  		return ErrCreateCommunityTokenPermissionInvalidCommunityID
    32  	}
    33  
    34  	if len(p.TokenCriteria) > maxTokenCriteriaPerPermission {
    35  		return ErrCreateCommunityTokenPermissionTooManyTokenCriteria
    36  	}
    37  
    38  	if p.Type == protobuf.CommunityTokenPermission_UNKNOWN_TOKEN_PERMISSION {
    39  		return ErrCreateCommunityTokenPermissionInvalidPermissionType
    40  	}
    41  
    42  	for _, c := range p.TokenCriteria {
    43  		if c.EnsPattern == "" && len(c.ContractAddresses) == 0 {
    44  			return ErrCreateCommunityTokenPermissionInvalidTokenCriteria
    45  		}
    46  
    47  		var amountBig = new(big.Int)
    48  		amountBig.SetString(c.AmountInWei, 10)
    49  		if len(c.ContractAddresses) > 0 && amountBig.Cmp(big.NewInt(0)) == 0 {
    50  			return ErrCreateCommunityTokenPermissionInvalidTokenCriteria
    51  		}
    52  	}
    53  
    54  	return nil
    55  }
    56  
    57  func (p *CreateCommunityTokenPermission) FillDeprecatedAmount() {
    58  
    59  	computeErc20AmountFunc := func(amountInWeis string, decimals uint64) string {
    60  		bigfloat := new(big.Float)
    61  		bigfloat.SetString(amountInWeis)
    62  		multiplier := big.NewFloat(math.Pow(10, float64(decimals)))
    63  		bigfloat.Quo(bigfloat, multiplier)
    64  		return bigfloat.String()
    65  	}
    66  
    67  	for _, criteria := range p.TokenCriteria {
    68  		if criteria.AmountInWei == "" {
    69  			continue
    70  		}
    71  		// fill Amount to keep backward compatibility
    72  		// Amount format (deprecated): "0.123"
    73  		// AmountInWei format: "123000..000"
    74  		if criteria.Type == protobuf.CommunityTokenType_ERC20 {
    75  			criteria.Amount = computeErc20AmountFunc(criteria.AmountInWei, criteria.Decimals)
    76  		} else {
    77  			criteria.Amount = criteria.AmountInWei
    78  		}
    79  
    80  	}
    81  }
    82  
    83  func (p *CreateCommunityTokenPermission) ToCommunityTokenPermission() protobuf.CommunityTokenPermission {
    84  	return protobuf.CommunityTokenPermission{
    85  		Type:          p.Type,
    86  		TokenCriteria: p.TokenCriteria,
    87  		IsPrivate:     p.IsPrivate,
    88  		ChatIds:       p.ChatIds,
    89  	}
    90  }