# PrimaryLendingPlatformV2Core

## Overview

#### License: MIT

```solidity
abstract contract PrimaryLendingPlatformV2Core is Initializable, AccessControlUpgradeable, ReentrancyGuardUpgradeable
```

Core contract for the Primary Lending Platform V2.

Abstract contract that defines the core functionality of the primary lending platform.

## Structs info

### Ratio

```solidity
struct Ratio {
	uint8 numerator;
	uint8 denominator;
}
```

### ProjectTokenInfo

```solidity
struct ProjectTokenInfo {
	bool isListed;
	bool isDepositPaused;
	bool isWithdrawPaused;
	PrimaryLendingPlatformV2Core.Ratio loanToValueRatio;
}
```

### LendingTokenInfo

```solidity
struct LendingTokenInfo {
	bool isListed;
	bool isPaused;
	BLendingToken bLendingToken;
	PrimaryLendingPlatformV2Core.Ratio loanToValueRatio;
}
```

### BorrowPosition

```solidity
struct BorrowPosition {
	uint256 loanBody;
	uint256 accrual;
}
```

## Events info

### Deposit

```solidity
event Deposit(address indexed who, address indexed tokenPrj, uint256 prjDepositAmount, address indexed beneficiary)
```

Emitted when a user deposits project tokens.

Parameters:

| Name             | Type    | Description                                                           |
| ---------------- | ------- | --------------------------------------------------------------------- |
| who              | address | The address of the user who deposited the tokens.                     |
| tokenPrj         | address | The address of the project token that was deposited.                  |
| prjDepositAmount | uint256 | The amount of project tokens that were deposited.                     |
| beneficiary      | address | The address of the beneficiary who will receive the deposited tokens. |

### Withdraw

```solidity
event Withdraw(address indexed who, address indexed tokenPrj, address lendingToken, uint256 prjWithdrawAmount, address indexed beneficiary)
```

Emitted when a user withdraws project tokens.

Parameters:

| Name              | Type    | Description                                                           |
| ----------------- | ------- | --------------------------------------------------------------------- |
| who               | address | The address of the user who withdrew the tokens.                      |
| tokenPrj          | address | The address of the project token that was withdrawn.                  |
| lendingToken      | address | The address of the lending token that was used as collateral.         |
| prjWithdrawAmount | uint256 | The amount of project tokens that were withdrawn.                     |
| beneficiary       | address | The address of the beneficiary who will receive the withdrawn tokens. |

### Supply

```solidity
event Supply(address indexed who, address indexed supplyToken, uint256 supplyAmount, address indexed supplyBToken, uint256 amountSupplyBTokenReceived)
```

Emitted when a user supplies lending tokens.

Parameters:

| Name                       | Type    | Description                                                                      |
| -------------------------- | ------- | -------------------------------------------------------------------------------- |
| who                        | address | The address of the user who supplied the tokens.                                 |
| supplyToken                | address | The address of the token that was supplied.                                      |
| supplyAmount               | uint256 | The amount of tokens that were supplied.                                         |
| supplyBToken               | address | The address of the bToken that was received in exchange for the supplied tokens. |
| amountSupplyBTokenReceived | uint256 | The amount of bTokens that were received in exchange for the supplied tokens.    |

### Redeem

```solidity
event Redeem(address indexed who, address indexed redeemToken, address indexed redeemBToken, uint256 redeemAmount)
```

Emitted when a user redeems bTokens for the underlying token.

Parameters:

| Name         | Type    | Description                                      |
| ------------ | ------- | ------------------------------------------------ |
| who          | address | The address of the user who redeemed the tokens. |
| redeemToken  | address | The address of the token that was redeemed.      |
| redeemBToken | address | The address of the bToken that was redeemed.     |
| redeemAmount | uint256 | The amount of bTokens that were redeemed.        |

### RedeemUnderlying

```solidity
event RedeemUnderlying(address indexed who, address indexed redeemToken, address indexed redeemBToken, uint256 redeemAmountUnderlying)
```

Emitted when a user redeems underlying token for the bToken.

Parameters:

| Name                   | Type    | Description                                         |
| ---------------------- | ------- | --------------------------------------------------- |
| who                    | address | The address of the user who redeemed the tokens.    |
| redeemToken            | address | The address of the token that was redeemed.         |
| redeemBToken           | address | The address of the bToken that was redeemed.        |
| redeemAmountUnderlying | uint256 | The amount of underlying tokens that were redeemed. |

