grc721_metadata.gno
3.05 Kb ยท 112 lines
1package grc721
2
3import "gno.land/p/nt/avl"
4
5// metadataNFT represents an NFT with metadata extensions.
6type metadataNFT struct {
7 *basicNFT // Embedded basicNFT struct for basic NFT functionality
8 extensions *avl.Tree // AVL tree for storing metadata extensions
9}
10
11// Ensure that metadataNFT implements the IGRC721MetadataOnchain interface.
12var _ IGRC721MetadataOnchain = (*metadataNFT)(nil)
13
14// NewNFTWithMetadata creates a new basic NFT with metadata extensions.
15func NewNFTWithMetadata(name string, symbol string) *metadataNFT {
16 // Create a new basic NFT
17 nft := NewBasicNFT(name, symbol)
18
19 // Return a metadataNFT with basicNFT embedded and an empty AVL tree for extensions
20 return &metadataNFT{
21 basicNFT: nft,
22 extensions: avl.NewTree(),
23 }
24}
25
26// SetTokenMetadata sets metadata for a given token ID.
27func (s *metadataNFT) SetTokenMetadata(tid TokenID, metadata Metadata) error {
28 // Set the metadata for the token ID in the extensions AVL tree
29 s.extensions.Set(tid.String(), metadata)
30 return nil
31}
32
33// TokenMetadata retrieves metadata for a given token ID.
34func (s *metadataNFT) TokenMetadata(tid TokenID) (Metadata, error) {
35 // Retrieve metadata from the extensions AVL tree
36 metadata, found := s.extensions.Get(tid.String())
37 if !found {
38 return Metadata{}, ErrInvalidTokenId
39 }
40
41 return metadata.(Metadata), nil
42}
43
44// Basic NFT methods forwarded to embedded basicNFT
45
46func (s *metadataNFT) Name() string {
47 return s.basicNFT.Name()
48}
49
50func (s *metadataNFT) Symbol() string {
51 return s.basicNFT.Symbol()
52}
53
54func (s *metadataNFT) TokenCount() int64 {
55 return s.basicNFT.TokenCount()
56}
57
58func (s *metadataNFT) BalanceOf(addr address) (int64, error) {
59 return s.basicNFT.BalanceOf(addr)
60}
61
62func (s *metadataNFT) OwnerOf(tid TokenID) (address, error) {
63 return s.basicNFT.OwnerOf(tid)
64}
65
66func (s *metadataNFT) TokenURI(tid TokenID) (string, error) {
67 return s.basicNFT.TokenURI(tid)
68}
69
70func (s *metadataNFT) SetTokenURI(tid TokenID, tURI TokenURI) (bool, error) {
71 return s.basicNFT.SetTokenURI(tid, tURI)
72}
73
74func (s *metadataNFT) IsApprovedForAll(owner, operator address) bool {
75 return s.basicNFT.IsApprovedForAll(owner, operator)
76}
77
78func (s *metadataNFT) Approve(to address, tid TokenID) error {
79 return s.basicNFT.Approve(to, tid)
80}
81
82func (s *metadataNFT) GetApproved(tid TokenID) (address, error) {
83 return s.basicNFT.GetApproved(tid)
84}
85
86func (s *metadataNFT) SetApprovalForAll(operator address, approved bool) error {
87 return s.basicNFT.SetApprovalForAll(operator, approved)
88}
89
90func (s *metadataNFT) SafeTransferFrom(from, to address, tid TokenID) error {
91 return s.basicNFT.SafeTransferFrom(from, to, tid)
92}
93
94func (s *metadataNFT) TransferFrom(from, to address, tid TokenID) error {
95 return s.basicNFT.TransferFrom(from, to, tid)
96}
97
98func (s *metadataNFT) Mint(to address, tid TokenID) error {
99 return s.basicNFT.Mint(to, tid)
100}
101
102func (s *metadataNFT) SafeMint(to address, tid TokenID) error {
103 return s.basicNFT.SafeMint(to, tid)
104}
105
106func (s *metadataNFT) Burn(tid TokenID) error {
107 return s.basicNFT.Burn(tid)
108}
109
110func (s *metadataNFT) RenderHome() string {
111 return s.basicNFT.RenderHome()
112}