К основному содержанию
скилл CX Codex

turbo-transforms — скилл для Claude Code: SQL

Помогает писать и отлаживать трансформации для Turbo-пайплайнов: декодирование EVM-логов, фильтры, TypeScript-скрипты, динамические таблицы.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add goldsky-io/goldsky-agent --skill turbo-transforms -a claude-code
Открыть на GitHub

Что делает turbo-transforms

Скилл разбирает задачу по типу: декодировать, отфильтровать, пересобрать схему, объединить события, добавить свою логику или lookup-join. Под каждый случай в нём есть раздел с готовыми шаблонами SQL и YAML.

Внутри — справочные файлы по темам: references/evm-patterns.md для продвинутых EVM-паттернов, references/typescript-transforms.md для скриптовых и handler-трансформаций, references/dynamic-tables.md для allowlist и lookup-join, references/solana-patterns.md для декодирования инструкций и логов Solana. Ключевые функции — evm_log_decode() (алиасы _gs_log_decode, evm_decode_log), fetch_abi(), _gs_keccak256(), dynamic_table_check(), to_u256(). Скилл отдельно предупреждает: Turbo SQL работает в streaming-режиме на Apache DataFusion, поэтому JOIN, агрегаты, оконные функции и подзапросы там не поддерживаются — для join нужны dynamic_table-трансформации, для агрегатов sink postgres_aggregate. Это повод проверить свой запрос до запуска.

Если скилл генерирует полный YAML пайплайна, а не отдельный фрагмент, он советует прогнать goldsky turbo validate перед тем, как отдавать конфиг. Для структуры YAML есть отдельный скилл /turbo-pipelines, для сборки пайплайна целиком — /turbo-builder.

Какие задачи решает

  • декодировать Transfer-события из сырых EVM-логов
  • отфильтровать трансферы по адресу контракта
  • собрать несколько типов событий в один поток через UNION ALL
  • написать TypeScript-трансформацию с вызовом функции
  • подтянуть значения из динамической lookup-таблицы

Примеры запросов агенту

  • Декодируй Transfer-события из моего источника сырых логов и оставь только переводы USDC
  • Напиши SQL-трансформацию, которая фильтрует по адресу контракта и приводит сумму к 18 знакам
  • Собери TypeScript-трансформацию для Turbo-пайплайна и проверь её через goldsky turbo validate

Как установить turbo-transforms

1Через Skills CLI (Vercel)

npx skills add goldsky-io/goldsky-agent --skill turbo-transforms -a claude-code

2Вручную: положить файлы

~/.claude/skills/turbo-transforms/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/turbo-transforms/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Из того же набора15

turbo-operations Справочник по операциям с Turbo-пайплайнами: пауза, перезапуск, удаление, состояния, чекпоинты и разбор ошибок. Пригодится, когда пайплайн сломался или нужно понять, что значит ошибка. CX Codex +1 3 500установок secrets Скилл ведёт агента через создание, просмотр, ротацию и удаление секретов Goldsky — именованных объектов с учётными данными для sink пайплайнов. CX Codex +1 3 600установок turbo-doctor Интерактивная диагностика сбоев в пайплайнах Goldsky Turbo. Помогает найти причину ошибок по логам, проверить секреты и вернуть поток данных в строй. CX Codex +1 3 500установок auth-setup Ставит Goldsky CLI, проводит через goldsky login и проверяет, что проект подключён. Пригодится, когда команды отвечают «unauthorized». CX Codex +1 3 600установок turbo-builder Проведёт по шагам от постановки задачи до задеплоенного YAML-пайплайна Goldsky Turbo: выбор датасета, источники, трансформы, приёмники. CX Codex +1 3 600установок turbo-pipelines Справочник по YAML и архитектуре пайплайнов Goldsky Turbo: поля, источники, трансформации, стоки и размеры ресурсов. Пригодится, когда агент пишет конфиг пайплайна. CX Codex +1 3 600установок onchain-automation Скилл, который помогает агенту собрать цикл «событие в сети → логика → транзакция» на продуктах Goldsky. CX Codex +1 3 400установок subgraph-doctor Скилл находит причину, почему Goldsky Subgraph не индексирует, завис или не деплоится, и подсказывает, как починить. CX Codex +1 3 500установок

Похожие

