More about Steem's inflation models

in #programminglast year (edited)

No time to write much tonight, but here are some pretty pictures. After last week's conversation, I'm reasonably confident about these graphs and numbers. In terms of new STEEM per day, both of the models below start downwards in mid-February, 2024 and bottom out in the spring of 2037.

I'm fairly sure that most of the difference between the HF16 prediction and today's actual numbers arises from the fact that the STEEM market cap on Dec. 6, 2016 was 62x the SBD market cap, whereas today the STEEM market cap is only 11x the SBD market cap. I believe the change in the STEEM:SBD ratio introduced a great deal of additional inflation.

The December 6, 2016 starting point numbers came from here. I used the STEEM supply, SBD supply, and STEEM price from December 6, 2016 to estimate the virtual supply, as follows:

virtual_supply = STEEM supply + ( SBD_Supply / STEEM Price )

Beware that there are many factors that can effect this other than just the blockchain inflation model. Other factors include increases/decreases in the price of STEEM, burned tokens, and perhaps other things, too.

And of course, this is all based on informal documentation and observations, so I offer no guarantees. ;-)

Now, on to the visualizations.

Forward looking model starting tonight - New steem per day broken down by inflation type

image.png

Forward looking model New Steem, virtual supply and inflation percentage

image.png

HF16 model starting at block# 7,000,000 - New steem per day broken down by inflation type (SPS starts at HF22)

image.png

^^^ Update^^^: Smoothing and filtering fixes in PowerBI. I was rushing too much last night.
Also updated to reflect HF21/22 switch from 25% to 50% for curation rewards.

HF16 New Steem, virtual supply and inflation percentage

image.png

In retrospect, we really should have had graphs like these when we were deciding whether to adopt the SPS or not, but it didn't occur to me at the time. C'est la vie.

The visualizations were created in PowerBI, and here is the python code:

#!/usr/bin/python3
from datetime import datetime,timedelta
from steem import Steem
import json

s = Steem()
DP=s.get_dynamic_global_properties()

### December 6, 2016
### https://github.com/steemit/steem/issues/551#issuecomment-261262294 - startblock 7000000
###     STEEM current_supply, Dec. 6, 2016 227593061
###     SBD current_supply, Dec. 6, 2016 1240366
###     STEEM price Dec 6, 2016 0.237
###     Collateralized STEEM = ( 1 / 0.238 ) * 1240366 = 5211621 
###     STEEM virtual_supply, Dec. 6, 2016 = 227593061 + 5211621 =~ 232,826,672
### startBlock=7000000
### startSupply=232826672
### startDate=datetime(2016,12,6,11,00,00,00)

### Current values
startBlock=DP["head_block_number"]
startSupply=float(DP["virtual_supply"].split()[0])
startDate=datetime.now()
blocksPerYear=10512000

def inflationPCT ( block ):
   APR=( (978 - ( block / 250000 )) / 10000 )
   return 0.0095 if APR < 0.0095 else round ( APR, 4 )

def newSteemPerBlock ( inflation, supply, bpy ):
   return ( inflation * supply / bpy )

def block2day ( n ):
   return ( n * 20 * 60 * 24 )

loopBlock=startBlock
loopSupply=startSupply
loopDate=startDate
if ( loopBlock % 250000 == 0 ):
   guardRail=round (inflationPCT ( loopBlock ), 4)
else:
   guardRail=round (inflationPCT ( loopBlock ) + 0.0001, 4)

print ("Date, Block #, Inflation Rate, Supply, New Steem Per Day")
endDate=startDate  + timedelta (days=int(30 * 365.25)) ## 30 years
while ( loopDate < endDate ):
   inflationRate=inflationPCT ( loopBlock )
   inflationPerBlock=newSteemPerBlock ( inflationRate, loopSupply, blocksPerYear )
   inflationPerDay=block2day(inflationPerBlock)
   loopBlock+=1
   loopSupply+=inflationPerBlock
   loopDate=loopDate + timedelta (seconds=3)
   if ( loopBlock % 250000 == 0 ):
      guardRail = 0.0095 if ( inflationRate <= 0.0095 ) else round (guardRail - 0.0001,4)
      print ( "%s, %s, %f, %d, %d" % ( loopDate, loopBlock, inflationRate, loopSupply, inflationPerDay ))
      if ( guardRail != inflationRate ):
         print ("Inflation rate mismatch", guardRail, inflationRate )

