project_condition.gno
2.47 Kb ยท 92 lines
1package launchpad
2
3import (
4 "strconv"
5 "strings"
6
7 "gno.land/p/nt/ufmt"
8)
9
10const stringSplitterPad = "*PAD*"
11
12// ProjectCondition represents a condition for a project.
13//
14// This struct contains the necessary data and methods to manage and distribute
15// rewards for a specific project.
16//
17// Fields:
18// - tokenPath (string): The path of the token associated with the project.
19// - minimumAmount (int64): The minimum amount of the token required for the project.
20type ProjectCondition struct {
21 tokenPath string
22 minimumAmount int64
23}
24
25func (p *ProjectCondition) TokenPath() string {
26 return p.tokenPath
27}
28
29func (p *ProjectCondition) MinimumAmount() int64 {
30 return p.minimumAmount
31}
32
33func (p *ProjectCondition) IsAvailable() bool {
34 return p.tokenPath != "" && p.minimumAmount > 0
35}
36
37func (p *ProjectCondition) CheckBalanceCondition(inputTokenPath string, inputAmount int64) error {
38 if p.tokenPath != inputTokenPath {
39 return ufmt.Errorf("token path(%s) is not matched", inputTokenPath)
40 }
41
42 if inputAmount < p.minimumAmount {
43 return ufmt.Errorf("input amount(%d) is less than minimum amount(%d)", inputAmount, p.minimumAmount)
44 }
45
46 return nil
47}
48
49func (p ProjectCondition) Clone() *ProjectCondition {
50 return &ProjectCondition{
51 tokenPath: p.tokenPath,
52 minimumAmount: p.minimumAmount,
53 }
54}
55
56func NewProjectCondition(tokenPath string, minimumAmount int64) *ProjectCondition {
57 return &ProjectCondition{
58 tokenPath: tokenPath,
59 minimumAmount: minimumAmount,
60 }
61}
62
63func NewProjectConditionsWithError(conditionTokens string, conditionAmounts string) ([]*ProjectCondition, error) {
64 if conditionTokens == "" && conditionAmounts == "" {
65 return []*ProjectCondition{}, nil
66 }
67
68 conditions := []*ProjectCondition{}
69
70 tokenPaths := strings.Split(conditionTokens, stringSplitterPad)
71 minimumAmounts := strings.Split(conditionAmounts, stringSplitterPad)
72
73 for index, tokenPath := range tokenPaths {
74 if index >= len(minimumAmounts) {
75 return nil, ufmt.Errorf("condition amount(%s) is not matched with condition token(%s)", conditionAmounts, conditionTokens)
76 }
77
78 minimumAmount, err := strconv.ParseInt(minimumAmounts[index], 10, 64)
79 if err != nil {
80 return nil, ufmt.Errorf("condition amount(%s) is not a valid integer", minimumAmounts[index])
81 }
82
83 condition := NewProjectCondition(tokenPath, minimumAmount)
84 if !condition.IsAvailable() {
85 return nil, ufmt.Errorf("condition(%s) is not available", condition.TokenPath())
86 }
87
88 conditions = append(conditions, condition)
89 }
90
91 return conditions, nil
92}