Интеграция с Transpose API
Transpose — это SQL-интерфейс поверх блокчейн-данных. Вместо того чтобы писать и поддерживать собственный индексер, вы пишете обычный SQL-запрос и получаете исторические данные по транзакциям, токенам, NFT, DeFi протоколам. Поддерживаются Ethereum, Polygon, Optimism, Arbitrum, Base, BSC.
Когда это имеет смысл: аналитические задачи, MVP, внутренние дашборды, исследования. Когда не имеет: real-time события с latency < 1 секунды, кастомные контракты с нестандартными событиями, объёмы запросов, которые делают Transpose экономически невыгодным.
Работа с API
Transpose предоставляет два интерфейса: SQL API (произвольные запросы) и REST API (предопределённые endpoints для типовых запросов).
SQL API — основной инструмент для нетривиальных задач:
const TRANSPOSE_KEY = process.env.TRANSPOSE_API_KEY
async function queryTranspose<T>(sql: string): Promise<T[]> {
const response = await fetch('https://api.transpose.io/sql', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-KEY': TRANSPOSE_KEY,
},
body: JSON.stringify({ sql }),
})
if (!response.ok) {
const error = await response.json()
throw new Error(`Transpose error: ${error.message}`)
}
const data = await response.json()
return data.results as T[]
}
// Пример: топ-10 холдеров токена
const topHolders = await queryTranspose<{ address: string; balance: string }>(`
SELECT owner_address AS address, balance
FROM ethereum.token_owners
WHERE contract_address = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'
ORDER BY balance DESC
LIMIT 10
`)
Основные таблицы
Transpose организует данные в схемы по блокчейну (ethereum, polygon и т.д.). Ключевые таблицы:
| Таблица | Содержимое |
|---|---|
ethereum.transactions |
Все транзакции: hash, from, to, value, gas, status |
ethereum.logs |
Сырые event logs: address, topics, data |
ethereum.token_transfers |
Декодированные ERC-20 трансферы |
ethereum.nft_transfers |
ERC-721/1155 трансферы |
ethereum.token_owners |
Текущие балансы ERC-20 |
ethereum.nft_owners |
Текущие владельцы NFT |
ethereum.accounts |
Адреса: тип (EOA/contract), баланс ETH, первая транзакция |
Типичные паттерны запросов
Активность кошелька за период:
SELECT
DATE_TRUNC('day', timestamp) AS day,
COUNT(*) AS tx_count,
SUM(value::numeric / 1e18) AS eth_sent
FROM ethereum.transactions
WHERE from_address = '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'
AND timestamp >= NOW() - INTERVAL '30 days'
GROUP BY 1
ORDER BY 1
История трансферов конкретного токена на адрес:
SELECT
t.timestamp,
t.transaction_hash,
t.from_address,
t.to_address,
(t.quantity::numeric / POW(10, tk.decimals)) AS amount,
tk.symbol
FROM ethereum.token_transfers t
JOIN ethereum.tokens tk ON t.contract_address = tk.contract_address
WHERE t.to_address = '0xYourAddress'
AND t.contract_address IN (
'0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', -- USDC
'0xdAC17F958D2ee523a2206206994597C13D831ec7' -- USDT
)
ORDER BY t.timestamp DESC
LIMIT 100
Ограничения и rate limits
Бесплатный план: 1 запрос/секунду, 10 000 строк/запрос, 100 запросов/день. Платные планы снимают большинство ограничений, но стоимость растёт с объёмом.
Практические ограничения которые нужно учитывать:
- Данные с задержкой ~2 минуты от реального времени (не для real-time систем)
- Максимальный размер результата — 10 000 строк, для больших выборок нужна пагинация через
OFFSET/LIMIT - Сложные JOIN между схемами (cross-chain) не поддерживаются
Для интеграции в production API рекомендуется кеширование результатов — большинство аналитических запросов не требует данных свежее 5-10 минут:
import { createClient } from 'redis'
const redis = createClient({ url: process.env.REDIS_URL })
async function cachedTransposeQuery<T>(sql: string, ttlSeconds = 300): Promise<T[]> {
const key = `transpose:${Buffer.from(sql).toString('base64').slice(0, 64)}`
const cached = await redis.get(key)
if (cached) return JSON.parse(cached)
const results = await queryTranspose<T>(sql)
await redis.setEx(key, ttlSeconds, JSON.stringify(results))
return results
}
Интеграция занимает 1-2 дня: настройка API-клиента, определение нужных запросов, кеширование, error handling с retry для 429 ответов.







