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