Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

voting, rpc, gui: Implement demand loading of historical poll by poll id and AVW calculation #2210

Merged

Conversation

jamescowens
Copy link
Member

@jamescowens jamescowens commented Jul 4, 2021

This PR implements a temporary workaround to demand load a poll with the specified (poll transaction) id and the corresponding votes in the chain for the duration of the poll. This allows pulling up old polls in the wallet that are older than the 180 day contract lookback window for contract scanning during wallet init.

This workaround is activated by calling getpollresults poll_id with a valid id that is older than the lookback (i.e. not already in the poll registry). Note that the transaction id containing the poll must be known in advance as this will not work for a poll specified via title.

The old behavior was simply to return poll not found for any poll older than the lookback.

This workaround is very convenient for someone wanting to check a historical poll's information from a historical poll on gidcoinstats.eu for example.

Once getpollresults is called on a valid historical poll, it will be fully loaded, and then will also appear in the GUI, because it has now been loaded in the poll registry.

Note this is intended to be temporary and should be replaced when the improved poll/vote state machine and caching is implemented.

This PR also implements the calculation of GetActiveVoteWeight() in an expired or active poll. To maximize the efficiency of the calculation, the starting and ending block index pointer for the poll is determined (ending being the current pindexBest if the poll is active), and a single scan through the index is done.

It has been instrumented with a timer, and based on testing, it takes on average 50 - 1000 msec depending on the length of the poll, so the overhead is not too bad.

AVW and the Vote Weight % of AVW (a very important metric for poll validation) have been added to the voting GUI.

Closes #2015.
Closes #2209.

@RoboticMind
Copy link
Contributor

Question for future scripting use: does this work for only v2 polls or v1 and v2 polls? Either way this is still really useful

@jamescowens
Copy link
Member Author

I just tweaked it. It works for both, although, you cannot scan in a historical v1 poll/results by title. You must know the txid of the transaction containing the legacy poll.

@jamescowens
Copy link
Member Author

I have also implemented starting and ending (if applicable) block height fields for poll results, because it would appear to be useful for external scripts using the information.

getpollresults df3af5f55268bd71b7498da4690d36b9ba7eb1f403162f72fce5d3cd950e04d9
{
"poll_id": "df3af5f55268bd71b7498da4690d36b9ba7eb1f403162f72fce5d3cd950e04d9",
"poll_title": "technical_poll:_should_we_implement_fixed_pos_block_rewards?",
"poll_expired": true,
"starting_block_height": 1018333,
"ending_block_height": 1037461,
"votes": 170,
"invalid_votes": 19,
"total_weight": 58370964.63848168,
"top_choice_id": 0,
"top_choice": "Yes",
"responses": [
{
"choice": "Yes",
"id": 0,
"weight": 54752273.04727800,
"votes": 122
},
{
"choice": "No",
"id": 1,
"weight": 2989924.69892376,
"votes": 16
},
{
"choice": "Abstain",
"id": 2,
"weight": 628766.89227992,
"votes": 13
}
]
}

@jamescowens
Copy link
Member Author

I am going to do some rearranging of the new code I added to refine it. I think I can also take a stab at AVW.

@jamescowens jamescowens force-pushed the fix_old_poll_pullup branch 2 times, most recently from 16c1d6c to 7770a29 Compare July 5, 2021 06:07
@jamescowens
Copy link
Member Author

Ok. Rearranging done. I will think about AVW tomorrow.

@jamescowens jamescowens changed the title voting, rpc: Implement demand loading of historical poll by poll id voting, rpc: Implement demand loading of historical poll by poll id and AVW calculation Jul 5, 2021
@jamescowens jamescowens force-pushed the fix_old_poll_pullup branch 4 times, most recently from 9430f24 to 61e257a Compare July 6, 2021 00:23
@jamescowens
Copy link
Member Author

jamescowens commented Jul 6, 2021

AVW is done.

Here are two examples:

