Author Topic: Yield with deflationary supply tokens and yield accumulator  (Read 2201 times)

0 Members and 1 Guest are viewing this topic.

Offline bytemaster

The highest yield goes to those who hold a year.   Bots will never make more from compounding attempts. 
For the latest updates checkout my blog: http://bytemaster.bitshares.org
Anything said on these forums does not constitute an intent to create a legal obligation or contract between myself and anyone else.   These are merely my opinions and I reserve the right to change them at any time.

Offline Rune

  • Hero Member
  • *****
  • Posts: 1120
    • View Profile
As long as it is possible to extract from the reserve fund in some way, no matter how difficult, you can bet that the reserve fund will be empty at all times and that regular people will never get any yield.

You're thinking the system has no "memory" of how much yield has been claimed by a given BitUSD balance.  So immediately after a claim the same BitUSD could claim the same amount.  In other words, a user's equity in the fund is proportional to their BitUSD.

This is not the case -- the system does such have such a "memory"!  A user's equity in the fund is proportional to the amount of BitUSD they have, times a yield factor.  The yield factor starts at zero for new BitUSD, then increases over time -- but it resets to zero when yield is claimed or the balance moves. 

You might object "But this means different BitUSD are not totally fungible against each other!  Old balances are now more valuable than young balances!"  And this objection would be correct.  This was my objection to an earlier version of the yield proposal, where the yield factor's trajectory bent much more sharply.  You could in theory have a BitUSD "bank" that holds BitUSD in its vaults and tries very hard to keep moving it.  Then two depositors of the bank would be able to exchange value by writing checks; depositing a check would change the balance of both users' accounts, but the BitUSD in the vaults would not move.  The system could be economically profitable for both the bank and its depositors; they'd split the increased yield.  This is still theoretically possible with the current implementation, but I don't think it would be profitable enough to justify its running costs.

The reason we need to have the yield factor increase non-linearly is because they decided automatic compounding of interest was too hard to implement.  I told them exactly how to do it, but they still don't want to implement any of the algorithms I suggested.  Absent automatic compounding, people would try to do "manual compounding" which leads to spamming the network with tons of send-to-self transactions.  A yield curve that gives better returns than manual compounding prevents this.  I believe Agent86 may have done a more detailed analysis, but I'm not going to go looking for the post right now.

The problem is that this system still gives an  unfair distribution, and will result in lower yield to the average person and higher yield to the bots. I detected some problems with my supply token proposal here also, though, so I guess the perfect solution isn't there yet. Luckily the delegate system of btsx allows for easy upgrading and hardforking later, when a better solution is found.

Offline theoretical

As long as it is possible to extract from the reserve fund in some way, no matter how difficult, you can bet that the reserve fund will be empty at all times and that regular people will never get any yield.

You're thinking the system has no "memory" of how much yield has been claimed by a given BitUSD balance.  So immediately after a claim the same BitUSD could claim the same amount.  In other words, a user's equity in the fund is proportional to their BitUSD.

This is not the case -- the system does such have such a "memory"!  A user's equity in the fund is proportional to the amount of BitUSD they have, times a yield factor.  The yield factor starts at zero for new BitUSD, then increases over time -- but it resets to zero when yield is claimed or the balance moves. 

You might object "But this means different BitUSD are not totally fungible against each other!  Old balances are now more valuable than young balances!"  And this objection would be correct.  This was my objection to an earlier version of the yield proposal, where the yield factor's trajectory bent much more sharply.  You could in theory have a BitUSD "bank" that holds BitUSD in its vaults and tries very hard to keep moving it.  Then two depositors of the bank would be able to exchange value by writing checks; depositing a check would change the balance of both users' accounts, but the BitUSD in the vaults would not move.  The system could be economically profitable for both the bank and its depositors; they'd split the increased yield.  This is still theoretically possible with the current implementation, but I don't think it would be profitable enough to justify its running costs.

The reason we need to have the yield factor increase non-linearly is because they decided automatic compounding of interest was too hard to implement.  I told them exactly how to do it, but they still don't want to implement any of the algorithms I suggested.  Absent automatic compounding, people would try to do "manual compounding" which leads to spamming the network with tons of send-to-self transactions.  A yield curve that gives better returns than manual compounding prevents this.  I believe Agent86 may have done a more detailed analysis, but I'm not going to go looking for the post right now.
« Last Edit: October 07, 2014, 09:57:34 pm by drltc »
BTS- theoretical / PTS- PZxpdC8RqWsdU3pVJeobZY7JFKVPfNpy5z / BTC- 1NfGejohzoVGffAD1CnCRgo9vApjCU2viY / the delegate formerly known as drltc / Nothing said on these forums is intended to be legally binding / All opinions are my own unless otherwise noted / Take action due to my posts at your own risk

Offline Rune

  • Hero Member
  • *****
  • Posts: 1120
    • View Profile
That means you can repeatedly buy and sell a bitAsset in order to deplete the reserve fund entirely? Surely that is not how it currently works...
Sure .. it's 'not exactly' that easy .. just can't find BM's detailed explanation about the implementation