unify-balance circlefin Скилл учит агента писать код для единого баланса USDC между блокчейнами через Circle App Kit или Unified Balance Kit. Пригодится, если делаете chain-abstracted платежи. CX Codex +1 804установок solana-dev Solana Foundation Скилл для написания Solana dApp, смарт-контрактов на Anchor, управления кошельками и транзакциями. Охватывает всё: от настройки окружения до тестирования и деплоя на devnet. CX Codex +1 98 900установок use-arc circlefin Подсказывает агенту, как настроить сеть Arc, задеплоить контракт и не перепутать два вида баланса USDC. Пригодится, если проект строится вокруг USDC. CX Codex +1 1 000установок appkit reown-com Скилл ведёт агента по интеграции Reown AppKit: модальное окно кошелька, смена сети, EVM, Solana и Bitcoin. Пригодится, когда в веб-приложение надо добавить подключение кошелька. CX Codex +1 1 100установок dune duneanalytics Запускает SQL-запросы к ончейн-данным через Dune CLI, ищет таблицы контрактов и управляет дашбордами. Пригодится для аналитики блокчейна прямо в диалоге с агентом. CX Codex +1 1 100установок agentwallet frames-engineering Скилл даёт ИИ-агенту серверный кошелёк: платит по x402 и MPP, подписывает транзакции на сервере и держит траты в рамках политики. CX Codex +1 2 600установок

Рядом в теме «Данные и базы»

Все скиллы по теме «Данные и базы» →

Вопросы о turbo-transforms

Как установить turbo-transforms в Claude?

Выполните npx skills add goldsky-io/goldsky-agent --skill turbo-transforms -a claude-code. После этого файл скилла окажется по пути ~/.claude/skills/turbo-transforms/SKILL.md.

Что делает turbo-transforms?

Помогает писать, понимать и отлаживать SQL, TypeScript и dynamic_table-трансформации для конфигураций Turbo-пайплайнов. Покрывает декодирование EVM-логов, фильтрацию и приведение типов, объединение событий, lookup-таблицы и декодирование Solana.

Какие SQL-возможности не поддерживаются в Turbo?

Turbo SQL работает в streaming-режиме на Apache DataFusion, поэтому JOIN, агрегаты, оконные функции и подзапросы недоступны. CTE при этом поддерживаются, а для join скилл предлагает dynamic_table-трансформации.

Исходный текст

SKILL.md · MIT
---
name: turbo-transforms
description: "Write SQL, TypeScript, and dynamic table transforms for Turbo pipelines. Covers: decoding EVM logs with _gs_log_decode, filtering/casting blockchain data, UNION ALL for combining events, TypeScript/WASM transforms (invoke function), dynamic lookup tables (dynamic_table_check), transform chaining, and Solana decoding. Triggers on: 'decode Transfer events', 'write a SQL transform', 'filter by contract', 'TypeScript transform', 'dynamic table', 'UNION ALL'. For pipeline YAML structure, use /turbo-pipelines. For end-to-end building, use /turbo-builder."
---

# Turbo Transforms

Write, understand, and debug SQL, TypeScript, and dynamic table transforms for Turbo pipeline configurations.

Identify what the user needs (decode, filter, reshape, combine, custom logic, or lookup joins), then use the relevant section below. If generating a complete pipeline YAML (not just a transform snippet), always validate with `goldsky turbo validate` before presenting it to the user.

**Reference files for specialized topics:**
- `references/evm-patterns.md` — Advanced EVM patterns (decode-once-filter-many, UNION ALL, schema normalization)
- `references/typescript-transforms.md` — TypeScript/WASM script transforms and handler transforms
- `references/dynamic-tables.md` — Dynamic table transforms (allowlists, lookup joins)
- `references/solana-patterns.md` — Solana instruction/log decoding and function examples

---

## Transform Basics

### YAML Structure

```yaml
transforms:
  my_transform:
    type: sql
    primary_key: id
    sql: |
      SELECT id, block_number, address
      FROM my_source
      WHERE address = '0xabc...'
```

### Required Fields

| Field         | Required | Description                                                  |
| ------------- | -------- | ------------------------------------------------------------ |
| `type`        | Yes      | `sql`, `script`, `handler`, `dynamic_table`, or `throttle`   |
| `primary_key` | Yes\*    | Column used for uniqueness and ordering (\*not for `throttle`) |
| `sql`         | Yes      | SQL query (for `sql` type transforms)                        |

### Referencing Data

- Reference **sources** by their YAML key name: `FROM my_source`
- Reference **other transforms** by their YAML key name: `FROM my_transform`
- No need for a `from` field in SQL transforms — the `FROM` clause in SQL handles it

### SQL Streaming Limitations

Turbo SQL is powered by Apache DataFusion in streaming mode. The following are **NOT supported**:

- **Joins** — use `dynamic_table` transforms for lookup-style joins instead
- **Aggregations** (GROUP BY, COUNT, SUM, AVG) — use `postgres_aggregate` sink instead
- **Window functions** (OVER, PARTITION BY, ROW_NUMBER)
- **Subqueries** — use transform chaining instead
- **CTEs** (WITH...AS) **are** supported

### The `_gs_op` Column

