Skip to content

Conversation

@Pranav2456
Copy link

@Pranav2456 Pranav2456 commented Apr 13, 2025

Aerodrome Action Provider for AgentKit

Overview

The Aerodrome Action Provider integrates Aerodrome Finance with AgentKit, enabling AI agents to interact with this Base-native DEX. Currently supports Base Mainnet for veAERO management, governance voting, and token swaps.

File Structure

agentkit/src/action-providers/aerodrome/
├── aerodromeActionProvider.ts # Main provider implementation
├── aerodromeActionProvider.test.ts # Test suite
├── constants.ts # Contract addresses & ABIs
├── schemas.ts # Zod validation schemas
├── utils.ts # Helper functions
└── index.ts # Public exports

Core Features

Create Lock Action

@CreateAction({
  name: "createLock",
  description: "Create a new veAERO lock by depositing AERO tokens",
  schema: CreateLockSchema,
})

Creates veAERO governance NFTs by locking AERO tokens
Handles token approvals automatically
Enforces lock duration constraints (1 week to 4 years)
Verifies token balances before locking

Vote Action

@CreateAction({
  name: "vote",
  description: "Cast votes with veAERO NFT for liquidity pool emissions",
  schema: VoteSchema,
})

Casts votes for gauge emissions using veAERO NFTs
Validates pool gauge existence
Enforces epoch-based voting rules
Provides detailed vote allocation feedback

Swap Action

@CreateAction({
  name: "swapExactTokensForTokens",
  description: "Swap tokens via Aerodrome pools",
  schema: SwapExactTokensSchema,
})

Swaps exact input tokens for minimum output tokens
Supports both stable and volatile pools
Provides price quotes and slippage warnings
Handles approvals and deadline validation

Technical Details

Dependencies: viem for blockchain interactions, zod for schema validation
Error Handling: Comprehensive checks for balances, approvals, deadlines, and contract-specific errors
Helper Functions: Modular utility functions for token info, transaction formatting, and epoch calculations

Testing

Comprehensive Jest test suite with mocked wallet provider
Tests for success and error paths for all actions
Coverage for specific contract errors (NotApprovedOrOwner, INSUFFICIENT_OUTPUT_AMOUNT, etc.)
Network validation testing

Current Limitations

Base Mainnet support only
Direct swap routes only (no multi-hop routing)
Limited to core veAERO and trading operations

Future Enhancements

Additional veAERO management (increase amount/duration, withdraw)
Rewards claiming (fees, bribes)
Liquidity provision and staking
Multi-hop swap routing

@Pranav2456 Pranav2456 requested a review from murrlincoln as a code owner April 13, 2025 00:24
@cb-heimdall
Copy link

cb-heimdall commented Apr 13, 2025

🟡 Heimdall Review Status

Requirement Status More Info
Reviews 🟡 0/1
Denominator calculation
Show calculation
1 if user is bot 0
1 if user is external 0
2 if repo is sensitive 0
From .codeflow.yml 1
Additional review requirements
Show calculation
Max 0
0
From CODEOWNERS 0
Global minimum 0
Max 1
1
1 if commit is unverified 0
Sum 1

@github-actions github-actions bot added documentation Improvements or additions to documentation action provider New action provider typescript labels Apr 13, 2025
@Pranav2456 Pranav2456 changed the title feat: Aerodome Action Provider feat: Aerodrome Action Provider Apr 14, 2025
@Pranav2456 Pranav2456 marked this pull request as draft April 15, 2025 13:37
@phdargen
Copy link
Contributor

phdargen commented Sep 8, 2025

Hey @Pranav2456, would be great to get an aerodrome action provider in!

This is still marked as draft, are you still working on this or is it ready for review?
Let me know if I can help with something or provide some feedback

@Pranav2456
Copy link
Author

Hey @phdargen

Hope you are doing well! I had to stop working on this due to some issues, but I definitely want to continue working on it and would greatly appreciate your feedback, initial review, or expectations. Since Aerodrome is quite a vast protocol, it would be difficult to complete all the features quickly, so it would be great if you could provide some direction.

@phdargen
Copy link
Contributor

Ok great @Pranav2456, thanks for your reply!

Aerodrome is indeed a quite complex protocol, by no means your PR needs to be feature complete.
It would be perfectly fine to only concentrate on the governance/vote actions at first.

Especially the LP action might be fairly difficult to implement and could be done in a follow-up PR (by you or someone else).

