feat: add Ethereum chain support - #116

Open
Ridwannurudeen wants to merge 2 commits into
OpenGradient:mainfrom
Ridwannurudeen:feat/eth-chain-support
Open

feat: add Ethereum chain support#116
Ridwannurudeen wants to merge 2 commits into
OpenGradient:mainfrom
Ridwannurudeen:feat/eth-chain-support

Conversation

@Ridwannurudeen

@RidwannurudeenRidwannurudeen commented Feb 24, 2026

Copy link
Copy Markdown

Summary

Adds Ethereum chain support alongside the existing Solana infrastructure, covering the three items in #48:

  • ETH portfolio analysisEthereumPortfolioFetcher with dual-mode support: auto-detects Alchemy endpoints and uses alchemy_getTokenBalances for complete ERC20 coverage in a single RPC call, with graceful fallback to individual balanceOf queries for 10 well-known tokens (USDC, USDT, DAI, WETH, WBTC, LINK, UNI, AAVE, CRV, stETH)
  • ETH token metadata — Hardcoded ETH/USDC/USDT/DAI entries with search_token() shortcut matching, backed by existing DexScreener API (already chain-agnostic)
  • ETH wallet tokens — Portfolio fetcher resolves token metadata and USD values via TokenMetadataRepo

Also adds Ethereum DeFi protocol implementations for pool discovery:

  • Uniswap V3 — Top 100 pools by TVL from The Graph subgraph, fee-based APR calculation across 1d/7d/30d windows, fee tier labeling (0.01%-1%)
  • Aave V3 — Active lending reserves with supply APR from on-chain liquidityRate (RAY units), USD-denominated TVL via priceInEth * ETH/USD * supply

Architecture

Follows existing patterns exactly:

  • Protocols implement Protocol ABC and register with ProtocolRegistry
  • Portfolio fetcher mirrors solana_portfolio.py structure
  • New retrieve_ethereum_pools tool added to investor agent toolkit
  • Chain.ETHEREUM enum already existed — no type changes needed

New files

  • onchain/portfolio/ethereum_portfolio.py
  • onchain/pools/ethereum/uniswap_v3_protocol.py
  • onchain/pools/ethereum/aave_protocol.py
  • onchain/pools/ethereum/test_ethereum_protocols.py

Modified files

  • onchain/tokens/metadata.py — ETH hardcoded tokens
  • agent/tools.pyretrieve_ethereum_pools tool
  • server/fastapi_server.py — register ETH protocols + portfolio fetcher
  • main.py — ETH protocol names
  • .env.exampleETH_RPC_URL, UNISWAP_V3_SUBGRAPH_URL, AAVE_V3_SUBGRAPH_URL

Key improvements over initial implementation

  • Alchemy API supportalchemy_getTokenBalances provides complete ERC20 token discovery without maintaining a hardcoded list; falls back gracefully to individual balanceOf calls for non-Alchemy RPCs
  • Configurable subgraph URLs — Both Uniswap V3 and Aave V3 subgraph endpoints are configurable via environment variables with sensible defaults
  • Accurate Aave TVL — Converts from token-native units to USD using priceInEth * ETH/USD from DexScreener, rather than raw token counts
  • Integration tests — Full test coverage for Uniswap V3 pools, Aave V3 reserves, portfolio fetching, empty wallets, and invalid addresses

Dependencies

  • web3>=7.3.0 — already in requirements.txt
  • aiohttp — already in requirements.txt

Test plan

  • Verify ETH token search returns hardcoded tokens (ETH, USDC, USDT, DAI)
  • Verify DexScreener metadata fetch works for ethereum chain
  • Test EthereumPortfolioFetcher with a known wallet address
  • Test Uniswap V3 subgraph query returns pools with valid APR
  • Test Aave V3 subgraph query returns lending reserves with USD TVL
  • Verify retrieve_ethereum_pools tool filters by Chain.ETHEREUM
  • Verify existing Solana functionality is unaffected
  • Test portfolio fallback mode (non-Alchemy RPC)
  • Test empty wallet and invalid address edge cases

Closes#48

- ETH portfolio fetcher with Alchemy API + web3.py fallback
- Uniswap V3 protocol (top pools by TVL, fee-based APR)
- Aave V3 protocol (lending reserves, USD-denominated TVL)
- Token metadata for ETH ecosystem (WETH, USDC, USDT, DAI)
- Configurable subgraph URLs via env vars
- Integration tests for ETH protocols and portfolio
@Ridwannurudeen

Copy link
Copy Markdown
Author

Hi team! Friendly ping on this one — adds Ethereum chain support alongside the existing BSC/BNB chain. Would love to get your thoughts when you have a moment. Happy to make any changes needed.

@Ridwannurudeen

Copy link
Copy Markdown
Author

Hey team — following up on this one too. Adds full Ethereum chain support (portfolio, Uniswap V3, Aave protocols, metadata) alongside the existing BSC/BNB chain. Tests included. Let me know if anything needs adjusting.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support ETH chains

1 participant

