Skip to main content
The AerodromeLPStrategy provides liquidity to an Aerodrome pool on Base and optionally stakes the LP tokens in a gauge to earn AERO rewards. On settlement, it unstakes, claims rewards, removes liquidity, and pushes all tokens back to the vault.

Architecture

Stable vs Volatile Pools

Stable Pool

For correlated assets (e.g., USDC/USDbC). Uses the stable = true flag. Lower fees, tighter curve.

Volatile Pool

For uncorrelated assets (e.g., USDC/WETH). Uses stable = false. Standard AMM curve.

Lifecycle

Pending → execute() → Executed → settle() → Settled
PhaseWhat happensWho calls
ExecutePull tokenA + tokenB → addLiquidity → stake LP in gaugeGovernor (proposal execution)
ExecutedLP earns trading fees; gauge earns AERO rewards
SettleUnstake LP → claim AERO → removeLiquidity → push all to vaultGovernor (proposal settlement)
Any dust (unused tokens from addLiquidity) is returned to the vault immediately during execution.

Batch Calls

Execute

[tokenA.approve(strategy, amountA), tokenB.approve(strategy, amountB), strategy.execute()]

Settle

[strategy.settle()]
Settlement pushes three types of tokens to the vault: tokenA, tokenB (from removed liquidity), and AERO (gauge rewards).

Gauge Staking

Gauge staking is optional. Pass --gauge <address> to enable it.
  • If a gauge is set, the strategy stakes all LP tokens after adding liquidity
  • On settlement, LP is withdrawn from the gauge and AERO rewards are claimed
  • The gauge’s stakingToken must match the lpToken address (validated at initialization)
  • If no gauge is set, LP tokens sit in the strategy clone (earning trading fees only)

InitParams

struct InitParams {
    address tokenA;         // First token in the pair
    address tokenB;         // Second token in the pair
    bool stable;            // true = stable pool, false = volatile
    address factory;        // Aerodrome pool factory
    address router;         // Aerodrome Router
    address gauge;          // Gauge address (address(0) to skip staking)
    address lpToken;        // Pool LP token address
    uint256 amountADesired; // tokenA to provide
    uint256 amountBDesired; // tokenB to provide
    uint256 amountAMin;     // Min tokenA on addLiquidity (slippage)
    uint256 amountBMin;     // Min tokenB on addLiquidity (slippage)
    uint256 minAmountAOut;  // Min tokenA on removeLiquidity (slippage)
    uint256 minAmountBOut;  // Min tokenB on removeLiquidity (slippage)
}

CLI Usage

sherwood strategy propose aerodrome-lp \
  --vault 0x... \
  --token-a 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 \
  --token-b 0x4200000000000000000000000000000000000006 \
  --amount-a 500 --amount-b 0.2 \
  --gauge 0x... --lp-token 0x... \
  --min-a-out 490 --min-b-out 0.19 \
  --name "USDC/WETH Aerodrome LP" \
  --performance-fee 1000 --duration 14d
FlagDescriptionDefault
--token-a <address>Token A addressrequired
--token-b <address>Token B addressrequired
--amount-a <n>Token A amountrequired
--amount-b <n>Token B amountrequired
--stableStable pool (correlated assets)false
--gauge <address>Gauge for AERO rewardsnone
--lp-token <address>LP token addressrequired
--min-a-out <n>Min token A on settle0
--min-b-out <n>Min token B on settle0

Tunable Parameters

While in Executed state, the proposer can update settlement slippage:
ParameterDescription
minAmountAOutMinimum tokenA on removeLiquidity
minAmountBOutMinimum tokenB on removeLiquidity
strategy.updateParams(abi.encode(newMinAmountAOut, newMinAmountBOut));
// Pass 0 to keep current value

Allowlist Targets

Targets are pool-specific — gauge and LP token addresses vary per pool.
sherwood vault add-target --target 0xcF77a3Ba9A5CA399B7c97c74d54e5b1Beb874E43  # Aerodrome Router
sherwood vault add-target --target 0x940181a94A35A4569E4529A3CDfB74e38FD98631  # AERO Token
sherwood vault add-target --target <token-a-address>                             # Token A
sherwood vault add-target --target <token-b-address>                             # Token B
sherwood vault add-target --target <gauge-address>                               # Pool gauge
sherwood vault add-target --target <lp-token-address>                            # Pool LP token
sherwood vault add-target --target <strategy-clone-address>                      # Your strategy clone

Addresses (Base Mainnet)

ContractAddress
AerodromeLPStrategy template0x1c61c740702690B86b874ab929A6F04A4Ec56C1c
Aerodrome Router0xcF77a3Ba9A5CA399B7c97c74d54e5b1Beb874E43
Aerodrome Default Factory0x420DD381b31aEf6683db6B902084cB0FFECe40Da
AERO Token0x940181a94A35A4569E4529A3CDfB74e38FD98631
If the vault only holds one asset (e.g., USDC), the agent should add a swap call before the strategy in the execute batch to acquire the second token.