Skip to content Search Apps Documentation Source Content File Folder Download Copy Actions State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

store.gno

6.54 Kb · 217 lines
  1package position
  2
  3import (
  4	"errors"
  5
  6	"gno.land/p/gnoswap/store/v1"
  7	"gno.land/p/gnoswap/utils/v1"
  8	bptree "gno.land/p/nt/bptree/v0"
  9	ufmt "gno.land/p/nt/ufmt/v0"
 10)
 11
 12type StoreKey string
 13
 14// String returns the textual storage-key value.
 15//
 16// Returns:
 17//   - key: storage key represented as a string
 18func (s StoreKey) String() string {
 19	return string(s)
 20}
 21
 22const (
 23	StoreKeyPositions      StoreKey = "positions"      // Positions
 24	StoreKeyPositionNextID StoreKey = "positionNextID" // Position next ID
 25)
 26
 27type positionStore struct {
 28	kvStore store.KVStore
 29}
 30
 31// HasPositionsStoreKey reports whether the positions tree is present in the KV store.
 32//
 33// Returns:
 34//   - exists: true when the positions storage key is present
 35func (s *positionStore) HasPositionsStoreKey() bool {
 36	return s.kvStore.Has(StoreKeyPositions.String())
 37}
 38
 39// GetPositions loads the stored tree containing all positions.
 40//
 41// Returns:
 42//   - positions: mutable positions tree keyed by decimal position ID; panics when the key is missing or has an unexpected type
 43func (s *positionStore) GetPositions() *bptree.BPTree {
 44	result, err := s.kvStore.Get(StoreKeyPositions.String())
 45	if err != nil {
 46		panic(err)
 47	}
 48
 49	positions, ok := result.(*bptree.BPTree)
 50	if !ok {
 51		panic(ufmt.Sprintf("failed to cast result to *bptree.BPTree: %T", result))
 52	}
 53
 54	return positions
 55}
 56
 57// SetPositions stores the positions tree after validating the realm context.
 58//
 59// Parameters:
 60//   - _: leading integer discriminator; callers pass 0
 61//   - rlm: propagated realm context; the store requires it to be the current realm
 62//   - positions: positions tree to persist under the positions storage key
 63//
 64// Returns:
 65//   - err: nil when the tree is stored; non-nil when rlm is spoofed or the KV write fails
 66func (s *positionStore) SetPositions(_ int, rlm realm, positions *bptree.BPTree) error {
 67	if !rlm.IsCurrent() {
 68		return errors.New(ErrSpoofedRealm)
 69	}
 70
 71	return s.kvStore.Set(0, rlm, StoreKeyPositions.String(), positions)
 72}
 73
 74// HasPositionNextIDStoreKey reports whether the next-position-ID value is present in the KV store.
 75//
 76// Returns:
 77//   - exists: true when the next-position-ID storage key is present
 78func (s *positionStore) HasPositionNextIDStoreKey() bool {
 79	return s.kvStore.Has(StoreKeyPositionNextID.String())
 80}
 81
 82// GetPositionNextID loads the next position NFT ID to allocate.
 83//
 84// Returns:
 85//   - nextID: next position ID stored by the position manager; panics when the key is missing or has an unexpected type
 86func (s *positionStore) GetPositionNextID() uint64 {
 87	result, err := s.kvStore.Get(StoreKeyPositionNextID.String())
 88	if err != nil {
 89		panic(err)
 90	}
 91
 92	nextID, ok := result.(uint64)
 93	if !ok {
 94		panic(ufmt.Sprintf("failed to cast result to uint64: %T", result))
 95	}
 96
 97	return nextID
 98}
 99