@Ridwannurudeen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: add Ethereum chain support - #116

Open
Ridwannurudeen wants to merge 2 commits into
OpenGradient:mainfrom
Ridwannurudeen:feat/eth-chain-support
Open

feat: add Ethereum chain support#116
Ridwannurudeen wants to merge 2 commits into
OpenGradient:mainfrom
Ridwannurudeen:feat/eth-chain-support

Conversation

@Ridwannurudeen

@RidwannurudeenRidwannurudeen commented Feb 24, 2026

Copy link
Copy Markdown

Summary

Adds Ethereum chain support alongside the existing Solana infrastructure, covering the three items in #48:

  • ETH portfolio analysisEthereumPortfolioFetcher with dual-mode support: auto-detects Alchemy endpoints and uses alchemy_getTokenBalances for complete ERC20 coverage in a single RPC call, with graceful fallback to individual balanceOf queries for 10 well-known tokens (USDC, USDT, DAI, WETH, WBTC, LINK, UNI, AAVE, CRV, stETH)
  • ETH token metadata — Hardcoded ETH/USDC/USDT/DAI entries with search_token() shortcut matching, backed by existing DexScreener API (already chain-agnostic)
  • ETH wallet tokens — Portfolio fetcher resolves token metadata and USD values via TokenMetadataRepo

Also adds Ethereum DeFi protocol implementations for pool discovery:

  • Uniswap V3 — Top 100 pools by TVL from The Graph subgraph, fee-based APR calculation across 1d/7d/30d windows, fee tier labeling (0.01%-1%)
  • Aave V3 — Active lending reserves with supply APR from on-chain liquidityRate (RAY units), USD-denominated TVL via priceInEth * ETH/USD * supply

Architecture

Follows existing patterns exactly:

  • Protocols implement Protocol ABC and register with ProtocolRegistry
  • Portfolio fetcher mirrors solana_portfolio.py structure
  • New retrieve_ethereum_pools tool added to investor agent toolkit
  • Chain.ETHEREUM enum already existed — no type changes needed

New files

  • onchain/portfolio/ethereum_portfolio.py
  • onchain/pools/ethereum/uniswap_v3_protocol.py
  • onchain/pools/ethereum/aave_protocol.py
  • onchain/pools/ethereum/test_ethereum_protocols.py

Modified files

  • onchain/tokens/metadata.py — ETH hardcoded tokens
  • agent/tools.pyretrieve_ethereum_pools tool
  • server/fastapi_server.py — register ETH protocols + portfolio fetcher
  • main.py — ETH protocol names
  • .env.exampleETH_RPC_URL, UNISWAP_V3_SUBGRAPH_URL, AAVE_V3_SUBGRAPH_URL

Key improvements over initial implementation

  • Alchemy API supportalchemy_getTokenBalances provides complete ERC20 token discovery without maintaining a hardcoded list; falls back gracefully to individual balanceOf calls for non-Alchemy RPCs
  • Configurable subgraph URLs — Both Uniswap V3 and Aave V3 subgraph endpoints are configurable via environment variables with sensible defaults
  • Accurate Aave TVL — Converts from token-native units to USD using priceInEth * ETH/USD from DexScreener, rather than raw token counts
  • Integration tests — Full test coverage for Uniswap V3 pools, Aave V3 reserves, portfolio fetching, empty wallets, and invalid addresses

Dependencies

  • web3>=7.3.0 — already in requirements.txt
  • aiohttp — already in requirements.txt

Test plan

  • Verify ETH token search returns hardcoded tokens (ETH, USDC, USDT, DAI)
  • Verify DexScreener metadata fetch works for ethereum chain
  • Test EthereumPortfolioFetcher with a known wallet address
  • Test Uniswap V3 subgraph query returns pools with valid APR
  • Test Aave V3 subgraph query returns lending reserves with USD TVL
  • Verify retrieve_ethereum_pools tool filters by Chain.ETHEREUM
  • Verify existing Solana functionality is unaffected
  • Test portfolio fallback mode (non-Alchemy RPC)
  • Test empty wallet and invalid address edge cases

Closes#48

- ETH portfolio fetcher with Alchemy API + web3.py fallback
- Uniswap V3 protocol (top pools by TVL, fee-based APR)
- Aave V3 protocol (lending reserves, USD-denominated TVL)
- Token metadata for ETH ecosystem (WETH, USDC, USDT, DAI)
- Configurable subgraph URLs via env vars
- Integration tests for ETH protocols and portfolio
@Ridwannurudeen

Copy link
Copy Markdown
Author

Hi team! Friendly ping on this one — adds Ethereum chain support alongside the existing BSC/BNB chain. Would love to get your thoughts when you have a moment. Happy to make any changes needed.

@Ridwannurudeen

Copy link
Copy Markdown
Author

Hey team — following up on this one too. Adds full Ethereum chain support (portfolio, Uniswap V3, Aave protocols, metadata) alongside the existing BSC/BNB chain. Tests included. Let me know if anything needs adjusting.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support ETH chains

1 participant