As long as it is possible to extract from the reserve fund in some way, no matter how difficult, you can bet that the reserve fund will be empty at all times and that regular people will never get any yield. Sending out yield to every asset holder every time a short is covered is the only way I can see that would allow normal people to gain yield. The other option being my proposal in this thread.

Offline xeroc

  • Board Moderator
  • Hero Member
  • *****
  • Posts: 12922
  • ChainSquad GmbH
    • View Profile
    • ChainSquad GmbH
  • BitShares: xeroc
  • GitHub: xeroc
That means you can repeatedly buy and sell a bitAsset in order to deplete the reserve fund entirely? Surely that is not how it currently works...
Sure .. it's 'not exactly' that easy .. just can't find BM's detailed explanation about the implementation

Offline Rune

  • Hero Member
  • *****
  • Posts: 1120
    • View Profile
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.
You lost me here already.

Why is the yield not payed equally? It's payed into the reserve fund and whatever percentage of bitUSD you hold (i.e. move) the same percentage you will be able to withdraw from the reserves ..

That means you can repeatedly buy and sell a bitAsset in order to deplete the reserve fund entirely? Surely that is not how it currently works...

Offline Rune

  • Hero Member
  • *****
  • Posts: 1120
    • View Profile
Burning supply to pay a dividend works well with an asset like BTSX, where you create a fixed amount, and then burn them over time.


But the way that bitUSD is created and destroyed is different.  Opening a new short creates bitUSD.
Closing the short removes the bitUSD.  Every short must be closed within 30 days, so whenever a bitUSD is created, that bitUSD will be destroyed within 30 days.


If you wanted to pay dividends by burning bitUSD then here is what would happen:


* People short, creating 1 million bitUSD.
* 1000 bitUSD are burned for the yield, resulting in 999,000 bitUSD remaining.
* People now need to cover the shorts by buying up 1 million bitUSD, but only 999,000 remain! 

The result is that it is not possible to cover all the shorts.  The price would go to infinity as the short was forced to buy bitUSD that did not exist.


This would be a reverse ponzi. :)  100% of the initial collateral that the shorts used to create bitUSD would be given to the buyers of the bitUSD.  The late adopters would get everything and the ones who originated the bitUSD would lose everything.   Lol!

Try this thought experiment: in the current system, what happens if someone throws away the private key to some bitUSD? Does that cause the price to go to infinity since shorts now have to buy supply that no longer exists?

The economics of money supply/demand can be pretty tricky, but the simplest way to see it is that burning/losing supply is exactly the same as distributing proportionally to all other supply holders.  You are right that the uniqueness with bit assets are the way they are created, and that's why you have to use the yield accumulator to adjust the feed price as supply is burned, ensuring a stable equilibrium.

Offline xeroc

  • Board Moderator
  • Hero Member
  • *****
  • Posts: 12922
  • ChainSquad GmbH
    • View Profile
    • ChainSquad GmbH
  • BitShares: xeroc
  • GitHub: xeroc
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.
You lost me here already.

Why is the yield not payed equally? It's payed into the reserve fund and whatever percentage of bitUSD you hold (i.e. move) the same percentage you will be able to withdraw from the reserves ..

as described by Ander .. burning bitassets is a no-go as you need to be able to cover ALL shorts eventually ..
IMHO paying the yield from trades is the most natural thing to go ..

on every centralized exchange you pay a fee .. that fee goes to the business (on single guy or a group of people)
in btsx however, everyone owning a particular bitAsset is part of the business and thus will benefit from trades ..

not sure what incentives/motives there are to change this

Offline Ander

  • Hero Member
  • *****
  • Posts: 3506
    • View Profile
  • BitShares: Ander
Burning supply to pay a dividend works well with an asset like BTSX, where you create a fixed amount, and then burn them over time.


But the way that bitUSD is created and destroyed is different.  Opening a new short creates bitUSD.
Closing the short removes the bitUSD.  Every short must be closed within 30 days, so whenever a bitUSD is created, that bitUSD will be destroyed within 30 days.


If you wanted to pay dividends by burning bitUSD then here is what would happen:


* People short, creating 1 million bitUSD.
* 1000 bitUSD are burned for the yield, resulting in 999,000 bitUSD remaining.
* People now need to cover the shorts by buying up 1 million bitUSD, but only 999,000 remain! 

The result is that it is not possible to cover all the shorts.  The price would go to infinity as the short was forced to buy bitUSD that did not exist.


This would be a reverse ponzi. :)  100% of the initial collateral that the shorts used to create bitUSD would be given to the buyers of the bitUSD.  The late adopters would get everything and the ones who originated the bitUSD would lose everything.   Lol!
https://metaexchange.info | Bitcoin<->Altcoin exchange | Instant | Safe | Low spreads

Offline Rune

  • Hero Member
  • *****
  • Posts: 1120
    • View Profile
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.

Ay 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.

Iy = nstUSD/(nstUSD-nstUSD, burned)-1

Where nstUSD 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:

nbitUSD = nstUSD * Ay
pricebitUSD = pricestUSD / Ay

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:

feedstUSD = feedUSD * Ay

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.
« Last Edit: October 07, 2014, 02:15:54 pm by Rune »