# Deleveraging

#### Understanding Deleveraging

Deleveraging is the process of reducing your position's leverage by withdrawing collateral and repaying debt. This can be done in two ways:

1. **Partial deleveraging:** Reduce leverage while maintaining an active position.
2. **Full deleveraging:** Completely unwind the position by repaying all debt.

#### Preparing for Deleveraging

Before deleveraging, you need to:

1. **Understand your current position:** Review your collateral amount, debt amount, and health factor.
2. S**et an appropriate slippage tolerance:** Typically 0.5-2% depending on asset volatility.
3. **Calculate the optimal deleveraging amounts:** Determine how much collateral to withdraw and debt to repay.

#### Constructing the DeleverageAction struct

Deleveraging requires constructing a DeleverageAction struct that specifies how to unwind your position:

```javascript
// Define how much collateral to withdraw
const collateralAmount = ethers.utils.parseUnits('300', 18);
const repayAmount = ethers.utils.parseUnits('200', 18); // Amount of debt to repay

// Create swap data to convert collateral to borrow asset
// Note: This is an array of swaps, allowing for multi-hop routes
const swapData = [{
  target: '0x1111111254EEB25477B68fb85Ed929f73A960582', // 1inch router
  inputToken: underlyingAsset,
  outputToken: borrowUnderlying,
  inputAmount: ethers.utils.parseUnits('250', 18), // Amount needed to convert to repay debt
  call: '0x...', // Encoded swap call data
}];

// Construct deleverage struct
const deleverageAction = {
  cToken: COLLATERAL_CTOKEN,
  collateralAssets: collateralAmount,
  borrowedToken: BORROWED_CTOKEN,
  swapData: swapData,
  repayAmount: repayAmount,
  auxData: '0x' // Optional for specialized protocols
};
```

#### Executing the Deleverage Operation

With the DeleverageAction struct prepared, execute the deleverage operation:

```javascript
// Set slippage tolerance (1%)
const slippage = ethers.utils.parseUnits('0.01', 18);

// Execute the deleverage transaction
const tx = await positionManagement.deleverage(
  deleverageData, 
  slippage,
  2000000
);

const receipt = await tx.wait();
console.log(`Position deleveraged! Tx hash: ${receipt.transactionHash}`);
```

### Important Considerations

1. **Swap Data Configuration:**
   1. The `swapData` array can contain multiple swaps for complex routes.
   2. Each swap must specify the correct input/output tokens and amounts.
   3. Slippage tolerance should be set appropriately for each swap.
2. **Amount Calculations:**
   1. `collateralAmount`: The amount of position tokens to withdraw.
   2. `repayAmount`: The amount of debt to repay in the borrowed asset.
   3. Ensure these amounts are properly calculated to maintain desired position size.
3. **Protocol-Specific Features:**
   1. Some protocols may require additional data in the `auxData` field.
   2. Check protocol documentation for specific requirements.
   3. Consider using protocol-specific optimizations when available.
