Transaction
34453F87A03D62…D2073FFFE93D
Block 317,480 · index 0 · indexed
Summary
- Hash
- 34453F87A03D626E38041F7839827770686CC1AE4484DFE070CAD2073FFFE93D
- Block
- 317,480
- Size
- 4295 bytes
- Gas used
- 7,341,587 / 200,000,000
- Fee
- 1000000 ugnot
- Status
- success
Messages
#1AddPackagegno.land/p/g1n4pl5uc4yt5r96m9w6fmdznx3x0jyg8l6arhmt/bazaar/grc721/metadata/v09 arguments
- Attached funds
- 90000000 ugnot
Arguments · 9
- #1metadata
- #2gnomod.toml
- #3module = "gno.land/p/g1n4pl5uc4yt5r96m9w6fmdznx3x0jyg8l6arhmt/bazaar/grc721/metadata/v0" gno = "0.9"
- #4token.gno
- #5package metadata import ( "chain" "gno.land/p/g1n4pl5uc4yt5r96m9w6fmdznx3x0jyg8l6arhmt/bazaar/grc721/v0" ) const Kind = "metadata" // NewMetadata attaches a metadata extension and registers it as a core Extension. // Attach it before the first mint so every token is indexed. func NewMetadata(coreLedger *grc721.PrivateLedger) (*Metadata, *Ledger) { if coreLedger == nil { panic("metadata: nil core ledger") } st := &storage{} core := coreLedger.ReadToken() led := &Ledger{core: core, st: st} coreLedger.RegisterExtension(led) return &Metadata{core: core, st: st}, led } func (m *Metadata) ExtensionKind() string { return Kind } func (m *Metadata) TokenID() string { return m.core.ID() } func (m *Metadata) TokenURI(tid grc721.TokenID) (string, error) { v := m.st.uris.Get(tid.String()) if v == nil { return "", ErrNoTokenURI } return v.(string), nil } func (m *Metadata) TokenMetadata(tid grc721.TokenID) (Data, error) { v := m.st.data.Get(tid.String()) if v == nil { return Data{}, ErrNoMetadata } return v.(Data), nil } func (m *Metadata) HasTokenURI(tid grc721.TokenID) bool { return m.st.uris.Has(tid.String()) } func (m *Metadata) HasMetadata(tid grc721.TokenID) bool { return m.st.data.Has(tid.String()) } // SetTokenURI sets the EIP-721 tokenURI of tid; issuer-only so a holder cannot // rewrite the URI after acquisition. func (led *Ledger) SetTokenURI(tid grc721.TokenID, uri string) error { if _, err := led.core.OwnerOf(tid); err != nil { return ErrTokenNotMinted } led.st.uris.Set(tid.String(), uri) chain.Emit( TokenURIUpdateEvent, "token", led.core.ID(), "tokenId", tid.String(), "uri", uri, ) return nil } // SetTokenMetadata sets the OpenSea on-chain metadata of tid; issuer-only. func (led *Ledger) SetTokenMetadata(tid grc721.TokenID, data Data) error { if _, err := led.core.OwnerOf(tid); err != nil { return ErrTokenNotMinted } led.st.data.Set(tid.String(), data) chain.Emit( MetadataUpdateEvent, "token", led.core.ID(), "tokenId", tid.String(), ) return nil } func (led *Ledger) ExtensionKind() string { return Kind } func (led *Ledger) OnMint(to address, tid grc721.TokenID) {} func (led *Ledger) OnTransfer(from, to address, tid grc721.TokenID) {} // OnBurn clears per-token state so it cannot resurface on re-mint. func (led *Ledger) OnBurn(tid grc721.TokenID) { tidStr := tid.String() led.st.uris.Remove(tidStr) led.st.data.Remove(tidStr) }
- #6types.gno
- #7// Package metadata is a stackable GRC721 extension for EIP-721 tokenURI and // OpenSea on-chain metadata. Writes are issuer-only so a holder cannot rewrite metadata after acquisition. package metadata import ( "errors" "gno.land/p/nt/avl/v0" "gno.land/p/g1n4pl5uc4yt5r96m9w6fmdznx3x0jyg8l6arhmt/bazaar/grc721/v0" ) const ( MetadataUpdateEvent = "MetadataUpdate" TokenURIUpdateEvent = "TokenURIUpdate" ) var ( ErrTokenNotMinted = errors.New("token is not minted") ErrNoMetadata = errors.New("token has no metadata") ErrNoTokenURI = errors.New("token has no uri") ) type Metadata struct { core *grc721.Token st *storage } type Ledger struct { core *grc721.Token st *storage } // Data is the OpenSea on-chain metadata for a single token. type Data struct { Image string ImageData string ExternalURL string Description string Name string Attributes []Trait BackgroundColor string AnimationURL string YoutubeURL string } type Trait struct { DisplayType string TraitType string Value string } type storage struct { uris avl.Tree // grc721.TokenID -> string data avl.Tree // grc721.TokenID -> Data } var _ grc721.Extension = (*Ledger)(nil) var _ grc721.ExtensionView = (*Metadata)(nil)
- #8/gno.MemPackageType
- #9 MPUserAll
Result log
msg:0,success:true,log:,events:[]