Every record includes a `_gs_op` column that tracks the operation type: `'i'` (insert), `'u'` (update), `'d'` (delete). Preserve this column through transforms for correct upsert semantics in database sinks.

---

## Key SQL Functions

Quick reference for the most-used functions. For the complete function reference, see [SQL transforms](https://docs.goldsky.com/turbo-pipelines/transforms/sql) in the docs.

### `evm_log_decode()` — Decode Raw EVM Logs

```sql
evm_log_decode(abi_json, topics, data) -> STRUCT<name, event_params>
-- Aliases: _gs_log_decode, evm_decode_log
```

Returns `decoded.event_signature` (event name) and `decoded.event_params[N]` (1-indexed parameters as strings).

**Example:**
```sql
SELECT
  _gs_log_decode('[{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]',
    topics, data) AS decoded,
  id, block_number, transaction_hash, address, block_timestamp
FROM my_raw_logs
```

**Tips:** Backtick-escape reserved words (`` `data` ``, `` `decoded` ``). Include all event ABIs in one array. Pre-filter by contract address at the source level for efficiency.

### Other Key Functions

| Function | Purpose |
| -------- | ------- |
| `fetch_abi(url, format)` | Fetch ABI from URL (`'raw'` or `'etherscan'` format) |
| `_gs_keccak256(string)` | Keccak256 hash (returns hex with `0x` prefix) |
| `xxhash(string)` | Fast non-cryptographic hash for composite keys |
| `to_u256(value)` / `u256_to_string(u256)` | 256-bit integer math (avoids precision loss) |
| `dynamic_table_check(table, value)` | Check if value exists in a dynamic lookup table |
| `to_timestamp(seconds)` | Convert unix seconds to timestamp |

---

## Common Transform Patterns

### Table Aliasing

```sql
SELECT balance.token_type, balance.owner_address,
  CAST(`balance` AS STRING) AS balance_amount
FROM my_balances_source balance
WHERE balance.token_type = 'ERC_20' AND balance.balance IS NOT NULL
```

### Simple Filtering

```yaml
transforms:
  usdc_transfers:
    type: sql
    primary_key: id
    sql: |
      SELECT * FROM base_transfers
      WHERE address = lower('0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913')
```

### Column Projection and Aliasing

```yaml
transforms:
  clean_transfers:
    type: sql
    primary_key: id
    sql: |
      SELECT id, block_number, to_timestamp(block_timestamp) AS block_time,
        address AS token_address, sender, recipient, amount
      FROM my_source
```

### Type Casting and Numeric Scaling

```sql
-- Token amount conversions
(CAST(decoded.event_params[3] AS DOUBLE) / 1e6) AS amount_usdc    -- 6 decimals
(CAST(decoded.event_params[3] AS DOUBLE) / 1e18) AS amount_eth    -- 18 decimals
CAST(`balance` AS STRING) AS balance_amount                        -- preserve precision
```

| Token          | Decimals | Divisor |
| -------------- | -------- | ------- |
| USDC, USDT     | 6        | `1e6`   |
| WBTC           | 8        | `1e8`   |
| ETH, most ERC-20 | 18    | `1e18`  |

### Conditional Logic with CASE WHEN

```sql
CASE WHEN decoded.event_params[4] = '0' THEN 'BUY' ELSE 'SELL' END AS side
```

### Exclusion Filters

```sql
WHERE decoded.event_params[1] NOT IN ('0x4bfb...', '0xc5d5...', '0x4d97...')
```

### Transform Chaining

Build multi-step pipelines where each transform reads from the previous:

```yaml
transforms:
  decoded:
    type: sql
    primary_key: id
    sql: |
      SELECT _gs_log_decode('[...]', topics, data) AS decoded,
        id, block_number, transaction_hash, address, block_timestamp
      FROM raw_logs_source
  transfers:
    type: sql
    primary_key: id
    sql: |
      SELECT id, block_number, decoded.event_params[1] AS from_address,
        decoded.event_params[2] AS to_address,
        (CAST(decoded.event_params[3] AS DOUBLE) / 1e18) AS amount
      FROM decoded
      WHERE decoded.event_signature = 'Transfer'
```

### UNION ALL — Combining Multiple Event Types

Combine transforms with identical schemas into a single output:

```yaml
  all_events:
    type: sql
    primary_key: id
    sql: |
      SELECT * FROM transfers
      UNION ALL
      SELECT * FROM approvals
```

All branches must have the same columns in the same order. Use `''` or `0` as placeholders.

For advanced EVM patterns (decode-once-filter-many, normalizing disparate events, multi-event activity feeds), read `references/evm-patterns.md`.

---

## Source-Level Filtering

Filter data **at the source** before it reaches transforms for efficiency:

```yaml
sources:
  my_logs:
    type: dataset
    dataset_name: matic.raw_logs
    version: 1.0.0
    start_at: earliest
    filter: >-
      address IN ('0xabc...', '0xdef...')
      AND block_number >= 82422949
```

- Source `filter:` → coarse pre-filtering (contract addresses, block ranges)
- Transform `WHERE` → fine-grained filtering (event types, parameter values, exclusions)

---

## Sink Batching Configuration

```yaml
sinks:
  my_sink:
    type: clickhouse
    from: my_transform
    table: my_table
    secret_name: MY_SECRET
    primary_key: id
    batch_size: 1000
    batch_flush_interval: 300ms
```

| Use Case | `batch_flush_interval` | `batch_size` |
| -------- | ---------------------- | ------------ |
| Real-time dashboards | `300ms` | `1000` |
| Moderate throughput | `1000ms` | `1000` |
| High-volume streaming | `10s` | `100000` |

---

## Debugging Transforms

**"Unknown source reference"** — `FROM` clause name doesn't match any source/transform key. Check for typos.

**"Missing primary_key"** — Every transform needs `primary_key`. Almost always use `id`.

**"Column not found"** — Use `goldsky turbo inspect <pipeline> -n <source_node> -p` to see actual columns.

**Empty results from decoded events:**
- Verify ABI JSON matches actual contract events
- Check `decoded.event_signature` matches event name exactly (case-sensitive)
- Ensure `address` filter matches correct contract
- Parameters are **1-indexed**: `decoded.event_params[1]`, not `[0]`

**Type mismatch in UNION ALL** — All branches need identical column counts and compatible types.

```bash
goldsky turbo inspect <pipeline-name> -n <transform_name> -p
```

---

## TypeScript / WASM Script Transforms

For logic SQL can't express: custom parsing, BigInt arithmetic, stateful processing. Schema types: `string`, `uint64`, `int64`, `float64`, `boolean`, `bytes`.

Key rules: define `function invoke(data)`, return `null` to filter, return object matching schema, no async/await or external imports.

See `references/typescript-transforms.md` for full docs, examples, and the SQL-vs-script decision table. Also includes Handler transforms for HTTP enrichment.

---

## Dynamic Table Transforms

Updatable lookup tables for allowlists, blocklists, and join-style enrichment — without redeploying. Backed by PostgreSQL (durable) or in-memory (fast). Use `dynamic_table_check('table_name', column)` in SQL.

See `references/dynamic-tables.md` for full config, backend options, REST API updates, and wallet-tracking example.

---

## Throttle Transform (Flow Control)

Caps the throughput of a stream by buffering records into batches and emitting each batch on a fixed minimum interval. Throttle does **not** modify data — every input record passes through unchanged. Use it to:

- Stay under rate limits of downstream sinks or external APIs
- Smooth bursty sources into a steady, predictable rate
- Pace records into an HTTP `handler` so the receiving service is not overwhelmed
- Slow down processing during development or testing

```yaml
transforms:
  throttled:
    type: throttle
    from: my_source       # source or transform
    max_batch_size: 100
    min_batch_interval: 10s
```

| Field                | Required | Description                                              |
| -------------------- | -------- | -------------------------------------------------------- |
| `type`               | Yes      | `throttle`                                               |
| `from`               | Yes      | Source or transform to read from                         |
| `max_batch_size`     | No       | Max records per batch                                    |
| `min_batch_interval` | No       | Minimum time between batches (e.g. `10s`, `500ms`, `1m`) |

A batch is flushed downstream when **both** `max_batch_size` records have accumulated **and** `min_batch_interval` has elapsed since the previous batch. Effective max throughput ≈ `max_batch_size / min_batch_interval` records per second.

**Best practices:**

- Place throttle close to the bottleneck (just before the rate-limited sink/handler) so upstream transforms still process at full speed.
- Tune `max_batch_size` to match the downstream sink's preferred batch size.
- Throttle is a `transform` — chain other transforms downstream from it the same way you would any other transform (e.g. `from: throttled` in a sink).
- Throttle does not have a `primary_key` field (records pass through unchanged).
- Remove throttle in production where possible; it caps throughput by design.

## Solana Transform Patterns

IDL-based instruction decoding, program-specific decoders (Token, System, Stake, Vote), SPL token tracking.

See `references/solana-patterns.md` for all built-in decoders, full example pipeline, and array/JSON/hex function usage.

---

## Related

- **`/turbo-builder`** — Build and deploy pipelines interactively using these transforms
- **`/turbo-doctor`** — Diagnose and fix pipeline issues (including transform errors)
- **`/turbo-pipelines`** — Pipeline YAML configuration and architecture reference
- **`/turbo-operations`** — Lifecycle commands and monitoring reference
- **`/datasets`** — Blockchain dataset and chain prefix reference

© goldsky-io · MIT · goldsky-io/goldsky-agent

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой