# PtHandler

[Git Source](https://github.com/Ion-Protocol/ion-protocol/blob/88cc595825f1dc2eb738fb93e172a3e8ab7a5c43/src/flash/PtHandler.sol)

**Inherits:** IonHandlerBase, IPMarketSwapCallback

This contract allows for easy creation of leverage positions for PT collateralized Ion markets.

### [State Variables](https://docs.ionprotocol.io/devs/smart-contract-architecture/flash/broken-reference) <a href="#state-variables" id="state-variables"></a>

#### [MARKET](https://docs.ionprotocol.io/devs/smart-contract-architecture/flash/broken-reference) <a href="#market" id="market"></a>

```
IPMarketV3 public immutable MARKET;
```

#### [SY](https://docs.ionprotocol.io/devs/smart-contract-architecture/flash/broken-reference) <a href="#sy" id="sy"></a>

```
IStandardizedYield public immutable SY;
```

#### [PT](https://docs.ionprotocol.io/devs/smart-contract-architecture/flash/broken-reference) <a href="#pt" id="pt"></a>

```
IERC20 public immutable PT;
```

#### [YT](https://docs.ionprotocol.io/devs/smart-contract-architecture/flash/broken-reference) <a href="#yt" id="yt"></a>

```
IERC20 public immutable YT;
```

#### [flashswapInitiated](https://docs.ionprotocol.io/devs/smart-contract-architecture/flash/broken-reference) <a href="#flashswapinitiated" id="flashswapinitiated"></a>

```
uint256 private flashswapInitiated = 1;
```

### [Functions](https://docs.ionprotocol.io/devs/smart-contract-architecture/flash/broken-reference) <a href="#functions" id="functions"></a>

#### [constructor](https://docs.ionprotocol.io/devs/smart-contract-architecture/flash/broken-reference) <a href="#constructor" id="constructor"></a>

Creates a new `PtHandler` instance

```
constructor(
    IonPool pool,
    GemJoin join,
    Whitelist whitelist,
    IPMarketV3 _market
)
    IonHandlerBase(0, pool, join, whitelist);
```

**Parameters**

| Name        | Type         | Description                |
| ----------- | ------------ | -------------------------- |
| `pool`      | `IonPool`    | The related IonPool.       |
| `join`      | `GemJoin`    | The related GemJoin.       |
| `whitelist` | `Whitelist`  | The whitelist contract.    |
| `_market`   | `IPMarketV3` | The related Pendle market. |

#### [ptLeverage](https://docs.ionprotocol.io/devs/smart-contract-architecture/flash/broken-reference) <a href="#ptleverage" id="ptleverage"></a>

Allows a borrower to create a leveraged position on Ion Protocol

*Transfer PT from user -> Flashswap PT token -> Deposit all PT into IonPool -> Borrow base asset -> Mint SY using base asset -> Repay Flashswap with SY.*

```
function ptLeverage(
    uint256 initialDeposit,
    uint256 resultingAdditionalCollateral,
    uint256 maxResultingDebt,
    uint256 deadline,
    bytes32[] calldata proof
)
    external
    onlyWhitelistedBorrowers(proof)
    checkDeadline(deadline);
```

#### [swapCallback](https://docs.ionprotocol.io/devs/smart-contract-architecture/flash/broken-reference) <a href="#swapcallback" id="swapcallback"></a>

This function should never be called directly.

*On small enough swaps, the SY to send back can be 0. This function can only be called by the market. This function can only be called by market if the swap was initiated by this contract.*

```
function swapCallback(int256 ptToAccount, int256 syToAccount, bytes calldata data) external;
```

**Parameters**

| Name          | Type     | Description                                                                                                           |
| ------------- | -------- | --------------------------------------------------------------------------------------------------------------------- |
| `ptToAccount` | `int256` | Amount of PT sent from the perspective of the pool (negative means pool is sending, positive means user is receiving) |
| `syToAccount` | `int256` | Amount of SY sent from the perspective of the pool (negative means pool is sending, positive means user is receiving) |
| `data`        | `bytes`  | Arbitrary data passed by the market                                                                                   |

### [Errors](https://docs.ionprotocol.io/devs/smart-contract-architecture/flash/broken-reference) <a href="#errors" id="errors"></a>

#### [InvalidGemJoin](https://docs.ionprotocol.io/devs/smart-contract-architecture/flash/broken-reference) <a href="#invalidgemjoin" id="invalidgemjoin"></a>

```
error InvalidGemJoin(address invalidJoin);
```

#### [MarketMustBeCaller](https://docs.ionprotocol.io/devs/smart-contract-architecture/flash/broken-reference) <a href="#marketmustbecaller" id="marketmustbecaller"></a>

```
error MarketMustBeCaller(address caller);
```

#### [ExternalFlashswapNotAllowed](https://docs.ionprotocol.io/devs/smart-contract-architecture/flash/broken-reference) <a href="#externalflashswapnotallowed" id="externalflashswapnotallowed"></a>

```
error ExternalFlashswapNotAllowed();
```

#### [InvalidSwapDirection](https://docs.ionprotocol.io/devs/smart-contract-architecture/flash/broken-reference) <a href="#invalidswapdirection" id="invalidswapdirection"></a>

```
error InvalidSwapDirection();
```

#### [UnexpectedSyOut](https://docs.ionprotocol.io/devs/smart-contract-architecture/flash/broken-reference) <a href="#unexpectedsyout" id="unexpectedsyout"></a>

```
error UnexpectedSyOut(uint256 amountSyOut, uint256 expectedSyOut);
```

#### [FlashswapTooExpensive](https://docs.ionprotocol.io/devs/smart-contract-architecture/flash/broken-reference) <a href="#flashswaptooexpensive" id="flashswaptooexpensive"></a>

```
error FlashswapTooExpensive(uint256 amountSyIn, uint256 maxResultingDebt);
```
