Rather than distributing yield in some hack way that doesn't pay every bitAsset holder equally, I believe a more graceful method is to simply use the same kind of system that delegates use to pay "dividends" to BTSX holders: by burning supply.
The obvious issue this creates, is the decoupling of the bitAsset peg, as it appreciates due to the limited supply. My proposal is to use underlying deflationary supply tokens to handle the actual transactions on the network level, and then use a locally calculated variable, the yield accumulator, to transform the supply tokens into front-end bitassets, and continously update the yield of the bitAsset in the client. The second important function of the yield accumulator is to transform the price feed from real world asset price into supply token price.
This has a number of advantages over other solutions that distribute yield through transactions to every bitAsset holder:
1) It takes the lowest amount of network resources, increasing max TPS of the market.
2) It distributes yield instantly in real time to every bitAsset holder. This will have some marketing benefits since it means your bitAsset holdings will begin to tick upwards literally within 10 seconds of buying them in the client (assuming a busy market).
3) It is non-gameable by bots or clever people with spreadsheets, because of the instant yield allocation. I.e. you cannot get an unfair share of the already accumulated yield by getting in or out of the market at good times.
4) Due to number 3, every bitasset holder will gain the same yield over time, making it an ideal savings vehicle even for normal non-tech, non-trader people.
5) Exchanges that don't implement the supply token to bitAsset transformation will be nice visual demonstrations of the yield over time, possibly providing positive marketing. bitAsset sales pipelines for average people will of course have the transformation implemented, so average people will not be confused by the increasing price.
To simplify things, I will use bitUSD as the example for explaining the system. To make it work we need to convert all current bitUSD into stUSD, the bitUSD supply tokens. bitUSD instead becomes the way the average user interacts with the supply tokens. Initially, bitUSD supply tokens will have identical value to bitUSD, and can be shorted into existence at the feed value of USD, since no yield has been distributed yet.
When fees are paid or shorts are covered, the yield is burned in a special transaction, since burning supply has the same economic effect as distributing the supply proportionally to all other supply holders (assuming the market follows standard microeconomic rules). To keep track of the price increase that this creates, we use a variable called the yield accumulator, Ay
. The advantage is that this variable can be calculated locally by each client, lessening network load. It can also be benchmarked in blocks at regular intervals, such as every 30 minutes, for lightweight clients.
is updated each new block by calculating the amount of supply tokens burned proportional to total supply, and thus the average price increase, into a variable called the yield increase Iy
is the current stUSD supply and nstUSD, burned
is the amount of stUSD burned this block.
This variable is then added onto Ay
each new block, accumulating the total proportional price increase of stUSD (lifetime yield) into the yield accumulator.
A(y, blockn + 1)
= A(y, blockn)
+ I(y, blockn+1)
Whenever at user interacts with bitUSD in the client, Ay
is used to transform his orders into stUSD orders with some simple linear relationships:
After the commands have been sent to the network, they are dominated solely in stUSD. The price relationship is also used to determine the feed price of stUSD:
After the delegate making a block has determined the Ay
, he will apply it to the average USD price feed and then determine if any shorts are executed. I guess he will have to ignore the increase in stUSD amounts, so the effect of shorts in block n will be added to the Iy
and thus Ay
of block n+1.
Any feedback? I guess some people will criticize the idea of using an underlying asset that differs from bitUSD as being more confusing than the current system, but I think that as long as the user experience does not show it to the user in any way (unless they want to see it), and the average user interacts only with bitUSD, this system will be superior for non-techy users, since they will not be at a disadvantage to bots when it comes to yield distribution. I think fairness and openness in the yield distribution should be bitAssets number 1 priority, the second being user experience. Like I mentioned earlier, I think this proposal also helps the user experience due to the real time, instant yield.