Project Information
- Repository: https://github.com/steemit/steem
- Project Name: Steem
I've opened the issue and also submitted PR.
Issue: https://github.com/steemit/steem/issues/3217
PR: https://github.com/steemit/steem/pull/3218 (merged)
Expected behavior
voting_power should show the voting power at last_vote_time.
Actual behavior
voting_power is set to 0 for users who haven't voted more than 5 days but had some transactions that affected effective vesting shares (e.g., claim reward, power up, delegations).
Even though the current voting power can be calculated from voting_manabar, the main reason why voting_power is provided is for legacy code. Since most apps use voting_power with last_vote_time to calculate current voting power.
Because of this, most developers believe that voting_power is the voting power at last_vote_time and it actually was before HF20. This reset is only for users who haven't voted more than 5 days, so despite the reset, current voting power can be correctly calculated as 100% since it's saturated at 100% anyway.
However, this inconsistency (without any documentation) can create a lot of confusion. For instance, Busy has such a problem: @steemit shows the vote value of @steemit is $0.00 (I already fixed this and submitted PR: https://github.com/busyorg/busy/pull/2143)
In any case, inconsistent behavior should be avoided. (another good example of inconsistency is https://github.com/steemit/steem/issues/3184) This can be fixed by my PR: https://github.com/steemit/steem/pull/3218
How to reproduce
- Pick any user who hasn't voted more than five days but has some transactions that has changed effective vesting shares, e.g., @steemit
- (technical) Get the raw account information by
condenser_api.get_accounts
e.g.,curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_accounts", "params":[["steemit"]], "id":1}' https://api.steemit.com
or use any library that can help doing this.
"last_vote_time" : "2016-12-04T23:10:57",
"voting_power" : 0,
"voting_manabar" : {
"current_mana" : "69835912701503862",
"last_update_time" : 1538171805
},
excerpt of example output for @steemit
If you wanna sudden drop to zero, you need have an account that hasn't voted nor any transactions that affect effective vesting shares. Fortunately I had one, and that is included in the Recording Of The Bug section.
Reason Of The Bug
This voting_power reset is mainly due to the introduction of voting_manabar at HF20. Even though the correct current (not last) voting power can be calculated from voting_manabar.current_mana with voting_manabar.last_update_time, Steem still provides voting_power at last_vote_time for legacy code (most apps still use the voting power).
Here is the condenser_api that computes voting_power

But L2090 always set voting_power to zero when vp_dt > vp_t2u
By vp_dt = STEEM_100_PERCENT * dt / STEEM_VOTING_MANA_REGENERATION_SECONDS,
vp_dt > STEEM_100_PERCENT is equivalent to dt > STEEM_VOTING_MANA_REGENERATION_SECONDS (5 days).
But dt is difference between voting_manabar.last_update_time and a.last_vote_time and therefore voting_power is set to 0 for users who haven't voted more than 5 days but has some transactions that affect effective vesting shares (e.g., claim reward, power up, delegations), which updatesvoting_manabar.
Fix
This fix returns the previous a.voting power when this reset happens (unless current_mana is 0, case 2 below).
This fix is safe cause vp_t1 = 0 can occur only in the following two cases:
5 days passed
current voting power (calculated from a.voting_power and a.last_vote_time) will be 100% either way. But this fix is more informative, since it returns the last voting power.vp_t2u = 0
L2085 return 0 (same as before)
Recording Of The Bug
Let me explain this with my subaccount @economicstudio (same name with my github account :).
@economicstudio's last vote time is 'last_vote_time': '2018-10-26T16:04:06', much more than 5 days ago. But it also hasn't done any transactions that affect effective vesting shares.

before powerup: last
voting_power96.94% is correctly shown

after powerup 0.001 SP: last
voting_poweris reset to zero!
Only the voting_manabar is actually used to calculate the vote value on the blockchain, so voting_power is purely for convenience and backward compatibility. Then why not providing more meaningful and consistent information?
- Steem version: 0.20.4-8 (current) (introduced at v0.20.4 https://github.com/steemit/steem/commit/8decb360ca4e353e175231054cc76662e52a8d17#diff-f57e2d2b973d056e18ca93986e5ed3f5)
- Browser/App version: Any
- Operating system: Any