On-Chain Analysis Skill
Analyze any verified EVM smart contract by pasting its address. The skill runs a full analysis pipeline:
- ABI Fetching — Retrieves the verified ABI from Etherscan (or accepts a manual ABI)
- Usage Discovery — Queries Dune to find which methods are most called, by whom, and with what value
- Decoded Data Tables — AI generates DuneSQL queries using
decode_evm_function_call() to build raw decoded data tables on Dune
- Analytics Generation — A second AI pass generates 6-10 visualization queries (stats, time series, bar charts, pie charts) from the decoded tables
- Execution — All queries are executed on Dune and results returned as structured JSON
When to Use
- User asks "analyze this contract" or "what does this contract do"
- User wants on-chain analytics, usage stats, or dashboards for a smart contract
- User provides a contract address and wants to understand its activity
- User asks about transaction patterns, caller behavior, or function usage
- User wants to compare function usage or identify top callers
- User asks "who uses this contract" or "how popular is this contract"
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
- Start with the TLDR — display it as markdown to give the user a quick overview
- Dashboard link — always include the
dashboardUrl so the user can view the full interactive dashboard: "📊 View full dashboard"
- Stat queries (
type: "stat") — show as headline metrics (e.g., "Total Swaps: 142,000")
- Time series (
type: "timeseries") — describe trends ("Daily swaps peaked at X on date Y")
- Bar/Pie charts (
type: "bar" / type: "pie") — summarize distributions ("Top 5 callers account for 60% of swaps")
- Link to Dune — provide
dune_url links for raw tables so users can explore further
- 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 links
Missing 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": "<user-provided ABI>" }
Follow-ups after analysis
- "Tell me more about the top callers" → Expand on bar/pie data from
queryResults
- "What does the swap function do?" → Use
abiSummary to explain
- "Can I see the raw data?" → Link to
rawTables[].dune_url
Important Notes
- The analysis takes 2-5 minutes due to Dune query execution and materialization — set user expectations
- Only works for contracts with verified ABIs (unless a manual ABI is provided)
- The AI selects the most interesting functions automatically based on usage data
- Raw decoded tables are saved as named queries on Dune for future reference
- Query results may be empty if the contract has very little on-chain activity
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 |
1---2name: onchain-analysis3description: 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.4---5
6# On-Chain Analysis Skill
7
8Analyze any verified EVM smart contract by pasting its address. The skill runs a full analysis pipeline:
9
101. **ABI Fetching** — Retrieves the verified ABI from Etherscan (or accepts a manual ABI)
112. **Usage Discovery** — Queries Dune to find which methods are most called, by whom, and with what value
123. **Decoded Data Tables** — AI generates DuneSQL queries using `decode_evm_function_call()` to build raw decoded data tables on Dune
134. **Analytics Generation** — A second AI pass generates 6-10 visualization queries (stats, time series, bar charts, pie charts) from the decoded tables
145. **Execution** — All queries are executed on Dune and results returned as structured JSON
15
16## When to Use
17
18- User asks "analyze this contract" or "what does this contract do"
19- User wants on-chain analytics, usage stats, or dashboards for a smart contract
20- User provides a contract address and wants to understand its activity
21- User asks about transaction patterns, caller behavior, or function usage
22- User wants to compare function usage or identify top callers
23- User asks "who uses this contract" or "how popular is this contract"
24
25## How to Call
26
27**POST** `https://esraarlhpxraucslsdle.supabase.co/functions/v1/onchain-analysis`
28
29### Request Body
30
31```json
32{
33 "contractAddress": "0x00000000009726632680FB29d3F7A9734E3010E2",
34 "chain": "base",
35 "abi": "(optional — raw ABI JSON string if contract is unverified)"
36}
37```
38
39### Parameters
40
41| Field | Type | Required | Description |
42|-------|------|----------|-------------|
43| `contractAddress` | string | Yes | The EVM contract address (0x-prefixed, 42 chars including 0x) |
44| `chain` | string | Yes | One of: `ethereum`, `polygon`, `bsc`, `arbitrum`, `optimism`, `base`, `avalanche` |
45| `abi` | string/array | No | Manual ABI if contract is not verified on Etherscan |
46
47### Supported Chains
48
49| Chain | Example Explorer |
50|-------|-----------------|
51| `ethereum` | etherscan.io |
52| `polygon` | polygonscan.com |
53| `bsc` | bscscan.com |
54| `arbitrum` | arbiscan.io |
55| `optimism` | optimistic.etherscan.io |
56| `base` | basescan.org |
57| `avalanche` | snowtrace.io |
58
59### Response
60
61```json
62{
63 "contractAddress": "0x...",
64 "chain": "base",
65 "tldr": "## TLDR\n\n- **Key insight 1** ...\n- **Key insight 2** ...",
66 "abiSummary": "Events (5):\n - Transfer(...)\nWrite Functions (8):\n - swap(...)",
67 "dashboardUrl": "https://onchainwizard.ai/shared/abc123-uuid",
68 "topMethods": [
69 {
70 "function_name": "swap",
71 "call_count": 142000,
72 "unique_callers": 5200,
73 "total_eth": 1234.5678
74 }
75 ],
76 "rawTables": [
77 {
78 "function_name": "swap",
79 "query_id": 12345,
80 "dune_url": "https://dune.com/queries/12345",
81 "execution_state": "QUERY_STATE_COMPLETED"
82 }
83 ],
84 "queryResults": [
85 {
86 "id": "total_swaps",
87 "title": "Total Swaps",
88 "type": "stat",
89 "sql": "SELECT COUNT(*) AS value FROM query_12345",
90 "rows": [{ "value": 142000 }]
91 },
92 {
93 "id": "daily_swaps",
94 "title": "Daily Swap Volume",
95 "type": "timeseries",
96 "sql": "SELECT DATE_TRUNC('day', block_time) AS date, COUNT(*) AS value FROM query_12345 GROUP BY 1 ORDER BY 1",
97 "rows": [
98 { "date": "2026-01-01", "value": 500 },
99 { "date": "2026-01-02", "value": 620 }
100 ]
101 }
102 ]
103}
104```
105
106### Query Result Types
107
108| Type | Description | Key Fields |
109|------|-------------|------------|
110| `stat` | Single metric | `rows[0].value` — the headline number |
111| `timeseries` | Data over time | `rows[].date`, `rows[].value` |
112| `bar` | Category comparison | `rows[].label`, `rows[].value` |
113| `pie` | Distribution | `rows[].label`, `rows[].value` |
114| `scatter` | Correlation | `rows[].x`, `rows[].y` |
115
116## How to Present Results
117
1181. **Start with the TLDR** — display it as markdown to give the user a quick overview
1192. **Dashboard link** — always include the `dashboardUrl` so the user can view the full interactive dashboard: "📊 [View full dashboard](dashboardUrl)"
1203. **Stat queries** (`type: "stat"`) — show as headline metrics (e.g., "Total Swaps: 142,000")
1214. **Time series** (`type: "timeseries"`) — describe trends ("Daily swaps peaked at X on date Y")
1225. **Bar/Pie charts** (`type: "bar"` / `type: "pie"`) — summarize distributions ("Top 5 callers account for 60% of swaps")
1236. **Link to Dune** — provide `dune_url` links for raw tables so users can explore further
1247. **Failed queries** — if a query has `error` instead of `rows`, mention it briefly but don't block the rest
125
126## Example Conversations
127
128### Basic: "Analyze this contract"
129**User:** Analyze 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D on ethereum
130**Action:** Call the skill with `{ "contractAddress": "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D", "chain": "ethereum" }`
131**Present:** TLDR → Stats → Trends → Distributions → Dune links
132
133### Missing chain
134**User:** What does 0xABC...DEF do?
135**Action:** Ask which chain before calling. "Which chain is this contract on? I support Ethereum, Polygon, BSC, Arbitrum, Optimism, Base, and Avalanche."
136
137### Unverified contract
138**User:** Analyze 0xABC...DEF on base
139**API returns:** `"Could not fetch ABI"`
140**Action:** Ask user for the ABI JSON, then retry with `{ "contractAddress": "...", "chain": "base", "abi": "<user-provided ABI>" }`
141
142### Follow-ups after analysis
143- "Tell me more about the top callers" → Expand on bar/pie data from `queryResults`
144- "What does the swap function do?" → Use `abiSummary` to explain
145- "Can I see the raw data?" → Link to `rawTables[].dune_url`
146
147## Important Notes
148
149- The analysis takes **2-5 minutes** due to Dune query execution and materialization — set user expectations
150- Only works for contracts with verified ABIs (unless a manual ABI is provided)
151- The AI selects the most interesting functions automatically based on usage data
152- Raw decoded tables are saved as named queries on Dune for future reference
153- Query results may be empty if the contract has very little on-chain activity
154
155## Error Handling
156
157| Error | Meaning | Recommended Action |
158|-------|---------|-------------------|
159| `"Could not fetch ABI"` | Contract is not verified | Ask user for the ABI |
160| `"No write functions found"` | No state-changing functions | Inform user; contract may be read-only or a proxy |
161| `"Unsupported chain"` | Chain not in supported list | List supported chains and ask again |
162| `"Missing required API keys"` | Server-side config issue | Report as a service error |
163| Timeout / no response | Analysis exceeded time limit | Suggest retrying; Dune may be under load |