I would put less priority on the swap related actions as we have CDP API and 0x actions that aggregate various trade routes. Your swap action looks good though, if its not too much trouble would be nice to add.

Concerning the governance/vote actions it would be great to have the full flow with increase lock, withdraw, claim but again its up to you how much you are willing to contribute.

I will provide some initial comments below

Hey @phdargen

Hope you are doing well! I had to stop working on this due to some issues, but I definitely want to continue working on it and would greatly appreciate your feedback, initial review, or expectations. Since Aerodrome is quite a vast protocol, it would be difficult to complete all the features quickly, so it would be great if you could provide some direction.

@phdargen
Copy link
Contributor

Note that we require signed commits. See here for instructions on setting up commit signing. Once setup, rebase against main to re-sign all commits

@phdargen
Copy link
Contributor

Please add entry in agentkit/README (https://github.com/coinbase/agentkit/blob/main/typescript/agentkit/README.md), should follow alphabetic order

@phdargen
Copy link
Contributor

phdargen commented Sep 16, 2025

When you think it is ready to be merged, please remove all console.logs in your code and mark the PR from 'draft' to 'ready for review'

Also add the result of some manual testing including prompts and responses to the PR description above

return `Error: Lock duration (${lockDurationSeconds}s) cannot exceed 4 years (${MAX_LOCK_DURATION}s)`;
}

const { decimals, symbol } = await getTokenInfo(wallet, AERO_ADDRESS as Hex);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you may reuse the getTokenDetails function from erc20 action/utils here to fetch this info + balances more efficiently with a multicall

},
] as const satisfies Abi;

export const ERC20_ABI = [
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

import from view instead

import {erc20Abi } from "viem";

"created veAERO lock",
`Locked ${args.aeroAmount} ${symbol} for ${durationText}.`,
txHash,
receipt,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can the veAERO tokenId be retrieved from the tx logs? This might be useful for follow-up actions like vote

Comment on lines +255 to +257
name: "swapExactTokensForTokens",
description: `Swap an exact amount of an input token for a minimum amount of an output token on Aerodrome (Base Mainnet). Requires: tokenInAddress, tokenOutAddress, amountIn (e.g., '1.5'), amountOutMin (atomic units/wei), to (recipient address), deadline (Unix timestamp), and optionally useStablePool (boolean, default false for volatile). Note: Assumes a direct route exists.`,
schema: SwapExactTokensSchema,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

amountOutMin should also be in whole units, not in atomic units.

Problem here is that the user needs to know the fair price and then compute a sensible amountOutMin for this action. Better would be to replace amountOutMin arg with a slippage arg (default to 1%) which then internally computes the amountOutMin

Suggested change
name: "swapExactTokensForTokens",
description: `Swap an exact amount of an input token for a minimum amount of an output token on Aerodrome (Base Mainnet). Requires: tokenInAddress, tokenOutAddress, amountIn (e.g., '1.5'), amountOutMin (atomic units/wei), to (recipient address), deadline (Unix timestamp), and optionally useStablePool (boolean, default false for volatile). Note: Assumes a direct route exists.`,
schema: SwapExactTokensSchema,
name: "swapExactTokensForTokens",
description: `Swap an exact amount of an input token for a minimum amount of an output token on Aerodrome (Base Mainnet). Requires: tokenInAddress, tokenOutAddress, amountIn in whole units (e.g., '1.5'), amountOutMin in whole units (e.g., '2.1'), to (recipient address), deadline (Unix timestamp), and optionally useStablePool (boolean, default false for volatile). Note: Assumes a direct route exists.`,
schema: SwapExactTokensSchema,

Comment on lines +63 to +65
deadline: positiveIntegerStringSchema.describe(
"Unix timestamp deadline (seconds since epoch) for the transaction to succeed. Must be in the future.",
),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

would be good to set a reasonable default for the deadline, like 10mins for example

@Pranav2456 Pranav2456 force-pushed the feat/aerodome-action-provider branch 5 times, most recently from 25718ab to c623b56 Compare November 10, 2025 06:38
@Pranav2456 Pranav2456 force-pushed the feat/aerodome-action-provider branch from c623b56 to c2ea1fb Compare November 24, 2025 05:47
@Pranav2456 Pranav2456 force-pushed the feat/aerodome-action-provider branch from c2ea1fb to 9d2702b Compare November 24, 2025 05:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

action provider New action provider documentation Improvements or additions to documentation typescript

Development

Successfully merging this pull request may close these issues.

3 participants