services/wallet/collectibles/types.go
package collectibles
import (
"github.com/status-im/status-go/protocol/communities/token"
w_common "github.com/status-im/status-go/services/wallet/common"
"github.com/status-im/status-go/services/wallet/thirdparty"
)
// Combined Collection+Collectible info, used to display a detailed view of a collectible
type Collectible struct {
DataType CollectibleDataType `json:"data_type"`
ID thirdparty.CollectibleUniqueID `json:"id"`
ContractType w_common.ContractType `json:"contract_type"`
CollectibleData *CollectibleData `json:"collectible_data,omitempty"`
CollectionData *CollectionData `json:"collection_data,omitempty"`
CommunityData *CommunityData `json:"community_data,omitempty"`
Ownership []thirdparty.AccountBalance `json:"ownership,omitempty"`
IsFirst bool `json:"is_first,omitempty"`
LatestTxHash string `json:"latest_tx_hash,omitempty"`
ReceivedAmount float64 `json:"received_amount,omitempty"`
}
type CollectibleData struct {
Name string `json:"name"`
Description *string `json:"description,omitempty"`
ImageURL *string `json:"image_url,omitempty"`
AnimationURL *string `json:"animation_url,omitempty"`
AnimationMediaType *string `json:"animation_media_type,omitempty"`
Traits *[]thirdparty.CollectibleTrait `json:"traits,omitempty"`
BackgroundColor *string `json:"background_color,omitempty"`
Soulbound *bool `json:"soulbound,omitempty"`
}
type CollectionData struct {
Name string `json:"name"`
Slug string `json:"slug"`
ImageURL string `json:"image_url"`
Socials *CollectionSocials `json:"socials"`
}
type CollectionSocials struct {
Website string `json:"website"`
TwitterHandle string `json:"twitter_handle"`
}
type CommunityData struct {
ID string `json:"id"`
Name string `json:"name"`
Color string `json:"color"`
PrivilegesLevel token.PrivilegesLevel `json:"privileges_level"`
ImageURL *string `json:"image_url,omitempty"`
}
func idToCollectible(id thirdparty.CollectibleUniqueID) Collectible {
ret := Collectible{
DataType: CollectibleDataTypeUniqueID,
ID: id,
}
return ret
}
func idsToCollectibles(ids []thirdparty.CollectibleUniqueID) []Collectible {
res := make([]Collectible, 0, len(ids))
for _, id := range ids {
c := idToCollectible(id)
res = append(res, c)
}
return res
}
func thirdpartyCollectionDataToCollectionData(collectionData *thirdparty.CollectionData) CollectionData {
ret := CollectionData{}
if collectionData != nil {
ret = CollectionData{
Name: collectionData.Name,
Slug: collectionData.Slug,
ImageURL: collectionData.ImageURL,
}
if collectionData.Socials != nil {
ret.Socials = &CollectionSocials{
Website: collectionData.Socials.Website,
TwitterHandle: collectionData.Socials.TwitterHandle,
}
}
}
return ret
}
func getContractType(c thirdparty.FullCollectibleData) w_common.ContractType {
if c.CollectibleData.ContractType != w_common.ContractTypeUnknown {
return c.CollectibleData.ContractType
}
if c.CollectionData != nil && c.CollectionData.ContractType != w_common.ContractTypeUnknown {
return c.CollectionData.ContractType
}
return w_common.ContractTypeUnknown
}
func fullCollectibleDataToHeader(c thirdparty.FullCollectibleData) Collectible {
ret := Collectible{
DataType: CollectibleDataTypeHeader,
ID: c.CollectibleData.ID,
ContractType: getContractType(c),
CollectibleData: &CollectibleData{
Name: c.CollectibleData.Name,
ImageURL: &c.CollectibleData.ImageURL,
AnimationURL: &c.CollectibleData.AnimationURL,
AnimationMediaType: &c.CollectibleData.AnimationMediaType,
BackgroundColor: &c.CollectibleData.BackgroundColor,
Soulbound: &c.CollectibleData.Soulbound,
},
}
collectionData := thirdpartyCollectionDataToCollectionData(c.CollectionData)
ret.CollectionData = &collectionData
if c.CollectibleData.CommunityID != "" {
communityData := communityInfoToData(c.CollectibleData.CommunityID, c.CommunityInfo, c.CollectibleCommunityInfo)
ret.CommunityData = &communityData
}
ret.Ownership = c.Ownership
return ret
}
func fullCollectiblesDataToHeaders(data []thirdparty.FullCollectibleData) []Collectible {
res := make([]Collectible, 0, len(data))
for _, c := range data {
header := fullCollectibleDataToHeader(c)
res = append(res, header)
}
return res
}
func fullCollectibleDataToDetails(c thirdparty.FullCollectibleData) Collectible {
ret := Collectible{
DataType: CollectibleDataTypeDetails,
ID: c.CollectibleData.ID,
ContractType: getContractType(c),
CollectibleData: &CollectibleData{
Name: c.CollectibleData.Name,
Description: &c.CollectibleData.Description,
ImageURL: &c.CollectibleData.ImageURL,
AnimationURL: &c.CollectibleData.AnimationURL,
AnimationMediaType: &c.CollectibleData.AnimationMediaType,
BackgroundColor: &c.CollectibleData.BackgroundColor,
Traits: &c.CollectibleData.Traits,
Soulbound: &c.CollectibleData.Soulbound,
},
}
collectionData := thirdpartyCollectionDataToCollectionData(c.CollectionData)
ret.CollectionData = &collectionData
if c.CollectibleData.CommunityID != "" {
communityData := communityInfoToData(c.CollectibleData.CommunityID, c.CommunityInfo, c.CollectibleCommunityInfo)
ret.CommunityData = &communityData
}
ret.Ownership = c.Ownership
return ret
}
func fullCollectiblesDataToDetails(data []thirdparty.FullCollectibleData) []Collectible {
res := make([]Collectible, 0, len(data))
for _, c := range data {
details := fullCollectibleDataToDetails(c)
res = append(res, details)
}
return res
}
func fullCollectiblesDataToCommunityHeader(data []thirdparty.FullCollectibleData) []Collectible {
res := make([]Collectible, 0, len(data))
for _, localCollectibleData := range data {
// to satisfy gosec: C601 checks
c := localCollectibleData
collectibleID := c.CollectibleData.ID
communityID := c.CollectibleData.CommunityID
if communityID == "" {
continue
}
communityData := communityInfoToData(communityID, c.CommunityInfo, c.CollectibleCommunityInfo)
header := Collectible{
ID: collectibleID,
ContractType: getContractType(c),
CollectibleData: &CollectibleData{
Name: c.CollectibleData.Name,
ImageURL: &c.CollectibleData.ImageURL,
},
CommunityData: &communityData,
Ownership: c.Ownership,
IsFirst: c.CollectibleData.IsFirst,
}
res = append(res, header)
}
return res
}
func communityInfoToData(communityID string, community *thirdparty.CommunityInfo, communityCollectible *thirdparty.CollectibleCommunityInfo) CommunityData {
ret := CommunityData{
ID: communityID,
}
if community != nil {
ret.Name = community.CommunityName
ret.Color = community.CommunityColor
ret.ImageURL = &community.CommunityImage
}
if communityCollectible != nil {
ret.PrivilegesLevel = communityCollectible.PrivilegesLevel
}
return ret
}
func IDsFromAssets(assets []*thirdparty.FullCollectibleData) []thirdparty.CollectibleUniqueID {
result := make([]thirdparty.CollectibleUniqueID, len(assets))
for i, asset := range assets {
result[i] = asset.CollectibleData.ID
}
return result
}