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 }