Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}