Search Apps Documentation Source Content File Folder Download Copy

grc721_metadata.gno

3.10 Kb ยท 116 lines
  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}