types.gno
0.91 Kb · 39 lines
1// Package enumerable is a stackable GRC721 extension implementing
2// EIP-721Enumerable. Attach it via NewEnumerable before the first mint.
3package enumerable
4
5import (
6 "errors"
7
8 "gno.land/p/nt/avl/v0"
9 "gno.land/p/nt/grc721/v0"
10)
11
12var ErrIndexOutOfRange = errors.New("index out of range")
13
14// Stored by pointer so in-place swap-and-pop updates persist.
15type tokenList struct {
16 ids []grc721.TokenID
17}
18
19type storage struct {
20 allTokens []grc721.TokenID
21 allIndex avl.Tree // grc721.TokenID -> int (position in allTokens)
22 owned avl.Tree // owner address -> *tokenList
23 ownedIndex avl.Tree // grc721.TokenID -> int (position within its owner list)
24 owner avl.Tree // grc721.TokenID -> owner address
25}
26
27type Enumerable struct {
28 core *grc721.Token
29 st *storage
30}
31
32type Ledger struct {
33 core *grc721.Token
34 st *storage
35}
36
37var _ grc721.Extension = (*Ledger)(nil)
38
39var _ grc721.ExtensionView = (*Enumerable)(nil)