A vesting_balance_object can hold a vesting balance of SWAN for a given account.
Vesting balances can vest with different strategies (linear or coin-days).
Resolution: for every non-zero vesting balance of SWAN, create (if necessary) a
vesting balance for BACK with an equivalent vesting policy and adjust balance
and policy parameters accordingly. An index on
vesting_balance_object::asset::asset_id will be added to speed up lookups.
### balance_object
Balance objects (not to be confused with account_balance objects) contain
genesis balances, possibly with linear vesting. This should be a rare case in
BitShares-2.0, but it is a possible case and requires resolution.
Resolution: all balances of SWAN are replaced with equivalent balances of BACK.
An index on balance_object::asset_type will be added to speed up lookups.
### blinded_balance_object
Blinded balances are part of the stealth feature of Graphene. A blinded balance
has only an asset id, but no (visible) amount. The only visible thing is the
total of all blinded balances of that asset type, which is a field in the
asset's dynamic data.
Resolution:
1. A part of the settlement_fund will be set aside for settling blinded
balances. For this, a new object type "blinded_settlement_object" will be
introduced that carries the blinded_settlement_fund and the remaining total
blinded amount.
2. The blinded_balance_object will receive an additional optional field that may
contain a reference to a blinded_settlement_fund. blinded_balances with such
a reference may only be withdrawn from, together with other blinded_balances
carrying the same reference, but they cannot be transferred anymore.
Note: special care needs to be taken in the fee handling here. Using the
blinded balance together with the SWAN fee pool must be avoided. Instead,
the BACK fee pool must be used (if at all).
3. Upon withdrawal, the amount withdrawn is immediately converted to BACK, from
the blinded_settlement_fund. If the amount withdrawn is equal to the total
remaining blinded amount, the remaining blinded_settlement_fund is paid out
to the withdrawer and the object is deleted.
Note that the pair (SWAN, blinded_settlement_object) creates a kind of virtual
asset that should not be mixed with "pure" SWAN balances by existing user
interfaces.
An index on blinded_balance_object::asset_id will be added to speed up lookups.
### blinded_settlement_object
This object type does not exist yet. It is introduced by the mechanism to handle
blinded SWAN balances, as described above.
Resolution: blinded_settlement_objects holding SWAN are immediately converted to
BACK.
### account_balance_object
This is what holds the actual balances of an account. Each such object refers to
a specific account and asset. Account_balances of SWAN can be converted into
BACK at any time via the forced settlement feature.
Resolution: account balances of SWAN are converted into BACK immediately.
### asset_bitasset_data_object
This object defines (among other things) if an asset is in global settlement.
Resolution:
* pay out remaining settlement_fund to issuer (if any)
* nullify settlement_price / force_settled_volume
* empty feed list / unset current_feed
* empty options.whitelist_authorities and set white_list in options.flags
The latter requires discussion.
### asset_dynamic_data_object
This object logs the existing amount of SWAN (total and blinded). It also
contains the fee pool.
Resolution: set accumulated_fees to 0 and adjust current_supply accordingly.
The issuer will be compensated for the lost fees by receiving the remainder of
the settlement_fund. After all the previous resolutions have been executed, the
current_supply and the confidential_supply must be 0.
## Additional changes
### Bugfix: MPAs that have seen a black swan cannot be settled after the price feed expires
It has turned out that force-settling an MPA requires a valid price feed even
when the MPA has a settlement_price set. This is clearly a bug, since in that
case the settlement price is independent from the price feed. Furthermore,
publishing price feeds is no longer possible after a black swan, so the time
when settlement is possible at all is limited to the expiration period of the
price feed of the MPA.
This needs to be fixed. See https://github.com/cryptonomex/graphene/issues/664#issuecomment-254056746
for a discussion.
### New chain parameter: minimum_time_before_asset_revival
This parameter defines the minimum required time between a global settlement
event on an asset and the revival of that same asset. The parameter will be
modifiable by the committee and defaults to 4 weeks (28 days). See discussion
below.
# Discussion
## minimum_time_before_asset_revival
A quick cycle of global settlement and revival is likely to cause confusion
among an asset's users (holders and shorters). There is even limited potential
to abuse this feature. Therefore it is reasonable to enforce a minimum time
before revival, allowing users to get informed about the asset's situation and
the resolution process that affects them.
## Dependent Assets
As described above, assets may exist that use SWAN as collateral. Short
positions in such assets must be resolved somehow. The proposed resolution is
quite harsh, in that it modifies the asset that uses SWAN as collateral.
It is reasonable insofar as SWAN effectively represents the value of a fixed
amount of BACK, which means that an asset backed by SWAN is *actually* backed
by BACK. The proposed resolution only makes that explicit.
There is a related comment in the source code (https://github.com/cryptonomex/graphene/blob/f1b19b15629cd02669a94f2af16eeaec7f54b3f6/libraries/chain/include/graphene/chain/protocol/asset_ops.hpp#L160 ):
> If this asset is used as backing for other bitassets, those bitassets will be
force settled at their current price.
This is not reflected in the actual implementation AFAICS.
Better suggestions are welcome.
## Flags and permissions
As described above, the revival operation will set the whitelist flag and
permission of the revived asset. The purpose of this is to prevent the asset
from immediately becoming active again, before the issuer has a chance to
modify other asset parameters. For example, after reviving a prediction market,
the owner might want to update the asset description before starting the next
round of predictions.
## Affected Parties
### Exchanges
An exchange holding SWAN will have its SWAN exchanged for BACK just like anyone
else. The exchange will probably have SWAN balances in its internal ledgers,
which belong to the users of the exchange. The exchange MUST be notified of the
settlement and it MUST modify its internal ledger, replacing SWAN balances
with BACK balances.
Exchanges SHOULD perform this operation independently from the revival, i. e.
before the revival is triggered. They can do this by force-settling their SWAN
holdings.
### (Other) Users
Users holding SWAN will have their holdings replaced with an equivalent amount
of BACK, at the settlement_price. This does not damage the holder financially,
see above.
### Asset Owners (aka Issuers)
The issuer of an asset to be revived should know what he is doing. Invoking the
revive_asset operation is a wilful act. If he isn't happy with the effect of the
operation he simply should not invoke it.
Issuers of assets backed by a revived assets are affected too, but they have no
choice. See discussion about Dependent Assets above.
# Summary
This proposal discusses a set of changes to bring back a "stuck" asset into a
usable state.
Not all shareholders need to understand the technical details of the proposal,
however, they should be aware of the implications of these changes. It is
particularly important to understand how the revival of an asset affects the
different parties, i. e. holders, shorters, traders and issuers.