# Vault Contract

Zoe v0.24.0. Last updated August 25, 2022.
# View the code on Github (opens new window) (Last updated: Aug 15, 2022)
# View contracts on Github (opens new window)

The Vault is the primary mechanism for making IST (the Agoric stable-value currency) available to participants in the economy. It does this by issuing loans against supported types of collateral. The creator of the contract can add new types of collateral. (This is expected to be under the control of on-chain governance after the initial currencies are defined when the contract starts up.)

# Borrowers

Borrowers open a vault by calling makeVaultInvitation()in the publicAPI to get an invitation. Their proposal specifies that they're giving a recognized collateral type, and how much IST they want in return. The contract is parameterized with a collateralization rate per currency and borrowers can withdraw up to that ratio. Other parameters control the interest rate. (Interest will be automatically added to the vault's debt.) The contract also has access to a priceAuthority, which is an oracle monitoring the exchange value of the collateral. If the value of a borrower's collateral ever falls below the minimum ratio, the vault will be liquidated. The liquidation approach is pluggable and will be modifiable under the control of governance.

When borrowers exercise an invitation and deposit collateral, they receive a Vault object and some tools useful to the wallet from the offerResults. The Vault has these methods: { makeAdjustBalancesInvitation, makeCloseInvitation, getCollateralAmount, getDebtAmount, getLiquidationSeat, getLiquidationPromise }.

An AdjustBalancesInvitation allows the borrower to add or remove collateral or increase or decrease the loan balance. CloseInvitation allows the borrower to close their loan and withdraw any remaining collateral. The liquidationPromise allows the borrower to find out if/when the loan gets liquidated. The liquidationSeat's getPayoff() or getPayoffs() allow the borrower to retrieve any proceeds above what's needed to repay the debt. getCollateralAmount() and getDebtAmount() reveal the named balances.

# adjustBalances

The borrower can adjust their collateral and debt levels by exercising an AdjustBalancesInvitation with a proposal that specifies the amount of Collateral and IST that they will give and that they want (either keyword can be in either position.) As long as the resulting balances would not violate the required ratios and the withdrawals are within the loan's current balance, the adjustments will be made. If the debt balance increases, loanFee multiplied by the incremental debt will be added to the debt balance.

# closeInvitation

The borrower can close their loan by exercising a closeInvitation. The borrower must give at least the current debtAmount in order to close out the loan and retrieve their collateral. Since any excess will be returned, it is safe to overpay to cover variations in pricing.

# Interest and Liquidation

Parameters (subject to governance) specific to each collateral type set the interest rate and required collateralization ratio.

The liquidationMargin is the collateralizationRatio required to open a vault and keep it open. If the ratio of current value of collateral (according to the priceAuthority, currently driven by the AMM) to the outstanding debt falls below liquidationMargin, the collateral will be sold off, the debt repaid, and any remainder returned to the borrower. So it's prudent for borrowers to over-collateralize so that price volatility and interest charges don't quickly drive their loans into default.

The loanFee (in basis points) is charged on the amount of IST issued when opening a loan or increasing the amount of a loan. The interestRate is an annual rate.

ChargingPeriod and recordingPeriod are parameters of the Vault that apply to all loans. They can be adjusted (by governance) to change how frequently interest is accrued, and how frequently interest is compounded.

# UI Support

The following are returned in offerResults when calling openLoan for the benefit of the user's wallet.

 uiNotifier,
 invitationMakers: { AdjustBalances, CloseVault }

# Adding Collateral Types

The creatorFacet has a method addVaultType() that allows someone to add new collateral types and specify the parameters for its loans.

# Implementation Detail

# Vats

Currently the VaultFactory runs all the vaults in a single vat. We intend to split the vaults into separate vats for better isolation. In order to allow the liquidation approach to be pluggable and to be visible to and changeable by governance, liquidation takes place in a separate vat.

# Invitations

# makeLoan

The Vault's public API includes makeVaultInvitation() and getCollaterals(), as well as getAMM() and getRunIssuer(). getCollaterals() returns a list of the collateral types that are accepted. getAmm() returns the public facet of the AMM. getRunIssuer() provides access to the issuer of IST so anyone can hold, spend and recognize IST. makeVaultInvitation() is described above under Borrowers