github.com/DapperCollectives/CAST/backend@v0.0.0-20230921221157-1350c8be7c96/main/strategies/one_address_one_vote.go (about) 1 package strategies 2 3 import ( 4 "fmt" 5 6 "github.com/DapperCollectives/CAST/backend/main/models" 7 "github.com/DapperCollectives/CAST/backend/main/shared" 8 s "github.com/DapperCollectives/CAST/backend/main/shared" 9 "github.com/jackc/pgx/v4" 10 "github.com/rs/zerolog/log" 11 ) 12 13 type OneAddressOneVote struct { 14 s.StrategyStruct 15 DB *s.Database 16 } 17 18 func (s *OneAddressOneVote) FetchBalance( 19 b *models.Balance, 20 p *models.Proposal, 21 ) (*models.Balance, error) { 22 23 if err := b.GetBalanceByAddressAndBlockHeight(s.DB); err != nil && err.Error() != pgx.ErrNoRows.Error() { 24 log.Error().Err(err).Msg("Error querying address b at blockheight.") 25 return nil, err 26 } 27 28 if b.ID == "" { 29 if err := b.CreateBalance(s.DB); err != nil { 30 log.Error().Err(err).Msg("Error saving b to database.") 31 return nil, err 32 } 33 } 34 35 return b, nil 36 } 37 38 func (s *OneAddressOneVote) TallyVotes( 39 votes []*models.VoteWithBalance, 40 r *models.ProposalResults, 41 proposal *models.Proposal, 42 ) (models.ProposalResults, error) { 43 44 for _, vote := range votes { 45 r.Results[vote.Choice]++ 46 } 47 48 return *r, nil 49 } 50 51 func (s *OneAddressOneVote) GetVoteWeightForBalance( 52 vote *models.VoteWithBalance, 53 proposal *models.Proposal, 54 ) (float64, error) { 55 var weight float64 56 var ERROR error = fmt.Errorf("No address found.") 57 58 if vote.Addr == "" { 59 return 0.00, ERROR 60 } 61 weight = 1.00 62 63 return weight, nil 64 } 65 66 func (s *OneAddressOneVote) GetVotes( 67 votes []*models.VoteWithBalance, 68 proposal *models.Proposal, 69 ) ([]*models.VoteWithBalance, error) { 70 71 for _, vote := range votes { 72 weight, err := s.GetVoteWeightForBalance(vote, proposal) 73 if err != nil { 74 return nil, err 75 } 76 vote.Weight = &weight 77 } 78 79 return votes, nil 80 } 81 82 func (s *OneAddressOneVote) RequiresSnapshot() bool { 83 return false 84 } 85 86 func (s *OneAddressOneVote) InitStrategy( 87 f *shared.FlowAdapter, 88 db *shared.Database, 89 ) { 90 s.FlowAdapter = f 91 s.DB = db 92 }