### Borrow

```solidity
event Borrow(address indexed who, address indexed borrowToken, uint256 borrowAmount, address indexed prjAddress, uint256 prjAmount)
```

Emitted when a user borrows lending tokens.

Parameters:

| Name         | Type    | Description                                                   |
| ------------ | ------- | ------------------------------------------------------------- |
| who          | address | The address of the user who borrowed the tokens.              |
| borrowToken  | address | The address of the token that was borrowed.                   |
| borrowAmount | uint256 | The amount of tokens that were borrowed.                      |
| prjAddress   | address | The address of the project token that was used as collateral. |
| prjAmount    | uint256 | The amount of project tokens that were used as collateral.    |

### RepayBorrow

```solidity
event RepayBorrow(address indexed who, address indexed borrowToken, uint256 borrowAmount, address indexed prjAddress, bool isPositionFullyRepaid)
```

Emitted when a user repays borrowed lending tokens.

Parameters:

| Name                  | Type    | Description                                                         |
| --------------------- | ------- | ------------------------------------------------------------------- |
| who                   | address | The address of the user who repaid the tokens.                      |
| borrowToken           | address | The address of the token that was repaid.                           |
| borrowAmount          | uint256 | The amount of tokens that were repaid.                              |
| prjAddress            | address | The address of the project token that was used as collateral.       |
| isPositionFullyRepaid | bool    | A boolean indicating whether the entire borrow position was repaid. |

### SetModeratorContract

```solidity
event SetModeratorContract(address indexed newAddress)
```

Emitted when the moderator contract address is updated.

Parameters:

| Name       | Type    | Description                                |
| ---------- | ------- | ------------------------------------------ |
| newAddress | address | The address of the new moderator contract. |

## Constants info

### MODERATOR\_ROLE (0x797669c9)

```solidity
bytes32 constant MODERATOR_ROLE = keccak256("MODERATOR_ROLE")
```

## State variables info

### priceOracle (0x2630c12f)

```solidity
contract IPriceProviderAggregator priceOracle
```

### projectTokens (0xb269449f)

```solidity
address[] projectTokens
```

### projectTokenInfo (0x85f4da5c)

```solidity
mapping(address => struct PrimaryLendingPlatformV2Core.ProjectTokenInfo) projectTokenInfo
```

### lendingTokens (0x6f5f74f2)

```solidity
address[] lendingTokens
```

### lendingTokenInfo (0x3299093b)

```solidity
mapping(address => struct PrimaryLendingPlatformV2Core.LendingTokenInfo) lendingTokenInfo
```

### totalDepositedProjectToken (0xef867f0f)

```solidity
mapping(address => uint256) totalDepositedProjectToken
```

### borrowPosition (0xa9ce9417)

```solidity
mapping(address => mapping(address => mapping(address => struct PrimaryLendingPlatformV2Core.BorrowPosition))) borrowPosition
```

### totalBorrow (0xb090cf22)

```solidity
mapping(address => mapping(address => uint256)) totalBorrow
```

### borrowLimitPerCollateral (0x739d7547)

```solidity
mapping(address => uint256) borrowLimitPerCollateral
```

### totalBorrowPerLendingToken (0xc3ee8b6f)

```solidity
mapping(address => uint256) totalBorrowPerLendingToken
```

### borrowLimitPerLendingToken (0x9f9184db)

```solidity
mapping(address => uint256) borrowLimitPerLendingToken
```

### isRelatedContract (0x25de3084)

```solidity
mapping(address => bool) isRelatedContract
```

### primaryLendingPlatformLeverage (0x10c0bbed)

```solidity
contract IPrimaryLendingPlatformLeverage primaryLendingPlatformLeverage
```

### primaryLendingPlatformModerator (0xf32d0f2f)

```solidity
address primaryLendingPlatformModerator
```

## Modifiers info

### onlyAdmin

```solidity
modifier onlyAdmin()
```

Modifier that allows only the admin to call the function.

### isProjectTokenListed

```solidity
modifier isProjectTokenListed(address projectToken)
```

Modifier that requires the project token to be listed.

Parameters:

| Name         | Type    | Description                       |
| ------------ | ------- | --------------------------------- |
| projectToken | address | The address of the project token. |

### isLendingTokenListed

```solidity
modifier isLendingTokenListed(address lendingToken)
```

Modifier that requires the lending token to be listed.

Parameters:

