Stablecoin Accounting

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

totalStablecoinIssued


totalStablecoinIssued=poolStablecoinIssued+totalUnbackedStablecointotalStablecoinIssued = poolStablecoinIssued + totalUnbackedStablecoin

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 above mentioned equation affects each function, starting with poolStablecoinIssued.

The variable poolStablecoinIssued is stored in the BookKeeper 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, which is of collateral XYZ, decreases by 10, then

  • poolStablecoinissued[XYZ] decreases by 10*debtAccumulatedRate

  • totalStablecoinIssued decreases by 10*debtAccumulatedRate

totalStablecoinIssued=poolStablecoinIssued+totalUnbackedStablecointotalStablecoinIssued ↓ = poolStablecoinIssued↓ + totalUnbackedStablecoin

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.

Equation A

totalStablecoinIssued=ΣpoolStablecoinIssued+totalUnbackedStablecointotalStablecoinIssued = ΣpoolStablecoinIssued + totalUnbackedStablecoin

Equation B

totalStablecoinIssued=[ΣpoolStablecoinIssuedα]+[totalUnbackedStablecoin+α]totalStablecoinIssued = [ΣpoolStablecoinIssued - α] + [totalUnbackedStablecoin + α]

When α represents the amount of debt transferred from poolStablecoinIssued tot unbackedStablecoin by confiscatePosition function.

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+β=[ΣpoolStablecoinIssued+β]+totalUnbackedStablecointotalStablecoinIssued + β = [ΣpoolStablecoinIssued + β] + totalUnbackedStablecoin

Where β represents the amount by which the debtValue increases as the inflated value of _debtAccumulatedRate is reflected in the debtVault when the accrueStabilityFee function is called.

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

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,

totalStablecoinIssued=poolStablecoinIssued+totalUnbackedStablecointotalStablecoinIssued ↑ = poolStablecoinIssued↑ + totalUnbackedStablecoin

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

totalStablecoinIssued=poolStablecoinIssued+totalUnbackedStablecointotalStablecoinIssued ↓ = poolStablecoinIssued↓ + totalUnbackedStablecoin

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.

totalStablecoinIssued=ΣpoolStablecoinIssued+totalUnbackedStablecointotalStablecoinIssued ↓ = ΣpoolStablecoinIssued↓ + totalUnbackedStablecoin

The mintUnbackedStablecoin function increases the amount of totalUnbackedStablecoin and totalStablecoinIssued.

totalStablecoinIssued=ΣpoolStablecoinIssued+totalUnbackedStablecointotalStablecoinIssued ↑ = ΣpoolStablecoinIssued↑ + totalUnbackedStablecoin

totalStablecoinIssued+β=[ΣpoolStablecoinIssued+β]+totalUnbackedStablecointotalStablecoinIssued + β = [ΣpoolStablecoinIssued + β] + totalUnbackedStablecoin

Where β represents the amount by which the debtValue increases as the inflated value of _debtAccummulatedRate is reflected in the debtValue when the accrueStabilityFee function is called.

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

Last updated

Copyright© Fathom App 2024.