github.com/status-im/status-go@v1.1.0/protocol/communities/utils.go (about)

     1  package communities
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/status-im/status-go/eth-node/crypto"
     8  	"github.com/status-im/status-go/eth-node/types"
     9  	"github.com/status-im/status-go/protocol/protobuf"
    10  )
    11  
    12  func CalculateRequestID(publicKey string, communityID types.HexBytes) types.HexBytes {
    13  	idString := fmt.Sprintf("%s-%s", publicKey, communityID)
    14  	return crypto.Keccak256([]byte(idString))
    15  }
    16  
    17  func ExtractTokenCriteria(permissions []*CommunityTokenPermission) (erc20TokenCriteria map[uint64]map[string]*protobuf.TokenCriteria, erc721TokenCriteria map[uint64]map[string]*protobuf.TokenCriteria, ensTokenCriteria []string) {
    18  	erc20TokenCriteria = make(map[uint64]map[string]*protobuf.TokenCriteria)
    19  	erc721TokenCriteria = make(map[uint64]map[string]*protobuf.TokenCriteria)
    20  	ensTokenCriteria = make([]string, 0)
    21  
    22  	for _, tokenPermission := range permissions {
    23  		for _, tokenRequirement := range tokenPermission.TokenCriteria {
    24  
    25  			isERC721 := tokenRequirement.Type == protobuf.CommunityTokenType_ERC721
    26  			isERC20 := tokenRequirement.Type == protobuf.CommunityTokenType_ERC20
    27  			isENS := tokenRequirement.Type == protobuf.CommunityTokenType_ENS
    28  
    29  			for chainID, contractAddress := range tokenRequirement.ContractAddresses {
    30  
    31  				_, existsERC721 := erc721TokenCriteria[chainID]
    32  
    33  				if isERC721 && !existsERC721 {
    34  					erc721TokenCriteria[chainID] = make(map[string]*protobuf.TokenCriteria)
    35  				}
    36  				_, existsERC20 := erc20TokenCriteria[chainID]
    37  
    38  				if isERC20 && !existsERC20 {
    39  					erc20TokenCriteria[chainID] = make(map[string]*protobuf.TokenCriteria)
    40  				}
    41  				// TODO: check if we do not duplicate this due to ToLower case
    42  				_, existsERC721 = erc721TokenCriteria[chainID][contractAddress]
    43  				if isERC721 && !existsERC721 {
    44  					erc721TokenCriteria[chainID][strings.ToLower(contractAddress)] = tokenRequirement
    45  				}
    46  
    47  				_, existsERC20 = erc20TokenCriteria[chainID][contractAddress]
    48  				if isERC20 && !existsERC20 {
    49  					erc20TokenCriteria[chainID][strings.ToLower(contractAddress)] = tokenRequirement
    50  				}
    51  
    52  				if isENS {
    53  					ensTokenCriteria = append(ensTokenCriteria, tokenRequirement.EnsPattern)
    54  				}
    55  			}
    56  		}
    57  	}
    58  	return
    59  }