| Name         | Type    | Description                       |
| ------------ | ------- | --------------------------------- |
| lendingToken | address | The address of the lending token. |

### onlyRelatedContracts

```solidity
modifier onlyRelatedContracts()
```

Modifier that allows only related contracts to call the function.

### onlyModeratorContract

```solidity
modifier onlyModeratorContract()
```

Modifier that allows only the moderator contract to call the function.

## Functions info

### initialize (0x8129fc1c)

```solidity
function initialize() public initializer
```

Initializes the contract and sets the name, symbol, and default roles.

### setPrimaryLendingPlatformModerator (0x4123cf11)

```solidity
function setPrimaryLendingPlatformModerator(
    address newModeratorContract
) external onlyAdmin
```

Sets the address of the new moderator contract for the Primary Lending Platform.

Requirements:

* `newModeratorContract` cannot be the zero address.
* Only the admin can call this function.

Parameters:

| Name                 | Type    | Description                                |
| -------------------- | ------- | ------------------------------------------ |
| newModeratorContract | address | The address of the new moderator contract. |

### setPriceOracle (0x530e784f)

```solidity
function setPriceOracle(address newPriceOracle) external onlyModeratorContract
```

Sets the price oracle contract address.

Requirements:

* Only the moderator contract can call this function.

Parameters:

| Name           | Type    | Description                                   |
| -------------- | ------- | --------------------------------------------- |
| newPriceOracle | address | The address of the new price oracle contract. |

### setPrimaryLendingPlatformLeverage (0xa1ab5419)

```solidity
function setPrimaryLendingPlatformLeverage(
    address newPrimaryLendingPlatformLeverage
) external onlyModeratorContract
```

Sets the address of the new primary index token leverage contract by the moderator contract.

Requirements:

* Only the moderator contract can call this function.

Parameters:

| Name                              | Type    | Description                                                   |
| --------------------------------- | ------- | ------------------------------------------------------------- |
| newPrimaryLendingPlatformLeverage | address | The address of the new primary index token leverage contract. |

### setRelatedContract (0xdcb4252a)

```solidity
function setRelatedContract(
    address relatedContract,
    bool isRelated
) public onlyModeratorContract
```

Sets the related contract status for a given contract address.

Requirements:

* The caller must be the moderator contract.

Parameters:

| Name            | Type    | Description                                                |
| --------------- | ------- | ---------------------------------------------------------- |
| relatedContract | address | The address of the contract to set the related status for. |
| isRelated       | bool    | The related status to set for the contract.                |

### removeProjectToken (0x3af44bfa)

```solidity
function removeProjectToken(
    uint256 projectTokenId,
    address projectToken
) external onlyModeratorContract
```

Removes a project token from the platform.

Requirements:

* The caller must be the moderator contract.
* The project token must exist in the platform.

Parameters:

| Name           | Type    | Description                                 |
| -------------- | ------- | ------------------------------------------- |
| projectTokenId | uint256 | The ID of the project token to remove.      |
| projectToken   | address | The address of the project token to remove. |

### removeLendingToken (0xc1ab02ee)

```solidity
function removeLendingToken(
    uint256 lendingTokenId,
    address lendingToken
) external onlyModeratorContract
```

Removes a lending token from the platform.

Requirements:

* The caller must be the moderator contract.
* The lending token address must be valid.

Parameters:

| Name           | Type    | Description                                     |
| -------------- | ------- | ----------------------------------------------- |
| lendingTokenId | uint256 | The ID of the lending token to be removed.      |
| lendingToken   | address | The address of the lending token to be removed. |

### setBorrowLimitPerCollateralAsset (0x8e85cdfa)

```solidity
function setBorrowLimitPerCollateralAsset(
    address projectToken,
    uint256 newBorrowLimit
) external onlyModeratorContract
```

Sets the borrow limit for a specific collateral asset.

Requirements:

* The caller must be the moderator contract.

Parameters:

| Name           | Type    | Description                                    |
| -------------- | ------- | ---------------------------------------------- |
| projectToken   | address | The address of the collateral asset.           |
| newBorrowLimit | uint256 | The new borrow limit for the collateral asset. |

### setBorrowLimitPerLendingAsset (0x92a39190)

```solidity
function setBorrowLimitPerLendingAsset(
    address lendingToken,
    uint256 newBorrowLimit
) external onlyModeratorContract
```

Sets the borrow limit for a specific lending asset.

Requirements:

* The caller must be the moderator contract.

Parameters:

