Search Apps Documentation Source Content File Folder Download Copy Actions Download

getter.gno

20.29 Kb ยท 651 lines
  1package v1
  2
  3import (
  4	"errors"
  5	"time"
  6
  7	"gno.land/p/nt/ufmt"
  8
  9	"gno.land/p/gnoswap/uint256"
 10	"gno.land/r/gnoswap/launchpad"
 11)
 12
 13// GetProjectCount returns the total number of projects.
 14func (lp *launchpadV1) GetProjectCount() int {
 15	projects := lp.store.GetProjects()
 16	return projects.Size()
 17}
 18
 19// GetProjectIDs returns a paginated list of project IDs.
 20// Returns empty slice if offset is negative or limit is non-positive.
 21func (lp *launchpadV1) GetProjectIDs(offset, count int) []string {
 22	if offset < 0 || count <= 0 {
 23		return []string{}
 24	}
 25
 26	projects := lp.store.GetProjects()
 27	projectIDs := make([]string, 0)
 28
 29	projects.IterateByOffset(offset, count, func(key string, value any) bool {
 30		projectIDs = append(projectIDs, key)
 31		return false
 32	})
 33
 34	return projectIDs
 35
 36}
 37
 38// GetProject retrieves a project by its ID.
 39// Returns nil and error if project not found.
 40func (lp *launchpadV1) GetProject(projectId string) (*launchpad.Project, error) {
 41	projects := lp.store.GetProjects()
 42	value, exists := projects.Get(projectId)
 43	if !exists {
 44		return nil, makeErrorWithDetails(errDataNotFound, ufmt.Sprintf("project(%s) not found", projectId))
 45	}
 46
 47	project, ok := value.(*launchpad.Project)
 48	if !ok {
 49		return nil, errors.New("invalid project type")
 50	}
 51
 52	return project, nil
 53}
 54
 55// GetProjectName returns the name of a project by its ID.
 56// Returns empty string and error if project not found.
 57func (lp *launchpadV1) GetProjectName(projectId string) (string, error) {
 58	project, err := lp.getProject(projectId)
 59	if err != nil {
 60		return "", err
 61	}
 62
 63	return project.Name(), nil
 64}
 65
 66// GetProjectTokenPath returns the token path of a project by its ID.
 67// Returns empty string and error if project not found.
 68func (lp *launchpadV1) GetProjectTokenPath(projectId string) (string, error) {
 69	project, err := lp.getProject(projectId)
 70	if err != nil {
 71		return "", err
 72	}
 73
 74	return project.TokenPath(), nil
 75}
 76
 77// GetProjectDepositAmount returns the deposit amount of a project by its ID.
 78// Returns 0 and error if project not found.
 79func (lp *launchpadV1) GetProjectDepositAmount(projectId string) (int64, error) {
 80	project, err := lp.getProject(projectId)
 81	if err != nil {
 82		return 0, err
 83	}
 84
 85	return project.DepositAmount(), nil
 86}
 87
 88// GetProjectRecipient returns the recipient address of a project by its ID.
 89// Returns empty address and error if project not found.
 90func (lp *launchpadV1) GetProjectRecipient(projectId string) (address, error) {
 91	project, err := lp.getProject(projectId)
 92	if err != nil {
 93		return address(""), err
 94	}
 95
 96	return project.Recipient(), nil
 97}
 98
 99// GetProjectCondition retrieves a specific condition of a project.