@Ridwannurudeen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add Ethereum chain support - #116

Open
Ridwannurudeen wants to merge 2 commits into
OpenGradient:mainfrom
Ridwannurudeen:feat/eth-chain-support
Open

feat: add Ethereum chain support#116
Ridwannurudeen wants to merge 2 commits into
OpenGradient:mainfrom
Ridwannurudeen:feat/eth-chain-support

Conversation

@Ridwannurudeen

@RidwannurudeenRidwannurudeen commented Feb 24, 2026

Copy link
Copy Markdown

Summary

Adds Ethereum chain support alongside the existing Solana infrastructure, covering the three items in #48:

  • ETH portfolio analysisEthereumPortfolioFetcher with dual-mode support: auto-detects Alchemy endpoints and uses alchemy_getTokenBalances for complete ERC20 coverage in a single RPC call, with graceful fallback to individual balanceOf queries for 10 well-known tokens (USDC, USDT, DAI, WETH, WBTC, LINK, UNI, AAVE, CRV, stETH)
  • ETH token metadata — Hardcoded ETH/USDC/USDT/DAI entries with search_token() shortcut matching, backed by existing DexScreener API (already chain-agnostic)
  • ETH wallet tokens — Portfolio fetcher resolves token metadata and USD values via TokenMetadataRepo

Also adds Ethereum DeFi protocol implementations for pool discovery:

  • Uniswap V3 — Top 100 pools by TVL from The Graph subgraph, fee-based APR calculation across 1d/7d/30d windows, fee tier labeling (0.01%-1%)
  • Aave V3 — Active lending reserves with supply APR from on-chain liquidityRate (RAY units), USD-denominated TVL via priceInEth * ETH/USD * supply

Architecture

Follows existing patterns exactly:

  • Protocols implement Protocol ABC and register with ProtocolRegistry
  • Portfolio fetcher mirrors solana_portfolio.py structure
  • New retrieve_ethereum_pools tool added to investor agent toolkit
  • Chain.ETHEREUM enum already existed — no type changes needed

New files

  • onchain/portfolio/ethereum_portfolio.py
  • onchain/pools/ethereum/uniswap_v3_protocol.py
  • onchain/pools/ethereum/aave_protocol.py
  • onchain/pools/ethereum/test_ethereum_protocols.py

Modified files

  • onchain/tokens/metadata.py — ETH hardcoded tokens
  • agent/tools.pyretrieve_ethereum_pools tool
  • server/fastapi_server.py — register ETH protocols + portfolio fetcher
  • main.py — ETH protocol names
  • .env.exampleETH_RPC_URL, UNISWAP_V3_SUBGRAPH_URL, AAVE_V3_SUBGRAPH_URL

Key improvements over initial implementation

  • Alchemy API supportalchemy_getTokenBalances provides complete ERC20 token discovery without maintaining a hardcoded list; falls back gracefully to individual balanceOf calls for non-Alchemy RPCs
  • Configurable subgraph URLs — Both Uniswap V3 and Aave V3 subgraph endpoints are configurable via environment variables with sensible defaults
  • Accurate Aave TVL — Converts from token-native units to USD using priceInEth * ETH/USD from DexScreener, rather than raw token counts
  • Integration tests — Full test coverage for Uniswap V3 pools, Aave V3 reserves, portfolio fetching, empty wallets, and invalid addresses

Dependencies

  • web3>=7.3.0 — already in requirements.txt
  • aiohttp — already in requirements.txt

Test plan

  • Verify ETH token search returns hardcoded tokens (ETH, USDC, USDT, DAI)
  • Verify DexScreener metadata fetch works for ethereum chain
  • Test EthereumPortfolioFetcher with a known wallet address
  • Test Uniswap V3 subgraph query returns pools with valid APR
  • Test Aave V3 subgraph query returns lending reserves with USD TVL
  • Verify retrieve_ethereum_pools tool filters by Chain.ETHEREUM
  • Verify existing Solana functionality is unaffected
  • Test portfolio fallback mode (non-Alchemy RPC)
  • Test empty wallet and invalid address edge cases

Closes#48

- ETH portfolio fetcher with Alchemy API + web3.py fallback
- Uniswap V3 protocol (top pools by TVL, fee-based APR)
- Aave V3 protocol (lending reserves, USD-denominated TVL)
- Token metadata for ETH ecosystem (WETH, USDC, USDT, DAI)
- Configurable subgraph URLs via env vars
- Integration tests for ETH protocols and portfolio
@Ridwannurudeen

Copy link
Copy Markdown
Author

Hi team! Friendly ping on this one — adds Ethereum chain support alongside the existing BSC/BNB chain. Would love to get your thoughts when you have a moment. Happy to make any changes needed.

@Ridwannurudeen

Copy link
Copy Markdown
Author

Hey team — following up on this one too. Adds full Ethereum chain support (portfolio, Uniswap V3, Aave protocols, metadata) alongside the existing BSC/BNB chain. Tests included. Let me know if anything needs adjusting.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support ETH chains

1 participant

