on-chain analytics for evm contract
by @ramitphi
Analyze any EVM smart contract — auto-fetches ABI, discovers usage patterns, decodes function calls via Dune, generates AI-driven analytics (charts, stats, t...
clawhub install on-chain-analyitcs📖 About This Skill
name: onchain-analysis description: Analyze any EVM smart contract — auto-fetches ABI, discovers usage patterns, decodes function calls via Dune, generates AI-driven analytics (charts, stats, time series), and returns structured results. Supports Ethereum, Polygon, BSC, Arbitrum, Optimism, Base, Avalanche.
On-Chain Analysis Skill
Analyze any verified EVM smart contract by pasting its address. The skill runs a full analysis pipeline:
1. ABI Fetching — Retrieves the verified ABI from Etherscan (or accepts a manual ABI)
2. Usage Discovery — Queries Dune to find which methods are most called, by whom, and with what value
3. Decoded Data Tables — AI generates DuneSQL queries using decode_evm_function_call() to build raw decoded data tables on Dune
4. Analytics Generation — A second AI pass generates 6-10 visualization queries (stats, time series, bar charts, pie charts) from the decoded tables
5. Execution — All queries are executed on Dune and results returned as structured JSON
When to Use
How to Call
POST https://esraarlhpxraucslsdle.supabase.co/functions/v1/onchain-analysis
Request Body
{
"contractAddress": "0x00000000009726632680FB29d3F7A9734E3010E2",
"chain": "base",
"abi": "(optional — raw ABI JSON string if contract is unverified)"
}
Parameters
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| contractAddress | string | Yes | The EVM contract address (0x-prefixed, 42 chars including 0x) |
| chain | string | Yes | One of: ethereum, polygon, bsc, arbitrum, optimism, base, avalanche |
| abi | string/array | No | Manual ABI if contract is not verified on Etherscan |
Supported Chains
| Chain | Example Explorer |
|-------|-----------------|
| ethereum | etherscan.io |
| polygon | polygonscan.com |
| bsc | bscscan.com |
| arbitrum | arbiscan.io |
| optimism | optimistic.etherscan.io |
| base | basescan.org |
| avalanche | snowtrace.io |
Response
{
"contractAddress": "0x...",
"chain": "base",
"tldr": "## TLDR\n\n- Key insight 1 ...\n- Key insight 2 ...",
"abiSummary": "Events (5):\n - Transfer(...)\nWrite Functions (8):\n - swap(...)",
"dashboardUrl": "https://onchainwizard.ai/shared/abc123-uuid",
"topMethods": [
{
"function_name": "swap",
"call_count": 142000,
"unique_callers": 5200,
"total_eth": 1234.5678
}
],
"rawTables": [
{
"function_name": "swap",
"query_id": 12345,
"dune_url": "https://dune.com/queries/12345",
"execution_state": "QUERY_STATE_COMPLETED"
}
],
"queryResults": [
{
"id": "total_swaps",
"title": "Total Swaps",
"type": "stat",
"sql": "SELECT COUNT(*) AS value FROM query_12345",
"rows": [{ "value": 142000 }]
},
{
"id": "daily_swaps",
"title": "Daily Swap Volume",
"type": "timeseries",
"sql": "SELECT DATE_TRUNC('day', block_time) AS date, COUNT(*) AS value FROM query_12345 GROUP BY 1 ORDER BY 1",
"rows": [
{ "date": "2026-01-01", "value": 500 },
{ "date": "2026-01-02", "value": 620 }
]
}
]
}
Query Result Types
| Type | Description | Key Fields |
|------|-------------|------------|
| stat | Single metric | rows[0].value — the headline number |
| timeseries | Data over time | rows[].date, rows[].value |
| bar | Category comparison | rows[].label, rows[].value |
| pie | Distribution | rows[].label, rows[].value |
| scatter | Correlation | rows[].x, rows[].y |
How to Present Results
1. Start with the TLDR — display it as markdown to give the user a quick overview
2. Dashboard link — always include the dashboardUrl so the user can view the full interactive dashboard: "📊 View full dashboard"
3. Stat queries (type: "stat") — show as headline metrics (e.g., "Total Swaps: 142,000")
4. Time series (type: "timeseries") — describe trends ("Daily swaps peaked at X on date Y")
5. Bar/Pie charts (type: "bar" / type: "pie") — summarize distributions ("Top 5 callers account for 60% of swaps")
6. Link to Dune — provide dune_url links for raw tables so users can explore further
7. Failed queries — if a query has error instead of rows, mention it briefly but don't block the rest
Example Conversations
Basic: "Analyze this contract"
User: Analyze 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D on ethereum Action: Call the skill with{ "contractAddress": "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D", "chain": "ethereum" }
Present: TLDR → Stats → Trends → Distributions → Dune linksMissing chain
User: What does 0xABC...DEF do? Action: Ask which chain before calling. "Which chain is this contract on? I support Ethereum, Polygon, BSC, Arbitrum, Optimism, Base, and Avalanche."Unverified contract
User: Analyze 0xABC...DEF on base API returns:"Could not fetch ABI"
Action: Ask user for the ABI JSON, then retry with { "contractAddress": "...", "chain": "base", "abi": "" } Follow-ups after analysis
queryResultsabiSummary to explainrawTables[].dune_urlImportant Notes
Error Handling
| Error | Meaning | Recommended Action |
|-------|---------|-------------------|
| "Could not fetch ABI" | Contract is not verified | Ask user for the ABI |
| "No write functions found" | No state-changing functions | Inform user; contract may be read-only or a proxy |
| "Unsupported chain" | Chain not in supported list | List supported chains and ask again |
| "Missing required API keys" | Server-side config issue | Report as a service error |
| Timeout / no response | Analysis exceeded time limit | Suggest retrying; Dune may be under load |