Welcome to Spellbook. Cast a magical incantation to tame the blockchain.
- 
Before contributing: Spellbook accepts selective contributions. To avoid wasted effort, please raise a GitHub issue with the title prefix
[CONTRIBUTION]describing your proposed changes before writing code. The Dune team will review and confirm if we'll accept the contribution.- Exception: Small bug fixes can be submitted directly as PRs without prior approval.
 - Priority: PRs from Dune enterprise customers receive priority review.
 
PRs from contributors who aren't customers are accepted on a case by case basis, depending on whether datasets benefit the broader community (as an example, contributions to
dex.tradesare welcome) - 
Questions about how Spellbook works? Check the docs directory.
 - 
Spellbook uses sub-projects to organize different datasets (dex, nft, solana, etc.).
 - 
Setup: Follow dev environment setup to get started with dbt locally.
 - 
Questions? Join #spellbook on Discord.
 - 
Your spellbook contributions are your own IP. See Contributor License Agreement for details.
 
- Introduction
 - Sub-projects
 - How to contribute
 - Setting up your dev environment
 - Using dbt to write spells
 
Spellbook is Dune's interpretation layer, transforming raw blockchain data into clean, usable datasets. It's a dbt project where each model is a SQL query that handles dependencies and builds tables from raw and decoded tables.
While historically community-driven, Spellbook now accepts selective contributions. The docs directory contains design principles and best practices for contributors.
Spellbook is organized into multiple dbt sub-projects within dbt_subprojects/:
daily_spellbook- Default location for new spells, refreshed daily. Project-specific, standalone spells.hourly_spellbook- Promoted spells with more frequent refreshes. Requires Dune team approval.dex- DEX and DEX aggregator spells, includingdex.trades.nft- NFT-related spells.solana- Solana-specific spells.tokens- Token metadata, transfers, and balances.
See this discussion for more details.
Before writing code, please create a GitHub issue with the title prefix [CONTRIBUTION] describing your proposed changes. Include:
- High-level description of what you want to add/change
 - Which sub-project(s) it affects (dex, nft, etc.)
 - Why it would benefit the community
 
The Dune team will review and respond with whether we'll accept the contribution. This saves you from investing time in code that may not be merged.
Exception: Bug fixes can be submitted directly as PRs without prior approval. When reporting bugs, include:
- Link to block explorer showing expected value
 - Dune query showing incorrect value
 - Scale of impact (number of rows, affected USD volume)
 
Priority: Dune enterprise customers receive priority review.
Once you submit a PR, our CI pipeline tests it against Dune's engine. Query your test data using:
test_schema.git_dunesql_{{commit_hash}}_{{table_name}}
Find exact table names in the dbt slim ci action logs under dbt run initial model(s).
Test tables exist for ~24 hours. If your table doesn't exist, trigger the pipeline to run again.
Join #spellbook on Discord for help.
Prerequisites:
- Fork and clone the repo (GitHub guide)
 - Python 3.9+ (installation guide)
 - pip and pipenv
 - Windows users: Set 
git config --global core.autocrlf truefor unix line endings 
Initial Installation:
Navigate to the spellbook repo in your CLI:
cd user/directory/github/spellbook
# Change this to wherever spellbook is stored locally on your machine.Run the install command to create a pipenv:
pipenv installIf the install fails due to Python version mismatch, check your version with python --version, then update the Python version in the Pipfile to match (must be at least 3.9). Run pipenv install again.
Activate the virtual environment:
pipenv shellNavigate to the appropriate sub-project:
cd dbt_subprojects/<subproject_name>/Each subproject has its own dbt project file with varying configs. Run the following commands:
dbt clean # cleans up the project
dbt deps # pull the dependencies
dbt compiledbt compile converts JINJA/SQL templates into plain SQL in the target/ folder, which you can test on dune.com.
Each subproject includes a profiles.yml file that tells dbt how to run commands. You must be in the subproject root directory to run dbt compile correctly.
Key concepts:
- Refs: Reference other dbt models using 
{{ ref('model_name') }}(use filename without .sql) - Sources: Reference raw data using 
{{ source('schema', 'table') }} - Tests: Add 
uniqueandnot_nulltests to primary keys inschema.ymlfiles - Descriptions: Document tables and columns in 
schema.ymlto help others 
Example schema.yml:
models:
  - name: 1inch_ethereum
    description: "Trades on 1inch, a DEX aggregator"
    columns:
      - name: tx_hash
        description: "Table primary key"
        data_tests:
          - unique
          - not_null
sources:
  - name: ethereum
    freshness:
      warn_after: { count: 12, period: hour }
    tables:
      - name: tracesdbt Resources:

