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}