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  }