v2 poll:
getpollresults d3c5a547312acb4b97ae37594cadfc98bc72d174dfc9c5892fa4b4a3e9c1f25b
{
"poll_id": "d3c5a547312acb4b97ae37594cadfc98bc72d174dfc9c5892fa4b4a3e9c1f25b",
"poll_title": "Should Gridcoin whitelist the BOINC project SiDock@home?",
"poll_expired": true,
"starting_block_height": 2272529,
"ending_block_height": 2291393,
"votes": 357,
"invalid_votes": 42,
"total_weight": 108434615.37915860,
"active_vote_weight": 228512571.82289608,
"vote_percent_avw": 47.45236313002446,
"top_choice_id": 0,
"top_choice": "Yes",
"responses": [
{
"choice": "Yes",
"id": 0,
"weight": 105234494.34476914,
"votes": 294
},
{
"choice": "No",
"id": 1,
"weight": 1670072.55222291,
"votes": 12
},
{
"choice": "Abstain",
"id": 2,
"weight": 1530048.48216655,
"votes": 9
}
]
}

v1 poll:

getpollresults 22c2ee5e0c049ce93acc6f40d0430f6335367da1c3f61c66d211863cb346600d
{
"poll_id": "22c2ee5e0c049ce93acc6f40d0430f6335367da1c3f61c66d211863cb346600d",
"poll_title": "constant_block_reward_(cbr)_proposal_and_poll",
"poll_expired": true,
"starting_block_height": 1215850,
"ending_block_height": 1267726,
"votes": 412,
"invalid_votes": 81,
"total_weight": 128895044.12683587,
"active_vote_weight": 87902296.08747266,
"vote_percent_avw": 146.6344451327765,
"top_choice_id": 2,
"top_choice": "75/25_with_a_10_GRC_block_reward",
"responses": [
{
"choice": "65/35_with_a_16_GRC_block_reward",
"id": 0,
"weight": 3154376.42412304,
"votes": 25.33333333333333
},
{
"choice": "70/30_with_a_13_GRC_block_reward",
"id": 1,
"weight": 3793019.66460565,
"votes": 11.16666666666667
},
{
"choice": "75/25_with_a_10_GRC_block_reward",
"id": 2,
"weight": 83638309.31465761,
"votes": 166.3333333333334
},
{
"choice": "80/20_with_a_7_GRC_block_reward",
"id": 3,
"weight": 1121641.64235769,
"votes": 27
},
{
"choice": "85/15_with_a_5_GRC_block_reward",
"id": 4,
"weight": 35674085.01625876,
"votes": 77.16666666666666
},
{
"choice": "Reject_Proposal",
"id": 5,
"weight": 1104032.09673936,
"votes": 12
},
{
"choice": "Abstain",
"id": 6,
"weight": 409579.96809376,
"votes": 12
}
]
}

@RoboticMind
Copy link
Contributor

Compared these against the Python script I wrote which matches these numbers very closely (within various averaging differences):

% of AVW comparison:

Poll ID Python Script getpollresults
d3c5a547312acb4b97ae37594cadfc98bc72d174dfc9c5892fa4b4a3e9c1f25b 47.447200759708934 47.45236313002446
c8a5d3417f3bacd086fd1cb1be84c00f659fcdddd945d404a421b30e287a4211 51.650724871714246 51.48743989360435
22c2ee5e0c049ce93acc6f40d0430f6335367da1c3f61c66d211863cb346600d 144.2369534918115 146.6344451327765

These numbers differences are likely all accounted for by the endpoint average method in my script for money supply vs the block by block in this code

Full Python Script Output

d3c5a547312acb4b97ae37594cadfc98bc72d174dfc9c5892fa4b4a3e9c1f25b

Looking at the poll with title: "Should Gridcoin whitelist the BOINC project SiDock@home?"

Poll started at block 2272529 and has ended. Finding when it ended | step 1/5
Poll ended at block 2291393