Feel free to use or modify it, and please let me know if any errors are observed.


image.png

Pixabay license, source

Reminder


Visit the /promoted page and #burnsteem25 to support the inflation-fighters who are helping to enable decentralized regulation of Steem token supply growth.

Sort:  

With round ( APR, 4 ) my calculations correspond to your numbers.
I had preferred to calculate with the integers - like the blockchain:

def inflationPCT ( block ):
    APR=(978 - ( block // 250000 ))
    return 95 if APR < 95 else APR

def newSteemPerBlock ( inflation, supply, bpy ):
    return ( inflation * supply ) / ( bpy * 10000 )

I was a little confused for a moment by the fact that the full amount of inflation is not generated as STEEM, but part of it is converted into SBD (for the SPS fund). I had wondered whether these ("only" virtually existing) STEEM are then still attributable to inflation.
But I think basically this is also a part of inflation, just not in the form of new STEEM. And the ratio of the conversion again is equal to the median_price.

Yeah, I definitely think the SBDs in the SPS are part of inflation. They reduced the author & curator rewards from 75% to 65% at HF21/22 in order to give it to the SPS - which is why we see the cliff on August 29, 2019 for the HF16 graph, above. I tried to include that in the model, too. (But now I am thinking that they also switched curator rewards from 25% to 50% at that hardfork, and I didn't model that.... so I probably need to update it yet again. Ugh. No time ATM.)

Anyway, it's still a black box for me as to exactly how/when the various reward components get created out of the "new STEEM" (SBD, VESTS, and liquid STEEM), but fortunately I didn't need to dig that deep for this check. Another question I'm still not clear on is where the tokens would come from if the witnesses would decide to start paying interest on SBD savings.

And the ratio of the conversion again is equal to the median_price.

That's how I understand it too - the blockchain's median (currently 0.252), not the true median.

Probably a good idea to calculate in Integers. That "round" was just a kludge because Python didn't like working with small numbers.

Update: It went faster than I thought. Updated the HF16 graph with pre-HF21 settings.

Ugh. No time ATM.)

It's like me :-)
There are still so many questions which should be checked, but... you know :-)

it's still a black box for me as to exactly how/when the various reward components get created out of the "new STEEM" (SBD, VESTS, and liquid STEEM)

This is one of these questions :-)
I wrote my calculation similar to the blockchain calculations. On that occasion, I noticed the conversions accordingly. However, I did not go into any further detail. Especially the VESTS conversion was not very intuitive.

where the tokens would come from if the witnesses would decide to start paying interest on SBD savings.

I have deliberately not yet dealt with this topic. But it is also a good question...

That "round" was just a kludge because Python didn't like working with small numbers.

Floating point numbers in binary representation are (almost) always only an approximation. Every language deals with them differently. Unlike C, C++ or Java, Python generally uses 64 bits for the floats. In an approximation, this can result in a few decimal places. Especially when checking for equality, you have to take this into account.
In Python, the use of the decimal module is supposed to handle it better. But I haven't really used it yet either.

Thanks for the update :-)

TEAM MILLIONAIRE

Congratulations, your comment has been successfully curated by @o1eh at 10%.

TEAM MILLIONAIRE

Congratulations, your comment has been successfully curated by @o1eh at 10%.

You’ve submitted steem inflation report with details and as I can see you’ve mention about December 2016 that was a information that I learn from this post. Thanks for sharing this with us with such details.

I'm late, I see many comments here, the truth is that I don't have too much knowledge about the subject in relation to other users, but I like the fact that you are aware of this, it is a way of attracting attention so that others do it.
I wish you a happy weekend