Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}