# BaseStrategy

## Overview

The BaseStrategy is the foundational abstract contract that all MaxApy strategies inherit from. Adapted from Yearn's v2 BaseStrategy, it defines core functionality and interfaces that strategies must implement for interacting with the MaxApy vault and external protocols.

## Constants

```solidity
uint256 public constant ADMIN_ROLE = _ROLE_0;             // Admin role identifier
uint256 public constant EMERGENCY_ADMIN_ROLE = _ROLE_1;   // Emergency admin role identifier
uint256 public constant VAULT_ROLE = _ROLE_2;             // Vault role identifier
uint256 public constant KEEPER_ROLE = _ROLE_3;            // Keeper role identifier
uint256 public constant MAX_BPS = 10_000;                 // Maximum basis points (100%)
```

## Events

```solidity
event Harvested(uint256 profit, uint256 loss, uint256 debtPayment, uint256 debtOutstanding);
event StrategyEmergencyExitUpdated(address indexed strategy, uint256 emergencyExitStatus);
event StrategistUpdated(address indexed strategy, address newStrategist);
event StrategyAutopilotUpdated(address indexed strategy, bool autoPilotStatus);
```

## State Variables

```solidity
IMaxApyVault public vault;                  // Associated MaxApy vault
address public underlyingAsset;             // Strategy's underlying asset
uint256 public emergencyExit;               // Emergency shutdown state
bytes32 public strategyName;                // Strategy identifier
address public strategist;                  // Strategy manager address
uint256 public lastEstimatedTotalAssets;    // Last recorded total assets
uint256[20] private __gap;                  // Upgradeability gap
```

## Functions

### Initialization Functions

### \_\_BaseStrategy\_init

```solidity
function __BaseStrategy_init(
    IMaxApyVault _vault,
    address[] calldata _keepers,
    bytes32 _strategyName,
    address _strategist
) internal virtual
```

Initializes the strategy with necessary components.

Parameters:

* `_vault`: MaxApy vault address
* `_keepers`: Array of keeper addresses
* `_strategyName`: Strategy identifier
* `_strategist`: Strategist address

### Core Functions

### liquidate

```solidity
function liquidate(uint256 amountNeeded) external virtual returns (uint256 loss)
```

Withdraws assets up to requested amount.

Parameters:

* `amountNeeded`: Amount of assets to withdraw

Returns:

* Amount of loss incurred

### liquidateExact

```solidity
function liquidateExact(uint256 amountNeeded) external virtual returns (uint256 loss)
```

Withdraws exact amount of assets.

Parameters:

* `amountNeeded`: Exact amount of assets to withdraw

Returns:

* Amount of loss incurred to achieve exact withdrawal

### harvest

```solidity
function harvest(
    uint256 minExpectedBalance,
    uint256 minOutputAfterInvestment,
    address harvester,
    uint256 deadline
) external
```

Harvests gains and reinvests.

Parameters:

* `minExpectedBalance`: Minimum balance expected after operations
* `minOutputAfterInvestment`: Minimum expected output from reinvestment
* `harvester`: Address to receive management fees
* `deadline`: Transaction deadline

### Configuration Functions

### setEmergencyExit

```solidity
function setEmergencyExit(uint256 _emergencyExit) external
```

Sets emergency exit mode.

Parameters:

* `_emergencyExit`: Exit mode state (1=inactive, 2=active)

### setStrategist

```solidity
function setStrategist(address _newStrategist) external
```

Updates strategist address.

Parameters:

* `_newStrategist`: New strategist address

### setAutopilot

```solidity
function setAutopilot(bool _autoPilot) external
```

Enables/disables automated harvesting.

Parameters:

* `_autoPilot`: Autopilot state

### View Functions

### estimatedTotalAssets

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

Returns total assets under management.

Returns:

* Current total assets value

### isActive

```solidity
function isActive() public view returns (bool)
```

Checks if strategy is actively managing positions.

Returns:

* True if strategy is active

### unharvestedAmount

```solidity
function unharvestedAmount() external view virtual returns (int256)
```

Calculates unrealized gains/losses since last harvest.

Returns:

* Net unrealized profit/loss

### previewLiquidate

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

Simulates withdrawal including losses.

Parameters:

* `requestedAmount`: Amount to withdraw

Returns:

* Expected output amount

### Required Virtual Functions

These functions must be implemented by inheriting strategies:

```solidity
function _adjustPosition(uint256 debtOutstanding, uint256 minOutputAfterInvestment) internal virtual;
function _liquidatePosition(uint256 amountNeeded) internal virtual returns (uint256 liquidatedAmount, uint256 loss);
function _liquidateAllPositions() internal virtual returns (uint256 amountFreed);
function _prepareReturn(uint256 debtOutstanding, uint256 minExpectedBalance) internal virtual returns (uint256 unrealizedProfit, uint256 loss, uint256 debtPayment);
function _estimatedTotalAssets() internal view virtual returns (uint256);
function previewLiquidate(uint256 requestedAmount) public view virtual returns (uint256);
function previewLiquidateExact(uint256 liquidatedAmount) public view virtual returns (uint256);
function maxLiquidate() public view virtual returns (uint256);
function maxLiquidateExact() public view virtual returns (uint256);
```


---

# 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/basestrategy.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.
