diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..485dee64 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea diff --git a/README.md b/README.md index e5f4cf43..e261e6f0 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Once the pull request is merged, the changes will be automatically published to ### Adding New Pages -To add a new page to the documentation, create a new .mdx file in the folder where you want the page to be. Then, add the following to the `mint.json` file: +To add a new page to the documentation, create a new .mdx file in the folder where you want the page to be. Then, add the following to the `docs.json` file: ```json { diff --git a/go-openapi.json b/analytics-openapi.json similarity index 92% rename from go-openapi.json rename to analytics-openapi.json index dffbf5a5..017a4ebd 100644 --- a/go-openapi.json +++ b/analytics-openapi.json @@ -3767,7 +3767,7 @@ { "name": "performance", "in": "query", - "description": "The performance engine tier the execution will be run on. Can be either `medium` or `large`. Medium consumes 10 credits, and large consumes 20 credits, per run. Default is `medium`.", + "description": "The performance engine tier the execution will be run on. Can be either `medium` or `large`. Credits are consumed based on actual compute resources used. Medium is the default, large provides more resources for complex queries.", "schema": { "type": "string", "enum": [ @@ -4155,6 +4155,115 @@ } } }, + "/v1/sql/execute": { + "post": { + "summary": "Execute raw SQL query", + "description": "Execute raw SQL query without requiring a stored query ID", + "parameters": [ + { + "name": "X-Dune-Api-Key", + "in": "header", + "description": "API Key for the service", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "api_key", + "in": "query", + "description": "Alternative to using the X-Dune-Api-Key header", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "SQL query and performance configuration", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.ExecuteSQLRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.ExecuteQueryResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error400" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error401" + } + } + } + }, + "402": { + "description": "Payment Required", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error402" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error403" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error404" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error500" + } + } + } + } + }, + "x-codegen-request-body-name": "sql" + } + }, "/v1/table/upload/csv": { "post": { "summary": "Upload CSV", @@ -4234,6 +4343,91 @@ "x-codegen-request-body-name": "payload" } }, + "/v1/tables": { + "get": { + "summary": "List all tables owned by the account tied to the API key", + "description": "List all tables owned by the account tied to the API key", + "parameters": [ + { + "name": "X-Dune-Api-Key", + "in": "header", + "description": "API Key for the service", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "api_key", + "in": "query", + "description": "API Key, alternative to using the HTTP header X-Dune-Api-Key", + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Number of tables to return on a page. Default: 50, max: 10000", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "offset", + "in": "query", + "description": "Offset used for pagination. Negative values are treated as 0", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.TableListResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error400" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error401" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error500" + } + } + } + } + } + } + }, "/v1/tables/create": { "post": { "summary": "TableCreate is the /v1/table endpoint which creates an empty table.", @@ -4791,6 +4985,95 @@ } } } + }, + "/v1/usage": { + "post": { + "summary": "Get Usage Data", + "description": "Get usage data for the authenticated customer including private queries, dashboards,\nbytes used/allowed, and billing periods", + "parameters": [ + { + "name": "X-Dune-Api-Key", + "in": "header", + "description": "API Key for the service", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "api_key", + "in": "query", + "description": "API Key, alternative to using the HTTP header X-Dune-Api-Key", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "Request payload with optional start_date and end_date", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.GetUsageRequest" + } + } + }, + "required": false + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.GetUsageResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error400" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error401" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error403" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error500" + } + } + } + } + }, + "x-codegen-request-body-name": "payload" + } } }, "components": { @@ -4899,6 +5182,9 @@ "cron_expression": { "type": "string" }, + "expires_at": { + "type": "string" + }, "is_private": { "type": "boolean" }, @@ -4929,6 +5215,27 @@ } } }, + "models.BillingPeriod": { + "type": "object", + "properties": { + "credits_included": { + "type": "number", + "description": "Float value" + }, + "credits_used": { + "type": "number", + "description": "Float value" + }, + "end_date": { + "type": "string", + "description": "YYYY-MM-DD format" + }, + "start_date": { + "type": "string", + "description": "YYYY-MM-DD format" + } + } + }, "models.CSVUploadRequest": { "type": "object", "properties": { @@ -5100,6 +5407,23 @@ } } }, + "models.ExecuteSQLRequest": { + "type": "object", + "required": ["sql"], + "properties": { + "sql": { + "type": "string", + "description": "The SQL query to execute", + "example": "SELECT * FROM dex.trades WHERE block_time > now() - interval '1' day LIMIT 10" + }, + "performance": { + "type": "string", + "description": "The performance engine tier the execution will be run on. Can be either `medium` or `large`. Medium consumes 10 credits, and large consumes 20 credits, per run. Default is `medium`.", + "enum": ["medium", "large"], + "default": "medium" + } + } + }, "models.ExecutionResultMetadata": { "type": "object", "properties": { @@ -5172,6 +5496,19 @@ "description": "Timestamp of when the query execution was cancelled, if applicable.", "example": "2024-12-20T11:04:18.724658237Z" }, + "error": { + "type": "object", + "description": "In case the execution had an error, this object will contain the error details", + "allOf": [ + { + "$ref": "#/components/schemas/models.QueryResultError" + } + ] + }, + "execution_cost_credits": { + "type": "number", + "description": "Cost of the execution" + }, "execution_ended_at": { "type": "string", "description": "Timestamp of when the query execution ended.", @@ -5306,6 +5643,42 @@ } } }, + "models.GetUsageRequest": { + "type": "object", + "properties": { + "end_date": { + "type": "string", + "description": "Optional field in YYYY-MM-DD format" + }, + "start_date": { + "type": "string", + "description": "Optional field in YYYY-MM-DD format" + } + } + }, + "models.GetUsageResponse": { + "type": "object", + "properties": { + "billing_periods": { + "type": "array", + "items": { + "$ref": "#/components/schemas/models.BillingPeriod" + } + }, + "bytes_allowed": { + "type": "integer" + }, + "bytes_used": { + "type": "integer" + }, + "private_dashboards": { + "type": "integer" + }, + "private_queries": { + "type": "integer" + } + } + }, "models.Parameter": { "type": "object", "properties": { @@ -5362,6 +5735,34 @@ "items": { "$ref": "#/components/schemas/models.Row" } + }, + "update_type": { + "type": "string", + "description": "The type of update operation from Trino (e.g., \"SET SESSION\")" + } + } + }, + "models.QueryResultError": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "A descriptive message about the error.", + "example": "Error: Line 1:1: mismatched input 'selecdt'" + }, + "metadata": { + "type": "object", + "description": "Metadata about the syntax error that occurred, if applicable.", + "allOf": [ + { + "$ref": "#/components/schemas/models.SyntaxErrorMetadata" + } + ] + }, + "type": { + "type": "string", + "description": "The type of error that occurred.", + "example": "syntax_error" } } }, @@ -5373,6 +5774,15 @@ "description": "Timestamp of when the query execution was cancelled, if applicable.", "example": "2024-12-20T11:04:18.724658237Z" }, + "error": { + "type": "object", + "description": "In case the execution had an error, this object will contain the error details", + "allOf": [ + { + "$ref": "#/components/schemas/models.QueryResultError" + } + ] + }, "execution_ended_at": { "type": "string", "description": "Timestamp of when the query execution ended.", @@ -5440,6 +5850,21 @@ "type": "object" } }, + "models.SyntaxErrorMetadata": { + "type": "object", + "properties": { + "column": { + "type": "integer", + "description": "The column number at which the syntax error occurred.", + "example": 73 + }, + "line": { + "type": "integer", + "description": "The line number at which the syntax error occurred in the query.", + "example": 10 + } + } + }, "models.TableClearResponse": { "type": "object", "properties": { @@ -5459,12 +5884,35 @@ }, "type": { "type": "array", + "description": "ColumnType is a json.RawMessage so that we can support objects like Array and Struct.", "items": { "type": "integer" } } } }, + "models.TableColumnInfo": { + "type": "object", + "properties": { + "metadata": { + "type": "object", + "additionalProperties": true, + "description": "Additional column metadata" + }, + "name": { + "type": "string", + "description": "Column name" + }, + "nullable": { + "type": "boolean", + "description": "Whether the column can contain null values" + }, + "type": { + "type": "string", + "description": "Column data type" + } + } + }, "models.TableCreateResponse": { "type": "object", "properties": { @@ -5496,6 +5944,79 @@ } } }, + "models.TableListElement": { + "type": "object", + "properties": { + "columns": { + "type": "array", + "description": "List of table columns", + "items": { + "$ref": "#/components/schemas/models.TableColumnInfo" + } + }, + "created_at": { + "type": "string", + "description": "ISO 8601 timestamp of table creation" + }, + "full_name": { + "type": "string", + "description": "Fully qualified table name (catalog.schema.table)" + }, + "is_private": { + "type": "boolean", + "description": "Whether the table is private" + }, + "owner": { + "type": "object", + "description": "Owner information", + "allOf": [ + { + "$ref": "#/components/schemas/models.TableOwner" + } + ] + }, + "purged_at": { + "type": "string", + "description": "ISO 8601 timestamp of when table was purged" + }, + "table_size_bytes": { + "type": "string", + "description": "Size of the table in bytes" + }, + "updated_at": { + "type": "string", + "description": "ISO 8601 timestamp of last update" + } + } + }, + "models.TableListResponse": { + "type": "object", + "properties": { + "next_offset": { + "type": "integer", + "description": "Offset for next page of results" + }, + "tables": { + "type": "array", + "items": { + "$ref": "#/components/schemas/models.TableListElement" + } + } + } + }, + "models.TableOwner": { + "type": "object", + "properties": { + "handle": { + "type": "string", + "description": "User or team identifier" + }, + "type": { + "type": "string", + "description": "Type of entity that created the table" + } + } + }, "models.UpdateQueryResponse": { "type": "object", "properties": { diff --git a/api-reference/custom/overview.mdx b/api-reference/custom/overview.mdx deleted file mode 100644 index 30d7abd8..00000000 --- a/api-reference/custom/overview.mdx +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: Custom Endpoints -sidebarTitle: Overview -description: Create custom API endpoints from Dune queries -icon: star ---- - -Custom Endpoints allow developers to create and manage API endpoints from Dune queries. By selecting a query and scheduling it to run at a specified frequency, developers can call a custom URL to consume data. This flexible alternative to [Preset Endpoints](.././overview/introduction#preset-endpoints) provides greater customization without the complexities of [SQL Endpoints](.././overview/introduction#sql-endpoints). - -## How to Create a Custom Endpoint - -
- -