@Ridwannurudeen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add Ethereum chain support - #116

Open
Ridwannurudeen wants to merge 2 commits into
OpenGradient:mainfrom
Ridwannurudeen:feat/eth-chain-support
Open

feat: add Ethereum chain support#116
Ridwannurudeen wants to merge 2 commits into
OpenGradient:mainfrom
Ridwannurudeen:feat/eth-chain-support

Conversation

@Ridwannurudeen

@RidwannurudeenRidwannurudeen commented Feb 24, 2026

Copy link
Copy Markdown

Summary

Adds Ethereum chain support alongside the existing Solana infrastructure, covering the three items in #48:

  • ETH portfolio analysisEthereumPortfolioFetcher with dual-mode support: auto-detects Alchemy endpoints and uses alchemy_getTokenBalances for complete ERC20 coverage in a single RPC call, with graceful fallback to individual balanceOf queries for 10 well-known tokens (USDC, USDT, DAI, WETH, WBTC, LINK, UNI, AAVE, CRV, stETH)
  • ETH token metadata — Hardcoded ETH/USDC/USDT/DAI entries with search_token() shortcut matching, backed by existing DexScreener API (already chain-agnostic)
  • ETH wallet tokens — Portfolio fetcher resolves token metadata and USD values via TokenMetadataRepo

Also adds Ethereum DeFi protocol implementations for pool discovery:

  • Uniswap V3 — Top 100 pools by TVL from The Graph subgraph, fee-based APR calculation across 1d/7d/30d windows, fee tier labeling (0.01%-1%)
  • Aave V3 — Active lending reserves with supply APR from on-chain liquidityRate (RAY units), USD-denominated TVL via priceInEth * ETH/USD * supply

Architecture

Follows existing patterns exactly:

  • Protocols implement Protocol ABC and register with ProtocolRegistry
  • Portfolio fetcher mirrors solana_portfolio.py structure
  • New retrieve_ethereum_pools tool added to investor agent toolkit
  • Chain.ETHEREUM enum already existed — no type changes needed

New files

  • onchain/portfolio/ethereum_portfolio.py
  • onchain/pools/ethereum/uniswap_v3_protocol.py
  • onchain/pools/ethereum/aave_protocol.py
  • onchain/pools/ethereum/test_ethereum_protocols.py

Modified files

  • onchain/tokens/metadata.py — ETH hardcoded tokens
  • agent/tools.pyretrieve_ethereum_pools tool
  • server/fastapi_server.py — register ETH protocols + portfolio fetcher
  • main.py — ETH protocol names
  • .env.exampleETH_RPC_URL, UNISWAP_V3_SUBGRAPH_URL, AAVE_V3_SUBGRAPH_URL

Key improvements over initial implementation

  • Alchemy API supportalchemy_getTokenBalances provides complete ERC20 token discovery without maintaining a hardcoded list; falls back gracefully to individual balanceOf calls for non-Alchemy RPCs
  • Configurable subgraph URLs — Both Uniswap V3 and Aave V3 subgraph endpoints are configurable via environment variables with sensible defaults
  • Accurate Aave TVL — Converts from token-native units to USD using priceInEth * ETH/USD from DexScreener, rather than raw token counts
  • Integration tests — Full test coverage for Uniswap V3 pools, Aave V3 reserves, portfolio fetching, empty wallets, and invalid addresses

Dependencies

  • web3>=7.3.0 — already in requirements.txt
  • aiohttp — already in requirements.txt

Test plan

  • Verify ETH token search returns hardcoded tokens (ETH, USDC, USDT, DAI)
  • Verify DexScreener metadata fetch works for ethereum chain
  • Test EthereumPortfolioFetcher with a known wallet address
  • Test Uniswap V3 subgraph query returns pools with valid APR
  • Test Aave V3 subgraph query returns lending reserves with USD TVL
  • Verify retrieve_ethereum_pools tool filters by Chain.ETHEREUM
  • Verify existing Solana functionality is unaffected
  • Test portfolio fallback mode (non-Alchemy RPC)
  • Test empty wallet and invalid address edge cases

Closes#48

- ETH portfolio fetcher with Alchemy API + web3.py fallback
- Uniswap V3 protocol (top pools by TVL, fee-based APR)
- Aave V3 protocol (lending reserves, USD-denominated TVL)
- Token metadata for ETH ecosystem (WETH, USDC, USDT, DAI)
- Configurable subgraph URLs via env vars
- Integration tests for ETH protocols and portfolio
@Ridwannurudeen

Copy link
Copy Markdown
Author

Hi team! Friendly ping on this one — adds Ethereum chain support alongside the existing BSC/BNB chain. Would love to get your thoughts when you have a moment. Happy to make any changes needed.

@Ridwannurudeen

Copy link
Copy Markdown
Author

Hey team — following up on this one too. Adds full Ethereum chain support (portfolio, Uniswap V3, Aave protocols, metadata) alongside the existing BSC/BNB chain. Tests included. Let me know if anything needs adjusting.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support ETH chains

1 participant

