Managed Portfolio [legacy]

ManagedPortfolio is in the process of being sunset.

New TrueFi Capital Markets portfolios deployed after June 2022 use contractFlexiblePortfolio

ManagedPortfolio represents a portfolio of BulletLoans. Lenders put funds into the portfolio, the manager uses funds to issue loans to borrowers, and borrowers repay principal and interest back into the portfolio. ManagedPortfolio issues ERC-20 Liquidity Provider tokens to lenders in proportion to the amount they lend. These tokens represent a lender's share of the funds in the pool, including the interest accumulated from loans repaid by borrowers.

All of the portfolio operations are up to the manager's discretion. The Portfolio Manager makes decisions about issuing new loans, marking them as defaulted, altering portfolio params and so on. Manager also specifies an ILenderVerifier contract that is responsible for handling the permissions to join the portfolio (portfolios might be permissionless, but typically are not and only offer entrance to a defined group of lenders).

Portfolio tokens represent lenders' share in the pooled funds. Lenders put funds into the portfolio if they trust the manager is going to abide by a reasonable policy. Funds from the portfolio are only available for withdrawal after the portfolio's close date.

Methods

MethodNotes

deposit(uint256 depositAmount, bytes memory metadata)

Lends a certain amount of underlying tokens to the portfolio. If the portfolio has lender restrictions enabled, this function requires metadata to validate the lender’s address is allowed to lend.

withdraw(uint256 sharesAmount, bytes memory)

After the portfolio’s close date, lender can withdraw funds, i.e. redeeming the portfolio token for underlying pool tokens.

createBulletLoan( uint256 loanDuration, address borrower, uint256 principalAmount, uint256 repaymentAmount )

Creates bullet loan token using BulletLoans contract.

markLoanAsDefaulted(uint256 instrumentId)

Only the portfolio’s manager can mark a loan as defaulted.

markLoanAsResolved(uint256 instrumentId)

Only the portfolio’s manager can mark a loan as resolved. Intended to be used for situations after partial repayment where a loan workout has been agreed to.

setEndDate(uint256 newEndDate)

Manager can change portfolio’s close date, or EndDate. Note that the portfolio’s close date can only be decreased. Close date can NOT be moved further into the future, nor can it be decreased to a date earlier than any active loan’s maturity date.

setLenderVerifier(ILenderVerifier _lenderVerifier)

Manager can set the lender verifier contract to enforce lender restrictions. Manager can leverage three different types of restrictions:

  • Whitelist: contract that implements simple, universal whitelist.

  • WhitelistLenderVerifier: contract that implements a unique whitelist for each of the portfolios, which are using this verifier. Managers of particular portfolios have the authority to manage respective whitelists.

  • SignatureOnlyLenderVerifier: contract that requires the lender to provide a signature of a predefined message.

setManagerFee(uint256 _managerFee)

Manager can set the portfolio fee, or managerFee, in basis points. Portfolio fee is charged on deployed capital

setMaxSize(uint256 _maxSize)

Manager sets a cap, or maxSize, for a portfolio. Lenders can not put more funds into the portfolio if it would cause the total principal amount lent into the portfolio to exceed the maxSize.

updateLoanParameters( uint256 instrumentId, uint256 newTotalDebt, uint256 newRepaymentDate )

Manager can modify loan terms, changing maturity date or total debt to be repaid. In order to change the maturity date to an earlier date or increase the repayment value, the borrower must consent and provide a signature.

View Methods

MethodNotes

getStatus()

Returns status of the portfolio. If current date is past the portfolio’s close date, will return ‘Closed’. If portfolio holds defaulted loans, will return ‘Frozen’.

getAmountToMint(uint256 amount)

Returns the amount of portfolio tokens that would be minted for a given amount of tokens to be lent (e.g. if 1000 USDC are lent, 995 tfExamplePortfolio tokens would be minted).

getOpenLoanIds()

Returns list of open loan tokens.

illiquidValue()

Returns estimated value of active, illiquid loans. Calculated on straight-line basis.

liquidValue()

Returns balance of idle underlying tokens held by portfolio.

value()

Returns total estimated value of portfolio (liquidValue + illiquidValue).

Typical Flows 🌊

Below are examples of typical flows in TrueFi Capital Markets pools:

  • Manager creates ManagedPortfolio using ManagedPortfolioFactory.

  • Lender lends funds into the ManagedPortfolio.

  • Manager issues a BulletLoans token to the ManagedPortfolio (portfolio sends funds to the Borrower).

  • Borrower repays BulletLoans an owed amount (BulletLoans will send funds to the debt owner - in this case the ManagedPortfolio).

  • Lender withdraws funds from the ManagedPortfolio.

Additional actions that might happen:

  • Manager can change loan parameters (with a Borrower's approval if necessary).

  • Manager can set loan status to Defaulted if Borrower does not return funds on time (and eventually set loan status to Resolved once the debt is settled).

  • Manager can change various ManagedPortfolio properties.

BulletLoans is an ERC-721 contract. Each of the tokens represents a single loan. All the loan parameters can be read from LoanMetadata struct. BulletLoans contract enables loan creation, facilitates loan repayment and allows managing the loan's state and parameters.

ManagedPortfolio is an ERC-20 token facilitates funds management and allows loan issuance. Portfolio tokens represent lenders' share in the pooled funds. All of the portfolio operations are up to the managers discretion. Manager makes the decisions about issuing new loans, marking them as defaulted, altering portfolios params and so on. Lenders only lend funds into the portfolio if they trust the manager is going to abide by a reasonable policy. Manager also specifies an ILenderVerifier contract that is responsible for handling the permissions to join the portfolio (portfolios might be permissionless, but typically are not and only offer entrance to a defined group of lenders). Funds from the portfolio are only available for the withdrawal after the final closing date.

ManagedPortfolioFactory

Contract that allows easy portfolio configuration and creation. A particular instance of the factory can only be accessed by whitelisted addresses.

ProtocolConfig

Contract holding key system params.

BorrowerSignatureVerifier

A contract that verifies borrower's consent to change the loan parameters. Manager can freely change the loan parameters in borrower's favour (reduce owned amount, increase time), but needs an explicit, borrower's approval to do the opposite.

ILenderVerifier

Whitelist

A contract that implements simple, universal whitelist.

WhitelistLenderVerifier

A contract that implements a unique whitelist for each of the portfolios, which are using this verifier. Managers of particular portfolios have the authority to manage respective whitelists.

SignatureOnlyLenderVerifier

A contract that requires lender to provide a signature of a predefined message.

Last updated

Governance

TallySnapshot

Community

ForumTwitter