- - ### Why Dune? diff --git a/images/data-transformations-dune.png b/images/data-transformations-dune.png new file mode 100644 index 00000000..96ea4802 Binary files /dev/null and b/images/data-transformations-dune.png differ diff --git a/images/trino-presto-connector/.DS_Store b/images/trino-presto-connector/.DS_Store new file mode 100644 index 00000000..a5c4fd4f Binary files /dev/null and b/images/trino-presto-connector/.DS_Store differ diff --git a/images/trino-presto-connector/dbeaver-1.png b/images/trino-presto-connector/dbeaver-1.png new file mode 100644 index 00000000..1d69a0e0 Binary files /dev/null and b/images/trino-presto-connector/dbeaver-1.png differ diff --git a/images/trino-presto-connector/dbeaver-2.png b/images/trino-presto-connector/dbeaver-2.png new file mode 100644 index 00000000..050ef22a Binary files /dev/null and b/images/trino-presto-connector/dbeaver-2.png differ diff --git a/images/trino-presto-connector/dbeaver-3.png b/images/trino-presto-connector/dbeaver-3.png new file mode 100644 index 00000000..3e9676b6 Binary files /dev/null and b/images/trino-presto-connector/dbeaver-3.png differ diff --git a/images/trino-presto-connector/hex-1.png b/images/trino-presto-connector/hex-1.png new file mode 100644 index 00000000..fdf25ea1 Binary files /dev/null and b/images/trino-presto-connector/hex-1.png differ diff --git a/images/trino-presto-connector/hex-2.png b/images/trino-presto-connector/hex-2.png new file mode 100644 index 00000000..42adee9b Binary files /dev/null and b/images/trino-presto-connector/hex-2.png differ diff --git a/images/trino-presto-connector/hex-3.png b/images/trino-presto-connector/hex-3.png new file mode 100644 index 00000000..6da80934 Binary files /dev/null and b/images/trino-presto-connector/hex-3.png differ diff --git a/images/trino-presto-connector/hex-4.png b/images/trino-presto-connector/hex-4.png new file mode 100644 index 00000000..1ba101ea Binary files /dev/null and b/images/trino-presto-connector/hex-4.png differ diff --git a/images/trino-presto-connector/metabase-1.png b/images/trino-presto-connector/metabase-1.png new file mode 100644 index 00000000..7ad83a2d Binary files /dev/null and b/images/trino-presto-connector/metabase-1.png differ diff --git a/images/trino-presto-connector/metabase-2.png b/images/trino-presto-connector/metabase-2.png new file mode 100644 index 00000000..c78f07fc Binary files /dev/null and b/images/trino-presto-connector/metabase-2.png differ diff --git a/images/trino-presto-connector/metabase-3.png b/images/trino-presto-connector/metabase-3.png new file mode 100644 index 00000000..7f4f94d8 Binary files /dev/null and b/images/trino-presto-connector/metabase-3.png differ diff --git a/images/trino-presto-connector/trino - dark.png b/images/trino-presto-connector/trino - dark.png new file mode 100644 index 00000000..cfd1079f Binary files /dev/null and b/images/trino-presto-connector/trino - dark.png differ diff --git a/images/trino-presto-connector/trino - light.png b/images/trino-presto-connector/trino - light.png new file mode 100644 index 00000000..d86d1170 Binary files /dev/null and b/images/trino-presto-connector/trino - light.png differ diff --git a/learning/how-tos/create-and-manage-teams.mdx b/learning/how-tos/create-and-manage-teams.mdx index 64d24f02..3c7774d6 100644 --- a/learning/how-tos/create-and-manage-teams.mdx +++ b/learning/how-tos/create-and-manage-teams.mdx @@ -112,7 +112,7 @@ To add members later, select **“Invite Members”** from the **“+ Create”* ## Managing Subscriptions Manage your team's subscriptions and settings by navigating to the **team account settings page**, where you can: - **Modify Your Plan:** Change your subscription plan or opt for annual billing to save costs. -- **View Usage Statistics:** Check your usage of credits, CSV uploads, and private content quotas. +- **View Usage Statistics:** Check your usage of credits, CSV uploads, and private content quotas. You can also [export detailed credit usage data](https://docs.dune.com/learning/how-tos/credit-system-on-dune#export-credit-usage-data) for deeper analysis and optimization. - **Manage Additional Credits:** If you need more credits than your plan provides, adjust the **“Limit extra credits”** field to set a maximum dollar amount for additional purchases. *The default limit is $0 to prevent unexpected charges.* diff --git a/learning/how-tos/credit-system-on-dune.mdx b/learning/how-tos/credit-system-on-dune.mdx index ed1e078f..1490f3b0 100644 --- a/learning/how-tos/credit-system-on-dune.mdx +++ b/learning/how-tos/credit-system-on-dune.mdx @@ -34,7 +34,7 @@ Credits power your work on Dune, and here's how they're typically used: Running and creating queries consumes credits, with the amount varying based on complexity. - Larger tasks need more powerful engines, increasing credit usage, which we detail upfront. + Larger tasks consume more computational resources, which increases credit usage based on actual compute used. Refreshing dashboards or widgets consumes credits; exact numbers are displayed contextually. @@ -63,4 +63,51 @@ Go to **Settings** → **Subscriptions** for a deeper dive into your credit usag ### Handling Excess Usage Exceeding your monthly allocation? Here's how to handle it: 1. Add a payment method to your account to use additional credits at a fee above your included limit. -2. Set a cap in the **limit extra credits** field to keep your spending in check. \ No newline at end of file +2. Set a cap in the **limit extra credits** field to keep your spending in check. + +### 📊 Export Credit Usage Data +Teams and users can export detailed credit usage metrics to analyze consumption patterns and optimize their Dune usage. + +#### How to Export Usage Data +1. Navigate to your team's usage dashboard +2. Click the **"Export usage"** button +3. Your team's last 30 days of usage data will be downloaded as a CSV file + +#### Understanding the Exported Data +The exported CSV file contains comprehensive usage information with the following columns: + +| Column | Description | +|--------|-------------| +| timestamp | The exact date and time when the credit was consumed | +| user_id | Unique identifier for the user who consumed the credits | +| user_name | Display name of the user | +| service | The Dune service that consumed credits (e.g., query execution, API calls) | +| record_type | Type of usage record | +| credit_cost | Number of credits consumed for this action | +| plan | Your team's current subscription plan | +| skipped_quota_enforcement | Indicates if quota limits were bypassed (true/false) | +| query_id | Unique identifier for queries (when applicable) | +| metadata | Additional contextual information about the usage | + +#### Use Cases for Exported Data +The exported usage data enables teams to: + +• **Track individual user consumption:** Identify which team members are using the most credits +• **Analyze service usage patterns:** Understand which Dune services consume the most credits +• **Budget planning:** Use historical data to forecast future credit needs +• **Optimize queries:** Identify expensive queries using the query_id field +• **Compliance and reporting:** Generate usage reports for internal auditing +• **Cost allocation:** Distribute costs across different teams or projects based on actual usage + +#### Data Analysis Tips +• Import the CSV into spreadsheet software or data analysis tools +• Create pivot tables to summarize usage by user, service, or time period +• Use the timestamp field to analyze usage patterns over time +• Filter by query_id to identify and optimize resource-intensive queries +• Monitor the credit_cost column to track spending trends + +#### Important Notes +• The export includes the last 30 days of data +• All timestamps are in UTC +• Credit costs reflect your team's pricing plan at the time of usage +• The metadata field may contain additional JSON-formatted information depending on the service \ No newline at end of file diff --git a/learning/how-tos/credit-system.mdx b/learning/how-tos/credit-system.mdx new file mode 100644 index 00000000..4dd74a61 --- /dev/null +++ b/learning/how-tos/credit-system.mdx @@ -0,0 +1,145 @@ +--- +title: "Credit System" +description: "How Dune's usage-based credit system works for fair and flexible querying" +icon: "coins" +--- + +# How you spend credits on Dune + +Dune uses a usage-based credit system that charges based on actual compute resources consumed, ensuring fair pricing for all users regardless of query complexity. + +See full blog post announcement [here](https://dune.com/blog/credits-changing) + +## How the Credit System Works + +Our query engine uses a flexible credit-based pricing model that scales with your actual resource consumption. When you run a query, credits are spent in proportion to the resources used—simple queries cost fewer credits, while complex queries that require more computational resources use more credits. + +This approach ensures fair pricing across our platform, which spans over 100 chains, complex tables, and multiple ways to consume data through APIs and various connector options. The credit system adapts to your needs: small, efficient queries are economical, while larger, more complex queries can leverage extended timeouts and additional resources as needed. + +Your credits work seamlessly across all query types and data consumption methods, providing transparent and predictable pricing that scales with your usage. + +**Key benefits:** + +- **Usage-based** – Pay in proportion to actual consumption +- **Efficiency** – Incentives to write cleaner, optimized queries +- **Scalable** – Sustainable future support for larger workloads with longer timeouts and expanded connector options to come in the near future + +This fair, usage-based model ensures Dune can keep pace with your most ambitious data needs. + +## Credit Pricing + +Credits are consumed based on the actual compute resources used for each query execution. The more complex your query, the more credits it consumes, but simple queries cost significantly less. At the moment, we don't share a single, per-query formula because credit usage depends on real-time factors (the compute your query actually uses, the engine you choose, and current network/data access conditions. + +To stay in full control, you can set: +- a global query cost cap (per-execution ceiling). More info on how to do this [here](https://app.arcade.software/share/C60r4u7ESOp5RXRuzbSN). +- a monthly extra credit limit (account-level ceiling). +These controls ensure you never exceed what you're comfortable spending per run or per month. Learn how to set this up [here](https://app.arcade.software/share/so8QGM4H4MU0OWRWhNe9). + +**Credit Pricing = Extra Credit Pricing** +Extra credits are charged at the same rate as your plan. The price per 100 credits shown for each plan is what you pay for any usage beyond your included credits, keeping things simple and transparent. + + +**Quick Plan Reference** + +| Plan | Monthly Price | Annual Price | Credits/Month | Cost per 100 Credits | +|------|---------------|--------------|---------------|---------------------| +| **Free** | Free | - | 2,500 | $5.00 | +| **Analyst** | $75/month | - | 4,000 | $1.875 | +| **Analyst (Annual)** | $65/month billed annually | $780/year | 4,000 | $1.625 | +| **Plus** | $399/month | - | 25,000 | $1.596 | +| **Plus (Annual)** | $349/month billed annually | $4,188/year | 25,000 | $1.396 | +| **Legacy Premium** | Deprecated - Existing customers only | - | Varies | [Contact support](mailto:support@dune.com) | +| **Enterprise** | Favorable Custom Pricing | - | Custom | **Favorable rates** - [Contact sales](https://dune.com/enterprise) | + + +**Save with Enterprise Pricing**: Enterprise plans receive **significantly lower per-credit rates** compared to standard plans, plus customized support and tailored solutions. Whether you're scaling up or just getting started, [contact our sales team](https://dune.com/enterprise) to discuss custom pricing that fits your needs. + + + +**Legacy Premium**: This plan has been deprecated and is no longer available for new subscriptions. Existing Premium customers can continue to use their plan. + + + +Explore the complete pricing plan with credit limits and features for each tier: [dune.com/pricing](https://dune.com/pricing) + + +## Managing Your Credit Usage + +- **Review your usage.** Check your query volume and costs regularly to stay informed about your credit consumption. +- **Optimize your queries.** Efficient queries save credits and run faster. See [here](https://docs.dune.com/query-engine/writing-efficient-queries) for tips. +- **Pick the plan that fits.** If you anticipate heavy usage or notice extra credits usage, consider upgrading to Enterprise for **significantly lower per-credit rates**. Contact our sales team at [dune.com/enterprise](http://dune.com/enterprise) to discuss custom pricing and tailored solutions for your needs. +- **Cap your query costs.** Control spending by setting a maximum credit limit for individual queries. More info on how to do this [here](https://app.arcade.software/share/C60r4u7ESOp5RXRuzbSN). +- **Set extra credit limits.** Configure your extra credit spending limits to control costs. Learn how to set this up [here](https://app.arcade.software/share/so8QGM4H4MU0OWRWhNe9). + + +## Need Help? + +Have questions or need additional support? [Contact Us](mailto:support@dune.com) + +## FAQ + +### Pricing & Plans + + + + Dune uses a usage-based credit system that charges based on actual compute resources consumed. This ensures fair pricing where lightweight queries cost less and complex queries cost more based on their actual resource requirements, providing everyone with a fair and flexible experience. + + + + Yes. The Free plan includes **2,500 credits per month at no cost**. With the usage-based system, credits are consumed based on actual query resources. Small, efficient queries use fewer credits, allowing you to run more queries within your monthly allowance. Larger or more complex queries will use credits more quickly. If you consistently need more capacity, you can upgrade to a paid plan anytime. + + + + Yes, but you will be limited to the Small and Medium engine. If you often hit timeout limits, consider the Analyst or Plus plans. + + + + Credits are based on the actual compute effort measured in CPU-seconds and network resources a query consumes. This means lightweight queries cost fewer credits, while complex, resource-intensive operations require more credits. + +At the moment, we don't share a single, per-query formula because credit usage depends on real-time factors (the compute your query actually uses, the engine you choose, and current network/data access conditions). + +In practice: +Credits scale with compute used. Heavier queries consume more credits; lighter ones consume fewer. +Engine matters. Large runs complex queries fastest and therefore consumes credits at a higher rate than Medium; Small prioritizes queue time over speed and is most efficient for simple jobs. + +To stay in full control, you can set: +a global query cost cap (per-execution ceiling), and +a monthly extra credit limit (account-level ceiling). + + + + Cost will depend on compute used by those API queries. You can check the usage dashboard in Settings to track API-specific consumption. + + + +### Usage & Monitoring + + + + The usage and billing dashboard shows credits used, extra credits, and historical usage. + + + + You'll see costs after execution. + + + + Yes more complex queries and higher data volumes with longer timeouts for Enterprise clients. + + + +### Optimization & Support + + + + Write efficient SQL, limit unnecessary joins or scans, and reuse results when possible. Our docs include [query optimization tips](https://docs.dune.com/query-engine/writing-efficient-queries). + + + + You can upgrade to a higher plan or contact our sales team to discuss a custom Enterprise solution. + + + + Reach out to support@dune.com or your Dune account manager for Enterprise plans. + + diff --git a/learning/how-tos/dune-frames.mdx b/learning/how-tos/dune-frames.mdx index b5da17b5..c46ec30a 100644 --- a/learning/how-tos/dune-frames.mdx +++ b/learning/how-tos/dune-frames.mdx @@ -17,7 +17,7 @@ This guide provides a step-by-step process on using typescript and Dune API to c [Fork this repo](https://github.com/andrewhong5297/dune-frames) and then run `npm install -g frog` and `npm install` to get all your packages. If you don't have npm set up, then [go download node js first](https://nodejs.org/en/download). Once installations are finished, try running `npm run dev` and it should take you to a localhost environment at http://localhost:5173/api. -Next, you'll need to get a Dune API key from [your user settings](https://dune.com/settings/api) and set it in an `.env` file. With that done, you'll be able to run the frame - click "See From Your Followers" in your localhost environment. +Next, you'll need to get a Dune API key from [your user settings](https://dune.com/settings/api) and export it. With that done, you'll be able to run the frame - click "See From Your Followers" in your localhost environment. ## Explaining the Dune API function diff --git a/learning/how-tos/export-data-out.mdx b/learning/how-tos/export-data-out.mdx index e4b18011..098b54df 100644 --- a/learning/how-tos/export-data-out.mdx +++ b/learning/how-tos/export-data-out.mdx @@ -13,7 +13,7 @@ You can export data from Dune using two primary methods. Each offers different c ## Understanding Credit Usage for Data Export Before you start exporting data from Dune, it's essential to understand how credits are consumed during the export process. Each export action, whether through CSV downloads or the API, deducts credits from your account based on the amount of data and the method used. -For a comprehensive overview of how credits work in Dune, please refer to our [detailed guide on the credit system](https://docs.dune.com/learning/how-tos/credit-system-on-dune) +For a comprehensive overview of how credits work in Dune, please refer to our [detailed guide on the credit system](https://docs.dune.com/learning/how-tos/credit-system-on-dune). Teams can also [export detailed credit usage data](https://docs.dune.com/learning/how-tos/credit-system-on-dune#export-credit-usage-data) to analyze consumption patterns and optimize their usage. ### Costs for Exporting Data: - **CSV Exports:** Available **only** to users on [Plus and Premium plans](https://dune.com/pricing). Each CSV file download will deduct credits depending on the size and complexity of the data extracted: @@ -103,15 +103,14 @@ Ensure you have an API key. If not, generate one: For this guide, we'll focus on exporting data using the ['get latest query result'](/api-reference/executions/endpoint/get-query-result) endpoint. Here's a Python example: - First, create a .env file with the API key you just created. + First, make sure you have an enviroment with the API key you just created. - ``` - DUNE_API_KEY= + ```bash + DUNE_API_KEY= ``` ```py -import dotenv import os import json import requests @@ -129,7 +128,6 @@ def get_latest_query_result(query_id): print(f"Error retrieving result for query {query_id}: {e}") return res_df -dotenv.load_dotenv('path_to_env_file') # Replace 'path_to_env_file' with your .env file path api_key = os.getenv("DUNE_API_KEY") query_id = 2945343 headers = {"x-dune-api-key": api_key} diff --git a/learning/how-tos/navigate-query-editor.mdx b/learning/how-tos/navigate-query-editor.mdx index b147cce0..bf5d1981 100644 --- a/learning/how-tos/navigate-query-editor.mdx +++ b/learning/how-tos/navigate-query-editor.mdx @@ -1,6 +1,6 @@ --- title: Navigate the Query Editor -description: How to navgigate the query editor +description: How to navigate the query editor --- In this guide, we'll provide an overview of the Dune Query Editor and its features. diff --git a/learning/how-tos/pricing-faqs.mdx b/learning/how-tos/pricing-faqs.mdx new file mode 100644 index 00000000..461c3d76 --- /dev/null +++ b/learning/how-tos/pricing-faqs.mdx @@ -0,0 +1,249 @@ +--- +title: "Pricing FAQs" +description: "Frequently asked questions about Dune's pricing, credits, billing, and plans" +icon: "circle-question" +--- + +# Pricing FAQs + +Find answers to common questions about Dune's pricing, credits, billing cycles, and subscription plans. + +## General Questions + + + + Your billing history can be found under "Billing" in your Subscription Settings. Follow the steps below for a complete view: + + 1. Go to dune.com + 2. Sign in to your Dune account + 3. Click your avatar in the middle of the top bar where your user or team badge is + 4. Click the Settings icon and then "Subscription" + + + + Upgrading to a new paid tier resets your billing cycle start date. On the date of your upgrade, you will be billed the full new plan price and refunded a prorated amount corresponding to the number of unused days of your current plan. If you upgrade from Analyst to Plus on day 15 of your billing cycle, you will be billed a month of Plus minus 15 days of Analyst (roughly half the monthly Analyst cost). + + Downgrades to lower tiers are applied at the end of your billing cycle. Benefits from your current tier remain until the end of your billing cycle. At the end of your billing cycle, you will automatically be downgraded to the lower tier of your choice. + + + + Only administrators of teams with paid plans can change team subscriptions. To change your team's subscription: + + 1. Go to dune.com + 2. Sign in to your Dune account + 3. Click your avatar in the middle of the top bar where your team badge is + 4. Click the Settings icon and then "Subscription" + 5. Click the plan you want to upgrade or downgrade to + + To cancel your subscription, follow these steps: + 1. Go to dune.com + 2. Sign in to your Dune account + 3. Click your avatar in the middle of the top bar where your user or team badge is + 4. Click the Settings icon and then "Subscription" + 5. Change your plan to Free + + Your subscription will remain active for 30 days after your last payment. + + + + If you are a single user with higher requirements than what's offered in the free tier, you can create a team of one to access paid tiers. Note that we hope to change this in the future, so individuals don't need to create a plan to upgrade. + + + + For general info on how to use Dune, please see our [docs](https://docs.dune.com). For specific questions on how to do a query, please join our [Discord](https://discord.com/invite/dunecom). If you have other issues or questions not listed on this page, please contact support@dune.com. + + + +## Credits and Spending + + + + Credits are the measurement unit for usage on Dune. They provide flexibility across query performance, programmatic executions, and API exports. Credits are consumed proportionally to the actual compute resources your queries use—simple queries cost fewer credits while complex ones use more. + + + + To view your credit usage and balance go to Settings and select Subscription; here you will see used and remaining credits. + + + + Annual billing enables customers to pay for their plan yearly at a reduced rate. Customers on this plan will still have their credits reset on a monthly basis, as well as receive monthly charges for any potential extra credits incurred. + + + + Credit usage is determined by the actual compute resources your queries consume. Your credit consumption directly reflects each query's complexity and resource requirements. + + **Query Execution (App & API)** + - Credits are charged based on CPU-seconds and network resources used + - Simple, efficient queries use fewer credits + - Complex queries with large data scans require more credits + - Queries cost the same whether executed manually or programmatically + + **API Export** + - Free and Analyst: 1 credit = 1,000 data points + - Plus: 1 credit = 5,000 data points + - Premium (legacy): 1 credit = 25,000 data points + + + + There are several ways to control and optimize your credit consumption: + + **Monitor Your Usage** + - Check the usage tab regularly to track your credit consumption patterns + - Review which queries and users consume the most credits + - Set extra credit limits to control how many additional credits can be purchased beyond your plan's included amount + + **Control Spending** + - Set query cost caps in Settings to limit the maximum credits any single query can consume + - Configure team-level caps to prevent accidental high-usage queries + - Use these caps while testing new queries or during development + + **Optimize Your Queries** + - Write efficient SQL to dramatically reduce credit consumption + - Review our [query optimization guide](https://docs.dune.com/query-engine/writing-efficient-queries) for specific techniques + + + + Once your monthly credit quota runs out, we'll continue to bill you for additional credits at your plan's extra credit rate. There's no separate "extra credit pricing", you pay the same rate per 100 credits as shown for your plan: + + - Free: $5.00 per 100 credits + - Analyst: $1.875 per 100 credits (monthly) / $1.625 per 100 credits (annual) + - Plus: $1.596 per 100 credits (monthly) / $1.396 per 100 credits (annual) + - Premium (legacy): $0.999 per 100 credits (monthly) / $0.849 per 100 credits (annual) + - Enterprise: Custom pricing per your agreement + + You can set query cost caps in Settings to control your credit usage and prevent unexpected charges. + + + + No, once your quota runs out, extra credits will be billed on an ongoing basis as you use Dune. Credits are not available to purchase in bulk once you reach your quota. + + + + Remaining credits at the end of a billing cycle do not rollover to the next month. + + + + Yes, you can pay as you go. Both individuals and teams in the free tier can continue using Dune beyond their 2,500 monthly credits by paying $5.00 per 100 additional credits. This allows you to handle occasional larger workloads without committing to a monthly subscription. If you find yourself consistently purchasing additional credits, consider upgrading to a paid plan for better value, paid plans offer significantly lower per-credit rates and additional features like API access and unlimited concurrent executions. + + + + To limit monthly spend, go to your subscription page in Settings and set the limit to the desired amount. Setting your limit to $0 will prevent additional usage billing. + + + + If you lower your spend limit below your current spending level, you will not be charged any additional fees beyond your new spend limit. However, any usage that has accrued does not rollover and will still be billed based on the previous spend limit. + + + +## Query Engines & Executions + + + + When you manually trigger an execution by pressing Run in the Query Editor, dashboard, or via the API, we accrue that usage to the user or team account. To ensure you are accruing usage in the correct account, view your selected account in the account switcher located in the middle of the top navigation bar on Dune. + + + + We have three different query engine sizes that you can use on Dune, each consuming credits based on actual compute resources used: + + **Small Engine (0 credits to run)** + - Run simple queries manually in the Dune app for free + - Credits consumed from your monthly allowance based on actual usage + - 2-minute timeout limit + - Maximum of three (3) concurrent executions + - No performance guarantees + + **Medium Engine** + - Run queries with a larger timeout, manually or programmatically + - Credits consumed based on actual compute resources used + - No limit on concurrent executions + - Suitable for most standard queries and dashboards + + **Large Engine** + - Optimized for complex workloads requiring more computational power + - Credits consumed based on actual compute resources used (more compute and resource than Medium for the same query) + - Best for data-intensive queries and complex analytics + + The Large engine provides approximately 2x the computational capacity of the Medium engine. While both Medium and Large engines charge based on actual usage, the Large engine will typically consume more credits for the same query due to the additional resources allocated, but will complete faster. The Small engine is limited in capacity and has stricter timeout constraints. + + **Note:** Exact credit consumption varies based on query complexity, data volume scanned, and processing required rather than being a fixed rate per execution. + + + + Programmatic executions are query executions done through the Dune API, scheduled executions, materialized view refreshes, or dashboard runs. Programmatic executions consume credits based on actual compute resources used, just like manual queries. Both manual and programmatic executions are charged based on the complexity and resources required by your query, ensuring consistent and fair pricing across all execution methods. + + + + The Free query engine on Dune is available to anyone at no cost, but it does come with limitations. First, there are no performance or queue priority guarantees, which means executions may take longer to run during times of high demand. Additionally, the Free query engine is limited to manual query editor executions only; automated executions (API, scheduling, refreshing) are not available. Lastly, there is a maximum limit of three (3) ongoing executions (executing or queued) at any given time for Free executions, and executions are timed out at 120 seconds. + + + +## Features + + + + If you add a private query to a public dashboard, other Dune users will be able to see the visualization in the public dashboard, but won't see your code when they click the query. The results table, other visualizations you might have, and the underlying query are all private. + + + + No, you can archive private queries that you no longer need to increase your existing private queries quota. Archived queries are not accessible by anyone else and cannot be run. You can unarchive them later if you change your mind. + + + + Yes, anyone visiting the website with the embed can see the visualization you chose to embed and nothing else. + + + + When logged in to the team on Dune, work you've created will not have watermarks. Public dashboards URLs always have watermarks. + + + +## Teams + + + + Owners of editor seats can create and edit content owned by their team, but they cannot access team management features; those are reserved for admins. Viewers have read-only access to the team's content and can still benefit from their team plan features and quotas. + + + + Yes, team benefits apply to all Dune content, as long as your team is in the correctly selected account which is viewable in the middle of the top navigation bar on Dune. + + + + Quotas are applied to all team usage. + + + + Yes, you can invite as many people as you need into your Dune team at no additional cost. All team members will need a Dune account to collaborate with you. + + + + You can create 1 Free team on Dune. + + + +## API + + + + A datapoint can, in most cases, be thought of as rows * columns with an additional limit of 100 average bytes per cell in a set of results. This can be expressed as: + + `datapoints = max(rows * columns, ceil(total_bytes / 100))` + + + + Yes, we accrue the resulting datapoints returned from every request to your credit quota. + + + + Query executions are identical to those triggered on dune.com. Please note: free executions are not supported via the API. + + + + Yes, the API is included in all Dune plans. This means that all teams and users, including those in the Free plan, can access the API to trigger executions and export data, provided their spend limit has not been exceeded. Please note: credits still apply for API usage, regardless of the plan you are on. + + + + We strongly believe Dune wizards should be credited for their work's impact. We encourage you to credit the wizard, or perhaps to link to the original query. Linking to transparent data sources like Dune is a great way of building trust. + + + diff --git a/learning/how-tos/query-templates.mdx b/learning/how-tos/query-templates.mdx new file mode 100644 index 00000000..384b60e0 --- /dev/null +++ b/learning/how-tos/query-templates.mdx @@ -0,0 +1,123 @@ +--- +title: "Query Templates" +description: "Pre-built query templates to jumpstart your Dune journey with common blockchain analytics patterns" +icon: "template" +--- + +Jump start your Dune journey with our collection of pre-built query templates. These templates let you easily select wallets, tokens, and contracts and track their key actions over time. + + +**Need a specific template?** Don't see what you're looking for? [Request a new template](https://docs.google.com/forms/d/e/1FAIpQLSeDjR0908lRRroCzRHSD9SnBKSS5hox-_AbLJahH7ZmBuf5hA/viewform?usp=header) and we'll consider adding it to our collection. + + +## Tokens + +Track token flows, balances, and holder activity across different token standards. + + + + Track the net flows of an ERC20 token into contracts, over a given time period + + + Track the net flows of top holders (or a list of addresses) for an ERC20 token, over a given time period + + + Track the net flows of an NFT token into contracts, over a given time period + + + Track the net flows of top holders (or a list of addresses) for an NFT token, over a given time period + + + +## Trades + +Monitor trading activity across DEXs and NFT marketplaces. + + + + Track trading volume, price movements, and liquidity patterns for token pairs + + + Monitor NFT trading activity, floor prices, and collection performance + + + +## Contracts + +Analyze smart contract interactions and usage patterns. + + + + Identify new users interacting with a specific smart contract over time + + + Track which new contracts are calling a specific contract + + + Discover which contracts a tracked wallet is calling most frequently + + + +## Farcaster + +Analyze social activity and user behavior on the Farcaster protocol. + + + + Find Farcaster users who hold specific tokens and are gaining social traction + + + Discover which Farcaster channels are gaining popularity and activity + + + Analyze the social network of a specific user to find trending connections + + + +## How to Use Templates + +1. **Click on any template** above to open it in the Dune query editor +2. **Customize the parameters** using the template's input fields: + - **Token Symbol**: Choose the token you want to track + - **Token Contract**: Paste the contract address if the token isn't in our database + - **Blockchain**: Select the blockchain network + - **Time Period**: Set the number of days to analyze + - **Filters**: Adjust minimum thresholds and other parameters +3. **Run the query** to see your results +4. **Save and share** your customized query + +## Template Categories Explained + +### **Tokens** +Perfect for analyzing token economics, holder behavior, and token flows. Use these templates to understand how tokens move between wallets and contracts. + +### **Trades** +Ideal for market analysis, price tracking, and trading pattern identification. Essential for understanding market dynamics and liquidity. + +### **Contracts** +Great for smart contract analytics, user adoption tracking, and protocol interaction analysis. Use these to understand how users interact with specific protocols. + +### **Farcaster** +Designed for social analytics on the Farcaster protocol. Perfect for understanding community dynamics, influencer identification, and social trends. + +## Getting Started + +1. **Choose your category** based on what you want to analyze +2. **Select a template** that matches your use case +3. **Customize the parameters** to fit your specific needs +4. **Run and iterate** to refine your analysis + + +**Pro Tip**: Start with a template and modify it to create your own unique queries. Templates are designed to be building blocks for more complex analysis. + + +## Need Help? + +- **Query Editor Guide**: Learn how to use the Dune query editor effectively +- **Writing Efficient Queries**: Optimize your queries for better performance +- **Data Catalog**: Explore available data sources and tables +- **Community**: Join our Discord for help and inspiration + +--- + +**Don't see what you need?** [Request a new template](https://docs.google.com/forms/d/e/1FAIpQLSeDjR0908lRRroCzRHSD9SnBKSS5hox-_AbLJahH7ZmBuf5hA/viewform?usp=header) and we'll consider adding it to our collection. diff --git a/mint.json b/mint.json index e911ca90..07c4ded1 100644 --- a/mint.json +++ b/mint.json @@ -62,6 +62,15 @@ "url": "catalyst" } ], + "contextual": { + "options": [ + "copy", + "view", + "chatgpt", + "claude", + "perplexity" + ] + }, "navigation": [ { "group": "", @@ -71,6 +80,7 @@ "group": "Jump right in", "pages": [ "learning/how-tos/create-your-first-query", + "learning/how-tos/query-templates", "learning/how-tos/create-new-content", "learning/how-tos/create-your-first-visualization", "learning/how-tos/navigate-query-editor", @@ -78,6 +88,8 @@ "learning/how-tos/export-data-out", "learning/how-tos/create-and-manage-teams", "learning/how-tos/credit-system-on-dune", + "learning/how-tos/credit-system", + "learning/how-tos/pricing-faqs", "learning/how-tos/search-for-content", "learning/how-tos/share-dune-content", "learning/how-tos/share-your-query", @@ -119,7 +131,6 @@ ] }, "web-app/dashboards", - "web-app/dashboard-minting", "web-app/teams", "web-app/dune-ai", "web-app/upload-data", @@ -145,6 +156,7 @@ { "group": "DuneSQL", "pages": [ + "query-engine/dunesql-architecture", "query-engine/writing-efficient-queries", "query-engine/datatypes", "query-engine/reserved-keywords" @@ -157,6 +169,7 @@ "query-engine/Functions-and-operators/index", "query-engine/Functions-and-operators/aggregate", "query-engine/Functions-and-operators/array", + "query-engine/Functions-and-operators/asof-join", "query-engine/Functions-and-operators/base58", "query-engine/Functions-and-operators/binary", "query-engine/Functions-and-operators/bitwise", @@ -1106,6 +1119,35 @@ } ] }, + { + "group": "Flow EVM", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/flow-evm/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/flow-evm/raw/blocks", + "data-catalog/evm/flow-evm/raw/creation-traces", + "data-catalog/evm/flow-evm/raw/logs", + "data-catalog/evm/flow-evm/raw/transactions", + "data-catalog/evm/flow-evm/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/flow-evm/decoded/overview", + "data-catalog/evm/flow-evm/decoded/call-tables", + "data-catalog/evm/flow-evm/decoded/event-logs", + "data-catalog/evm/flow-evm/decoded/contracts", + "data-catalog/evm/flow-evm/decoded/logs-decoded", + "data-catalog/evm/flow-evm/decoded/traces-decoded" + ] + } + ] + }, { "group": "Gnosis", "icon": "database", @@ -1185,14 +1227,37 @@ "pages": [ { "group": "DEX", - "pages": [ - "data-catalog/evm/hemi/curated-data/dex/dex-trades" - ] + "pages": ["data-catalog/evm/hemi/curated-data/dex/dex-trades"] } ] } ] }, + { + "group": "HyperEVM", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/hyperevm/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/hyperevm/raw/blocks", + "data-catalog/evm/hyperevm/raw/logs", + "data-catalog/evm/hyperevm/raw/transactions" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/hyperevm/decoded/overview", + "data-catalog/evm/hyperevm/decoded/event-logs", + "data-catalog/evm/hyperevm/decoded/contracts", + "data-catalog/evm/hyperevm/decoded/logs-decoded" + ] + } + ] + }, { "group": "Ink", "icon": "database", @@ -1457,6 +1522,35 @@ } ] }, + { + "group": "Monad Testnet", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/monad-testnet/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/monad-testnet/raw/blocks", + "data-catalog/evm/monad-testnet/raw/creation-traces", + "data-catalog/evm/monad-testnet/raw/logs", + "data-catalog/evm/monad-testnet/raw/transactions", + "data-catalog/evm/monad-testnet/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/monad-testnet/decoded/overview", + "data-catalog/evm/monad-testnet/decoded/call-tables", + "data-catalog/evm/monad-testnet/decoded/event-logs", + "data-catalog/evm/monad-testnet/decoded/contracts", + "data-catalog/evm/monad-testnet/decoded/logs-decoded", + "data-catalog/evm/monad-testnet/decoded/traces-decoded" + ] + } + ] + }, { "group": "opBNB", "icon": "database", @@ -1591,6 +1685,35 @@ } ] }, + { + "group": "Plasma", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/plasma/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/plasma/raw/blocks", + "data-catalog/evm/plasma/raw/transactions", + "data-catalog/evm/plasma/raw/logs", + "data-catalog/evm/plasma/raw/traces", + "data-catalog/evm/plasma/raw/creation-traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/plasma/decoded/overview", + "data-catalog/evm/plasma/decoded/call-tables", + "data-catalog/evm/plasma/decoded/event-logs", + "data-catalog/evm/plasma/decoded/contracts", + "data-catalog/evm/plasma/decoded/logs-decoded", + "data-catalog/evm/plasma/decoded/traces-decoded" + ] + } + ] + }, { "group": "Polygon", "icon": "database", @@ -1957,6 +2080,35 @@ } ] }, + { + "group": "Somnia", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/somnia/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/somnia/raw/blocks", + "data-catalog/evm/somnia/raw/creation-traces", + "data-catalog/evm/somnia/raw/logs", + "data-catalog/evm/somnia/raw/transactions", + "data-catalog/evm/somnia/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/somnia/decoded/overview", + "data-catalog/evm/somnia/decoded/call-tables", + "data-catalog/evm/somnia/decoded/event-logs", + "data-catalog/evm/somnia/decoded/contracts", + "data-catalog/evm/somnia/decoded/logs-decoded", + "data-catalog/evm/somnia/decoded/traces-decoded" + ] + } + ] + }, { "group": "Sophon", "icon": "database", @@ -2073,7 +2225,7 @@ } ] }, - { + { "group": "Taiko", "icon": "database", "iconType": "solid", @@ -2476,6 +2628,22 @@ "data-catalog/stellar/history_contract_events" ] }, + { + "group": "Sui", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/sui/overview", + "data-catalog/sui/checkpoints", + "data-catalog/sui/events", + "data-catalog/sui/move_call", + "data-catalog/sui/move_package", + "data-catalog/sui/objects", + "data-catalog/sui/transaction_objects", + "data-catalog/sui/transactions", + "data-catalog/sui/wrapped_object" + ] + }, { "group": "TON", "icon": "database", @@ -2490,7 +2658,10 @@ "data-catalog/ton/dex_pools", "data-catalog/ton/dex_trades", "data-catalog/ton/jetton_events", - "data-catalog/ton/jetton_metadata" + "data-catalog/ton/jetton_metadata", + "data-catalog/ton/nft_events", + "data-catalog/ton/nft_metadata", + "data-catalog/ton/prices_daily" ] }, { @@ -2552,6 +2723,16 @@ "data-catalog/layerzero/messages", "data-catalog/layerzero/transfers" ] + }, + { + "group": "Succinct", + "icon": "bolt", + "iconType": "solid", + "pages": [ + "data-catalog/succinct/overview", + "data-catalog/succinct/bids", + "data-catalog/succinct/requests" + ] } ] }, @@ -2585,7 +2766,14 @@ "data-catalog/community/farcaster/power_badge" ] }, - + { + "group": "Hyperliquid", + "icon": "droplet", + "pages": [ + "data-catalog/community/hyperliquid/overview", + "data-catalog/community/hyperliquid/market-data" + ] + }, { "group": "Lens", "icon": "cloud", @@ -2666,6 +2854,7 @@ }, "api-reference/overview/authentication", "api-reference/overview/sdks", + "api-reference/overview/dunesql-trino-connector", { "group": "Result Filtering", "pages": [ @@ -2682,10 +2871,6 @@ "api-reference/overview/faq" ] }, - { - "group": "Custom Endpoints", - "pages": ["api-reference/custom/overview"] - }, { "group": "SQL Endpoints", "pages": [ @@ -2738,6 +2923,7 @@ "group": "Tables", "pages": [ "api-reference/tables/endpoint/overview", + "api-reference/tables/endpoint/list", "api-reference/tables/endpoint/create", "api-reference/tables/endpoint/insert", "api-reference/tables/endpoint/upload", @@ -2747,6 +2933,17 @@ } ] }, + { + "group": "Account Management", + "pages": [ + { + "group": "Usage", + "pages": [ + "api-reference/usage/endpoint/get-usage" + ] + } + ] + }, { "group": "Preset Endpoints", "pages": [ diff --git a/mint.json.backup b/mint.json.backup new file mode 100644 index 00000000..afb9c71b --- /dev/null +++ b/mint.json.backup @@ -0,0 +1,3032 @@ +{ + "$schema": "https://mintlify.com/schema.json", + "name": "Dune Docs", + "logo": { + "light": "/logo/dune-logo-light.png", + "dark": "/logo/dune-logo-dark.png" + }, + "favicon": "/dune.png", + "seo": { + "title": "Dune Docs", + "titleSuffix": " | Dune Docs", + "description": "Official documentation for building with Dune's data platform, query engine, and API.", + "image": "/images/dune-docs-cover.jpg", + "siteUrl": "https://docs.dune.com", + "twitterCard": "summary_large_image" + }, + "colors": { + "primary": "#F4603E", + "light": "#F49282", + "dark": "#F4603E", + "anchors": { + "from": "#F4603E", + "to": "#F49282" + } + }, + "topbarLinks": [ + { + "name": "Support", + "url": "mailto:support@dune.com" + } + ], + "topbarCtaButton": { + "name": "Start building", + "url": "https://dune.com" + }, + "primaryTab": { + "name": "Get Started" + }, + "tabs": [ + { + "name": "Analytics Studio", + "url": "web-app" + }, + { + "name": "Query Engine", + "url": "query-engine" + }, + { + "name": "Data Catalog", + "url": "data-catalog" + }, + { + "name": "Analytics API", + "url": "api-reference" + }, + { + "name": "Datashare", + "url": "datashare" + }, + { + "name": "Catalyst", + "url": "catalyst" + } + ], + "contextual": { + "options": [ + "copy", + "view", + "chatgpt", + "claude", + "perplexity" + ] + }, + "navigation": [ + { + "group": "", + "pages": ["home", "quickstart", "learning-resources"] + }, + { + "group": "Jump right in", + "pages": [ + "learning/how-tos/create-your-first-query", + "learning/how-tos/query-templates", + "learning/how-tos/create-new-content", + "learning/how-tos/create-your-first-visualization", + "learning/how-tos/navigate-query-editor", + "learning/how-tos/find-datasets", + "learning/how-tos/export-data-out", + "learning/how-tos/create-and-manage-teams", + "learning/how-tos/credit-system-on-dune", + "learning/how-tos/credit-system", + "learning/how-tos/search-for-content", + "learning/how-tos/share-dune-content", + "learning/how-tos/share-your-query", + "learning/how-tos/transfer-ownership", + "learning/flipside-migration-guide" + ] + }, + { + "group": "Analytics Studio", + "pages": [ + "web-app/overview", + { + "group": "Create Queries", + "pages": [ + "web-app/query-editor/query-window", + "web-app/query-editor/data-explorer", + "web-app/query-editor/parameters", + "web-app/query-editor/query-scheduler", + "web-app/query-editor/query-lineage", + "web-app/query-editor/version-history" + ] + }, + { + "group": "Create Visualizations", + "pages": [ + "web-app/visualizations/charts-graphs", + "web-app/visualizations/counters", + "web-app/visualizations/tables" + ] + }, + { + "group": "Decoding Contracts", + "pages": [ + "web-app/decoding/decoding-contracts", + "web-app/decoding/best-practices", + "web-app/decoding/faqs", + "web-app/decoding/multichain-decoding", + "web-app/decoding/short-guide-contract-submission" + ] + }, + "web-app/dashboards", + "web-app/teams", + "web-app/dune-ai", + "web-app/upload-data", + "web-app/embeds", + "web-app/search", + "web-app/alerts", + "web-app/bug-bounty", + "web-app/user-activity" + ] + }, + { + "group": "", + "pages": ["query-engine/overview"] + }, + { + "group": "Functionality", + "pages": [ + "query-engine/query-executions", + "query-engine/query-a-query", + "query-engine/materialized-views" + ] + }, + { + "group": "DuneSQL", + "pages": [ + "query-engine/dunesql-architecture", + "query-engine/writing-efficient-queries", + "query-engine/datatypes", + "query-engine/reserved-keywords" + ] + }, + + { + "group": "Functions and Operators", + "pages": [ + "query-engine/Functions-and-operators/index", + "query-engine/Functions-and-operators/aggregate", + "query-engine/Functions-and-operators/array", + "query-engine/Functions-and-operators/asof-join", + "query-engine/Functions-and-operators/base58", + "query-engine/Functions-and-operators/binary", + "query-engine/Functions-and-operators/bitwise", + "query-engine/Functions-and-operators/chain-utility-functions", + "query-engine/Functions-and-operators/comparison", + "query-engine/Functions-and-operators/conditional", + "query-engine/Functions-and-operators/conversion", + "query-engine/Functions-and-operators/datetime", + "query-engine/Functions-and-operators/decimal", + "query-engine/Functions-and-operators/evm-decoding-functions", + "query-engine/Functions-and-operators/hyperloglog", + "query-engine/Functions-and-operators/json", + "query-engine/Functions-and-operators/lambda", + "query-engine/Functions-and-operators/live-fetch", + "query-engine/Functions-and-operators/logical", + "query-engine/Functions-and-operators/map", + "query-engine/Functions-and-operators/math", + "query-engine/Functions-and-operators/ml", + "query-engine/Functions-and-operators/qdigest", + "query-engine/Functions-and-operators/regexp", + "query-engine/Functions-and-operators/setdigest", + "query-engine/Functions-and-operators/ss58", + "query-engine/Functions-and-operators/tonaddress", + "query-engine/Functions-and-operators/tronaddress", + "query-engine/Functions-and-operators/string", + "query-engine/Functions-and-operators/system", + "query-engine/Functions-and-operators/tdigest", + "query-engine/Functions-and-operators/teradata", + "query-engine/Functions-and-operators/url", + "query-engine/Functions-and-operators/uuid", + "query-engine/Functions-and-operators/varbinary", + "query-engine/Functions-and-operators/varchar-utility-functions", + "query-engine/Functions-and-operators/window" + ] + }, + { + "group": "", + "pages": [ + "data-catalog/overview", + "data-catalog/data-freshness", + "data-catalog/bring-your-own-data" + ] + }, + { + "group": "Curated Data", + "pages": [ + "data-catalog/curated/overview", + { + "group": "DEX Trades", + "icon": "shuffle", + "pages": [ + "data-catalog/curated/dex-trades/overview", + { + "group": "EVM DEX", + "icon": "e", + "pages": [ + "data-catalog/curated/dex-trades/evm/dex-trades", + "data-catalog/curated/dex-trades/evm/dex-aggregator-trades", + "data-catalog/curated/dex-trades/evm/dex-sandwiched", + "data-catalog/curated/dex-trades/evm/dex-sandwiches" + ] + }, + { + "group": "Solana DEX", + "icon": "s", + "pages": [ + "data-catalog/curated/dex-trades/solana/overview", + "data-catalog/curated/dex-trades/solana/jupiter-aggregator-trades", + "data-catalog/curated/dex-trades/solana/solana-dex-trades" + ] + } + ] + }, + { + "group": "Token Transfers", + "icon": "coins", + "pages": [ + "data-catalog/curated/token-transfers/overview", + { + "group": "EVM Token Transfers", + "icon": "e", + "pages": [ + "data-catalog/curated/token-transfers/evm/balances", + "data-catalog/curated/token-transfers/evm/token-transfers", + "data-catalog/curated/token-transfers/evm/tokens-metadata" + ] + }, + { + "group": "Solana Token Transfers", + "icon": "s", + "pages": [ + "data-catalog/curated/token-transfers/solana/overview", + "data-catalog/curated/token-transfers/solana/solana-token-accounts", + "data-catalog/curated/token-transfers/solana/solana-token-metadata", + "data-catalog/curated/token-transfers/solana/solana-token-transfers" + ] + } + ] + }, + { + "group": "Labels", + "icon": "tag", + "pages": [ + "data-catalog/curated/labels/overview", + "data-catalog/curated/labels/address-labels", + "data-catalog/curated/labels/ens-labels", + "data-catalog/curated/labels/owner-addresses", + "data-catalog/curated/labels/owner-details" + ] + }, + { + "group": "Prices", + "icon": "dollar-sign", + "pages": [ + "data-catalog/curated/prices/overview", + "data-catalog/curated/prices/prices_minute", + "data-catalog/curated/prices/prices_hour", + "data-catalog/curated/prices/prices_day", + "data-catalog/curated/prices/prices_usd", + "data-catalog/curated/prices/prices_latest" + ] + }, + { + "group": "NFT Trades", + "icon": "image", + "pages": [ + "data-catalog/curated/nft-trades/overview", + { + "group": "EVM NFT", + "icon": "e", + "pages": [ + "data-catalog/curated/nft-trades/evm/nft-trades", + "data-catalog/curated/nft-trades/evm/nft-mints", + "data-catalog/curated/nft-trades/evm/nft-wash-trades", + "data-catalog/curated/nft-trades/evm/nft-metadata", + "data-catalog/curated/nft-trades/evm/nft-transfers" + ] + }, + { + "group": "Solana NFT", + "icon": "s", + "pages": [ + "data-catalog/curated/nft-trades/solana/solana-nft-metadata", + "data-catalog/curated/nft-trades/solana/solana-nft-transfers" + ] + } + ] + } + ] + }, + { + "group": "EVM Networks", + "pages": [ + "data-catalog/evm/overview", + { + "group": "Abstract", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/abstract/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/abstract/raw/blocks", + "data-catalog/evm/abstract/raw/creation-traces", + "data-catalog/evm/abstract/raw/logs", + "data-catalog/evm/abstract/raw/transactions", + "data-catalog/evm/abstract/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/abstract/decoded/overview", + "data-catalog/evm/abstract/decoded/call-tables", + "data-catalog/evm/abstract/decoded/event-logs", + "data-catalog/evm/abstract/decoded/contracts", + "data-catalog/evm/abstract/decoded/logs-decoded", + "data-catalog/evm/abstract/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/abstract/curated-data/dex/dex-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/abstract/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "ApeChain", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/apechain/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/apechain/raw/blocks", + "data-catalog/evm/apechain/raw/creation-traces", + "data-catalog/evm/apechain/raw/logs", + "data-catalog/evm/apechain/raw/transactions", + "data-catalog/evm/apechain/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/apechain/decoded/overview", + "data-catalog/evm/apechain/decoded/call-tables", + "data-catalog/evm/apechain/decoded/event-logs", + "data-catalog/evm/apechain/decoded/contracts", + "data-catalog/evm/apechain/decoded/logs-decoded", + "data-catalog/evm/apechain/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/apechain/curated-data/dex/dex-trades", + "data-catalog/evm/apechain/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/apechain/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Arbitrum One", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/arbitrum/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/arbitrum/raw/blocks", + "data-catalog/evm/arbitrum/raw/creation-traces", + "data-catalog/evm/arbitrum/raw/logs", + "data-catalog/evm/arbitrum/raw/transactions", + "data-catalog/evm/arbitrum/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/arbitrum/decoded/overview", + "data-catalog/evm/arbitrum/decoded/call-tables", + "data-catalog/evm/arbitrum/decoded/event-logs", + "data-catalog/evm/arbitrum/decoded/contracts", + "data-catalog/evm/arbitrum/decoded/logs-decoded", + "data-catalog/evm/arbitrum/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/arbitrum/curated-data/dex/dex-trades", + "data-catalog/evm/arbitrum/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/arbitrum/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Arbitrum Nova", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/arbitrum-nova/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/arbitrum-nova/raw/blocks", + "data-catalog/evm/arbitrum-nova/raw/creation-traces", + "data-catalog/evm/arbitrum-nova/raw/logs", + "data-catalog/evm/arbitrum-nova/raw/transactions", + "data-catalog/evm/arbitrum-nova/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/arbitrum-nova/decoded/overview", + "data-catalog/evm/arbitrum-nova/decoded/call-tables", + "data-catalog/evm/arbitrum-nova/decoded/event-logs", + "data-catalog/evm/arbitrum-nova/decoded/contracts", + "data-catalog/evm/arbitrum-nova/decoded/logs-decoded", + "data-catalog/evm/arbitrum-nova/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/arbitrum-nova/curated-data/dex/dex-trades", + "data-catalog/evm/arbitrum-nova/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/arbitrum-nova/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Avalanche", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/avalanche/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/avalanche/raw/blocks", + "data-catalog/evm/avalanche/raw/creation-traces", + "data-catalog/evm/avalanche/raw/logs", + "data-catalog/evm/avalanche/raw/transactions", + "data-catalog/evm/avalanche/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/avalanche/decoded/overview", + "data-catalog/evm/avalanche/decoded/call-tables", + "data-catalog/evm/avalanche/decoded/event-logs", + "data-catalog/evm/avalanche/decoded/contracts", + "data-catalog/evm/avalanche/decoded/logs-decoded", + "data-catalog/evm/avalanche/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/avalanche/curated-data/dex/dex-trades", + "data-catalog/evm/avalanche/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/avalanche/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "B3", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/b3/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/b3/raw/blocks", + "data-catalog/evm/b3/raw/creation-traces", + "data-catalog/evm/b3/raw/logs", + "data-catalog/evm/b3/raw/transactions", + "data-catalog/evm/b3/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/b3/decoded/overview", + "data-catalog/evm/b3/decoded/call-tables", + "data-catalog/evm/b3/decoded/event-logs", + "data-catalog/evm/b3/decoded/contracts", + "data-catalog/evm/b3/decoded/logs-decoded", + "data-catalog/evm/b3/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/b3/curated-data/dex/dex-trades", + "data-catalog/evm/b3/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": ["data-catalog/evm/b3/curated-data/nft/nft-trades"] + } + ] + } + ] + }, + { + "group": "Base", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/base/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/base/raw/blocks", + "data-catalog/evm/base/raw/creation-traces", + "data-catalog/evm/base/raw/logs", + "data-catalog/evm/base/raw/transactions", + "data-catalog/evm/base/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/base/decoded/overview", + "data-catalog/evm/base/decoded/call-tables", + "data-catalog/evm/base/decoded/event-logs", + "data-catalog/evm/base/decoded/contracts", + "data-catalog/evm/base/decoded/logs-decoded", + "data-catalog/evm/base/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/base/curated-data/dex/dex-trades", + "data-catalog/evm/base/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": ["data-catalog/evm/base/curated-data/nft/nft-trades"] + } + ] + } + ] + }, + { + "group": "Berachain", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/berachain/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/berachain/raw/blocks", + "data-catalog/evm/berachain/raw/creation-traces", + "data-catalog/evm/berachain/raw/logs", + "data-catalog/evm/berachain/raw/transactions", + "data-catalog/evm/berachain/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/berachain/decoded/overview", + "data-catalog/evm/berachain/decoded/call-tables", + "data-catalog/evm/berachain/decoded/event-logs", + "data-catalog/evm/berachain/decoded/contracts", + "data-catalog/evm/berachain/decoded/logs-decoded", + "data-catalog/evm/berachain/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/berachain/curated-data/dex/dex-trades", + "data-catalog/evm/berachain/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/berachain/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Beacon", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/beacon/overview", + "data-catalog/evm/beacon/attestations", + "data-catalog/evm/beacon/attester-slashings", + "data-catalog/evm/beacon/blobs", + "data-catalog/evm/beacon/blocks", + "data-catalog/evm/beacon/bls-to-execution-changes", + "data-catalog/evm/beacon/deposits", + "data-catalog/evm/beacon/epoch-summaries", + "data-catalog/evm/beacon/operators", + "data-catalog/evm/beacon/proposer-slashings", + "data-catalog/evm/beacon/raw", + "data-catalog/evm/beacon/validator-day-summaries", + "data-catalog/evm/beacon/validators", + "data-catalog/evm/beacon/voluntary-exits", + "data-catalog/evm/beacon/withdrawals" + ] + }, + { + "group": "Blast", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/blast/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/blast/raw/blocks", + "data-catalog/evm/blast/raw/creation-traces", + "data-catalog/evm/blast/raw/logs", + "data-catalog/evm/blast/raw/transactions", + "data-catalog/evm/blast/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/blast/decoded/overview", + "data-catalog/evm/blast/decoded/call-tables", + "data-catalog/evm/blast/decoded/event-logs", + "data-catalog/evm/blast/decoded/contracts", + "data-catalog/evm/blast/decoded/logs-decoded", + "data-catalog/evm/blast/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/blast/curated-data/dex/dex-trades", + "data-catalog/evm/blast/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/blast/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "BNB", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/bnb/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/bnb/raw/blocks", + "data-catalog/evm/bnb/raw/creation-traces", + "data-catalog/evm/bnb/raw/logs", + "data-catalog/evm/bnb/raw/transactions", + "data-catalog/evm/bnb/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/bnb/decoded/overview", + "data-catalog/evm/bnb/decoded/call-tables", + "data-catalog/evm/bnb/decoded/event-logs", + "data-catalog/evm/bnb/decoded/contracts", + "data-catalog/evm/bnb/decoded/logs-decoded", + "data-catalog/evm/bnb/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/bnb/curated-data/dex/dex-trades", + "data-catalog/evm/bnb/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": ["data-catalog/evm/bnb/curated-data/nft/nft-trades"] + } + ] + } + ] + }, + { + "group": "BOB", + "icon": "database", + "iconType": "regular", + "pages": [ + "data-catalog/evm/bob/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/bob/raw/blocks", + "data-catalog/evm/bob/raw/logs", + "data-catalog/evm/bob/raw/transactions", + "data-catalog/evm/bob/raw/traces" + ] + } + ] + }, + { + "group": "Boba", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/boba/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/boba/raw/blocks", + "data-catalog/evm/boba/raw/creation-traces", + "data-catalog/evm/boba/raw/logs", + "data-catalog/evm/boba/raw/transactions", + "data-catalog/evm/boba/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/boba/decoded/overview", + "data-catalog/evm/boba/decoded/call-tables", + "data-catalog/evm/boba/decoded/event-logs", + "data-catalog/evm/boba/decoded/contracts", + "data-catalog/evm/boba/decoded/logs-decoded", + "data-catalog/evm/boba/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/boba/curated-data/dex/dex-trades", + "data-catalog/evm/boba/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": ["data-catalog/evm/boba/curated-data/nft/nft-trades"] + } + ] + } + ] + }, + { + "group": "Celo", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/celo/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/celo/raw/blocks", + "data-catalog/evm/celo/raw/creation-traces", + "data-catalog/evm/celo/raw/logs", + "data-catalog/evm/celo/raw/transactions", + "data-catalog/evm/celo/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/celo/decoded/overview", + "data-catalog/evm/celo/decoded/call-tables", + "data-catalog/evm/celo/decoded/event-logs", + "data-catalog/evm/celo/decoded/contracts", + "data-catalog/evm/celo/decoded/logs-decoded", + "data-catalog/evm/celo/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/celo/curated-data/dex/dex-trades", + "data-catalog/evm/celo/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": ["data-catalog/evm/celo/curated-data/nft/nft-trades"] + } + ] + } + ] + }, + { + "group": "Corn", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/corn/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/corn/raw/blocks", + "data-catalog/evm/corn/raw/creation-traces", + "data-catalog/evm/corn/raw/logs", + "data-catalog/evm/corn/raw/transactions", + "data-catalog/evm/corn/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/corn/decoded/overview", + "data-catalog/evm/corn/decoded/call-tables", + "data-catalog/evm/corn/decoded/event-logs", + "data-catalog/evm/corn/decoded/contracts", + "data-catalog/evm/corn/decoded/logs-decoded", + "data-catalog/evm/corn/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/corn/curated-data/dex/dex-trades", + "data-catalog/evm/corn/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": ["data-catalog/evm/corn/curated-data/nft/nft-trades"] + } + ] + } + ] + }, + { + "group": "Degen", + "icon": "database", + "iconType": "regular", + "pages": [ + "data-catalog/evm/degen/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/degen/raw/blocks", + "data-catalog/evm/degen/raw/logs", + "data-catalog/evm/degen/raw/transactions", + "data-catalog/evm/degen/raw/traces" + ] + } + ] + }, + { + "group": "Ethereum", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/ethereum/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/ethereum/raw/transactions", + "data-catalog/evm/ethereum/raw/logs", + "data-catalog/evm/ethereum/raw/traces", + "data-catalog/evm/ethereum/raw/creation-traces", + "data-catalog/evm/ethereum/raw/blocks", + "data-catalog/evm/ethereum/raw/withdrawals" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/ethereum/decoded/overview", + "data-catalog/evm/ethereum/decoded/call-tables", + "data-catalog/evm/ethereum/decoded/event-logs", + "data-catalog/evm/ethereum/decoded/contracts", + "data-catalog/evm/ethereum/decoded/logs-decoded", + "data-catalog/evm/ethereum/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/ethereum/curated-data/dex/dex-trades", + "data-catalog/evm/ethereum/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/ethereum/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Fantom", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/fantom/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/fantom/raw/blocks", + "data-catalog/evm/fantom/raw/creation-traces", + "data-catalog/evm/fantom/raw/logs", + "data-catalog/evm/fantom/raw/transactions", + "data-catalog/evm/fantom/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/fantom/decoded/overview", + "data-catalog/evm/fantom/decoded/call-tables", + "data-catalog/evm/fantom/decoded/event-logs", + "data-catalog/evm/fantom/decoded/contracts", + "data-catalog/evm/fantom/decoded/logs-decoded", + "data-catalog/evm/fantom/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/fantom/curated-data/dex/dex-trades", + "data-catalog/evm/fantom/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/fantom/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Flare", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/flare/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/flare/raw/blocks", + "data-catalog/evm/flare/raw/creation-traces", + "data-catalog/evm/flare/raw/logs", + "data-catalog/evm/flare/raw/transactions", + "data-catalog/evm/flare/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/flare/decoded/overview", + "data-catalog/evm/flare/decoded/call-tables", + "data-catalog/evm/flare/decoded/event-logs", + "data-catalog/evm/flare/decoded/contracts", + "data-catalog/evm/flare/decoded/logs-decoded", + "data-catalog/evm/flare/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/flare/curated-data/dex/dex-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/flare/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Flow EVM", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/flow-evm/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/flow-evm/raw/blocks", + "data-catalog/evm/flow-evm/raw/creation-traces", + "data-catalog/evm/flow-evm/raw/logs", + "data-catalog/evm/flow-evm/raw/transactions", + "data-catalog/evm/flow-evm/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/flow-evm/decoded/overview", + "data-catalog/evm/flow-evm/decoded/call-tables", + "data-catalog/evm/flow-evm/decoded/event-logs", + "data-catalog/evm/flow-evm/decoded/contracts", + "data-catalog/evm/flow-evm/decoded/logs-decoded", + "data-catalog/evm/flow-evm/decoded/traces-decoded" + ] + } + ] + }, + { + "group": "Gnosis", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/gnosis/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/gnosis/raw/blocks", + "data-catalog/evm/gnosis/raw/creation-traces", + "data-catalog/evm/gnosis/raw/logs", + "data-catalog/evm/gnosis/raw/transactions", + "data-catalog/evm/gnosis/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/gnosis/decoded/overview", + "data-catalog/evm/gnosis/decoded/call-tables", + "data-catalog/evm/gnosis/decoded/event-logs", + "data-catalog/evm/gnosis/decoded/contracts", + "data-catalog/evm/gnosis/decoded/logs-decoded", + "data-catalog/evm/gnosis/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/gnosis/curated-data/dex/dex-trades", + "data-catalog/evm/gnosis/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/gnosis/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Hemi", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/hemi/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/hemi/raw/blocks", + "data-catalog/evm/hemi/raw/creation-traces", + "data-catalog/evm/hemi/raw/logs", + "data-catalog/evm/hemi/raw/transactions", + "data-catalog/evm/hemi/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/hemi/decoded/overview", + "data-catalog/evm/hemi/decoded/call-tables", + "data-catalog/evm/hemi/decoded/event-logs", + "data-catalog/evm/hemi/decoded/contracts", + "data-catalog/evm/hemi/decoded/logs-decoded", + "data-catalog/evm/hemi/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": ["data-catalog/evm/hemi/curated-data/dex/dex-trades"] + } + ] + } + ] + }, + { + "group": "HyperEVM", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/hyperevm/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/hyperevm/raw/blocks", + "data-catalog/evm/hyperevm/raw/logs", + "data-catalog/evm/hyperevm/raw/transactions" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/hyperevm/decoded/overview", + "data-catalog/evm/hyperevm/decoded/event-logs", + "data-catalog/evm/hyperevm/decoded/contracts", + "data-catalog/evm/hyperevm/decoded/logs-decoded" + ] + } + ] + }, + { + "group": "Ink", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/ink/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/ink/raw/blocks", + "data-catalog/evm/ink/raw/creation-traces", + "data-catalog/evm/ink/raw/logs", + "data-catalog/evm/ink/raw/transactions", + "data-catalog/evm/ink/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/ink/decoded/overview", + "data-catalog/evm/ink/decoded/call-tables", + "data-catalog/evm/ink/decoded/event-logs", + "data-catalog/evm/ink/decoded/contracts", + "data-catalog/evm/ink/decoded/logs-decoded", + "data-catalog/evm/ink/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/ink/curated-data/dex/dex-trades", + "data-catalog/evm/ink/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": ["data-catalog/evm/ink/curated-data/nft/nft-trades"] + } + ] + } + ] + }, + { + "group": "KAIA", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/kaia/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/kaia/raw/blocks", + "data-catalog/evm/kaia/raw/creation-traces", + "data-catalog/evm/kaia/raw/logs", + "data-catalog/evm/kaia/raw/transactions", + "data-catalog/evm/kaia/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/kaia/decoded/overview", + "data-catalog/evm/kaia/decoded/call-tables", + "data-catalog/evm/kaia/decoded/event-logs", + "data-catalog/evm/kaia/decoded/contracts", + "data-catalog/evm/kaia/decoded/logs-decoded", + "data-catalog/evm/kaia/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": ["data-catalog/evm/kaia/curated-data/dex/dex-trades"] + }, + { + "group": "NFT", + "pages": ["data-catalog/evm/kaia/curated-data/nft/nft-trades"] + } + ] + } + ] + }, + { + "group": "Katana", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/katana/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/katana/raw/blocks", + "data-catalog/evm/katana/raw/creation-traces", + "data-catalog/evm/katana/raw/logs", + "data-catalog/evm/katana/raw/transactions", + "data-catalog/evm/katana/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/katana/decoded/overview", + "data-catalog/evm/katana/decoded/call-tables", + "data-catalog/evm/katana/decoded/event-logs", + "data-catalog/evm/katana/decoded/contracts", + "data-catalog/evm/katana/decoded/logs-decoded", + "data-catalog/evm/katana/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/katana/curated-data/dex/dex-trades", + "data-catalog/evm/katana/curated-data/dex/dex-aggregator-trades" + ] + } + ] + } + ] + }, + { + "group": "Lens", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/lens/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/lens/raw/blocks", + "data-catalog/evm/lens/raw/creation-traces", + "data-catalog/evm/lens/raw/logs", + "data-catalog/evm/lens/raw/transactions", + "data-catalog/evm/lens/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/lens/decoded/overview", + "data-catalog/evm/lens/decoded/call-tables", + "data-catalog/evm/lens/decoded/event-logs", + "data-catalog/evm/lens/decoded/contracts", + "data-catalog/evm/lens/decoded/logs-decoded", + "data-catalog/evm/lens/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": ["data-catalog/evm/lens/curated-data/dex/dex-trades"] + }, + { + "group": "NFT", + "pages": ["data-catalog/evm/lens/curated-data/nft/nft-trades"] + } + ] + } + ] + }, + { + "group": "Linea", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/linea/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/linea/raw/blocks", + "data-catalog/evm/linea/raw/creation-traces", + "data-catalog/evm/linea/raw/logs", + "data-catalog/evm/linea/raw/transactions", + "data-catalog/evm/linea/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/linea/decoded/overview", + "data-catalog/evm/linea/decoded/call-tables", + "data-catalog/evm/linea/decoded/event-logs", + "data-catalog/evm/linea/decoded/contracts", + "data-catalog/evm/linea/decoded/logs-decoded", + "data-catalog/evm/linea/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/linea/curated-data/dex/dex-trades", + "data-catalog/evm/linea/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/linea/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Mantle", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/mantle/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/mantle/raw/blocks", + "data-catalog/evm/mantle/raw/creation-traces", + "data-catalog/evm/mantle/raw/logs", + "data-catalog/evm/mantle/raw/transactions", + "data-catalog/evm/mantle/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/mantle/decoded/overview", + "data-catalog/evm/mantle/decoded/call-tables", + "data-catalog/evm/mantle/decoded/event-logs", + "data-catalog/evm/mantle/decoded/contracts", + "data-catalog/evm/mantle/decoded/logs-decoded", + "data-catalog/evm/mantle/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/mantle/curated-data/dex/dex-trades", + "data-catalog/evm/mantle/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/mantle/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Monad Testnet", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/monad-testnet/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/monad-testnet/raw/blocks", + "data-catalog/evm/monad-testnet/raw/creation-traces", + "data-catalog/evm/monad-testnet/raw/logs", + "data-catalog/evm/monad-testnet/raw/transactions", + "data-catalog/evm/monad-testnet/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/monad-testnet/decoded/overview", + "data-catalog/evm/monad-testnet/decoded/call-tables", + "data-catalog/evm/monad-testnet/decoded/event-logs", + "data-catalog/evm/monad-testnet/decoded/contracts", + "data-catalog/evm/monad-testnet/decoded/logs-decoded", + "data-catalog/evm/monad-testnet/decoded/traces-decoded" + ] + } + ] + }, + { + "group": "opBNB", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/opbnb/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/opbnb/raw/blocks", + "data-catalog/evm/opbnb/raw/creation-traces", + "data-catalog/evm/opbnb/raw/logs", + "data-catalog/evm/opbnb/raw/transactions", + "data-catalog/evm/opbnb/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/opbnb/decoded/overview", + "data-catalog/evm/opbnb/decoded/call-tables", + "data-catalog/evm/opbnb/decoded/event-logs", + "data-catalog/evm/opbnb/decoded/contracts", + "data-catalog/evm/opbnb/decoded/logs-decoded", + "data-catalog/evm/opbnb/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/opbnb/curated-data/dex/dex-trades", + "data-catalog/evm/opbnb/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/opbnb/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Optimism", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/optimism/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/optimism/raw/blocks", + "data-catalog/evm/optimism/raw/creation-traces", + "data-catalog/evm/optimism/raw/logs", + "data-catalog/evm/optimism/raw/transactions", + "data-catalog/evm/optimism/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/optimism/decoded/overview", + "data-catalog/evm/optimism/decoded/call-tables", + "data-catalog/evm/optimism/decoded/event-logs", + "data-catalog/evm/optimism/decoded/contracts", + "data-catalog/evm/optimism/decoded/logs-decoded", + "data-catalog/evm/optimism/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/optimism/curated-data/dex/dex-trades", + "data-catalog/evm/optimism/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/optimism/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Plume", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/plume/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/plume/raw/blocks", + "data-catalog/evm/plume/raw/creation-traces", + "data-catalog/evm/plume/raw/logs", + "data-catalog/evm/plume/raw/transactions", + "data-catalog/evm/plume/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/plume/decoded/overview", + "data-catalog/evm/plume/decoded/event-logs", + "data-catalog/evm/plume/decoded/contracts", + "data-catalog/evm/plume/decoded/logs-decoded", + "data-catalog/evm/plume/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/plume/curated-data/dex/dex-trades", + "data-catalog/evm/plume/curated-data/dex/dex-aggregator-trades" + ] + } + ] + } + ] + }, + { + "group": "Plasma", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/plasma/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/plasma/raw/blocks", + "data-catalog/evm/plasma/raw/transactions", + "data-catalog/evm/plasma/raw/logs", + "data-catalog/evm/plasma/raw/traces", + "data-catalog/evm/plasma/raw/creation-traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/plasma/decoded/overview", + "data-catalog/evm/plasma/decoded/call-tables", + "data-catalog/evm/plasma/decoded/event-logs", + "data-catalog/evm/plasma/decoded/contracts", + "data-catalog/evm/plasma/decoded/logs-decoded", + "data-catalog/evm/plasma/decoded/traces-decoded" + ] + } + ] + }, + { + "group": "Polygon", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/polygon/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/polygon/raw/blocks", + "data-catalog/evm/polygon/raw/creation-traces", + "data-catalog/evm/polygon/raw/logs", + "data-catalog/evm/polygon/raw/transactions", + "data-catalog/evm/polygon/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/polygon/decoded/overview", + "data-catalog/evm/polygon/decoded/call-tables", + "data-catalog/evm/polygon/decoded/event-logs", + "data-catalog/evm/polygon/decoded/contracts", + "data-catalog/evm/polygon/decoded/logs-decoded", + "data-catalog/evm/polygon/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/polygon/curated-data/dex/dex-trades", + "data-catalog/evm/polygon/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/polygon/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Polygon-zkEVM", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/polygon-zkEVM/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/polygon-zkEVM/raw/blocks", + "data-catalog/evm/polygon-zkEVM/raw/creation-traces", + "data-catalog/evm/polygon-zkEVM/raw/logs", + "data-catalog/evm/polygon-zkEVM/raw/transactions", + "data-catalog/evm/polygon-zkEVM/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/polygon-zkEVM/decoded/overview", + "data-catalog/evm/polygon-zkEVM/decoded/call-tables", + "data-catalog/evm/polygon-zkEVM/decoded/event-logs", + "data-catalog/evm/polygon-zkEVM/decoded/contracts", + "data-catalog/evm/polygon-zkEVM/decoded/logs-decoded", + "data-catalog/evm/polygon-zkEVM/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/polygon-zkEVM/curated-data/dex/dex-trades", + "data-catalog/evm/polygon-zkEVM/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/polygon-zkEVM/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Ronin", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/ronin/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/ronin/raw/blocks", + "data-catalog/evm/ronin/raw/creation-traces", + "data-catalog/evm/ronin/raw/logs", + "data-catalog/evm/ronin/raw/transactions", + "data-catalog/evm/ronin/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/ronin/decoded/overview", + "data-catalog/evm/ronin/decoded/call-tables", + "data-catalog/evm/ronin/decoded/event-logs", + "data-catalog/evm/ronin/decoded/contracts", + "data-catalog/evm/ronin/decoded/logs-decoded", + "data-catalog/evm/ronin/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/ronin/curated-data/dex/dex-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/ronin/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Scroll", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/scroll/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/scroll/raw/blocks", + "data-catalog/evm/scroll/raw/creation-traces", + "data-catalog/evm/scroll/raw/logs", + "data-catalog/evm/scroll/raw/transactions", + "data-catalog/evm/scroll/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/scroll/decoded/overview", + "data-catalog/evm/scroll/decoded/call-tables", + "data-catalog/evm/scroll/decoded/event-logs", + "data-catalog/evm/scroll/decoded/contracts", + "data-catalog/evm/scroll/decoded/logs-decoded", + "data-catalog/evm/scroll/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/scroll/curated-data/dex/dex-trades", + "data-catalog/evm/scroll/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/scroll/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Sei", + "icon": "circles-overlap", + "iconType": "solid", + "pages": [ + "data-catalog/evm/sei/overview", + { + "group": "Raw (EVM)", + "pages": [ + "data-catalog/evm/sei/raw/blocks", + "data-catalog/evm/sei/raw/creation-traces", + "data-catalog/evm/sei/raw/logs", + "data-catalog/evm/sei/raw/transactions", + "data-catalog/evm/sei/raw/traces" + ] + }, + { + "group": "Decoded (EVM)", + "pages": [ + "data-catalog/evm/sei/decoded/overview", + "data-catalog/evm/sei/decoded/call-tables", + "data-catalog/evm/sei/decoded/event-logs", + "data-catalog/evm/sei/decoded/contracts", + "data-catalog/evm/sei/decoded/logs-decoded", + "data-catalog/evm/sei/decoded/traces-decoded" + ] + }, + { + "group": "Curated (EVM)", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/sei/curated-data/dex/dex-trades", + "data-catalog/evm/sei/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": ["data-catalog/evm/sei/curated-data/nft/nft-trades"] + } + ] + }, + { + "group": "Cosmos Data", + "pages": [ + "data-catalog/evm/sei/cosmos/cosmos_blocks", + "data-catalog/evm/sei/cosmos/cosmos_block_events", + "data-catalog/evm/sei/cosmos/cosmos_message_events", + "data-catalog/evm/sei/cosmos/cosmos_tx_messages", + "data-catalog/evm/sei/cosmos/cosmos_transactions", + "data-catalog/evm/sei/cosmos/cosmos_validators" + ] + } + ] + }, + { + "group": "Sepolia", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/sepolia/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/sepolia/raw/blocks", + "data-catalog/evm/sepolia/raw/creation-traces", + "data-catalog/evm/sepolia/raw/logs", + "data-catalog/evm/sepolia/raw/transactions", + "data-catalog/evm/sepolia/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/sepolia/decoded/overview", + "data-catalog/evm/sepolia/decoded/call-tables", + "data-catalog/evm/sepolia/decoded/event-logs", + "data-catalog/evm/sepolia/decoded/contracts", + "data-catalog/evm/sepolia/decoded/logs-decoded", + "data-catalog/evm/sepolia/decoded/traces-decoded" + ] + } + ] + }, + { + "group": "Shape", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/shape/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/shape/raw/blocks", + "data-catalog/evm/shape/raw/creation-traces", + "data-catalog/evm/shape/raw/logs", + "data-catalog/evm/shape/raw/transactions", + "data-catalog/evm/shape/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/shape/decoded/overview", + "data-catalog/evm/shape/decoded/call-tables", + "data-catalog/evm/shape/decoded/event-logs", + "data-catalog/evm/shape/decoded/contracts", + "data-catalog/evm/shape/decoded/logs-decoded", + "data-catalog/evm/shape/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/shape/curated-data/dex/dex-trades", + "data-catalog/evm/shape/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/shape/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Sonic", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/sonic/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/sonic/raw/blocks", + "data-catalog/evm/sonic/raw/creation-traces", + "data-catalog/evm/sonic/raw/logs", + "data-catalog/evm/sonic/raw/transactions", + "data-catalog/evm/sonic/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/sonic/decoded/overview", + "data-catalog/evm/sonic/decoded/call-tables", + "data-catalog/evm/sonic/decoded/event-logs", + "data-catalog/evm/sonic/decoded/contracts", + "data-catalog/evm/sonic/decoded/logs-decoded", + "data-catalog/evm/sonic/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/sonic/curated-data/dex/dex-trades", + "data-catalog/evm/sonic/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/sonic/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Somnia", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/somnia/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/somnia/raw/blocks", + "data-catalog/evm/somnia/raw/creation-traces", + "data-catalog/evm/somnia/raw/logs", + "data-catalog/evm/somnia/raw/transactions", + "data-catalog/evm/somnia/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/somnia/decoded/overview", + "data-catalog/evm/somnia/decoded/call-tables", + "data-catalog/evm/somnia/decoded/event-logs", + "data-catalog/evm/somnia/decoded/contracts", + "data-catalog/evm/somnia/decoded/logs-decoded", + "data-catalog/evm/somnia/decoded/traces-decoded" + ] + } + ] + }, + { + "group": "Sophon", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/sophon/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/sophon/raw/blocks", + "data-catalog/evm/sophon/raw/creation-traces", + "data-catalog/evm/sophon/raw/logs", + "data-catalog/evm/sophon/raw/transactions", + "data-catalog/evm/sophon/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/sophon/decoded/overview", + "data-catalog/evm/sophon/decoded/call-tables", + "data-catalog/evm/sophon/decoded/event-logs", + "data-catalog/evm/sophon/decoded/contracts", + "data-catalog/evm/sophon/decoded/logs-decoded", + "data-catalog/evm/sophon/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/sophon/curated-data/dex/dex-trades", + "data-catalog/evm/sophon/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/sophon/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Superseed", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/superseed/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/superseed/raw/blocks", + "data-catalog/evm/superseed/raw/creation-traces", + "data-catalog/evm/superseed/raw/logs", + "data-catalog/evm/superseed/raw/transactions", + "data-catalog/evm/superseed/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/superseed/decoded/overview", + "data-catalog/evm/superseed/decoded/call-tables", + "data-catalog/evm/superseed/decoded/event-logs", + "data-catalog/evm/superseed/decoded/contracts", + "data-catalog/evm/superseed/decoded/logs-decoded", + "data-catalog/evm/superseed/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/superseed/curated-data/dex/dex-trades" + ] + } + ] + } + ] + }, + { + "group": "Tac", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/tac/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/tac/raw/blocks", + "data-catalog/evm/tac/raw/creation-traces", + "data-catalog/evm/tac/raw/logs", + "data-catalog/evm/tac/raw/transactions", + "data-catalog/evm/tac/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/tac/decoded/overview", + "data-catalog/evm/tac/decoded/call-tables", + "data-catalog/evm/tac/decoded/event-logs", + "data-catalog/evm/tac/decoded/contracts", + "data-catalog/evm/tac/decoded/logs-decoded", + "data-catalog/evm/tac/decoded/traces-decoded" + ] + } + ] + }, + { + "group": "Taiko", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/taiko/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/taiko/raw/blocks", + "data-catalog/evm/taiko/raw/creation-traces", + "data-catalog/evm/taiko/raw/logs", + "data-catalog/evm/taiko/raw/transactions", + "data-catalog/evm/taiko/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/taiko/decoded/overview", + "data-catalog/evm/taiko/decoded/call-tables", + "data-catalog/evm/taiko/decoded/event-logs", + "data-catalog/evm/taiko/decoded/contracts", + "data-catalog/evm/taiko/decoded/logs-decoded", + "data-catalog/evm/taiko/decoded/traces-decoded" + ] + } + ] + }, + { + "group": "Unichain", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/unichain/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/unichain/raw/blocks", + "data-catalog/evm/unichain/raw/creation-traces", + "data-catalog/evm/unichain/raw/logs", + "data-catalog/evm/unichain/raw/transactions", + "data-catalog/evm/unichain/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/unichain/decoded/overview", + "data-catalog/evm/unichain/decoded/call-tables", + "data-catalog/evm/unichain/decoded/event-logs", + "data-catalog/evm/unichain/decoded/contracts", + "data-catalog/evm/unichain/decoded/logs-decoded", + "data-catalog/evm/unichain/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/unichain/curated-data/dex/dex-trades", + "data-catalog/evm/unichain/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/unichain/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Viction", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/viction/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/viction/raw/blocks", + "data-catalog/evm/viction/raw/creation-traces", + "data-catalog/evm/viction/raw/logs", + "data-catalog/evm/viction/raw/transactions", + "data-catalog/evm/viction/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/viction/decoded/overview", + "data-catalog/evm/viction/decoded/call-tables", + "data-catalog/evm/viction/decoded/event-logs", + "data-catalog/evm/viction/decoded/contracts", + "data-catalog/evm/viction/decoded/logs-decoded", + "data-catalog/evm/viction/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/viction/curated-data/dex/dex-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/viction/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "World Chain", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/worldchain/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/worldchain/raw/blocks", + "data-catalog/evm/worldchain/raw/creation-traces", + "data-catalog/evm/worldchain/raw/logs", + "data-catalog/evm/worldchain/raw/transactions", + "data-catalog/evm/worldchain/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/worldchain/decoded/overview", + "data-catalog/evm/worldchain/decoded/call-tables", + "data-catalog/evm/worldchain/decoded/event-logs", + "data-catalog/evm/worldchain/decoded/contracts", + "data-catalog/evm/worldchain/decoded/logs-decoded", + "data-catalog/evm/worldchain/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/worldchain/curated-data/dex/dex-trades", + "data-catalog/evm/worldchain/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/worldchain/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "zkSync", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/zksync/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/zksync/raw/blocks", + "data-catalog/evm/zksync/raw/creation-traces", + "data-catalog/evm/zksync/raw/logs", + "data-catalog/evm/zksync/raw/transactions", + "data-catalog/evm/zksync/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/zksync/decoded/overview", + "data-catalog/evm/zksync/decoded/call-tables", + "data-catalog/evm/zksync/decoded/event-logs", + "data-catalog/evm/zksync/decoded/contracts", + "data-catalog/evm/zksync/decoded/logs-decoded", + "data-catalog/evm/zksync/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/zksync/curated-data/dex/dex-trades", + "data-catalog/evm/zksync/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/zksync/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Zora", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/zora/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/zora/raw/blocks", + "data-catalog/evm/zora/raw/creation-traces", + "data-catalog/evm/zora/raw/logs", + "data-catalog/evm/zora/raw/transactions", + "data-catalog/evm/zora/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/zora/decoded/overview", + "data-catalog/evm/zora/decoded/call-tables", + "data-catalog/evm/zora/decoded/event-logs", + "data-catalog/evm/zora/decoded/contracts", + "data-catalog/evm/zora/decoded/logs-decoded", + "data-catalog/evm/zora/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/zora/curated-data/dex/dex-trades", + "data-catalog/evm/zora/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": ["data-catalog/evm/zora/curated-data/nft/nft-trades"] + } + ] + } + ] + } + ] + }, + + { + "group": "Other Networks", + "pages": [ + { + "group": "Aptos", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/aptos/overview", + "data-catalog/aptos/blocks", + "data-catalog/aptos/events", + "data-catalog/aptos/move_modules", + "data-catalog/aptos/move_resources", + "data-catalog/aptos/move_table_items", + "data-catalog/aptos/signatures", + "data-catalog/aptos/transactions", + "data-catalog/aptos/user_transactions" + ] + }, + { + "group": "Bitcoin", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/bitcoin/overview", + "data-catalog/bitcoin/blocks", + "data-catalog/bitcoin/inputs", + "data-catalog/bitcoin/outputs", + "data-catalog/bitcoin/transactions" + ] + }, + { + "group": "Fuel", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/fuel/overview", + "data-catalog/fuel/blocks", + "data-catalog/fuel/transactions", + "data-catalog/fuel/receipts" + ] + }, + { + "group": "Noble", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/noble/overview", + "data-catalog/noble/blocks", + "data-catalog/noble/block_events", + "data-catalog/noble/bridge_transfers", + "data-catalog/noble/cctp_transactions", + "data-catalog/noble/message_events", + "data-catalog/noble/swaps", + "data-catalog/noble/transactions", + "data-catalog/noble/tx_messages", + "data-catalog/noble/validators" + ] + }, + { + "group": "NEAR", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/near/overview", + "data-catalog/near/actions", + "data-catalog/near/block_chunks", + "data-catalog/near/circulating_supply", + "data-catalog/near/ft_transfers", + "data-catalog/near/function_call", + "data-catalog/near/balances", + "data-catalog/near/nft_transfers", + "data-catalog/near/logs" + ] + }, + { + "group": "Polkadot", + "icon": "database", + "iconType": "regular", + "pages": [ + "data-catalog/substrate/overview", + "data-catalog/substrate/balances", + "data-catalog/substrate/blocks", + "data-catalog/substrate/calls", + "data-catalog/substrate/events", + "data-catalog/substrate/extrinsics", + "data-catalog/substrate/materialized_views", + "data-catalog/substrate/stakings", + "data-catalog/substrate/transfers", + "data-catalog/substrate/traces" + ] + }, + { + "group": "Solana", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/solana/overview", + "data-catalog/solana/account-activity", + "data-catalog/solana/blocks", + "data-catalog/solana/idl-tables", + "data-catalog/solana/instruction-calls", + "data-catalog/solana/rewards", + "data-catalog/solana/transactions", + "data-catalog/solana/vote-transactions" + ] + }, + { + "group": "Starknet", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/starknet/overview", + "data-catalog/starknet/blocks", + "data-catalog/starknet/transactions", + "data-catalog/starknet/events", + "data-catalog/starknet/calls" + ] + }, + { + "group": "Stellar", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/stellar/overview", + "data-catalog/stellar/evm_v_stellar", + "data-catalog/stellar/accounts", + "data-catalog/stellar/trust_lines", + "data-catalog/stellar/ttl", + "data-catalog/stellar/contract_data", + "data-catalog/stellar/history_ledgers", + "data-catalog/stellar/history_transactions", + "data-catalog/stellar/history_operations", + "data-catalog/stellar/history_effects", + "data-catalog/stellar/history_trades", + "data-catalog/stellar/liquidity_pools", + "data-catalog/stellar/history_contract_events" + ] + }, + { + "group": "Sui", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/sui/overview", + "data-catalog/sui/checkpoints", + "data-catalog/sui/events", + "data-catalog/sui/move_call", + "data-catalog/sui/move_package", + "data-catalog/sui/objects", + "data-catalog/sui/transaction_objects", + "data-catalog/sui/transactions", + "data-catalog/sui/wrapped_object" + ] + }, + { + "group": "TON", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/ton/overview", + "data-catalog/ton/accounts", + "data-catalog/ton/balances_history", + "data-catalog/ton/blocks", + "data-catalog/ton/transactions", + "data-catalog/ton/messages", + "data-catalog/ton/dex_pools", + "data-catalog/ton/dex_trades", + "data-catalog/ton/jetton_events", + "data-catalog/ton/jetton_metadata", + "data-catalog/ton/nft_events", + "data-catalog/ton/nft_metadata", + "data-catalog/ton/prices_daily" + ] + }, + { + "group": "XRPL", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/xrpl/overview", + "data-catalog/xrpl/transactions", + "data-catalog/xrpl/ledger", + "data-catalog/xrpl/aggregated_metrics_daily" + ] + }, + { + "group": "Tron", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/tron/overview", + { + "group": "Decoded", + "pages": [ + "data-catalog/tron/decoded/contracts", + "data-catalog/tron/decoded/event-logs", + "data-catalog/tron/decoded/overview" + ] + }, + { + "group": "Raw", + "pages": [ + "data-catalog/tron/raw/blocks", + "data-catalog/tron/raw/logs", + "data-catalog/tron/raw/transactions" + ] + }, + "data-catalog/tron/tether", + { + "group": "Tokens", + "pages": [ + "data-catalog/tron/tokens/overview", + "data-catalog/tron/tokens/transfers/erc1155-transfers", + "data-catalog/tron/tokens/transfers/erc20-transfers", + "data-catalog/tron/tokens/transfers/erc721-transfers" + ] + } + ] + } + ] + }, + { + "group": "Protocols", + "pages": [ + { + "group": "LayerZero", + "icon": "circles-overlap", + "iconType": "solid", + "pages": [ + "data-catalog/layerzero/overview", + "data-catalog/layerzero/messages", + "data-catalog/layerzero/transfers" + ] + }, + { + "group": "Succinct", + "icon": "bolt", + "iconType": "solid", + "pages": [ + "data-catalog/succinct/overview", + "data-catalog/succinct/bids", + "data-catalog/succinct/requests" + ] + } + ] + }, + + { + "group": "Community Data", + "pages": [ + { + "group": "Flashbots", + "icon": "robot", + "pages": [ + "data-catalog/community/flashbots/overview", + "data-catalog/community/flashbots/mempool-dumpster" + ] + }, + { + "group": "Farcaster", + "icon": "torii-gate", + "pages": [ + "data-catalog/community/farcaster/overview", + "data-catalog/community/farcaster/casts", + "data-catalog/community/farcaster/fids", + "data-catalog/community/farcaster/fnames", + "data-catalog/community/farcaster/links", + "data-catalog/community/farcaster/profile_with_addresses", + "data-catalog/community/farcaster/reactions", + "data-catalog/community/farcaster/signers", + "data-catalog/community/farcaster/storage", + "data-catalog/community/farcaster/user_data", + "data-catalog/community/farcaster/verifications", + "data-catalog/community/farcaster/power_badge" + ] + }, + + { + "group": "Lens", + "icon": "cloud", + "pages": [ + "data-catalog/community/lens/overview", + "data-catalog/community/lens/namespace-handle", + "data-catalog/community/lens/namespace-handle-link", + "data-catalog/community/lens/profile-follower", + "data-catalog/community/lens/profile-follow-module", + "data-catalog/community/lens/profile-follow-module-record", + "data-catalog/community/lens/profile-metadata", + "data-catalog/community/lens/profile-record", + "data-catalog/community/lens/publication-metadata", + "data-catalog/community/lens/publication-open-action-module", + "data-catalog/community/lens/publication-open-action-module-acted-recorded", + "data-catalog/community/lens/publication-open-action-module-acted-multirecipient", + "data-catalog/community/lens/publication-reaction", + "data-catalog/community/lens/publication-record", + "data-catalog/community/lens/publication-reference-module" + ] + }, + { + "group": "Reservoir", + "icon": "cube", + "pages": [ + "data-catalog/community/reservoir/overview", + "data-catalog/community/reservoir/ask-events", + "data-catalog/community/reservoir/asks", + "data-catalog/community/reservoir/attribute-keys", + "data-catalog/community/reservoir/attributes", + "data-catalog/community/reservoir/bid-events", + "data-catalog/community/reservoir/bids", + "data-catalog/community/reservoir/collection-floor-ask-events", + "data-catalog/community/reservoir/collection-top-bid-events", + "data-catalog/community/reservoir/collections", + "data-catalog/community/reservoir/sales", + "data-catalog/community/reservoir/token-attributes", + "data-catalog/community/reservoir/token-floor-ask-events", + "data-catalog/community/reservoir/tokens" + ] + }, + { + "group": "Snapshot", + "icon": "bolt", + "pages": [ + "data-catalog/community/snapshot/overview", + "data-catalog/community/snapshot/proposals", + "data-catalog/community/snapshot/votes", + "data-catalog/community/snapshot/users", + "data-catalog/community/snapshot/spaces", + "data-catalog/community/snapshot/follows" + ] + } + ] + }, + { + "group": "Dune Index", + "icon": "chart-line", + "pages": [ + "data-catalog/dune-index/introduction", + "data-catalog/dune-index/gas-fees", + "data-catalog/dune-index/net-transfers", + "data-catalog/dune-index/transactions" + ] + }, + { + "group": "Analytics API", + "pages": [ + "api-reference/overview/introduction", + { + "group": "API Quickstart", + "pages": [ + "api-reference/quickstart/results-eg", + "api-reference/quickstart/queries-eg", + "api-reference/quickstart/tables-eg" + ], + "icon": "forward-fast" + }, + "api-reference/overview/authentication", + "api-reference/overview/sdks", + "api-reference/overview/dunesql-trino-connector", + { + "group": "Result Filtering", + "pages": [ + "api-reference/executions/pagination", + "api-reference/executions/filtering", + "api-reference/executions/sorting", + "api-reference/executions/sampling" + ], + "icon": "filter" + }, + "api-reference/overview/rate-limits", + "api-reference/overview/troubleshooting", + "api-reference/overview/billing", + "api-reference/overview/faq" + ] + }, + { + "group": "SQL Endpoints", + "pages": [ + { + "group": "Executions and Results", + "pages": [ + "api-reference/executions/execution-object", + "api-reference/executions/endpoint/execute-query", + "api-reference/executions/endpoint/cancel-execution", + "api-reference/executions/endpoint/get-execution-status", + "api-reference/executions/endpoint/get-execution-result", + "api-reference/executions/endpoint/get-execution-result-csv", + "api-reference/executions/endpoint/get-query-result", + "api-reference/executions/endpoint/get-query-result-csv" + ] + }, + { + "group": "Queries", + "pages": [ + "api-reference/queries/endpoint/query-object", + "api-reference/queries/endpoint/create", + "api-reference/queries/endpoint/read", + "api-reference/queries/endpoint/update", + "api-reference/queries/endpoint/archive", + "api-reference/queries/endpoint/unarchive", + "api-reference/queries/endpoint/private", + "api-reference/queries/endpoint/unprivate" + ] + }, + { + "group": "Materialized Views", + "pages": [ + "api-reference/materialized-views/get", + "api-reference/materialized-views/create", + "api-reference/materialized-views/delete", + "api-reference/materialized-views/list", + "api-reference/materialized-views/refresh" + ] + }, + { + "group": "Webhooks", + "pages": ["api-reference/webhooks/webhook"] + } + ] + }, + { + "group": "Data Management Endpoints", + "pages": [ + { + "group": "Tables", + "pages": [ + "api-reference/tables/endpoint/overview", + "api-reference/tables/endpoint/create", + "api-reference/tables/endpoint/insert", + "api-reference/tables/endpoint/upload", + "api-reference/tables/endpoint/clear", + "api-reference/tables/endpoint/delete" + ] + } + ] + }, + { + "group": "Preset Endpoints", + "pages": [ + { + "group": "DEX", + "pages": ["api-reference/dex/endpoint/dex_pair"] + }, + { + "group": "EigenLayer", + "pages": [ + "api-reference/eigenlayer/introduction", + "api-reference/eigenlayer/endpoint/avs_metadata", + "api-reference/eigenlayer/endpoint/avs_metrics", + "api-reference/eigenlayer/endpoint/operator_metadata", + "api-reference/eigenlayer/endpoint/operator_metrics", + "api-reference/eigenlayer/endpoint/operator_to_avs_mapping" + ] + }, + { + "group": "EVM Contracts", + "pages": ["api-reference/evm/endpoint/contracts"] + }, + + { + "group": "Farcaster", + "pages": [ + "api-reference/farcaster/introduction", + "api-reference/farcaster/endpoint/farcaster_channels", + "api-reference/farcaster/endpoint/farcaster_memecoins", + "api-reference/farcaster/endpoint/farcaster_users" + ] + }, + { + "group": "Markets", + "pages": ["api-reference/markets/endpoint/marketplace_marketshare"] + }, + { + "group": "Projects", + "pages": [ + "api-reference/projects/introduction", + "api-reference/projects/endpoint/linea_lxp" + ] + } + ] + }, + { + "group": "Datashare", + "pages": [ + "datashare/datashare", + "datashare/datashare-snowflake", + "datashare/datashare-bigquery", + "datashare/datashare-trial", + "datashare/datashare-faqs" + ] + }, + { + "group": "Catalyst", + "pages": ["catalyst/overview"] + } + ], + "feedback": { + "thumbsRating": true, + "raiseIssue": true + }, + "footerSocials": { + "linkedin": "https://www.linkedin.com/company/dune-analytics", + "github": "https://github.com/duneanalytics", + "twitter": "https://x.com/dune", + "discord": "https://discord.gg/ErrzwBz", + "telegram": "https://t.me/dune_updates", + "youtube": "https://www.youtube.com/@dunecom" + }, + "analytics": { + "amplitude": { + "apiKey": "e76ce253e6eaa36e3be8e6872101e33a" + }, + "ga4": { + "measurementId": "G-H1G057R0KN" + }, + "gtm": { + "tagId": "GTM-P46XP3Z5" + } + }, + "redirects": [ + { + "source": "/data-tables/:slug*", + "destination": "/data-catalog/:slug*" + }, + { + "source": "/api-reference/tables/blockchain/overview", + "destination": "/catalyst/hosted" + }, + { + "source": "/api-reference/tables/blockchain/insert", + "destination": "/catalyst/hosted" + }, + { + "source": "/api-reference/tables/blockchain/clear", + "destination": "/catalyst/hosted" + }, + { + "source": "/api-reference/tables/blockchain/delete", + "destination": "/catalyst/hosted" + } + ] +} diff --git a/query-engine/Functions-and-operators/asof-join.mdx b/query-engine/Functions-and-operators/asof-join.mdx new file mode 100644 index 00000000..0b07b4da --- /dev/null +++ b/query-engine/Functions-and-operators/asof-join.mdx @@ -0,0 +1,152 @@ +--- +title: ASOF Join +description: ASOF JOIN in DuneSQL performs nearest-neighbor matching using inequality predicates, making it ideal for temporal lookups like "latest price at trade time" or forward-fill balance snapshots. +--- + +## Overview + +ASOF JOIN in **DuneSQL** lets you join two relations based on the *closest matching row* according to an inequality in the `ON` clause - typically on a timestamp or sequence field. + +This is most useful when you need to: + +- Get the **latest price as of trade time** +- Forward-fill sparse **balance** or **config/state** tables +- Enrich dense time grids (e.g. hourly/daily) from sparse event data +- Tracking actions of an ENS across addresses over time. +- Tracking actions of EIP-7702 enabled wallets by the contract they authorized to. + +Unlike standard joins, **ASOF JOIN does not require exact equality** — it picks the *nearest valid match* according to your inequality condition. + + +ASOF JOIN executes entirely at query time — it does not pre-materialize or store any helper tables. It is a runtime join optimized in the DuneSQL engine. + + +## Syntax + +```sql +SELECT ... +FROM left_relation +ASOF [ LEFT ] JOIN right_relation + ON AND +``` + +## Rules +- **Exactly one inequality is required**, comparing a **right-side expression to a left-side expression** using `<`, `<=`, `>`, or `>=`. +- **Any number of equality predicates** (left.sym = right.sym) are allowed and encouraged. +- **ASOF JOIN** returns only matched left rows (like INNER JOIN). +- **ASOF LEFT JOIN** returns all left rows and fills NULL when no neighbor exists. + + +Typically, expressions compare timestamps: e.g. `prices.ts <= trades.ts` will pick the latest price at or before the trade. + + +## Example +#### Dune's ETH balances over time +[See query on dune.com](https://dune.com/queries/6015716). + +```sql +select + d.timestamp, + b.balance +from utils.days d +asof join tokens_ethereum.balances b +on b.address = 0x7058decc644317062f90525f4C1489AaF456e6B3 --dune.eth + and b.token_standard = 'native' -- native ETH + and b.block_time <= d.timestamp -- ASOF JOIN condition +``` + +``` +-- output +| timestamp | balance | +| ------------------------ | --------------------- | +| 2020-02-27 00:00 | 0.006315391776612467 | +| 2020-02-28 00:00 | 0.006315391776612467 | + +``` + +#### Latest price at trade time +[See query on dune.com](https://dune.com/queries/6015749). +```sql +WITH + trades(ts, sym) AS (VALUES + (TIMESTAMP '2024-01-01 09:30:05', 'ABC'), + (TIMESTAMP '2024-01-01 09:30:07', 'ABC') + ), + quotes(ts, sym, price) AS (VALUES + (TIMESTAMP '2024-01-01 09:30:00', 'ABC', 100.0), + (TIMESTAMP '2024-01-01 09:30:06', 'ABC', 101.5) + ) +SELECT trades.ts, quotes.price +FROM trades +ASOF JOIN quotes ON trades.sym = quotes.sym AND quotes.ts <= trades.ts +ORDER BY 1 +``` + +``` +-- output +| ts | price | +| ------------------------ | --------------------- | +| 2024-01-01 09:30:05 | 100.0 | +| 2024-01-01 09:30:07 | 101.5 | +``` + +#### Forward-fill with ASOF LEFT JOIN +[See query on dune.com](https://dune.com/queries/6015744). + +```sql +WITH + readings(read_time) AS ( + VALUES (TIMESTAMP '2024-01-01 10:00:00'), + (TIMESTAMP '2024-01-01 10:05:00') + ), + calibrations(effective_time, factor) AS ( + VALUES (TIMESTAMP '2024-01-01 10:01:00', 1.02) + ) +SELECT readings.read_time, calibrations.factor +FROM readings ASOF LEFT JOIN calibrations + ON calibrations.effective_time >= readings.read_time +ORDER BY 1 +``` + +``` +-- output +| read_time | factor | +| ------------------------ | --------------------- | +| 2024-01-01 10:00:00 | 1.02 | +| 2024-01-01 10:05:00 | NULL | +``` + +## Performance +ASOF JOIN consistently outperforms LEAD() + range joins for large temporal enrichments. +Below is a rounded summary from production-scale testing (millions of rows): + + + +ASOF JOIN combines **cleaner SQL** and **runtime performance gains** when data is sparse or when “nearest match” logic is required. + + +## When to use ASOF JOIN +**✅ Recommended when:** +- You need a point-in-time snapshot (latest state, price, config) +- You are forward-filling sparse events into a regular time spine +- Data is sparse or high-cardinality (wallet balances, token prices) + +**⚠️ Consider alternatives when:** +- You just need window aggregates (e.g. moving averages) → use window functions +- You already materialize reusable helper tables with valid ranges → consider pre-filled models + +## Limitations +- **Exactly one inequality** is required in the ON clause. +- Joins based on multiple inequalities are not supported — add extra conditions via equality or `WHERE`. + +## Best Practices +- **Always constrain with equality first** (token, address, etc.) to avoid scanning irrelevant rows. +- Use `ASOF LEFT` when you need to preserve all left rows, even if no match exists. +- Prefer `<=` or `>=` for clear open/closed interval intent. +- Document the direction, as inequality can compare from right to left or from left to right (e.g., `right.ts <= left.ts` or `left.ts >= right.ts`): + - `<=` → “most recent up to this timestamp” (historical lookup) + - `>=` → “next upcoming record” (future-effective lookup) + + +Think in terms of **“as of X, what was true?”** — that’s the strongest signal that ASOF JOIN is appropriate. + \ No newline at end of file diff --git a/query-engine/Functions-and-operators/index.mdx b/query-engine/Functions-and-operators/index.mdx index d1d3243d..bc48fdaa 100644 --- a/query-engine/Functions-and-operators/index.mdx +++ b/query-engine/Functions-and-operators/index.mdx @@ -8,7 +8,7 @@ This chapter describes the built-in SQL functions and operators supported by Tri Using ``SHOW FUNCTIONS`` in the query editor returns a list of all available functions, including custom functions, with all supported arguments and a short description. -### DuneSQL Added Functions: +### DuneSQL Added Functions and Operators: - [Varbinary datatypes for EVM data](/query-engine/Functions-and-operators/varbinary) - [Base58 for Bitcoin&Solana data](/query-engine/Functions-and-operators/base58) - [ss58 for Substrate data](/query-engine/Functions-and-operators/ss58) @@ -16,9 +16,10 @@ Using ``SHOW FUNCTIONS`` in the query editor returns a list of all available fun - [Chain Utility Functions](/query-engine/Functions-and-operators/chain-utility-functions) - [Varchar Utility Functions](/query-engine/Functions-and-operators/varchar-utility-functions) - [LiveFetch Functions](/query-engine/Functions-and-operators/live-fetch) +- [ASOF Join](/query-engine/Functions-and-operators/asof-join) ### Trino Base Functions: -- [Aggregate](query-engine/Functions-and-operators/aggregate) +- [Aggregate](/query-engine/Functions-and-operators/aggregate) - [Array](/query-engine/Functions-and-operators/array) - [Binary](/query-engine/Functions-and-operators/binary) - [Bitwise](/query-engine/Functions-and-operators/bitwise) diff --git a/query-engine/dunesql-architecture.mdx b/query-engine/dunesql-architecture.mdx new file mode 100644 index 00000000..a30d931e --- /dev/null +++ b/query-engine/dunesql-architecture.mdx @@ -0,0 +1,101 @@ +--- +title: DuneSQL Architecture +description: Understand how DuneSQL's query engine works. +--- + +**DuneSQL is built on a sophisticated architecture designed for handling blockchain data at scale. Understanding this architecture helps you write more efficient queries and get the most out of the system.** + +DuneSQL is a Trino-based query engine designed for handling data stored in a columnar format. More specifically, we use Parquet files as the underlying storage format, with Delta Lake providing additional capabilities for data management and versioning. +This architecture allows for efficient data access and query processing, as well as fast data loading and data compression. + +## Database Fundamentals + +At their core, databases are sophisticated systems designed to store, retrieve, and manage data. Their primary goal is to provide fast, efficient, and reliable access to vast amounts of structured information. You can think of a database as a collection of tables, where each table is a collection of rows and columns. Conceptually, these tables exist in two ways: + +- **Logical**: The logical view of a table is the way the data is organized and presented to the user. This is the view you see when you query a table. +- **Physical**: The physical view of a table is the way the data is stored on disk. This is the view you see when you look at the underlying files that make up the table. + +Databases are designed to optimize for the logical view of a table, which is the view that users interact with. However, the physical view of a table is also important, as it determines how the data is stored and accessed. In order to optimize the usability of the logical view of a table, databases use a variety of techniques to optimize the physical view of a table. These techniques include: + +- **Data partitioning**: Data partitioning is a technique that divides data into smaller chunks called partitions. This reduces the amount of data that needs to be stored and accessed, which improves performance. +- **Data indexing**: Data indexing is a technique that creates a data structure called an index. This data structure contains information about the data in a table, which allows the database to quickly find the data it needs. +- **Data storage layout**: Data storage layout relates to how the data is stored on disk. This includes the file format, how the data is physically stored on disk, and how the data is organized in memory. The right data storage layout can significantly improve performance. +- **Data compression**: Data compression is a technique that reduces the size of data by removing redundant information. This reduces the amount of data that needs to be stored and accessed, which improves performance. +- **Data caching**: Data caching is a technique that stores frequently accessed data in memory. This reduces the amount of data that needs to be stored and accessed, which improves performance. + +For the most part, these techniques are employed in the background and are not visible to the user. However, understanding how **data partitioning**, **data indexing** and the **data storage layout** work is essential for understanding how DuneSQL works. + +Databases employ these techniques to combat their most significant challenge: **the I/O bound nature of data storage**. I/O bound refers to the fact that the speed of data access is limited by the speed of the storage device. Read speed, the time it takes to load data from storage to memory, is an essential constraint of databases. + +Every time you query a table, the database needs to read the data from disk into memory. This happens in a unit called a page. Pages are the smallest unit of data that can be read from disk into memory. Since reading pages from disk is slow, databases try to minimize the number of pages that need to be read into memory when querying a table. This is where data partitioning and data indexing come into play. + +**To quickly summarize:** The goal of a database is to provide fast, efficient, and reliable access to vast amounts of structured information. In the end, we want to access the logical view of a table as quickly as possible. To do this, database administrators use a variety of techniques to optimize the physical view of a table. These techniques include data partitioning, data indexing, data compression, and data caching. The goal of these techniques is to minimize the number of pages that need to be read into memory when querying a table. + +## DuneSQL Storage Architecture + +Dune stores data in Parquet files, which are first and foremost columnar storage files, but also utilize some of the advantages of row-oriented storage. Data in Parquet systems is partitioned by rows into multiple Parquet files, and within each file, the data is further partitioned into row groups. However, the pages inside of row groups store data in columns rather than rows. As a result, the database appears row-oriented at a higher level, but it reads data from column-oriented pages when accessing specific values. + +Additionally, each Parquet file contains metadata about the data it stores, mainly **min/max** column statistics for each column. This allows the database to efficiently skip entire Parquet files or row groups within files while scanning through a table, provided that the column contains values that are not random and can be ordered. + + + + + + + + + +What's important to understand here is that the traditional index structure of a database is not needed in DuneSQL. Instead, the `min/max` values of each column are used to efficiently skip entire Parquet files or row groups within files while scanning through a table, provided that the column contains values that are not random and can be ordered. This is a key difference between DuneSQL and other databases like Snowflake. + +## Query Processing in DuneSQL + +If you query a table in DuneSQL, the system will access the data in the following order: + +1. **File Level:** At the foundational level, the query engine locates the specific Parquet files associated with the table or a portion of the table being queried. It reads the metadata contained in the footer of each Parquet file to determine whether it might contain the data needed for the query. It will skip any files that do not contain the data needed for the query. + +2. **Row Group Level:** Once the appropriate Parquet file is identified, the engine will access the relevant row groups within the file, based on the query conditions. Again, it will first read the metadata of each row group to determine whether it might contain the data needed for the query. If the row group does not contain the data needed for the query, it will skip the row group and move on to the next one. + +3. **Column Chunk Level:** Once the appropriate row group is identified, the system will access the relevant column chunks within the row group, based on the query conditions. The column chunks contain the actual data that is needed for the query. The database will only read the column chunks that contain the data needed for the query. It will not read the logical row - saving time and resources. + +4. **Page Level:** Within the column chunk, the data is further segmented into pages. The database reads these pages into memory, benefiting from any compression or encoding optimizations. + +During this process the engine starts stream processing from the first chunks of data it has read. It will optimize on the fly: based on the data it has already read, it can resign from reading other data if that data is recognized as irrelevant. This is called dynamic filtering and will usually save a lot of resources. + +If the query is too large to be processed in memory, the data will "spill" from memory to disk. This is called "spill to disk" and is a common occurrence in databases. This will negatively impact query performance, as reading data from disk is much slower than reading data from memory. + +## Delta Lake Integration + +DuneSQL also leverages Delta Lake for additional data management capabilities. Delta Lake provides: + +- **ACID transactions**: Ensures data consistency and reliability +- **Schema evolution**: Allows tables to evolve over time without breaking existing queries +- **Time travel**: Enables querying historical versions of data +- **Upserts and deletes**: Supports more complex data operations than traditional Parquet files +- **Data versioning**: Maintains a complete history of changes to the data + +The combination of Parquet's columnar storage format with Delta Lake's data management capabilities provides DuneSQL with both high performance and data reliability features essential for blockchain data processing. + +## Time Partitioning + +DuneSQL leverages time-based partitioning extensively, as blockchain data is inherently time-ordered. Most tables are partitioned by: + +- **Block time**: The timestamp when a block was mined +- **Block date**: The date component of block time (often more efficient for queries) +- **Block number**: The sequential number of the block + +This partitioning strategy allows the query engine to quickly identify and skip irrelevant time periods, dramatically reducing the amount of data that needs to be processed for time-based queries. + +## Columnar Storage Benefits + +The columnar storage format provides several key advantages for blockchain data: + +- **Compression**: Similar data types in columns compress very well, reducing storage requirements +- **Selective column reading**: Only the columns needed for a query are read from disk +- **Vectorized processing**: Operations can be performed on entire columns at once +- **Better cache utilization**: Related data is stored together, improving memory access patterns + +## Notable Exceptions + +A notable exception to the general rule of using sequentially ordered columns is the Solana dataset `account_activity`, which is ordered by `account_keys` rather than `block_time`. This allows for utilizing the min/max values for `account_keys` when building queries based on raw Solana data. + +This architecture makes DuneSQL particularly well-suited for blockchain data analysis, where queries often involve time-based filtering and aggregations across large datasets. The combination of Trino's distributed query processing, Parquet's columnar storage, and Delta Lake's data management provides a robust foundation for handling the scale and complexity of blockchain data. diff --git a/query-engine/materialized-views.mdx b/query-engine/materialized-views.mdx index 84566edf..a044a6ad 100644 --- a/query-engine/materialized-views.mdx +++ b/query-engine/materialized-views.mdx @@ -25,7 +25,7 @@ Write a new query or go to an existing query. (We suggest creating via team cont 1. Make sure all columns are explicitly named (i.e. `SELECT count(*)` will not work) 2. Save the query 3. After saving a “materialize” button will appear below the run button. -4. Click the materialize button, and set a refresh schedule and execution tier. Each refresh uses up credits based on cluster used. +4. Click the materialize button, and set a refresh schedule and execution tier. Each refresh consumes credits based on actual compute resources used.
-
+{/* ARCADE EMBED START */} +