@Ridwannurudeen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat: add Ethereum chain support - #116

Open
Ridwannurudeen wants to merge 2 commits into
OpenGradient:mainfrom
Ridwannurudeen:feat/eth-chain-support
Open

feat: add Ethereum chain support#116
Ridwannurudeen wants to merge 2 commits into
OpenGradient:mainfrom
Ridwannurudeen:feat/eth-chain-support

Conversation

@Ridwannurudeen

@RidwannurudeenRidwannurudeen commented Feb 24, 2026

Copy link
Copy Markdown

Summary

Adds Ethereum chain support alongside the existing Solana infrastructure, covering the three items in #48:

  • ETH portfolio analysisEthereumPortfolioFetcher with dual-mode support: auto-detects Alchemy endpoints and uses alchemy_getTokenBalances for complete ERC20 coverage in a single RPC call, with graceful fallback to individual balanceOf queries for 10 well-known tokens (USDC, USDT, DAI, WETH, WBTC, LINK, UNI, AAVE, CRV, stETH)
  • ETH token metadata — Hardcoded ETH/USDC/USDT/DAI entries with search_token() shortcut matching, backed by existing DexScreener API (already chain-agnostic)
  • ETH wallet tokens — Portfolio fetcher resolves token metadata and USD values via TokenMetadataRepo

Also adds Ethereum DeFi protocol implementations for pool discovery:

  • Uniswap V3 — Top 100 pools by TVL from The Graph subgraph, fee-based APR calculation across 1d/7d/30d windows, fee tier labeling (0.01%-1%)
  • Aave V3 — Active lending reserves with supply APR from on-chain liquidityRate (RAY units), USD-denominated TVL via priceInEth * ETH/USD * supply

Architecture

Follows existing patterns exactly:

  • Protocols implement Protocol ABC and register with ProtocolRegistry
  • Portfolio fetcher mirrors solana_portfolio.py structure
  • New retrieve_ethereum_pools tool added to investor agent toolkit
  • Chain.ETHEREUM enum already existed — no type changes needed

New files

  • onchain/portfolio/ethereum_portfolio.py
  • onchain/pools/ethereum/uniswap_v3_protocol.py
  • onchain/pools/ethereum/aave_protocol.py
  • onchain/pools/ethereum/test_ethereum_protocols.py

Modified files

  • onchain/tokens/metadata.py — ETH hardcoded tokens
  • agent/tools.pyretrieve_ethereum_pools tool
  • server/fastapi_server.py — register ETH protocols + portfolio fetcher
  • main.py — ETH protocol names
  • .env.exampleETH_RPC_URL, UNISWAP_V3_SUBGRAPH_URL, AAVE_V3_SUBGRAPH_URL

Key improvements over initial implementation

  • Alchemy API supportalchemy_getTokenBalances provides complete ERC20 token discovery without maintaining a hardcoded list; falls back gracefully to individual balanceOf calls for non-Alchemy RPCs
  • Configurable subgraph URLs — Both Uniswap V3 and Aave V3 subgraph endpoints are configurable via environment variables with sensible defaults
  • Accurate Aave TVL — Converts from token-native units to USD using priceInEth * ETH/USD from DexScreener, rather than raw token counts
  • Integration tests — Full test coverage for Uniswap V3 pools, Aave V3 reserves, portfolio fetching, empty wallets, and invalid addresses

Dependencies

  • web3>=7.3.0 — already in requirements.txt
  • aiohttp — already in requirements.txt

Test plan

  • Verify ETH token search returns hardcoded tokens (ETH, USDC, USDT, DAI)
  • Verify DexScreener metadata fetch works for ethereum chain
  • Test EthereumPortfolioFetcher with a known wallet address
  • Test Uniswap V3 subgraph query returns pools with valid APR
  • Test Aave V3 subgraph query returns lending reserves with USD TVL
  • Verify retrieve_ethereum_pools tool filters by Chain.ETHEREUM
  • Verify existing Solana functionality is unaffected
  • Test portfolio fallback mode (non-Alchemy RPC)
  • Test empty wallet and invalid address edge cases

Closes#48

- ETH portfolio fetcher with Alchemy API + web3.py fallback
- Uniswap V3 protocol (top pools by TVL, fee-based APR)
- Aave V3 protocol (lending reserves, USD-denominated TVL)
- Token metadata for ETH ecosystem (WETH, USDC, USDT, DAI)
- Configurable subgraph URLs via env vars
- Integration tests for ETH protocols and portfolio
@Ridwannurudeen

Copy link
Copy Markdown
Author

Hi team! Friendly ping on this one — adds Ethereum chain support alongside the existing BSC/BNB chain. Would love to get your thoughts when you have a moment. Happy to make any changes needed.

@Ridwannurudeen

Copy link
Copy Markdown
Author

Hey team — following up on this one too. Adds full Ethereum chain support (portfolio, Uniswap V3, Aave protocols, metadata) alongside the existing BSC/BNB chain. Tests included. Let me know if anything needs adjusting.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support ETH chains

1 participant