100// SetPositionNextID stores the next position NFT ID after validating the realm context.
101//
102// Parameters:
103//   - _: leading integer discriminator; callers pass 0
104//   - rlm: propagated realm context; the store requires it to be the current realm
105//   - nextID: next position ID to persist for the next mint
106//
107// Returns:
108//   - err: nil when nextID is stored; non-nil when rlm is spoofed or the KV write fails
109func (s *positionStore) SetPositionNextID(_ int, rlm realm, nextID uint64) error {
110	if !rlm.IsCurrent() {
111		return errors.New(ErrSpoofedRealm)
112	}
113
114	return s.kvStore.Set(0, rlm, StoreKeyPositionNextID.String(), nextID)
115}
116
117// HasPosition reports whether a position is stored for the supplied NFT ID.
118//
119// Parameters:
120//   - positionId: position NFT token ID to look up
121//
122// Returns:
123//   - exists: true when the decimal positionId key exists in the positions tree
124func (s *positionStore) HasPosition(positionId uint64) bool {
125	positions := s.GetPositions()
126
127	return positions.Has(utils.Uint64ToString(positionId))
128}
129
130// GetPosition loads a position by NFT ID.
131//
132// Parameters:
133//   - positionId: position NFT token ID to look up
134//
135// Returns:
136//   - position: stored position value when present, or the zero Position when absent
137//   - exists: true when positionId is present; false when no position is stored for that ID
138func (s *positionStore) GetPosition(positionId uint64) (Position, bool) {
139	positions := s.GetPositions()
140
141	result := positions.Get(utils.Uint64ToString(positionId))
142	if result == nil {
143		return Position{}, false
144	}
145
146	position, ok := result.(Position)
147	if !ok {
148		panic(ufmt.Sprintf("failed to cast result to Position: %T", result))
149	}
150
151	return position, true
152}
153
154// SetPosition inserts or replaces a position after validating the realm context.
155//
156// Parameters:
157//   - _: leading integer discriminator; callers pass 0
158//   - rlm: propagated realm context; the store requires it to be the current realm
159//   - positionId: position NFT token ID used as the tree key
160//   - position: position value to persist
161//
162// Returns:
163//   - err: nil when the position is stored; non-nil when rlm is spoofed, the positions key is missing, or the KV write fails
164func (s *positionStore) SetPosition(_ int, rlm realm, positionId uint64, position Position) error {
165	if !rlm.IsCurrent() {
166		return errors.New(ErrSpoofedRealm)
167	}
168
169	if !s.HasPositionsStoreKey() {
170		return errors.New("positions store key not found")
171	}
172
173	positions := s.GetPositions()
174
175	positions.Set(utils.Uint64ToString(positionId), position)
176
177	return s.kvStore.Set(0, rlm, StoreKeyPositions.String(), positions)
178}
179
180// RemovePosition deletes a position after validating the realm context.
181//
182// Parameters:
183//   - _: leading integer discriminator; callers pass 0
184//   - rlm: propagated realm context; the store requires it to be the current realm
185//   - positionId: position NFT token ID to remove from the positions tree
186//
187// Returns:
188//   - err: nil when the position is removed and the tree is stored; non-nil when rlm is spoofed, the positions key is missing, or the KV write fails
189func (s *positionStore) RemovePosition(_ int, rlm realm, positionId uint64) error {
190	if !rlm.IsCurrent() {
191		return errors.New(ErrSpoofedRealm)
192	}
193
194	if !s.HasPositionsStoreKey() {
195		return errors.New("positions store key not found")
196	}
197
198	positions := s.GetPositions()
199
200	positions.Remove(utils.Uint64ToString(positionId))
201
202	return s.kvStore.Set(0, rlm, StoreKeyPositions.String(), positions)
203}
204
205// NewPositionStore creates a position store backed by the provided KV store.
206// The upgrade system uses it to construct storage instances for each implementation.
207//
208// Parameters:
209//   - kvStore: Domain-owned KV store shared by position implementations.
210//
211// Returns:
212//   - IPositionStore: Position storage wrapper backed by the supplied store.
213func NewPositionStore(kvStore store.KVStore) IPositionStore {
214	return &positionStore{
215		kvStore: kvStore,
216	}
217}