| Name           | Type    | Description                                 |
| -------------- | ------- | ------------------------------------------- |
| lendingToken   | address | The address of the lending asset.           |
| newBorrowLimit | uint256 | The new borrow limit for the lending asset. |

### setProjectTokenInfo (0x4a5333bc)

```solidity
function setProjectTokenInfo(
    address projectToken,
    bool isDepositPaused,
    bool isWithdrawPaused,
    uint8 loanToValueRatioNumerator,
    uint8 loanToValueRatioDenominator
) external onlyModeratorContract
```

Sets the information of a project token.

Requirements:

* The caller must be the moderator contract.

Parameters:

| Name                        | Type    | Description                                                            |
| --------------------------- | ------- | ---------------------------------------------------------------------- |
| projectToken                | address | The address of the project token.                                      |
| isDepositPaused             | bool    | A boolean indicating whether deposit is paused for the project token.  |
| isWithdrawPaused            | bool    | A boolean indicating whether withdraw is paused for the project token. |
| loanToValueRatioNumerator   | uint8   | The numerator of the loan-to-value ratio for the project token.        |
| loanToValueRatioDenominator | uint8   | The denominator of the loan-to-value ratio for the project token.      |

### setLendingTokenInfo (0x821363a0)

```solidity
function setLendingTokenInfo(
    address lendingToken,
    address bLendingToken,
    bool isPaused,
    uint8 loanToValueRatioNumerator,
    uint8 loanToValueRatioDenominator
) external onlyModeratorContract
```

Sets the lending token information for a given lending token.

Requirements:

* The caller must be the moderator contract.

Parameters:

| Name                        | Type    | Description                                                       |
| --------------------------- | ------- | ----------------------------------------------------------------- |
| lendingToken                | address | The address of the lending token.                                 |
| bLendingToken               | address | The address of the corresponding bLending token.                  |
| isPaused                    | bool    | A boolean indicating whether the lending token is paused or not.  |
| loanToValueRatioNumerator   | uint8   | The numerator of the loan-to-value ratio for the lending token.   |
| loanToValueRatioDenominator | uint8   | The denominator of the loan-to-value ratio for the lending token. |

### deposit (0x47e7ef24)

```solidity
function deposit(
    address projectToken,
    uint256 projectTokenAmount
) external isProjectTokenListed(projectToken) nonReentrant
```

Deposits project tokens into the platform.

Deposits project tokens and calculates the deposit position.

Requirements:

* The project token must be listed.
* The project token must not be paused for deposits.
* The project token amount must be greater than 0.

Effects:

* Transfers the project tokens from the user to the contract.
* Calculates the deposit position for the user.

Parameters:

| Name               | Type    | Description                                       |
| ------------------ | ------- | ------------------------------------------------- |
| projectToken       | address | The address of the project token to be deposited. |
| projectTokenAmount | uint256 | The amount of project tokens to be deposited.     |

### depositFromRelatedContracts (0xbf423b75)

```solidity
function depositFromRelatedContracts(
    address projectToken,
    uint256 projectTokenAmount,
    address user,
    address beneficiary
) external isProjectTokenListed(projectToken) nonReentrant onlyRelatedContracts
```

Deposits project tokens from related contracts into the platform.

Requirements:

* The project token must be listed.
* Caller must be a related contract.
* The project token must not be paused for deposits.
* The project token amount must be greater than 0.

Effects:

* Transfers the project tokens from the user to the contract.
* Calculates the deposit position for the user.

Parameters:

| Name               | Type    | Description                                          |
| ------------------ | ------- | ---------------------------------------------------- |
| projectToken       | address | The address of the project token being deposited.    |
| projectTokenAmount | uint256 | The amount of project tokens being deposited.        |
| user               | address | The address of the user depositing the tokens.       |
| beneficiary        | address | The address of the beneficiary receiving the tokens. |

### calcAndTransferDepositPosition (0x556d4704)

```solidity
function calcAndTransferDepositPosition(
    address projectToken,
    uint256 projectTokenAmount,
    address user,
    address receiver
)
    external
    isProjectTokenListed(projectToken)
    onlyRelatedContracts
    nonReentrant
    returns (uint256)
```

Calculates and transfers the deposit position of a user for a specific project token.

Requirements:

* The project token must be listed.
* Called by a related contract.

Effects:

* Decreases the deposited project token amount in the user's deposit position.
* Decreases the total deposited project token amount.
* Transfers the project tokens to the receiver.

