LoanManager Contracts
The "lifecycle" of a loan through the Teller protocol
The LoanManager contract holds all the main borrower-oriented actions of the Teller protocol.
There are 2 types of loans. Loans with Ether as collateral and loans with an ERC20 token as collateral. The main difference is how the loans are created and collateral paid out.
Below are the key methods that reside in the contract. For the complete source code, check out LoanManager.sol on GitHub.

{1} createLoanWithTerms()

function createLoanWithTerms( TellerCommon.LoanRequest calldata request, TellerCommon.LoanResponse[] calldata responses, uint256 collateral )
Creates an instance of a loan with terms on the protocol that has been accepted by a consensus of nodes. There are two special parameters in this method, that are structs specific to the Teller protocol.
TellerCommon.LoanRequest is a request struct/object that is sent to the Teller Nodes and subsequently on-chain, with all the required entries such as:
Variable
Type
Description
borrower
address payable
The wallet address of the borrower
recipient
address
The address where funds will be sent, only applicable in over collateralized loans
consensusAddress
address
The address of the Teller loan consensus contract to which the request should be sent
requestNonce
uint256
The nonce of the borrower wallet address required for authentication
amount
uint256
The number of tokens requested by the borrower for the loan
duration
uint256
The length of time in seconds that the loan has been requested for
requestTime
uint256
The timestamp at which the loan was requested
TellerCommon.LoanResponse[] is an array of signed response structs/objects that are returned from registered Teller nodes that need to be passed on-chain in order to register the loan terms on-chain.
Variable
Type
Description
signer
address
The wallet address of the signer validating the interest request of the lender
consensusAddress
address
The address of the Teller loan consensus contract to which the request should be sent
responseTime
uint256
The timestamp at which the response was sent
interestRate
uint256
The signed interest rate generated by the signer's Credit Risk Algorithm (CRA)
collateralRatio
uint256
The ratio of collateral to loan amount that is generated by the signer's Credit Risk Algorithm (CRA)
maxLoanAmount
uint256
The largest amount of tokens that can be taken out in the loan by the borrower
signature
Signature
The signature generated by the signer in the format of the below Signature struct
The last param collateral is the amount of collateral that needs to be deposited into the protocol in order to be able to take out the funds of the loan.

{2} depositCollateral()

function( address borrower, uint256 loanID, uint256 amount )
In situations where a borrower's collateral drops in value (e.g. price drops 90% in value), the borrower would need to deposit more collateral to keep the loan Active and out of liquidation. This can be done with the depositCollateral() method called by the borrower or developer dApp.
Param
Type
Description
borrower
address
The address of the loan borrower
loanID
uint256
The ID of the loan the collateral is for
amount
uint256
The amount to deposit as collateral

{3} takeOutLoan()

function( uint256 loanID, uint256 amountBorrow )
Once a loan with terms has been created on-chain with createLoanWithTerms() and collateral deposited, a borrower can now take out the loan.
Param
Type
Description
loanID
uint256
The ID of the loan being taken out
amountBorrow
uint256
The number of funds to take out in the loan

{4} repay()

function( uint256 amount, uint256 loanID )
Once the borrower has used the loan he will also need to pay back the loan. This can be done with the repay() method on the respective loan contract.
Param
Type
Description
amount
uint256
The number of funds to pay back into the loan
loanID
uint256
The ID of the loan the payment is for
One thing to note: if a loan is repaid in full with the repay() method, the borrower's collateral is automatically sent to their wallet, no additional calls are needed!

{5} withdrawCollateral()

function( uint256 amount, uint256 loanID )
In situations where the value of the borrower's collateral has risen (hello there new ATH!), a borrower can withdraw a portion of their collateral and still keep the loan active by calling the withdrawCollateral() method on-chain.
Param
Type
Description
amount
uint256
The amount of collateral token or ether the caller is hoping to withdraw
loanID
uint256
The ID of the loan the collateral is for