@Ridwannurudeen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add Ethereum chain support - #116

Open
Ridwannurudeen wants to merge 2 commits into
OpenGradient:mainfrom
Ridwannurudeen:feat/eth-chain-support
Open

feat: add Ethereum chain support#116
Ridwannurudeen wants to merge 2 commits into
OpenGradient:mainfrom
Ridwannurudeen:feat/eth-chain-support

Conversation

@Ridwannurudeen

@RidwannurudeenRidwannurudeen commented Feb 24, 2026

Copy link
Copy Markdown

Summary

Adds Ethereum chain support alongside the existing Solana infrastructure, covering the three items in #48:

  • ETH portfolio analysisEthereumPortfolioFetcher with dual-mode support: auto-detects Alchemy endpoints and uses alchemy_getTokenBalances for complete ERC20 coverage in a single RPC call, with graceful fallback to individual balanceOf queries for 10 well-known tokens (USDC, USDT, DAI, WETH, WBTC, LINK, UNI, AAVE, CRV, stETH)
  • ETH token metadata — Hardcoded ETH/USDC/USDT/DAI entries with search_token() shortcut matching, backed by existing DexScreener API (already chain-agnostic)
  • ETH wallet tokens — Portfolio fetcher resolves token metadata and USD values via TokenMetadataRepo

Also adds Ethereum DeFi protocol implementations for pool discovery:

  • Uniswap V3 — Top 100 pools by TVL from The Graph subgraph, fee-based APR calculation across 1d/7d/30d windows, fee tier labeling (0.01%-1%)
  • Aave V3 — Active lending reserves with supply APR from on-chain liquidityRate (RAY units), USD-denominated TVL via priceInEth * ETH/USD * supply

Architecture

Follows existing patterns exactly:

  • Protocols implement Protocol ABC and register with ProtocolRegistry
  • Portfolio fetcher mirrors solana_portfolio.py structure
  • New retrieve_ethereum_pools tool added to investor agent toolkit
  • Chain.ETHEREUM enum already existed — no type changes needed

New files

  • onchain/portfolio/ethereum_portfolio.py
  • onchain/pools/ethereum/uniswap_v3_protocol.py
  • onchain/pools/ethereum/aave_protocol.py
  • onchain/pools/ethereum/test_ethereum_protocols.py

Modified files

  • onchain/tokens/metadata.py — ETH hardcoded tokens
  • agent/tools.pyretrieve_ethereum_pools tool
  • server/fastapi_server.py — register ETH protocols + portfolio fetcher
  • main.py — ETH protocol names
  • .env.exampleETH_RPC_URL, UNISWAP_V3_SUBGRAPH_URL, AAVE_V3_SUBGRAPH_URL

Key improvements over initial implementation

  • Alchemy API supportalchemy_getTokenBalances provides complete ERC20 token discovery without maintaining a hardcoded list; falls back gracefully to individual balanceOf calls for non-Alchemy RPCs
  • Configurable subgraph URLs — Both Uniswap V3 and Aave V3 subgraph endpoints are configurable via environment variables with sensible defaults
  • Accurate Aave TVL — Converts from token-native units to USD using priceInEth * ETH/USD from DexScreener, rather than raw token counts
  • Integration tests — Full test coverage for Uniswap V3 pools, Aave V3 reserves, portfolio fetching, empty wallets, and invalid addresses

Dependencies

  • web3>=7.3.0 — already in requirements.txt
  • aiohttp — already in requirements.txt

Test plan

  • Verify ETH token search returns hardcoded tokens (ETH, USDC, USDT, DAI)
  • Verify DexScreener metadata fetch works for ethereum chain
  • Test EthereumPortfolioFetcher with a known wallet address
  • Test Uniswap V3 subgraph query returns pools with valid APR
  • Test Aave V3 subgraph query returns lending reserves with USD TVL
  • Verify retrieve_ethereum_pools tool filters by Chain.ETHEREUM
  • Verify existing Solana functionality is unaffected
  • Test portfolio fallback mode (non-Alchemy RPC)
  • Test empty wallet and invalid address edge cases

Closes#48

- ETH portfolio fetcher with Alchemy API + web3.py fallback
- Uniswap V3 protocol (top pools by TVL, fee-based APR)
- Aave V3 protocol (lending reserves, USD-denominated TVL)
- Token metadata for ETH ecosystem (WETH, USDC, USDT, DAI)
- Configurable subgraph URLs via env vars
- Integration tests for ETH protocols and portfolio
@Ridwannurudeen

Copy link
Copy Markdown
Author

Hi team! Friendly ping on this one — adds Ethereum chain support alongside the existing BSC/BNB chain. Would love to get your thoughts when you have a moment. Happy to make any changes needed.

@Ridwannurudeen

Copy link
Copy Markdown
Author

Hey team — following up on this one too. Adds full Ethereum chain support (portfolio, Uniswap V3, Aave protocols, metadata) alongside the existing BSC/BNB chain. Tests included. Let me know if anything needs adjusting.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support ETH chains

1 participant