Finding the average money supply | step 2/5
Average money supply is 447791697

Finding the average pool magnitudes (this may take a minute) | step 3/5
Average magnitude is 27402.047655649498

Finding average difficulty (this may take a minute) | step 4/5
Average difficulty is 17.64181382450703

Finding poll voteweight (this may take a minute) | step 5/5
voteweight is 108434615.3791586

AVW is 228537434.54395473

----------
% of AVW is 47.447200759708934
----------

c8a5d3417f3bacd086fd1cb1be84c00f659fcdddd945d404a421b30e287a4211

Looking at the poll with title: "Dispersing Funds for Past Development Work"

Poll started at block 2241781 and has ended. Finding when it ended | step 1/5
Poll ended at block 2260703

Finding the average money supply | step 2/5
Average money supply is 446555291

Finding the average pool magnitudes (this may take a minute) | step 3/5
Average magnitude is 27412.729281767955

Finding average difficulty (this may take a minute) | step 4/5
Average difficulty is 17.30340773651324

Finding poll voteweight (this may take a minute) | step 5/5
voteweight is 116283417.28822023

AVW is 225134143.9583573

----------
% of AVW is 51.650724871714246
----------

22c2ee5e0c049ce93acc6f40d0430f6335367da1c3f61c66d211863cb346600d

Looking at the poll with title: "Constant_Block_Reward_(CBR)_Proposal_and_Poll"

Poll started at block 1215850 and has ended. Finding when it ended | step 1/5
Poll ended at block 1267725

Finding the average money supply | step 2/5
Average money supply is 404148794

Finding the average pool magnitudes (this may take a minute) | step 3/5
Average magnitude is 32359.677272727273

Finding average difficulty (this may take a minute) | step 4/5
Average difficulty is 3.996271125301249

Finding poll voteweight (this may take a minute) | step 5/5
voteweight is 128895109.01299503

AVW is 89363409.08714221

----------
% of AVW is 144.23700967730954
----------

@jamescowens
Copy link
Member Author

Thanks @RoboticMind with a complicated calculation like AVW, it is good to get a completely independent verification of the results. :)

@jamescowens
Copy link
Member Author

jamescowens commented Jul 6, 2021

Some handwritten notes on vote weight...
03E7BDE4-6A95-4CA1-9F5C-88E470DC748A

@jamescowens
Copy link
Member Author

Ah, what the heck. I have a little more energy tonight. Let's see if I can do a commit to get AVW in the GUI.

@jamescowens jamescowens changed the title voting, rpc: Implement demand loading of historical poll by poll id and AVW calculation voting, rpc, gui: Implement demand loading of historical poll by poll id and AVW calculation Jul 6, 2021
@jamescowens
Copy link
Member Author

jamescowens commented Jul 6, 2021

This shows the "card" style with an older (v1) poll demand loaded via getpollresults 22c2ee5e0c049ce93acc6f40d0430f6335367da1c3f61c66d211863cb346600d after a wallet start and then refresh the voting GUI.
image

Here is the table view, sorted by % of Active Vote Weight
image
scrolled over...
image

@RoboticMind
Copy link
Contributor

Tested this locally and it looks pretty good. For some reason in your screenshot the arrow is overlapping the text on the table, but it doesn't for me when I tested. The only other really minor thing I noticed is that the kerning between the W in AVW and the : is a bit off (looks too close to it), but not sure how easy that is to change

@denravonska denravonska self-requested a review July 11, 2021 06:39
Copy link
Member

@denravonska denravonska left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

utACK with minor style suggestions.

src/rpc/blockchain.cpp Outdated Show resolved Hide resolved
@jamescowens
Copy link
Member Author

Ok. Here is the first test on testnet using a node with a build prior to this PR to create a poll with the same title only differing by the case of the first letter.
Once the poll was activated, here is what it looks like on that node:
image

Here is what the node with this PR sees:
image

