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

getter.gno

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