@Ridwannurudeen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add Ethereum chain support - #116

Open
Ridwannurudeen wants to merge 2 commits into
OpenGradient:mainfrom
Ridwannurudeen:feat/eth-chain-support
Open

feat: add Ethereum chain support#116
Ridwannurudeen wants to merge 2 commits into
OpenGradient:mainfrom
Ridwannurudeen:feat/eth-chain-support

Conversation

@Ridwannurudeen

@RidwannurudeenRidwannurudeen commented Feb 24, 2026

Copy link
Copy Markdown

Summary

Adds Ethereum chain support alongside the existing Solana infrastructure, covering the three items in #48:

  • ETH portfolio analysisEthereumPortfolioFetcher with dual-mode support: auto-detects Alchemy endpoints and uses alchemy_getTokenBalances for complete ERC20 coverage in a single RPC call, with graceful fallback to individual balanceOf queries for 10 well-known tokens (USDC, USDT, DAI, WETH, WBTC, LINK, UNI, AAVE, CRV, stETH)
  • ETH token metadata — Hardcoded ETH/USDC/USDT/DAI entries with search_token() shortcut matching, backed by existing DexScreener API (already chain-agnostic)
  • ETH wallet tokens — Portfolio fetcher resolves token metadata and USD values via TokenMetadataRepo

Also adds Ethereum DeFi protocol implementations for pool discovery:

  • Uniswap V3 — Top 100 pools by TVL from The Graph subgraph, fee-based APR calculation across 1d/7d/30d windows, fee tier labeling (0.01%-1%)
  • Aave V3 — Active lending reserves with supply APR from on-chain liquidityRate (RAY units), USD-denominated TVL via priceInEth * ETH/USD * supply

Architecture

Follows existing patterns exactly:

  • Protocols implement Protocol ABC and register with ProtocolRegistry
  • Portfolio fetcher mirrors solana_portfolio.py structure
  • New retrieve_ethereum_pools tool added to investor agent toolkit
  • Chain.ETHEREUM enum already existed — no type changes needed

New files

  • onchain/portfolio/ethereum_portfolio.py
  • onchain/pools/ethereum/uniswap_v3_protocol.py
  • onchain/pools/ethereum/aave_protocol.py
  • onchain/pools/ethereum/test_ethereum_protocols.py

Modified files

  • onchain/tokens/metadata.py — ETH hardcoded tokens
  • agent/tools.pyretrieve_ethereum_pools tool
  • server/fastapi_server.py — register ETH protocols + portfolio fetcher
  • main.py — ETH protocol names
  • .env.exampleETH_RPC_URL, UNISWAP_V3_SUBGRAPH_URL, AAVE_V3_SUBGRAPH_URL

Key improvements over initial implementation

  • Alchemy API supportalchemy_getTokenBalances provides complete ERC20 token discovery without maintaining a hardcoded list; falls back gracefully to individual balanceOf calls for non-Alchemy RPCs
  • Configurable subgraph URLs — Both Uniswap V3 and Aave V3 subgraph endpoints are configurable via environment variables with sensible defaults
  • Accurate Aave TVL — Converts from token-native units to USD using priceInEth * ETH/USD from DexScreener, rather than raw token counts
  • Integration tests — Full test coverage for Uniswap V3 pools, Aave V3 reserves, portfolio fetching, empty wallets, and invalid addresses

Dependencies

  • web3>=7.3.0 — already in requirements.txt
  • aiohttp — already in requirements.txt

Test plan

  • Verify ETH token search returns hardcoded tokens (ETH, USDC, USDT, DAI)
  • Verify DexScreener metadata fetch works for ethereum chain
  • Test EthereumPortfolioFetcher with a known wallet address
  • Test Uniswap V3 subgraph query returns pools with valid APR
  • Test Aave V3 subgraph query returns lending reserves with USD TVL
  • Verify retrieve_ethereum_pools tool filters by Chain.ETHEREUM
  • Verify existing Solana functionality is unaffected
  • Test portfolio fallback mode (non-Alchemy RPC)
  • Test empty wallet and invalid address edge cases

Closes#48

- ETH portfolio fetcher with Alchemy API + web3.py fallback
- Uniswap V3 protocol (top pools by TVL, fee-based APR)
- Aave V3 protocol (lending reserves, USD-denominated TVL)
- Token metadata for ETH ecosystem (WETH, USDC, USDT, DAI)
- Configurable subgraph URLs via env vars
- Integration tests for ETH protocols and portfolio
@Ridwannurudeen

Copy link
Copy Markdown
Author

Hi team! Friendly ping on this one — adds Ethereum chain support alongside the existing BSC/BNB chain. Would love to get your thoughts when you have a moment. Happy to make any changes needed.

@Ridwannurudeen

Copy link
Copy Markdown
Author

Hey team — following up on this one too. Adds full Ethereum chain support (portfolio, Uniswap V3, Aave protocols, metadata) alongside the existing BSC/BNB chain. Tests included. Let me know if anything needs adjusting.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support ETH chains

1 participant

