2.0.0
Rebalancing in Release 2.0.0
The rebalancing process in Release 2.0.0 is conducted by a set of auctions that are approved by the (Auction Approver)['/reserve-index/roles/auction-approver'], and launched either by the (Auction Launcher)['/reserve-index/roles/auction-launcher'] role or by any other actor (if configured so).
The (Auction Approver)['/reserve-index/roles/auction-approver'] role is responsible for approving the set of auctions that will be used to rebalance the DTF. This role is generally held by the same DAO that acts as the (Admin)['/reserve-index/roles/admin'] role, only with a shorter governance cycle. Due to DAO governance timelines, there is a potential for price movements to occur between the approval and launch of an auction, which can potentially lead to the auction being partially filled, or not fillable at all. To mitigate this risk, the (Auction Approver)['/reserve-index/roles/auction-approver'] role is responsible for setting wide enough ranges for the buy and sell token limits and wide enough bounds for the auction start & end prices.
Auction Definitions
An auction is approved with the following parameters:
struct Auction {
uint256 id;
IERC20 sellToken;
IERC20 buyToken;
BasketRange sellLimit; // D27{sellTok/share} min ratio of sell token in the basket, inclusive
BasketRange buyLimit; // D27{buyTok/share} max ratio of buy token in the basket, exclusive
Prices prices; // D27{buyTok/sellTok}
uint256 restrictedUntil; // {s} exclusive
uint256 launchDeadline; // {s} inclusive
uint256 startTime; // {s} inclusive
uint256 endTime; // {s} inclusive
uint256 k; // D18{1} price = startPrice * e ^ -kt
}
struct Prices {
uint256 start; // D27{buyTok/sellTok}
uint256 end; // D27{buyTok/sellTok}
}
struct BasketRange {
uint256 spot; // D27{tok/share}
uint256 low; // D27{tok/share} inclusive
uint256 high; // D27{tok/share} inclusive
}
Sell / Buy limits
The sellLimit
and buyLimit
parameters are used by the auction to target the correct ratio of the sell and buy tokens to DTF shares. When the auction is approved, the sellLimit
and buyLimit
are configured as ranges. This gives the Auction Launcher enough leeway to target the correct ratios of the sell and buy token. When the auction is launched, the DTF is allowed to purchase buyToken
up to the buyLimit
value, and the DTF is allowed to sell sellToken
down to the sellLimit
value (ie. the auction can continue to accept bids until the DTF holds a ratio of sellToken:dtfShares
equal to the sellLimit
value).
Auction Approval
If the DTF is tracking a specific set of index (ie. token amounts to DTF shares), then the range capabilities are not needed, and the Auction Approver sets all three values in each limit range to the same value (ie. sellLimit.spot = sellLimit.low = sellLimit.high
and buyLimit.spot = buyLimit.low = buyLimit.high
).
If the DTF is targetting a specific value weighting of tokens in the DTF, then the sellLimit
and buyLimit
will have ranges that take into account the current prices of the buyToken
and sellToken
, as well as their expected volatility.
Auction Launch
When the auction is launched, the sellLimit.spot
and buyLimit.spot
values are used as the sell and buy limits, respectively. The Auction Launcher
is able to set the sellLimit.spot
and buyLimit.spot
values to any value between the sellLimit.low
and sellLimit.high
values, and the buyLimit.low
and buyLimit.high
values, respectively. However, if the auction is launched via the unrestricted launch mode, then the sellLimit.spot
and buyLimit.spot
values cannot be changed and the current values are used.
Prices
The prices
parameter is used by the auction to determine the price of the buyToken
in terms of the sellToken
. The prices
parameter is a struct that contains the start
and end
prices. The start
price is where the auction starts, and the end
price is where the auction ends.
Auction Approval
The prices
parameter is initially set by the Auction Approver when the auction is approved. In Register, they use the Expected Volatility (EV) presets to impart information about the expected price movement during the delay between when the auctions are proposed to governance and when they are launched. Choosing Low EV will configure a tighter pricing range (spot +-10%), while choosing High EV will configure a much wider pricing range (spot +-50%).
Auction Launch
When the auction is launched, the prices.start
and prices.end
values are used as the start and end prices, respectively. The Auction Launcher
is able to raise the prices.start
and prices.end
values, but not lower them. This is a safety mechanism to prevent the Auction Launcher
from setting the prices too low, which could allow them to purchase the sellToken
at a discount.