# PositionMigrator

해당 컨트랙트는 V3 포지션을 마이그레이션합니다. 이 컨트랙트는 포지션에 예치된 자산을 예치하고 새로운 포지션에 예치하는 데 도움이 됩니다.

## Code

Github Link: (Will be updated after official launch)<br>

## Address

* Cypress : [0xb43879a835FD2097515b7B5C6c549929F1666bFc](https://scope.klaytn.com/account/0xb43879a835FD2097515b7B5C6c549929F1666bFc?tabId=internalTx)

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Events" %}

## Events

**MigratePosition**

```solidity
event MigratePosition(
    address user, 
    address token0, 
    address token1, 
    uint24 fee, 
    uint256 burnId, 
    uint256 mintId
)
```

**Parameters:**

<table><thead><tr><th width="134.66666666666666">Name</th><th width="128">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>user</code></td><td>address</td><td>user 주소</td></tr><tr><td><code>token0</code></td><td>address</td><td>token0 주소</td></tr><tr><td><code>token1</code></td><td>address</td><td>token1 주소</td></tr><tr><td><code>fee</code></td><td>uint24</td><td>fee </td></tr><tr><td><code>burnId</code></td><td>uint256</td><td>migrate 한 포지션의 tokenId</td></tr><tr><td><code>mintId</code></td><td>uint256</td><td>새로 발급된 포지션의 tokenId</td></tr></tbody></table>

**Zap**

```solidity
event Zap(
    address user, 
    address token0, 
    address token1, 
    uint24 fee, 
    uint256 amount, 
    bool zeroForOne, 
    uint256 tokenId
)
```

**Parameters:**

<table><thead><tr><th width="160.66666666666666">Name</th><th width="115">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>user</code></td><td>address</td><td>user 주소</td></tr><tr><td><code>token0</code></td><td>address</td><td>token0 주소</td></tr><tr><td><code>token1</code></td><td>address</td><td>token1 주소</td></tr><tr><td><code>fee</code></td><td>uint24</td><td>fee </td></tr><tr><td><code>amount</code></td><td>uint256</td><td>예치할 amount</td></tr><tr><td><code>zeroForOne</code></td><td>bool</td><td>token0으로 예치시  : <code>true</code><br>token1으로 예치시   : <code>false</code></td></tr><tr><td><code>tokenId</code></td><td>uint256</td><td>새로 발급된 포지션의 tokenId</td></tr></tbody></table>

1
{% endtab %}

{% tab title="Parameter Structs" %}

## Parameter Struct

**MigrationParams**

```solidity
struct MigrationParams {
    uint256 tokenId;
    // Burn
    uint256 burnAmount0Min;
    uint256 burnAmount1Min;
    // Swap
    address tokenIn;
    uint256 swapAmountIn;
    uint256 swapAmountOutMin;
    // Mint
    int24 tickLower;
    int24 tickUpper;
    uint256 mintAmount0Min;
    uint256 mintAmount1Min;
    uint256 deadline;
    bool compoundFee;
}
```

**Parameters:**

<table><thead><tr><th width="211.66666666666666">Name</th><th width="103">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>tokenId</code></td><td>uint256</td><td>Migrate 할tokenId</td></tr><tr><td><code>burnAmount0Min</code></td><td>uint256</td><td>인출시 받게될 token0의 최소값</td></tr><tr><td><code>burnAmount1Min</code></td><td>uint256</td><td>인출시 받게될 token0의 최소값</td></tr><tr><td><code>tokenIn</code></td><td>address</td><td>교환할 token의 주소</td></tr><tr><td><code>swapAmountIn</code></td><td>uint256</td><td>교환할 token amount</td></tr><tr><td><code>swapAmountOutMin</code></td><td>uint256</td><td>교환으로 받게될 token의 최소값</td></tr><tr><td><code>tickLower</code></td><td>int24</td><td>새로 예치할 포지션의 최소 tick</td></tr><tr><td><code>tickUpper</code></td><td>int24</td><td>새로 예치할 포지션의 최대 tick</td></tr><tr><td><code>mintAmount0Min</code></td><td>uint256</td><td>새로 예치할 포지션에서 예치될 token0 최소값</td></tr><tr><td><code>mintAmount1Min</code></td><td>uint256</td><td>새로 예치할 포지션에서 예치될 token1 최소값</td></tr><tr><td><code>deadline</code></td><td>uint256</td><td>deadline</td></tr><tr><td><code>compoundFee</code></td><td>bool</td><td>fee를 누적하여 예치할 지 여부</td></tr></tbody></table>

**ZappingParams**

```solidity
struct ZappingParams {
    contract IUniswapV3Pool pool;
    uint256 amount;
    int24 tickLower;
    int24 tickUpper;
    bool zeroForOne;
    uint256 mintAmount0Min;
    uint256 mintAmount1Min;
    uint256 tokenId;    
    uint256 deadline;
}
```

**Parameters:**

<table><thead><tr><th width="211.66666666666666">Name</th><th width="135">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>pool</code></td><td><code>contract IUniswapV3Pool</code></td><td>예치할 pool 주소</td></tr><tr><td><code>amount</code></td><td>uint256</td><td>예치할 token amount</td></tr><tr><td><code>tickLower</code></td><td>int24</td><td>새로 예치할 포지션의 최소 tick</td></tr><tr><td><code>tickUpper</code></td><td>int24</td><td>새로 예치할 포지션의 최대 tick</td></tr><tr><td><code>zeroForOne</code></td><td>bool</td><td>예치할 token이 token0인지 여부</td></tr><tr><td><code>mintAmount0Min</code></td><td>uint256</td><td>예치할 포지션에서 예치될 token0 최소값</td></tr><tr><td><code>mintAmount1Min</code></td><td>uint256</td><td>예치할 포지션에서 예치될 token1 최소값</td></tr><tr><td><code>tokenId</code></td><td>uint256</td><td>Zap 으로 예치할 tokenId<br>첫 예치시 '0'</td></tr><tr><td><code>deadline</code></td><td>uint256</td><td>deadline</td></tr></tbody></table>
{% endtab %}

{% tab title="State-Changing Functions" %}

## **State-Changing Functions**

**migrate**

```solidity
function migrate(
    struct MigrationParams calldata params
) external
```

포지션에 예치된 자산을 예치하고 새로운 포지션에 예치합니다.

**zapWithETH**

```solidity
function zapWithETH(
    struct ZappingParams memory params
) external
```

ETH로 풀에 입금할 수 있도록 도와주는 기능

**zapWithToken**

```solidity
function zapWithToken(
    struct ZappingParams memory params
) external 
```

하나의 자산 토큰으로 풀에 입금할 수 있도록 도와주는 기능
{% endtab %}
{% endtabs %}
