Accrued Interest Tracking

In order to track accrued interest on floating rate loans, we must accrue interest to a user's liability every time their borrowing interest rate changes. We accomplish this by tracking users' liabilities with liability tokens that increase in value over time, accruing interest to all outstanding loans.

Accrued Interest Tracker Overview

Tracking accrued interest for underlying assets is done using an accrued interest tracker account that starts with a balance of 1000 interest tracking tokens and receives interest accrual payments every time the utilization ratio of the asset it's tracking changes. Effectively, this means the account is tracking the liability value of a loan taken out at protocol origination. When a user borrows from the protocol we store their borrowed amount divided by the interest tracker balance, then at all points in the future we can multiply that quotient by the current interest tracker balance divided by the starting interest tracker balance to get the current value of a user's liabilities.

Accrued Interest Tracker Payments

Every time the utilization ratio of an underlying asset changes, the pool makes an accrued interest payment to the accrued interest tracker account. The payment amount is equal to the per-block interest accrued on the balance of the accrued interest tracker account times the number of blocks between the second to last and last utilization modifying transactions. This means that accrued interest tracking lags one period. The indicator must lag because turret smart contracts do not have an accurate view of the current ledger, so they need to look at past ledger state to ensure truthfulness. See Math for the equation.

To provide an example, we'll outline the utilization delta payment of a sample transaction (transaction 100):

  • Transaction 98 - block 1000 - depositing XLM

    • Protocol state pre-transaction 98

      • Pool Balance: 90 XLM

      • XLM Liabilities: 100 XLM

      • XLM Utilization Ratio: .526

      • Accrued interest tracker balance: 100

    • Transaction 98 Action:

      • Deposits 10 XLM into lending pool

    • Protocol state post-transaction 98

      • Pool Balance: 100 XLM

      • XLM Liabilities: 100 XLM

      • XLM Utilization Ratio: .5

  • Transaction 99: Block 1100 - Borrowing XLM

    • Details irrelevant

  • Transaction 100: Block irrelevant - Borrowing XLM

    • Details irrelevant

    • Accrued Interest Payment

      • Makes accrued interest payment of 50 interest tracker assets to the accrued interest tracker account

        • 100*(.05+.526*0.2)/(6,307,200)*(1100-1000) = 0.0002461

      It should be noted that transactions 98 and 99 would also have made accrued interest payments; they just weren't the focus of this example.

Accrued Interest Corrections

In addition to accrued interest payments, the accruet interest tracker sysrem also makes accrued interest correction clawbacks and payments. These take place in the same transaction as accrued interest payments. This is necessary because the accrued interest tracker can apply an incorrect payment if its ledger view is incorrect and missing the most recent transaction (this commonly occurs when two users interact with the protocol simultaneously).

Accrued Interest Correction Process

When an accrued interest payment is calculated, the smart contract also checks the last utilization delta payment to see if it was correct. If it was not correct, the tracker calculates what the correction should be (undoing the bad delta and adding the correct one), then repeats the process, checking the next payment back. Once the smart contract finds the total correction, it is applied in either a payment or clawback operation depending on whether the correction was positive or negative. It should be noted that since there is a 5 minute timebounds on protocol transactions, the utilization tracker assumes that any accrued interest payment 5 minutes newer than the previous one was correct.

To provide an example, we'll outline the accrued interest correction payment of a sample transaction (transaction 100):

  • Transaction 97 - Block 900 - Deposit XLM

    • Protocol state pre-transaction 97

      • Pool Balance: 60 XLM

      • XLM Liabilities: 100 XLM

      • Utilization Ratio: .625

      • Accrued interest tracker balance: 1000

    • Transaction 97 Action

      • Deposit 20 XLM

      • Accrued interest tracker payment of .01

    • Protocol state post-transaction 97

      • Pool Balance: 80 XLM

      • XLM Liabilities: 100 XLM

      • Utilizaiton Ratio: .5555556

      • Accrued interest tracker balance: 1000.01

  • Transaction 98- Block 1000 - Deposits XLM

    • Protocol state pre-transaction 98

      • Pool Balance: 80 XLM

      • XLM Liabilities: 100 XLM

      • Utilization Ratio: .5555556

      • Accrued interest tracker balance: 1000.01

    • Transaction 98 action

      • Deposit 20 XLM

      • Accrued interest tracker payment: .01

    • Protocol state post-transaction 98

      • Pool Balance: 100 XLM

      • XLM Liabilities: 100 XLM

      • Utilization Ratio: .5

      • Accrued interest tracker balance: 1000.02

  • Transaction 99 - Block 1010 - Borrows XLM

    • Protocol state pre-transaction 99

      • Pool Balance: 100 XLM

      • XLM Liabilities: 100 XLM

      • Utilization Ratio: .5

      • Accrued interest tracker balance: 1000.02

    • Transaction 99 action

      • Borrows 100 XLM

      • Makes an accrued interest tracker payment of .002

        • This is incorrect, correct payment is .002774

          • (0.05+0.625*0.2)/(6,307,200)(1000-900)*1000 = .002774

    • Protocol state post-transaction 99

      • Pool Balance: 100 XLM

      • XLM Liabilities: 100 XLM

      • Utilization Ratio: .5

      • Accrued interest tracker balance: 1000.022

  • Transaction 100 - Borrows XLM

    • Protocol state pre-transaction 100

      • Accrued interest tracker balance: 1000.022

      • Other information irrelevant

    • Protocol actions

      • Borrow XLM

      • Make a accrued interest correction payment of .000774

        • .002774 - .002 = .000774

      • Make an accrued interest tracker payment of .0002554

        • (0.05+0.555556*0.2)/(6,307,200)(1010-1000)*1000 = .0002554

  • Protocol state pre-transaction 100

    • Accrued interest tracker balance: 1000.02303

    • Other information irrelevant

Using the Accrued Interest Tracker to find the value of a user liability.

To find the value of a users liability the protocol multiplies the number of liability tokens associated with that liability times the accrued interest tracker balance plus the expected next accrued interest tracker payment divided by the starting tracker balance.

For Example:

  • User's liability claimable balance contains 99.8 l00XLM tokens

  • 00XLM's accrued interest tracker account has 1005.2 i00XLM

    • Next expected payment is .2 i00XLM

  • User's liability is 100.33892 XLM

    • (1005.2+.2)/1000 * 99.8 = 100.33892

Last updated