@Ridwannurudeen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: add Ethereum chain support - #116

Open
Ridwannurudeen wants to merge 2 commits into
OpenGradient:mainfrom
Ridwannurudeen:feat/eth-chain-support
Open

feat: add Ethereum chain support#116
Ridwannurudeen wants to merge 2 commits into
OpenGradient:mainfrom
Ridwannurudeen:feat/eth-chain-support

Conversation

@Ridwannurudeen

@RidwannurudeenRidwannurudeen commented Feb 24, 2026

Copy link
Copy Markdown

Summary

Adds Ethereum chain support alongside the existing Solana infrastructure, covering the three items in #48:

  • ETH portfolio analysisEthereumPortfolioFetcher with dual-mode support: auto-detects Alchemy endpoints and uses alchemy_getTokenBalances for complete ERC20 coverage in a single RPC call, with graceful fallback to individual balanceOf queries for 10 well-known tokens (USDC, USDT, DAI, WETH, WBTC, LINK, UNI, AAVE, CRV, stETH)
  • ETH token metadata — Hardcoded ETH/USDC/USDT/DAI entries with search_token() shortcut matching, backed by existing DexScreener API (already chain-agnostic)
  • ETH wallet tokens — Portfolio fetcher resolves token metadata and USD values via TokenMetadataRepo

Also adds Ethereum DeFi protocol implementations for pool discovery:

  • Uniswap V3 — Top 100 pools by TVL from The Graph subgraph, fee-based APR calculation across 1d/7d/30d windows, fee tier labeling (0.01%-1%)
  • Aave V3 — Active lending reserves with supply APR from on-chain liquidityRate (RAY units), USD-denominated TVL via priceInEth * ETH/USD * supply

Architecture

Follows existing patterns exactly:

  • Protocols implement Protocol ABC and register with ProtocolRegistry
  • Portfolio fetcher mirrors solana_portfolio.py structure
  • New retrieve_ethereum_pools tool added to investor agent toolkit
  • Chain.ETHEREUM enum already existed — no type changes needed

New files

  • onchain/portfolio/ethereum_portfolio.py
  • onchain/pools/ethereum/uniswap_v3_protocol.py
  • onchain/pools/ethereum/aave_protocol.py
  • onchain/pools/ethereum/test_ethereum_protocols.py

Modified files

  • onchain/tokens/metadata.py — ETH hardcoded tokens
  • agent/tools.pyretrieve_ethereum_pools tool
  • server/fastapi_server.py — register ETH protocols + portfolio fetcher
  • main.py — ETH protocol names
  • .env.exampleETH_RPC_URL, UNISWAP_V3_SUBGRAPH_URL, AAVE_V3_SUBGRAPH_URL

Key improvements over initial implementation

  • Alchemy API supportalchemy_getTokenBalances provides complete ERC20 token discovery without maintaining a hardcoded list; falls back gracefully to individual balanceOf calls for non-Alchemy RPCs
  • Configurable subgraph URLs — Both Uniswap V3 and Aave V3 subgraph endpoints are configurable via environment variables with sensible defaults
  • Accurate Aave TVL — Converts from token-native units to USD using priceInEth * ETH/USD from DexScreener, rather than raw token counts
  • Integration tests — Full test coverage for Uniswap V3 pools, Aave V3 reserves, portfolio fetching, empty wallets, and invalid addresses

Dependencies

  • web3>=7.3.0 — already in requirements.txt
  • aiohttp — already in requirements.txt

Test plan

  • Verify ETH token search returns hardcoded tokens (ETH, USDC, USDT, DAI)
  • Verify DexScreener metadata fetch works for ethereum chain
  • Test EthereumPortfolioFetcher with a known wallet address
  • Test Uniswap V3 subgraph query returns pools with valid APR
  • Test Aave V3 subgraph query returns lending reserves with USD TVL
  • Verify retrieve_ethereum_pools tool filters by Chain.ETHEREUM
  • Verify existing Solana functionality is unaffected
  • Test portfolio fallback mode (non-Alchemy RPC)
  • Test empty wallet and invalid address edge cases

Closes#48

- ETH portfolio fetcher with Alchemy API + web3.py fallback
- Uniswap V3 protocol (top pools by TVL, fee-based APR)
- Aave V3 protocol (lending reserves, USD-denominated TVL)
- Token metadata for ETH ecosystem (WETH, USDC, USDT, DAI)
- Configurable subgraph URLs via env vars
- Integration tests for ETH protocols and portfolio
@Ridwannurudeen

Copy link
Copy Markdown
Author

Hi team! Friendly ping on this one — adds Ethereum chain support alongside the existing BSC/BNB chain. Would love to get your thoughts when you have a moment. Happy to make any changes needed.

@Ridwannurudeen

Copy link
Copy Markdown
Author

Hey team — following up on this one too. Adds full Ethereum chain support (portfolio, Uniswap V3, Aave protocols, metadata) alongside the existing BSC/BNB chain. Tests included. Let me know if anything needs adjusting.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support ETH chains

1 participant

@Ridwannurudeen