Parameters:

| Name               | Type    | Description                                                          |
| ------------------ | ------- | -------------------------------------------------------------------- |
| projectToken       | address | The address of the project token.                                    |
| projectTokenAmount | uint256 | The amount of project token to transfer.                             |
| user               | address | The address of the user whose deposit position is being transferred. |
| receiver           | address | The address of the receiver of the project token.                    |

Return values:

| Name | Type    | Description                              |
| ---- | ------- | ---------------------------------------- |
| \[0] | uint256 | The amount of project token transferred. |

### calcDepositPosition (0xdf5e6bed)

```solidity
function calcDepositPosition(
    address projectToken,
    uint256 projectTokenAmount,
    address user
) external isProjectTokenListed(projectToken) onlyRelatedContracts nonReentrant
```

Calculates the deposit position for a user based on the project token, project token amount and user address.

Requirements:

* The project token must be listed.
* Called by a related contract.

Parameters:

| Name               | Type    | Description                       |
| ------------------ | ------- | --------------------------------- |
| projectToken       | address | The address of the project token. |
| projectTokenAmount | uint256 | The amount of project token.      |
| user               | address | The address of the user.          |

### getCollateralAvailableToWithdraw (0x72620613)

```solidity
function getCollateralAvailableToWithdraw(
    address account,
    address projectToken,
    address lendingToken
) public view returns (uint256 collateralProjectToWithdraw)
```

Calculates the amount of collateral available to withdraw for a given account, project token and lending token.

Parameters:

| Name         | Type    | Description                       |
| ------------ | ------- | --------------------------------- |
| account      | address | The address of the account.       |
| projectToken | address | The address of the project token. |
| lendingToken | address | The address of the lending token. |

Return values:

| Name                        | Type    | Description                                     |
| --------------------------- | ------- | ----------------------------------------------- |
| collateralProjectToWithdraw | uint256 | The amount of collateral available to withdraw. |

### calcBorrowPosition (0x2dfee307)

```solidity
function calcBorrowPosition(
    address borrower,
    address projectToken,
    address lendingToken,
    uint256 lendingTokenAmount,
    address currentLendingToken
)
    external
    isProjectTokenListed(projectToken)
    isLendingTokenListed(lendingToken)
    onlyRelatedContracts
    nonReentrant
```

Allows a related contract to calculate the new borrow position of a user.

Requirements:

* The project token must be listed.
* The lending token must be listed.
* Called by a related contract.

Parameters:

| Name                | Type    | Description                                                               |
| ------------------- | ------- | ------------------------------------------------------------------------- |
| borrower            | address | The address of the user for whom the borrow position is being calculated. |
| projectToken        | address | The address of the project token being used as collateral.                |
| lendingToken        | address | The address of the lending token being borrowed.                          |
| lendingTokenAmount  | uint256 | The amount of lending tokens being borrowed.                              |
| currentLendingToken | address | The address of the current lending token being used as collateral.        |

### getLendingAvailableToBorrow (0x07445b52)

```solidity
function getLendingAvailableToBorrow(
    address account,
    address projectToken,
    address lendingToken
) public view returns (uint256 availableToBorrow)
```

Calculates the lending token available amount for borrowing.

Parameters:

| Name         | Type    | Description                   |
| ------------ | ------- | ----------------------------- |
| account      | address | Address of the user.          |
| projectToken | address | Address of the project token. |
| lendingToken | address | Address of the lending token. |

Return values:

| Name              | Type    | Description                                                 |
| ----------------- | ------- | ----------------------------------------------------------- |
| availableToBorrow | uint256 | The amount of lending token available amount for borrowing. |

### repay (0x1da649cf)

```solidity
function repay(
    address projectToken,
    address lendingToken,
    uint256 lendingTokenAmount
)
    external
    isProjectTokenListed(projectToken)
    isLendingTokenListed(lendingToken)
    nonReentrant
    returns (uint256)
```

Repays a specified amount of lendingToken for a given project token and lending token.

Allows a borrower to repay their outstanding loan for a given project token and lending token.

Requirements:

* The project token must be listed.
* The lending token must be listed.
* The lending amount must be greater than 0.
* The borrower must have an outstanding loan for the given project and lending token before.

Effects: Updates the interest in the borrower's borrow positions for the given `lendingToken`.

* Repays the specified `lendingTokenAmount` towards the borrower's loan.
* May fully or partially repay the borrow position, depending on the repayment amount and outstanding loan.