100// Returns nil and error if project or condition not found.
101func (lp *launchpadV1) GetProjectCondition(projectId string, tokenPath string) (*launchpad.ProjectCondition, error) {
102	project, err := lp.getProject(projectId)
103	if err != nil {
104		return nil, err
105	}
106
107	conditions := project.Conditions()
108	condition, exists := conditions[tokenPath]
109	if !exists {
110		return nil, makeErrorWithDetails(errDataNotFound, ufmt.Sprintf("condition(%s) not found", tokenPath))
111	}
112
113	return condition, nil
114}
115
116// GetProjectTiersRatios returns the tiers ratios map of a project by its ID.
117// Returns empty map and error if project not found.
118func (lp *launchpadV1) GetProjectTiersRatios(projectId string) (map[int64]int64, error) {
119	project, err := lp.getProject(projectId)
120	if err != nil {
121		return nil, err
122	}
123
124	return project.TiersRatios(), nil
125}
126
127// GetProjectCreatedHeight returns the created height of a project by its ID.
128// Returns 0 and error if project not found.
129func (lp *launchpadV1) GetProjectCreatedHeight(projectId string) (int64, error) {
130	project, err := lp.getProject(projectId)
131	if err != nil {
132		return 0, err
133	}
134
135	return project.CreatedHeight(), nil
136}
137
138// GetProjectCreatedAt returns the created time of a project by its ID.
139// Returns 0 and error if project not found.
140func (lp *launchpadV1) GetProjectCreatedAt(projectId string) (int64, error) {
141	project, err := lp.getProject(projectId)
142	if err != nil {
143		return 0, err
144	}
145
146	return project.CreatedAt(), nil
147}
148
149// GetProjectTier retrieves a specific tier of a project.
150// Returns nil and error if project or tier not found.
151func (lp *launchpadV1) GetProjectTier(projectId string, tier int64) (*launchpad.ProjectTier, error) {
152	project, err := lp.getProject(projectId)
153	if err != nil {
154		return nil, err
155	}
156
157	projectTier, err := getProjectTier(project, tier)
158	if err != nil {
159		return nil, err
160	}
161
162	return projectTier, nil
163}
164
165// GetProjectTierDistributeAmountPerSecondX128 returns the distribute amount per second (Q128) of a project tier.
166// Returns 0 and error if project or tier not found.
167func (lp *launchpadV1) GetProjectTierDistributeAmountPerSecondX128(projectId string, tier int64) (*uint256.Uint, error) {
168	projectTier, err := lp.GetProjectTier(projectId, tier)
169	if err != nil {
170		return uint256.NewUint(0), err
171	}
172
173	return projectTier.DistributeAmountPerSecondX128().Clone(), nil
174}
175
176// GetProjectTierTotalDistributeAmount returns the total distribute amount of a project tier.
177// Returns 0 and error if project or tier not found.
178func (lp *launchpadV1) GetProjectTierTotalDistributeAmount(projectId string, tier int64) (int64, error) {
179	projectTier, err := lp.GetProjectTier(projectId, tier)
180	if err != nil {
181		return 0, err
182	}
183
184	return projectTier.TotalDistributeAmount(), nil
185}
186
187// GetProjectTierTotalDepositAmount returns the total deposit amount of a project tier.
188// Returns 0 and error if project or tier not found.
189func (lp *launchpadV1) GetProjectTierTotalDepositAmount(projectId string, tier int64) (int64, error) {
190	projectTier, err := lp.GetProjectTier(projectId, tier)
191	if err != nil {
192		return 0, err
193	}
194
195	return projectTier.TotalDepositAmount(), nil
196}
197
198// GetProjectTierTotalWithdrawAmount returns the total withdraw amount of a project tier.
199// Returns 0 and error if project or tier not found.
200func (lp *launchpadV1) GetProjectTierTotalWithdrawAmount(projectId string, tier int64) (int64, error) {
201	projectTier, err := lp.GetProjectTier(projectId, tier)
202	if err != nil {
203		return 0, err
204	}
205
206	return projectTier.TotalWithdrawAmount(), nil
207}
208
209// GetProjectTierTotalDepositCount returns the total deposit count of a project tier.
210// Returns 0 and error if project or tier not found.
211func (lp *launchpadV1) GetProjectTierTotalDepositCount(projectId string, tier int64) (int64, error) {
212	projectTier, err := lp.GetProjectTier(projectId, tier)
213	if err != nil {
214		return 0, err
215	}
216
217	return projectTier.TotalDepositCount(), nil
218}
219
220// GetProjectTierTotalWithdrawCount returns the total withdraw count of a project tier.
221// Returns 0 and error if project or tier not found.
222func (lp *launchpadV1) GetProjectTierTotalWithdrawCount(projectId string, tier int64) (int64, error) {
223	projectTier, err := lp.GetProjectTier(projectId, tier)
224	if err != nil {
225		return 0, err
226	}
227
228	return projectTier.TotalWithdrawCount(), nil
229}
230
231// GetProjectTierTotalCollectedAmount returns the total collected amount of a project tier.
232// Returns 0 and error if project or tier not found.
233func (lp *launchpadV1) GetProjectTierTotalCollectedAmount(projectId string, tier int64) (int64, error) {
234	projectTier, err := lp.GetProjectTier(projectId, tier)
235	if err != nil {
236		return 0, err
237	}
238
239	return projectTier.TotalCollectedAmount(), nil
240}
241
242// GetProjectTierStartTime returns the start time of a project tier.
243// Returns 0 and error if project or tier not found.
244func (lp *launchpadV1) GetProjectTierStartTime(projectId string, tier int64) (int64, error) {
245	projectTier, err := lp.GetProjectTier(projectId, tier)
246	if err != nil {
247		return 0, err
248	}
249
250	return projectTier.StartTime(), nil
251}
252
253// GetProjectTierEndTime returns the end time of a project tier.
254// Returns 0 and error if project or tier not found.
255func (lp *launchpadV1) GetProjectTierEndTime(projectId string, tier int64) (int64, error) {
256	projectTier, err := lp.GetProjectTier(projectId, tier)
257	if err != nil {
258		return 0, err
259	}
260
261	return projectTier.EndTime(), nil
262}
263
264// GetDepositCount returns the total number of deposits.
265func (lp *launchpadV1) GetDepositCount() int {
266	deposits := lp.store.GetDeposits()
267	return deposits.Size()
268}
269
270// GetCurrentDepositId returns the current deposit counter value.
271func (lp *launchpadV1) GetCurrentDepositId() int64 {
272	counter := lp.store.GetDepositCounter()
273	return counter.Get()
274}
275
276// GetProjectTierDepositCount returns the total number of deposits for a project tier.
277// Returns 0 and error if project or tier not found.
278func (lp *launchpadV1) GetProjectTierDepositCount(projectId string, tier int64) int {
279	projectTierID := launchpad.MakeProjectTierID(projectId, tier)
280
281	rewardManager, err := lp.getProjectTierRewardManager(projectTierID)
282	if err != nil {
283		return 0
284	}
285
286	return rewardManager.Rewards().Size()
287}
288
289// GetProjectTierDepositIDs returns a paginated list of deposit IDs for a project tier.
290// Returns empty slice if offset is negative or limit is non-positive.
291func (lp *launchpadV1) GetProjectTierDepositIDs(projectId string, tier int64, offset, count int) []string {
292	projectTierID := launchpad.MakeProjectTierID(projectId, tier)
293
294	rewardManager, err := lp.getProjectTierRewardManager(projectTierID)
295	if err != nil {
296		return []string{}
297	}
298
299	depositIDs := make([]string, 0)
300
301	rewardManager.Rewards().IterateByOffset(offset, count, func(key string, value any) bool {
302		depositIDs = append(depositIDs, key)
303		return false
304	})
305
306	return depositIDs
307}
308
309// GetDeposit retrieves a deposit by its ID.
310// Returns a cloned deposit to prevent external modification.
311// Returns nil and error if deposit not found.
312func (lp *launchpadV1) GetDeposit(depositId string) (*launchpad.Deposit, error) {
313	deposits := lp.store.GetDeposits()
314	value, exists := deposits.Get(depositId)
315	if !exists {
316		return nil, makeErrorWithDetails(errDataNotFound, "deposit not found")
317	}
318
319	deposit, ok := value.(*launchpad.Deposit)
320	if !ok {
321		return nil, errors.New("invalid deposit type")
322	}
323
324	return deposit.Clone(), nil
325}
326
327// GetDepositProjectID returns the project ID of a deposit by its ID.
328// Returns empty string and error if deposit not found.
329func (lp *launchpadV1) GetDepositProjectID(depositId string) (string, error) {
330	deposits := lp.store.GetDeposits()
331	value, exists := deposits.Get(depositId)
332	if !exists {
333		return "", makeErrorWithDetails(errDataNotFound, "deposit not found")
334	}
335
336	deposit, ok := value.(*launchpad.Deposit)
337	if !ok {
338		return "", errors.New("invalid deposit type")
339	}
340
341	return deposit.ProjectID(), nil
342}
343
344// GetDepositTier returns the tier of a deposit by its ID.
345// Returns 0 and error if deposit not found.
346func (lp *launchpadV1) GetDepositTier(depositId string) (int64, error) {
347	deposits := lp.store.GetDeposits()
348	value, exists := deposits.Get(depositId)
349	if !exists {
350		return 0, makeErrorWithDetails(errDataNotFound, "deposit not found")
351	}
352
353	deposit, ok := value.(*launchpad.Deposit)
354	if !ok {
355		return 0, errors.New("invalid deposit type")
356	}
357
358	return deposit.Tier(), nil
359}
360
361// GetDepositProjectTierID returns the project tier ID of a deposit by its ID.
362// Returns empty string and error if deposit not found.
363func (lp *launchpadV1) GetDepositProjectTierID(depositId string) (string, error) {
364	deposits := lp.store.GetDeposits()
365	value, exists := deposits.Get(depositId)
366	if !exists {
367		return "", makeErrorWithDetails(errDataNotFound, "deposit not found")
368	}
369
370	deposit, ok := value.(*launchpad.Deposit)
371	if !ok {
372		return "", errors.New("invalid deposit type")
373	}
374
375	return deposit.ProjectTierID(), nil
376}
377
378// GetDepositAmount returns the deposit amount of a deposit by its ID.
379// Returns 0 and error if deposit not found.
380func (lp *launchpadV1) GetDepositAmount(depositId string) (int64, error) {
381	deposits := lp.store.GetDeposits()
382	value, exists := deposits.Get(depositId)
383	if !exists {
384		return 0, makeErrorWithDetails(errDataNotFound, "deposit not found")
385	}
386
387	deposit, ok := value.(*launchpad.Deposit)
388	if !ok {
389		return 0, errors.New("invalid deposit type")
390	}
391
392	return deposit.DepositAmount(), nil
393}
394
395// GetDepositWithdrawnHeight returns the withdrawn height of a deposit by its ID.
396// Returns 0 and error if deposit not found.
397func (lp *launchpadV1) GetDepositWithdrawnHeight(depositId string) (int64, error) {
398	deposits := lp.store.GetDeposits()
399	value, exists := deposits.Get(depositId)
400	if !exists {
401		return 0, makeErrorWithDetails(errDataNotFound, "deposit not found")
402	}
403
404	deposit, ok := value.(*launchpad.Deposit)
405	if !ok {
406		return 0, errors.New("invalid deposit type")
407	}
408
409	return deposit.WithdrawnHeight(), nil
410}
411
412// GetDepositWithdrawnTime returns the withdrawn time of a deposit by its ID.
413// Returns 0 and error if deposit not found.
414func (lp *launchpadV1) GetDepositWithdrawnTime(depositId string) (int64, error) {
415	deposits := lp.store.GetDeposits()
416	value, exists := deposits.Get(depositId)
417	if !exists {
418		return 0, makeErrorWithDetails(errDataNotFound, "deposit not found")
419	}
420
421	deposit, ok := value.(*launchpad.Deposit)
422	if !ok {
423		return 0, errors.New("invalid deposit type")
424	}
425
426	return deposit.WithdrawnTime(), nil
427}
428
429// GetDepositCreatedHeight returns the created height of a deposit by its ID.
430// Returns 0 and error if deposit not found.
431func (lp *launchpadV1) GetDepositCreatedHeight(depositId string) (int64, error) {
432	deposits := lp.store.GetDeposits()
433	value, exists := deposits.Get(depositId)
434	if !exists {
435		return 0, makeErrorWithDetails(errDataNotFound, "deposit not found")
436	}
437
438	deposit, ok := value.(*launchpad.Deposit)
439	if !ok {
440		return 0, errors.New("invalid deposit type")
441	}
442
443	return deposit.CreatedHeight(), nil
444}
445
446// GetDepositCreatedAt returns the created time of a deposit by its ID.
447// Returns 0 and error if deposit not found.
448func (lp *launchpadV1) GetDepositCreatedAt(depositId string) (int64, error) {
449	deposits := lp.store.GetDeposits()
450	value, exists := deposits.Get(depositId)
451	if !exists {
452		return 0, makeErrorWithDetails(errDataNotFound, "deposit not found")
453	}
454
455	deposit, ok := value.(*launchpad.Deposit)
456	if !ok {
457		return 0, errors.New("invalid deposit type")
458	}
459
460	return deposit.CreatedAt(), nil
461}
462
463// GetDepositEndTime returns the end time of a deposit by its ID.
464// Returns 0 and error if deposit not found.
465func (lp *launchpadV1) GetDepositEndTime(depositId string) (int64, error) {
466	deposits := lp.store.GetDeposits()
467	value, exists := deposits.Get(depositId)
468	if !exists {
469		return 0, makeErrorWithDetails(errDataNotFound, "deposit not found")
470	}
471
472	deposit, ok := value.(*launchpad.Deposit)
473	if !ok {
474		return 0, errors.New("invalid deposit type")
475	}
476
477	return deposit.EndTime(), nil
478}
479
480// GetProjectTierRewardManagerCount returns the total number of reward managers.
481func (lp *launchpadV1) GetProjectTierRewardManagerCount() int {
482	managers := lp.store.GetProjectTierRewardManagers()
483	return managers.Size()
484}
485
486// GetProjectTierRewardManager retrieves a reward manager by project tier ID.
487// Returns nil and error if reward manager not found.
488func (lp *launchpadV1) GetProjectTierRewardManager(projectTierId string) (*launchpad.RewardManager, error) {
489	managers := lp.store.GetProjectTierRewardManagers()
490	value, exists := managers.Get(projectTierId)
491	if !exists {
492		return nil, makeErrorWithDetails(errDataNotFound, "reward manager not found")
493	}
494
495	manager, ok := value.(*launchpad.RewardManager)
496	if !ok {
497		return nil, errors.New("invalid reward manager type")
498	}
499
500	return manager, nil
501}
502
503// GetProjectTierRewardDistributeAmountPerSecondX128 returns the distribute amount per second (Q128) of a reward manager.
504// Returns 0 and error if reward manager not found.
505func (lp *launchpadV1) GetProjectTierRewardDistributeAmountPerSecondX128(projectTierId string) (*uint256.Uint, error) {
506	manager, err := lp.GetProjectTierRewardManager(projectTierId)
507	if err != nil {
508		return uint256.NewUint(0), err
509	}
510
511	return manager.DistributeAmountPerSecondX128().Clone(), nil
512}
513
514// GetProjectTierRewardAccumulatedRewardPerDepositX128 returns the accumulated reward per deposit (Q128) of a reward manager.
515// Returns 0 and error if reward manager not found.
516func (lp *launchpadV1) GetProjectTierRewardAccumulatedRewardPerDepositX128(projectTierId string) (*uint256.Uint, error) {
517	manager, err := lp.GetProjectTierRewardManager(projectTierId)
518	if err != nil {
519		return uint256.NewUint(0), err
520	}
521
522	return manager.AccumulatedRewardPerDepositX128().Clone(), nil
523}
524
525// GetProjectTierRewardTotalDistributeAmount returns the total distribute amount of a reward manager.
526// Returns 0 and error if reward manager not found.
527func (lp *launchpadV1) GetProjectTierRewardTotalDistributeAmount(projectTierId string) (int64, error) {
528	manager, err := lp.GetProjectTierRewardManager(projectTierId)
529	if err != nil {
530		return 0, err
531	}
532
533	return manager.TotalDistributeAmount(), nil
534}
535
536// GetProjectTierRewardTotalClaimedAmount returns the total claimed amount of a reward manager.
537// Returns 0 and error if reward manager not found.
538func (lp *launchpadV1) GetProjectTierRewardTotalClaimedAmount(projectTierId string) (int64, error) {
539	manager, err := lp.GetProjectTierRewardManager(projectTierId)
540	if err != nil {
541		return 0, err
542	}
543
544	return manager.TotalClaimedAmount(), nil
545}
546
547// GetProjectTierRewardDistributeStartTime returns the distribute start time of a reward manager.
548// Returns 0 and error if reward manager not found.
549func (lp *launchpadV1) GetProjectTierRewardDistributeStartTime(projectTierId string) (int64, error) {
550	manager, err := lp.GetProjectTierRewardManager(projectTierId)
551	if err != nil {
552		return 0, err
553	}
554
555	return manager.DistributeStartTime(), nil
556}
557
558// GetProjectTierRewardDistributeEndTime returns the distribute end time of a reward manager.
559// Returns 0 and error if reward manager not found.
560func (lp *launchpadV1) GetProjectTierRewardDistributeEndTime(projectTierId string) (int64, error) {
561	manager, err := lp.GetProjectTierRewardManager(projectTierId)
562	if err != nil {
563		return 0, err
564	}
565
566	return manager.DistributeEndTime(), nil
567}
568
569// GetProjectTierRewardAccumulatedDistributeAmount returns the accumulated distribute amount of a reward manager.
570// Returns 0 and error if reward manager not found.
571func (lp *launchpadV1) GetProjectTierRewardAccumulatedDistributeAmount(projectTierId string) (int64, error) {
572	manager, err := lp.GetProjectTierRewardManager(projectTierId)
573	if err != nil {
574		return 0, err
575	}
576
577	return manager.AccumulatedDistributeAmount(), nil
578}
579
580// GetProjectTierRewardAccumulatedHeight returns the accumulated height of a reward manager.
581// Returns 0 and error if reward manager not found.
582func (lp *launchpadV1) GetProjectTierRewardAccumulatedHeight(projectTierId string) (int64, error) {
583	manager, err := lp.GetProjectTierRewardManager(projectTierId)
584	if err != nil {
585		return 0, err
586	}
587
588	return manager.AccumulatedHeight(), nil
589}
590
591// GetProjectTierRewardAccumulatedTime returns the accumulated time of a reward manager.
592// Returns 0 and error if reward manager not found.
593func (lp *launchpadV1) GetProjectTierRewardAccumulatedTime(projectTierId string) (int64, error) {
594	manager, err := lp.GetProjectTierRewardManager(projectTierId)
595	if err != nil {
596		return 0, err
597	}
598
599	return manager.AccumulatedTime(), nil
600}
601
602// GetProjectTierRewardClaimableDuration returns the reward claimable duration of a reward manager.
603// Returns 0 and error if reward manager not found.
604func (lp *launchpadV1) GetProjectTierRewardClaimableDuration(projectTierId string) (int64, error) {
605	manager, err := lp.GetProjectTierRewardManager(projectTierId)
606	if err != nil {
607		return 0, err
608	}
609
610	return manager.RewardClaimableDuration(), nil
611}
612
613// GetRewardState retrieves a reward state by project tier ID and deposit ID.
614// Returns nil and error if reward manager or reward state not found.
615func (lp *launchpadV1) GetRewardState(projectTierId string, depositId string) (*launchpad.RewardState, error) {
616	managers := lp.store.GetProjectTierRewardManagers()
617	value, exists := managers.Get(projectTierId)
618	if !exists {
619		return nil, makeErrorWithDetails(errDataNotFound, "reward manager not found")
620	}
621
622	manager, ok := value.(*launchpad.RewardManager)
623	if !ok {
624		return nil, errors.New("invalid reward manager type")
625	}
626
627	rewards := manager.Rewards()
628	rewardValue, exists := rewards.Get(depositId)
629	if !exists {
630		return nil, makeErrorWithDetails(errDataNotFound, "reward state not found")
631	}
632
633	rewardState, ok := rewardValue.(*launchpad.RewardState)
634	if !ok {
635		return nil, errors.New("invalid reward state type")
636	}
637
638	return rewardState, nil
639}
640
641// GetProjectActiveStatus returns whether a project is currently active.
642// Returns false and error if project not found.
643func (lp *launchpadV1) GetProjectActiveStatus(projectId string) (bool, error) {
644	project, err := lp.getProject(projectId)
645	if err != nil {
646		return false, err
647	}
648
649	currentTime := time.Now().Unix()
650	return isProjectActive(project, currentTime), nil
651}