LUSD Peg Stability

How does LUSD Chicken Bonds system improve the LUSD peg stability?

The LUSD Chicken Bonds system accumulates protocol-owned LUSD. When users bond LUSD, it is initially deposited to the Stability Pool (via B.Protocol).
When a user Chickens In their bonded LUSD becomes protocol owned and gets split between the Reserve and the Permanent bucket.
LUSD in the Permanent Bucket can be shifted out of the Stability Pool and into the Curve pool (via the Yearn Curve vault). Funds in Curve can also be shifted back to the Stability Pool. These are the so-called Shifter functions.
Shifting funds in or out of the Curve pool changes the Curve LUSD spot price, and Curve is the main venue for LUSD trading.
The system ensures that shifting of funds is only possible when it improves the peg. See shifting conditions.

What are the conditions for shifting LUSD between the Stability Pool and Curve?

The following conditions apply:
  • The shift must always improve the LUSD peg on Curve. That is, it must bring the LUSD spot price closer to 1.0, without crossing the 1.0 boundary. In practice, a slight “buffer zone” is in place with boundaries just above and below 1.0 to ensure at least slight profitability of shifting for the system. The boundaries of the price buffer zone are [x.y]. In practice this is 1 +/- 0.0004.
The graphic below shows viable shifts:
These additional restrictions apply:
  • Shifting is disabled for an initial bootstrap period of 45 days. During this period, all system funds will reside in the Stability Pool (via B.Protocol). The bootstrap period started with the launch of Chicken Bonds on October 4, 2022. Thus, the Shifter functions are active.
  • Shifting funds operate on a ‘commit-shift’ scheme. If you want to shift funds to or from Curve, you must start a shifter countdown (1 hour) after which a time window opens (10 minutes). Shifting is only possible during this time window. The role of the countdown is to limit the possible frontrunning of Liquity liquidations by shifts of Chicken Bonds funds. You can learn more about the Shifter countdown here.

Who can shift system funds between the Stability Pool and Curve?

Anyone. Shifting functionality is permissionless, but subject to restrictions (see above).

What are the incentives for shifting LUSD to or from Curve?

There's no direct financial incentive to call it - the caller will incur gas costs. However, anyone who would benefit from an instant LUSD peg improvement - for example, an LUSD borrower who wants to repay their loan - is incentivized to call it.
For example: if LUSD is above peg, a Liquity borrower seeking to buy LUSD to repay their Trove may decide to first use Chicken Bonds to shift system funds to Curve before buying their LUSD. After the shift, they can buy LUSD at a better price closer to 1.0.

How to check the amount that can be shifted?

In order to check the LUSD amount that can be shifted between the Stability Pool into the Curve pool you have to check what is the difference between getPermanentLUSD - getTotalLUSDInCurve. You can check this on Etherscan. The contract address is: 0x57619FE9C539f890b19c61812226F9703ce37137
When shifting from Curve to SP, the maximum amount that can be shifted can be found in getTotalLUSDInCurve.
The difference between permanent LUSD and total LUSD in Curve is the amount that’s currently idle (i.e. can be shifted into Curve).

How can you execute the Shifter functions?

Before executing a Shifter function the startShifterCountdown function needs to be called. It will open a window between 1h and 1h10' after calling it when the Shifter function can be executed.
During the 10-minute period, anyone can call the Shifter functions and define the amount that should be shifted from Curve to the permanent bucket or the other way around.
The two system Shifter functions: shiftLUSDFromSPToCurve and shiftLUSDFromCurveToSP have one param that needs to be set to call the two functions: _maxLUSDToShift. This parameter defines how much you want to shift. If you try to move more LUSD than the available amount, the function will still work, but it will clamp the amount to the max possible that can be shifted. If the amount is less than the max available, it will just shift less.

How can you find out if and when a Shifter function was triggered?

You can get the time when the countdown was started from Etherscan, with the lastShifterCountdownStartTime function. It’s a Unix timestamp, which can be converted to date via or a similar tool. You need to add 1 hour to that, in order to get the time of the window opening.