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}