@jamescowens
Copy link
Member Author

As expected based on my review of the consensus code, this doesn't cause a consensus issue per se, because the node with this PR simply doesn't insert the second poll with the same title but a lowercase P.

@jamescowens
Copy link
Member Author

Let's try and insert a poll with the same title on the node with the PR, but with the case differing.

@jamescowens
Copy link
Member Author

Ok. Found another bug with this. The creation was successful according to the UI, but it is not showing in either list. This is because on the post PR node, it won't pass the emplace line (which uses the to_lower title), and the same on the pre-PR node, because there is already a node with the small p there.

I need to add a condition to the poll insert in the GUI to do to_lower on the poll title and also check for existing polls with the same title (if not already done).

@jamescowens
Copy link
Member Author

Note. And this is an important concept. The polls are primarily keyed in v2 by txid, not title; HOWEVER, it still does not make sense to allow two polls to exist with the same title (even if they differ by case only), because that results in a misleading situation.

Prior to Fern, this was a way to override old polls with new ones of the same name. Allowing two polls with the same title but indexed by txid presents a different, less serious, but still confusing issue, which is that two polls of the same title would be present in the UI.

@jamescowens
Copy link
Member Author

Ok. I put a duplicate title check in CWalletTx PollBuilder::BuildContractTx(CWallet* const pwallet). Now an attempt to create a poll contract with the same (case-insensitive) title results in...
image

@jamescowens
Copy link
Member Author

jamescowens commented Jul 11, 2021

Duplicate check works properly from rpc too...

addpoll "Poll title case test" 7 "Is P in poll capitalized (try 4)?" "" 2 1 "http://foo.com"
Poll with that title already exists. Please choose another title. (code -1)

This commit implements an expanded version of TryByTxid() to demand load a poll with the
specified (poll transaction) id and the corresponding votes in the chain for the duration
of the poll if the poll was not found in the registry. This allows pulling up old polls
in the wallet that are older than the 180 day contract lookback window for contract
scanning during wallet init.

This workaround is activated by calling getpollresults poll_id with a valid id that is
older than the lookback (i.e. not already in the poll registry). Note that the transaction
id containing the poll must be known in advance as this will not work for a poll specified
via title.

The old behavior was simply to return poll not found for any poll older than the lookback.

This workaround is very convenient for someone wanting to check a historical poll's
information from a historical poll on gridcoinstats.eu for example.

Once getpollresults is called on a valid historical poll, it will be fully loaded, and then
will also appear in the GUI, because it has now been loaded in the poll registry.

Note this is intended to be temporary and should be replaced when the improved poll/vote
state machine and caching is implemented.
Note that poll titles that differ only by case should never be allowed
to coexist. This also fixes the broken search by title.

This commit also fixes a trivial signed vs unsigned comparison warning.
@jamescowens jamescowens force-pushed the fix_old_poll_pullup branch 2 times, most recently from 49d91ce to f431bf4 Compare July 11, 2021 16:07
This implements the calculation of GetActiveVoteWeight() in a expired or active poll.

To maximize the efficiency of the calculation, the starting and ending block index pointer
for the poll is determined (ending being the current pindexBest if the poll is active),
and a single scan through the index is done.

It has been instrumented with a timer, and based on testing, it takes on average 50 - 1000 msec
depending on the length of the poll.

The calculation is implemented entirely in uint256 arithmetic because it is anticipated that
AVW will be used in certain protocol rules that will be subject to consensus.
The proper behavior of the rpc and GUI should be to refuse to create a poll
with the same title (case-insensitive) as one already in the registry.
This commit updates dumpcontracts to allow a dump as a text file of
minimal information to allow external scripting of tests. This mode
is in addition to the original native serialzation dump which is
intended for building the data file for automated unit testing.

It also allows specification of "*" as the contract type to dump all
contracts.
@jamescowens jamescowens removed the request for review from iFoggz July 12, 2021 04:04
@jamescowens
Copy link
Member Author

