# PrimaryLendingPlatformLeverageZksync

## Overview

#### License: MIT

```solidity
contract PrimaryLendingPlatformLeverageZksync is PrimaryLendingPlatformLeverageCore
```

The PrimaryLendingPlatformLeverageZksync contract is the contract that allows users to open leveraged positions for zksync network.

Contract that allows users to open leveraged positions using the OpenOcean exchange aggregator. Inherit from PrimaryLendingPlatformLeverageCore.

## Functions info

### leveragedBorrow (0x40b5aa8d)

```solidity
function leveragedBorrow(
    Asset.Info memory prjInfo,
    Asset.Info memory lendingInfo,
    uint256 notionalExposure,
    uint256 marginCollateralAmount,
    bytes[] memory buyCalldata,
    uint8 leverageType,
    bytes32[] memory priceIds,
    bytes[] calldata updateData
) external payable nonReentrant
```

The function to be called when a user wants to leverage their position.

Executes a leveraged borrow for the borrower on the specified projectToken using the given lendingToken and update related token's prices.

Requirements:

* The project token is listed on the platform.
* The lending token is listed on the platform.
* Notional exposure must be greater than 0.
* The lending token must be the same as the current lending token or the current lending token must be address(0).
* The user must have a valid position for the given project token and lending token.

Effects:

* Update price of related tokens.
* Calculates the required `lendingTokenCount` based on `notionalExposure`.
* Performs a naked borrow using `_nakedBorrow` function.
* Approves the transfer of `lendingToken` to the system.
* Buys tokens on an exchange aggregator using `_buyOnExchangeAggregator` function.
* Collateralizes the loan with the received tokens using `_collateralizeLoan` function.
* Defers liquidity check using `_deferLiquidityCheck` function.
* Sets the leveraged position flag and type for the borrower.

Parameters:

| Name                   | Type              | Description                                                            |
| ---------------------- | ----------------- | ---------------------------------------------------------------------- |
| prjInfo                | struct Asset.Info | Information about the project token, including its address and type.   |
| lendingInfo            | struct Asset.Info | Information about the lending token, including its address and type.   |
| notionalExposure       | uint256           | The desired notional exposure for the leverage position.               |
| marginCollateralAmount | uint256           | The amount of collateral to be added to the position as margin.        |
| buyCalldata            | bytes\[]          | The calldata for buying the project token on the exchange aggregator.  |
| leverageType           | uint8             | The type of leverage position.                                         |
| priceIds               | bytes32\[]        | An array of bytes32 price identifiers to update.                       |
| updateData             | bytes\[]          | An array of bytes update data for the corresponding price identifiers. |

### leveragedBorrowFromRelatedContract (0xb21cacd5)

```solidity
function leveragedBorrowFromRelatedContract(
    Asset.Info memory prjInfo,
    Asset.Info memory lendingInfo,
    uint256 notionalExposure,
    uint256 marginCollateralAmount,
    bytes[] memory buyCalldata,
    address borrower,
    uint8 leverageType,
    bytes32[] memory priceIds,
    bytes[] calldata updateData
) external payable nonReentrant onlyRelatedContracts
```

Allows a related contract to borrow funds on behalf of a user to enter a leveraged position and update related token's prices.

Requirements:

* Caller must be a related contract.
* The project token is listed on the platform.
* The lending token is listed on the platform.
* Notional exposure must be greater than 0.
* The lending token must be the same as the current lending token or the current lending token must be address(0).
* The user must have a valid position for the given project token and lending token.

Effects:

* Update price of related tokens.
* Calculates the required `lendingTokenCount` based on `notionalExposure`.
* Performs a naked borrow using `_nakedBorrow` function.
* Approves the transfer of `lendingToken` to the system.
* Buys tokens on an exchange aggregator using `_buyOnExchangeAggregator` function.
* Collateralizes the loan with the received tokens using `_collateralizeLoan` function.
* Defers liquidity check using `_deferLiquidityCheck` function.
* Sets the leveraged position flag and type for the borrower.

Parameters:

| Name                   | Type              | Description                                                            |
| ---------------------- | ----------------- | ---------------------------------------------------------------------- |
| prjInfo                | struct Asset.Info | Information about the project token, including its address and type.   |
| lendingInfo            | struct Asset.Info | Information about the lending token, including its address and type.   |
| notionalExposure       | uint256           | The notional exposure of the user's investment.                        |
| marginCollateralAmount | uint256           | The amount of collateral to be deposited by the user.                  |
| buyCalldata            | bytes\[]          | The calldata used for buying the project token on the DEX.             |
| borrower               | address           | The address of the user for whom the funds are being borrowed.         |
| leverageType           | uint8             | The type of leverage position.                                         |
| priceIds               | bytes32\[]        | An array of bytes32 price identifiers to update.                       |
| updateData             | bytes\[]          | An array of bytes update data for the corresponding price identifiers. |

### calculateLendingTokenCountWithUpdatePrices (0xff7e86fa)

```solidity
function calculateLendingTokenCountWithUpdatePrices(
    address _lendingToken,
    uint256 notionalValue,
    bytes32[] memory priceIds,
    bytes[] calldata updateData
) external payable returns (uint256 lendingTokenCount)
```

Calculates the lending token count for a given notional value after updating related token's prices.

Parameters:

| Name           | Type       | Description                                                               |
| -------------- | ---------- | ------------------------------------------------------------------------- |
| \_lendingToken | address    | The address of the lending token.                                         |
| notionalValue  | uint256    | The notional value for which the lending token count is to be calculated. |
| priceIds       | bytes32\[] | An array of bytes32 price identifiers to update.                          |
| updateData     | bytes\[]   | An array of bytes update data for the corresponding price identifiers.    |

Return values:

| Name              | Type    | Description                         |
| ----------------- | ------- | ----------------------------------- |
| lendingTokenCount | uint256 | The calculated lending token count. |


---

# 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/zksync/primarylendingplatformleveragezksync.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.
