-
Notifications
You must be signed in to change notification settings - Fork 578
feat: Aerodrome Action Provider #672
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
feat: Aerodrome Action Provider #672
Conversation
🟡 Heimdall Review Status
|
|
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? |
|
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. |
|
Ok great @Pranav2456, thanks for your reply! Aerodrome is indeed a quite complex protocol, by no means your PR needs to be feature complete. 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
|
|
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 |
|
Please add entry in agentkit/README (https://github.com/coinbase/agentkit/blob/main/typescript/agentkit/README.md), should follow alphabetic order |
|
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); |
There was a problem hiding this comment.
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 = [ |
There was a problem hiding this comment.
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, |
There was a problem hiding this comment.
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
| 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, |
There was a problem hiding this comment.
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
| 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, |
| deadline: positiveIntegerStringSchema.describe( | ||
| "Unix timestamp deadline (seconds since epoch) for the transaction to succeed. Must be in the future.", | ||
| ), |
There was a problem hiding this comment.
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
25718ab to
c623b56
Compare
c623b56 to
c2ea1fb
Compare
c2ea1fb to
9d2702b
Compare
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
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
Casts votes for gauge emissions using veAERO NFTs
Validates pool gauge existence
Enforces epoch-based voting rules
Provides detailed vote allocation feedback
Swap Action
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