voting_info.gno
4.24 Kb · 144 lines
1package governance
2
3// VotingInfo tracks voting-related information for a specific user on a specific proposal.
4// This structure maintains the user's voting eligibility, voting history, and voting power.
5type VotingInfo struct {
6 availableVoteWeight int64 // Total voting weight available to this user for this proposal
7 votedWeight int64 // Actual weight used when voting (0 if not voted)
8 votedHeight int64 // Block height when vote was cast
9 votedAt int64 // Timestamp when vote was cast
10 votedYes bool // True if voted "yes", false if voted "no"
11 voted bool // True if user has already voted
12}
13
14// NewVotingInfo creates a new voting information structure for a user.
15// This constructor initializes the voting eligibility based on delegation snapshots.
16//
17// Parameters:
18// - availableVoteWeight: total voting weight available to this user
19//
20// Returns:
21// - VotingInfo: newly created voting information value
22func NewVotingInfo(availableVoteWeight int64) VotingInfo {
23 return VotingInfo{
24 availableVoteWeight: availableVoteWeight,
25 // Other fields are initialized to zero values (false, 0)
26 // voted starts as false, indicating no vote has been cast
27 }
28}
29
30// DefaultVotingInfo creates an empty voting information value.
31//
32// Returns:
33// - VotingInfo: zero-valued voting record with no available weight and no vote recorded
34func DefaultVotingInfo() VotingInfo {
35 return VotingInfo{}
36}
37
38// NewVotedVotingInfo creates a voting information value with a recorded vote.
39//
40// Parameters:
41// - availableVoteWeight: total voting weight available to the user for this proposal
42// - votedYes: true when the recorded vote is yes, false when it is no
43// - votedWeight: voting weight applied to the recorded vote
44// - votedHeight: block height at which the vote was recorded
45// - votedAt: Unix timestamp at which the vote was recorded
46//
47// Returns:
48// - VotingInfo: voting record populated with the supplied weight, choice, height, and timestamp and marked as voted
49func NewVotedVotingInfo(availableVoteWeight int64, votedYes bool, votedWeight, votedHeight, votedAt int64) VotingInfo {
50 return VotingInfo{
51 availableVoteWeight: availableVoteWeight,
52 votedWeight: votedWeight,
53 votedHeight: votedHeight,
54 votedAt: votedAt,
55 votedYes: votedYes,
56 voted: true,
57 }
58}
59
60// VotingType returns a human-readable string representation of the vote choice.
61//
62// Returns:
63// - string: "yes" or "no" based on voting choice
64func (v VotingInfo) VotingType() string {
65 if v.votedYes {
66 return "yes"
67 }
68
69 return "no"
70}
71
72// IsVoted checks if the user has already cast their vote.
73//
74// Returns:
75// - bool: true if user has voted on this proposal
76func (v VotingInfo) IsVoted() bool {
77 return v.voted
78}
79
80// VotedYes checks if the user voted "yes" on the proposal.
81// Only meaningful if IsVoted() returns true.
82//
83// Returns:
84// - bool: true if user voted "yes"
85func (v VotingInfo) VotedYes() bool {
86 return v.votedYes
87}
88
89// VotedNo checks if the user voted "no" on the proposal.
90// Only meaningful if IsVoted() returns true.
91//
92// Returns:
93// - bool: true if user voted "no"
94func (v VotingInfo) VotedNo() bool {
95 return !v.votedYes
96}
97
98// AvailableVoteWeight returns the total voting weight available to this user.
99// This weight is determined at proposal creation time based on delegation snapshots.
100//
101// Returns:
102// - int64: available voting weight
103func (v VotingInfo) AvailableVoteWeight() int64 {
104 return v.availableVoteWeight
105}
106
107// VotedWeight returns the weight actually used when voting.
108// Returns 0 if the user hasn't voted yet.
109//
110// Returns:
111// - int64: weight used for voting, or 0 if not voted
112func (v VotingInfo) VotedWeight() int64 {
113 if !v.voted {
114 return 0
115 }
116
117 return v.votedWeight
118}
119
120// VotedHeight returns the block height when the vote was cast.
121// Returns 0 if the user hasn't voted yet.
122//
123// Returns:
124// - int64: block height when vote was cast
125func (v VotingInfo) VotedHeight() int64 {
126 if !v.voted {
127 return 0
128 }
129
130 return v.votedHeight
131}
132
133// VotedAt returns the timestamp when the vote was cast.
134// Returns 0 if the user hasn't voted yet.
135//
136// Returns:
137// - int64: timestamp when vote was cast
138func (v VotingInfo) VotedAt() int64 {
139 if !v.voted {
140 return 0
141 }
142
143 return v.votedAt
144}