# BaseHopStrategy

## Overview

The BaseHopStrategy contract serves as the foundation for strategies that interact with Hop Protocol in the MaxAPY ecosystem. It handles deposits into Hop pools, managing LP positions, and executing withdrawals for cross-chain liquidity provision.

## Errors

```solidity
error NotEnoughFundsToInvest();            // Insufficient funds for investment
error InvalidZeroAddress();                 // Zero address provided
```

## Events

```solidity
event Invested(address indexed strategy, uint256 amountInvested);
event Divested(address indexed strategy, uint256 requestedShares, uint256 amountDivested);
event MinSingleTradeUpdated(uint256 minSingleTrade);
event MaxSingleTradeUpdated(uint256 maxSingleTrade);
```

## State Variables

```solidity
ISwap public hopPool;                // Hop exchange pool contract
ERC20Burnable public hopLPToken;     // Hop LP token contract
uint256 public maxSingleTrade;       // Maximum size for a single trade
uint256 public minSingleTrade;       // Minimum size for a single trade
```

## Functions

### Initialization Functions

### initialize

```solidity
function initialize(
    IMaxApyVault _vault,
    address[] calldata _keepers,
    bytes32 _strategyName,
    address _strategist,
    ISwap _hopPool,
    ERC20Burnable _hopLPToken
) public virtual initializer
```

Initializes the strategy with Hop Protocol components.

Parameters:

* `_vault`: MaxApy vault address
* `_keepers`: Array of keeper addresses
* `_strategyName`: Name of the strategy
* `_strategist`: Strategist address
* `_hopPool`: Hop exchange pool address
* `_hopLPToken`: Hop LP token address

### Configuration Functions

### setMinSingleTrade

```solidity
function setMinSingleTrade(uint256 _minSingleTrade) external
```

Sets minimum trade size for the strategy.

Parameters:

* `_minSingleTrade`: New minimum trade size

### setMaxSingleTrade

```solidity
function setMaxSingleTrade(uint256 _maxSingleTrade) external
```

Sets maximum trade size for the strategy.

Parameters:

* `_maxSingleTrade`: New maximum trade size

### View Functions

### previewLiquidate

```solidity
function previewLiquidate(uint256 requestedAmount) public view returns (uint256)
```

Calculates expected output for a withdrawal.

Parameters:

* `requestedAmount`: Amount requested to withdraw

Returns:

* Expected liquidated amount

### previewLiquidateExact

```solidity
function previewLiquidateExact(uint256 liquidatedAmount) public view returns (uint256)
```

Calculates input needed for desired withdrawal amount.

Parameters:

* `liquidatedAmount`: Desired output amount

Returns:

* Required input amount

### maxLiquidate

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

Returns maximum amount that can be withdrawn after losses.

Returns:

* Maximum withdrawable amount

### maxLiquidateExact

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

Returns maximum amount that can be withdrawn before losses.

Returns:

* Maximum withdrawable amount before losses

### Core Internal Functions

### \_prepareReturn

```solidity
function _prepareReturn(
    uint256 debtOutstanding,
    uint256 minExpectedBalance
) internal returns (uint256 unrealizedProfit, uint256 loss, uint256 debtPayment)
```

Prepares strategy returns and handles profits/losses.

Parameters:

* `debtOutstanding`: Outstanding debt amount
* `minExpectedBalance`: Minimum expected balance after operations

Returns:

* `unrealizedProfit`: Unrealized profit amount
* `loss`: Loss amount
* `debtPayment`: Debt payment amount

### \_adjustPosition

```solidity
function _adjustPosition(uint256, uint256 minOutputAfterInvestment) internal virtual
```

Adjusts strategy position with available capital.

Parameters:

* `minOutputAfterInvestment`: Minimum expected output after investment

### \_invest

```solidity
function _invest(uint256 amount, uint256 minOutputAfterInvestment) internal virtual returns (uint256)
```

Adds liquidity to Hop pool.

Parameters:

* `amount`: Amount to invest
* `minOutputAfterInvestment`: Minimum expected LP tokens

Returns:

* Amount of LP tokens received

### \_divest

```solidity
function _divest(uint256 shares) internal virtual returns (uint256)
```

Removes liquidity from Hop pool.

Parameters:

* `shares`: Amount of LP tokens to withdraw

Returns:

* Amount of underlying assets received

### Internal View Functions

### \_shareValue

```solidity
function _shareValue(uint256 shares) internal view virtual returns (uint256)
```

Calculates underlying value of LP tokens.

Parameters:

* `shares`: Amount of LP tokens

Returns:

* Underlying asset value

### \_sharesForAmount

```solidity
function _sharesForAmount(uint256 amount) internal view virtual returns (uint256)
```

Calculates LP tokens needed for given amount.

Parameters:

* `amount`: Amount of underlying assets

Returns:

* Required LP tokens

### \_shareBalance

```solidity
function _shareBalance() internal view returns (uint256)
```

Returns strategy's Hop LP token balance.

Returns:

* Current LP token balance

### \_estimatedTotalAssets

```solidity
function _estimatedTotalAssets() internal view returns (uint256)
```

Calculates total assets under management.

Returns:

* Total assets value


---

# 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://devs.maxapy.io/maxapy-erc4626/base-strategies/basehopstrategy.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.