Parameters:

| Name               | Type    | Description                            |
| ------------------ | ------- | -------------------------------------- |
| projectToken       | address | The project token's address.           |
| lendingToken       | address | The lending token's address.           |
| lendingTokenAmount | uint256 | The amount of lending tokens to repay. |

Return values:

| Name | Type    | Description                               |
| ---- | ------- | ----------------------------------------- |
| \[0] | uint256 | amount of lending tokens actually repaid. |

### repayFromRelatedContract (0xf432e4e2)

```solidity
function repayFromRelatedContract(
    address projectToken,
    address lendingToken,
    uint256 lendingTokenAmount,
    address repairer,
    address borrower
)
    external
    isProjectTokenListed(projectToken)
    isLendingTokenListed(lendingToken)
    onlyRelatedContracts
    nonReentrant
    returns (uint256)
```

Allows a related contract to repay the outstanding loan for a given borrower's project token and lending token.

Requirements:

* The project token must be listed.
* The lending token must be listed.
* Called by a related contract.
* The lending amount must be greater than 0.
* The borrower must have an outstanding loan for the given project and lending token before.

Effects: Updates the interest in the borrower's borrow positions for the given `lendingToken`.

* Repays the specified `lendingTokenAmount` towards the borrower's loan.
* May fully or partially repay the borrow position, depending on the repayment amount and outstanding loan.

Parameters:

| Name               | Type    | Description                                        |
| ------------------ | ------- | -------------------------------------------------- |
| projectToken       | address | The project token's address.                       |
| lendingToken       | address | The lending token's address.                       |
| lendingTokenAmount | uint256 | The amount of lending tokens to repay.             |
| repairer           | address | The address that initiated the repair transaction. |
| borrower           | address | The borrower's address.                            |

Return values:

| Name | Type    | Description                               |
| ---- | ------- | ----------------------------------------- |
| \[0] | uint256 | amount of lending tokens actually repaid. |

### updateInterestInBorrowPositions (0x9a812edd)

```solidity
function updateInterestInBorrowPositions(
    address account,
    address lendingToken
) public
```

This function is called to update the interest in a borrower's borrow position.

Parameters:

| Name         | Type    | Description                   |
| ------------ | ------- | ----------------------------- |
| account      | address | Address of the borrower.      |
| lendingToken | address | Address of the lending token. |

### getTokensUpdateFinalPrices (0xef290120)

```solidity
function getTokensUpdateFinalPrices(
    address projectToken,
    address actualLendingToken,
    bool isBorrow
) public view returns (address[] memory tokens)
```

This function is called when performing operations using token prices, to determine which tokens will need to update their final price.

Parameters:

| Name               | Type    | Description                                                                                            |
| ------------------ | ------- | ------------------------------------------------------------------------------------------------------ |
| projectToken       | address | Address of the project token.                                                                          |
| actualLendingToken | address | Address of the lending token.                                                                          |
| isBorrow           | bool    | Whether getting the list of tokens for updateFinalPrices is related to the borrowing operation or not. |

Return values:

| Name   | Type       | Description                                      |
| ------ | ---------- | ------------------------------------------------ |
| tokens | address\[] | Array of tokens that need to update final price. |

### pit (0x72d456af)

```solidity
function pit(
    address account,
    address projectToken,
    address lendingToken
) public view returns (uint256)
```

Returns the PIT (primary index token) value for a given account and position after a position is opened.

Formula: pit = $ \* LVR of position.

Parameters:

| Name         | Type    | Description                   |
| ------------ | ------- | ----------------------------- |
| account      | address | Address of the account.       |
| projectToken | address | Address of the project token. |
| lendingToken | address | Address of the lending token. |

Return values:

| Name | Type    | Description    |
| ---- | ------- | -------------- |
| \[0] | uint256 | The PIT value. |

### pitCollateral (0x1893be9f)

```solidity
function pitCollateral(
    address account,
    address projectToken
) public view returns (uint256)
```

Returns the PIT (primary index token) value for a given account and collateral before a position is opened.

Formula: pit = $ \* LVR of project token.

Parameters:

| Name         | Type    | Description                   |
| ------------ | ------- | ----------------------------- |
| account      | address | Address of the account.       |
| projectToken | address | Address of the project token. |

Return values:

| Name | Type    | Description    |
| ---- | ------- | -------------- |
| \[0] | uint256 | The PIT value. |

### getLendingToken (0x2ce36230)

