Accounting Engine
See AccountingEngine.sol for more details.
1. Introduction
The Accounting Engine serves as the system's financial management hub, overseeing tasks such as:
- Tracking system surplus and deficit.
- Managing system debt through auctions.
- Dealing with system surplus via auctions or transfers.
- Accepting COINs (for instance, from auctions) and using them to offset DEBT.
2. Contract Details
Key Methods:
Public
popDebtFromQueue: Removes a certain amount of debt from the time-sensitive queue after thepopDebtDelayduration has elapsed, for either settlement or auction.settleDebt: Utilizes coin balance to settle debt.cancelAuctionedDebtWithSurplus: Utilizes coins to settle debt that's in the queue.auctionDebt: Triggers an auction to liquidate portions of unsettled debt.auctionSurplus: Triggers an auction to liquidate surplus once all debt has been settled.transferExtraSurplus: Allocates (instead of auctioning it) excess surplus following debt settlement.transferPostSettlementSurplus: Allocates all remaining surplus when a Global Settlement event occurs.
Authorized
pushDebtToQueue: Adds a specified amount of debt to a time-sensitive queue.disableContract: Deactivates both Debt and Surplus Auction Houses, clears as much debt as possible, and transfers (afterdisableCooldowndelay) any leftover surplus to a designated drain address.
Required Authorities:
- LiquidationEngine: needs authorization to call
pushDebtToQueue. - Debt Auction House: needs authorization to call
cancelAuctionedDebtWithSurplus. - Surplus Auction House: needs approval to modify the contract's state in the SAFE Engine.
- Global Settlement: needs authorization to call
disableContract.
Contract Parameters:
Global
- SAFE Engine: Holds the coin and debt balance, is called to settle debt.
- Surplus Auction House: Is called to start surplus auctions.
- Debt Auction House: Is called to start debt auctions.
postSettlementSurplusDrain: Address to which surplus is sent following Global Settlement.surplusIsTransferred: Whether the surplus should be either auctioned off or transferred.surplusDelay: Time lag before the surplus becomes eligible for either auction or transfer.popDebtDelay: Time interval after which debt can be popped from the time-sensitive queue.disableCooldown: The waiting period following Global Settlement, after which any remaining surplus should be transferred.surplusAmount: Amount of surplus eligible for auction or transfer during each operation.surplusBuffer: Minimum surplus reserve to be maintained in the contract following an auction or transfer.debtAuctionMintedTokens: Initial quantity of Protocol Tokens offered for minting in debt auctions.debtAuctionBidSize: Chunk of debt that can be offered in each individual debt auction.
3. Key Mechanisms & Concepts
Queued Debt, On Auction Debt & Unqueued Unauctioned Debt
Within the SAFE Engine's scope, the Accounting Engine maintains a single debt balance associated with the contract address. This balance is the summation of three components: the queued debt, representing debt in line for auctioning; the unqueued debt, which is currently being auctioned; and the remaining debt not undergoing auction at the moment.
The unqueued-unauctioned debt can be calculated as follows:
unqueuedUnauctionedDebt = debtBalance - queuedDebt - onAuctionDebt
Once the unqueuedUnauctionedDebt debt reaches the specified debtAuctionBidSize threshold and the cooldown period elapses, a debt auction is initiated. During this process, the overall debt of the contract remains unchanged, but the onAuctionDebt metric increases as the debt enters the auction phase. Simultaneously, the calculation for unqueuedUnauctionedDebt decreases as the debt undergoing auction is accounted for.
4. Gotchas
Unqueued Unauctioned Debt underflow
The queuedDebt is modified through the pushDebtToQueue (authorized) and popDebtFromQueue (public) methods. They don't exclusively mirror the debtBalance recorded in the SAFE Engine. If an authorized contract uses pushDebtToQueue without transferring debt to the Accounting Engine, it could lead to an underflow issue (if queuedDebt exceeds debtBalance). This situation could potentially disrupt the contract's ability to auction debt as the unqueuedUnauctionedDebt calculation might underflow and revert.
5. Failure Modes
Parameters misconfiguration
- High
surplusDelayslows surplus actions. - Low
surplusDelayrushes surplus auctions. - High
popDebtDelaydelays debt auctions. - Low
popDebtDelayrisks double debt coverage. - High
surplusAmountrisks unfilled surplus auctions. - Low
surplusAmounthampers surplus actions. - High
surplusBufferblocks surplus auctions. - Low
surplusBufferrisks uncovered new debt. - High
debtAuctionMintedTokensdilutes protocol tokens. - Low
debtAuctionMintedTokensrisks failed debt auctions. - High
debtAuctionBidSizerisks unfilled debt auctions. - Low
debtAuctionBidSizeslows debt auctions. - Low
shutdownCooldownrisks premature surplus moves. - High
shutdownCooldowndelays post-shutdown surplus actions.
Post Settlement Surplus Drain misconfiguration
The postSettlementSurplusDrain address should be configured after the system is deployed. It's permissible to leave it unset, but doing so comes with implications: if Global Settlement is activated while this address is not specified, any surplus remaining after the settlement won't be drained. Instead, this surplus can only be used for debt elimination. It's worth noting that once Global Settlement is triggered, the address for postSettlementSurplusDrain becomes immutable and can't be changed.