M-1: `JANE` burn mechanism is unfair and gameable
Summary:
The JANE burn mechanism has some flaws that lead to an unfair and gameable process.
Description:
The burn mechanism relies on a snapshot of the borrower’s balance taken only at the time of the first burn in MarkdownController.burnJaneProportional(). Any JANE received after the snapshot is not incorporated into the target burn, causing systematic under-penalization.
MarkdownController.burnJaneProportional() and MarkdownController.burnJaneFull() relies on the transfer freeze mechanism to prevent borrowers from moving their JANE tokens during default. However, once transfers are globally enabled, borrowers can transfer their JANE tokens to other addresses before entering delinquent/default status, effectively avoiding the penalty mechanism.
The penalty does not consider debt magnitude. Two borrowers with equal JANE balances but very different outstanding debts accrue the same burn curve, which is not proportional to credit risk contribution.
Impact:
Medium. The burn mechanism is not fair and can be gamed.
Recommendation:
If the intention is to prevent bad actors farming jane and then defaulting, consider to implement one of the following:
- Replace liquid
JANEemissions with a non-transferable, vesting reward token (e.g.veJANE) and have the penalty mechanism burn unvestedveJANE. Upon entering delinquent/default status, immediately stop vesting and farming. Take a deterministic snapshot at the state transition, and optionally scale the penalty by outstanding debt for better fairness. - Allow burning not yet claimed
JANEwith the function that helps burn unclaimedJANEfrom the RewardsDistributor using a Merkle proof.
Developer Response:
Acknowledged, but will not fix immediately. In the short run, JANE will be non-transferable. We will come up with a better mechanism in the longer term.