```solidity
function getLendingToken(
    address user,
    address projectToken
) public view returns (address actualLendingToken)
```

Returns the actual lending token of a user's borrow position for a specific project token.

Parameters:

| Name         | Type    | Description                                |
| ------------ | ------- | ------------------------------------------ |
| user         | address | The address of the user's borrow position. |
| projectToken | address | The address of the project token.          |

Return values:

| Name               | Type    | Description                              |
| ------------------ | ------- | ---------------------------------------- |
| actualLendingToken | address | The address of the actual lending token. |

### pitRemaining (0xd1a3d2ae)

```solidity
function pitRemaining(
    address account,
    address projectToken,
    address lendingToken
) public view returns (uint256 remaining)
```

Returns the remaining PIT (primary index token) of a user's borrow position.

Parameters:

| Name         | Type    | Description                                |
| ------------ | ------- | ------------------------------------------ |
| account      | address | The address of the user's borrow position. |
| projectToken | address | The address of the project token.          |
| lendingToken | address | The address of the lending token.          |

Return values:

| Name      | Type    | Description                                      |
| --------- | ------- | ------------------------------------------------ |
| remaining | uint256 | The remaining PIT of the user's borrow position. |

### totalOutstanding (0xac15382f)

```solidity
function totalOutstanding(
    address account,
    address projectToken,
    address lendingToken
) public view returns (uint256)
```

Returns the total outstanding amount of a user's borrow position for a specific project token and lending token.

Parameters:

| Name         | Type    | Description                                |
| ------------ | ------- | ------------------------------------------ |
| account      | address | The address of the user's borrow position. |
| projectToken | address | The address of the project token.          |
| lendingToken | address | The address of the lending token.          |

Return values:

| Name | Type    | Description                                             |
| ---- | ------- | ------------------------------------------------------- |
| \[0] | uint256 | total outstanding amount of the user's borrow position. |

### healthFactor (0xcc224bff)

```solidity
function healthFactor(
    address account,
    address projectToken,
    address lendingToken
) public view returns (uint256 numerator, uint256 denominator)
```

Returns the health factor of a user's borrow position for a specific project token and lending token.

Parameters:

| Name         | Type    | Description                                |
| ------------ | ------- | ------------------------------------------ |
| account      | address | The address of the user's borrow position. |
| projectToken | address | The address of the project token.          |
| lendingToken | address | The address of the lending token.          |

Return values:

| Name        | Type    | Description                           |
| ----------- | ------- | ------------------------------------- |
| numerator   | uint256 | The numerator of the health factor.   |
| denominator | uint256 | The denominator of the health factor. |

### getTokenEvaluation (0x3598a7a9)

```solidity
function getTokenEvaluation(
    address token,
    uint256 tokenAmount
) public view returns (uint256 collateralEvaluation, uint256 capitalEvaluation)
```

Returns the price of a specific token amount in USD.

Parameters:

| Name        | Type    | Description                           |
| ----------- | ------- | ------------------------------------- |
| token       | address | The address of the token to evaluate. |
| tokenAmount | uint256 | The amount of the token to evaluate.  |

Return values:

| Name                 | Type    | Description                                                          |
| -------------------- | ------- | -------------------------------------------------------------------- |
| collateralEvaluation | uint256 | the USD evaluation of token by its `tokenAmount` in collateral price |
| capitalEvaluation    | uint256 | the USD evaluation of token by its `tokenAmount` in capital price    |

### lendingTokensLength (0x2412b575)

```solidity
function lendingTokensLength() public view returns (uint256)
```

Returns the length of the lending tokens array.

Return values:

| Name | Type    | Description                             |
| ---- | ------- | --------------------------------------- |
| \[0] | uint256 | The length of the lending tokens array. |

### projectTokensLength (0x4a41d29e)

```solidity
function projectTokensLength() public view returns (uint256)
```

Returns the length of the project tokens array.

Return values:

| Name | Type    | Description                             |
| ---- | ------- | --------------------------------------- |
| \[0] | uint256 | The length of the project tokens array. |

### getPosition (0x713390f5)

```solidity
function getPosition(
    address account,
    address projectToken,
    address lendingToken
)
    public
    view
    returns (
        uint256 depositedProjectTokenAmount,
        uint256 loanBody,
        uint256 accrual,
        uint256 healthFactorNumerator,
        uint256 healthFactorDenominator
    )
```

Returns the details of a user's borrow position for a specific project token and lending token.

Parameters:

