@@ -711,7 +711,16 @@ void CBudgetManager::VoteOnFinalizedBudgets()
711711 }
712712
713713 std::vector<CBudgetProposal> vBudget = GetBudget ();
714- // Vector containing the hash of finalized budgets to save
714+ if (vBudget.empty ()) {
715+ LogPrint (BCLog::MNBUDGET," %s: No proposal can be finalized\n " , __func__);
716+ return ;
717+ }
718+
719+ std::map<uint256, CBudgetProposal> mapWinningProposals;
720+ for (const CBudgetProposal& p: vBudget) {
721+ mapWinningProposals.emplace (p.GetHash (), p);
722+ }
723+ // Vector containing the hash of finalized budgets to sign
715724 std::vector<uint256> vBudgetHashes;
716725 {
717726 LOCK (cs_budgets);
@@ -722,8 +731,8 @@ void CBudgetManager::VoteOnFinalizedBudgets()
722731 pfb->SetAutoChecked (true );
723732 // only vote for exact matches
724733 if (strBudgetMode == " auto" ) {
725- // sort proposals and payments by votes and compare.
726- if (!pfb->CheckProposals (vBudget )) {
734+ // compare budget payements with winning proposals
735+ if (!pfb->CheckProposals (mapWinningProposals )) {
727736 continue ;
728737 }
729738 }
@@ -1938,63 +1947,50 @@ struct sortProposalsByHash {
19381947 }
19391948};
19401949
1941- bool CFinalizedBudget::CheckProposals (std::vector< CBudgetProposal>& vBudget ) const
1950+ bool CFinalizedBudget::CheckProposals (const std::map<uint256, CBudgetProposal>& mapWinningProposals ) const
19421951{
1943- // Sort proposals by hash
1944- std::sort (vBudget.begin (), vBudget.end (), std::greater<CBudgetProposal>());
1945-
1946- // Sort copy payments by hash (descending)
1947- std::vector<CTxBudgetPayment> vecBudgetPaymentsSortedByHash (vecBudgetPayments);
1948- std::sort (vecBudgetPaymentsSortedByHash.begin (), vecBudgetPaymentsSortedByHash.end (), std::greater<CTxBudgetPayment>());
1949-
1950- for (unsigned int i = 0 ; i < vecBudgetPaymentsSortedByHash.size (); i++) {
1951- LogPrint (BCLog::MNBUDGET," %s: Budget-Payments - nProp %d %s\n " , __func__, i, vecBudgetPaymentsSortedByHash[i].nProposalHash .ToString ());
1952- LogPrint (BCLog::MNBUDGET," %s: Budget-Payments - Payee %d %s\n " , __func__, i, HexStr (vecBudgetPaymentsSortedByHash[i].payee ));
1953- LogPrint (BCLog::MNBUDGET," %s: Budget-Payments - nAmount %d %lli\n " , __func__, i, vecBudgetPaymentsSortedByHash[i].nAmount );
1954- }
1955-
1956- for (unsigned int i = 0 ; i < vBudget.size (); i++) {
1957- LogPrint (BCLog::MNBUDGET," %s: Budget-Proposals - nProp %d %s\n " , __func__, i, vBudget[i].GetHash ().ToString ());
1958- LogPrint (BCLog::MNBUDGET," %s: Budget-Proposals - Payee %d %s\n " , __func__, i, HexStr (vBudget[i].GetPayee ()));
1959- LogPrint (BCLog::MNBUDGET," %s: Budget-Proposals - nAmount %d %lli\n " , __func__, i, vBudget[i].GetAmount ());
1960- }
1961-
1962- if (vBudget.size () == 0 ) {
1952+ if (mapWinningProposals.empty ()) {
19631953 LogPrint (BCLog::MNBUDGET," %s: No Budget-Proposals found, aborting\n " , __func__);
19641954 return false ;
19651955 }
19661956
1967- if (vBudget .size () != vecBudgetPaymentsSortedByHash .size ()) {
1968- LogPrint (BCLog::MNBUDGET," %s: Budget-Proposal length (%ld) doesn't match Budget-Payment length (%ld).\n " , __func__,
1969- vBudget .size (), vecBudgetPaymentsSortedByHash .size ());
1957+ if (mapWinningProposals .size () != vecBudgetPayments .size ()) {
1958+ LogPrint (BCLog::MNBUDGET," %s: Budget-Proposal length (%ld) doesn't match Budget-Payment length (%ld).\n " ,
1959+ __func__, mapWinningProposals .size (), vecBudgetPayments .size ());
19701960 return false ;
19711961 }
19721962
1973- for (unsigned int i = 0 ; i < vecBudgetPaymentsSortedByHash.size (); i++) {
1974- if (i > vBudget.size () - 1 ) {
1975- LogPrint (BCLog::MNBUDGET," %s: Proposal size mismatch, i=%d > (vBudgetProposals.size() - 1)=%d\n " ,
1976- __func__, i, vBudget.size () - 1 );
1977- return false ;
1978- }
1963+ for (unsigned int i = 0 ; i < vecBudgetPayments.size (); i++) {
1964+ LogPrint (BCLog::MNBUDGET," %s: Budget-Payments - nProp %d %s\n " , __func__, i, vecBudgetPayments[i].nProposalHash .ToString ());
1965+ LogPrint (BCLog::MNBUDGET," %s: Budget-Payments - Payee %d %s\n " , __func__, i, HexStr (vecBudgetPayments[i].payee ));
1966+ LogPrint (BCLog::MNBUDGET," %s: Budget-Payments - nAmount %d %lli\n " , __func__, i, vecBudgetPayments[i].nAmount );
1967+ }
1968+
1969+ for (const auto & it: mapWinningProposals) {
1970+ LogPrint (BCLog::MNBUDGET," %s: Budget-Proposals - nProp %s\n " , __func__, (it.first ).ToString ());
1971+ LogPrint (BCLog::MNBUDGET," %s: Budget-Proposals - Payee %s\n " , __func__, HexStr ((it.second ).GetPayee ()));
1972+ LogPrint (BCLog::MNBUDGET," %s: Budget-Proposals - nAmount %lli\n " , __func__, (it.second ).GetAmount ());
1973+ }
19791974
1980- if (vecBudgetPaymentsSortedByHash[i].nProposalHash != vBudget[i].GetHash ()) {
1981- LogPrint (BCLog::MNBUDGET," %s: item #%d doesn't match %s %s\n " , __func__,
1982- i, vecBudgetPaymentsSortedByHash[i].nProposalHash .ToString (), vBudget[i].GetHash ().ToString ());
1975+ for (const CTxBudgetPayment& p: vecBudgetPayments) {
1976+ const auto & it = mapWinningProposals.find (p.nProposalHash );
1977+ if (it == mapWinningProposals.end ()) {
1978+ LogPrint (BCLog::MNBUDGET," %s: Proposal %s not found\n " , __func__, p.nProposalHash .ToString ());
19831979 return false ;
19841980 }
19851981
1986- if ( HexStr (vecBudgetPaymentsSortedByHash[i]. payee ) != HexStr (vBudget[i]. GetPayee ())) {
1987- LogPrint (BCLog::MNBUDGET, " %s: item #%d payee doesn't match %s %s \n " , __func__,
1988- i , HexStr (vecBudgetPaymentsSortedByHash[i] .payee ), HexStr (vBudget[i] .GetPayee ()));
1982+ const CBudgetProposal& prop = it-> second ;
1983+ if (p. payee != prop. GetPayee ()) {
1984+ LogPrint (BCLog::MNBUDGET, " %s: payee doesn't match %s != %s \n " , __func__ , HexStr (p .payee ), HexStr (prop .GetPayee ()));
19891985 return false ;
19901986 }
19911987
1992- if (vecBudgetPaymentsSortedByHash[i].nAmount != vBudget[i].GetAmount ()) {
1993- LogPrint (BCLog::MNBUDGET," %s: item #%d payee doesn't match %lli %lli\n " , __func__,
1994- i, vecBudgetPaymentsSortedByHash[i].nAmount , vBudget[i].GetAmount ());
1988+ if (p.nAmount != prop.GetAmount ()) {
1989+ LogPrint (BCLog::MNBUDGET," %s: payee amount doesn't match %lli != %lli\n " , __func__, p.nAmount , prop.GetAmount ());
19951990 return false ;
19961991 }
19971992 }
1993+
19981994 LogPrint (BCLog::MNBUDGET," %s: Finalized Budget Matches! Submitting Vote.\n " , __func__);
19991995 return true ;
20001996}
0 commit comments