Reserve Index DTFs/Rebalancing

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.