Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}