# 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

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.*poolStablecoinIssued*

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

contract. Three functions manipulate **BookKeeper**`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`

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**

**Equation B**

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.

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

contract. Four functions manipulate **BookKeeper**`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,

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

The `settleSystemBadDebt`

function utilizes the internal balance of stablecoin in the

within the **SystemDebtEngine**`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`

.

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