grc721_metadata.gno
3.07 Kb · 119 lines
1package grc721
2
3import (
4 "chain"
5
6 "gno.land/p/nt/avl/v0"
7)
8
9// metadataNFT represents an NFT with metadata extensions.
10type metadataNFT struct {
11 *BasicNFT
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(_ int, rlm realm, name, symbol string) *metadataNFT {
20 return &metadataNFT{
21 BasicNFT: NewBasicNFT(0, rlm, name, symbol),
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
31 chain.Emit(
32 MetadataUpdateEvent,
33 "token", s.ID(),
34 "tokenId", tid.String(),
35 )
36
37 return nil
38}
39
40// TokenMetadata retrieves metadata for a given token ID.
41func (s *metadataNFT) TokenMetadata(tid TokenID) (Metadata, error) {
42 // Retrieve metadata from the extensions AVL tree
43 metadata, found := s.extensions.Get(tid.String())
44 if !found {
45 return Metadata{}, ErrInvalidTokenId
46 }
47
48 return metadata.(Metadata), nil
49}
50
51// Basic NFT methods forwarded to embedded BasicNFT
52
53func (s *metadataNFT) Name() string {
54 return s.BasicNFT.Name()
55}
56
57func (s *metadataNFT) Symbol() string {
58 return s.BasicNFT.Symbol()
59}
60
61func (s *metadataNFT) TokenCount() int64 {
62 return s.BasicNFT.TokenCount()
63}
64
65func (s *metadataNFT) BalanceOf(addr address) (int64, error) {
66 return s.BasicNFT.BalanceOf(addr)
67}
68
69func (s *metadataNFT) OwnerOf(tid TokenID) (address, error) {
70 return s.BasicNFT.OwnerOf(tid)
71}
72
73func (s *metadataNFT) TokenURI(tid TokenID) (string, error) {
74 return s.BasicNFT.TokenURI(tid)
75}
76
77func (s *metadataNFT) SetTokenURI(caller address, tid TokenID, tURI TokenURI) (bool, error) {
78 return s.BasicNFT.SetTokenURI(caller, tid, tURI)
79}
80
81func (s *metadataNFT) IsApprovedForAll(owner, operator address) bool {
82 return s.BasicNFT.IsApprovedForAll(owner, operator)
83}
84
85func (s *metadataNFT) Approve(caller, to address, tid TokenID) error {
86 return s.BasicNFT.Approve(caller, to, tid)
87}
88
89func (s *metadataNFT) GetApproved(tid TokenID) (address, error) {
90 return s.BasicNFT.GetApproved(tid)
91}
92
93func (s *metadataNFT) SetApprovalForAll(caller, operator address, approved bool) error {
94 return s.BasicNFT.SetApprovalForAll(caller, operator, approved)
95}
96
97func (s *metadataNFT) SafeTransferFrom(caller, from, to address, tid TokenID) error {
98 return s.BasicNFT.SafeTransferFrom(caller, from, to, tid)
99}
100
101func (s *metadataNFT) TransferFrom(caller, from, to address, tid TokenID) error {
102 return s.BasicNFT.TransferFrom(caller, from, to, tid)
103}
104
105func (s *metadataNFT) Mint(to address, tid TokenID) error {
106 return s.BasicNFT.Mint(to, tid)
107}
108
109func (s *metadataNFT) SafeMint(to address, tid TokenID) error {
110 return s.BasicNFT.SafeMint(to, tid)
111}
112
113func (s *metadataNFT) Burn(tid TokenID) error {
114 return s.BasicNFT.Burn(tid)
115}
116
117func (s *metadataNFT) RenderHome() string {
118 return s.BasicNFT.RenderHome()
119}