Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Dune Analytics API for blockchain data queries. Use for: (1) Discovering tables and inspecting schemas, (2) Executing/refreshing Dune queries, (3) SQL query...
Dune Analytics API for blockchain data queries. Use for: (1) Discovering tables and inspecting schemas, (2) Executing/refreshing Dune queries, (3) SQL query...
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run.
A skill for querying and analyzing blockchain data via the Dune Analytics API.
pip install dune-client Set DUNE_API_KEY via environment variable, .env file, or agent config.
Read references first β The reference files contain critical table names, anti-patterns, and chain-specific gotchas that aren't obvious from table names alone. Reading the right reference before writing SQL prevents common mistakes like using dex.trades for wallet analysis (which inflates volume ~30%) or missing Solana's dedup requirement. Prefer private queries β Creating queries with is_private=True keeps the user's workspace clean and avoids polluting the public Dune namespace. Fall back to public if it fails (free plan limitation), and let the user know. Reuse before creating β Dune charges credits per execution. Reusing or updating an existing query avoids unnecessary duplicates and makes credit tracking easier. Only create new queries when the user explicitly asks. Confirm before updating β Modifying an existing query's SQL is destructive (previous version isn't saved by default). A quick confirmation avoids overwriting work the user might want to keep. Track credits β Each execution costs credits depending on the performance tier and data scanned. Reporting credits consumed helps the user manage their budget. See query-execution.md.
For common operations, use the scripts in scripts/ to avoid writing boilerplate code every time. All scripts read DUNE_API_KEY from the environment automatically. ScriptCommandWhat it doesdune_query.pyexecute --query-id IDExecute a saved query (supports --params, --performance, --format)dune_query.pyget_latest --query-id IDGet cached result without re-executiondune_query.pyget_sql --query-id IDPrint query SQLdune_query.pyupdate_sql --query-id ID --sql "..."Update query SQLdune_discover.pysearch --keyword "uniswap"Search tables by keyworddune_discover.pyschema --table "dex.trades"Show table columns and typesdune_discover.pylist_schemas --namespace "uniswap_v3"List tables in a namespacedune_discover.pycontract --address "0x..."Find decoded tables by contract addressdune_discover.pydocs --keyword "dex"Search Dune documentationdune_upload.pyupload_csv --file data.csv --table-name tblQuick CSV upload (overwrites)dune_upload.pycreate_table --table-name tbl --namespace ns --schema '[...]'Create table with explicit schemadune_upload.pyinsert --file data.csv --table-name tbl --namespace nsAppend data to existing table Example: # Execute query with parameters python scripts/dune_query.py execute --query-id 123456 --params '{"token":"ETH"}' --format table # Upload a CSV privately python scripts/dune_upload.py upload_csv --file wallets.csv --table-name my_wallets --private
Before writing any SQL, route to the correct reference file(s) based on your task: Task involves...Read this referenceFinding tables / inspecting schema / discovering protocolstable-discovery.mdFinding decoded tables by contract addresstable-discovery.mdSearching Dune documentation / guides / examplestable-discovery.mdWallet / address tracking / router identificationwallet-analysis.mdTable selection / common table namescommon-tables.mdSQL performance / complex joins / array opssql-optimization.mdAPI calls / execution / caching / parametersquery-execution.mdUploading CSV/NDJSON data to Dunedata-upload.md If your task spans multiple categories, read all relevant files. The references contain critical details (e.g., specialized tables, anti-patterns) that aren't covered in this overview β guessing table names or query patterns leads to subtle bugs.
from dune_client.client import DuneClient from dune_client.query import QueryBase import os client = DuneClient(api_key=os.environ['DUNE_API_KEY']) # Execute a query result = client.run_query(query=QueryBase(query_id=123456), performance='medium', ping_frequency=5) print(f"Rows: {len(result.result.rows)}") # Get cached result (no re-execution) result = client.get_latest_result(query_id=123456) # Get/update SQL sql = client.get_query(123456).sql client.update_query(query_id=123456, query_sql="SELECT ...") # Upload CSV data (quick, overwrites existing) client.upload_csv( data="col1,col2\nval1,val2", description="My data", table_name="my_table", is_private=True ) # Create table + insert (supports append) client.create_table( namespace="my_user", table_name="my_table", schema=[{"name": "col1", "type": "varchar"}, {"name": "col2", "type": "double"}], is_private=True ) import io client.insert_data( namespace="my_user", table_name="my_table", data=io.BytesIO(b"col1,col2\nabc,1.5"), content_type="text/csv" )
MethodDescriptionPlanrun_queryExecute saved query (supports {{param}})Freerun_sqlExecute SQL directly (no params)Plus
TableUse CaseVolumedex.tradesPer-pool analysisβ οΈ Inflated ~30% (multi-hop counted multiple times)dex_aggregator.tradesUser/wallet analysisAccurate Why this matters: If you're analyzing a specific wallet's trading activity and use dex.trades, you'll see inflated volume because a single swap through an aggregator gets split into multiple pool-level trades. dex_aggregator.trades captures the user-level intent β one row per user swap. See wallet-analysis.md for full patterns. Solana has no dex_aggregator_solana.trades. Dedupe by tx_id: SELECT tx_id, MAX(amount_usd) as amount_usd FROM dex_solana.trades GROUP BY tx_id
LayerDelayExampleRaw< 1 minethereum.transactions, solana.transactionsDecoded15-60 secuniswap_v3_ethereum.evt_SwapCurated~1 hour+dex.trades, dex_solana.trades Query previous day's data after UTC 12:00 for completeness.
Detailed documentation is organized in the references/ directory: FileDescriptiontable-discovery.mdTable discovery: search tables by name, inspect schema/columns, list schemas and uploadsquery-execution.mdAPI patterns: execute, update, cache, multi-day fetch, credits tracking, subqueriescommon-tables.mdQuick reference of commonly used tables: raw, decoded, curated, community datasql-optimization.mdSQL optimization: CTE, JOIN strategies, array ops, partition pruningwallet-analysis.mdWallet tracking: Solana/EVM queries, multi-chain aggregation, fee analysisdata-upload.mdData upload: CSV/NDJSON upload, create table, insert data, manage tables, credits
Code helpers, APIs, CLIs, browser automation, testing, and developer operations.
Largest current source with strong distribution and engagement signals.