@div72 please take a final look at this.

Copy link
Member

@div72 div72 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ACK 7aae8db.

src/gridcoin/voting/registry.cpp Show resolved Hide resolved
src/rpc/blockchain.cpp Show resolved Hide resolved
@jamescowens jamescowens removed the request for review from cyrossignol July 12, 2021 15:38
@jamescowens jamescowens merged commit 322f29c into gridcoin-community:development Jul 12, 2021
@jamescowens jamescowens deleted the fix_old_poll_pullup branch July 24, 2021 00:23
jamescowens added a commit to jamescowens/Gridcoin-Research that referenced this pull request Aug 1, 2021
Added
 - util, rpc. gui: Changes for snapshotdownload and add feature sync from zero gridcoin-community#2093 (@iFoggz)
 - gui: Implement GUI version of consolidateunspent (coin control part) gridcoin-community#2111 (@jamescowens)
 - gui: Implement consolidateunspent wizard gridcoin-community#2125 (@jamescowens)
 - qt: Add antialiasing to traffic graph widget gridcoin-community#2150 (@barton2526)
 - util: Port of ArgsManager and a significant subset of src/util gridcoin-community#2146 (@jamescowens)
 - doc: add issue templates for bug reports and feature requests gridcoin-community#2147 (@Pythonix)
 - gui, rpc: Implement dynamic stakesplitting control, settings changes via rpc, and dynamic changes to sidestaking via rpc gridcoin-community#2164 (@jamescowens)
 - rpc: Implement getblocksbatch gridcoin-community#2205 (@jamescowens)
 - voting, rpc, gui: Implement demand loading of historical poll by poll id and AVW calculation gridcoin-community#2210 (@jamescowens)
 - gui: Show GUI error dialog if command line parsing fails gridcoin-community#2218 (@jamescowens)
 - gui: Implement close confirmation. gridcoin-community#2216 (@denravonska)
 - build: Use -fstack-reuse=none gridcoin-community#2232 (@barton2526)

