Iâve put together some thoughts here to try and narrow down a spec for the ideas introduced above. Iâll go through each aspect and provide my thoughts on how these can be implemented.
Suggested TANIP distribution proportions from the proposal:
Reward tier specifications
Base participation
Should be easy to implement, probably using `fetchUserFeeTransfers()` from `StakerIncentivesCalculator.ts`
Get each address which made a trade through Telcoin app, divide the proposed issuance (480,769 TEL) by the number of addresses and distribute that amount to each
Ie:
BPIAddress= BPItotaln
Where:
BPIAddress is the Base Participation Issuance for a single user wallet (address)
BPItotal Is the total to be distributed for base participation (suggested 480,769 TEL/ week)
n is the number of wallets (addresses) which meet the minimum activity threshold.
The minimum activity threshold can be set to e.g. 1 trade in the period. This will lower barriers to entry and create a simple, incentive for users to âcheck inâ at least once a week to the app.
Referral & staking bonus
The TANIP2 proposal breaks this down into two categories:
âBonuses granted for successful referrals, and a tier-based bonus for long-term staking. Suggestion:
-
50% of rewards distributed pro-rata based on successful referrals.
-
50% of rewards distributed for long term staking Tiers (Tier 1 â 0-5 periods, Tier 2 â 5-10 periods, Tier 3 â 10-25 periods, etc.).â
Iâd like to take these one at a time here.
Referral Bonus
âA successful referral would be someone who signs up to the app, and has at least 1 trade with fees within the app, thus being eligible for TANIP1 rewards.â â should this be a staker who has performed a trade?
If we go with that, this could be done by:
-
Cross referencing a list of stakers with a list of users who traded this week (Likely using `fetchUserFeeTransfers()`) and have not traded through Telcoin app before (This feels RPC call intensive).
-
For all addresses that meet the above criteria, find their referrerâs address.
-
Divide TEL/ week by number of referrers (like in âBase Participationâ) to get Referral and Staking Bonus Issuance per wallet
-
Transfer this amount to each wallet
Number of RPC calls could be greatly reduced if initial stake and first trade had to happen in the same period to be eligible.
Staking Bonus
Still unsure about implementing this but wanted to put all my thoughts down for consideration and further discussion.
The TANIP2 proposal mentions Tiering addresses based on the length over which they have been staking and then giving a bonus to long term stakers.
From our last TAN Council call, SteveO brought the analogy of this being more like poker tables (If I remember correctly, hopefully not butchering it) and addresses compete against each other based on what tier (based on staking date) they are in. At the time I assumed equal distribution for each tier. I also assumed the addresses earning the most at the moment are older addresses (At least have been around since near the beginning of TANIP1 issuance). There are a few things to unpack here, I think.
-
Staking age: Should be the age of the first stake an address makes. Should this be calculated based on when the address first staked in raw terms or relative to TANIP1? Ie should an address that staked long ago have much higher staking age than an address that staked at the start of TANIP1 (raw), or should they both have the same age? From the TANIP2 doc, age is denominated in periods, which suggests the non-raw (same age) version.
-
Tier distribution: Should this be an equal amount of TEL/week for each tier? I think that would be a good place to start. In this case though, and assuming the highest earning wallets are âolderâ ones (link to above point), their rewards will be reduced by this tiering, and so no longer acts as a âbonusâ. This would, however, mean that new stakers wonât be competing with the top earners, so this becomes more accessible. Which way round do we want this and why?
-
Tier boundaries: How do we determine the tiers and how do we make this future proof? Do we need tiers at all or should we just have a formula dependent on stake age?
To determine which option is best here Iâll consider them in turn and what I think the knock on effects of the different options will be.
Staking Age
I donât think this really makes a difference but starting everyone at period 0 (non raw) should be cheaper to compute (fewer blocks to search).
Tier Distribution
I think equal weighting across tiers makes sense as a starting point and this will limit the earnings of the âtop endâ of earners (Assuming they are some of the older wallets, but I believe they have been participating a while). Older wallets have had more time to compound their earnings, and the data has shown that these wallets are dominating earnings, while new user numbers are weak. This would both reduce the earnings of the top earners and incentivise newer users. This does open the door for people to buy, stake and wash with large amounts of TEL, but maybe thatâs a risk worth taking? Offering bonuses for long term stakers feels like it would push distribution further in the direction itâs already been moving which I donât think we want to do.
Tier Boundaries
There are a few options here, some may be pointless but wanted to include them anyway just for completeness and in case they spark some further discussion.
TANIP2 distributes these rewards as a âbonusâ which sounds separate to the TANIP1 mechanisms. We could just have a pot which we split equally between the users in a given tier each week and I donât think that would be difficult to implement
Upon discussion in the last TAN Council meeting though, it sounded like SteveO was talking about getting this baked into TANIP1, and that we could split incentives based on the tiers â ie tier 1 Users who staked in periods 0-5) would âcompeteâ for the pro rata share of incentives allocated to them, and not against older wallets (which could well be doing much more volume).
Either way, we need to determine where the boundaries are, and I think we have a few options:
-
Hard coded tiers: This is as laid out in TANIP2, for example: Tier 1 â 0-5 periods, Tier 2 â 5-10 periods, Tier 3 â 10-25 periods, etc. This brings a lot of variables to the table and makes the tiers more âcoarseâ as we go on, which will probably result in more wallets getting grouped together down the line, eventually tending to a situation like the one we currently have.
-
Quartiles (All wallets): Using quartiles as an example, but could be deciles, percentages etc. Consider the staking age of all staked wallets and divide into quartiles. Youngest 25% of wallets (tier 1) compete amongst each other, 25% to 50% by age (tier 2) compete etc. etc. This is more dynamic and feels easier to adjust.
-
Quartiles (Participating wallets): As above, but instead of considering all staked wallets, only consider the wallets that traded in the current period. Might give a more accurate representation of current usage, but realistically probably wonât make too much difference.
-
Include wallet age variable in volume weighting calculation: A slightly different approach that doesnât really involve tiers, but we can include the age of each wallet as a parameter in the volume weighting calculation. Currently the pro rata share of rewards (before applying cap rules) is calculated purely on user fees, ie:
issuancei= issuancetotal* feesifeestotal
Where issuancei is the issuance user i receives, issuancetotal is the total weekly TANIP1 issuance (Currently 3,205,127 TEL per week), feesi is the fees paid by user i in the period and feestotal is the total amount of fees paid by all TANIP1 participants.
We could adjust this formula to include a wallet age dependent term. Whereas in the current case, address weighting, w, is based purely on user fees, ie:
wi=feesi
We can use:
wi=feesi*g(ai)
Where g is a function of wallet age, a.
We can then determine a function that fits our needs. The first that springs to mind, in light of the idea that âolderâ wallets are currently âtoo well incentivisedâ relative to new wallets, would be to use some kind of exponential decay curve, which would take the form:
gai=A*e-kai
Where A and k are parameters we can choose. To keep it simple we can set A to 1, so a fresh wallet will receive the same amount of rewards under this regime as they would under the current TANIP1 implementation. The set of curves would then look something like this:
Where the constant k determines how aggressively fees reduce with wallet age.
An exponential curve is just an example, but we could use any curve we want here (Could also increase over wallet age if we want).
Gamified Incentives
To be discussed further with Bluelights
Notes on Implementation
Whatever we do, I think we should act slowly and focus on one change at a time. We want to retain as clear a path between inputs and outputs as possible (Of course there are other sources of randomness e.g. prices etc.) but we should work to reduce the amount and rate at which we change things so we have the best chance of drawing clear data driven conclusions. This document is just a summary of my thoughts and is intended to continue the discussion. If there are bits that seem overly complex thatâs no problem at all, and they likely are â I just wanted to outline as many potential solutions as possible really.