Stablecoin Accounting

This section provides a deep understanding of how the accounting of issued stablecoin is done in the BookKeeper contract.



The formula mentioned above is used in all the functions that manipulate the totalStablecoinIssued and poolStablecoinIssued variables. If the value on the right-hand side of the equation changes, the value on the left side must be changed exactly the same way.

Now, let's delve deeper into the functions that manipulate the poolStablecoinIssued and totalStablecoinIssued variables. We will see how the abovementioned equation affects each function, starting with poolStablecoinIssued.

The variable poolStablecoinIssued is stored in the BookKeeper.sol contract. Three functions manipulate poolStablecoinIssued.

This function manipulates both poolStablecoinIssued and totalStablecoinIssued.

The adjustPosition function changes the lockedCollateral and debtShare values mapped to each position. When the debtShare in a position decreases, poolStablecoinIssued also decreases. Conversely, when the debtShare in a position increases, the value of poolStablecoinIssued increases. It calculates the amount by which the debt value in a position has increased or decreased and adjusts the poolStablecoinIssued value accordingly. The adjustPosition function also manipulates the totalStablecoinIssued variable.

For example:

If debtShare in Position#48, which is of collateral XYZ, decreases by 10, then

  • poolStablecoinissued[XYZ] decreases by 10*debtAccumulatedRate

  • totalStablecoinIssued decreases by 10*debtAccumulatedRate

This function manipulates both poolStablecoinIssued and totalUnbackedStablecoin but not totalStablecoinIssued.

The confiscatePosition function removes collateral and debt from a position and transfers them to addresses specified in the function arguments. During this process, the pool-specific balance is deducted. The amount of debt deducted from poolStablecoinIssued results in an increase in both the systemBadDebt[_stablecoinDebtor] and totalUnbackedStablecoin.

However, the totalStablecoinIssued is unaffected because it is the sum of all poolStablecoinIssued values and totalUnbackedStablecoin. The confiscatePosition function essentially transfers values from poolStablecoinIssued to totalUnbackedStablecoin, ensuring that the totalStablecoinIssued remains unchanged.

What the confiscatePosition function does is transition from equation A to equation B.

This function manipulates both poolStablecoinIssued and totalStablecoinIssued variables.

The accrueStabilityFee function increases the value of poolStablecoinIssued[_collateralPoolId]. This action of accruing stability fees involves recalculating the total amount of debt issued from a specific collateral type. Due to the increase in poolStablecoinIssued[_collateralPoolId], the totalStablecoinIssued value also increases.

totalStablecoinIssued is the variable stored in the BookKeeper.sol contract. Four functions manipulate totalStablecoinIssued. fn adjustPosition

The adjustPosition function adjusts the values of totalStablecoinIssued and poolStablecoinIssued based on the changes made to a position. For more details, please refer to the fn adjustPosition section under poolStablecoinIssued.

If a position's debt increases because a user borrows (more) FXD,

If a position's debt decreases as a user pays back FXD,

The settleSystemBadDebt function utilizes the internal balance of stablecoin in the systemDebtEngine within the bookKeeper to settle the bad debt. When the bad debt is settled, the value of totalUnbackedStablecoin decreases, and so does the value of totalStablecoinIssued.

The mintUnbackedStablecoin function increases the amount of totalUnbackedStablecoin and totalStablecoinIssued.

For a more detailed explanation, please refer to the previous section on accrueStabilityFee.

Last updated