| Name         | Type    | Description                                |
| ------------ | ------- | ------------------------------------------ |
| account      | address | The address of the user's borrow position. |
| projectToken | address | The address of the project token.          |
| lendingToken | address | The address of the lending token.          |

Return values:

| Name                        | Type    | Description                                           |
| --------------------------- | ------- | ----------------------------------------------------- |
| depositedProjectTokenAmount | uint256 | The amount of project tokens deposited by the user.   |
| loanBody                    | uint256 | The amount of the lending token borrowed by the user. |
| accrual                     | uint256 | The accrued interest of the borrow position.          |
| healthFactorNumerator       | uint256 | The numerator of the health factor.                   |
| healthFactorDenominator     | uint256 | The denominator of the health factor.                 |

### getDepositedAmount (0x0fefc251)

```solidity
function getDepositedAmount(
    address projectToken,
    address user
) public view returns (uint256)
```

Returns the amount of project tokens deposited by a user for a specific project token and collateral token.

Parameters:

| Name         | Type    | Description                       |
| ------------ | ------- | --------------------------------- |
| projectToken | address | The address of the project token. |
| user         | address | The address of the user.          |

Return values:

| Name | Type    | Description                                     |
| ---- | ------- | ----------------------------------------------- |
| \[0] | uint256 | amount of project tokens deposited by the user. |

### getRelatedContract (0x2060128e)

```solidity
function getRelatedContract(address relatedContract) public view returns (bool)
```

Returns whether an address is a related contract or not.

Parameters:

| Name            | Type    | Description                           |
| --------------- | ------- | ------------------------------------- |
| relatedContract | address | The address of the contract to check. |

Return values:

| Name | Type | Description                                                          |
| ---- | ---- | -------------------------------------------------------------------- |
| \[0] | bool | isRelated Boolean indicating whether the contract is related or not. |

### getTotalBorrowPerCollateral (0x65647a59)

```solidity
function getTotalBorrowPerCollateral(
    address projectToken
) public view returns (uint256)
```

Gets total borrow amount in USD per collateral for a specific project token.

Parameters:

| Name         | Type    | Description                       |
| ------------ | ------- | --------------------------------- |
| projectToken | address | The address of the project token. |

Return values:

| Name | Type    | Description                     |
| ---- | ------- | ------------------------------- |
| \[0] | uint256 | The total borrow amount in USD. |

### getTotalBorrowPerLendingToken (0x961540e1)

```solidity
function getTotalBorrowPerLendingToken(
    address lendingToken
) public view returns (uint256 amountInUSD)
```

Gets total borrow amount in USD for a specific lending token.

Parameters:

| Name         | Type    | Description                       |
| ------------ | ------- | --------------------------------- |
| lendingToken | address | The address of the lending token. |

Return values:

| Name        | Type    | Description                     |
| ----------- | ------- | ------------------------------- |
| amountInUSD | uint256 | The total borrow amount in USD. |

### totalOutstandingInUSD (0xb189b70a)

```solidity
function totalOutstandingInUSD(
    address account,
    address projectToken,
    address lendingToken
) public view returns (uint256 amountInUSD)
```

Converts the total outstanding amount of a user's borrow position to USD.

Parameters:

| Name         | Type    | Description                       |
| ------------ | ------- | --------------------------------- |
| account      | address | The address of the user account.  |
| projectToken | address | The address of the project token. |
| lendingToken | address | The address of the lending token. |

Return values:

| Name        | Type    | Description                          |
| ----------- | ------- | ------------------------------------ |
| amountInUSD | uint256 | The total outstanding amount in USD. |

### getLoanToValueRatio (0xe84dc1b3)

```solidity
function getLoanToValueRatio(
    address projectToken,
    address lendingToken
) public view returns (uint256 lvrNumerator, uint256 lvrDenominator)
```

Gets the loan to value ratio of a position made by a project token and a lending token.

Parameters:

| Name         | Type    | Description                       |
| ------------ | ------- | --------------------------------- |
| projectToken | address | The address of the project token. |
| lendingToken | address | The address of the lending token. |

Return values:

| Name           | Type    | Description                                 |
| -------------- | ------- | ------------------------------------------- |
| lvrNumerator   | uint256 | The numerator of the loan to value ratio.   |
| lvrDenominator | uint256 | The denominator of the loan to value ratio. |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.fringe.fi/v2-smart-contract-documentation/primarylendingplatform/primarylendingplatformv2core.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