Changed
 - doc: Update build doc gridcoin-community#2078 (@iFoggz)
 - gui: Normalize button and input control appearance gridcoin-community#2096 (@cyrossignol)
 - consensus: Implement GetMinimumRequiredConnectionsForStaking gridcoin-community#2097 (@jamescowens)
 - refactor: move CTransaction to primitives gridcoin-community#2006 (@div72)
 - consensus, refactor, test: Merkle gridcoin-community#2094 (@div72)
 - gui: Update diagnostics gridcoin-community#2095 (@jamescowens)
 - gui: Refresh UI styles and sidebar/statusbar design gridcoin-community#2102 (@cyrossignol)
 - gui: Set standard base Qt style on Windows and macOS gridcoin-community#2114 (@cyrossignol)
 - build, refactor: bump to C++17 gridcoin-community#2113 (@div72)
 - util, rpc, gui: Implement GetMaxInputsForConsolidationTxn() gridcoin-community#2119 (@jamescowens)
 - gui: Refresh overview page design gridcoin-community#2117 (@cyrossignol)
 - depends: change boost mirror gridcoin-community#2122 (@div72)
 - refactor: small cleanup gridcoin-community#2123 (@div72)
 - build: Update depends Qt recipe to version 5.12.10 gridcoin-community#2129 (@cyrossignol)
 - build: Bump Codespell to 2.0.0 gridcoin-community#2135 (@barton2526)
 - gui: Refresh "send coins" page design gridcoin-community#2126 (@cyrossignol)
 - gui: Optimize locks to improve responsiveness gridcoin-community#2137 (@cyrossignol)
 - gui: Refresh "receive payment" page design gridcoin-community#2138 (@cyrossignol)
 - gui: Add empty placeholder to recent transactions list gridcoin-community#2140 (@cyrossignol)
 - gui: Refresh transaction history page design gridcoin-community#2143 (@cyrossignol)
 - gui: Refresh address book page design gridcoin-community#2145 (@cyrossignol)
 - doc: Update http to https where possible gridcoin-community#2148 (@barton2526)
 - depends: Update dependencies gridcoin-community#2153 (@barton2526)
 - depends: Bump python to 3.6 gridcoin-community#2159 (@barton2526)
 - test: Update cppcheck linter to c++17 gridcoin-community#2157 (@barton2526)
 - test: Drop Travis specific workarounds, Mention commit id in error, Fix typos, Update spellcheck ignore words gridcoin-community#2158 (@barton2526)
 - gui: Overhaul the voting UI gridcoin-community#2151 (@cyrossignol)
 - wallet: simplify nTimeSmart calculation gridcoin-community#2144 (@div72)
 - gui: Refresh checkbox and radio button styles gridcoin-community#2170 (@cyrossignol)
 - build: Bump libevent to 2.1.11 gridcoin-community#2172 (@barton2526)
 - build: Update native_mac_alias, Remove big sur patch file in qt recipe gridcoin-community#2173 (@barton2526)
 - docs: Misc Grammar gridcoin-community#2176 (@barton2526)
 - build: miniupnpc 2.2.2 gridcoin-community#2179 (@barton2526)
 - rpc: Refresh rainbymagnitude gridcoin-community#2163 (@jamescowens)
 - util: optimize HexStr gridcoin-community#2185 (@div72)
 - refactor: misc style changes gridcoin-community#2177 (@div72)
 - rpc: consolidatemsunspent changes. gridcoin-community#2136 (@iFoggz)
 - refactor: Replace "GlobalStatus" state management gridcoin-community#2183 (@cyrossignol)
 - rpc, util: Remove use of ArgsManager::NETWORK_ONLY for now gridcoin-community#2190 (@jamescowens)
 - doc: Replace hidden service with onion service, Capitalize "Tor" gridcoin-community#2193 (@barton2526)
 - gui: Update Qt Linguist localization files gridcoin-community#2192 (@cyrossignol)
 - script: Shell script cleanups gridcoin-community#2195 (@barton2526)
 - build: set minimum required Boost to 1.58.0 gridcoin-community#2194 (@barton2526)
 - build, util: Prevent execution for Windows versions less than Windows 7 gridcoin-community#2203 (@jamescowens)
 - build: Tweak NSIS Windows installer gridcoin-community#2204 (@jamescowens)
 - build: Add bison in depends gridcoin-community#2206 (@iFoggz)
 - build: macOS toolchain bump gridcoin-community#2207 (@div72)
 - doc: Update build-unix.md gridcoin-community#2212 (@springfielddatarecovery)
 - build: Bump minimum python version to 3.6, Remove python2 references gridcoin-community#2219 (@barton2526)
 - depends: Change openSSL source path to Github gridcoin-community#2237 (@barton2526)
 - doc: Fix typo in bug report template gridcoin-community#2243 (@jamescowens)
 - ci: fold depends output gridcoin-community#2244 (@div72)

Removed
 - wallet: remove dead hardcoded addnodes gridcoin-community#2116 (@sweede-se)
 - rpc: Remove readconfig gridcoin-community#2248 (@jamescowens)
 - rpc: Remove obsolete comparesnapshotaccrual RPC function gridcoin-community#2100 (@jamescowens)
 - rpc: Remove memorypool RPC Command gridcoin-community#2214 (@RoboticMind)
 - rpc: Remove deprecated RPC commands gridcoin-community#2101 (@jamescowens)
 - Remove CCT from README, add Discord gridcoin-community#2134 (@barton2526)
 - refactor: Remove obsolete pubsub method definitions gridcoin-community#2191 (@barton2526)
 - refactor: Remove msMiningErrorsIncluded & msMiningErrorsExcluded gridcoin-community#2215 (@RoboticMind)
 - qt: Remove obsolete topLevelWidget(), Remove obsolete QRegExpValidator gridcoin-community#2198 (@barton2526)
 - net: Drop support of the insecure miniUPnPc versions gridcoin-community#2178 (@barton2526)
 - log: remove deprecated db log category gridcoin-community#2201 (@barton2526)
 - doc: Remove CCT from README and release process docs gridcoin-community#2175 (@barton2526)
 - build: Remove travis references gridcoin-community#2156 (@barton2526)

Fixed
 - gui: Fix macOS and designer font sizes gridcoin-community#2098 (@cyrossignol)
 - gui: Have the TrafficGraphWidget respect the selected stylesheet. gridcoin-community#2107 (@jamescowens)
 - gui: Fix macOS display inconsistencies gridcoin-community#2106 (@cyrossignol)
 - gui: Fix RPC console auto-complete background color gridcoin-community#2108 (@cyrossignol)
 - gui: Avoid reloading redundant stylesheets gridcoin-community#2109 (@cyrossignol)
 - gui: Fix "no active beacon" status gridcoin-community#2110 (@cyrossignol)
 - gui: Fix dark theme link text color visibility gridcoin-community#2115 (@cyrossignol)
 - scraper, util, qt: Fix several deprecations and warnings gridcoin-community#2131 (@jamescowens)
 - gui: Fix duplicate time in GUIUtil::dateTimeStr() gridcoin-community#2139 (@cyrossignol)
 - gui: Fix debug console traffic graph legend colors gridcoin-community#2142 (@cyrossignol)
 - gui: Fix nomenclature gridcoin-community#2104 (@jamescowens)
 - doc: Fix Typos gridcoin-community#2149 (@barton2526)
 - doc: Fix "master" branch build status badge in readme gridcoin-community#2167 (@cyrossignol)
 - gui: Fix Inter font rendering on Windows with FreeType gridcoin-community#2169 (@cyrossignol)
 - gui: Fix assert on non-existent data directory and GUI datadir chooser corner case issues gridcoin-community#2174 (@jamescowens)
 - gui: Fix display artifact in poll loading indicator gridcoin-community#2180 (@cyrossignol)
 - rpc, logging: Minor fixes for sidestake logging gridcoin-community#2187 (@jamescowens)
 - gui: Fix fractional scaling for dialog sizes gridcoin-community#2189 (@cyrossignol)
 - doc: Random fixes gridcoin-community#2197 (@barton2526)
 - doc: getbalance should say GRC not "btc" gridcoin-community#2199 (@barton2526)
 - net: Add missing verification of IPv6 address in CNetAddr::GetIn6Addr¦ gridcoin-community#2200 (@barton2526)
 - doc: remove duplicate line from .gitignore gridcoin-community#2202 (@Pythonix)
 - util: Tweak exception handling in MilliTimer class to eliminate compiler warnings gridcoin-community#2233 (@jamescowens)
 - depends: patch missing include in qt gridcoin-community#2234 (@div72)
 - wallet, rpc: Check each input for IsMine() in GetAddressGroupings gridcoin-community#2242 (@jamescowens)
 - util, qt: Fix snapshot download gridcoin-community#2246 (@jamescowens)
 - gui: Fix Column Widths in RPC Console. Elide long strings in their center. Indent user agent. gridcoin-community#2241 (@barton2526)
 - qt: Fix crash during download snapshot on macOS gridcoin-community#2250 (@jamescowens)
 - qt: Don't allow to open the debug window during splashscreen & verification state gridcoin-community#2245 (@barton2526)
 - gui: Fix address book selected model record when editing gridcoin-community#2253 (@cyrossignol)
 - researcher: Check wallet status before beacon renewal gridcoin-community#2254 (@cyrossignol)
 - qt: Prevent pasting (no label) as label in consolidation transaction gridcoin-community#2255 (@jamescowens)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Make Getpollresults Work for All Past Polls Show % of AVW For Polls In Wallet
5 participants