# Agent Skills Source: https://docs.goldsky.com/ai-skills AI skills for building, deploying, and debugging Goldsky Turbo, Mirror, Subgraphs, Compose, and Edge with Claude Code, Cursor, and other AI coding assistants ## Overview [Goldsky Agent](https://github.com/goldsky-io/goldsky-agent) is a skill pack for AI coding assistants that helps you build, deploy, and debug across the full Goldsky product surface: Turbo pipelines, Mirror pipelines, Subgraphs, Compose, and Edge RPC. Skills auto-trigger based on what you describe; no slash commands required. Interactive workflow skills walk you through multi-step tasks end-to-end. Reference skills provide YAML syntax, manifest fields, error patterns, and CLI commands on demand. Works with Claude Code, Cursor, Windsurf, OpenCode, Codex, and other AI coding assistants. ## Quick start | I want to... | Use | | - | - | | Build a new Turbo pipeline | `/turbo-builder` | | Fix a broken Turbo pipeline | `/turbo-doctor` | | Fix a broken Mirror pipeline | `/mirror-doctor` | | Fix a broken Compose app | `/compose-doctor` | | Build / deploy a subgraph | `/subgraph-builder` | | Fix a broken / stalled subgraph | `/subgraph-doctor` | | Migrate a subgraph from The Graph | `/subgraph-migrate` | | Build a Compose app (oracle / keeper / automation) | `/compose` | | Get a fast, reliable RPC endpoint | `/edge` | | Find the right dataset name | `/datasets` | | Look up Turbo YAML syntax | `/turbo-pipelines` | | Look up Compose manifest, CLI flags, or TaskContext | `/compose-reference` | | Set up the CLI and log in | `/auth-setup` | Just describe what you need in natural language. The right skill is selected automatically. ## Installation Installs to Claude Code, Cursor, and 30+ other AI agents: ```bash theme={"dark"} npx skills add goldsky-io/goldsky-agent ``` ``` /plugin marketplace add goldsky-io/goldsky-agent /plugin install goldsky@goldsky-agent ``` ```bash theme={"dark"} git clone https://github.com/goldsky-io/goldsky-agent.git claude --plugin-dir ./goldsky-agent ``` Clone the repo and add the path to Cursor settings (`Settings > Cursor Settings > JSON`): ```bash theme={"dark"} git clone https://github.com/goldsky-io/goldsky-agent.git ``` ```json theme={"dark"} { "plugins.local": ["/absolute/path/to/goldsky-agent"] } ``` ```bash theme={"dark"} git clone https://github.com/goldsky-io/goldsky-agent.git cp -r goldsky-agent/skills/* .claude/skills/ # Claude Code cp -r goldsky-agent/skills/* .cursor/skills/ # Cursor ``` ## Use with autonomous or BYO agents Editors like **Claude Code** and **Cursor** auto-discover skills and trigger them from each skill's description. **Autonomous or bring-your-own-model agents** (Devin, Codex, custom LLM apps, or a plain ChatGPT/Claude chat) don't implement that convention. Even after you install the skill files, these agents won't *find* them on their own: `npx skills add` copies the skills into a skills directory (`.claude/skills/` for a single Claude Code target, or the shared `.agents/skills/` when you target several agents) but does **not** add any entry-point file telling an agent to look there. Use Option 1, Option 2, or both. To have an agent **operate** Goldsky (deploy subgraphs, manage pipelines and Edge endpoints) rather than just read docs, point it at the [REST API](/api-reference/overview). The machine-readable OpenAPI spec lives at [`https://api.goldsky.com/api/v1/docs/openapi.json`](https://api.goldsky.com/api/v1/docs/openapi.json) — ideal for client codegen or generating tool definitions. ### Option 1 — Connect the docs MCP (recommended) The hosted Goldsky docs MCP lets any MCP-capable agent search all Goldsky docs **and** discover the skills (exposed as MCP resources) at query time. No auto-trigger convention needed. Point your client at `https://docs.goldsky.com/mcp`. Clients that use the common `mcpServers` schema (e.g. Cursor, Claude Code) take: ```json theme={"dark"} { "mcpServers": { "goldsky": { "url": "https://docs.goldsky.com/mcp" } } } ``` Schemas vary by client (VS Code uses a `servers` key; Claude.ai adds it as a custom connector); see [Goldsky MCP server](/mcp-server) for per-client setup. **Devin** is MCP-compatible via a `mcpServers` entry in `.devin/config.json`; see [Devin's MCP docs](https://docs.devin.ai/work-with-devin/mcp) for the exact schema (a hosted HTTP server may need a small `mcp-remote` bridge). ### Option 2 — Install the skill files, then point your agent at them ```bash theme={"dark"} # From the docs site (also serves skills at /.well-known/skills/): npx skills add https://docs.goldsky.com # Or from the skills repo: npx skills add goldsky-io/goldsky-agent ``` This copies the skills into that skills directory (`.claude/skills//` or `.agents/skills//`), each with `SKILL.md` + `references/`. Because no entry-point file is created, add an `AGENTS.md` at your project root so agents that read it (Devin, Codex, Amp, …) know the skills exist (point the paths at wherever your install landed): ```markdown theme={"dark"} # AGENTS.md This project uses Goldsky. AI-agent skills for building, deploying, and debugging Goldsky pipelines are installed under `.agents/skills/`. Before working on a Goldsky task (Turbo / Mirror pipelines, Subgraphs, Compose, Edge RPC), read the matching `.agents/skills//SKILL.md` and the files it references under `.agents/skills//references/`. For reference lookups (CLI flags, YAML fields, dataset names), query the Goldsky docs MCP: https://docs.goldsky.com/mcp ``` These agents don't trigger skills automatically: tell the agent to consult the relevant skill or the docs MCP for the task (e.g. "use the Goldsky Turbo transforms skill to decode this Solana instruction"). ## Available skills Skills are grouped by product. Each group has interactive workflow skills (guided, multi-step) and/or reference skills (lookup-oriented). ### Turbo pipelines Streaming pipelines that index onchain data from 130+ chains into PostgreSQL, ClickHouse, Kafka, S3, and more. | Skill | When to use | What it does | | - | - | - | | `turbo-builder` | "I want to build a pipeline for X" | Guides you through chain → dataset → transforms → sink → validate → deploy | | `turbo-doctor` | "My pipeline is broken / not getting data / output looks wrong" | Diagnoses the problem step-by-step and offers to run fixes | | `turbo-pipelines` | "What's the YAML syntax for X? Should I use dataset or Kafka?" | Source/transform/sink field reference and architecture decisions (flow patterns, sizing, sink selection) | | `turbo-transforms` | "How do I decode EVM logs / write a SQL transform?" | SQL, TypeScript/WASM, dynamic tables, HTTP handlers | | `turbo-operations` | "How do I pause / restart / delete? What does this error mean?" | Lifecycle commands, pipeline states, CLI monitoring, error patterns | ### Mirror pipelines Goldsky's original streaming pipeline product. **Prefer Turbo for new pipelines.** Reach for Mirror only when you need a subgraph entity source, the one thing Turbo can't do. | Skill | When to use | What it does | | - | - | - | | `mirror` | "How do I sync my subgraph to PostgreSQL? Mirror vs Turbo?" | Sources, sinks, lifecycle commands, Mirror vs Turbo guidance | | `mirror-doctor` | "My Mirror pipeline is failing / stuck / terminated" | Runs status and log commands, identifies root cause, applies fixes | ### Subgraphs Hosted GraphQL APIs for dApp frontends. For most other use cases, prefer Turbo: it's faster, cheaper, and more reliable. Use subgraphs when you specifically need a GraphQL endpoint. | Skill | When to use | What's inside | | - | - | - | | `subgraph-builder` | "Build / write / deploy a subgraph; design a schema; write a mapping" | Interactive author→build→deploy; schema design, AssemblyScript mappings, manifest, instant subgraphs, performance, testing; endpoints, tags, webhooks | | `subgraph-doctor` | "My subgraph stopped syncing / won't deploy / is throwing errors" | Diagnostic workflow: status + log checks, the `_meta` query, error-pattern matching, preventive mapping-code root causes, fixes | | `subgraph-migrate` | "Move my subgraph off The Graph onto Goldsky" | Path selection, deploy, verify sync, migrate tags, swap endpoint | ### Compose Offchain-to-onchain TypeScript framework for oracles, keepers, circuit breakers, and cross-chain automation. | Skill | When to use | What it does | | - | - | - | | `compose` | "Build a price oracle / keeper / cross-chain bot in TypeScript" | Walks through scaffolding, task triggers (cron, HTTP, onchain), wallets, gas sponsorship | | `compose-doctor` | "My Compose app is in error state / crashlooping / not processing tasks" | Runs `status`, `logs`, `secret list`, `wallet list` and diagnoses | | `compose-reference` | "What fields does `compose.yaml` accept? What's the `TaskContext` API?" | Manifest fields, every `goldsky compose` flag, TaskContext / wallet / Collection APIs, codegen, pricing | | `compose-bitcoin-oracle` | "Build a BTC price oracle" | Guided build of the bitcoin-oracle example: a cron task that writes BTC/USD onchain ([guide](/compose/guides/build-a-bitcoin-oracle)) | | `compose-compliance-oracle` | "Compliance-gated payments / AML screening onchain" | Guided build of the compliance-oracle example: escrowed USDC released or refunded after AML screening ([guide](/compose/guides/build-a-compliance-oracle)) | | `compose-dividend-distribution` | "Pay token holders pro-rata for a dividend / coupon / rebate" | Guided build of the corporate-actions distributor example ([guide](/compose/guides/build-a-corporate-actions-distributor)) | | `compose-vrf` | "I need verifiable randomness onchain" | Guided build of the VRF example: drand-backed randomness fulfilled on request events ([guide](/compose/guides/build-a-vrf-system)) | ### Edge (managed RPC) Globally distributed, low-latency JSON-RPC for EVM chains, built on eRPC with intelligent routing, caching, and failover. | Skill | When to use | What's inside | | - | - | - | | `edge` | "RPC rate limits, hedged requests, flashblocks, x402, error code -32005" | Capabilities, supported chains, pricing, dashboard, error code reference | ### Cross-cutting Used across multiple products. | Skill | When to use | What it does | | - | - | - | | `auth-setup` | "Install the CLI / log in / switch projects / fix unauthorized errors" | Walks through CLI installation, login, and project switching | | `secrets` | "Create credentials for PostgreSQL / ClickHouse / Kafka / webhook sinks" | Guides credential creation and secret management | | `datasets` | "What's the dataset name for Polygon NFTs? What prefix does Solana use?" | Chain prefixes, dataset types, naming conventions | ## How it works Skills are automatically discovered by your AI assistant and triggered based on what you describe. You don't need to invoke them by name. ``` User: "Build me a pipeline for USDC transfers on Base" ↓ turbo-builder (auto-triggered) ↓ references turbo-pipelines + datasets + secrets ↓ Generated pipeline.yaml + deployment ``` Interactive skills (`turbo-builder`, `turbo-doctor`, `mirror-doctor`, `compose-doctor`) run as agents with access to CLI tools. Reference skills provide structured knowledge that the AI uses to answer questions or generate YAML. ## Repository structure ``` goldsky-agent/ ├── skills/ │ ├── turbo-builder/ # Step-by-step pipeline creation wizard │ ├── turbo-doctor/ # Diagnose and fix Turbo pipeline issues │ ├── turbo-pipelines/ # YAML configuration + architecture reference │ ├── turbo-transforms/ # SQL, TypeScript, dynamic tables │ ├── turbo-operations/ # Lifecycle, monitoring, error patterns │ ├── mirror/ # Mirror pipeline deploy, operate, reference │ ├── mirror-doctor/ # Diagnose and fix Mirror pipelines │ ├── subgraph-builder/ # Author, build & deploy subgraphs; schema/mappings/manifest │ ├── subgraph-doctor/ # Diagnose and fix failing/stalled subgraphs │ ├── subgraph-migrate/ # Guided migration from The Graph │ ├── compose/ # Compose app scaffolding, triggers, wallets │ ├── compose-doctor/ # Diagnose and fix Compose apps │ ├── compose-reference/ # compose.yaml fields, CLI flags, TaskContext API │ ├── compose-bitcoin-oracle/ # Guided example: BTC/USD price oracle │ ├── compose-compliance-oracle/ # Guided example: AML-gated payment gateway │ ├── compose-dividend-distribution/ # Guided example: pro-rata distributor │ ├── compose-vrf/ # Guided example: verifiable randomness │ ├── edge/ # Managed RPC capabilities, error codes, pricing │ ├── datasets/ # Chain prefixes, dataset types │ ├── secrets/ # Credential management │ └── auth-setup/ # CLI installation, login ├── hooks/ │ └── scripts/ # Validation, secret checking └── .claude-plugin/ # Plugin manifest ``` ## Pre-deploy hooks When installed as a plugin, Goldsky Agent runs hooks automatically on `goldsky turbo apply` commands: | Hook | What it does | | - | - | | `pre-deploy-validate` | Runs `goldsky turbo validate`, blocks on failure | | `secret-check` | Verifies all `secret_name` references exist | | `post-deploy-inspect` | Suggests `goldsky turbo inspect` after deploy | ## Coverage The skills cover the full Goldsky product surface: * **Turbo pipelines**: 130+ chain sources (EVM, Solana, Bitcoin, Stellar, Sui, NEAR, Starknet); SQL / TypeScript / dynamic table transforms; PostgreSQL, ClickHouse, Kafka, S3, Webhook, S2, SQS, MySQL, Pub/Sub sinks; streaming and job modes; full lifecycle and monitoring * **Mirror pipelines**: Subgraph and direct-indexing sources, sinks, lifecycle, plus interactive diagnosis * **Subgraphs**: Author/build/deploy (`subgraph-builder`: schema design, AssemblyScript mappings, manifest, instant subgraphs, performance, testing, endpoints/tags/webhooks); interactive diagnosis (`subgraph-doctor`); guided migration from The Graph (`subgraph-migrate`) * **Compose**: `compose.yaml` manifest, cron / HTTP / onchain triggers, smart wallets, gas sponsorship, `TaskContext` API, codegen, pricing * **Edge RPC**: Capabilities, supported chains, hedged requests, flashblocks, x402, error code lookups * **Cross-cutting**: Authentication, secrets, dataset naming, full CLI reference ## Example prompts Once installed, describe what you need in natural language: * "Build a Turbo pipeline to track USDC transfers on Base" * "My pipeline is stuck in error state, help me fix it" * "Sync my subgraph entities to PostgreSQL with a Mirror pipeline" * "Build a subgraph for an ERC-721 collection on Ethereum" * "Migrate my subgraph from The Graph to Goldsky" * "My subgraph stopped syncing, help me figure out why" * "Build a Compose task that runs a price oracle every 5 minutes" * "My Compose app is returning 500 on the HTTP trigger, what's wrong?" * "Why am I getting RPC error -32005 on Edge?" * "What's the dataset name for Polygon ERC-20 transfers?" * "Show me the YAML syntax for a ClickHouse sink" * "Configure a PostgreSQL secret for my pipeline" * "Set up the Goldsky CLI and authenticate" ## Related resources * [Goldsky Agent repository](https://github.com/goldsky-io/goldsky-agent): full source code and documentation * [MCP server](/mcp-server): connect Goldsky documentation to AI tools for real-time doc search # API Reference Source: https://docs.goldsky.com/api-reference/overview Manage Goldsky Turbo Pipelines, Edge endpoints, and subgraphs via the v1 REST API: base URL, Bearer authentication, and the machine-readable OpenAPI spec. The Goldsky REST API lets you manage subgraphs, Turbo Pipelines, and Edge endpoints programmatically — the same operations available through the [CLI](/reference/cli), exposed as a REST API. Every endpoint is documented in the [interactive API reference](https://api.goldsky.com/api/v1/docs), grouped by product. ## Base URL ``` https://api.goldsky.com/api/v1 ``` ## Authentication All endpoints require a Bearer token. Create a Goldsky API key from your [Project Settings](https://app.goldsky.com/dashboard/settings) and pass it in the `Authorization` header. API keys are scoped to a single project. ```bash theme={"dark"} curl -H "Authorization: Bearer " \ https://api.goldsky.com/api/v1/subgraphs ``` Errors are returned as [RFC 9457 problem+json](https://api.goldsky.com/api/errors) — each carries a `type` URL that resolves to a human-readable explanation and a `detail` describing what to fix. ## Interactive docs & machine-readable spec Try requests live against your project from the hosted API explorer. The full machine-readable OpenAPI 3 spec — point your codegen, client, or agent at this URL. ## What's covered * **Subgraphs** — deploy, list, tag, pause/resume, delete, read logs, and manage webhooks. * **Turbo Pipelines** — create, deploy, monitor, pause/resume, and manage pipelines. * **Edge endpoints** — manage Edge endpoints, API keys, and read metrics. Browse them all in the [interactive API reference](https://api.goldsky.com/api/v1/docs). # Login troubleshooting Source: https://docs.goldsky.com/authentication-troubleshooting If you don't see your Goldsky authentication email, try these troubleshooting steps. Goldsky supports three sign-in methods: GitHub, Google, and email. If you're having trouble with email authentication, try the troubleshooting steps below. ## Check your spam folder Occasionally, your provider may filter new sender emails. Check your spam or junk folder and mark it as **Not spam** if found. ## Check if you're using a shared inbox If you're trying to sign up or log in using a shared inbox (such as `engineering@company.com`), your organization's settings may prevent external automated messages from being delivered. Try using your individual work email address instead. ## Sign in with GitHub or Google For the easiest and fastest experience, use GitHub or Google sign-in. Both options skip the email step entirely and sign you in instantly. ## Allowlist Goldsky's domain If you prefer to use email authentication, ask your IT or workspace administrator to allowlist our authentication domain to make sure messages arrive in your inbox. ### For Google Workspace users If your organization uses Google Workspace: 1. Follow [Google's instructions on adding custom filters](https://support.google.com/a/answer/2368132) 2. Select the option to **Bypass spam filters and hide warnings for messages from senders or domains in selected lists** 3. Add `auth.goldsky.com` to your approved senders list ### For other email providers Refer to your provider's documentation on allowlisting or approved senders, and add `auth.goldsky.com` as a trusted domain. ## Need help? Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Benefits Source: https://docs.goldsky.com/benefits Why teams build on Goldsky: Turbo pipelines, Edge RPC, Compose, Subgraphs, and platform advantages, from webhooks and instant subgraphs to faster iteration. ## Turbo Replicate data into your own database and co-locate it with your other app data (product, customer, and any off-chain data). No brittle scraping or polling scripts, and simpler front-end queries. Turbo supports a broad set of sinks, from OLAP databases like ClickHouse to OLTP databases like Postgres or MySQL, plus queue systems like Kafka and S2. Ground-up Rust rewrite uses \~10x fewer resources than Mirror for the same job, and keeps up with fast chains like Solana. Write transformation logic in TypeScript/JavaScript, watch data flow through your pipeline in real time with live inspect, and run pipelines as one-off batch jobs with a defined start and end for point-in-time pulls. Combined with faster startup times, iteration cycles are 10x faster. Update filters on a running pipeline instantly: no restarts, no re-syncs. Track new wallets or addresses on the fly. Access full historical Solana data from genesis (not just mid-2024 as in Mirror v1), with built-in IDL decoding. ## Edge RPC Multi-region elastic cloud infrastructure serves requests from the closest location. A tip-of-the-chain CDN stores and serves recent blockchain data faster, while hedging mechanisms send parallel requests to multiple nodes for faster response times. Automatic failover keeps requests flowing during provider outages. Internal scoring prioritizes the historically most reliable nodes, and multiplexing auto-merges identical requests to reduce redundant RPC calls. Cross-validate responses from multiple RPC nodes for accuracy. Integrity mechanisms track block heights across all providers and enforce consensus checks to prevent stale, incorrect, or partial data. No more missing `eth_getLogs` results in your indexer. Auto-split large `eth_getLogs` requests to avoid provider limits. Historical data requests are automatically routed to archive nodes, and block range enforcement guards against gaps in your data. Sub-50ms latency from edge locations, request deduplication so multiple users share a single upstream call, graceful degradation with automatic retries and failover, and real-time data via tip-of-chain caching. \$5 per million requests with all methods priced equally. No surprise charges for `eth_getLogs` or trace methods. Volume discounts available for usage over 100M requests/month. ## Compose Run code in Trusted Execution Environments (TEEs) to verify operations without the latency of decentralized consensus. Workflows complete even through failures. Retries, recovery, and state persistence are built in, so you don't write your own error handling or babysit stuck runs. Every function call that touches external systems is logged with inputs and outputs. Step through executions in the CLI or UI to debug issues quickly and understand exactly what happened at every stage of your workflow. Build custom data feeds with your own data sources, scopes, refresh logic, and content, rather than adapting to someone else's design decisions. ## Subgraphs On top of the standard subgraph development experience, Goldsky adds: 1. **Webhooks**: get pushed updates when entities change instead of polling the API. Useful for realtime notifications and data synchronization. 2. **Instant subgraphs**: index contract data from a config file, no mapping code required. 3. **Tags**: point your frontend at a stable endpoint and swap the subgraph version behind it. No downtime, no stale data. Goldsky proxies all data ingestion through a load balancer with 20+ RPC endpoints and automatically prioritizes between them based on latency, time of day, and historical responsiveness. The result: faster indexing and higher uptime than the alternatives. On a dedicated indexing instance, Goldsky can add custom RPC endpoints for any EVM-compatible chain with no downtime, including custom or private blockchains. Stream subgraph data into your broader infrastructure via Turbo, with control an API alone can't give you. Cross-chain subgraphs are one example. ## Platform There's no token, so you don't run a trading desk just to pay your data provider, and no per-query fees, so costs stay predictable. Goldsky offers 24/7 on-call support and has a team of engineering staff available to assist with debugging, issue resolution, and proactive management. # Blog Source: https://docs.goldsky.com/blog News, engineering deep dives, and customer stories from Goldsky. # Cut RPC costs with Boost Source: https://docs.goldsky.com/boost Keep your current RPC provider while Boost serves eligible historical reads from Goldsky's indexed data and forwards everything else upstream. Boost reduces the traffic sent to an RPC provider you already use. Eligible historical reads come from Goldsky's indexed data. Every other JSON-RPC call forwards to your configured endpoint. Your application keeps one RPC interface and one response shape. You keep control of the upstream provider, while repeatable reads can avoid reaching it at all. Configure an upstream and verify your first cache hit. Understand cache eligibility, block tags, batches, and forwarding. ## How Boost fits into your stack 1. Your application sends JSON-RPC requests to a Boost URL instead of directly to your provider. 2. Boost serves eligible reads when Goldsky has the requested historical data. 3. Calls Boost cannot serve are forwarded to the active upstream configured for that network. The routing decision uses the request method and parameters. It does not require an additional request to your provider. Boost preserves the JSON-RPC interface, but it is still an HTTP proxy. It normalizes some transport headers and manages CORS at the edge. See [request and response forwarding](/boost/configuration#request-and-response-forwarding) for the exact contract. ## Use Boost when * You want to keep your current provider and client libraries. * Your workload repeatedly reads fixed blocks, transactions, receipts, or log ranges. * You want to reduce upstream request volume without changing application behavior on a cache miss. * You need to measure which requests Boost served and which reached your provider. Boost is not a replacement for WebSocket subscriptions or a way to cache chain-head queries such as `latest`. Those calls remain with your provider. If you want Goldsky to operate the RPC provider layer as well, use [Edge RPC](/edge-rpc/introduction). ## Explore Boost Make a cache hit, compare a forwarded request, and update an existing client. Cached methods, block tags, batch behavior, and the forwarding contract. Provider connections, custom URLs, credentials, headers, CORS, and timeouts. Read response headers and calculate the share of calls that avoided your provider. Endpoint syntax, supported networks, billing, and limits. Diagnose misses, provider errors, CORS, large batches, and verification issues. ## Getting help Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Configure Boost upstreams Source: https://docs.goldsky.com/boost/configuration Connect a provider account or custom RPC URL, manage credentials and fallback upstreams, and understand Boost's forwarding behavior. Each Goldsky project has one Boost configuration and one Boost API key. For each enabled network, the configuration identifies the active upstream, provider credentials, allowed browser origins, and forwarding timeout. ## Choose a setup path ### Connect a provider account Supply a management credential once and let Boost prepare upstreams for the networks you select. The exact action depends on the provider. | Vendor | Credential | What Boost does | | - | - | - | | QuickNode | An API key with **Admin API** access from Dashboard → API Keys. Paid plans only | Creates one dedicated endpoint per network in your account | | Alchemy | An **access key** with read-and-write **App Management** permission from Dashboard → Settings → Security. This is not an app API key | Creates one dedicated app and enables every selected network on it | | Chainstack | A Platform API key from Console → Settings → API keys. Available on every plan; your plan's node limit still applies | Creates one project with a Global Node for each selected network | | dRPC | A **NodeCloud Keys API** token from Settings → API Tokens. Do not use a Statistics API or NodeCore token | Reads your key list and points every selected network at an existing unrestricted key; it creates nothing in your dRPC account | For QuickNode, Alchemy, and Chainstack, Boost only modifies resources that it created. Disconnecting deletes those resources without changing your pre-existing endpoints, apps, projects, or nodes. Disconnecting dRPC only forgets the dashboard token and removes the upstreams assembled from it; nothing in your dRPC account changes. A dRPC key restricted by IP, browser origin, JWT, network, or method cannot serve Boost's forwarding path. Create or select an active, unrestricted key before connecting the account. Some dRPC networks require a paid plan. ### Supply an RPC URL You can use any endpoint reachable over public HTTPS, including a node you operate or a Goldsky Edge RPC endpoint. For each network, configure: * An upstream RPC URL * Any custom authentication headers required by the provider * Optional standby upstreams * An optional forwarding timeout Only one upstream is active for a network at a time. Switching to a standby is an explicit configuration change, not automatic failover. A network with no active upstream cannot serve traffic. Boost returns a JSON-RPC error instead of accepting a request it cannot forward. ## Credentials Provider URLs and configured headers are encrypted at rest. You can replace or remove them in the dashboard. If a URL contains user information such as `https://user:pass@example.com`, Boost converts it to an `Authorization: Basic` header before forwarding. The configured URL and headers are not written to logs, errors, or metrics. For provider credentials that do not change per request, prefer configured headers. Your callers then need only the Goldsky key. ## Request and response forwarding Boost preserves the JSON-RPC request body for calls sent upstream. As an HTTP proxy, it normalizes connection and transport headers on both sides of the request. ### Headers sent to your provider Your upstream receives caller-supplied headers plus the custom headers configured on the Boost endpoint. Configured headers are applied last and win when the same name appears in both places. Boost manages or removes these headers: | Header | Behavior | | - | - | | `X-ERPC-Secret-Token` | Reserved by the edge and never forwarded | | `Host` | Set from the upstream URL | | `Content-Type`, `Accept` | Set to `application/json` | | `Content-Length` | Recomputed for the forwarded request | | `Accept-Encoding` | Set to request gzip from the provider | | `Content-Encoding` | Removed because Boost sends an uncompressed request body | | `Cookie`, `Proxy-Authorization` | Removed instead of relaying session credentials to a third party | | Hop-by-hop headers | Removed because they apply to one connection only | Other headers pass through, including `traceparent`, `tracestate`, `b3`, `baggage`, `User-Agent`, and custom `x-*` headers. ### Provider authentication headers Put the Goldsky key in the query string: ```text theme={"dark"} https://edge.goldsky.com/boost/{chain}?key={your-goldsky-key} ``` With the Goldsky key in the URL, request headers such as `Authorization` and `X-API-Key` can be forwarded to your provider. Always include `?key=` when sending provider credentials as request headers. Without it, Boost cannot distinguish your provider credential from Goldsky authentication. ### Caller IP Boost relays the complete `X-Forwarded-For` chain. The final entry is the address observed by the Goldsky load balancer. Earlier entries are caller-supplied and should be treated as untrusted. `X-Real-IP`, `Forwarded`, `CF-Connecting-IP`, and `True-Client-IP` are relayed when the caller sends them. Boost does not set them itself. If your provider must not receive the caller address, [contact support](/getting-support). Goldsky can disable `X-Forwarded-For` for an endpoint. ### Headers returned to your client Provider response headers such as `Cache-Control`, `Retry-After`, `ETag`, and custom `x-*` headers return to the client. Boost replaces or removes these response headers: | Header | Behavior | | - | - | | `Content-Encoding` | Removed after Boost inflates the provider response and negotiates client compression separately | | `Content-Type`, `Content-Length` | Set for the response Boost sends | | `Set-Cookie` | Removed so a provider cannot set a cookie on `edge.goldsky.com` | | `x-cache`, `x-edge-*` | Replaced with Boost's own routing and timing headers | | `x-goldsky-*` | Removed because these are internal accounting headers | | `Access-Control-*` | Replaced by CORS handling at the edge | | Hop-by-hop headers | Removed because they apply to one connection only | ## Browser access and CORS Use the endpoint's **Allowed domains** list to control browser access. Boost answers preflight requests and reflects an allowed origin. Provider CORS headers are not merged because they describe the provider's origin rather than `edge.goldsky.com`. Credentialed browser requests using cookies or HTTP authentication are not allowed. Response headers are exposed to browser JavaScript, so applications can read `x-cache` and the other Boost headers through `fetch` or `XMLHttpRequest`. ## Provider allowlists Boost forwards from AWS Fargate tasks in `us-east-1`, `us-west-2`, and `eu-central-1`. Tasks use addresses from each region's public AWS pool and can receive new addresses after deploys, scaling, or restarts. There is no fixed egress IP list. Authenticate Boost with a provider credential instead of an IP allowlist. If your provider supports only IP allowlisting, [contact support](/getting-support) before relying on it. # How Boost routes requests Source: https://docs.goldsky.com/boost/how-it-works Learn which JSON-RPC requests Boost can serve, which calls always forward, and how mixed batches are handled. Boost reads the JSON-RPC method and parameters, then chooses the response source. The API key identifies your project's Boost; that project's network configuration supplies the upstream for calls that need your provider. ## Routing model | Request | Route | Response headers | | - | - | - | | Eligible historical read that Goldsky can answer | CDN | `x-cache: HIT`, `x-edge-source: cache` | | `eth_chainId` or `net_version` | Boost | `x-edge-source: static` | | Eligible read whose data is not available | Your upstream | `x-cache: MISS`, `x-edge-source: endpoint` | | Tagged block, write, trace, state read, or unsupported method | Your upstream | `x-cache: MISS`, `x-edge-source: endpoint` | | Anything that would forward, when the request asks for [cache-only](#cache-only-mode) | Nobody | `x-cache: MISS`, `x-edge-source: none` | A failed or incomplete cache lookup falls back to your upstream. A cache miss can add proxy latency, but it does not substitute a different historical result. ## Methods eligible for indexed data | Method | Eligible when | | - | - | | `eth_getBlockByNumber` | The block is a concrete hexadecimal height | | `eth_getBlockByHash` | The requested block is available in Goldsky's indexed data | | `eth_getTransactionByHash` | The requested transaction is available in Goldsky's indexed data | | `eth_getTransactionReceipt` | The requested receipt is available in Goldsky's indexed data | | `eth_getLogs` | `fromBlock` and `toBlock` are concrete hexadecimal heights, or `blockHash` is set | | `eth_getBlockReceipts` | The block is a concrete hexadecimal height | Eligibility does not guarantee a hit. If Goldsky does not have the requested data, Boost forwards the request. ## Block tags always forward Requests using `latest`, `pending`, `safe`, `finalized`, or `earliest` are always forwarded. The same rule applies to `eth_getLogs` when either range bound is a tag. Your upstream is the authority on the chain head. Serving a tag from indexed data could otherwise return a block behind your provider or a block affected by a reorganization. Use a concrete hexadecimal height when you want an eligible historical read. ## Everything else forwards Writes, traces, and state reads such as `eth_call` and `eth_getBalance` go to your configured upstream. Boost also forwards methods it does not recognize as eligible. For a forwarded call, Boost preserves the JSON-RPC method, parameters, and ID. The result body comes from your upstream. HTTP headers are handled separately; see [request and response forwarding](/boost/configuration#request-and-response-forwarding). ## Cache-only mode Add `cache-only=true` and Boost never contacts your upstream. Calls it can answer from Goldsky data are answered; everything that would otherwise forward returns JSON-RPC error `-32099` instead. Use it when the forward is the cost you are avoiding. Boost itself is free, but a forwarded call still reaches the provider you pay. A backfill, a replay, or any job with a spending ceiling can run against indexed data alone and retry the gaps later. Send it as a query parameter or a header. The two are equivalent: ```bash theme={"dark"} curl "https://edge.goldsky.com/boost/ethereum?key=YOUR_KEY&cache-only=true" \ -X POST -H 'Content-Type: application/json' \ -d '{"jsonrpc":"2.0","id":1,"method":"eth_getTransactionReceipt","params":["0x..."]}' ``` ```bash theme={"dark"} curl "https://edge.goldsky.com/boost/ethereum?key=YOUR_KEY" \ -X POST -H 'Content-Type: application/json' \ -H 'x-boost-cache-only: true' \ -d '{"jsonrpc":"2.0","id":1,"method":"eth_getTransactionReceipt","params":["0x..."]}' ``` A refused call returns: ```json theme={"dark"} { "jsonrpc": "2.0", "id": 1, "error": { "code": -32099, "message": "not in Goldsky's cache, and cache-only forbade the forward to your endpoint" } } ``` Boost returns an error rather than an empty result on purpose. `null` already carries meaning here — `eth_getTransactionReceipt` returns `null` for a transaction that does not exist — so answering a miss with `null` would report an absence that Goldsky never verified. Repeat the call without the flag to forward it normally. `eth_chainId` and `net_version` still answer under cache-only, because Boost synthesizes them and no provider is involved either way. Refused calls report `x-edge-source: none`: not `endpoint`, since nothing reached your upstream. In a batch, the flag applies per item. Eligible items are served and the rest are refused individually, in one response array. ### Skip-cache The inverse: `skip-cache=true`, or the `x-boost-skip-cache: true` header, forwards the call to your upstream without reading the cache. Use it to time your provider directly or to fetch a value the cache would otherwise answer. Statics still answer at the edge. The next call without the flag is served from cache as usual; nothing is invalidated. Write either value as exactly `true`. `1`, `TRUE`, `yes`, and a bare flag all read as "not requested". Sending both flags on one request returns `-32600`; they contradict. ## Batch requests Boost evaluates JSON-RPC batches per item. Eligible items can come from Goldsky data while the remaining items are sent to your upstream together in one onward batch. * Give every item a unique `id`. JSON-RPC does not guarantee response order, so match results by ID. * Use `x-edge-billable` as the served-item count. `x-cache` is `HIT` only when Boost serves every item in the batch. * Keep arrays at 100 items or fewer. Larger arrays are forwarded whole without cache lookups. For example, a batch where Boost serves 44 of 45 items reports `x-cache: MISS` and `x-edge-billable: 44`. ## Authentication and endpoint selection The endpoint format is: ```text theme={"dark"} https://edge.goldsky.com/boost/{chain}?key={your-api-key} ``` The chain path selects the network. The Goldsky key identifies your project's Boost, and that network's configuration selects the active upstream. Your provider URL and persistent provider credentials stay in the configuration rather than traveling in each request. # Measure Boost traffic Source: https://docs.goldsky.com/boost/observability Use Boost response headers and CLI metrics to measure cache hits, forwarded requests, latency, and avoided upstream calls. Every Boost response identifies who answered, how long Boost spent on the request, and how many request items were served without reaching your provider. ## Response headers | Header | Values | Meaning | | - | - | - | | `x-cache` | `HIT`, `MISS` | `HIT` when Boost served the single call or every item in a batch; otherwise `MISS` | | `x-edge-source` | `cache`, `static`, `endpoint`, `none` | The system that produced the response. `none` means nothing did: a [cache-only](/boost/how-it-works#cache-only-mode) request that would have forwarded | | `x-edge-billable` | Integer | Number of request items Boost served: `1` or `0` for a single call, or the served-item count for a batch | | `x-edge-duration-ms` | Integer | Wall-clock time Boost spent serving the request | | `x-edge-version` | Build string | Boost build that handled the request | | `x-edge-region` | AWS region | Edge region that handled the request, such as `us-west-2` | The `x-edge-billable` name predates Boost's free pricing. Treat it as a served-item count, not a monetary charge. ## Single requests For a single JSON-RPC request: * `x-cache: HIT` and `x-edge-billable: 1` mean Boost served the call without sending it upstream. * `x-cache: MISS` and `x-edge-billable: 0` mean the configured endpoint answered. * `x-edge-source: static` identifies methods answered directly by the Boost edge, such as `eth_chainId`. * `x-edge-source: none` with `x-edge-billable: 0` means a cache-only request was refused rather than forwarded. Nothing reached your provider. ## Batch requests Read `x-edge-billable` instead of relying on `x-cache` alone. `x-cache` is `HIT` only if Boost served every item. For a batch of 45 calls where Boost serves 44: ```text theme={"dark"} x-cache: MISS x-edge-billable: 44 ``` The batch contains one forwarded item, so the aggregate cache header is a miss even though most calls avoided the upstream. ## Calculate an avoided-upstream rate Count JSON-RPC items, not HTTP requests: ```text theme={"dark"} avoided upstream rate = sum(x-edge-billable) / total JSON-RPC items ``` This rate measures calls Boost served. To estimate monetary savings, apply your provider's pricing model to those avoided calls. Providers can price methods, compute units, or plans differently, so the headers do not represent an exact dollar amount. ## CLI metrics Fetch aggregate endpoint metrics with: ```bash theme={"dark"} goldsky boost metrics ``` The command reports cache hits, latency, miss reasons, and provider-level statistics. See the [`goldsky boost metrics` reference](/reference/cli#boost-metrics) for its current output and options. ## What to monitor * **Served-item rate:** The share of JSON-RPC items with `x-edge-billable` greater than zero * **Miss reasons:** Whether calls miss because of method eligibility, block tags, unavailable data, or batch size * **Boost duration:** `x-edge-duration-ms`, split by response source * **Upstream errors and latency:** Requests with `x-edge-source: endpoint`, grouped by provider If an eligible method repeatedly misses, use the [troubleshooting guide](/boost/troubleshooting#eligible-requests-keep-missing). # Set up Boost Source: https://docs.goldsky.com/boost/quickstart Configure an upstream RPC provider, make a Boost request, and verify which calls avoid your provider. This quickstart configures one upstream, makes an eligible historical read, and confirms whether Boost or your provider answered. ## Prerequisites * A [Goldsky account](https://app.goldsky.com) * An HTTPS RPC endpoint for a [supported Boost network](/boost/reference#supported-networks) * A verified Goldsky organization A verified Goldsky organization has at least one Owner, Admin, or Editor whose email uses a company domain. Generic email providers such as Gmail, Outlook, and Proton Mail do not qualify. Verification is required to use Boost. Open [Boost in the dashboard](https://app.goldsky.com/dashboard/edge/boost). Choose one of two setup paths: * Connect a QuickNode, Alchemy, Chainstack, or dRPC account. Boost creates dedicated resources in QuickNode, Alchemy, and Chainstack; with dRPC, it uses an unrestricted key already in your account. * Paste an HTTPS RPC URL and any authentication headers it needs. Enabling Boost creates one Boost API key for the project. Copy it from the Boost dashboard; the same key works across every network you enable. Run the interactive configuration flow: ```bash theme={"dark"} goldsky boost enable ``` The setup wizard asks for a provider account, its management credential, and the networks to enable. See the [`goldsky boost` CLI reference](/reference/cli#boost) for non-interactive provider and endpoint management commands. Boost endpoints use this format: ```text theme={"dark"} https://edge.goldsky.com/boost/{chain}?key={your-api-key} ``` Use a network name or chain ID. For example, `/boost/ethereum` and `/boost/1` identify the same network. Enter your key, choose a network, and copy the generated command: The first request for a range that has not been served recently can return `x-cache: MISS` while Boost warms the reader from storage. Run the request again before treating the method as ineligible. Include `-i` in the curl request so the response headers are visible. A single request served by Boost looks like this: ```text theme={"dark"} x-cache: HIT x-edge-source: cache x-edge-billable: 1 x-edge-duration-ms: 14 x-edge-region: us-west-2 ``` `x-edge-billable` is the number of request items Boost served. The name predates Boost's free pricing; it is a count, not a charge. Make a state read at `latest`, which remains with your provider: ```bash theme={"dark"} curl "https://edge.goldsky.com/boost/ethereum?key=YOUR_KEY" \ -i -X POST \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":2,"method":"eth_getBalance","params":["0x0000000000000000000000000000000000000000","latest"]}' ``` A forwarded response includes: ```text theme={"dark"} x-cache: MISS x-edge-source: endpoint x-edge-billable: 0 ``` ## Update an existing client Change the transport URL. The rest of the client configuration stays the same. ```typescript viem theme={"dark"} import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http('https://edge.goldsky.com/boost/ethereum?key=YOUR_KEY') }) ``` ```typescript ethers.js theme={"dark"} import { JsonRpcProvider } from 'ethers' const provider = new JsonRpcProvider( 'https://edge.goldsky.com/boost/ethereum?key=YOUR_KEY' ) ``` ```typescript web3.js theme={"dark"} import Web3 from 'web3' const web3 = new Web3( 'https://edge.goldsky.com/boost/ethereum?key=YOUR_KEY' ) ``` ## Next steps Check method eligibility, block-tag behavior, and batch semantics. Turn response headers into an accurate avoided-upstream count. # Boost reference Source: https://docs.goldsky.com/boost/reference Boost endpoint syntax, supported networks, billing behavior, and service limits. ## Endpoint format ```text theme={"dark"} https://edge.goldsky.com/boost/{chain}?key={your-api-key} ``` `{chain}` accepts a path name or chain ID and is case-insensitive. For example, `/boost/ethereum` and `/boost/1` are equivalent. The key identifies your project's Boost. The chain must be enabled and have an active upstream in that project's configuration. ### Request options | Option | Carrier | Effect | | - | - | - | | `cache-only=true` | Query parameter or `x-boost-cache-only` header | Serve from Goldsky data only. Calls that would forward return `-32099`. See [cache-only mode](/boost/how-it-works#cache-only-mode) | | `skip-cache=true` | Query parameter or `x-boost-skip-cache` header | Forward without reading the cache. See [skip-cache](/boost/how-it-works#skip-cache) | Write the value as exactly `true`; any other value leaves the option off. Unrecognized query parameters are ignored, so your own tracking parameters pass through harmlessly. ## gRPC endpoint Boost serves the BDS [`bds.evm.RPCQueryService`](https://github.com/blockchain-data-standards/manifesto) natively, on the same host as JSON-RPC. Point a BDS client here to skip JSON encoding entirely. ```text theme={"dark"} https://edge.goldsky.com/boost/{package.Service}/{Method} ``` The proto fixes the path, so addressing rides gRPC metadata: | Metadata | Required | Value | | - | - | - | | `x-chain` | Yes | Network path name or chain ID, such as `ethereum` or `1` | | `x-api-key` | Yes | Your Goldsky key. You can also pass `?key=` in the path, as on the JSON-RPC hop | | `x-boost-cache-only` | No | `true` to serve from Goldsky data only | | `x-boost-skip-cache` | No | `true` to forward without reading the cache | Both protocols share one routing path, one set of eligible methods, and one usage record, so everything in [how Boost routes requests](/boost/how-it-works) applies to either. Responses differ only in shape: * A method Boost answers returns the typed BDS message. Data that does not exist returns a successful response with the data field unset, matching the proto's "null if not found" convention. * Errors arrive as gRPC statuses: `UNIMPLEMENTED` for an unsupported method, `INVALID_ARGUMENT` for a bad parameter, `RESOURCE_EXHAUSTED` for an oversized `eth_getLogs` range, and `NOT_FOUND` for a cache-only refusal. * Structured errors carry `bds.common.ErrorDetails` in the status details, so a cache-only refusal carries `DATA_NOT_FOUND` and an oversized range carries `RANGE_TOO_LARGE`. * The [observability headers](/boost/observability#response-headers) arrive as initial metadata under the same names. ## Supported networks Boost offers networks whose indexed coverage starts at genesis. Networks with a later coverage floor are excluded so the same endpoint does not unpredictably serve recent history while forwarding older ranges. The [dashboard](https://app.goldsky.com/dashboard/edge/boost) and `goldsky boost chains` command are the live sources for availability. Goldsky indexes additional networks that Boost does not currently offer, including Arbitrum, BNB Chain, Celo, Gnosis, Sei, Tron, and Abstract. Their indexed coverage begins above genesis. ## Billing Boost is free to use. Goldsky does not charge for either served reads or forwarded requests. Forwarded calls still reach the RPC provider you pay separately. Usage appears on invoices as zero-dollar line items for calls Boost served and requests it forwarded. For mixed batches, use `x-edge-billable` to count the individual items Boost served. ## Limits * Every request needs a Goldsky `key`. A keyless request receives an [x402 payment challenge](/edge-rpc/capabilities/x402) from the shared edge rather than using Boost. * The requested network must be enabled and have an active upstream in the project's Boost configuration. * Upstream endpoints must be reachable over public HTTPS. Private, loopback, and link-local addresses are rejected. * Boost supports JSON-RPC and BDS gRPC over HTTPS. There is no WebSocket endpoint; keep `eth_subscribe` and other subscriptions pointed at your provider. * Batches can contain up to 100 items for per-item routing. Larger arrays are forwarded whole. * Rate limits are Goldsky-managed. Boost endpoints use a Goldsky-set budget rather than a customer-configured rate-limit budget. * Requests are unmetered within fair use. Contact Goldsky if you need a written volume commitment. ## Related reference * [`goldsky boost` CLI commands](/reference/cli#boost) * [Methods and routing behavior](/boost/how-it-works) * [Cache-only mode](/boost/how-it-works#cache-only-mode) * [Request and response headers](/boost/configuration#request-and-response-forwarding) * [Observability headers and metrics](/boost/observability) # Troubleshoot Boost Source: https://docs.goldsky.com/boost/troubleshooting Diagnose Boost cache misses, upstream errors, CORS failures, large batches, and organization verification issues. ## Common issues | Symptom | Likely cause | What to check | | - | - | - | | `x-cache: MISS` on a fixed historical read | The data was not immediately available | Retry once, then confirm the method and network are eligible | | Every request is a miss | The workload uses tags, state reads, writes, traces, or unsupported methods | Compare the request with [routing rules](/boost/how-it-works) | | JSON-RPC error for one network | No active upstream is configured for that network | Open the network in the dashboard and activate an upstream | | Provider returns `401` or `403` | Provider credential is missing, expired, or overridden | Check the upstream URL and configured headers | | Browser preflight fails | The origin is not in **Allowed domains** | Add the exact browser origin to the Boost endpoint | | A large batch never produces hits | The array contains more than 100 items | Split it into batches of 100 or fewer | | WebSocket connection fails | Boost supports HTTPS only | Keep `wss://` and `eth_subscribe` pointed at your provider | | Provider IP allowlist rejects Boost | Boost has no fixed egress IP list | Authenticate with a URL or header credential, or contact support | ## Provider account connections | Provider | If connection or provisioning fails | | - | - | | QuickNode | Confirm the key has **Admin API** access and the account is on a paid plan | | Alchemy | Use an account access key with read-and-write **App Management** permission, not an app API key | | Chainstack | Use a Platform API key from Settings → API keys and check whether the plan's node limit has been reached | | dRPC | Use the **NodeCloud Keys API** token from Settings → API Tokens, then confirm the account has an active key without IP, origin, JWT, network, or method restrictions | Boost reports unsupported or paid-only networks on the affected row. If the connected account cannot serve a network, add a custom HTTPS RPC URL for that network instead. ## Eligible requests keep missing Confirm all of these conditions: 1. The network appears in the [supported network list](/boost/reference#supported-networks). 2. The method appears in [methods eligible for indexed data](/boost/how-it-works#methods-eligible-for-indexed-data). 3. Block parameters are concrete hexadecimal heights rather than tags such as `latest`. 4. `eth_getLogs` uses concrete `fromBlock` and `toBlock` values or a `blockHash`. 5. A batch has no more than 100 items. An eligible request can still miss when Goldsky does not have that specific data. The request then forwards to your upstream. ## Organization verification Boost requires a verified Goldsky organization. A Goldsky organization is verified when at least one current Owner, Admin, or Editor has an email on a company domain. Generic email providers such as Gmail, Outlook, and Proton Mail do not qualify. Viewers do not count toward verification. ### If your organization is not verified Add an Owner, Admin, or Editor with an email on your company's domain, then retry. If your organization uses a shared domain you do not control, is still setting up company accounts, or believes a domain was misclassified, contact [support@goldsky.com](mailto:support@goldsky.com) or your shared Slack channel. Include the organization ID shown in the settings URL. If verification is temporarily unavailable, retry and contact support if the problem persists. ## Getting help Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # 0G Source: https://docs.goldsky.com/chains/0g 0G support on Goldsky: Turbo pipelines on 0G Mainnet, plus Subgraphs on mainnet and testnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Abstract Chain Source: https://docs.goldsky.com/chains/abstract Abstract Chain support on Goldsky: Turbo pipelines and Subgraphs on Abstract mainnet and Abstract Testnet, plus Edge RPC and Compose on mainnet. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # ApeChain Source: https://docs.goldsky.com/chains/apechain ApeChain support on Goldsky: Turbo pipelines and Subgraphs on Apechain mainnet and Apechain Curtis, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Arbitrum Nova Source: https://docs.goldsky.com/chains/arbitrum-nova Arbitrum Nova support on Goldsky: Turbo pipelines and Subgraphs on Arbitrum Nova mainnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Arbitrum One Source: https://docs.goldsky.com/chains/arbitrum-one Arbitrum One support on Goldsky: Turbo pipelines, Edge RPC, Compose, and Subgraphs on Arbitrum One mainnet and Arbitrum Sepolia, with CLI setup steps. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Arc Source: https://docs.goldsky.com/chains/arc Arc support on Goldsky: Turbo pipelines, Edge RPC, Compose, and Subgraphs on Arc Mainnet and Arc Testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Arena-Z Source: https://docs.goldsky.com/chains/arena-z Arena-Z support on Goldsky: current availability for Arena Z and Arena Z Testnet, CLI setup steps, and how to reach the team about enabling Arena-Z. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Indexing Arweave with Goldsky Source: https://docs.goldsky.com/chains/arweave Arweave indexing with Goldsky is coming soon. Contact support@goldsky.com if you're running into issues building on Arweave and need help meanwhile. Coming soon. If you're running into issues building on Arweave, please contact [support@goldsky.com](mailto:support@goldsky.com) and we'd be happy to help. # Automata Network Source: https://docs.goldsky.com/chains/automata Automata Network support on Goldsky: current availability, CLI setup steps, and how to reach the team about enabling Automata Network. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Avalanche Source: https://docs.goldsky.com/chains/avalanche Avalanche support on Goldsky: Turbo pipelines, Edge RPC, and Compose on Avalanche mainnet, plus Subgraphs on mainnet and testnet, with CLI setup steps. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # B3 Source: https://docs.goldsky.com/chains/b3 B3 support on Goldsky: Turbo pipelines and Subgraphs on B3 mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Base Source: https://docs.goldsky.com/chains/base Base support on Goldsky: Turbo pipelines, Edge RPC, Compose, and Subgraphs on Base mainnet and Base Sepolia, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Berachain Source: https://docs.goldsky.com/chains/berachain Berachain support on Goldsky: Turbo pipelines and Subgraphs on Berachain Mainnet and Berachain Bepolia, plus Edge RPC and Compose on mainnet. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Bitcoin Source: https://docs.goldsky.com/chains/bitcoin Bitcoin support on Goldsky: Turbo pipelines on Bitcoin mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Blast Source: https://docs.goldsky.com/chains/blast Blast support on Goldsky: Turbo pipelines, Edge RPC, and Compose on Blast mainnet, plus Subgraphs on mainnet and testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # BOB (Build on Bitcoin) Source: https://docs.goldsky.com/chains/bob BOB (Build on Bitcoin) support on Goldsky: Turbo pipelines on Build on Bitcoin (BOB) mainnet, plus Subgraphs on mainnet and testnet, with CLI setup steps. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Boba Network Source: https://docs.goldsky.com/chains/boba-eth Boba Network support on Goldsky: Subgraphs on Boba ETH Mainnet and Boba Sepolia, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # BNB Smart Chain Source: https://docs.goldsky.com/chains/bsc BNB Smart Chain support on Goldsky: Turbo pipelines and Subgraphs on mainnet and testnet, plus Edge RPC and Compose on mainnet, with CLI setup steps. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # BitTorrent Chain Source: https://docs.goldsky.com/chains/bttc BitTorrent Chain support on Goldsky: Subgraphs on BitTorrent Chain (BTTC) mainnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Camp Network Source: https://docs.goldsky.com/chains/camp Camp Network support on Goldsky: Turbo pipelines on Camp Testnet, plus Subgraphs on mainnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Canton Source: https://docs.goldsky.com/chains/canton Canton support on Goldsky: current availability for Canton Mainnet and Canton Testnet, CLI setup steps, and how to reach the team about enabling Canton. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Celo Source: https://docs.goldsky.com/chains/celo Celo support on Goldsky: Turbo pipelines and Subgraphs on Celo mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Chiliz Chain Source: https://docs.goldsky.com/chains/chiliz Chiliz Chain support on Goldsky: Subgraphs on Chiliz mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Citrea Source: https://docs.goldsky.com/chains/citrea Citrea support on Goldsky: Subgraphs on Citrea Mainnet and Citrea Testnet Tangerine, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Codex Source: https://docs.goldsky.com/chains/codex Codex support on Goldsky: Turbo pipelines on Codex mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Conflux Espace Source: https://docs.goldsky.com/chains/conflux-espace Conflux Espace support on Goldsky: Turbo pipelines and Subgraphs on Conflux eSpace mainnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Corn Source: https://docs.goldsky.com/chains/corn Corn support on Goldsky: Subgraphs on Corn Testnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Cosmos EVM Source: https://docs.goldsky.com/chains/cosmos-evm Cosmos EVM support on Goldsky: current availability for Cosmos Evm Devnet, how to get started with the CLI, and how to reach the team about enabling Cosmos EVM. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Cronos Chain Source: https://docs.goldsky.com/chains/cronos-zkevm Cronos Chain support on Goldsky: Turbo pipelines and Subgraphs on Cronos zkEVM mainnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Cyber Source: https://docs.goldsky.com/chains/cyber Cyber support on Goldsky: Turbo pipelines, Edge RPC, Compose, and Subgraphs on Cyber mainnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # DATA Network Source: https://docs.goldsky.com/chains/data DATA Network support on Goldsky: Turbo pipelines and Subgraphs on DATA Network Mainnet and Data Network Aeneid (Testnet), plus Edge RPC and Compose on mainnet. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Degen Source: https://docs.goldsky.com/chains/degen Degen support on Goldsky: Turbo pipelines and Subgraphs on Degen mainnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Elysium Source: https://docs.goldsky.com/chains/elysium Elysium support on Goldsky: Subgraphs on Elysium Testnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Ethereal Source: https://docs.goldsky.com/chains/ethereal Ethereal support on Goldsky: Turbo pipelines and Subgraphs on Ethereal mainnet and Ethereal Testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Ethereum Source: https://docs.goldsky.com/chains/ethereum Ethereum support on Goldsky: Turbo pipelines, Edge RPC, Compose, and Subgraphs on Ethereum mainnet and Ethereum Sepolia, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Etherlink Source: https://docs.goldsky.com/chains/etherlink Etherlink support on Goldsky: Turbo pipelines and Subgraphs on Etherlink mainnet and Etherlink Shadownet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Everclear Source: https://docs.goldsky.com/chains/everclear Everclear support on Goldsky: Subgraphs on Everclear mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Filecoin Source: https://docs.goldsky.com/chains/filecoin Filecoin support on Goldsky: Subgraphs on Filecoin mainnet and Filecoin Testnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Flare Network Source: https://docs.goldsky.com/chains/flare Flare Network support on Goldsky: Turbo pipelines and Subgraphs on Flare mainnet and Flare Testnet, plus Edge RPC and Compose on mainnet, with CLI setup steps. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Flow Source: https://docs.goldsky.com/chains/flow Flow support on Goldsky: Subgraphs on Flow Mainnet and Flow Testnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Fluent Source: https://docs.goldsky.com/chains/fluent Fluent support on Goldsky: Turbo pipelines and Subgraphs on Fluent mainnet and Fluent Testnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Flynet Source: https://docs.goldsky.com/chains/flynet-mainnet Flynet support on Goldsky: Turbo pipelines on Flynet Mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Fogo Source: https://docs.goldsky.com/chains/fogo Index and stream data from the Fogo blockchain with Goldsky Subgraphs, Turbo pipelines, Mirror, Edge RPC, and Compose. Coverage, endpoints, and quickstart. ## Overview Goldsky is the modern back-end for crypto-enabled products; the infrastructure layer between your application and the blockchain. We handle the complex, undifferentiated work of building on crypto rails: streaming real-time data, maintaining reliable chain connectivity, and executing onchain logic. Teams use Goldsky to ship faster and stay focused on their core product. Fogo is a purpose-built Layer 1 blockchain designed for high-performance trading with sub-40ms blocks, sub-second confirmation, and SVM L1 compatibility. Built on a custom Firedancer client, Fogo delivers the speed and reliability demanded by modern finance. ### Partnership Goldsky has partnered with Fogo to make our product available to the ecosystem and provide dedicated support for Fogo. Below in the overview of each product, the "Partner Sponsored" tag indicates that usage of that product is fully covered by the chain, if approved by the Fogo team. Where this perk is available, please reach out to the developer relations team for an access code to the private signup form. ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs

NOT COMPATIBLE

Subgraphs are designed for EVM-compatible chains and are not available for Fogo. Fogo uses a different virtual machine architecture. For Fogo data indexing, consider using [Mirror](/mirror/introduction) or [Turbo](/turbo-pipelines/introduction) pipelines which support non-EVM chains. ## Turbo

MAINNET SUPPORTED TESTNET SUPPORTED

Turbo pipelines provide high-performance streaming data pipelines with sub-second latency. Deploy a pipeline to start streaming Fogo data to your preferred destination. ### Available chain slugs Mainnet: `fogo` | Testnet: `fogo_testnet` For the full configuration reference and available transforms, see the [Turbo documentation](/turbo-pipelines/introduction). ### Working with Fogo datasets Goldsky provides real-time streaming of Fogo datasets, including all historical data. The following datasets are currently available: | Dataset | Description | | - | - | | **Transactions with Instructions** (`fogo.raw_transactions_with_instructions`) | Enriched transaction data including instructions, accounts, balance changes, and metadata for the block. | | **Rewards** | Records of rewards distributed to validators for securing and validating the network. | | **Blocks** | Metadata for each block on the chain including hashes, transaction count, slot and leader rewards. | These datasets can be used as sources in your Turbo pipelines to stream Fogo data to any of the supported sinks. ### Deploying Fogo pipelines Turbo pipelines are defined using YAML configuration files and deployed via the Goldsky CLI. Here's the workflow: 1. **Create a pipeline configuration file**: define your sources, transforms, and sinks in a YAML file 2. **Validate your configuration**: run `goldsky turbo validate fogo-pipeline.yaml` to check for errors 3. **Deploy the pipeline**: run `goldsky turbo apply fogo-pipeline.yaml` to deploy 4. **Monitor your pipeline**: use `goldsky turbo logs fogo-pipeline.yaml` to view logs and `goldsky turbo inspect fogo-pipeline.yaml` to see live data For a complete walkthrough, see the [Turbo Pipelines Quickstart](/turbo-pipelines/quickstart). Remember to first create a [Secret](/platform/secrets) in order for Turbo Pipelines to be able to write the data into the database of your choice. ### Example pipeline configuration Here's an example configuration file for streaming Fogo transactions with instructions: ```yaml fogo-transactions.yaml theme={"dark"} name: fogo-transactions resource_size: s sources: fogo_transactions: type: dataset dataset_name: fogo.raw_transactions_with_instructions version: 1.0.0 start_at: latest # or 'earliest' to process all historical data filter: block_slot >= 1000000 # Optional: only include transactions at or after this slot sinks: postgres_fogo_transactions: type: postgres from: fogo_transactions schema: public table: fogo_transactions secret_name: primary_key: id ``` **Choosing where to start:** * **`start_at: latest`** streams data from when the pipeline is deployed. Use `start_at: earliest` instead to process all historical data. * **`filter: block_slot >= `** limits the source to transactions at or after a specific Fogo slot. Fogo does not support a numeric `start_block`; use this slot filter for historical processing from a specific point in time. Add your corresponding secret name and run `goldsky turbo apply fogo-transactions.yaml` to deploy the pipeline. ## Edge

NOT COMPATIBLE

Edge RPC is designed for EVM-compatible chains and is not available for Fogo. Fogo uses a different virtual machine architecture. For Fogo data access, consider using [Mirror](/mirror/introduction) or [Turbo](/turbo-pipelines/introduction) pipelines which support non-EVM chains. ## Compose

NOT YET AVAILABLE

Compose lets you build offchain-to-onchain systems that durably move data and execute logic between your application and the blockchain. Learn more about what you can build with Compose in the [Compose documentation](/compose/introduction). Compose is not currently enabled for Fogo, but we'd love to change that. **From the Fogo team?** [Book a call](https://cal.com/team/goldsky/website-intro) to explore enabling Compose for your ecosystem.
**Building on Fogo?** [Contact us](https://cal.com/team/goldsky/website-intro) about dedicated infrastructure options. ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Forma Source: https://docs.goldsky.com/chains/forma Forma support on Goldsky: Turbo pipelines on Forma mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Fraxtal Source: https://docs.goldsky.com/chains/fraxtal Fraxtal support on Goldsky: Turbo pipelines on Fraxtal Mainnet, plus Subgraphs on mainnet and testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Fuse Source: https://docs.goldsky.com/chains/fuse Fuse support on Goldsky: Edge RPC and Compose on Fuse Mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Gensyn Source: https://docs.goldsky.com/chains/gensyn Gensyn support on Goldsky: Turbo pipelines and Subgraphs on Gensyn Mainnet and Gensyn Testnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Gnosis Chain Source: https://docs.goldsky.com/chains/gnosis Gnosis Chain support on Goldsky: Turbo pipelines, Edge RPC, and Compose on Gnosis mainnet, plus Subgraphs on mainnet and testnet, with CLI setup steps. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Gravity Source: https://docs.goldsky.com/chains/gravity Gravity support on Goldsky: Turbo pipelines, Edge RPC, Compose, and Subgraphs on Gravity mainnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Ham Source: https://docs.goldsky.com/chains/ham Ham support on Goldsky: current availability for Ham, how to get started with the CLI, and how to reach the team about enabling Ham. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # HashKey Source: https://docs.goldsky.com/chains/hashkey HashKey support on Goldsky: Turbo pipelines on HashKey mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Hedera Source: https://docs.goldsky.com/chains/hedera Hedera support on Goldsky: Subgraphs on Hedera Mainnet and Hedera Testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Horizen Source: https://docs.goldsky.com/chains/horizen Horizen support on Goldsky: Subgraphs on Horizen mainnet and Horizen Testnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # HyperEVM Source: https://docs.goldsky.com/chains/hyperevm HyperEVM support on Goldsky: Turbo pipelines, Edge RPC, Compose, and Subgraphs on HyperEVM mainnet and HyperEVM Testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Hyperliquid Source: https://docs.goldsky.com/chains/hyperliquid Hyperliquid support on Goldsky: Turbo pipelines on Hypercore Mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo Hypercore datasets start at block `846900800` (January 1, 2026). Blocks before `846900800` aren't available. See [Hypercore sources](/turbo-pipelines/sources/hypercore) for the available datasets. ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Immutable zkEVM Source: https://docs.goldsky.com/chains/immutable-zkevm Immutable zkEVM support on Goldsky: Turbo pipelines and Subgraphs on Immutable zkEVM mainnet and Immutable zkEVM Testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Incentiv Source: https://docs.goldsky.com/chains/incentiv Incentiv support on Goldsky: Turbo pipelines and Subgraphs on Incentiv mainnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Injective Source: https://docs.goldsky.com/chains/injective Injective support on Goldsky: Turbo pipelines on Injective Mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Ink Source: https://docs.goldsky.com/chains/ink Ink support on Goldsky: Turbo pipelines and Subgraphs on Ink mainnet and Ink Sepolia, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Overview Source: https://docs.goldsky.com/chains/introduction Where Goldsky runs: the full list of supported EVM and non-EVM networks, partner chains with dedicated docs, and how to reach the team about a partnership. ## All networks Goldsky currently supports more than 90 networks across Subgraphs and Mirror. For the full list of supported networks, click through to the dedicated reference page [here](/chains/supported-networks). ## Partner networks Goldsky works directly with leading and emerging networks to make its indexing solutions available to the developer ecosystem. For networks, this introduces several advantages: * enhanced developer experience for your network * seamless porting of applications from other major chains * industry-leading infrastructure reliability and performance * offloaded engineering and developer success Chain-specific documentation for each of Goldsky's partner networks is linked below. This is currently a work-in-progress, so if you are building on one of our partner networks or would like to learn more about our network partnership approach, please don't hesitate to contact us at [support@goldsky.com](mailto:support@goldsky.com) or book a call with our team.
} href="/chains/0g" /> } href="/chains/abstract" /> } href="/chains/apechain" /> } href="/chains/arc" /> } href="/chains/arweave" /> } href="/chains/berachain" /> } href="/chains/bob" /> } href="/chains/camp" /> } href="/chains/citrea" /> } href="/chains/filecoin" /> } href="/chains/flare" /> } href="/chains/fluent" /> } href="/chains/fogo" /> } href="/chains/gensyn" /> } href="/chains/horizen" /> } href="/chains/incentiv" /> } href="/chains/ink" /> } href="/chains/iota" /> } href="/chains/kaia" /> } href="/chains/kite-ai" /> } href="/chains/litvm" /> } href="/chains/lumia" /> } href="/chains/manta" /> } href="/chains/mantra" /> } href="/chains/megaeth" /> } href="/chains/moca" /> } href="/chains/mode" /> } href="/chains/monad" /> } href="/chains/morph" /> } href="/chains/near" /> } href="/chains/neura" /> } href="/chains/pharos" /> {/* Brand-teal fill so the logo pops on a dark card */} } href="/chains/plasma" /> } href="/chains/plume" /> } href="/chains/redbelly" /> } href="/chains/rise" /> } href="/chains/sei" /> } href="/chains/sophon" /> } href="/chains/stellar" /> } href="/chains/sui" /> } href="/chains/taiko" /> } href="/chains/unichain" /> } href="/chains/viction" /> } href="/chains/zircuit" /> # IOTA Source: https://docs.goldsky.com/chains/iota IOTA support on Goldsky: Turbo pipelines on IOTA EVM Mainnet and IOTA Testnet, plus Subgraphs on mainnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Kaia Source: https://docs.goldsky.com/chains/kaia Kaia support on Goldsky: Turbo pipelines, Edge RPC, and Compose on Kaia Mainnet, plus Subgraphs on mainnet and testnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Katana Source: https://docs.goldsky.com/chains/katana Katana support on Goldsky: Turbo pipelines and Subgraphs on Katana mainnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Kava Source: https://docs.goldsky.com/chains/kava Kava support on Goldsky: Edge RPC and Compose on Kava Mainnet, plus Subgraphs on mainnet and testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Indexing Kite AI with Goldsky Source: https://docs.goldsky.com/chains/kite-ai ## Overview Goldsky provides high-performance data infrastructure for Kite AI, making it easy to extract, transform, and load on-chain data to power both application and analytics use cases. Goldsky offers two primary approaches to indexing and accessing blockchain data: [Subgraphs](/subgraphs/introduction) (hosted GraphQL APIs) and [Turbo](/turbo-pipelines/introduction) (real-time data pipelines). ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` ### Subgraphs Kite AI subgraphs can be deployed on Goldsky in 2 ways: * Via CLI from a local subgraph configuration file. If you are familiar with developing subgraphs already, you'll be familiar with this approach; after defining a subgraph locally (with a `subgraph.yaml` file, a `schema.graphql` file, and the necessary mappings to translate raw event data into the entities defined in the schema), you can deploy subgraphs to Goldsky (once the Goldsky CLI is installed) using `goldsky subgraph deploy / --path .` For more, read the [step-by-step guide](/subgraphs/deploying-subgraphs). * Via instant subgraphs, where you can pass through a contract address and the ABI for that contract. This is a quick-start option that automatically generates the underlying subgraph configuration files on your behalf, making it easy to extract blockchain event data and serve it as an API endpoint without complex setup. Use the `--from-abi` flag in the command above instead of `--path`. For more, read the [low-code subgraphs guide](/subgraphs/guides/create-a-low-code-subgraph). Kite AI Mainnet and Testnet are available at the chain slugs `kite-ai` and `kite-ai-testnet` respectively. ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Linea Source: https://docs.goldsky.com/chains/linea Linea support on Goldsky: Turbo pipelines and Subgraphs on Linea mainnet and Linea Sepolia, plus Edge RPC and Compose on mainnet, with CLI setup steps. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Lisk Source: https://docs.goldsky.com/chains/lisk Lisk support on Goldsky: Turbo pipelines and Subgraphs on Lisk mainnet and Lisk Sepolia, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Litecoin Source: https://docs.goldsky.com/chains/litecoin Litecoin support on Goldsky: Turbo pipelines on Litecoin mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # LitVM Source: https://docs.goldsky.com/chains/litvm LitVM support on Goldsky: Turbo pipelines and Subgraphs on LitVM Liteforge Testnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Lumia Source: https://docs.goldsky.com/chains/lumia Lumia support on Goldsky: Subgraphs on Lumia mainnet and Lumia Beam Testnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Derive Source: https://docs.goldsky.com/chains/lyra Derive support on Goldsky: Turbo pipelines on Lyra Mainnet and Lyra Testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Manta Network Source: https://docs.goldsky.com/chains/manta Manta Network support on Goldsky: Subgraphs on Manta Pacific mainnet and Manta Pacific Sepolia, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Mantle Source: https://docs.goldsky.com/chains/mantle Mantle support on Goldsky: Turbo pipelines on Mantle Mainnet, plus Edge RPC, Compose, and Subgraphs on mainnet and testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # MANTRA Source: https://docs.goldsky.com/chains/mantra MANTRA support on Goldsky: Subgraphs on Mantra mainnet and Mantra Dukong Testnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # MegaETH Source: https://docs.goldsky.com/chains/megaeth MegaETH support on Goldsky: Turbo pipelines and Subgraphs on MegaETH mainnet and MegaETH Testnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Metal Source: https://docs.goldsky.com/chains/metal Metal support on Goldsky: Turbo pipelines on Metal mainnet and Metal Testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Metis Source: https://docs.goldsky.com/chains/metis Metis support on Goldsky: Subgraphs on Metis mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Mezo Source: https://docs.goldsky.com/chains/mezo Mezo support on Goldsky: Turbo pipelines and Subgraphs on Mezo mainnet and Mezo Testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Mitosis Source: https://docs.goldsky.com/chains/mitosis Mitosis support on Goldsky: Subgraphs on Mitosis Mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Moca Network Source: https://docs.goldsky.com/chains/moca Moca Network support on Goldsky: Turbo pipelines and Subgraphs on Moca Mainnet and Moca Testnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Mode Network Source: https://docs.goldsky.com/chains/mode Mode Network support on Goldsky: Turbo pipelines and Subgraphs on Mode mainnet and Mode Testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Monad Source: https://docs.goldsky.com/chains/monad Monad support on Goldsky: Turbo pipelines, Edge RPC, Compose, and Subgraphs on Monad mainnet and Monad Testnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Moonbeam Source: https://docs.goldsky.com/chains/moonbeam Moonbeam support on Goldsky: Edge RPC, Compose, and Subgraphs on Moonbeam Mainnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Morph Source: https://docs.goldsky.com/chains/morph Morph support on Goldsky: Turbo pipelines on Morph mainnet, plus Subgraphs on mainnet and testnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Movement Source: https://docs.goldsky.com/chains/movement Movement support on Goldsky: Turbo pipelines on Movement mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # NEAR Source: https://docs.goldsky.com/chains/near NEAR support on Goldsky: Turbo pipelines on NEAR mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Neura Source: https://docs.goldsky.com/chains/neura Neura support on Goldsky: Turbo pipelines and Subgraphs on Neura Testnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Oasis Consensus Source: https://docs.goldsky.com/chains/oasis-consensus Oasis Consensus support on Goldsky: Turbo pipelines on Oasis Consensus mainnet and Oasis Consensus Testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Oasis Network Source: https://docs.goldsky.com/chains/oasis-sapphire Oasis Network support on Goldsky: Subgraphs on Oasis Sapphire mainnet and Oasis Sapphire Testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Oasys Source: https://docs.goldsky.com/chains/oasys Oasys support on Goldsky: current availability for Oasys Homeverse, how to get started with the CLI, and how to reach the team about enabling Oasys. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # opBNB Source: https://docs.goldsky.com/chains/opbnb opBNB support on Goldsky: Edge RPC and Compose on Optimism BNB (opBNB) mainnet, plus Subgraphs on mainnet and testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Optimism Source: https://docs.goldsky.com/chains/optimism Optimism support on Goldsky: Turbo pipelines, Edge RPC, Compose, and Subgraphs on Optimism mainnet and Optimism Sepolia, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Orderly Source: https://docs.goldsky.com/chains/orderly Orderly support on Goldsky: Turbo pipelines and Subgraphs on Orderly mainnet and Orderly Sepolia, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Paradex Source: https://docs.goldsky.com/chains/paradex Paradex support on Goldsky: current availability for Paradex, how to get started with the CLI, and how to reach the team about enabling Paradex. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Pharos Network Source: https://docs.goldsky.com/chains/pharos Pharos Network support on Goldsky: Turbo pipelines and Subgraphs on Pharos Mainnet and Pharos Atlantic Testnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Plasma Source: https://docs.goldsky.com/chains/plasma Plasma support on Goldsky: Turbo pipelines and Subgraphs on Plasma mainnet and Plasma Testnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Plume Network Source: https://docs.goldsky.com/chains/plume Plume Network support on Goldsky: Turbo pipelines on Plume Mainnet, plus Subgraphs on mainnet and testnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Polygon PoS Source: https://docs.goldsky.com/chains/polygon-pos Polygon PoS support on Goldsky: Turbo pipelines, Edge RPC, Compose, and Subgraphs on Polygon mainnet and Polygon Amoy Testnet, with CLI setup steps. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Polygon zkEVM Source: https://docs.goldsky.com/chains/polygon-zkevm Polygon zkEVM support on Goldsky: Edge RPC, Compose, and Subgraphs on Polygon zkEVM mainnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Indexing Polymarket with Goldsky Source: https://docs.goldsky.com/chains/polymarket On **April 28, 2026**, Polymarket migrated to a v2 set of contracts and is no longer using subgraphs going forward. Existing public subgraph endpoints will return incomplete or incorrect data. **Turbo Pipelines** with the v2 Polymarket datasets are the recommended way to access on-chain Polymarket data. ## Overview Goldsky provides high-performance data infrastructure for Polymarket, making it easy to extract, transform, and load on-chain data to power both application and analytics use cases via [Turbo Pipelines](/turbo-pipelines/introduction) (real-time data replication pipelines). Polymarket is the world's largest prediction market platform, enabling users to trade on the outcome of real-world events. Built on Polygon, Polymarket processes millions of trades and provides deep liquidity for markets spanning politics, sports, economics, and more. ## Benefits Goldsky's Polymarket integration enables: * **Real-time market monitoring**: track order fills, matched orders, and position changes as they happen * **Analytics and insights**: build dashboards showing open interest, trading volume, and market trends * **User position tracking**: monitor individual user balances and positions with PnL data * **Trading activity analysis**: analyze granular order flow and market maker activity * **Custom alerts**: set up webhooks for specific market events or trading patterns ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` ### Turbo Pipelines Turbo pipelines allow users to replicate data into their own infrastructure (any of the [supported sinks](/turbo-pipelines/sinks)) in real time. For a complete overview of how to deploy Turbo pipelines, including a video walkthrough, check the [Quickstart guide](/turbo-pipelines/quickstart). ### Working with Polymarket datasets Goldsky provides real-time streaming of Polymarket datasets, including all historical data. The following datasets are currently available: | Dataset | Description | | - | - | | **Order Filled (*recommended*)** | Emitted when a single Polymarket order is partially or completely filled. For example: a 50¢ YES buy for 100 YES matched against a 50¢ YES sell for 100 YES will emit 2 Order Filled events, from the perspective of the YES buy and of the YES sell. This is useful for granular tracking of trading activity and history. | | **Orders Matched** | Emitted when a Polymarket taker order is matched against a set of Polymarket maker (limit) orders. For example: a 50¢ YES buy for 200 YES matched against 2 50¢ YES sells for 100 YES each will emit a single Orders Matched event. Orders Matched gives a more high-level view of trading activity as it only tracks taker activity. | | **User Balances** | Keeps track of all user outcome token positions. | | **User Positions** | Keeps track of outcome token positions along with PnL-specific data including average price and realized PnL. | These datasets can be used as sources in your Turbo pipelines to stream Polymarket data to any of the supported sinks. #### Dataset schemas | Column | Type | Description | | - | - | - | | `id` | string | Unique event identifier | | `block_number` | long | Block number of the event | | `block_timestamp` | long | Unix timestamp of the block | | `transaction_hash` | string | Transaction hash | | `address` | string | Contract address that emitted the event | | `user_id` | string | Address of the user whose order was filled | | `asset` | string | Token ID of the outcome token | | `amount_usdc` | double | USDC value of the fill | | `amount_shares` | double | Number of outcome token shares filled | | `price` | double | Fill price (between 0 and 1) | | `tx_type` | string | Transaction type (e.g. `TRADE`) | | `side` | string | Order side (`BUY` or `SELL`) | | `order_hash` | string | Hash of the order | | `counterparty_id` | string | Address of the counterparty | | `order_type` | string | Whether this order was `maker` or `taker` | | `fee` | double | Fee paid for this fill | | `builder` | string | Builder address if applicable | | Column | Type | Description | | - | - | - | | `id` | string | Unique event identifier | | `block_number` | long | Block number of the event | | `block_timestamp` | long | Unix timestamp of the block | | `transaction_hash` | string | Transaction hash | | `address` | string | Contract address that emitted the event | | `user_id` | string | Address of the taker | | `asset` | string | Token ID of the outcome token | | `amount_usdc` | double | Total USDC value of the matched trade | | `amount_shares` | double | Total number of outcome token shares matched | | `price` | double | Effective price (between 0 and 1) | | `tx_type` | string | Transaction type (e.g. `TRADE`) | | `side` | string | Taker order side (`BUY` or `SELL`) | | `order_hash` | string | Hash of the taker order | | Column | Type | Description | | - | - | - | | `id` | string | Unique balance record identifier | | `owner_address` | string | Address of the token holder | | `contract_address` | string | ERC-1155 contract address | | `token_id` | string | Outcome token ID | | `token_type` | string | Token standard (e.g. `ERC_1155`) | | `block_number` | long | Block number of the last update | | `block_timestamp` | long | Unix timestamp of the last update | | `balance` | decimal | Current token balance | | Column | Type | Description | | - | - | - | | `user_id` | string | Address of the user | | `token_id` | string | Outcome token ID | | `amount` | string | Current position size | | `avg_price` | string | Average entry price | | `realized_pnl` | string | Realized profit and loss | | `total_bought` | string | Total amount bought | | `last_block` | long | Block number of the last update | | `last_log_index` | int | Log index of the last update | | `last_updated_at` | long | Unix timestamp of the last update | #### Deploying Polymarket pipelines Turbo pipelines are defined using YAML configuration files and deployed via the Goldsky CLI. Here's the workflow: 1. **Create a pipeline configuration file**: define your sources, transforms, and sinks in a YAML file 2. **Validate your configuration**: run `goldsky turbo validate polymarket-pipeline.yaml` to check for errors 3. **Deploy the pipeline**: run `goldsky turbo apply polymarket-pipeline.yaml` to deploy 4. **Monitor your pipeline**: use `goldsky turbo logs polymarket-pipeline.yaml` to view logs and `goldsky turbo inspect polymarket-pipeline.yaml` to see live data For a complete walkthrough, see the [Turbo Pipelines Quickstart](/turbo-pipelines/quickstart). Remember to first create a [Secret](/platform/secrets) in order for Turbo Pipelines to be able to write the data into the database of your choice. For webhook sinks, you can include authentication headers directly in the configuration. #### Example pipeline configuration Here's an example configuration file for streaming Polymarket order fills to a webhook endpoint, using the v2 dataset and a block number range to backfill a specific period: ```yaml polymarket-orders-webhook.yaml theme={"dark"} name: polymarket-orders-webhook resource_size: s sources: order_filled: type: dataset dataset_name: polymarket.order_filled version: 2.0.0 start_at: earliest filter: block_number >= 42598795 AND block_number <= 42835303 transforms: high_value_orders: type: sql primary_key: id sql: | SELECT id, block_number, block_timestamp, transaction_hash, user_id, asset, side, price, amount_usdc, amount_shares FROM order_filled WHERE amount_usdc > 1000 sinks: webhook_alerts: type: webhook from: high_value_orders url: https://api.example.com/polymarket/orders one_row_per_request: true headers: Authorization: Bearer YOUR_API_TOKEN Content-Type: application/json ``` This pipeline: 1. Streams Order Filled events from the v2 Polymarket dataset for a specific block range 2. Filters for high-value orders (amount\_usdc > 1000) 3. Sends each order individually to your webhook endpoint with authentication Deploy the pipeline by running: ```bash theme={"dark"} goldsky turbo apply polymarket-orders-webhook.yaml ``` Fast scan is supported on the v2 Polymarket datasets, so you can backfill a specific period using a `block_number` range filter as shown above. Filtering by timestamp is not supported for fast scan; use `block_number` instead. ***Note***: The datasets output large amounts of data. E.g. user positions may be up to 1.2B entities to backfill, and up to 150M entities monthly to maintain. For insights on costs for datasets, please refer to our [pricing calculator](https://goldsky.com/pricing#pricing-calculator). ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Public Goods Network Source: https://docs.goldsky.com/chains/publicgoods Public Goods Network support on Goldsky: Turbo pipelines on Public Goods Network mainnet, plus Subgraphs on mainnet and testnet, with CLI setup steps. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # PulseChain Source: https://docs.goldsky.com/chains/pulsechain PulseChain support on Goldsky: Subgraphs on PulseChain mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # RACE Source: https://docs.goldsky.com/chains/race RACE support on Goldsky: Turbo pipelines on Race mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # RARI Chain Source: https://docs.goldsky.com/chains/rari RARI Chain support on Goldsky: Subgraphs on RARI Chain mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Redbelly Source: https://docs.goldsky.com/chains/redbelly Redbelly support on Goldsky: Subgraphs on Redbelly mainnet and Redbelly Testnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Redstone Source: https://docs.goldsky.com/chains/redstone Redstone support on Goldsky: Turbo pipelines on Redstone mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Reya Network Source: https://docs.goldsky.com/chains/reya Reya Network support on Goldsky: Turbo pipelines on Reya mainnet, plus Subgraphs on mainnet and testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # RISE Chain Source: https://docs.goldsky.com/chains/rise RISE Chain support on Goldsky: Turbo pipelines and Subgraphs on Rise Mainnet and Rise Sepolia, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Robinhood Chain Source: https://docs.goldsky.com/chains/robinhood-chain Robinhood Chain support on Goldsky: Turbo pipelines, Edge RPC, Compose, and Subgraphs on Robinhood Chain Mainnet and Robinhood Chain Testnet. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Ronin Source: https://docs.goldsky.com/chains/ronin Ronin support on Goldsky: Turbo pipelines and Subgraphs on Ronin mainnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Rootstock (RSK) Source: https://docs.goldsky.com/chains/rootstock Rootstock (RSK) support on Goldsky: Turbo pipelines and Subgraphs on Rootstock mainnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Indexing Saga EVM with Goldsky Source: https://docs.goldsky.com/chains/saga ## Overview Goldsky provides high-performance data infrastructure for Saga, making it easy to extract, transform, and load on-chain data to power both application and analytics use cases. Goldsky offers two primary approaches to indexing and accessing blockchain data: [Subgraphs](/subgraphs/introduction) (hosted GraphQL APIs) and [Turbo](/turbo-pipelines/introduction) (real-time data pipelines). ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` ### Subgraphs Saga EVM Subgraphs can be deployed on Goldsky in 2 ways: * Via CLI from a local subgraph configuration file. If you are familiar with developing subgraphs already, you'll be familiar with this approach; after defining a subgraph locally (with a `subgraph.yaml` file, a `schema.graphql` file, and the necessary mappings to translate raw event data into the entities defined in the schema), you can deploy subgraphs to Goldsky (once the Goldsky CLI is installed) using `goldsky subgraph deploy / --path .` For more, read the [step-by-step guide](/subgraphs/deploying-subgraphs). * Via instant subgraphs, where you can pass through a contract address and the ABI for that contract. This is a quick-start option that automatically generates the underlying subgraph configuration files on your behalf, making it easy to extract blockchain event data and serve it as an API endpoint without complex setup. Use the `--from-abi` flag in the command above instead of `--path`. For more, read the [low-code subgraphs guide](/subgraphs/guides/create-a-low-code-subgraph). Saga EVM Pegasus Mainnet is available at the chain slug `saga-evm`. ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Scroll Source: https://docs.goldsky.com/chains/scroll Scroll support on Goldsky: Turbo pipelines, Edge RPC, Compose, and Subgraphs on Scroll Mainnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Sei Source: https://docs.goldsky.com/chains/sei Sei support on Goldsky: Turbo pipelines, Edge RPC, and Compose on Sei mainnet, plus Subgraphs on mainnet and testnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Settlus Source: https://docs.goldsky.com/chains/settlus Settlus support on Goldsky: Turbo pipelines on Settlus mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Shape Network Source: https://docs.goldsky.com/chains/shape Shape Network support on Goldsky: Turbo pipelines and Subgraphs on Shape mainnet and Shape Sepolia, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # SKALE Source: https://docs.goldsky.com/chains/skale-calypso SKALE support on Goldsky: Subgraphs on SKALE Calypso mainnet and SKALE Calypso Testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # SNAXchain Source: https://docs.goldsky.com/chains/snaxchain SNAXchain support on Goldsky: current availability for Snaxchain, how to get started with the CLI, and how to reach the team about enabling SNAXchain. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Solana Source: https://docs.goldsky.com/chains/solana Solana support on Goldsky: Turbo pipelines on Solana mainnet and Solana Devnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Somnia Source: https://docs.goldsky.com/chains/somnia Somnia support on Goldsky: Edge RPC and Compose on Somnia Testnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Soneium Source: https://docs.goldsky.com/chains/soneium Soneium support on Goldsky: Turbo pipelines and Subgraphs on Soneium mainnet and Soneium Minato, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Sonic Source: https://docs.goldsky.com/chains/sonic Sonic support on Goldsky: Turbo pipelines, Edge RPC, and Compose on Sonic mainnet, plus Subgraphs on mainnet and testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Sophon Source: https://docs.goldsky.com/chains/sophon Sophon support on Goldsky: Turbo pipelines and Subgraphs on Sophon mainnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Stable Source: https://docs.goldsky.com/chains/stable Stable support on Goldsky: Turbo pipelines on Stable Mainnet, plus Subgraphs on mainnet and testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Starknet Source: https://docs.goldsky.com/chains/starknet Starknet support on Goldsky: Turbo pipelines on Starknet mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Stellar Source: https://docs.goldsky.com/chains/stellar ## Overview ### Partnership Goldsky has partnered with Stellar to make our product available to the ecosystem and provide dedicated support for Stellar. Below in the overview of each product, the "Partner Sponsored" tag indicates that usage of that product is fully covered by the chain, if approved by the Stellar team. Where this perk is available, please reach out to the developer relations team for an access code to the private signup form. ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Turbo

MAINNET SUPPORTED TESTNET SUPPORTED

Turbo pipelines provide high-performance streaming data pipelines with sub-second latency. Deploy a pipeline to start streaming Stellar data to your preferred destination. ### Quick config ```yaml stellar-transactions.yaml theme={"dark"} name: my-stellar-transactions resource_size: s sources: stellar_transactions: type: dataset dataset_name: stellar_mainnet.transactions version: 1.2.0 start_at: latest sinks: my_sink: type: postgres from: stellar_transactions schema: public table: stellar_transactions secret_name: MY_POSTGRES_SECRET primary_key: transaction_hash ``` Deploy with: ```bash theme={"dark"} goldsky turbo apply stellar-transactions.yaml ``` ### Available chain slugs Mainnet: `stellar_mainnet` | Testnet: `stellar_testnet` Goldsky provides real-time (under 5 seconds) streaming of Stellar datasets, including all historical data, for both mainnet and testnet. Datasets include ledgers, transactions, operations, events, transfers, ledger entries, and balances. The Stellar testnet is frequently reset (typically about once every third month). We recommend deploying testnet pipelines with `start_at: latest` so they always index from the most recent testnet version. For available datasets, schemas, version details, and pipeline examples, see the [Stellar Turbo Sources](/turbo-pipelines/sources/stellar) guide. ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Sui Source: https://docs.goldsky.com/chains/sui Sui support on Goldsky: stream Sui events with Turbo pipelines from the raw events dataset, with chain slugs and an example pipeline configuration. ## Overview Goldsky is the modern back-end for crypto-enabled products; the infrastructure layer between your application and the blockchain. We handle the complex, undifferentiated work of building on crypto rails: streaming real-time data, maintaining reliable chain connectivity, and executing onchain logic. Teams use Goldsky to ship faster and stay focused on their core product. ### Partnership Goldsky has partnered with Sui to make our product available to the ecosystem and provide dedicated support for Sui. Below in the overview of each product, the "Partner Sponsored" tag indicates that usage of that product is fully covered by the chain, if approved by the Sui team. Where this perk is available, please reach out to the developer relations team for an access code to the private signup form. ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs

NOT COMPATIBLE

Subgraphs are designed for EVM-compatible chains and are not available for Sui. Sui uses a different virtual machine architecture. For Sui data indexing, use [Turbo](/turbo-pipelines/introduction) pipelines, which support Sui datasets. ## Turbo

MAINNET SUPPORTED

Turbo pipelines provide high-performance streaming data pipelines with sub-second latency. Deploy a pipeline to start streaming Sui data to your preferred destination. ### Available chain slugs Mainnet: `sui` ### Working with Sui datasets Goldsky provides real-time streaming of Sui datasets, including all historical data. The following dataset is currently available: | Dataset | Description | | - | - | | **Raw Events** (`sui.raw_events_v5`) | Move contract events emitted on Sui, including event type, module, package, transaction context, and payload. | This dataset can be used as a source in your Turbo pipelines to stream Sui data to any of the supported sinks. ### Deploying Sui pipelines Turbo pipelines are defined using YAML configuration files and deployed via the Goldsky CLI. Here's the workflow: 1. **Create a pipeline configuration file**: define your sources, transforms, and sinks in a YAML file 2. **Validate your configuration**: run `goldsky turbo validate sui-pipeline.yaml` to check for errors 3. **Deploy the pipeline**: run `goldsky turbo apply sui-pipeline.yaml` to deploy 4. **Monitor your pipeline**: use `goldsky turbo logs sui-pipeline.yaml` to view logs and `goldsky turbo inspect sui-pipeline.yaml` to see live data For a complete walkthrough, see the [Turbo Pipelines Quickstart](/turbo-pipelines/quickstart). Remember to first create a [Secret](/platform/secrets) in order for Turbo Pipelines to be able to write the data into the database of your choice. ### Example pipeline configuration Here's an example configuration file for streaming Sui raw events: ```yaml sui-events.yaml theme={"dark"} name: sui-events resource_size: s sources: sui_events: type: dataset dataset_name: sui.raw_events_v5 version: 1.0.0 start_at: latest # or 'earliest' to process all historical data filter: checkpoint >= 1000000 # Optional: only include events at or after this checkpoint sinks: postgres_sui_events: type: postgres from: sui_events schema: public table: sui_events secret_name: primary_key: id ``` **Choosing where to start:** * **`start_at: latest`** streams data from when the pipeline is deployed. Use `start_at: earliest` instead to process all historical data. * **`filter: checkpoint >= `** limits the source to events at or after a specific Sui checkpoint. Sui does not support a numeric `start_block`; use this checkpoint filter for historical processing from a specific point in time. Add your corresponding secret name and run `goldsky turbo apply sui-events.yaml` to deploy the pipeline. ## Edge

NOT COMPATIBLE

Edge RPC is designed for EVM-compatible chains and is not available for Sui. Sui uses a different virtual machine architecture. For Sui data access, use [Turbo](/turbo-pipelines/introduction) pipelines, which support Sui datasets. ## Compose

NOT YET AVAILABLE

Compose lets you build offchain-to-onchain systems that durably move data and execute logic between your application and the blockchain. Learn more about what you can build with Compose in the [Compose documentation](/compose/introduction). Compose is not currently enabled for Sui, but we'd love to change that. **From the Sui team?** [Book a call](https://cal.com/team/goldsky/website-intro) to explore enabling Compose for your ecosystem.
**Building on Sui?** [Contact us](https://cal.com/team/goldsky/website-intro) about dedicated infrastructure options. ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Superseed Source: https://docs.goldsky.com/chains/superseed Superseed support on Goldsky: Turbo pipelines and Subgraphs on Superseed mainnet and Superseed Sepolia, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Supported networks Source: https://docs.goldsky.com/chains/supported-networks Every chain Goldsky supports and which products cover it: a filterable Turbo, Edge RPC, Compose, and Subgraphs coverage matrix plus Turbo datasets by chain. Goldsky supports 150+ networks. The matrix shows which products support each chain. Filter by name or chain ID, or use `?chain=` to deep-link to a row. Not sure which product you need? See [Which product do I need?](/which-product) ## Coverage matrix The same coverage as a plain table: Support marks: **M** = mainnet, **M+T** = mainnet and testnet, **T** = testnet only, — = not supported. Chain ID is shown as mainnet / testnet where known. ### EVM & EVM-compatible | Chain | Chain ID | Turbo | Edge RPC | Compose | Subgraphs | | - | - | - | - | - | - | | 0G | 16661 / 16602 | M | — | — | M+T | | Abstract Chain | 2741 / 11124 | M+T | M | M | M+T | | ApeChain | 33139 / 33111 | M+T | — | — | M+T | | Arbitrum Nova | 42170 | M | — | — | M | | Arbitrum One | 42161 / 421614 | M+T | M+T | M+T | M+T | | Arc | 5042 / 5042002 | M+T | M+T | M+T | M+T | | Arena-Z | — | — | — | — | — | | Automata Network | — | — | — | — | — | | Avalanche | 43114 / 43113 | M | M | M | M+T | | B3 | 8333 / 1993 | M | — | — | M | | Base | 8453 / 84532 | M+T | M+T | M+T | M+T | | Berachain | 80094 / 80069 | M+T | M | M | M+T | | BitTorrent Chain | 199 | — | — | — | M | | Blast | 81457 / 168587773 | M | M | M | M+T | | BNB Smart Chain | 56 / 97 | M+T | M | M | M+T | | BOB (Build on Bitcoin) | 60808 / 808813 | M | — | — | M+T | | Boba Network | 288 / 28882 | — | — | — | M+T | | Camp Network | 484 / 90354 | T | — | — | M | | Canton | — | — | — | — | — | | Celo | 42220 | M | — | — | M | | Chiliz Chain | 88888 | — | — | — | M | | Citrea | 4114 / 5115 | — | — | — | M+T | | Codex | 81224 | M | — | — | — | | Conflux Espace | 1030 | M | — | — | M | | Corn | 21000000 / 21000001 | — | — | — | T | | Cosmos EVM | — / 4231 | — | — | — | — | | Cronos Chain | 388 / 282 | M | — | — | M | | Cyber | 7560 | M | M | M | M | | DATA Network | 1514 / 1315 | M+T | M | M | M+T | | Degen | 666666666 | M | — | — | M | | Derive | 957 | M+T | — | — | — | | Elysium | — / 99801 | — | — | — | T | | Ethereal | 5064014 / 13374202 | M+T | — | — | M+T | | Ethereum | 1 / 11155111 | M+T | M+T | M+T | M+T | | Etherlink | 42793 / 127823 | M+T | — | — | M+T | | Everclear | 25327 | — | — | — | M | | Filecoin | 314 / 314159 | — | — | — | M+T | | Flare Network | 14 / 114 | M+T | M | M | M+T | | Flow | 747 / 545 | — | — | — | M+T | | Fluent | 25363 / 20994 | M+T | — | — | M+T | | Flynet | — | M | — | — | — | | Forma | 984122 | M | — | — | — | | Fraxtal | 252 / 2522 | M | — | — | M+T | | Fuse | 122 | — | M | M | — | | Gensyn | 685689 / 685685 | M+T | — | — | M+T | | Gnosis Chain | 100 / 10200 | M | M | M | M+T | | Gravity | 1625 | M | M | M | M | | Ham | — | — | — | — | — | | HashKey | 177 | M | — | — | — | | Hedera | 295 / 296 | — | — | — | M+T | | Horizen | 26514 / 2651420 | — | — | — | M+T | | HyperEVM | 999 / 998 | M+T | M+T | M+T | M+T | | Hyperliquid | — | M | — | — | — | | Immutable zkEVM | 13371 / 13473 | M+T | — | — | M+T | | Incentiv | 24101 / 28802 | M | — | — | M | | Injective | — | M | — | — | — | | Ink | 57073 / 763373 | M+T | — | — | M+T | | IOTA | 8822 | M+T | — | — | M | | Kaia | 8217 / 1001 | M | M | M | M+T | | Katana | 747474 | M | — | — | M | | Kava | 2222 / 2221 | — | M | M | M+T | | Kite AI | 2366 / 2368 | — | — | — | M+T | | Linea | 59144 / 59141 | M+T | M | M | M+T | | Lisk | 1135 / 4202 | M+T | — | — | M+T | | LitVM | — / 4441 | T | — | — | T | | Lumia | 994873017 / 2030232745 | — | — | — | M+T | | Manta Network | 169 / 3441006 | — | — | — | M+T | | Mantle | 5000 / 5003 | M | M+T | M+T | M+T | | MANTRA | 5888 / 5887 | — | — | — | M+T | | MegaETH | 4326 / 6343 | M+T | — | — | M+T | | Metal | 1750 / 1740 | M+T | — | — | — | | Metis | 1088 | — | — | — | M | | Mezo | 31612 / 31611 | M+T | — | — | M+T | | Mitosis | 124816 | — | — | — | M | | Moca Network | 2288 / 222888 | M+T | — | — | M+T | | Mode Network | 34443 / 919 | M+T | — | — | M+T | | Monad | 143 / 10143 | M+T | M+T | M+T | M+T | | Moonbeam | 1284 | — | M | M | M | | Morph | 2818 / 2910 | M | — | — | M+T | | Neura | — / 267 | T | — | — | T | | Oasis Consensus | — | M+T | — | — | — | | Oasis Network | 23294 / 23295 | — | — | — | M+T | | Oasys | — | — | — | — | — | | opBNB | 204 / 5611 | — | M | M | M+T | | Optimism | 10 / 11155420 | M+T | M+T | M+T | M+T | | Orderly | 291 / 4460 | M+T | — | — | M+T | | Paradex | — | — | — | — | — | | Pharos Network | 1672 / 688689 | M+T | — | — | M+T | | Plasma | 9745 / 9746 | M+T | — | — | M+T | | Plume Network | 98866 / 98867 | M | — | — | M+T | | Polygon PoS | 137 / 80002 | M+T | M+T | M+T | M+T | | Polygon zkEVM | 1101 | — | M | M | M | | Polymarket | — | M | — | — | — | | Public Goods Network | 424 / 58008 | M | — | — | M+T | | PulseChain | 369 | — | — | — | M | | RACE | — | M | — | — | — | | RARI Chain | 1380012617 | — | — | — | M | | Redbelly | 151 / 153 | — | — | — | M+T | | Redstone | — | M | — | — | — | | Reya Network | 1729 / 89346162 | M | — | — | M+T | | RISE Chain | 4153 / 11155931 | M+T | — | — | M+T | | Robinhood Chain | 4663 / 46630 | M+T | M+T | M+T | M+T | | Ronin | 2020 | M | — | — | M | | Rootstock (RSK) | 30 | M | — | — | M | | Scroll | 534352 / 534351 | M | M | M | M | | Sei | 1329 / 1328 | M | M | M | M+T | | Settlus | 5371 | M | — | — | — | | Shape Network | 360 / 11011 | M+T | — | — | M+T | | SKALE | 1564830818 / 974399131 | — | — | — | M+T | | SNAXchain | — | — | — | — | — | | Somnia | — / 50312 | — | T | T | — | | Soneium | 1868 / 1946 | M+T | — | — | M+T | | Sonic | 146 / 57054 | M | M | M | M+T | | Sophon | 50104 / 531050104 | M | — | — | M | | Stable | 988 / 2201 | M | — | — | M+T | | Superseed | 5330 / 53302 | M+T | — | — | M+T | | Swan Chain | — | M | — | — | — | | Taiko | 167000 / 167013 | T | — | — | M+T | | Telos EVM | 40 / 41 | — | — | — | M | | Tempo | 4217 / 42431 | M+T | M+T | M+T | M+T | | Tenet | 1559 | — | — | — | — | | The Binary Holdings | — | — | — | — | — | | ThunderCore | 108 / 18 | — | — | — | M+T | | Treasure | 61166 | — | — | — | — | | Unichain | 130 / 1301 | M+T | M+T | M+T | M+T | | Vana | 1480 / 14800 | — | — | — | M+T | | Viction | 88 / 89 | M | — | — | M+T | | Volmex Finance | — / 5633311 | — | — | — | — | | World Chain | 480 / 4801 | M | — | — | M+T | | X Layer | 196 | M | — | — | M | | XDC Network | 50 | — | — | — | M | | XPLA | — | M | — | — | — | | XRADERS | — / 2730 | — | — | — | — | | XRPL EVM Sidechain | 1440000 / 1449000 | — | — | — | M+T | | Xterio | — | — | — | — | — | | Zenith | — / 936485 | T | — | — | — | | Zero | 543210 / 4457845 | — | — | — | — | | Zircuit | 48900 / 48898 | — | — | — | M+T | | zkLink Nova | 810180 / 810181 | — | — | — | M | | zkSync Era | 324 / 300 | M | M | M | M+T | | Zora | 7777777 / 999999999 | M+T | M | M | M+T | ### Solana (SVM) | Chain | Chain ID | Turbo | Edge RPC | Compose | Subgraphs | | - | - | - | - | - | - | | Fogo | — | M+T | — | — | — | | Solana | — | M+T | — | — | — | ### Bitcoin | Chain | Chain ID | Turbo | Edge RPC | Compose | Subgraphs | | - | - | - | - | - | - | | Bitcoin | — | M | — | — | — | | Litecoin | — | M | — | — | — | ### Move | Chain | Chain ID | Turbo | Edge RPC | Compose | Subgraphs | | - | - | - | - | - | - | | Movement | — | M | — | — | — | | Sui | — | M | — | — | — | ### Other | Chain | Chain ID | Turbo | Edge RPC | Compose | Subgraphs | | - | - | - | - | - | - | | Arweave | — | M | — | — | — | | NEAR | — | M | — | — | — | | Starknet | — | M | — | — | — | | Stellar | — | M+T | — | — | — | | TRON | 728126428 | M | — | — | — | Every chain in the matrix has its own page under **Partners** and **Other networks** in the sidebar. Seven partner chains have extended, hand-written walkthroughs: [Arweave](/chains/arweave), [Fogo](/chains/fogo), [Kite AI](/chains/kite-ai), [Polymarket](/chains/polymarket), [Saga](/chains/saga), [Stellar](/chains/stellar), and [Sui](/chains/sui). ## Turbo datasets by chain [Turbo pipelines](/turbo-pipelines/introduction) stream the datasets below into your own infrastructure. Turbo is also the only product with non-EVM sources: [Solana](/turbo-pipelines/sources/solana) (full history from genesis), [Bitcoin](/turbo-pipelines/sources/bitcoin), [Stellar](/turbo-pipelines/sources/stellar), [NEAR](/turbo-pipelines/sources/near), [Movement](/turbo-pipelines/sources/movement), and [Hypercore](/turbo-pipelines/sources/hypercore) (from block 846900800, January 1, 2026). ### EVM chains For EVM chains we support the following 4 datasets: | Dataset | Description | | - | - | | Blocks | Metadata for each block on the chain including hashes, transaction count, difficulty, and gas used. | | Logs | Raw logs for events emitted from contracts. Contains the contract address, data, topics, and metadata for blocks and transactions. | | Enriched Transactions | Transaction data including input, value, from and to address, and metadata for the block, gas, and receipts. | | Traces | Traces of all function calls made on the chain including metadata for block, trace, transaction, and gas. | ### Fast Scan Some datasets have support for [Fast Scan](/turbo-pipelines/sources/evm#fast-scan) which allows you to more quickly backfill filtered data. If a chain has partial support for Fast Scan, the dataset that doesn't support fast scan will have an asterisk `*` next to it. Here's a breakdown of the EVM chains we support and their corresponding datasets: | | Blocks | Enriched Transactions | Logs | Traces | Fast Scan | | - | - | - | - | - | - | | 0G | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Abstract | ✓ | ✓ | ✓ | ✗ | ✓ | | Abstract Testnet | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Apechain | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Apechain Curtis | ✓ | ✓ | ✓ | ✗ | ✓ | | Arbitrum Nova | ✓ | ✓ | ✓ | ✗ | ✓ | | Arbitrum One | ✓ | ✓ | ✓ | ✓ | ✓ | | Arbitrum Sepolia | ✓ | ✓ | ✓ | ✗ | ✓ | | Arc | ✓ | ✓ | ✓ | ✓ | ✓ | | Arc Testnet | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Arweave | ✓ | ✓ | ✗ | ✗ | ✗ | | Avalanche | ✓ | ✓ | ✓ | ✓ | ✓ | | B3 | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Base | ✓ | ✓ | ✓ | ✓ | ✓ | | Base Sepolia | ✓ | ✓ | ✓ | ✓ | ✓ | | Berachain | ✓\* | ✓ | ✓ | ✓\* | ✓ | | Berachain Bepolia | ✓ | ✓ | ✓ | ✓ | ✗ | | Bitcoin | ✓ | ✓ | ✗ | ✗ | ✓ | | Blast | ✓ | ✓ | ✓ | ✓ | ✓ | | BNB Chain (BSC) | ✓ | ✓ | ✓ | ✓ | ✓ | | BNB Chain Chapel (BSC Testnet) | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Build on Bitcoin (BOB) | ✓ | ✓\* | ✓ | ✓ | ✓ | | Camp Testnet | ✓ | ✓ | ✓ | ✓ | ✓ | | Celo | ✓ | ✓ | ✓ | ✓ | ✓ | | Codex | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Conflux eSpace | ✓ | ✓ | ✓ | ✗ | ✓ | | Cronos zkEVM | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Cyber | ✓ | ✓ | ✓ | ✓ | ✓ | | DATA Network | ✓ | ✓ | ✓ | ✓ | ✓ | | Data Network Aeneid (Testnet) | ✓ | ✓ | ✓ | ✓ | ✓ | | Degen | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Echelon Cosmos | ✓ | ✓ | ✓ | ✗ | ✓ | | Echelon Testnet Cosmos | ✓ | ✓ | ✓ | ✗ | ✓ | | Ethereal | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Ethereal Testnet | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Ethereum | ✓ | ✓ | ✓ | ✓ | ✓ | | Ethereum Hoodi | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Ethereum Sepolia | ✓ | ✓\* | ✓ | ✓ | ✓ | | Etherlink | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Etherlink Shadownet | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Fantom | ✓ | ✓ | ✓ | ✓ | ✓ | | Flare | ✓ | ✓ | ✓ | ✗ | ✓ | | Flare Testnet | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Fluent | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Fluent Testnet | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Flynet | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Forma | ✓ | ✓ | ✓ | ✓ | ✓ | | Fraxtal | ✓ | ✓ | ✓ | ✓ | ✓ | | Gensyn | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Gensyn Testnet | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Gnosis | ✓ | ✓ | ✓ | ✓ | ✓ | | Gravity | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | HashKey | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Helix Test | ✓ | ✓ | ✓ | ✗ | ✗ | | HyperEVM | ✓ | ✓ | ✓ | ✓\* | ✓ | | HyperEVM Testnet | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Immutable zkEVM | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Immutable zkEVM Testnet | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Incentiv | ✓ | ✓ | ✓ | ✗ | ✗ | | Injective | ✓ | ✓ | ✓ | ✗ | ✓ | | Ink | ✓ | ✓ | ✓ | ✓\* | ✓ | | Ink Sepolia | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | IOTA EVM | ✓ | ✓ | ✓ | ✓ | ✗ | | Kaia | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Katana | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Linea | ✓ | ✓ | ✓ | ✓\* | ✓ | | Linea Sepolia | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Lisk | ✓ | ✓ | ✓ | ✓ | ✓ | | Lisk Sepolia | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Litecoin | ✓ | ✓ | ✗ | ✗ | ✗ | | LitVM Liteforge Testnet | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Lyra | ✓ | ✓ | ✓ | ✓\* | ✓ | | Lyra Testnet | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Mantle | ✓ | ✓ | ✓ | ✗ | ✗ | | MegaETH | ✓ | ✓ | ✓ | ✓\* | ✓ | | MegaETH Testnet | ✓ | ✓ | ✓ | ✗ | ✓ | | Metal | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Metal Testnet | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Mezo | ✓ | ✓ | ✓ | ✓ | ✓ | | Mezo Testnet | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Moca | ✓ | ✓ | ✓ | ✓ | ✗ | | Moca Testnet | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Mode | ✓ | ✓ | ✓ | ✓ | ✓ | | Mode Testnet | ✓ | ✓ | ✓ | ✓ | ✓ | | Monad | ✓ | ✓ | ✓ | ✓\* | ✓ | | Monad Testnet | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Morph | ✓ | ✓ | ✓ | ✗ | ✓ | | Neura Testnet | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Oasis Consensus | ✓ | ✓ | ✗ | ✗ | ✓ | | Oasis Consensus Testnet | ✓ | ✓ | ✗ | ✗ | ✓ | | Optimism | ✓ | ✓ | ✓ | ✓ | ✓ | | Optimism Sepolia | ✓ | ✓ | ✓ | ✓ | ✓ | | Orderly | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Orderly Sepolia | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Pharos | ✓ | ✓ | ✓ | ✓ | ✓ | | Pharos Atlantic Testnet | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Plasma | ✓ | ✓ | ✓ | ✓\* | ✓ | | Plasma Testnet | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Plume | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Polygon | ✓ | ✓\* | ✓ | ✓ | ✓ | | Polygon Amoy Testnet | ✓ | ✓ | ✓ | ✓ | ✗ | | Polynomial | ✓ | ✓ | ✓ | ✓ | ✗ | | Proof of Play Apex | ✓ | ✓ | ✓ | ✗ | ✓ | | Proof of Play Barret | ✓ | ✓ | ✓ | ✓ | ✗ | | Proof of Play Boss | ✓ | ✓ | ✓ | ✓ | ✗ | | Proof of Play Cid | ✓ | ✓ | ✓ | ✓ | ✗ | | Proof of Play Cloud | ✓ | ✓ | ✓ | ✓ | ✗ | | Public Goods Network | ✓ | ✓ | ✓ | ✓ | ✓ | | Race | ✓ | ✓ | ✓ | ✓ | ✗ | | Redstone | ✓ | ✓ | ✓ | ✓ | ✓ | | Reya | ✓ | ✓ | ✓ | ✗ | ✓ | | Rise | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Rise Sepolia | ✓ | ✓ | ✓ | ✗ | ✗ | | Robinhood Chain | ✓ | ✓ | ✓ | ✓ | ✓ | | Robinhood Chain Testnet | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Ronin | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Rootstock | ✓ | ✓ | ✓ | ✗ | ✓ | | Scroll | ✓ | ✓ | ✓ | ✓ | ✓ | | Sei | ✓ | ✓ | ✓ | ✗ | ✓ | | Settlus | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Shape | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Shape Sepolia | ✓ | ✓ | ✓ | ✓ | ✓ | | Soneium | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Soneium Minato | ✓ | ✓ | ✓ | ✗ | ✗ | | Sonic | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Sophon | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Stable | ✓ | ✓ | ✓ | ✗ | ✓ | | Superseed | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | Superseed Sepolia | ✓ | ✓ | ✓ | ✓ | ✓ | | Swan | ✓ | ✓ | ✓ | ✓ | ✗ | | Taiko Hoodi Testnet | ✓ | ✓ | ✓ | ✗ | ✗ | | Tempo | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Tempo Moderato Testnet | ✓\* | ✓\* | ✓ | ✗ | ✓ | | TRON | ✓ | ✓ | ✓ | ✗ | ✓ | | Unichain | ✓ | ✓ | ✓ | ✓ | ✓ | | Unichain Testnet | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Viction | ✓\* | ✓\* | ✓ | ✗ | ✓ | | World Chain | ✓\* | ✓\* | ✓ | ✓\* | ✓ | | X Layer | ✓ | ✓ | ✓ | ✗ | ✓ | | Xai | ✓ | ✓ | ✓ | ✓ | ✓ | | Xai Testnet | ✓ | ✓ | ✓ | ✓ | ✓ | | XPLA | ✓\* | ✓\* | ✓ | ✗ | ✓ | | Zenith Testnet EVM | ✓ | ✓ | ✓ | ✗ | ✗ | | zkSync Era | ✓ | ✓ | ✓ | ✓ | ✓ | | Zora | ✓ | ✓\* | ✓ | ✓ | ✓ | | Zora Sepolia | ✓\* | ✓\* | ✓ | ✓\* | ✓ | Arweave's transaction datasets include bundled/L2 data (`raw_transactions` and `raw_unbundled_transactions`). ### Non-EVM chains #### Beacon | Dataset | Description | | - | - | | Attestations | Attestations (votes) from validators for the block. | | Attester Slashing | Metadata for attester slashing. | | Blocks | Metadata for each block on the chain including hashes, deposit count, and gas used. | | BLS Signature to Execution Address Changes | BLS Signature to Execution Address Changes. | | Deposits | Metadata for deposits. | | Proposer Slashing | Metadata for proposer slashing. | | Voluntary Exits | Metadata for voluntary exits. | | Withdrawls | Metadata for withdrawls. | #### Fogo | Dataset | Description | | - | - | | Transactions with Instructions | Enriched transaction data including instructions, accounts, balance changes, and metadata for the block. | | Rewards | Records of rewards distributed to validators for securing and validating the network. | | Blocks | Metadata for each block on the chain including hashes, transaction count, slot and leader rewards. | #### IOTA | Dataset | Description | | - | - | | Checkpoints | A checkpoint is a periodic, finalized snapshot of the blockchain's state in the Movement VM, batching transactions to ensure consistency and scalability across the network. | | Epochs | An epoch is a defined time period in the Movement VM during which a fixed set of validators processes transactions and manages governance, with transitions enabling validator rotation and network updates. | | Events | Events in the Movement VM are structured data emissions from smart contracts, recorded on the blockchain to log significant actions or state changes for external monitoring and interaction. | | Move Calls | Move calls are a function invocation within a Move smart contract, executed by the Movement VM to perform specific operations or state transitions on the blockchain. | | Transactions | A transaction in the Movement VM is a signed instruction executed by the Move smart contract to modify the blockchain's state, such as transferring assets or invoking contract functions. | #### Movement | Dataset | Description | | - | - | | Account Transactions | All raw onchain transactions involving account-level actions (e.g., transaction version, account address). | | Block Metadata Transactions | Metadata about blocks and block-level transactions (e.g., block height, epoch, version). | | Fungible Asset Balances | Real-time balances of fungible tokens across accounts. | | Current Token Data | Latest metadata for tokens - includes name, description, supply, etc. | | Current Token Ownerships | Snapshot of token ownership across the chain. | | Events | All emitted contract event logs - useful for indexing arbitrary contract behavior. | | Fungible Asset Activities | Track activity for fungible tokens - owner address, amount, and type. | | Fungible Asset Balances | Historical balance tracking for fungible assets (not just the current state). | | Fungible Asset Metadata | Static metadata for fungible tokens - like decimals, symbol, and name. | | Signatures | Cryptographic signature data from transactions, useful for validating sender authenticity. | | Token Activities | Detailed logs of token movements and interactions across tokens and NFTs. | #### NEAR NEAR datasets are no longer available through Mirror. Use [Turbo pipelines](/turbo-pipelines/sources/near) for NEAR data. #### Solana Solana datasets are no longer available through Mirror. Use [Turbo pipelines](/turbo-pipelines/sources/solana) for Solana data. #### Starknet | Dataset | Description | | - | - | | Blocks | Metadata for each block on the chain including hashes, transaction count, difficulty, and gas used. | | Events | Consists of raw event data from the blockchain, documenting various on-chain activities and triggers. | | Messages | Messaging data from the Starknet blockchain, used for L2 & L1 communication. | | Transactions | Transaction data including input, value, from and to address, and metadata for the block, gas, and receipts. | #### Stellar Stellar datasets are no longer available through Mirror. Use [Turbo pipelines](/turbo-pipelines/sources/stellar) for Stellar data. #### Sui | Dataset | Description | | - | - | | Checkpoints | Contains raw data of blockchain checkpoints capturing the state of the ledger at specific intervals. | | Epochs | Includes raw data detailing the various epochs in the blockchain, which mark significant periods or phases in the network's operation | | Events | Consists of raw event data from the blockchain, documenting various on-chain activities and triggers | | Packages | Contains raw data about the deployed smart contract packages on the blockchain | | Transactions | Transaction data including effects, events, senders, recipients, balance and object changes, and other metadata. | ### Curated Datasets Beyond onchain datasets, the Goldsky team continuosly curates and publishes derived datasets that serve a specific audience or use case. Here's the list: #### Token Transfers You can expect every EVM chain to have the following datasets available: | Dataset | Description | | - | - | | ERC\_20 | Every transfer event for all fungible tokens. | | ERC\_721 | Every transfer event for all non-fungible tokens. | | ERC\_1155 | Every transfer event for all ERC-1155 tokens. | #### Polymarket datasets | Dataset | Description | | - | - | | Order Filled | This event is emitted when a single Polymarket order is partially or completely filled. For example: a 50c YES buy for 100 YES matched against a 50c YES sell for 100 YES will emit 2 Orderi Filled events, from the perspective of the YES buy and of the YES sell. This is useful for granular tracking of trading activity and history. | | Orders Matched | This event is emitted when a Polymarket taker order is matched against a set of Polymarket maker(limit) orders. For example: a 50c YES buy for 200 YES matched against 2 50c YES sells for 100 YES each will emit a single Orders Matched event. Orders Matched gives a more high level view of trading activity as it only tracks taker activity. | | User Balances | This event keeps track of all user outcome token positions. | | User Positions | Keeps track of outcome token positions along with pnl specific data including average price and realized pnl. | Additional chains, including roll-ups, can be indexed on demand. Contact us at [sales@goldsky.com](mailto:sales@goldsky.com) to learn more. ## Missing a chain? If you need a network we don't support yet, [reach out](/getting-support): chain onboarding is often fast, and partner chains can sponsor coverage for their ecosystem. # Swan Chain Source: https://docs.goldsky.com/chains/swan Swan Chain support on Goldsky: Turbo pipelines on Swan mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Taiko Source: https://docs.goldsky.com/chains/taiko Taiko support on Goldsky: Turbo pipelines on Taiko Hoodi Testnet, plus Subgraphs on mainnet and testnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # The Binary Holdings Source: https://docs.goldsky.com/chains/tbh The Binary Holdings support on Goldsky: current availability for Binary Testnet, CLI setup steps, and how to reach the team about enabling The Binary Holdings. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Telos EVM Source: https://docs.goldsky.com/chains/telos-evm Telos EVM support on Goldsky: Subgraphs on Telos mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Tempo Source: https://docs.goldsky.com/chains/tempo Tempo support on Goldsky: Turbo pipelines, Edge RPC, Compose, and Subgraphs on Tempo Mainnet and Tempo Moderato Testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Tenet Source: https://docs.goldsky.com/chains/tenet Tenet support on Goldsky: current availability for Tenet, how to get started with the CLI, and how to reach the team about enabling Tenet. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # ThunderCore Source: https://docs.goldsky.com/chains/thundercore ThunderCore support on Goldsky: Subgraphs on ThunderCore mainnet and ThunderCore Testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Treasure Source: https://docs.goldsky.com/chains/treasure Treasure support on Goldsky: current availability for Treasure Mainnet, how to get started with the CLI, and how to reach the team about enabling Treasure. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # TRON Source: https://docs.goldsky.com/chains/tron TRON support on Goldsky: Turbo pipelines on TRON mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Unichain Source: https://docs.goldsky.com/chains/unichain Unichain support on Goldsky: Turbo pipelines, Edge RPC, Compose, and Subgraphs on Unichain mainnet and Unichain Testnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Vana Source: https://docs.goldsky.com/chains/vana Vana support on Goldsky: Subgraphs on Vana mainnet and Vana Moksha, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Viction Source: https://docs.goldsky.com/chains/viction Viction support on Goldsky: Turbo pipelines on Viction mainnet, plus Subgraphs on mainnet and testnet, with CLI setup steps to get started. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Volmex Finance Source: https://docs.goldsky.com/chains/volmex Volmex Finance support on Goldsky: current availability, CLI setup steps, and how to reach the team about enabling Volmex Finance. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # World Chain Source: https://docs.goldsky.com/chains/worldchain World Chain support on Goldsky: Turbo pipelines on World Chain mainnet, plus Subgraphs on mainnet and testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # XDC Network Source: https://docs.goldsky.com/chains/xdc XDC Network support on Goldsky: Subgraphs on XDC mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # X Layer Source: https://docs.goldsky.com/chains/xlayer X Layer support on Goldsky: Turbo pipelines and Subgraphs on X Layer mainnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # XPLA Source: https://docs.goldsky.com/chains/xpla XPLA support on Goldsky: Turbo pipelines on XPLA mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # XRADERS Source: https://docs.goldsky.com/chains/xr XRADERS support on Goldsky: current availability for Xr Sepolia, how to get started with the CLI, and how to reach the team about enabling XRADERS. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # XRPL EVM Sidechain Source: https://docs.goldsky.com/chains/xrpl-evm XRPL EVM Sidechain support on Goldsky: Subgraphs on XRPL EVM mainnet and XRPL EVM Testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Xterio Source: https://docs.goldsky.com/chains/xterio Xterio support on Goldsky: current availability for Xterio, how to get started with the CLI, and how to reach the team about enabling Xterio. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Zenith Source: https://docs.goldsky.com/chains/zenith Zenith support on Goldsky: Turbo pipelines on Zenith Testnet EVM, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Zero Source: https://docs.goldsky.com/chains/zero Zero support on Goldsky: current availability for Zero Mainnet and Zero Sepolia, how to get started with the CLI, and how to reach the team about enabling Zero. ## Overview ### Partnership ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Zircuit Source: https://docs.goldsky.com/chains/zircuit Zircuit support on Goldsky: Subgraphs on Zircuit mainnet and Zircuit Garfield Testnet, with CLI setup steps to get started. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # zkLink Nova Source: https://docs.goldsky.com/chains/zklink-nova zkLink Nova support on Goldsky: Subgraphs on zkLink Nova mainnet, with CLI setup steps to get started and where to get support. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # zkSync Era Source: https://docs.goldsky.com/chains/zksync-era zkSync Era support on Goldsky: Turbo pipelines, Edge RPC, and Compose on zkSync Era mainnet, plus Subgraphs on mainnet and testnet, with CLI setup steps. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Zora Source: https://docs.goldsky.com/chains/zora Zora support on Goldsky: Turbo pipelines and Subgraphs on Zora mainnet and Zora Sepolia, plus Edge RPC and Compose on mainnet, with CLI setup steps. ## Overview ## Getting started To use Goldsky, you'll need to create an account, install the CLI, and log in. If you want to use Turbo or Compose, you'll also need to install their respective CLI extensions. 1. Install the Goldsky CLI: **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. 2. Log into your Project by running: ```shell theme={"dark"} goldsky login ``` This opens your browser to sign in (Google, GitHub, SSO, or email). Once you authenticate, the CLI is logged in automatically — there's no API key to copy or paste. On a headless or remote machine (or in CI), create an API key on your [Project Settings](https://app.goldsky.com/dashboard/settings) page and pass it directly with `goldsky login --token `. Use `goldsky login --no-browser` to print the login URL instead of opening a browser. 3. Now that you are logged in, run `goldsky` to get started: ```shell theme={"dark"} goldsky ``` If you already have the Goldsky CLI installed, install the Turbo extension by running: ```bash theme={"dark"} goldsky turbo ``` This will automatically install the Turbo extension. Verify the installation: ```bash theme={"dark"} goldsky turbo list ``` Make sure to update the CLI to the latest version before running Turbo commands: `curl https://goldsky.com | sh` For a complete reference of all Turbo CLI commands, see the [CLI Reference](/turbo-pipelines/cli-reference) guide. If you already have the Goldsky CLI installed, install the Compose extension by running: ```bash theme={"dark"} goldsky compose install ``` To update to the latest version: ```bash theme={"dark"} goldsky compose update ``` For more details, see the [Compose quickstart](/compose/quick-start) guide. ## Subgraphs ## Turbo ## Edge RPC ## Compose ## Getting support Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Changelog Source: https://docs.goldsky.com/changelog Product updates and release notes from Goldsky. # Compose app manifest configuration reference Source: https://docs.goldsky.com/compose/app-configuration Configure the Compose app manifest YAML with app properties, tasks, triggers, secrets, environment variables, and stable or preview release channels. The Compose App manifest is a YAML file that defines your app's configuration. This is where you configure a list of tasks and other app-level concerns. Each task can be individually configured for things like retry behavior and HTTP trigger behavior, cron schedules and more. ## App properties | Property | Type | Required | Description | | - | - | - | - | | `name` | string | Yes | Unique app identifier used for API calls. Must start and end with a letter or number, and contain only letters, numbers, underscores, and hyphens. | | `api_version` | string | For deploy | Pins your app to a Compose runtime version. Required by `goldsky compose deploy`; optional for local dev. Use `"stable"` if unsure (see [Release channels](#release-channels) below). | | `secrets` | array(string) | No | Names of secrets you've set for this app (see [Secrets](./secrets)) | | `env` | [ENV](#env-variables) | No | Environment-specific variables | | `tasks` | [Tasks\[\]](#task-configuration) | Yes | List of tasks in your app (must contain at least one task) | ### Release channels `api_version` pins your app to a Compose runtime version. You can use one of the release channels, or pin to a specific version: * `"stable"`: the current stable runtime. This is the recommended value for production apps. * `"preview"`: the latest pre-release runtime. Use this if you want early access to features that haven't made it into `stable` yet. Expect more frequent changes. * A specific semver version (e.g. `"0.3.0"`): pin to an exact runtime version. Useful when you want full control over when your app picks up runtime changes. Do not include a `v` prefix. See the [changelog](https://goldsky.com/changelog) for available versions. If your manifest's `api_version` is older than the CLI, `goldsky compose deploy` will warn you and prompt before continuing. Pass `-f` to skip the prompt. ## Basic example ```yaml theme={"dark"} name: "my-app" api_version: "stable" secrets: - MY_SECRET env: local: MY_VAR: "foo" cloud: MY_VAR: "bar" tasks: - name: "price_fetcher" path: "./tasks/fetch_price.ts" triggers: - type: "cron" expression: "* * * * *" # Run every minute - type: "http" authentication: "auth_token" retry_config: max_attempts: 3 initial_interval_ms: 1000 backoff_factor: 2 - name: "data_processor" path: "./tasks/process_data.ts" ``` ## ENV variables You can set env variables in your manifest, which are injected into your task's [env context property](./context/env). Env configuration is namespaced by environment, and only the values for the current environment are injected. Currently there are two environments: `local`, used when running your compose app locally, and `cloud`, used when your app is running after `goldsky compose deploy` (see the [deploy guide](./deploy-monitor)). Values must be strings. For anything sensitive (API keys, private keys), use [secrets](./secrets) instead. ### Example ```yaml theme={"dark"} name: "my-app" env: local: MY_VAR: "foo" ANOTHER_VAR: "bar" cloud: MY_VAR: "foo-prod" ANOTHER_VAR: "bar-prod" ``` ## Task configuration Each task in the `tasks` array defines an executable unit of work and references a typescript file; see [Task Authoring](./tasks) for more details. Tasks can be triggered by HTTP requests from your app, blockchain events, cron schedules, etc. See more about triggers below. Tasks can also trigger other tasks via the [callTask context function](./context/call-task) within the task code. ```yaml theme={"dark"} name: "my-app" api_version: "stable" tasks: - name: "unique_task_name" # Required: Unique identifier path: "./tasks/my_task.ts" # Required: Path to task file triggers: - type: "http" authentication: "auth_token" - type: "cron" expression: "*/5 * * * *" # Every 5 minutes retry_config: # Optional: Task-level retry settings max_attempts: 5 initial_interval_ms: 2000 backoff_factor: 1.5 ``` ### Name validation **App names** must start and end with a letter or number, and contain only letters, numbers, underscores, and hyphens (e.g. `my-app-1`). The pattern is `/^[a-zA-Z0-9]([a-zA-Z0-9_\-]*[a-zA-Z0-9])?$/`. **Task names** must start with a letter or number, and contain only letters, numbers, underscores, hyphens, and dots (e.g. `fetch_prices`, `oracle.update`). The pattern is `/^[a-zA-Z0-9][a-zA-Z0-9_.\-]*$/`. A leading underscore is no longer allowed. Names that canonicalize the same (lowercased, with runs of `-`/`_` collapsed to `-`) cannot coexist in a project. `my-app`, `My_App`, and `my__app` are treated as the same name, so the second deploy gets a conflict error. ### Task properties | Property | Type | Required | Description | | - | - | - | - | | `name` | string | Yes | Unique task identifier used for API calls | | `path` | string | Yes | File path to the task module | | `triggers` | array(object) | No | List of triggers that will run the task. Each trigger type can only appear once per task. | | `retry_config` | object | No | Task-level retry behavior | ### Triggers Triggers run your Compose tasks: HTTP calls, onchain events, or cron jobs. For more information, see [Triggers](./task-triggers). #### Example ```yaml theme={"dark"} triggers: - type: "cron" expression: "* * * * *" # Run every minute (standard cron expression) - type: "http" authentication: "auth_token" ``` Onchain event triggers can also be processed in parallel, with an optional confirmation delay for reorg safety: ```yaml theme={"dark"} triggers: - type: "onchain_event" network: "ethereum" contract: "0xb74de3F91e04d0920ff26Ac28956272E8d67404D" parallel_processing: true max_concurrency: 50 # defaults to 10 confirmations: 10 # defaults to 0 (fire at chain head) ``` See [Parallel processing](./task-triggers#parallel-processing) and [Confirmations](./task-triggers#confirmations) for the full behavior of these fields. If you provide no triggers in your manifest then tasks can only be executed by other tasks. ### Retry configuration ```yaml theme={"dark"} retry_config: max_attempts: 3 # Maximum number of retry attempts initial_interval_ms: 1000 # Initial delay before first retry backoff_factor: 2 # Exponential backoff multiplier ``` When specifying `retry_config`, all three fields (`max_attempts`, `initial_interval_ms`, `backoff_factor`) are required. You cannot provide only some of them. **How retries work:** * If a task fails, Compose waits `initial_interval_ms` before retrying * Each subsequent retry interval is multiplied by `backoff_factor` * Example with above config: 1000ms → 2000ms → 4000ms * After `max_attempts` failures, the task is marked as permanently failed * When `retry_config` is omitted, tasks default to `max_attempts: 3`, `initial_interval_ms: 1000`, and `backoff_factor: 2`. ## Manifest examples ### Multi-chain oracle ```yaml theme={"dark"} name: "multi-chain-oracle" api_version: "stable" tasks: - name: "fetch_prices" path: "./tasks/fetch_crypto_prices.ts" retry_config: max_attempts: 5 initial_interval_ms: 2000 backoff_factor: 1.5 - name: "update_ethereum_oracle" path: "./tasks/update_oracle.ts" triggers: - type: "cron" expression: "* * * * *" # Every minute retry_config: max_attempts: 3 initial_interval_ms: 5000 backoff_factor: 2 - name: "update_polygon_oracle" path: "./tasks/update_oracle.ts" triggers: - type: "cron" expression: "* * * * *" # Every minute ``` ### Event processing pipeline ```yaml theme={"dark"} name: "event-processor" api_version: "stable" tasks: - name: "event_processing" path: "./tasks/process_events.ts" triggers: - type: "onchain_event" network: "base" contract: "0xb74de3F91e04d0920ff26Ac28956272E8d67404D" events: - "Transfer(address,address,uint256)" retry_config: max_attempts: 10 initial_interval_ms: 1000 backoff_factor: 1.2 ``` ### High-volume event processing Onchain events processed concurrently, each held until its block is 5 blocks deep. ```yaml theme={"dark"} name: "settlement-processor" api_version: "stable" tasks: - name: "settle_trade" path: "./tasks/settle_trade.ts" triggers: - type: "onchain_event" network: "ethereum" contract: "0xb74de3F91e04d0920ff26Ac28956272E8d67404D" events: - "TradeExecuted(address,uint256)" parallel_processing: true max_concurrency: 25 confirmations: 5 retry_config: max_attempts: 5 initial_interval_ms: 1000 backoff_factor: 2 ``` # App Lifecycle Source: https://docs.goldsky.com/compose/app-lifecycle Inspect, pause, resume, delete, and tail logs from a deployed Compose app using the Goldsky CLI. Once your Compose app is deployed, a set of CLI commands let you inspect, pause, resume, delete, tail logs, and review its deploy history, task runs, collections, and deployed source. The per-app commands (`status`, `pause`, `resume`, `logs`, `delete`, `history`, `runs`, `collections`, `source`, `download`) accept either `-n, --name ` to target by name, or `-m, --manifest ` (default `compose.yaml`) to read the name from your manifest. `list` is project-wide and accepts neither. Every command also accepts `--json` so you can pipe output into scripts or agents. ## Check status ```bash theme={"dark"} goldsky compose status ``` Shows the app's name, current runtime status (e.g. `RUNNING`, `PAUSED`, `STARTING`, `ERROR`), and timestamps for when it was created and last updated. ```bash theme={"dark"} # status for a specific app, as JSON goldsky compose status -n my-app --json ``` ## List apps ```bash theme={"dark"} goldsky compose list ``` Prints a table of every Compose app in your project. ```bash theme={"dark"} # list as JSON for scripting goldsky compose list --json ``` ## Pause and resume ```bash theme={"dark"} goldsky compose pause goldsky compose resume ``` While paused, cron triggers stop firing and HTTP triggers return an error. State is preserved: `resume` picks up where the app left off. This is useful for: * Triaging a misbehaving app without deleting it * Holding execution while you roll out a dependency change * Temporarily stopping a cron while you investigate its effects ## View logs ```bash theme={"dark"} goldsky compose logs ``` By default `logs` prints the most recent 100 lines. You can tail live, filter by level or text, and bound the output by time or line count. ```bash theme={"dark"} # tail live goldsky compose logs -f # live, errors and warnings only goldsky compose logs -f --level error,warn # last hour goldsky compose logs --since 1h # search for a substring across the last 500 lines goldsky compose logs --tail 500 --search "timeout" # tail live for 5 minutes, then exit goldsky compose logs -f --timeout 5m ``` Options cheat-sheet: | Flag | Description | | - | - | | `-f, --follow` | Stream logs live | | `--tail ` | Number of lines to fetch (default: `100`) | | `--level ` | Comma-separated levels (e.g. `error,warn`) | | `--search ` | Filter lines by text | | `--since ` | Logs since a relative time (e.g. `1h`, `30m`, `7d`) | | `--max-lines ` | Exit after N lines | | `--timeout ` | Exit after a duration (e.g. `5m`) | | `--json` | Emit newline-delimited JSON | ## Inspect deploy history and task runs Use `goldsky compose history` to see what was deployed and when: ```bash theme={"dark"} goldsky compose history -n my-app # include failed deploys in the list goldsky compose history -n my-app --include-failures ``` When a task run fails, narrow the `runs` list with `--task`, `--status`, or `--since` to find it, then fetch the full run detail by id: ```bash theme={"dark"} # recent runs of a specific task goldsky compose runs -n my-app --task price_fetcher --limit 10 # failing runs in the last hour goldsky compose runs -n my-app --status error --since 1h # full detail for one run goldsky compose runs -n my-app ``` Pipe `--json` output into `jq` to drive scripts or alerts: ```bash theme={"dark"} goldsky compose runs -n my-app --status error --json | jq '.runs[].runId' ``` For all flags, see the [CLI reference](./cli-reference#inspecting-a-deployed-app). ## Query collections List every collection in your app's hosted database, then query one with a JSON filter: ```bash theme={"dark"} goldsky compose collections list -n my-app goldsky compose collections query prices -n my-app --filter '{"symbol": "BTC"}' --limit 10 ``` For all flags, see the [CLI reference](./cli-reference#inspecting-a-deployed-app). ## View and download deployed source Print the deployed source for your app, or for a single task: ```bash theme={"dark"} # list the deployed files goldsky compose source -n my-app # print one task's source goldsky compose source -n my-app bitcoin_oracle ``` Download a runnable copy of the whole app as a zip: ```bash theme={"dark"} goldsky compose download -n my-app ``` The same source is available in the dashboard's Code tab, with a Download app button that produces the same archive. See [Deploying and monitoring](./deploy-monitor#viewing-and-downloading-deployed-source) for details. For all flags, see the [CLI reference](./cli-reference#inspecting-a-deployed-app). ## Delete an app ```bash theme={"dark"} goldsky compose delete ``` By default `delete` is interactive: it asks you to type the app name to confirm, and separately asks whether you also want to delete the app's hosted Postgres database. ```bash theme={"dark"} # non-interactive (CI-safe) — skip all prompts goldsky compose delete -f # non-interactive, also drop the Postgres database goldsky compose delete -f --delete-database ``` See [Deploying and monitoring](./deploy-monitor#deleting-a-compose-app) for how database deletion interacts with active pipelines. Deleting an app is permanent. Deleting its database is permanent too, and cannot be undone. Back up anything you care about first. ## Next Steps Learn about deploying your app to the cloud. View the full CLI command reference. # Compose CLI Reference Source: https://docs.goldsky.com/compose/cli-reference Reference for the Compose CLI manifest schema, commands, and configuration options. ## Manifest The Compose App's manifest is a YAML file with the following schema. The manifest holds all the relevant information about the Compose App and its tasks. All compose commands will reference your manifest and pick up the configuration there. See full manifest configuration docs [here](./app-configuration). ### Example ```yaml theme={"dark"} name: "my_app" api_version: "stable" secrets: - MY_SECRET env: local: MY_VAR: "foo" cloud: MY_VAR: "bar" tasks: - name: "price_fetcher" path: "./tasks/fetch_price.ts" triggers: - type: "cron" expression: "* * * * *" # Run every minute - type: "http" authentication: "auth_token" retry_config: max_attempts: 3 initial_interval_ms: 1000 backoff_factor: 2 - name: "data_processor" path: "./tasks/process_data.ts" ``` ## App targeting Most commands that operate on a deployed app accept either `-n, --name ` to target by name directly, or `-m, --manifest ` (default `compose.yaml`) to read the name from a manifest. If neither is provided and no `compose.yaml` is present, the command errors. A few commands (`deploy`, `wallet create`, `wallet list`) only support `-m, --manifest`. ## Scripting and automation Most Compose commands can run non-interactively, which lets you drive deploys and inspections from CI, scripts, and agents. ### Authentication Every command that talks to the platform needs an auth token. The token is resolved in this order: the `-t, --token ` flag, then the `GOLDSKY_API_TOKEN` environment variable, then the token written by `goldsky login`. If none is present, the command errors: ```text theme={"dark"} Please run goldsky login, set GOLDSKY_API_TOKEN, or pass --token to the command. ``` ### JSON output Pass `--json` to any command that talks to the platform for machine-readable output: `deploy`, `callTask`, `status`, `list`, `history`, `runs`, `collections list`, `collections query`, `source`, `download`, `pause`, `resume`, `delete`, `logs`, `secret list`, `wallet create`, `wallet list`, `writeContract`, and `deployContract`. Note that `secret set` and `secret delete` do not accept it. In `--json` mode stdout carries only the result document; progress bars and other decoration are suppressed. Failures go to stderr as a JSON envelope and the command exits with code 1: ```json theme={"dark"} { "error": true, "code": "VALIDATION_FAILED", "message": "..." } ``` Error codes include `VALIDATION_FAILED`, `SECRET_MISSING`, `DEPLOY_FAILED`, `ALREADY_DEPLOYED`, `NOT_FOUND`, `WRITE_CONTRACT_FAILED`, `USAGE`, and `UNKNOWN`. `USAGE` is returned for an unknown command or for `-n` on `deploy`. ### Non-interactive behavior In a non-TTY (CI, scripts, agents), interactive prompts are skipped or error out: * `goldsky compose init ` accepts the project name as an argument and skips the prompt. Without a name it errors in non-interactive mode. * `goldsky compose deploy` aborts on a major `api_version` mismatch unless you pass `--force`. A minor mismatch defaults to continuing. * `goldsky compose clean` and `goldsky compose delete` require `-f, --force` in non-interactive mode. ### Example: scripted deploy ```bash theme={"dark"} export GOLDSKY_API_TOKEN=gs_tok_... goldsky compose deploy --json | jq -r .dashboard_url ``` ## Commands ### init \[name] Prompts you for a project name and scaffolds a folder of that name containing a working Compose app (a Bitcoin price oracle example you can run right away). Pass the name as an argument to skip the prompt; the name is required in non-interactive mode. ```bash theme={"dark"} goldsky compose init my-app ``` ### start Starts your app locally. Preserves execution state from previous runs, useful for testing retry behavior and other production scenarios. By default the server binds port 4000; if that port is taken it walks up to 4009 and uses the first free port. ```bash theme={"dark"} goldsky compose start ``` Options: * `-m, --manifest ` Path to manifest file (default: `compose.yaml`) * `--fork-chains` Fork all chains referenced in contract interactions locally for testing (see [forking](./environments#forking-for-local-compose-development)) * `--impersonate ` Impersonate wallet addresses on the local fork (e.g. `"wallet1=0xAddr1,wallet2=0xAddr2"`). Requires `--fork-chains`. See [Impersonated wallets](./context/evm/wallets#impersonated-wallets) * `-p, --port ` Bind exactly this port; fails fast if it is already in use (no walking) ### deploy Deploys the app to the cloud. On success it prints the dashboard URL, which is also available as `dashboard_url` when you pass `--json`. See [monitoring](./deploy-monitor) for more info. In a non-TTY, a major `api_version` mismatch aborts the deploy unless you pass `--force`; see [Scripting and automation](#scripting-and-automation). ```bash theme={"dark"} goldsky compose deploy ``` Options: * `-m, --manifest ` Path to manifest file (default: `compose.yaml`) * `-t, --token ` Authentication token for deployment * `-f, --force` Skip version compatibility prompts * `--sync-env` Upload secrets from your local `.env` to the cloud before deploying, in one step. See [Secrets](./secrets). * `--json` Emit the deploy result as JSON (includes `dashboard_url`) Your manifest must include an `api_version` field to deploy. All secrets referenced in the manifest must be set before deploying (see [Secrets](./secrets)). `deploy` takes the app name from the manifest, so it has no `-n, --name` flag. Passing one exits with code 1 and a one-line error instead of the full help text. An unknown command, such as `goldsky compose app`, also exits with code 1 and prints `unknown command 'app'`. ### callTask Call a task by name with a JSON payload. By default the task runs on your deployed app; pass `--env local` (or `-p, --port`) to hit a locally running server instead. ```bash theme={"dark"} # call a task on the deployed app (default) goldsky compose callTask my_task '{"foo": "bar"}' # call a task on a locally running app goldsky compose callTask my_task '{"foo": "bar"}' --env local ``` Options: * `--env ` Where to run the task (default: `cloud`). Passing `--port` implies local * `-p, --port ` Local port to call. Implies `--env local`; an error if combined with an explicit `--env cloud` * `-n, --name ` App name (alternative to `-m`) * `-m, --manifest ` Path to manifest file (default: `compose.yaml`) * `-t, --token ` Authentication token * `--json` Emit the response as JSON When calling a local server, the port is resolved in this order: the `--port` flag, then the `.compose/.port` file, then 4000. Both the task name and the JSON payload are required. The payload must be valid JSON: `{foo: "bar"}` is invalid, use `{"foo": "bar"}` (or `'{}'` if the task takes no input) instead. ### codegen Parse ABIs in the `src/contracts/` folder and generate TypeScript classes for them. See [contracts](./context/evm/contracts) for more details. ```bash theme={"dark"} goldsky compose codegen ``` ### deployContract Compile a Solidity contract and deploy it to a chain, with gas sponsored from your app's wallet. The contract is compiled locally (no `forge` or `solc` install required) and deployed through a CREATE2 deterministic deployment proxy, so deploying the same contract from the same app produces the same address on every chain. The deployed address is printed before the transaction is sent, followed by `Submitting UserOp on ...` while the transaction is in flight. The block it was deployed in is printed on success, and the ABI is written to `src/contracts/.json` so you can run [`codegen`](#codegen) against it. With `--json`, progress lines are not printed. Imports are resolved from `node_modules/`, so OpenZeppelin and other published contracts work after a normal `npm install`. The wallet this deploys from is the same on-chain identity as `evm.wallet({ name })` in your task code for a given app and wallet name. `deployContract` and `writeContract` both work before your app's first deploy, so you can deploy a contract and use its address before anything is running. ```bash theme={"dark"} goldsky compose deployContract src/contracts/MyToken.sol \ --chain-id 84532 \ --constructor-args 0xRecipient 1000000 ``` Options: * `--chain-id ` Chain to deploy to, e.g. `8453` for Base or `84532` for Base Sepolia (required) * `--constructor-args ` Constructor arguments, space-separated (one value per argument) * `--verify` Verify the contract's source on the chain's block explorer after deploying. Opt-in because publishing source is irreversible and verification adds roughly 30 to 90 seconds * `--wallet ` Named wallet to deploy from (default: `default`). Shares identity with `evm.wallet({ name })` in task code * `--force` Deploy even if `msg.sender` usage is detected in the constructor (see note below) * `-m, --manifest ` Path to manifest file (default: `compose.yaml`) * `-t, --token ` Authentication token * `--api-server ` Override the API server URL * `--json` Emit the deploy result as JSON Because deployment routes through the CREATE2 proxy, `msg.sender` inside your constructor is the proxy address, not your wallet. If your constructor uses `msg.sender` (for example `Ownable(msg.sender)`), pass the address as an explicit constructor argument instead. The CLI warns and stops when it detects this; `--force` bypasses the check. Constructor and function arguments use forge-style syntax: space-separated, one value per argument (for example `--constructor-args 0xRecipient 1000000`). Arrays are written `[a,b]`, tuples are written `(a,b)`, and negative numbers need a leading space (for example `" -5"`). Re-deploying the identical contract from the same app fails with `CONTRACT_ALREADY_DEPLOYED` because the CREATE2 address already has code. Passing constructor arguments to a contract that has no constructor is an error. Gas spent by `deployContract` and `writeContract` is billed on your normal Goldsky bill, the same as gas used by your deployed tasks. ### writeContract Send a gas-sponsored transaction to a contract on any supported chain, using your app's wallet. Encodes calldata from a function signature and arguments, or accepts raw calldata. This is the same wallet identity your task code uses via `evm.wallet()`, so you can use it to trigger events, call admin functions, or make transfers without managing gas or keys. While the transaction is in flight the CLI prints `Submitting UserOp on ...`, and the result prints as soon as it lands. With `--json`, progress lines are not printed. `writeContract` works before your app's first deploy. Gas spent by `writeContract` is billed on your normal Goldsky bill, the same as gas used by your deployed tasks. ```bash theme={"dark"} goldsky compose writeContract \ --chain-id 84532 \ --to 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 \ --function "transfer(address,uint256)" \ --args 0xRecipient 1000000 ``` Options: * `--chain-id ` Chain to transact on (required) * `--to
` Target contract address (required) * `--function ` Function signature, e.g. `"transfer(address,uint256)"` * `--args ` Function arguments, space-separated (one value per argument) * `--data ` Raw calldata hex, as an alternative to `--function` + `--args` * `--value ` Value to send with the transaction. Accepts plain wei or an `ether`/`gwei` suffix: `1000`, `1ether`, `0.5ether`, `100gwei` * `--wallet ` Named wallet to send from (default: `default`) * `-m, --manifest ` Path to manifest file (default: `compose.yaml`) * `-t, --token ` Authentication token * `--api-server ` Override the API server URL * `--json` Emit the transaction result as JSON ### clean Deletes your local stage database (`.compose/stage.db`), wiping all local execution state and collection data. Prompts for confirmation unless `-f` is passed. In a non-TTY it aborts with `Use --force for non-interactive cleanup.` unless `-f` is passed. ```bash theme={"dark"} goldsky compose clean ``` Options: * `-f, --force` Skip the confirmation prompt * `-c, --config ` Path to manifest file (default: `compose.yaml`) ### update \[version] Update the Compose CLI. With no argument it updates to the latest version; pass a version to install a specific release. ```bash theme={"dark"} # update to the latest version goldsky compose update # install a specific version goldsky compose update 0.8.1 ``` Options: * `--preview` Install the latest preview build from `main` instead of the current stable release See [Release channels](./app-configuration#release-channels) for the difference between `stable` and `preview`. ## App lifecycle For full examples, see [App lifecycle](./app-lifecycle). ### status Show the status of a deployed app. ```bash theme={"dark"} goldsky compose status ``` Options: * `-n, --name ` App name (alternative to `-m`) * `-m, --manifest ` Path to manifest file (default: `compose.yaml`) * `-t, --token ` Authentication token * `--json` Emit JSON output (for scripts and agents) ### list List all deployed apps in your project. ```bash theme={"dark"} goldsky compose list ``` Options: * `-t, --token ` Authentication token * `--json` Emit JSON output ### pause Pause a deployed app. Cron triggers stop firing and HTTP triggers return an error until the app is resumed. ```bash theme={"dark"} goldsky compose pause ``` Options: * `-n, --name ` / `-m, --manifest ` * `-t, --token ` * `--json` ### resume Resume a paused app. ```bash theme={"dark"} goldsky compose resume ``` Options: same as `pause`. ### delete Delete a deployed app. Interactively prompts you to type the app name to confirm, then asks whether to also delete the app's hosted Postgres database (unless `--delete-database` is already set). Pass `--force` to skip both prompts (required for non-interactive use). In non-TTY environments without `--force`, the command errors out. ```bash theme={"dark"} goldsky compose delete ``` Options: * `-n, --name ` / `-m, --manifest ` * `-t, --token ` * `-f, --force` Skip confirmation prompts (required for non-interactive use, e.g. CI) * `--delete-database` Also delete the app's hosted Postgres database * `--json` Deleting an app (and especially its database) is permanent. See [Deleting a Compose app](./deploy-monitor#deleting-a-compose-app) for the full behavior including pipeline safety checks. ### logs View or tail logs from a deployed app. ```bash theme={"dark"} # show the last 100 log lines goldsky compose logs # tail logs live, filtered to errors and warnings goldsky compose logs -f --level error,warn # show logs from the last hour goldsky compose logs --since 1h # show 500 lines and exit goldsky compose logs --max-lines 500 ``` Options: * `-n, --name ` / `-m, --manifest ` * `-t, --token ` * `-f, --follow` Stream logs live * `--tail ` Number of lines to fetch (default: `100`) * `--level ` Comma-separated log levels (e.g. `error,warn`) * `--search ` Filter log lines by text * `--since ` Only show logs since a relative time (e.g. `1h`, `30m`, `7d`) * `--max-lines ` Exit after N lines (useful with `-f`) * `--timeout ` Exit after a duration (useful with `-f`) * `--json` Emit newline-delimited JSON ## Inspecting a deployed app These commands read back information about a deployed app. They accept the standard targeting flags (`-n, --name` or `-m, --manifest`) and `--json` unless noted. ### history Show the deploy history for an app. ```bash theme={"dark"} goldsky compose history ``` Options: * `-n, --name ` / `-m, --manifest ` * `-t, --token ` Authentication token * `--limit ` Number of records to show (default: 20, server caps at 100) * `--offset ` Number of records to skip (default: 0) * `--include-failures` Include failed deploys in the list * `--json` Emit JSON output When the list is truncated, the output prints the visible range, for example: `Showing 6-7 of 42 records. Use --limit and --offset to page.` ### runs \[runId] List task runs for an app, or show one run's detail when you pass a run id. ```bash theme={"dark"} # list recent runs goldsky compose runs # show one run's detail goldsky compose runs 01HV8X2K1QZ9F4N1V3M2P7B6 ``` Options: * `-n, --name ` / `-m, --manifest ` * `-t, --token ` Authentication token * `--limit ` Number of runs to show * `--offset ` Number of runs to skip * `--task ` Filter to runs of a single task * `--status ` Filter by run status * `--since ` Only show runs since a relative time (e.g. `1h`, `30m`, `7d`) * `--until ` Only show runs before a relative time * `--json` Emit JSON output ### collections list List the collection names for an app. ```bash theme={"dark"} goldsky compose collections list ``` Options: * `-n, --name ` / `-m, --manifest ` * `-t, --token ` Authentication token * `--json` Emit JSON output ### collections query \[collectionName] Query documents in a collection. The collection name is required. ```bash theme={"dark"} goldsky compose collections query prices --filter '{"symbol": "BTC"}' --limit 10 ``` Options: * `-n, --name ` / `-m, --manifest ` * `-t, --token ` Authentication token * `--filter ` Filter documents by a JSON predicate * `--limit ` Number of documents to return (default: 100, maximum: 1000) * `--offset ` Number of documents to skip * `--json` Emit JSON output ### source \[taskName] Print the deployed source for an app. With no argument it lists the deployed files; with a task name it prints that task's source. It never writes to disk. ```bash theme={"dark"} # list deployed files goldsky compose source # print one task's source goldsky compose source price_fetcher ``` Options: * `-n, --name ` / `-m, --manifest ` * `-t, --token ` Authentication token * `--json` Emit JSON output ### download Download the deployed source archive as `.zip` by default. Use `-o, --output ` to choose a destination; the command refuses to overwrite an existing file. A downloaded app runs locally as-is: `compose start` detects the pre-bundled task files and runs them without re-bundling. ```bash theme={"dark"} goldsky compose download goldsky compose download -o ./my-app.zip ``` Options: * `-n, --name ` / `-m, --manifest ` * `-t, --token ` Authentication token * `-o, --output ` Output path (default: `.zip`) * `--json` Emit JSON output ## Wallet management ### wallet create Create a named wallet for this app and print its address. Works before the app's first deploy, so you can create a wallet, fund it, or pass its address as a constructor argument to `deployContract` before anything is running. ```bash theme={"dark"} # create a cloud wallet (default) goldsky compose wallet create my_wallet # create a local wallet in your stage DB goldsky compose wallet create my_wallet --env local ``` Options: * `-m, --manifest ` Path to manifest file (default: `compose.yaml`); the app name is read from here * `--env ` Where to create the wallet (default: `cloud`) * `-t, --token ` * `--json` Emit the wallet as JSON The wallet address is printed to stdout so you can pipe it into other commands or scripts. ### wallet list List wallets that have been created for this app. Returns an empty list for an app that has never deployed. ```bash theme={"dark"} goldsky compose wallet list goldsky compose wallet list --env local ``` Options: * `-m, --manifest ` Path to manifest file (default: `compose.yaml`) * `--env ` (default: `cloud`) * `-t, --token ` * `--json` Emit the wallets as JSON ## Secrets See [Secrets](./secrets) for the full workflow. ### secret set Set or update a secret. See [Secrets](./secrets) for full details. ```bash theme={"dark"} # set a cloud secret (default) goldsky compose secret set MY_SECRET --value my-secret-value # set a local secret (writes to .env) goldsky compose secret set MY_SECRET --value my-secret-value --env local # set a cloud secret and redeploy the app to pick it up goldsky compose secret set MY_SECRET --value my-secret-value --redeploy ``` Options: * `--value ` Secret value (required) * `--env ` Where to store the secret (default: `cloud`) * `--redeploy` After setting, redeploy the app so the new value takes effect * `-n, --name ` / `-m, --manifest ` * `-t, --token ` Secret names must be SCREAMING\_SNAKE\_CASE. A running app only picks up secret changes after a redeploy: pass `--redeploy` or run `goldsky compose deploy` yourself. ### secret delete Delete a secret. ```bash theme={"dark"} goldsky compose secret delete MY_SECRET goldsky compose secret delete MY_SECRET --env local ``` Options: * `--env ` Where to delete from (default: `cloud`) * `-n, --name ` / `-m, --manifest ` * `-t, --token ` ### secret list List the names of cloud secrets set for this app. Secret values are never shown; see [How secrets are stored](./secrets#how-secrets-are-stored). ```bash theme={"dark"} goldsky compose secret list ``` Options: * `-n, --name ` / `-m, --manifest ` * `-t, --token ` * `--json` Emit the secret names as JSON # Task to Task Execution (callTask) Source: https://docs.goldsky.com/compose/context/call-task Invoke another task in the same Compose app with callTask, including arguments, retries, and return values. ## Cross task execution A common pattern in compose apps is to trigger tasks from other tasks. This can be done either by creating an [HTTP trigger](../task-triggers) and calling it with [fetch()](./fetch), or by using `callTask()`. Typically you'll want to use `callTask()`. `callTask` invokes another task **in the same compose app**. It awaits the invoked task's `main()` function and resolves with its return value. If the invoked task throws, the error is re-thrown in the caller. ```typescript theme={"dark"} callTask, T = unknown>( taskName: string, args: Args, retryConfig?: { max_attempts: number; initial_interval_ms: number; backoff_factor: number; }, ): Promise ``` * `taskName`: the `name` of a task declared in `compose.yaml`. * `args`: a JSON-serializable payload passed to the invoked task's `main()` as its payload argument. * `retryConfig`: optional. Overrides the invoked task's retry settings for this call. ### Basic Example ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ callTask }: TaskContext) { const result = await callTask("my_task", { some: "payload" }); return result; } ``` ### Examples #### Call task in a loop ```typescript highlight={18-28} theme={"dark"} import { TaskContext } from "compose"; type MarketData = { questionId: string; resolved: boolean; startTime: number; endTime: number; }; export async function main({ collection, callTask }: TaskContext) { const marketsCollection = await collection("markets"); const unresolvedMarkets = await marketsCollection.findMany({ resolved: false }); const SYMBOL = "ETH-USD"; const marketDataPromises = unresolvedMarkets.map(async (market) => { try { const response = await callTask<{ error?: string }>("readMarketData", { questionId: market.questionId, symbol: SYMBOL, startTime: market.startTime, endTime: market.endTime, }); return { market, marketData: response, }; } catch (error) { console.log(`Failed to read candle data for market ${market.questionId}: ${error}`); return null; } }); const marketDataResults = await Promise.all(marketDataPromises); return { marketDataResults, }; } ``` ## Next Steps Trigger tasks from cron, the CLI and via HTTP You can use any sandbox compatible typescript packages with any package manager. # State Management (collections) Source: https://docs.goldsky.com/compose/context/collections Persist and query state across Compose tasks and runs with MongoDB-like collection operations backed by SQLite locally and Postgres in the cloud. Manage persistent state across tasks and task runs using MongoDB-like collection operations. Collections are where your app's stored state lives, and any task can read, write, search, and filter it at any time. When running locally, collections use SQLite (stored in `.compose/stage.db`). When deployed, each Compose app gets its own isolated Postgres database. The API is identical in both environments. The hosted Postgres is yours to use for application state via collections, but Compose also uses the same database internally to power durable execution (clean resumes after crashes and rolling deploys), transaction reorg monitoring, and wallet bookkeeping. Internal state lives in reserved namespaces; see [Reserved collection names](#reserved-collection-names) below. ## Examples ```typescript theme={"dark"} import { TaskContext } from "compose"; type Dog = { breed: string; color: string; }; export async function main({ collection, fetch }: TaskContext) { const dogsCollection = await collection("dogs", [ { path: "color", type: "text" }, ]); // Get existing state const brownDogs = await dogsCollection.findMany({ color: "brown" }); // Get some data const newData = await fetch("https://api.dogs.com/v1/dogs/labrador"); // Update state await dogsCollection.insertOne(newData); return { success: true, }; } ``` ## Full Interface ```typescript theme={"dark"} export type ScalarIndexType = "text" | "numeric" | "boolean" | "timestamptz"; export interface CollectionIndexSpec { path: string; type: ScalarIndexType; unique?: boolean; } export interface FindOptions { limit?: number; offset?: number; } // Filter helpers for comparison operators export type FilterHelper = | "$gt" | "$gte" | "$lt" | "$lte" | "$in" | "$ne" | "$nin" | "$exists"; export type HelperValue = Partial< Record >; export type FilterValue = string | number | boolean | HelperValue; export type Filter = Record; export type WithId = T & { id: string }; export interface Collection { readonly name: string; insertOne(doc: TDoc, opts?: { id?: string }): Promise<{ id: string }>; findOne(filter: Filter): Promise | null>; findMany(filter: Filter, options?: FindOptions): Promise>>; getById(id: string): Promise | null>; /** * @param opts.upsert - Defaults to true. Set to false to throw if document doesn't exist. */ setById( id: string, doc: TDoc, opts?: { upsert?: boolean }, ): Promise<{ id: string; upserted?: boolean; matched?: number }>; deleteById(id: string): Promise<{ deletedCount: number }>; drop(): Promise; } ``` The `collection` function is available on `TaskContext`: ```typescript theme={"dark"} collection: ( name: string, indexes?: CollectionIndexSpec[], ) => Promise>; ``` ## Filter operators The `Filter` type supports comparison operators beyond simple equality: ```typescript theme={"dark"} // Equality (default) await dogs.findMany({ color: "brown" }); // Comparison operators await dogs.findMany({ age: { $gt: 3 } }); // greater than await dogs.findMany({ age: { $gte: 3 } }); // greater than or equal await dogs.findMany({ age: { $lt: 10 } }); // less than await dogs.findMany({ age: { $lte: 10 } }); // less than or equal await dogs.findMany({ color: { $ne: "brown" } }); // not equal // Set membership await dogs.findMany({ breed: { $in: ["labrador", "golden"] } }); // in set await dogs.findMany({ breed: { $nin: ["chihuahua"] } }); // not in set // Field existence await dogs.findMany({ nickname: { $exists: true } }); ``` ## `setById` return value `setById` defaults to upsert behavior. The return value tells you whether the write created a new row or updated an existing one: * `upserted: false`, `matched: 0`: the document did not exist, so a new row was inserted. * `upserted: true`, `matched: 1`: an existing document with that `id` was updated. Pass `{ upsert: false }` to disable insert-on-missing; `setById` will then throw if no document exists with that `id`. ## Unique fields An index with `unique: true` on a field other than `id` rejects duplicate values. `insertOne` or `setById` throws this error when the value is already stored by another row: ```text theme={"dark"} This value is already stored in collection 'dogs'. Unique constraint violated on a secondary field. Use that field as the row id to update the existing row. ``` The run is not retried, because retrying the same save would fail the same way. `setById` upserts on `id` only, so it never replaces a different row that holds the same unique value. To update that row, use the unique field's value as the `id`, or catch the error in your task and handle it. ## `drop()` vs `deleteById()` `collection.drop()` runs `DROP TABLE IF EXISTS` against the backing database: it removes the collection's table entirely, not just its rows. Subsequent calls like `insertOne` do **not** automatically recreate the table; you must call `ctx.collection(name, indexes)` again to recreate it (along with its indexes). For routine cleanup that preserves the table and its indexes, prefer `deleteById` (or iterate with `findMany` + `deleteById`). Reach for `drop()` only when you truly want to discard the collection. ## Reserved collection names The following names are reserved for internal use and cannot be used as collection names: `wallets`, `stage`, `monitored_transactions`, `runs`, `context_functions`. Attempting to create or drop a collection with a reserved name throws an error. ## Next Steps Interact with EVM blockchains and smart contracts. Set and access environment variables. # Direct SQL (db) Source: https://docs.goldsky.com/compose/context/db Run SQL against your Compose app's Postgres database (SQLite locally) with ctx.db.query, positional parameters, and per-schema search paths. ## Query your app's database with "db" `ctx.db.query` lets a task run SQL directly against your Compose app's database. In the cloud this is the hosted Postgres database that backs your app; in local dev it is the local SQLite database, so the same task code works in both environments. Use it for state that does not fit [collections](/compose/context/collections), for example managing dynamic lookup tables (like a wallet tracker's address list) or maintaining your own custom schema. ### Signature ```typescript theme={"dark"} db: { query>( schema: string, sql: string, params?: (string | number | boolean | null)[], retryConfig?: ContextFunctionRetryConfig ): Promise>; } ``` The result is always an object with a `rows` array: ```typescript theme={"dark"} export type DbQueryResult> = { rows: T[]; }; ``` ### The schema argument The first argument is the Postgres schema your query runs against, and it is required. Compose sets the schema as the `search_path` before running your query, so your SQL can reference tables in that schema without qualifying every name. The schemas reserved for Compose internals (`public`, `pg_catalog`, and `information_schema`) are blocked, and the name must be a valid SQL identifier (letters, digits, and underscores, starting with a letter or underscore). Pick a custom schema for your tables, for example `app` or `tracker`. ### Parameters Use Postgres-native positional placeholders (`$1`, `$2`, ...) and pass values in the `params` array. When running locally against SQLite, the placeholders are converted to `?` for you, so you can write one query that works in both environments. ### Examples #### Create and read a lookup table ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ db }: TaskContext) { await db.query( "tracker", `CREATE SCHEMA IF NOT EXISTS tracker`, ); await db.query( "tracker", `CREATE TABLE IF NOT EXISTS watched_wallets ( address text PRIMARY KEY, added_at timestamptz DEFAULT now() )`, ); await db.query( "tracker", `INSERT INTO watched_wallets (address) VALUES ($1) ON CONFLICT DO NOTHING`, ["0x1234567890abcdef1234567890abcdef12345678"], ); const { rows } = await db.query<{ address: string }>( "tracker", `SELECT address FROM watched_wallets`, ); return rows.map((r) => r.address); } ``` Like all context functions, `ctx.db.query` calls are logged for auditing and are deterministically cached within a task run: if a run is interrupted and resumed, completed queries return their cached results instead of re-executing. See [Context Functions](./overview) for details. # Environment variables (env) Source: https://docs.goldsky.com/compose/context/env Expose configuration values to Compose tasks via the env field and secrets, with separate local and cloud environments. There are two ways to expose values to your tasks: the `env` field in your [App Configuration](../app-configuration) and [Secrets](../secrets). Both show up on the `env` property of your task context at runtime. Only the values for the current environment are injected: when running locally, only `env.local` values are used; when deployed, only `env.cloud` values are used. They are never merged together. If a secret has the same name as an env variable, the secret value takes precedence. ## Example Declare environment variables and secrets in your compose.yaml: ```yaml theme={"dark"} # compose.yaml name: "my-app" env: local: MY_VAR: "foo" ANOTHER_VAR: "bar" cloud: MY_VAR: "boo" ANOTHER_VAR: "baz" secrets: - MY_SECRET tasks: - name: "task1" path: "./task1.ts" ``` Secrets are listed by name only. Set their values locally in a `.env` file or in the cloud with `goldsky compose secrets set`. See [Secrets](../secrets) for details. Reference them in your tasks via the `env` property of the task context: ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ env }: TaskContext) { console.log(env.MY_VAR); console.log(env.ANOTHER_VAR); console.log(env.MY_SECRET); } ``` Trigger tasks from other tasks, creating composable workflows. You can use any sandbox compatible typescript packages with any package manager. # EVM chains Source: https://docs.goldsky.com/compose/context/evm/chains Use built-in or custom EVM chains in Compose tasks, powered by Goldsky Edge RPC. Compose comes with built-in chain support powered by our own "Edge RPC" product for reliable, low-latency RPC access. See the full list of networks available out of the box on the [Edge RPC supported networks](/chains/supported-networks#coverage-matrix) page. Need a chain that isn't listed? Contact us at [support@goldsky.com](mailto:support@goldsky.com) and we can look into adding support. You can access any built-in chain with `evm.chains.`. The chain keys match the exports from [`viem/chains`](https://viem.sh/docs/chains/introduction) (for example, Ethereum mainnet is `evm.chains.mainnet`, not `evm.chains.ethereum`). Compose also supports [custom chain configurations](#using-custom-chains) for any EVM network not covered by Edge RPC. See [Wallets](./wallets) and [Smart Contracts](./contracts) for more details on how chains are used. ## Using built-in chains This is the easiest and most reliable option for most scenarios. ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ evm }: TaskContext) { // the "chains" object is typed and holds all our natively supported chains // native chains are pre-configured to use Goldsky's Edge RPC console.log(evm.chains.base); console.log(evm.chains.mainnet); // Ethereum mainnet } ``` ## Using custom chains To use a custom chain, create an object that fulfills our `Chain` interface. ```typescript theme={"dark"} import { TaskContext, Chain } from "compose"; export async function main({ evm, env }: TaskContext) { // custom chain spec const myCustomChain: Chain = { id: 480, name: "My Custom Chain", testnet: false, nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 }, rpcUrls: { default: { http: [`https://mycustomchain-mainnet.g.alchemy.com/v2/${env.MY_CUSTOM_CHAIN_API}`] }, public: { http: ["https://mycustomchain-mainnet.g.alchemy.com/public"] }, }, blockExplorers: { default: { name: "myCustomChainScan", url: "https://myCustomChainScan.org" }, }, }; // you can now use the myCustomChain const anywhere you'd use a built-in chain (see Wallets and Smart Contracts for details) console.log(myCustomChain); } ``` The `Chain` type is available from the `TaskContext` interface. Here it is for reference: ```typescript theme={"dark"} export type Chain = { id: number; name: string; testnet: boolean; nativeCurrency: { name: string; symbol: string; decimals: number; }; rpcUrls: { public: { http: string[] }; default: { http: string[] }; }; blockExplorers: { default: { name: string; url: string }; }; contracts?: Record; }; ``` # EVM smart contracts Source: https://docs.goldsky.com/compose/context/evm/contracts Interact with smart contracts from Compose tasks using type-safe classes generated from your ABIs. Compose lets you interact with smart contracts with type safety and your choice of wallet. See [wallets](./wallets) for details on the different types of wallets. ## Code generation To interact with smart contracts with full type safety, place your ABI JSON files in the `src/contracts/` folder. Compose automatically generates TypeScript classes when you run `compose start` or `compose deploy`. You can also manually trigger code generation: ```bash theme={"dark"} compose codegen ``` The generated file is written to `.compose/generated/index.js`. On `compose deploy`, the CLI bundles this file alongside your tasks so the same typed classes are available in the cloud. If you deploy your contract with [`compose deployContract`](../../cli-reference#deploycontract), the CLI writes its ABI to `src/contracts/` for you, so you can run `compose codegen` immediately afterward. ### Generated classes For each ABI file (e.g., `src/contracts/BitcoinOracleContract.json`), Compose generates a typed class that you can access via `evm.contracts`: ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ evm, env }: TaskContext) { const wallet = await evm.wallet({ name: "my-wallet" }); // Access the generated contract class via evm.contracts const bitcoinOracleContract = new evm.contracts.BitcoinOracleContract( env.ORACLE_ADDRESS as `0x${string}`, evm.chains.base, wallet ); // Convert timestamp and price to bytes32 format const timestamp = Date.now(); const bitcoinPrice = 65000; const timestampAsBytes32 = `0x${timestamp.toString(16).padStart(64, "0")}`; const priceAsBytes32 = `0x${Math.round(bitcoinPrice * 100).toString(16).padStart(64, "0")}`; // Call a state-changing method — returns { hash, receipt, userOpHash? } const { hash } = await bitcoinOracleContract.setPrice( timestampAsBytes32, priceAsBytes32 ); // Call a view method — returns the decoded value directly const result = await bitcoinOracleContract.getLatestPrice(); } ``` Contract methods are called directly on the instance without `.write` or `.read` suffixes. View/pure functions return their decoded value directly, while state-changing functions return `{ hash, receipt, userOpHash? }` (the `userOpHash` is present only when gas sponsoring routes the transaction through a bundler). ## Decoding event logs Each generated contract class includes a static `decodeEventLog()` method for decoding onchain events with full type safety. This is commonly used in tasks triggered by [onchain events](../../task-triggers#chain-event-triggers): ```typescript theme={"dark"} import { TaskContext, OnchainEvent } from "compose"; export async function main({ evm }: TaskContext, payload: OnchainEvent) { // Decode using a generated contract class — returns a typed union of all events in the ABI const decoded = await evm.contracts.MyContract.decodeEventLog(payload); if (decoded.eventName === "Transfer") { console.log("Transfer:", decoded.args); } // Or use the top-level decodeEventLog with any ABI const myAbi = [/* ... */]; const decoded2 = await evm.decodeEventLog(myAbi, payload); } ``` You can also use `decodeEventLog` with a generic type parameter for a single known event type: ```typescript theme={"dark"} const decoded = await evm.contracts.MyContract.decodeEventLog(payload); ``` ## Direct wallet methods You can also interact with contracts directly through wallet methods without generated classes. This is useful for one-off calls or contracts you don't want to check an ABI into the repo for: ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ evm, env }: TaskContext) { const wallet = await evm.wallet({ name: "my-wallet" }); // Write to a contract — returns { hash, receipt, userOpHash? } const { hash, receipt } = await wallet.writeContract( evm.chains.polygon, env.CONTRACT_ADDRESS as `0x${string}`, "reportPayouts(bytes32,uint256[])", [resultId, payouts] ); // Read from a contract — returns the decoded value directly const balance = await wallet.readContract( evm.chains.polygon, env.CONTRACT_ADDRESS as `0x${string}`, "balanceOf(address) returns (uint256)", [wallet.address] ); } ``` See the [wallets documentation](./wallets) for the full `writeContract`, `readContract`, and `sendTransaction` signatures, gas handling, confirmations, and reorg protection options. # EVM context overview Source: https://docs.goldsky.com/compose/context/evm/overview Overview of the Compose evm context for chains, wallets, contracts, and reorg-aware transactions. ## Blockchain interactions Compose apps orchestrate and react to on-chain activity from off-chain logic. The `evm` context provides the tools for that: `evm.chains` for chain configuration, `evm.wallet()` and `evm.webhookWallet()` for wallets, and `evm.contracts` for type-safe contract interactions. See the individual sections below for full detail on each. 1. [Chains](./chains) 2. [Wallets](./wallets) 3. [Smart Contracts](./contracts) 4. [Reorg Handling](./reorgs) # EVM reorg handling Source: https://docs.goldsky.com/compose/context/evm/reorgs Wait for confirmations and handle mempool eviction or reorgs automatically when sending transactions from Compose tasks. Compose handles mempool eviction and re-orgs for you, without bespoke monitoring code. Both `wallet.writeContract()` and `wallet.sendTransaction()` support confirmation and reorg handling. This page covers transactions your task **sends**. For reorg safety on the events that **trigger** your task, use `confirmations` on the onchain trigger — see [Confirmations](../../task-triggers#confirmations). ## Confirmations By default all transactions via `wallet.writeContract()` or state-changing methods on [contracts](./contracts) will wait for one confirmation before resolving the method's promise. This means that the transaction will be seen in at least one block by the time your task execution advances. You can configure this further with the optional `TransactionConfirmation` logic. If your transaction doesn't make it into the number of blocks specified the context function call will fail and retry logic will kick in. If it still doesn't make it into the desired number of blocks after retries are exhausted then the promise will reject. Here's an example for both `wallet.writeContract()` and on a contract class method: ```typescript highlight={18} theme={"dark"} import { TaskContext } from "compose"; export async function main({ evm, env }: TaskContext) { const wallet = await evm.wallet(); const resultId = "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"; const payouts = [1000n, 2000n, 3000n]; const { hash } = await wallet.writeContract( evm.chains.polygon, env.CONTRACT_ADDRESS as `0x${string}`, "reportPayouts(bytes32,uint256[])", [resultId, payouts], { // this will not resolve the promise until the transaction has been seen in 5 blocks // if the transaction doesn't make it into five blocks (maybe is evicted from mempool, etc), // then your retry config will determine whether to retry the transaction confirmations: 5, }, { max_attempts: 5, initial_interval_ms: 1000, backoff_factor: 2, } ); } ``` ## Reorgs Reorgs could revert your transaction after the promise is resolved and the confirmations are all seen. For example, if you have 5 confirmations but later on a 100 block reorg occurs, you can configure your transaction with various retry "behaviors" to handle that situation. Like with confirmations, reorg handling can be used both with `wallet.writeContract()` as well as any state-changing methods on a [smart contract class](./contracts). There are several behaviors that we support currently: | behavior | description | other params | | - | - | - | | replay | re-executes transaction with fresh gas parameters and nonce (recalculated at replay time) | n/a | | log | just logs the reorg to your standard app logs | logLevel (optional) | | task | calls a compose task of yours for custom handling | task (name of compose task) | ### Examples ```typescript highlight={17-24,42-49,67-74} theme={"dark"} import { TaskContext } from "compose"; export async function main({ evm, env }: TaskContext) { const wallet = await evm.wallet(); const resultId = "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"; const payouts = [1000n, 2000n, 3000n]; // Replay on reorg const { hash } = await wallet.writeContract( evm.chains.polygon, env.CONTRACT_ADDRESS as `0x${string}`, "reportPayouts(bytes32,uint256[])", [resultId, payouts], { confirmations: 5, onReorg: { action: { // this will replay the transaction with a fresh nonce and gas if the transaction is reorged off chain after the 5 confirmations specified below // it will then start watching again for the number of blocks specified in the "depth" property type: "replay", }, // we'll watch this transaction in the background for 200 blocks and replay it if the transaction receipt disappears depth: 200, }, }, { max_attempts: 5, initial_interval_ms: 1000, backoff_factor: 2, } ); // Log on reorg const { hash: hash2 } = await wallet.writeContract( evm.chains.polygon, env.CONTRACT_ADDRESS as `0x${string}`, "reportPayouts(bytes32,uint256[])", [resultId, payouts], { confirmations: 5, onReorg: { action: { // this will just log in your normal app logs if the transaction is reorged off chain after the 5 confirmations specified below type: "log", logLevel: "warn", // defaults to "error" }, // we'll watch this transaction in the background for 200 blocks and log if the transaction receipt disappears depth: 200, }, }, { max_attempts: 5, initial_interval_ms: 1000, backoff_factor: 2, } ); // Custom task on reorg const { hash: hash3 } = await wallet.writeContract( evm.chains.polygon, env.CONTRACT_ADDRESS as `0x${string}`, "reportPayouts(bytes32,uint256[])", [resultId, payouts], { confirmations: 5, onReorg: { action: { // this will send the transaction as a payload to the specified task if the transaction is reorged off chain after the 5 confirmations specified below type: "task", task: "reorg-reconciler", // the name of your compose task with custom re-org handling logic }, // we'll watch this transaction in the background for 200 blocks and call your "reorg-reconciler" if the transaction receipt disappears depth: 200, }, }, { max_attempts: 5, initial_interval_ms: 1000, backoff_factor: 2, } ); } ``` Monitored transactions are checked for reorgs every 5 minutes. When a reorg is detected and the `replay` action is configured, the transaction is re-submitted with fresh gas parameters and nonce (not the original values, since the post-reorg state may differ). ## Full TransactionConfirmation type ```typescript theme={"dark"} export type ReplayOnReorg = { type: "replay"; }; export type LogOnReorg = { type: "log"; logLevel?: "error" | "info" | "warn"; // defaults to "error" }; export type CustomReorgAction = { type: "task"; // your task will be sent with a payload the full transaction minus gas and nonce task: string; }; export type OnReorgOptions = ReplayOnReorg | LogOnReorg | CustomReorgAction; export type OnReorgConfig = { action: OnReorgOptions; depth: number; }; export interface TransactionConfirmation { // this the number of block confirmations before we resolve the promise // i.e. "wait 5 blocks before proceeding to the next step in my task" confirmations?: number; onReorg?: OnReorgConfig; } ``` # EVM wallets Source: https://docs.goldsky.com/compose/context/evm/wallets Create and use Compose smart wallets, EOA private-key wallets, webhook wallets, and impersonated wallets for blockchain transactions. There are several types of wallets and wallet behaviors that compose supports. ## Smart wallets If you just need to interact with smart contracts, the easiest option is one of our smart wallets. You'll be able to see all of your wallets in the dashboard at `https://app.goldsky.com/{projectId}/dashboard/compose/{appName}`. ### Create a smart wallet ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ evm, env }: TaskContext) { // this is idempotent so the wallet is only created the first time this is called and is "retrieved" after that. // passing no args will create a "default" wallet for your app const wallet = await evm.wallet(); console.log(wallet.address); // you can create multiple named wallets too. This will generate multiple saved smart wallets that can be referenced by name in different // tasks and task runs const walletOne = await evm.wallet({ name: "wallet-one" }); const walletTwo = await evm.wallet({ name: "wallet-two" }); // private key wallet const privateKeyWallet = await evm.wallet({ privateKey: env.MY_KEY }); // now you can use these wallet to make transactions (see below for details) } ``` ### Using wallets Once you have a wallet created you can use it to write to smart contracts, see the full [smart contract docs](./contracts) for more details ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ evm, env, fetch }: TaskContext) { const wallet = await evm.wallet(); const response = await fetch<{ bitcoin: { usd: number } }>( "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd" ); // Convert timestamp and price to bytes32 format const timestamp = Date.now(); const bitcoinPrice = response.bitcoin.usd; const timestampAsBytes32 = `0x${timestamp.toString(16).padStart(64, "0")}`; const priceAsBytes32 = `0x${Math.round(bitcoinPrice * 100).toString(16).padStart(64, "0")}`; const bitcoinOracleContract = new evm.contracts.BitcoinOracleContract( env.ORACLE_ADDRESS, evm.chains.base, wallet ); const { hash } = await bitcoinOracleContract.setPrice( timestampAsBytes32, priceAsBytes32 ); } ``` You can also make or simulate transactions with methods on the Wallet class: ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ evm, env }: TaskContext) { const wallet = await evm.wallet(); const resultId = "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"; const payouts = [1000n, 2000n, 3000n]; const { hash, receipt, userOpHash } = await wallet.writeContract( evm.chains.polygon, env.CONTRACT_ADDRESS as `0x${string}`, "reportPayouts(bytes32,uint256[])", [resultId, payouts], { confirmations: 3, // this will not resolve the promise until the transaction has been seen in 3 blocks onReorg: { // this will replay the transaction with new nonce and new gas if it's reorged later on after the three confirmations have passed // see "Reorg Handling" for more info action: { type: "replay", }, depth: 200, }, } ); // userOpHash is set for gas-sponsored transactions (ERC-4337 UserOperation hash) // useful for debugging on bundler explorers if (userOpHash) { console.log(`UserOp hash: ${userOpHash}`); } } ``` ### sendTransaction For lower-level control, use `sendTransaction` to send a transaction with pre-encoded calldata. This is useful when you need to encode the transaction data yourself, pass specific gas parameters, or interact with contracts in ways that `writeContract` doesn't cover. ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ evm, env }: TaskContext) { const wallet = await evm.wallet(); // encode your calldata however you like const data = "0x..." as `0x${string}`; const { hash, receipt } = await wallet.sendTransaction( { to: env.CONTRACT_ADDRESS as `0x${string}`, data, chain: evm.chains.ethereum, }, { confirmations: 3 } ); console.log(`Transaction confirmed: ${hash}, status: ${receipt.status}`); } ``` You can also pass explicit gas parameters for full control over fees and gas limits: ```typescript theme={"dark"} const { hash, receipt } = await wallet.sendTransaction( { to: env.CONTRACT_ADDRESS as `0x${string}`, data, chain: evm.chains.ethereum, value: 0n, // ETH value to send with the transaction gas: 500000n, // gas limit maxFeePerGas: 30000000000n, // EIP-1559 max fee per gas maxPriorityFeePerGas: 1000000000n, // EIP-1559 priority fee nonce: 42, // explicit nonce (EOA wallets only) }, { confirmations: 5, onReorg: { depth: 200, action: { type: "replay" }, }, } ); ``` The `nonce` parameter is only supported with EOA (private key) wallets. Smart wallets manage nonces internally. ### writeContractBatch `writeContractBatch` sends several contract calls in one gas-sponsored transaction. The batch is all or nothing: if any call reverts, none of them take effect. Inside each call, `msg.sender` is your wallet, so it works for methods that check the caller. ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ evm, env }: TaskContext) { const wallet = await evm.wallet(); const { hash, receipt, userOpHash } = await wallet.writeContractBatch( evm.chains.base, [ { address: env.TOKEN_ADDRESS as `0x${string}`, functionSig: "approve(address,uint256)", args: [env.SPENDER_ADDRESS, 1000n], }, { address: env.VAULT_ADDRESS as `0x${string}`, functionSig: "deposit(uint256)", args: [1000n], value: 0n, // optional, wei to send with this call }, ], { confirmations: 3 } ); console.log(`Batch confirmed: ${hash}, status: ${receipt.status}`); } ``` Each call takes an `address`, a `functionSig`, an `args` array, and an optional `value` in wei. The second argument to `writeContractBatch` is a list of these calls. The optional third argument is the same [confirmation](./reorgs) object as `writeContract`, and the optional fourth is a retry config. It returns `{ hash, receipt, userOpHash }` for the one transaction that carried the whole batch. `writeContractBatch` throws when: * The wallet is not gas-sponsored, or the app is running locally or with `--fork-chains`. It only runs in deployed apps. * The list of calls is empty. * You pass `onReorg` in the confirmation config. Batches do not support reorg handling. `confirmations` works. * A call would revert, or the transaction reverts on-chain. None of the calls take effect. If a task retries after a crash, the retry resumes the first attempt's batch instead of building a new one. Use `writeContractBatch` when calls must land together or not at all. If your calls are independent, send them as separate `writeContract` calls at the same time instead. Compose [packs those automatically](#concurrent-writes). ### getBalance Check the native token balance of any wallet: ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ evm }: TaskContext) { const wallet = await evm.wallet(); // Returns balance in wei as a string const balance = await wallet.getBalance(evm.chains.ethereum); console.log(`Balance: ${balance} wei`); } ``` ### Wallet properties Every wallet exposes `name` and `address` as read-only properties: ```typescript theme={"dark"} const wallet = await evm.wallet({ name: "my-wallet" }); console.log(wallet.name); // "my-wallet" console.log(wallet.address); // "0x..." ``` ## EOA wallets You can also use EOAs that you already own. With an EOA you can self-fund gas, send and receive tokens in your tasks, and interact with smart contracts where your EOA has privileges on particular contract methods. Currently we support storing your EOA private key in Compose's secret management system, but in the future you'll be able to use private keys that are secured within TEEs. EOA wallets never pass their private keys outside of the task process and they sign requests passed in unsigned from the host process. When tasks run in TEEs, the private key will stay inside the TEE, never exposed to any other part of the stack. First, you'll need to store the private key in Goldsky's secret management system and reference it in your compose.yaml file. You can see details on how to do that in the [Secrets docs](../../secrets). Once you have your private key secret stored, you can use it to create a wallet: ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ evm, env }: TaskContext) { const privateKeyWallet = await evm.wallet({ privateKey: env.MY_PRIVATE_KEY_SECRET }); // now you can use the wallet the same as any other wallet } ``` ## Webhook wallets `evm.webhookWallet` sends gas-sponsored transactions from an address you already hold. Compose never sees the private key. It builds the ERC-4337 UserOperation, including paymaster data, POSTs that payload to a signing URL you host, then submits the signed operation. ### Create a webhook wallet ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ evm, env }: TaskContext) { const wallet = await evm.webhookWallet({ url: env.SIGN_WEBHOOK_URL, address: env.WALLET_ADDRESS as `0x${string}`, headers: { Authorization: `Bearer ${env.SIGN_WEBHOOK_TOKEN}` }, name: "treasury", // optional; defaults to webhook:
}); const { hash, userOpHash } = await wallet.writeContract( evm.chains.base, env.CONTRACT_ADDRESS as `0x${string}`, "setPrice(uint256)", [1234n], ); } ``` `url` must be `http://` or `https://`. `address` must be a 20-byte hex address. `headers` are copied onto every POST. Store the URL, address, and any auth token as [secrets](../../secrets). Compose saves the address on the app, so the wallet shows up in the dashboard. Webhook wallets implement the same `IWallet` as smart wallets and EOAs (`writeContract`, `writeContractBatch`, `sendTransaction`, `readContract`, `simulate`, `getBalance`). Writes are always gas-sponsored. ### Cloud only Webhook wallets run in deployed apps. Creating one in local dev throws: ``` Webhook wallets are only available in cloud deployments. Restart with --fork-chains to exercise the signing callback locally. ``` `--fork-chains` still POSTs to your webhook so you can test signing. Submit fails after that because there is no local bundler. ### Request bodies Compose POSTs JSON to `url` with `Content-Type: application/json` plus any `headers` you set. The request times out after 120 seconds. Bigint fields in the body are sent as decimal strings. If the wallet is not yet EIP-7702 delegated on the target chain, Compose asks the webhook to sign the authorization first: ```json theme={"dark"} { "type": "signAuthorization", "address": "0xYourWallet", "chainId": 8453, "authorizationRequest": { "contractAddress": "0x7702Implementation", "chainId": 8453, "nonce": 0 } } ``` Respond with `r` and `s` as 32-byte hex strings, and either `yParity` (`0` or `1`) or `v` (`27`, `28`, `0`, or `1`). If you also return `address`, `chainId`, or `nonce`, they must match the request. `contractAddress` is the EIP-7702 implementation, not your wallet. Every sponsored write then asks the webhook to sign the UserOperation's EIP-712 typed data: ```json theme={"dark"} { "type": "signUserOperation", "address": "0xYourWallet", "chainId": 8453, "userOpTypedData": {} } ``` Respond with `{ "signature": "0x..." }`. A non-JSON body, a missing `signature`, or a non-2xx status fails the task. Do not broadcast from the webhook. Return the signature; Compose submits the sponsored UserOperation. `nonce` on `sendTransaction` is ignored, as with other gas-sponsored wallets. A task retry prepares a new UserOperation, so Compose does not reuse a previous webhook signature. ### Signing server The other side of `webhookWallet` is one POST handler on a server you host. `sign7702Authorization` and `signTypedData` are whatever holds the key (Turnkey, Fireblocks, an HSM, a local key). Sign and return. Do not broadcast. ```typescript theme={"dark"} // POST / async function handleSign(req) { const body = await req.json(); if (body.type === "signAuthorization") { const { contractAddress, chainId, nonce } = body.authorizationRequest; const { r, s, yParity } = await sign7702Authorization({ address: body.address, // the wallet contractAddress, // 7702 implementation, not the wallet chainId, nonce, }); return json({ r, s, yParity }); // v: 27|28 also works } if (body.type === "signUserOperation") { const signature = await signTypedData({ address: body.address, ...body.userOpTypedData, // EIP-712 from Compose }); return json({ signature }); // 0x... } return status(400); } ``` ## Impersonated wallets When testing locally with `--fork-chains`, you may need to call contract methods that are restricted to a specific address, for example an owner-only admin function or a method guarded by an access control list. Normally you'd need the private key for that address, but with the `--impersonate` flag you can act as any address on the local TEVM fork using only its public address. This is useful when: * You want to test privileged contract methods without giving your local environment access to the private key * You need to debug interactions with a contract where only a specific address has permission to call certain methods * You're testing against a forked mainnet contract and want to simulate actions from an address you control on-chain but don't want to expose the key locally ### Usage Pass `--impersonate` alongside `--fork-chains` when starting your app. The flag takes a comma-separated list of `walletName=address` mappings: ```bash theme={"dark"} goldsky compose start --fork-chains --impersonate "my-wallet=0x1234...abcd" ``` You can impersonate multiple wallets at once: ```bash theme={"dark"} goldsky compose start --fork-chains --impersonate "admin=0xAdminAddr,treasury=0xTreasuryAddr" ``` Your task code stays exactly the same: reference the wallet by name as usual. The wallet's `.address` will resolve to the impersonated address, and all contract interactions (reads, writes, and simulations) will execute as that address on the local fork. ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ evm }: TaskContext) { // When started with --impersonate "admin=0xOwnerAddress", // this wallet's .address will be 0xOwnerAddress const wallet = await evm.wallet({ name: "admin" }); console.log(wallet.address); // 0xOwnerAddress // This call executes as the impersonated address on the fork, // so owner-only methods will succeed const { hash } = await wallet.writeContract( evm.chains.base, "0xMyContract..." as `0x${string}`, "adminFunction(uint256)", [42n] ); } ``` Impersonation also works with private-key wallets. If a private-key wallet has a `name` that matches an entry in the impersonate map, the impersonated address takes precedence and the private key is effectively ignored on the fork: ```typescript theme={"dark"} const wallet = await evm.wallet({ name: "my-pk-wallet", privateKey: env.MY_KEY, }); // With --impersonate "my-pk-wallet=0xTargetAddr", // wallet.address is 0xTargetAddr, not the address derived from MY_KEY ``` `--impersonate` requires `--fork-chains` and only works in local development. All impersonated transactions execute on your local TEVM fork. Nothing is sent to the actual chain. When you deploy to cloud, wallets resolve normally. ## Gas sponsoring By default, smart wallets (wallets created without a private key) use gas sponsoring so you don't have to manage gas funding. Smart wallets use EIP-7702 delegation for account abstraction, with gas costs handled through ERC-4337 UserOperations. Webhook wallets are always gas-sponsored. You pay the gas bill as part of your normal monthly Goldsky bill, avoiding the complex budgetary and tax issues of purchasing gas tokens. When you don't use gas sponsoring, you'll need to get your wallet address from the compose dashboard at `https://app.goldsky.com/{projectId}/dashboard/compose/{appName}` and then transfer gas tokens to that wallet through a wallet or an exchange. ### Gas sponsoring with EOA (private key) wallets You can also opt into gas sponsoring for EOA wallets by passing `sponsorGas: true` when creating the wallet. Compose delegates the EOA via EIP-7702 on first use and routes transactions through ERC-4337 UserOperations, just like smart wallets: you keep full control of the key and signing, but you don't have to fund the wallet with native gas tokens. ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ evm, env }: TaskContext) { const wallet = await evm.wallet({ privateKey: env.MY_PRIVATE_KEY, sponsorGas: true, }); // transactions now go through the sponsored UserOp flow // you pay for gas on your monthly Goldsky bill instead of from this EOA } ``` Sponsored EOA transactions only run in deployed apps. Running with `sponsorGas: true` locally will throw a clear error that tells you to either remove `sponsorGas`, fund the wallet manually, or re-run with `--fork-chains` to exercise the sponsored flow against a forked chain. In `--fork-chains` mode the transaction is executed against the local fork (where gas is free), and you'll see a warning reminding you the sponsored flow only takes effect once deployed to cloud. ### Concurrent writes In a deployed app, gas-sponsored `writeContract` and `sendTransaction` calls from the same wallet are queued and packed together into fewer transactions. You don't change any code. A task can start many writes at once and they finish much faster than if you await them one by one: ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ evm, env }: TaskContext) { const wallet = await evm.wallet(); const ids = ["0x01", "0x02", "0x03"]; await Promise.all( ids.map((id) => wallet.writeContract( evm.chains.polygon, env.CONTRACT_ADDRESS as `0x${string}`, "resolve(bytes32)", [id] ) ) ); } ``` What to know: * **Calls must not depend on each other.** Compose decides how calls are packed, so do not rely on their order. Use [`writeContractBatch`](#writecontractbatch) when they must land together or not at all. * **Reverting calls fail fast.** Before packing, Compose checks each call. A call that would revert throws with the revert reason and is never sent, so it costs no gas. The other calls in the same burst still go through. * **Packed calls share a transaction.** Calls that land together return the same `hash`, `userOpHash`, and `receipt`. * **Confirmation settings split batches.** Writes with different `confirmations` or `onReorg` settings are packed separately, and each call resolves after its own confirmation depth. * **Do follow-up work after the writes settle.** If each concurrent branch makes more context calls after its write, those calls can happen in a different order when the run replays. Await all the writes first, then do the follow-up calls. ### Retries and restarts A gas-sponsored write never lands twice when a task retries or an app restarts. If a retry finds that the original write already landed, it returns the original `hash` and `receipt` instead of failing. ### Backup bundler If the main bundler for a chain is down, Compose switches gas-sponsored writes on that chain to a backup bundler for 15 minutes, then tries the main one again. Your task code does not change. This applies on chains where a backup bundler is available. ### Gas usage in the dashboard Every sponsored or self-paid transaction emits a run event with `evm.gas_used` and `evm.total_cost_wei` attributes (both decimal strings in wei) so you can audit per-transaction gas spend from the Compose dashboard at `https://app.goldsky.com/{projectId}/dashboard/compose/{appName}`. On OP Stack L2s (Base, Optimism, and friends) `evm.total_cost_wei` includes the L1 data fee, which typically dominates the total cost. Reading `gasUsed × effectiveGasPrice` from the receipt alone will under-report by roughly two orders of magnitude. ## Gas pricing For non-sponsored transactions, Compose uses automatic gas estimation with sensible defaults. If you need precise control over gas parameters, use [`sendTransaction`](#sendtransaction) instead of `writeContract` and specify `maxFeePerGas`, `maxPriorityFeePerGas`, and `gas` explicitly. `writeContract` automatically simulates the transaction before submitting it, catching revert errors early. Gas-sponsored `sendTransaction` calls in a deployed app are also checked before they are sent, and a call that would revert throws without spending gas. Self-funded `sendTransaction` calls are not simulated: they submit directly. #### Override default gas sponsoring behavior ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ evm, env }: TaskContext) { // disable gas sponsoring on a smart wallet (default is true for smart wallets) const smartWallet = await evm.wallet({ name: "self-funded", sponsorGas: false }); // enable gas sponsoring on an EOA wallet (default is false for EOA wallets) const sponsoredEoa = await evm.wallet({ privateKey: env.MY_PRIVATE_KEY, sponsorGas: true, }); } ``` ## Full wallet interface ```typescript theme={"dark"} export interface WalletConfig { name?: string; // defaults to "default" privateKey?: string; sponsorGas?: boolean; // defaults to true if no privateKey and false if privateKey } export interface WebhookWalletConfig { url: string; // http(s) signing webhook address: Address; headers?: Record; name?: string; // defaults to webhook:
} export interface ContractCall { address: `0x${string}`; functionSig: string; args: unknown[]; value?: bigint; // wei sent with this call, defaults to 0n } export interface IWallet { readonly name: string; readonly address: `0x${string}`; writeContract( chain: Chain, contractAddress: `0x${string}`, functionSig: string, args: unknown[], confirmation?: TransactionConfirmation, retryConfig?: ContextFunctionRetryConfig ): Promise<{ hash: string; receipt: TransactionReceipt; userOpHash?: string; // set for gas-sponsored transactions (ERC-4337) }>; readContract( chain: Chain, contractAddress: `0x${string}`, functionSig: string, args: unknown[], retryConfig?: ContextFunctionRetryConfig ): Promise; sendTransaction( config: { to: `0x${string}`; data: `0x${string}`; chain: Chain; value?: bigint; maxFeePerGas?: bigint; maxPriorityFeePerGas?: bigint; gas?: bigint; nonce?: number; }, confirmation?: TransactionConfirmation, retryConfig?: ContextFunctionRetryConfig ): Promise<{ hash: string; receipt: TransactionReceipt; userOpHash?: string; // set for gas-sponsored transactions (ERC-4337) }>; // One gas-sponsored transaction, all or nothing. Sponsored wallets in deployed apps only. // onReorg is not supported. writeContractBatch( chain: Chain, calls: ContractCall[], confirmation?: TransactionConfirmation, retryConfig?: ContextFunctionRetryConfig ): Promise<{ hash: string; receipt: TransactionReceipt; userOpHash?: string; // ERC-4337 UserOperation hash }>; simulate( chain: Chain, contractAddress: `0x${string}`, functionSig: string, args: unknown[], retryConfig?: ContextFunctionRetryConfig ): Promise; getBalance( chain: Chain, retryConfig?: ContextFunctionRetryConfig ): Promise; // native token balance in wei } ``` # HTTP Requests (fetch) Source: https://docs.goldsky.com/compose/context/fetch Make auditable HTTP requests from Compose tasks with built-in caching, retries, and OpenTelemetry spans. ## Auditable HTTP Requests with "fetch" Make HTTP requests that are recorded as spans on the task run. This is how Compose apps interact with off-chain systems: every `ctx.fetch` call, its URL, and its response are captured in the run's event log, so the behavior of your app is auditable after the fact. For example, if you have an oracle that is advertised as being driven by an aggregate of several well-known price feeds, users of dApps built with it can audit the calls made to determine their prices and check that the price logic works as advertised. `ctx.fetch` wraps the native `fetch` and adds a few Compose-specific behaviors: the response is parsed as JSON (with a text fallback), each call is recorded as an OpenTelemetry span, successful results are cached by a deterministic idempotency key so replays after a crash don't re-hit the remote server, and the request runs on a dedicated HTTP client pool isolated from Compose's internal traffic. ```typescript theme={"dark"} fetch( url: string, fetchConfigOrRetryConfig?: FetchConfig | ContextFunctionRetryConfig, retryConfig?: ContextFunctionRetryConfig ): Promise ``` Where `FetchConfig` is: ```typescript theme={"dark"} export interface FetchConfig { method?: string; headers?: Record; body?: Record | string; } ``` And `ContextFunctionRetryConfig` is: ```typescript theme={"dark"} type ContextFunctionRetryConfig = { max_attempts: number; initial_interval_ms: number; backoff_factor: number; }; ``` `ctx.fetch` retries GET, HEAD, and OPTIONS requests by default (`max_attempts` defaults to `3`, `initial_interval_ms` to `500`, and `backoff_factor` to `2`). POST, PUT, PATCH, and DELETE default to a single attempt because they are not assumed idempotent. To override either, pass a `ContextFunctionRetryConfig` explicitly, as in the "Request with Custom Retry Configuration" example below. ### Response handling `ctx.fetch` reads the response body as JSON and returns the parsed object. If the body is not valid JSON, it falls back to returning the raw text. Non-2xx responses throw an error that includes the status code, status text, and response body, so you do not need to check `response.ok` yourself. Because of this, the return type is the decoded body, not a `Response` object. ### Examples #### Basic GET Request ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ fetch }: TaskContext) { const data = await fetch("https://api.example.com/data"); return data; } ``` #### POST Request with JSON Body If `body` is an object, `ctx.fetch` JSON-encodes it for you. Pass a string if you want to send a raw body (e.g. form-encoded or pre-serialized JSON). To call another task in the same app, use [`ctx.callTask`](./call-task). You don't need to go through HTTP unless you're hitting an [HTTP-triggered task](../task-triggers) externally. ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ fetch }: TaskContext) { const result = await fetch("https://api.example.com/submit", { method: "POST", headers: { "Content-Type": "application/json", Authorization: "Bearer token123", }, body: { name: "John Doe", email: "john@example.com", }, }); return result; } ``` #### Request with Custom Retry Configuration ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ fetch }: TaskContext) { const data = await fetch( "https://unreliable-api.com/data", { method: "GET", headers: { "User-Agent": "Compose/1.0" }, }, { max_attempts: 5, initial_interval_ms: 2000, backoff_factor: 1.5, } ); return data; } ``` ## Next Steps Manage state across tasks and task runs with collections. Interact with EVM blockchains and smart contracts. # ctx.hypercore: trade and deploy on Hyperliquid HyperCore Source: https://docs.goldsky.com/compose/context/hypercore Use ctx.hypercore in a Compose task to read HyperCore state and send orders, transfers, staking, subaccount, vault, and HIP-3/HIP-4 market actions. ## Trade and deploy on HyperCore with "hypercore" `ctx.hypercore` lets a task read from and act on **HyperCore**, the native Hyperliquid exchange: place and cancel orders, move funds, stake, manage subaccounts and vaults, operate HIP-3 perp markets, and deploy and settle HIP-4 outcome markets. HyperCore is not an EVM chain. Actions are signed payloads posted to Hyperliquid's exchange endpoint, not transactions. HyperEVM, the EVM chain that runs alongside it, is served by [`ctx.evm`](/compose/context/evm/overview) like any other chain. Use `ctx.hypercore` for the exchange itself and `ctx.evm` for contracts on HyperEVM. Wallets come from [`ctx.evm.wallet`](/compose/context/evm/wallets): Hyperliquid accounts are ordinary Ethereum keypairs, so the same wallet object signs both. ```typescript theme={"dark"} const wallet = await ctx.evm.wallet({ name: "trading-wallet" }); const mids = await ctx.hypercore.info.allMids("mainnet"); await ctx.hypercore.trade.order("mainnet", wallet, { orders: [{ a: 0, // asset index (BTC) b: true, // isBuy p: mids.BTC, // price s: "0.001", // size r: false, // reduceOnly t: { limit: { tif: "Ioc" } }, }], grouping: "na", }); ``` ### Every call names its network The first argument of every method is `"mainnet"` or `"testnet"`. There is no default and no app-level setting, for the same reason [`ctx.evm`](/compose/context/evm/chains) makes you pass a chain: a forgotten argument must be a type error, never a silent mainnet action. ### Field order is handled for you A HyperCore action is hashed with its fields in a canonical order. Get that order wrong and the signature recovers a different address, so the exchange rejects the action with a confusing `User or API Wallet 0x... does not exist` error. Compose canonicalizes every known action against Hyperliquid's own schemas before signing, so this class of failure cannot reach the wire, including actions you build by hand and pass to `exchange`. An action type Compose does not recognize (a brand new one, for example) is sent through unchanged with a warning in your logs, and then field order is yours to get right. ### Namespaces ```typescript theme={"dark"} hypercore: { info(network, query, retryConfig?): Promise; exchange(network, wallet, action, options?): Promise; info.allMids / l2Book / outcomeMeta / outcomeTemplates / clearinghouseState / spotClearinghouseState / delegatorSummary / userFills trade: order, cancel, cancelByCloid, modify, batchModify, twapOrder, twapCancel, scheduleCancel, updateLeverage, updateIsolatedMargin, topUpIsolatedOnlyMargin transfer: usdSend, spotSend, withdraw, usdClassTransfer, sendAsset, vaultTransfer, subAccountTransfer, subAccountSpotTransfer stake: deposit, withdraw, delegate agent: approve, approveBuilderFee outcome: activateDeployer, deactivateDeployer, deploy, deployQuestion, settle, settleQuestion, tokenOperation perpDeploy: registerAsset, setOracle, haltTrading, setFundingMultipliers, setFundingInterestRates, setOpenInterestCaps, setSubDeployers, setFeeRecipient, setMarginTableIds, setMarginModes, setDeployerFees, setPerpAnnotation, disableDex account: createSubAccount, subAccountModify, createVault, vaultModify, vaultDistribute, setDisplayName, setReferrer, registerReferrer, claimRewards, spotUser, evmUserModify, reserveRequestWeight, borrowLend, setAbstraction, setPortfolioMargin } ``` Every action method has the same shape: ```typescript theme={"dark"} ns.method(network, wallet, params, options?): Promise ``` `params` matches Hyperliquid's action fields for that action. Method names follow Hyperliquid's own names, except where those names are opaque: `stake.deposit` is `cDeposit`, `stake.withdraw` is `cWithdraw`, `stake.delegate` is `tokenDelegate`, and `transfer.withdraw` is `withdraw3`. Each method's doc comment records the raw action name so you can cross-reference the Hyperliquid docs. ### Options ```typescript theme={"dark"} type HypercoreCallOptions = { envelope?: { vaultAddress?: Address; // act on behalf of a subaccount or vault expiresAfter?: number; // reject the action after this ms timestamp }; retryConfig?: RetryConfig; }; ``` `vaultAddress` is only valid for order-book style actions. Fund actions (`transfer`, `stake`, `agent`) use Hyperliquid's user-signed scheme, which has no vault field, and passing one throws. ### Reads `info` is a plain read against Hyperliquid's info endpoint. The common queries have typed helpers, and the generic form covers everything else: ```typescript theme={"dark"} const mids = await ctx.hypercore.info.allMids("mainnet"); const state = await ctx.hypercore.info.clearinghouseState("mainnet", wallet.address); // anything without a helper const fills = await ctx.hypercore.info("mainnet", { type: "userFillsByTime", user: wallet.address, startTime: since, }); ``` Reads are retried automatically. Actions are not: they are mutations, so they run once per task attempt (see below). ### How actions are signed Hyperliquid has two signing schemes and Compose picks the right one per action: * **L1 actions** (orders, cancels, deployer actions) are msgpack-hashed and signed inside an EIP-712 envelope. * **User-signed actions** (transfers, staking, agent approval) are signed as per-action EIP-712 typed data. Both work with either wallet type. A managed wallet signs on the Compose host. A wallet created from a private key signs inside your task process, so the key never leaves it: Compose builds the payload, your task signs it, and Compose submits the signed result. ### Retries and duplicate actions Exchange actions are mutations: by default they are attempted once, and a task retry replays the recorded result rather than sending a second action. HyperCore nonces are single-use, which Compose leans on for the ambiguous case where an action was submitted but the result never came back. A replay re-submits the identical signed action, the exchange rejects the reused nonce, and Compose reports that as success: ```json theme={"dark"} { "status": "ok", "response": { "type": "duplicateNonce" } } ``` The action landed the first time. Read current state with `info` if you need the original response. Nonces are timestamps and must fall within roughly two days of now. A run resumed after that window fails with a stale-nonce error rather than silently re-executing an action that may already have landed. ### Rate limits Hyperliquid limits actions per address, roughly one action per 1 USDC of cumulative traded volume, after an initial allowance. Reads are limited per IP. An app that submits actions far faster than it trades will eventually be throttled by the exchange; see Hyperliquid's [rate limit documentation](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/rate-limits-and-user-limits). ### HIP-3: builder-deployed perp markets `perpDeploy` operates a perp DEX you have deployed. The deployer supplies the oracle, and Hyperliquid expects a price roughly every three seconds: ```typescript theme={"dark"} await ctx.hypercore.perpDeploy.setOracle("mainnet", wallet, { dex: "mydex", oraclePxs: [["GOLD", "2650.5"]], // sorted by key markPxs: [], externalPerpPxs: [["GOLD", "2650.4"]], // sorted by key }); ``` A Compose task is a scheduled run, not a long-lived process. `setOracle` works for a periodic push, but the fastest cron is once a minute, so Compose alone does not meet the three second cadence HIP-3 expects of a production oracle. Treat this as a way to operate deployer actions, not as a complete price-feed service. All list-of-tuple parameters must be sorted by key before signing. Compose sorts the ones it builds for you; when you pass tuples directly, sort them. ### HIP-4: outcome markets `outcome` deploys and settles HIP-4 outcome markets. Markets are instantiated from templates that validators have approved, so you fill in a template's keywords rather than defining an arbitrary market: ```typescript theme={"dark"} // what templates exist right now const templates = await ctx.hypercore.info.outcomeTemplates("testnet"); await ctx.hypercore.outcome.deploy("testnet", wallet, { templateId: "binaryPrice2", keywordToValue: { perp: "BTC", threshold: "65000", time: "20260815-1800" }, }); ``` Settlement must echo the market's canonical metadata exactly as `outcomeMeta` reports it, so store it when you deploy: ```typescript theme={"dark"} const meta = await ctx.hypercore.info.outcomeMeta("testnet"); const market = meta.outcomes.find((o) => o.outcome === outcomeIndex); await ctx.hypercore.outcome.settle("testnet", wallet, { outcome: market.outcome, settleFraction: priceAtExpiry > threshold ? "1" : "0", nameAndDescription: [market.name, market.description], sideNames: [market.sideSpecs[0].name, market.sideSpecs[1].name], }); ``` Outcome token side index `0` is the **Yes** side: it maps to `sideSpecs[0]`. Deploying and settling outcomes requires an activated outcome deployer, which has a staking requirement, and testnet caps how many outcomes a deployer can have open and deploy per day. ### Raw actions Anything without a helper goes through `exchange`, which signs, canonicalizes, and submits any action: ```typescript theme={"dark"} await ctx.hypercore.exchange("mainnet", wallet, { type: "scheduleCancel", time: Date.now() + 60_000, }); ``` ### Example A complete app that runs a vault on HyperCore (deposits attributed from on-chain transfers, share accounting in [collections](/compose/context/collections), a strategy leg trading a perp, and conditional payouts) is in [documentation-examples](https://github.com/goldsky-io/documentation-examples/tree/main/compose/hypercore-vault). A second example, [hip4-outcome-oracle](https://github.com/goldsky-io/documentation-examples/tree/main/compose/hip4-outcome-oracle), deploys and settles recurring HIP-4 markets. # Compose context overview Source: https://docs.goldsky.com/compose/context/overview How Compose context functions provide auditable, retryable, and durable access to the outside world from sandboxed tasks. Context functions allow task sandboxes to access the outside world. Context functions support individual retry configuration and are automatically logged for auditing and debugging. All communication outside of the task sandbox happens via Context Functions, so Compose apps run deterministically given the same world context. ## Retry Configuration All Context functions accept an optional retry configuration: ```typescript theme={"dark"} type ContextFunctionRetryConfig = { max_attempts: number; // 3 for read-only calls, 1 for mutations initial_interval_ms: number; // Default: 500 backoff_factor: number; // Default: 2 }; ``` **How Context Function Retries Work:** * Each context function call can have its own retry configuration * If a context function fails, it retries according to its configuration * If all context function retries are exhausted, the context function will throw * If you don't catch a failed context function call, a task-level retry may trigger, restarting the task and any context-function retries ## Durable execution and context caching Compose provides durable execution guarantees. All context function calls are deterministically cached: if a task is interrupted (e.g. by a restart or deployment) and resumed, context functions that already completed return their cached results instead of re-executing. This means: * Transactions that already succeeded will not be re-sent * Fetch calls that already returned will not be re-made * Collection operations that already completed will not be repeated This caching is scoped to each individual task run. Cached results are automatically cleaned up when the run completes (success or failure). Non-deterministic values, such as timestamps or random IDs, must be produced through [ctx.sideEffect()](./side-effect) so a replay returns the same value instead of recomputing it. By default, read-only context calls make up to 3 attempts (`max_attempts: 3`, `initial_interval_ms: 500`, `backoff_factor: 2`). This covers `readContract`, `simulate`, `getBalance`, and `ctx.fetch` with `GET`, `HEAD`, or `OPTIONS`. Mutations such as `callTask`, `writeContract`, `sendTransaction`, and `ctx.fetch` with `POST`, `PUT`, `PATCH`, or `DELETE` default to a single attempt (`max_attempts: 1`). Pass a `retryConfig` to override either default. ## Overview of key context properties and functions Context covers the following. Use the left nav or links below to find full reference docs. * State Management - [Collections](./collections) * Blockchain Interactions - [evm](./evm/overview) * HTTP requests - [fetch](./fetch) * Task to task execution - [callTask](./call-task) * Non-deterministic values - [sideEffect](./side-effect) * Reading env variables - [env](./env) * Reorg handling - [Reorgs](./evm/reorgs) * Turbo pipeline management - [turbo](./turbo) * Direct SQL access - [db](./db) * Run-aware logging - [logger](#logger) ## Full TaskContext interface ```typescript theme={"dark"} export type ContextFunctionRetryConfig = { max_attempts: number; initial_interval_ms: number; backoff_factor: number; }; export type Chain = { id: number; name: string; testnet: boolean; nativeCurrency: { name: string; symbol: string; decimals: number; }; rpcUrls: { public: { http: string[] }; default: { http: string[] }; }; blockExplorers: { default: { name: string; url: string }; }; contracts?: Record; }; export type ScalarIndexType = "text" | "numeric" | "boolean" | "timestamptz"; export interface CollectionIndexSpec { path: string; type: ScalarIndexType; unique?: boolean; } export interface FindOptions { limit?: number; offset?: number; } // Filter helpers for comparison operators export type FilterHelper = | "$gt" | "$gte" | "$lt" | "$lte" | "$in" | "$ne" | "$nin" | "$exists"; export type HelperValue = Partial< Record >; export type FilterValue = string | number | boolean | HelperValue; export type Filter = Record; export type WithId = T & { id: string }; export interface Collection { readonly name: string; insertOne(doc: TDoc, opts?: { id?: string }): Promise<{ id: string }>; findOne(filter: Filter): Promise | null>; findMany(filter: Filter, options?: FindOptions): Promise>>; getById(id: string): Promise | null>; /** * @param opts.upsert - Defaults to true. Set to false to throw if document doesn't exist. */ setById( id: string, doc: TDoc, opts?: { upsert?: boolean }, ): Promise<{ id: string; upserted?: boolean; matched?: number }>; deleteById(id: string): Promise<{ deletedCount: number }>; drop(): Promise; } export type Address = `0x${string}`; export interface WalletConfig { name?: string; // defaults to "default" privateKey?: string; sponsorGas?: boolean; // defaults to true for Privy wallets, false for private key wallets } export interface WebhookWalletConfig { url: string; address: Address; headers?: Record; name?: string; } export type ReplayOnReorg = { type: "replay"; }; export type LogOnReorg = { type: "log"; logLevel?: "error" | "info" | "warn"; // defaults to "error" }; export type CustomReorgAction = { type: "task"; // your task will be sent with a payload the full transaction minus gas and nonce task: string; }; export type OnReorgOptions = ReplayOnReorg | LogOnReorg | CustomReorgAction; export type OnReorgConfig = { action: OnReorgOptions; depth: number; }; export interface TransactionConfirmation { // this the number of block confirmations before we resolve the promise // i.e. "wait 5 blocks before proceeding to the next step in my task" confirmations?: number; onReorg?: OnReorgConfig; } export interface IWallet { readonly name: string; readonly address: Address; writeContract( chain: Chain, contractAddress: Address, functionSig: string, args: unknown[], confirmation?: TransactionConfirmation, retryConfig?: ContextFunctionRetryConfig, ): Promise<{ hash: string; receipt: TransactionReceipt; userOpHash?: string; // set for gas-sponsored transactions (ERC-4337) }>; readContract( chain: Chain, contractAddress: Address, functionSig: string, args: unknown[], retryConfig?: ContextFunctionRetryConfig, ): Promise; sendTransaction( config: { to: Address; data: `0x${string}`; chain: Chain; value?: bigint; maxFeePerGas?: bigint; maxPriorityFeePerGas?: bigint; gas?: bigint; nonce?: number; // EOA wallets only }, confirmation?: TransactionConfirmation, retryConfig?: ContextFunctionRetryConfig, ): Promise<{ hash: string; receipt: TransactionReceipt; userOpHash?: string; // set for gas-sponsored transactions (ERC-4337) }>; simulate( chain: Chain, contractAddress: Address, functionSig: string, args: unknown[], retryConfig?: ContextFunctionRetryConfig, ): Promise<{ hash: string }>; getBalance( chain: Chain, retryConfig?: ContextFunctionRetryConfig, ): Promise; // native token balance in wei } export interface Log { address: Address; topics: `0x${string}`[]; data: `0x${string}`; blockHash: `0x${string}`; blockNumber: bigint; logIndex: number; transactionHash: `0x${string}`; transactionIndex: number; removed?: boolean; } export interface TransactionReceipt { blockHash: `0x${string}`; blockNumber: bigint; contractAddress: Address | null; cumulativeGasUsed: bigint; effectiveGasPrice: bigint; from: Address; gasUsed: bigint; logs: Log[]; logsBloom: `0x${string}`; status: "success" | "reverted"; to: Address | null; transactionHash: `0x${string}`; transactionIndex: number; type: "legacy" | "eip1559" | "eip2930" | "eip4844" | "eip7702"; } export interface OnchainEvent { blockNumber: number; blockHash: string; transactionIndex: number; removed: boolean; address: string; data: `0x${string}`; topics: `0x${string}`[]; transactionHash: string; logIndex: number; } export interface FetchConfig { method?: string; headers?: Record; body?: Record | string; } export interface Logger { info(message: string, data?: Record): void; warn(message: string, data?: Record): void; error(message: string, data?: Record): void; } export type TaskContext = { env: Record; logger: Logger; callTask: , T = unknown>( taskName: string, args: Args, retryConfig?: ContextFunctionRetryConfig, ) => Promise; sideEffect: (fn: () => T | Promise) => Promise; fetch: ( url: string, fetchConfigOrRetryConfig?: FetchConfig | ContextFunctionRetryConfig, retryConfig?: ContextFunctionRetryConfig, ) => Promise; evm: { chains: Record; wallet: (config: WalletConfig) => Promise; webhookWallet: (config: WebhookWalletConfig) => Promise; decodeEventLog: (abi: Abi, log: OnchainEvent) => Promise; contracts: Record; // auto-generated from ABIs in src/contracts/ }; collection: ( name: string, indexes?: CollectionIndexSpec[], ) => Promise>; turbo: { createPipeline: (config: CreateTurboPipelineConfig, retryConfig?: ContextFunctionRetryConfig) => Promise; createJob: (config: CreateTurboJobConfig, retryConfig?: ContextFunctionRetryConfig) => Promise; getPipeline: (name: string, retryConfig?: ContextFunctionRetryConfig) => Promise; getStatus: (name: string, retryConfig?: ContextFunctionRetryConfig) => Promise; listPipelines: (retryConfig?: ContextFunctionRetryConfig) => Promise; pausePipeline: (name: string, retryConfig?: ContextFunctionRetryConfig) => Promise; resumePipeline: (name: string, retryConfig?: ContextFunctionRetryConfig) => Promise; restartPipeline: (name: string, options?: RestartOptions, retryConfig?: ContextFunctionRetryConfig) => Promise; deletePipeline: (name: string, retryConfig?: ContextFunctionRetryConfig) => Promise; getLogs: (name: string, options?: GetLogsOptions, retryConfig?: ContextFunctionRetryConfig) => Promise; getState: (name: string, retryConfig?: ContextFunctionRetryConfig) => Promise; validate: (definition: TurboPipelineDefinition, retryConfig?: ContextFunctionRetryConfig) => Promise; }; db: { query: >( schema: string, sql: string, params?: (string | number | boolean | null)[], retryConfig?: ContextFunctionRetryConfig, ) => Promise>; }; }; ``` See the [turbo reference](./turbo) for the full type definitions used above (`TurboPipeline`, `TurboPipelineStatus`, `ValidateResult`, etc.), and the [db reference](./db) for `DbQueryResult`. ## Logger `context.logger` is a run-aware structured logger. Unlike `console.log`, logs from `context.logger` carry the task name and run ID, so in the dashboard you can: 1. **Search app-level logs, then jump to the run.** On the Logs tab of your app, you can search for a log pattern across all runs. Each matching log entry includes a "View run" link that takes you directly to the full task run, where you can see the complete OpenTelemetry trace of everything that happened in that run. 2. **View run-specific logs.** On any task run's detail page, the Logs tab shows only logs from that specific run, so you see what happened in a single execution. ### Usage ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ logger, evm, env }: TaskContext) { logger.info("Starting price update", { source: "coingecko" }); try { const wallet = await evm.wallet(); const { hash } = await wallet.writeContract( evm.chains.base, env.CONTRACT_ADDRESS as `0x${string}`, "setPrice(bytes32,bytes32)", [timestampBytes, priceBytes] ); logger.info("Price updated", { hash, chain: "base" }); } catch (error) { logger.error("Price update failed", { error: error instanceof Error ? error.message : String(error), }); throw error; } } ``` ### API ```typescript theme={"dark"} interface Logger { info(message: string, data?: Record): void; warn(message: string, data?: Record): void; error(message: string, data?: Record): void; } ``` Each method takes a message string and an optional `data` object for structured metadata. BigInt values (common in EVM code) are automatically serialized as strings. ### `console.log` vs `context.logger` Both `console.log` and `context.logger` output to your terminal during local development. The difference is in the cloud: | | `console.log` | `context.logger` | | - | - | - | | Appears in app-level logs | Yes | Yes | | Tagged with run ID and task name | No | Yes | | "View run" link in dashboard | No | Yes | | Appears in run-specific Logs tab | No | Yes | | Structured `data` field | No | Yes | Use `console.log` for quick debugging. Use `context.logger` when you want logs that you can trace back to a specific task run in production. ## Next Steps Make auditable HTTP requests with fetch. Manage state across tasks and task runs with collections. # Non-Deterministic Values (sideEffect) Source: https://docs.goldsky.com/compose/context/side-effect Cache non-deterministic values like timestamps and UUIDs with ctx.sideEffect so task replays stay deterministic. ## Non-deterministic values and durable execution Durable execution replays a task from the start after an interruption, such as a restart or rolling deploy. Context calls that already completed return their cached results instead of re-running. A bare `Date.now()` or `crypto.randomUUID()` is not a context call, so it produces a different value on every replay and desynchronizes the run from its cached history. `ctx.sideEffect()` runs your callback once and caches the returned value like any other context call. On replay, it returns the cached value and the callback does not run again. ```typescript theme={"dark"} sideEffect(fn: () => T | Promise): Promise ``` ### Example Generate a request id and timestamp once, then reuse them in a `writeContract` call: ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main(ctx: TaskContext) { // Computed once; the cached values are returned on any replay. const { requestId, timestamp } = await ctx.sideEffect(async () => ({ requestId: crypto.randomUUID(), timestamp: Date.now(), })); const wallet = await ctx.evm.wallet({ name: "default" }); // requestId and timestamp are passed in the contract call args await wallet.writeContract( ctx.evm.chains.base, ctx.env.CONTRACT_ADDRESS as `0x${string}`, "recordRequest(string,uint256)", [requestId, timestamp] ); } ``` Use `ctx.sideEffect()` for any value that must stay the same across replays: timestamps, random values, UUIDs, or any other source of non-determinism. For the caching model that makes this necessary, see [Durable execution and context caching](./overview#durable-execution-and-context-caching). ## Next Steps Invoke another task in the same app. How context functions, caching, and retries work. # Turbo Pipelines (turbo) Source: https://docs.goldsky.com/compose/context/turbo ## Manage Turbo Pipelines with "turbo" `ctx.turbo` lets a task create and manage [Turbo pipelines](/turbo-pipelines/introduction) and [jobs](/turbo-pipelines/job-mode) from inside your Compose app. Use it to spin up a pipeline in response to an on-chain event, kick off a one-time backfill and poll it to completion, or pause and clean up pipelines your app owns. A Turbo **job** is a pipeline whose definition has `job: true`: it runs to completion and then exits, rather than streaming forever. `ctx.turbo.createJob` is a shortcut for `createPipeline` with that flag set. ### How pipelines are named and cleaned up Pipelines you create through `ctx.turbo` are namespaced under your Compose app. You pass a plain name like `token-transfers`, and the pipeline is registered internally with your app's prefix. Every method handles the prefix for you, so you always refer to pipelines by the plain name you gave them, and `listPipelines` only returns pipelines that belong to your app. When your Compose app is deleted, the pipelines it created are deleted with it, so you don't have to track and tear them down yourself. The namespaced name (app prefix included) has a length limit. If your app name plus the pipeline name is too long, `createPipeline` throws. Keep pipeline names short and the error message tells you the maximum. ### Methods ```typescript theme={"dark"} turbo: { createPipeline(config: CreateTurboPipelineConfig, retryConfig?): Promise; createJob(config: CreateTurboJobConfig, retryConfig?): Promise; getPipeline(name: string, retryConfig?): Promise; getStatus(name: string, retryConfig?): Promise; listPipelines(retryConfig?): Promise; pausePipeline(name: string, retryConfig?): Promise; resumePipeline(name: string, retryConfig?): Promise; restartPipeline(name: string, options?: RestartOptions, retryConfig?): Promise; deletePipeline(name: string, retryConfig?): Promise; getLogs(name: string, options?: GetLogsOptions, retryConfig?): Promise; getState(name: string, retryConfig?): Promise; validate(definition: TurboPipelineDefinition, retryConfig?): Promise; } ``` ### Config types ```typescript theme={"dark"} export type TurboPipelineDefinition = { sources: Record; transforms: Record; sinks: Record; job?: boolean; }; export type CreateTurboPipelineConfig = { name: string; // lowercase letters, numbers, and hyphens resourceSize?: string; description?: string; useDedicatedIp?: boolean; definition: TurboPipelineDefinition; }; // createJob takes the same config — the client sets job: true for you. export type CreateTurboJobConfig = Omit & { definition: Omit; }; export type RestartOptions = { clearState?: boolean }; export type GetLogsOptions = { logLevels?: string; // comma-separated, e.g. "error,warn" cursor?: number; after?: number; search?: string; direction?: "asc" | "desc"; }; ``` ### Response types ```typescript theme={"dark"} export type TurboPipeline = { name: string; status?: string; version?: number; definition?: TurboPipelineDefinition & { name?: string; resource_size?: string; description?: string; use_dedicated_ip?: boolean; }; created_at: string; updated_at?: string; }; export type TurboPipelineStatus = { name: string; status: string; }; export type ValidateResult = { valid: boolean; errors?: Array<{ message: string } | string>; warnings?: Array<{ message: string } | string>; }; export type PipelineActionResult = { name: string; action: string; }; export type PipelineDeleteResult = { name: string; deleted: boolean; }; export type PipelineLogsResult = { logs: unknown[]; }; ``` The `definition` is the same [pipeline configuration](/turbo-pipelines/pipeline-config) you'd write in YAML, expressed as an object. Reads (`getPipeline`, `getStatus`, `listPipelines`, `getLogs`, `getState`, `validate`) retry on transient failures by default; the mutating methods do not. Every call is recorded as a span on the task run, like [`ctx.fetch`](./fetch). ### Examples #### Kick off a one-time backfill (job) ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ turbo }: TaskContext) { const job = await turbo.createJob({ name: "solana-backfill", resourceSize: "m", definition: { sources: { token_transfers: { type: "dataset", dataset_name: "solana.token_transfers", version: "1.0.0", start_block: 250000000, end_block: 250000002, }, }, transforms: { filtered: { type: "sql", primary_key: "id", sql: "SELECT * FROM token_transfers" }, }, sinks: { out: { type: "postgres", from: "filtered", schema: "public", table: "token_transfers", secret_name: "MY_PG", primary_key: "id" }, }, }, }); return job; } ``` #### Create a streaming pipeline in response to an event ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ turbo }: TaskContext, params: { contract: string }) { // Sanitize the contract address for use in the pipeline name const slug = params.contract.slice(2, 10).toLowerCase(); return turbo.createPipeline({ name: `transfers-${slug}`, definition: { sources: { logs: { type: "dataset", dataset_name: "ethereum.raw_logs", version: "1.0.0", start_at: "latest" }, }, transforms: { filtered: { type: "sql", primary_key: "id", sql: `SELECT * FROM logs WHERE address = lower('${params.contract}')`, }, }, sinks: { out: { type: "postgres", from: "filtered", schema: "public", table: "transfers", secret_name: "MY_PG", primary_key: "id" }, }, }, }); } ``` #### Poll a job until it finishes ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ turbo }: TaskContext) { const { status } = await turbo.getStatus("solana-backfill"); if (status === "STOPPED" || status === "FAILED") { const logs = await turbo.getLogs("solana-backfill", { logLevels: "error" }); return { done: true, status, logs }; } return { done: false, status }; } ``` Pair this with a [cron trigger](../task-triggers) to check on a long-running job on a schedule instead of blocking a single task run. #### Validate before deploying ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ turbo }: TaskContext) { const result = await turbo.validate({ sources: { blocks: { type: "dataset", dataset_name: "ethereum.raw_blocks", version: "1.0.0" } }, transforms: { t: { type: "sql", primary_key: "id", sql: "SELECT * FROM blocks" } }, sinks: { out: { type: "blackhole", from: "t" } }, }); if (!result.valid) { const messages = (result.errors ?? []).map((e) => typeof e === "string" ? e : e.message ); throw new Error(messages.join("; ")); } } ``` #### List, pause, and delete the pipelines your app owns ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ turbo }: TaskContext) { const pipelines = await turbo.listPipelines(); for (const p of pipelines) { await turbo.pausePipeline(p.name); } await turbo.deletePipeline("solana-backfill"); } ``` ## Next Steps Learn how Turbo pipelines, sources, transforms, and sinks work. Run a pipeline as a one-time job that exits when it's done. # Debugging Source: https://docs.goldsky.com/compose/debugging Debug Compose apps locally with chain forking, wallet impersonation, and per-task callTask invocation. ## Debugging locally Logs and run events stream to the terminal where you run `goldsky compose start`. Output is formatted and colored so it's easy to scan. ### Chain forking For testing against live on-chain state without spending gas, start your app with the `--fork-chains` flag: ```bash theme={"dark"} goldsky compose start --fork-chains ``` This creates in-memory forks of all chains you interact with, powered by [TEVM](https://tevm.sh). All wallets are automatically funded with test ETH, so you can freely test contract interactions. Your task code stays exactly the same as in production; no special dev code needed. See [Environments](./environments#forking-for-local-compose-development) for more details. #### Impersonating wallet addresses If you need to test privileged contract methods that are restricted to a specific address (e.g. an owner or admin), you can impersonate that address on the fork without needing the private key: ```bash theme={"dark"} goldsky compose start --fork-chains --impersonate "my-wallet=0xOwnerAddress" ``` Any wallet whose name matches the mapping will resolve to the impersonated address and all contract interactions will execute as that address on the local fork. Your task code doesn't change at all. See [Impersonated wallets](./context/evm/wallets#impersonated-wallets) for full details. ### Testing individual tasks `callTask` targets your deployed app by default. To test a task against your locally running app, pass `--env local`: ```bash theme={"dark"} goldsky compose callTask my_task '{"key": "value"}' --env local ``` The payload must be valid JSON. The local port is resolved automatically (the `--port` flag, then `.compose/.port`, then 4000), so this works even when `start` picked a fallback port. ## Debugging a Deployed Compose App Once your app is running in the cloud, debug it from its details page in the web app at `https://app.goldsky.com/dashboard/compose/{appName}`. From there you can view logs and inspect task run records. See [Monitoring your app via the webapp](./deploy-monitor#monitoring-your-app-via-the-webapp) for a walkthrough. Every context function call (for example `evm.wallet()`, `evm.writeContract(...)`, `ctx.db.collection(...)`) is automatically captured as a run event and shown in the task run view. ### Using `context.logger` for run-aware logs Use `context.logger` instead of `console.log` to get logs tagged with the task name and run ID. In the dashboard you can then: 1. **Search for a log pattern** in the app-level Logs tab (e.g. search for "payout failed") 2. **Click "View run"** on any matching log entry to jump directly to that task run 3. **Inspect the full trace**: every context function call, other logs, and the outcome of that specific run Logs emitted with `context.logger` also appear in the **run-specific Logs tab**, so when you're looking at a single task run you see only the logs from that execution. See the full [logger reference](./context/overview#logger) for the API. ### Examples ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main( { evm, logger }: TaskContext, params: { payouts: bigint[]; resultId: string } ) { try { const { payouts, resultId } = params; logger.info("Reporting payouts", { resultId, payoutCount: payouts.length }); const wallet = await evm.wallet(); const { hash } = await wallet.writeContract( evm.chains.polygon, "0x1234567890abcdef1234567890abcdef12345678" as `0x${string}`, "reportPayouts(bytes32,uint256[])", [resultId, payouts] ); logger.info("Payouts reported", { hash }); return { hash }; } catch (error) { if (error instanceof Error && error.message.includes("payout denominator already set")) { logger.warn("Payout denominator already set, marking as resolved", { resultId }); } else { logger.error("Error reporting payout", { error: error instanceof Error ? error.message : String(error), }); throw error; } } } ``` ## Next Steps Learn about deploying your app to the cloud for production use cases. View the full CLI command reference # Deploying and Monitoring Source: https://docs.goldsky.com/compose/deploy-monitor Deploy Compose apps with goldsky compose deploy and monitor runs, logs, and state through the Goldsky webapp. Once you've built your Compose App and tested it locally, deploy it. Your app runs in an isolated runtime environment with a dedicated database. Environment variables and secrets you've provided are available to your app, and the durability engine resumes task execution across restarts and rolling deploys. You can monitor your app via the Goldsky webapp. ### The `deploy` command Deploy by running this command with a reference to your manifest file. The command is idempotent: it upserts your app to the cloud. ```bash theme={"dark"} goldsky compose deploy ``` Your manifest must include an `api_version` field to deploy. This pins your app to a specific Compose runtime. Use `"stable"` if unsure. See [Release channels](./app-configuration#release-channels) for details. The Compose CLI extension provisions the necessary resources and launches your app based on your manifest. Once complete, cron tasks start and HTTP triggers become available. See [Task triggers](./task-triggers) for more information. On success, `deploy` prints the URL of your app's dashboard. ### Hosted Postgres database When you deploy, Compose automatically provisions a dedicated Postgres database for your app. This database is used for two things: * **Your state.** Any [collections](./context/collections) you create in your tasks are stored here. You can query or inspect your own data directly. * **Compose internal state.** Compose uses the same database to power durable execution (resuming tasks cleanly after crashes and rolling deploys), reorg monitoring for transactions, and wallet bookkeeping. These internal tables live in reserved namespaces and are managed by the runtime. Because your app has its own database, your data is isolated from other apps and from Goldsky's own systems. ### Monitoring your app via the webapp Like with our indexing products, you'll see your Compose Apps in the Goldsky webapp. From there you can view the app's status, recent task runs (with per-operation details: each `ctx.*` call a task made), and raw log output. The URL for your app's dashboard is: ``` https://app.goldsky.com/{projectId}/dashboard/compose/{appName} ``` #### Viewing and downloading deployed source When you deploy, the CLI uploads your app's full local source tree: the transitive local import closure, `package.json` and lockfile, `tsconfig.json`, and everything under `src/contracts/`. `node_modules`, `.env*`, and files that look like keys or secrets are excluded. The dashboard's Code tab is a file browser over that source tree. The Download app button produces a zip that is a runnable local Compose project, including a names-only `.env.example`. Apps deployed before source capture existed show per-task compiled bundles instead of original sources. Redeploy with a current CLI to get full fidelity. Very large projects may skip source capture, in which case the CLI warns at deploy time and the dashboard falls back to the same per-task bundles. The CLI equivalents are [`goldsky compose source`](./cli-reference#inspecting-a-deployed-app) and [`goldsky compose download`](./cli-reference#inspecting-a-deployed-app); see [App lifecycle](./app-lifecycle#view-and-download-deployed-source) for the workflow. ### Managing a deployed app from the CLI For day-to-day app management from the terminal, use the [lifecycle commands](./app-lifecycle): ```bash theme={"dark"} goldsky compose status # runtime status goldsky compose list # all apps in your project goldsky compose logs -f # tail logs goldsky compose pause # stop triggers without deleting state goldsky compose resume goldsky compose delete # delete the app (and optionally the database) ``` ### Deleting a Compose app You can delete a Compose app either from the webapp (navigate to the app's dashboard and click **Delete**) or from the CLI: ```bash theme={"dark"} goldsky compose delete ``` Both paths require you to type the app name to confirm. See [App lifecycle](./app-lifecycle#delete-an-app) for CLI flags. #### Database management options When deleting a Compose app that uses a hosted Postgres database, you can choose whether to keep or delete the associated database: * **Delete associated database**: The hosted Postgres database will be permanently deleted along with the app and all its data. This is the default in the webapp modal ("Delete associated database" is pre-checked). From the CLI, pass `--delete-database` or answer the interactive prompt to opt in. * **Keep database**: Preserve the database when deleting the app. This is useful if you want to retain your data for analysis or migrate it to another app. This is the default in the CLI; in the webapp, uncheck "Delete associated database" before confirming. Database deletion is permanent and cannot be undone. Make sure to back up any important data before deleting. #### Pipeline validation If you choose to delete the associated database, Compose checks whether any active pipelines use it. If one or more pipelines reference the database, deletion is blocked and the error message lists the affected pipelines. To proceed with database deletion in this case, you must first: 1. Delete or modify the pipelines that reference the database 2. Then retry deleting the Compose app with the database option selected Alternatively, uncheck the "Delete associated database" option: the app is deleted but the database stays available to the existing pipelines. # Environments and RPCs Source: https://docs.goldsky.com/compose/environments Configure Compose for local chains, forked networks, testnets, and mainnets across the development lifecycle. We covered how to set your own [Environment Variables](./app-configuration#env-variables) in the manifest, but you'll likely need to work with smart contracts locally and on testnets. Additionally you'll likely need to interact with APIs, both your own and third party ones, with different credentials and different URLs throughout the development lifecycle. Compose supports two manifest environments: `local` (used when you run `goldsky compose start` or `goldsky compose dev`) and `cloud` (used when your app runs on Compose's infrastructure after `goldsky compose deploy`). The active environment is picked automatically based on whether the runtime is executing locally or in the cloud. There is no `--env` flag on `deploy`. ## Chains and RPCs Compose supports four chain environments: fully local (Foundry, Truffle, Hardhat, etc), locally forked networks (powered by TEVM), testnets and mainnets. ### Local chains (Foundry, Truffle, Hardhat) If you're developing your compose app locally alongside a smart contract running on a local chain, you can customize the RPC endpoints that Compose uses to read from and write to your contract. You can use hard coded values right in the code, or env variables configured in your [Manifest](./app-configuration#env-variables). #### Use a local RPC node in code If you're just starting out your contract with local development, and building your Compose app at the same time, you can use a Custom chain object right in code. For full reference in custom chain configuration, go [here](./context/evm/chains). For full reference on interacting with contracts, go [here](./context/evm/contracts). ```typescript theme={"dark"} import { TaskContext, Chain } from "compose"; export async function main({ evm }: TaskContext) { // This is a local-only private key I've funded on my test chain (thus safe to hard code) // For private keys used on mainnets and testnets, always use Secrets const privateKey = "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; const wallet = await evm.wallet({ privateKey }); const localChain: Chain = { id: 0, name: "foundry-local", testnet: true, nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 }, rpcUrls: { default: { http: ["http://127.0.0.1:8545"] }, // this is the url used by your local Anvil (etc) node public: { http: ["http://127.0.0.1:8545"] }, }, blockExplorers: { default: { name: "na", url: "http://127.0.0.1:8545" }, // not used for local dev, so you can pass in any value here }, }; const localContractAddress = "0x1234567890abcdef1234567890abcdef12345678" as `0x${string}`; const resultId = "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"; const payouts = [1000n, 2000n, 3000n]; const { hash } = await wallet.writeContract( localChain, localContractAddress, "reportPayouts(bytes32,uint256[])", [resultId, payouts], { confirmations: 3, } ); } ``` #### Use a local RPC only in the dev environment If you already have your contract and compose app deployed but are iterating on the contract and the Compose App locally, you can use env variables to override the RPC only when running locally. ### Manifest ```yaml theme={"dark"} name: "my_app" env: # since we're only specifying a local version of the RPC_URL env var, it'll be undefined when deployed to cloud local: # This is a local-only private key I've funded on my test chain (thus safe to hard code) # For private keys used on mainnets and testnets, always use Secrets PRIVATE_KEY: "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" RPC_URL: "http://127.0.0.1:8545" CONTRACT_ADDRESS: "0x67206e6E82FA1b11fd8C545Ad3422dBb1444E53C" # we can update this as we iterate on the contract locally cloud: CONTRACT_ADDRESS: "0x1234567890abcdef1234567890abcdef12345678" # we can update this when we deploy our contract to mainnet tasks: - name: "bitcoin_oracle" path: "./src/tasks/bitcoin_oracle.ts" triggers: - type: "cron" expression: "* * * * *" ``` Task code ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ evm, env }: TaskContext) { // private key will be undefined in cloud (since env var isn't set for cloud) and the wallet will default to our auto-funded smart wallets // however you can use a mainnet private key if you want by saving it as a secret, see wallet docs for more info const wallet = await evm.wallet({ privateKey: env.PRIVATE_KEY }); const chain = { ...evm.chains.base, }; // override the chain's RPC only if the env var is set if (env.RPC_URL) { chain.rpcUrls = { default: { http: [env.RPC_URL] }, // this is the url used by your local Anvil (etc) node public: { http: [env.RPC_URL] }, }; } const resultId = "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"; const payouts = [1000n, 2000n, 3000n]; const { hash } = await wallet.writeContract( chain, env.CONTRACT_ADDRESS as `0x${string}`, // use the env var for the contract address which we'll update as we iterate "reportPayouts(bytes32,uint256[])", [resultId, payouts], { confirmations: 3, } ); } ``` ### Forking for local Compose development If you're just iterating on your Compose app but your smart contract isn't changing, then a good option for local development can be to use TEVM for forking. This is done by starting your app with the `--fork-chains` option like so: `goldsky compose start --fork-chains`. When you use forking, everything in your code will be exactly the same locally as in cloud, but internally we'll fork all the chains you interact with and we'll fund all your wallets on the local fork for gas. You can iterate on your compose app freely while testing against a cloned contract and its state. You can also impersonate specific wallet addresses on the fork to test privileged contract methods without needing the private key. See [Impersonated wallets](./context/evm/wallets#impersonated-wallets) for details. ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ evm }: TaskContext) { // we'll auto-fund all smart wallets in forking mode so you can simulate gas sponsoring in prod const wallet = await evm.wallet({ name: "my-smart-wallet" }); const resultId = "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"; const payouts = [1000n, 2000n, 3000n]; const { hash } = await wallet.writeContract( // when you run compose with the --fork-chains flag we'll make a fork of base at the time of running the app and we'll clone all your existing contract state // when you deploy this to cloud, it'll run against the actual base mainnet, thus you don't need any special dev code when testing locally with forking evm.chains.base, "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd" as `0x${string}`, "reportPayouts(bytes32,uint256[])", [resultId, payouts], { confirmations: 3, } ); } ``` ### BYO RPCs for mainnets and testnets By default, Compose uses our internal [edge RPCs](https://erpc.cloud/edge) and our gas-sponsored [smart wallets](./context/evm/wallets), so you don't need to manage wallets, RPCs, or gas funding. If you'd rather use your own RPC nodes or wallets, that's supported too. Below is an example of using your own RPCs and private keys. See [Wallets](./context/evm/wallets) and [Chains](./context/evm/chains) for more details. ### Manifest ```yaml theme={"dark"} name: "my_app" secrets: # set these with "goldsky compose secret set --value " prior to deploying, see secrets docs for more info - PROD_FUNDING_WALLET - ALCHEMY_TOKEN env: local: ALCHEMY_BASEURL: "https://base-testnet.g.alchemy.com/v2/" cloud: ALCHEMY_BASEURL: "https://base-mainnet.g.alchemy.com/v2/" tasks: - name: "bitcoin_oracle" path: "./src/tasks/bitcoin_oracle.ts" triggers: - type: "cron" expression: "* * * * *" ``` Task code ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ evm, env }: TaskContext) { // env.PROD_FUNDING_WALLET was populated via the secrets reference in the manifest const wallet = await evm.wallet({ privateKey: env.PROD_FUNDING_WALLET }); const chain = { ...evm.chains.base, rpcUrls: { default: { http: [`${env.ALCHEMY_BASEURL}${env.ALCHEMY_TOKEN}`] }, public: { http: [`${env.ALCHEMY_BASEURL}${env.ALCHEMY_TOKEN}`] }, }, }; const resultId = "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"; const payouts = [1000n, 2000n, 3000n]; const { hash } = await wallet.writeContract( chain, "0x1234567890abcdef1234567890abcdef12345678" as `0x${string}`, "reportPayouts(bytes32,uint256[])", [resultId, payouts], { confirmations: 3, } ); } ``` ## Other environment use cases Another common need for different environments is interacting with your own, or third party, APIs. For example, you may need to test your compose app against a locally running version of your API for local development. Configure this with env vars in your [Manifest](./app-configuration#env-variables). ### Manifest ```yaml theme={"dark"} name: "my_app" env: local: API_BASE: "http://localhost:4001" cloud: API_BASE: "https://api.mydomain.com" tasks: - name: "bitcoin_oracle" path: "./src/tasks/bitcoin_oracle.ts" triggers: - type: "cron" expression: "* * * * *" ``` Task code ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ env, fetch }: TaskContext) { const apiEndpoint = `${env.API_BASE}/some/endpoint`; const resp = await fetch(apiEndpoint); } ``` # Migrate from Gelato W3F Source: https://docs.goldsky.com/compose/gelato Migrate from Gelato Web3 Functions to Compose, including triggers, task authoring, wallets, and monitoring. Compose and Gelato Web3 Functions (W3F) have a lot of similarities and solve similar problems, but they work a bit differently. For the most part, anything you've done with W3F can be done in a similar fashion with Compose, but there are some differences to be aware of. ## Terminology A few naming differences to keep in mind: * Task: In Compose a "task" is a TypeScript file with your code logic. It can import from other files and libraries and must export a single `main` function. This is effectively the equivalent of a "function" in W3F terms. * Trigger: In Compose a "trigger" encompasses the concept of both "triggers" and "tasks" in W3F. ## Configuration Compose apps are completely configured within your code repository. All configuration is done in the [manifest](./app-configuration) YAML file (`compose.yaml`). Compose apps are deployed with the CLI, and the manifest is responsible for provisioning infra and dependencies. ## Triggers Compose has similar triggering options to W3F with a few differences: * Compose doesn't differentiate between cron and time intervals: it just uses cron expressions for time-based triggering. * Compose has HTTP triggers, so your application logic can trigger tasks and send payloads over HTTP with optional bearer token authentication. * Like W3F, Compose tasks can be triggered by onchain events. You declare them directly in your manifest with an `onchain_event` trigger (network, contract address, event signatures), with no separate pipeline to configure. See [Task triggers](./task-triggers#chain-event-triggers). * For more complex event-driven flows than a single contract's events can express, you can build a Turbo pipeline with a webhook sink pointed at a Compose HTTP trigger. * Compose doesn't support per-block triggers out of the box. You can recreate this with a Turbo pipeline (webhook sink) that indexes every block and posts to an HTTP-triggered task. ## Task authoring and output All task authoring is done in TypeScript for Compose apps. We do not currently support authoring tasks in Solidity like W3F. Unlike W3F, Compose tasks don't output onchain transactions by default. They can return a JSON payload when called through an HTTP trigger, but all other effects are done inside the task code. Tasks can execute any number of onchain transactions, make HTTP calls to external systems, store data in collections for use later or by other tasks, and so on. Since external interactions happen in code rather than as task output, Compose apps can include any number of them. ## Monitoring Both platforms have a web UI dashboard for monitoring, logs, and so on. Compose also has an event log that gives details about task execution steps and failures. This is useful for both auditing and debugging the behavior of Compose apps. The event log is built to be publicly shareable as an audit trail, but currently it's only visible to users logged into a Goldsky project at app.goldsky.com. Compose does not currently have a notification system for app errors beyond proactively checking the UI and our own internal monitoring and on-call rotation for platform issues. However, logging can be set up within Compose apps to send to external systems. Compose doesn't make assumptions about what constitutes a failure within a task run, so you define success/failure conditions yourself and wire up logging to existing systems. We are designing a system for task logic to define its own critical failure conditions, which would let us use our existing email notification system and flag Compose apps with critical failures in the dashboard. If this is a strict requirement, please contact us with your specific requirements. ## Wallets, gas, and compute funding Gas funding in Goldsky doesn't rely on users depositing gas tokens in our system. Instead, transactions are sent from wallets created in code, and any number of wallets can be created within your Compose app. By default, wallets are Privy-managed smart wallets with built-in gas sponsorship enabled: gas is metered as you use it and paid for as part of your monthly Goldsky bill. Compose also lets you store your own EOA private keys as secrets and use those to create wallets. EOA wallets default to paying their own gas (so you must keep them funded), but you can opt into gas sponsorship per wallet by passing `sponsorGas: true` to `evm.wallet({...})` (see the [wallets reference](./context/evm/wallets)). Compute costs are included in your monthly Goldsky bill, paid in fiat. # Build a Bitcoin price oracle Source: https://docs.goldsky.com/compose/guides/build-a-bitcoin-oracle Build an on-chain Bitcoin price oracle using Compose, CoinGecko, and contract codegen This guide walks you through building a Bitcoin price oracle that fetches the BTC/USD price every minute and writes it on-chain. It demonstrates cron triggers, contract codegen, external API calls, and collection storage. ## How it works ```mermaid theme={"dark"} flowchart LR A[Cron Trigger] -->|"every minute"| B[Compose Task] B -->|"fetch price"| C[CoinGecko API] C -->|"BTC/USD price"| B B -->|"oracle.write(timestamp, price)"| D[On-chain Contract] B -->|"insertOne"| E[Collection] ``` 1. **Cron trigger** fires every minute 2. **CoinGecko API** provides the current BTC/USD price 3. **On-chain contract** receives the price via a typed contract class 4. **Collection** stores the price for historical queries ## Prerequisites * [Goldsky CLI installed](/installation) ## Project structure ```text theme={"dark"} bitcoin-oracle/ ├── compose.yaml # Compose configuration ├── tsconfig.json # TypeScript config ├── src/ │ ├── contracts/ │ │ └── PriceOracle.json # Contract ABI (generates typed class) │ ├── lib/ │ │ └── utils.ts # toBytes32 helper │ └── tasks/ │ └── bitcoin-oracle.ts # Main task ``` ## Step 1: Set up the project Clone the example repository: ```bash theme={"dark"} git clone https://github.com/goldsky-io/documentation-examples.git cd documentation-examples/compose/bitcoin-oracle ``` ## Step 2: Generate contract types The project includes a `PriceOracle.json` ABI in `src/contracts/`. Generate the typed contract class: ```bash theme={"dark"} goldsky compose codegen ``` This creates a typed `PriceOracle` class in `.compose/generated/` that provides type-safe contract interaction. ## Step 3: Understand the task The `bitcoin-oracle.ts` task handles everything: ```typescript theme={"dark"} import { TaskContext } from "compose"; import { toBytes32 } from "../lib/utils"; const ORACLE_CONTRACT = "0x34a264BCD26e114eD6C46a15d0A3Ba1873CaA708"; export async function main(context: TaskContext) { const { fetch, evm, collection } = context; const wallet = await evm.wallet({ name: "bitcoin-oracle-wallet" }); // Instantiate the typed contract (generated from src/contracts/PriceOracle.json) const oracle = new evm.contracts.PriceOracle( ORACLE_CONTRACT, evm.chains.polygonAmoy, wallet ); // Fetch Bitcoin price from CoinGecko API const response = await fetch<{ bitcoin: { usd: number } }>( "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd", { max_attempts: 3, initial_interval_ms: 1000, backoff_factor: 2, } ); if (!response) { throw new Error("Failed to fetch Bitcoin price"); } const bitcoinPrice = response.bitcoin.usd; const timestamp = Date.now(); // Convert to bytes32 format and write on-chain const timestampAsBytes32 = toBytes32(timestamp); const priceAsBytes32 = toBytes32(Math.round(bitcoinPrice * 100)); const { hash, receipt } = await oracle.write(timestampAsBytes32, priceAsBytes32); // Store in a collection for historical queries const priceHistory = await collection("bitcoin_prices"); const { id } = await priceHistory.insertOne({ price: bitcoinPrice, timestamp: timestamp, }); return { success: true, oracleHash: hash, price: bitcoinPrice, timestamp, priceId: id, }; } ``` ### Key Compose features used * **`context.fetch`**: HTTP requests with built-in retry and backoff * **`evm.wallet`**: managed wallet with gas sponsorship * **`evm.contracts.PriceOracle`**: typed contract class generated from ABI JSON via `compose codegen` * **`collection`**: persistent document storage for price history ## Step 4: Configure the Compose app The `compose.yaml` uses a cron trigger to run every minute: ```yaml theme={"dark"} name: "bitcoin-oracle" api_version: "stable" tasks: - path: "./src/tasks/bitcoin-oracle.ts" name: "bitcoin_oracle" triggers: - type: "cron" expression: "* * * * *" retry_config: max_attempts: 2 initial_interval_ms: 1000 backoff_factor: 1 ``` ## Step 5: Run locally ```bash theme={"dark"} goldsky compose start --fork-chains ``` `--fork-chains` lets you run a smart wallet locally. You can also use a private key wallet for your local Compose app. See more [here](/compose/secrets). The task runs immediately and then every minute. You should see logs showing the fetched price and transaction hash. ## Step 6: Deploy to Goldsky ```bash theme={"dark"} goldsky compose deploy ``` ## Customization ### Change the price source Replace the CoinGecko URL with any API that returns a JSON price: ```typescript theme={"dark"} const response = await fetch<{ price: number }>( "https://your-api.com/price", { max_attempts: 3, initial_interval_ms: 1000, backoff_factor: 2 } ); ``` ### Use your own contract 1. Drop your contract's ABI JSON into `src/contracts/MyContract.json` 2. Run `goldsky compose codegen` to generate the typed class 3. Use it in your task: ```typescript theme={"dark"} const myContract = new evm.contracts.MyContract( "0xYOUR_CONTRACT_ADDRESS", evm.chains.baseSepolia, wallet ); await myContract.yourMethod(arg1, arg2); ``` ### Change the cron schedule ```yaml theme={"dark"} triggers: - type: "cron" expression: "*/5 * * * *" # every 5 minutes ``` ## Resources * [Compose introduction](/compose/introduction) * [Contract codegen](/compose/context/evm/contracts) * [Task triggers](/compose/task-triggers) * [Collections](/compose/context/collections) * [CoinGecko API](https://www.coingecko.com/en/api) * [GitHub repository](https://github.com/goldsky-io/documentation-examples/tree/main/compose/bitcoin-oracle) # Build a compliance oracle Source: https://docs.goldsky.com/compose/guides/build-a-compliance-oracle Build a compliance-gated USDC payment gateway using Compose and the Webacy AML API This guide walks you through building a compliance-gated payment gateway. A smart contract accepts a USDC payment and holds it in escrow. A Compose task screens the sender's wallet against the [Webacy](https://developers.webacy.co) AML risk API, then calls back on-chain to either approve the transfer (funds go to the business wallet) or reject it (funds return to the sender). Every decision is written to a durable collection as an audit trail, and a reconciliation cron catches any transfer left stuck in escrow. It demonstrates on-chain event triggers, secrets, private-key wallets with sponsored gas, external API calls, collection storage, and cron triggers. For more on how Goldsky supports AML and sanctions-screening workflows, see [Compliance monitoring](/solutions/compliance-monitoring). ## How it works ```mermaid theme={"dark"} flowchart LR A[Sender] -->|"requestTransfer"| B[Escrow Contract] B -->|"emit TransferRequested"| C[Compose Task] C -->|"screen sender"| D[Webacy AML API] D -->|"risk score"| C C -->|"approveTransfer / rejectTransfer"| B C -->|"audit record"| E[Collection] ``` 1. **Sender** approves the escrow contract to spend USDC, then calls `requestTransfer` 2. **Escrow contract** pulls the funds in and emits a `TransferRequested` event 3. **Compose task** is triggered by the event and screens the sender via the Webacy API 4. **Oracle wallet** signs `approveTransfer` (funds to the business wallet) or `rejectTransfer` (funds back to the sender), with gas sponsored 5. **Collection** stores an audit record of the screening result and the decision 6. A separate **reconcile cron** runs every 5 minutes and alerts on transfers stuck in `Pending` The escrow contract's `approveTransfer` and `rejectTransfer` functions are restricted to a single oracle address fixed at deployment. That is the security model (only the oracle can release escrowed funds), but it also means there is no shared contract to point your app at. Every deployment binds its own oracle wallet, so you deploy your own contract in this guide. ## Prerequisites * [Goldsky CLI installed](/installation) * [Foundry](https://book.getfoundry.sh/getting-started/installation) for contract deployment * A [Webacy API key](https://developers.webacy.co) (a demo key is available after signup) * A small amount of Base Sepolia ETH to deploy the contracts (runtime transactions are gas-sponsored) ## Project structure ```text theme={"dark"} compliance-oracle/ ├── compose.yaml # Compose configuration ├── tsconfig.json # TypeScript config ├── foundry.toml # Foundry config ├── contracts/ │ ├── ComplianceGatedTransfer.sol # Escrow contract │ └── MockUSDC.sol # Test USDC (Base Sepolia only) ├── src/ │ ├── lib/ │ │ ├── constants.ts # Chain and contract config │ │ └── webacy.ts # Webacy screening client │ └── tasks/ │ ├── on-transfer-requested.ts # Main screening task │ └── reconcile.ts # Safety-net cron ``` ## Step 1: Set up the project Create the project layout: ```bash theme={"dark"} mkdir -p compliance-oracle/src/tasks compliance-oracle/src/lib compliance-oracle/contracts cd compliance-oracle ``` The escrow contract imports OpenZeppelin's `IERC20`, so install the contracts library: ```bash theme={"dark"} forge install OpenZeppelin/openzeppelin-contracts --no-commit ``` Add a `foundry.toml`: ```toml theme={"dark"} [profile.default] src = "contracts" out = "out" libs = ["lib"] ``` And a `tsconfig.json` for the Compose tasks: ```json theme={"dark"} { "compilerOptions": { "target": "ES2022", "module": "ES2022", "moduleResolution": "bundler", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "outDir": "./dist", "baseUrl": ".", "paths": { "compose": [".compose/types.d.ts"] } }, "include": ["src/**/*.ts"] } ``` Add a `.gitignore` containing `.env`, `lib/`, and `.compose/`. You will store a real private key in `.env` shortly. ## Step 2: Write the escrow contract `ComplianceGatedTransfer.sol` is a single-payee escrow. `requestTransfer` pulls USDC from the sender and records it as `Pending`. On approval, the funds go to the `oracle` (business) wallet; on rejection, they return to the sender. Both decision functions are `onlyOracle`: ```solidity theme={"dark"} // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; contract ComplianceGatedTransfer { enum Status { Pending, Approved, Rejected } struct Transfer { address sender; uint256 amount; Status status; } IERC20 public immutable usdc; address public oracle; uint256 public nextTransferId; mapping(uint256 => Transfer) public transfers; event TransferRequested( uint256 indexed id, address indexed sender, uint256 amount ); event TransferApproved(uint256 indexed id); event TransferRejected(uint256 indexed id); event OracleUpdated(address indexed oldOracle, address indexed newOracle); modifier onlyOracle() { require(msg.sender == oracle, "not oracle"); _; } constructor(address _usdc, address _oracle) { usdc = IERC20(_usdc); oracle = _oracle; } /// @notice User calls this to send a compliance-screened payment. /// User must have approved this contract to spend `amount` of USDC first. /// If approved, funds go to the oracle (business) wallet. function requestTransfer(uint256 amount) external { require(amount > 0, "zero amount"); usdc.transferFrom(msg.sender, address(this), amount); uint256 id = nextTransferId++; transfers[id] = Transfer({ sender: msg.sender, amount: amount, status: Status.Pending }); emit TransferRequested(id, msg.sender, amount); } /// @notice Oracle approves the transfer — funds go to the oracle (business) wallet. function approveTransfer(uint256 id) external onlyOracle { Transfer storage t = transfers[id]; require(t.status == Status.Pending, "not pending"); t.status = Status.Approved; usdc.transfer(oracle, t.amount); emit TransferApproved(id); } /// @notice Oracle rejects the transfer — funds returned to sender. function rejectTransfer(uint256 id) external onlyOracle { Transfer storage t = transfers[id]; require(t.status == Status.Pending, "not pending"); t.status = Status.Rejected; usdc.transfer(t.sender, t.amount); emit TransferRejected(id); } /// @notice Allow oracle address to be updated (for key rotation). function setOracle(address _oracle) external onlyOracle { emit OracleUpdated(oracle, _oracle); oracle = _oracle; } } ``` Native USDC only exists on mainnet, so for Base Sepolia also add `MockUSDC.sol`, a mintable 6-decimal ERC-20 with an open `mint` so you can fund test wallets freely: ```solidity theme={"dark"} // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract MockUSDC is ERC20 { constructor() ERC20("Mock USDC", "USDC") {} function decimals() public pure override returns (uint8) { return 6; } /// @notice Open mint — testnet only. function mint(address to, uint256 amount) external { _mint(to, amount); } } ``` ## Step 3: Create the oracle wallet and deploy the contracts The oracle is a plain EOA. Its address becomes the contract's `oracle` at construction, and the same private key signs the Compose callbacks at runtime. If they don't match, every callback reverts with `not oracle`. Generate one: ```bash theme={"dark"} cast wallet new ``` Save the private key in a `.env` file in the project root (never commit this file): ```env theme={"dark"} ORACLE_PRIVATE_KEY=0x_your_oracle_private_key RPC_URL=https://sepolia.base.org WEBACY_API_KEY=your_webacy_api_key ``` The oracle EOA only needs gas for these two contract deploys. Runtime callbacks are sponsored. Fund it with a small amount of Base Sepolia ETH from a [faucet](https://www.alchemy.com/faucets/base-sepolia) if `cast balance` shows zero. Deploy MockUSDC first, then the escrow with the token and oracle addresses as constructor args: ```bash theme={"dark"} source .env ORACLE_ADDRESS=$(cast wallet address "$ORACLE_PRIVATE_KEY") # 1) MockUSDC forge create contracts/MockUSDC.sol:MockUSDC \ --rpc-url "$RPC_URL" --private-key "$ORACLE_PRIVATE_KEY" --broadcast # save "Deployed to:" as USDC_ADDRESS # 2) ComplianceGatedTransfer(usdc, oracle) forge create contracts/ComplianceGatedTransfer.sol:ComplianceGatedTransfer \ --rpc-url "$RPC_URL" --private-key "$ORACLE_PRIVATE_KEY" --broadcast \ --constructor-args "$USDC_ADDRESS" "$ORACLE_ADDRESS" # save "Deployed to:" as CONTRACT_ADDRESS ``` Save both deployed addresses. You'll wire them into the app next. ## Step 4: Configure the Compose app The `compose.yaml` declares two secrets and two tasks: an on-chain event listener for `TransferRequested` and the reconcile cron. Fill in your escrow contract address: ```yaml theme={"dark"} name: "compliance-oracle" api_version: "stable" secrets: - ORACLE_PRIVATE_KEY - WEBACY_API_KEY tasks: - path: "./src/tasks/on-transfer-requested.ts" name: "on_transfer_requested" triggers: - type: "onchain_event" network: "base_sepolia" contract: "0xYOUR_ESCROW_CONTRACT_ADDRESS" events: - "TransferRequested(uint256,address,uint256)" retry_config: max_attempts: 3 initial_interval_ms: 1000 backoff_factor: 2 - path: "./src/tasks/reconcile.ts" name: "reconcile" triggers: - type: "cron" expression: "*/5 * * * *" ``` The task code reads its chain and addresses from `src/lib/constants.ts`. Fill in the same escrow address plus your MockUSDC address: ```typescript theme={"dark"} import type { Hex } from "compose"; export const CONFIG = { chain: "baseSepolia" as const, // Your deployed ComplianceGatedTransfer contract contractAddress: "0xYOUR_ESCROW_CONTRACT_ADDRESS" as Hex, // Your MockUSDC on Base Sepolia (native USDC on mainnet) usdcAddress: "0xYOUR_USDC_ADDRESS" as Hex, usdcDecimals: 6, }; // Webacy risk score threshold (0-100 scale) // Transfers from wallets scoring at or above this are rejected export const RISK_THRESHOLD = 50; ``` The chain appears in both files, in different formats: camelCase in TypeScript (`baseSepolia`) and snake\_case in the manifest (`base_sepolia`). Updating only one of them is the most common reason the task never fires. ## Step 5: Add the screening library `src/lib/webacy.ts` fetches Webacy's risk report for an address and normalizes it into a pass/fail result. A sender fails when its `overallRisk` score is at or above `RISK_THRESHOLD`; tags with severity 2 or higher are surfaced as the triggered rules: ```typescript theme={"dark"} import { TaskContext } from "compose"; export type WalletScreeningResult = { address: string; riskScore: number | null; passed: boolean; triggeredRules: string[]; }; type WebacyIssueTag = { name: string; description: string; severity: number; key: string; }; type WebacyIssue = { score: number; tags: WebacyIssueTag[]; }; type WebacyResponse = { count: number; medium: number; high: number; overallRisk: number; addressType: string; issues: WebacyIssue[]; }; const WEBACY_API_BASE = "https://api.webacy.com"; export async function screenWallet( address: string, apiKey: string, riskThreshold: number, fetchFn: TaskContext["fetch"], ): Promise { const url = `${WEBACY_API_BASE}/addresses/${address}?chain=base`; const data = await fetchFn(url, { method: "GET", headers: { "x-api-key": apiKey, }, }); if (!data) { throw new Error(`Webacy API returned empty response for ${address}`); } const riskScore = data.overallRisk ?? null; const triggeredRules: string[] = (data.issues ?? []) .flatMap((issue) => issue.tags ?? []) .filter((tag) => tag.severity >= 2) .map((tag) => tag.name); return { address, riskScore, passed: riskScore === null || riskScore < riskThreshold, triggeredRules, }; } ``` Webacy is one screening provider. The same pattern works with any AML or sanctions API that scores an address. See [Compliance monitoring](/solutions/compliance-monitoring) for the broader screening patterns Goldsky supports. ## Step 6: Write the main task `src/tasks/on-transfer-requested.ts` runs the whole decision flow: decode the event, screen the sender, sign the callback with the oracle key, and persist an audit record to the `transfer-audits` collection: ```typescript theme={"dark"} import { TaskContext, OnchainEvent } from "compose"; import { CONFIG, RISK_THRESHOLD } from "../lib/constants"; import { screenWallet, WalletScreeningResult } from "../lib/webacy"; type TransferAuditRecord = { transferId: string; sender: string; amount: string; screening: WalletScreeningResult; decision: "approved" | "rejected"; reason: string; depositTxHash: string; oracleTxHash: string; timestamp: string; }; type TransferRequestedEvent = { eventName: "TransferRequested"; args: { id: bigint; sender: string; amount: bigint }; }; function formatUsdc(raw: bigint): string { return `${(Number(raw) / 1e6).toFixed(2)} USDC`; } export async function main(ctx: TaskContext, payload: OnchainEvent) { const { evm, collection, env, fetch: ctxFetch } = ctx; const log = ctx.logger; // --- Step 1: Decode the onchain event --- const decoded = await evm.decodeEventLog( [{ type: "event", name: "TransferRequested", inputs: [ { name: "id", type: "uint256", indexed: true }, { name: "sender", type: "address", indexed: true }, { name: "amount", type: "uint256", indexed: false }, ], }], payload, ); const { id, sender, amount } = decoded.args; const transferId = id.toString(); const depositTxHash = (payload as any).transaction_hash; log.info(`deposit received: ${formatUsdc(amount)}, from ${sender}`); // --- Step 2: Screen the depositor via Webacy --- log.info(`screening depositor ${sender}`); const screenResult = await screenWallet(sender, env.WEBACY_API_KEY, RISK_THRESHOLD, ctxFetch); log.info(`screening complete for ${sender}, risk score: ${screenResult.riskScore}`); // --- Step 3: Call back to the escrow contract --- const wallet = await evm.wallet({ privateKey: env.ORACLE_PRIVATE_KEY, sponsorGas: true }); let txHash: string; let decision: "approved" | "rejected"; let reason: string; if (screenResult.passed) { decision = "approved"; reason = `Sender score: ${screenResult.riskScore}. Below threshold ${RISK_THRESHOLD}.`; log.info(`approving transfer #${transferId} — ${formatUsdc(amount)} to vault wallet`); const result = await wallet.writeContract( evm.chains[CONFIG.chain], CONFIG.contractAddress, "approveTransfer(uint256)", [id], ); txHash = result.hash; log.info(`transfer #${transferId} APPROVED`, { oracleTxHash: txHash, amount: formatUsdc(amount), sender, }); } else { decision = "rejected"; reason = `Sender flagged (score: ${screenResult.riskScore}, rules: ${screenResult.triggeredRules.join(", ")})`; log.warn(`rejecting transfer #${transferId} — returning ${formatUsdc(amount)} to ${sender}`); const result = await wallet.writeContract( evm.chains[CONFIG.chain], CONFIG.contractAddress, "rejectTransfer(uint256)", [id], ); txHash = result.hash; } // --- Step 4: Persist audit record --- const audits = await collection("transfer-audits"); await audits.setById(transferId, { transferId, sender, amount: amount.toString(), screening: screenResult, decision, reason, depositTxHash, oracleTxHash: txHash, timestamp: new Date().toISOString(), }); log.info(`audit record saved for transfer #${transferId}`); return { transferId, decision, reason, depositTxHash, oracleTxHash: txHash }; } ``` ### Key Compose features used * **`evm.decodeEventLog`**: decodes the raw event payload into typed args, no external ABI library needed * **`evm.wallet({ privateKey, sponsorGas: true })`**: loads the oracle EOA from the `ORACLE_PRIVATE_KEY` secret with sponsored gas, so the wallet never needs native token at runtime * **`context.fetch`**: HTTP client used by the Webacy screening call * **`collection`**: the `transfer-audits` collection is a durable, queryable audit trail keyed by transfer ID * **`retry_config`**: transient Webacy or RPC failures retry the whole task (3 attempts with backoff) Don't import `viem`, `ethers`, or other external packages in task code: `evm`, `fetch`, `collection`, `env`, and `logger` all come from the injected context. The only import from outside your project is `compose` itself, for types. ## Step 7: Add the reconciliation cron Escrow that silently holds funds is the failure mode to design against. `src/tasks/reconcile.ts` runs every 5 minutes, scans the contract for transfers still in `Pending` (a missed event or a failed callback) and logs an error so nothing sits in escrow unnoticed: ```typescript theme={"dark"} import { TaskContext } from "compose"; import { CONFIG } from "../lib/constants"; export async function main(ctx: TaskContext) { const { evm } = ctx; // Use the oracle private key for read calls (address must match the contract's oracle) const wallet = await evm.wallet({ privateKey: ctx.env.ORACLE_PRIVATE_KEY }); // Read how many transfers exist on the contract const totalTransfers = await wallet.readContract( evm.chains[CONFIG.chain], CONFIG.contractAddress, "nextTransferId() returns (uint256)", [], ); // Check each transfer's status onchain // In production you'd track a cursor; for the demo, scan all let pendingCount = 0; const staleTransfers: number[] = []; for (let i = 0; i < Number(totalTransfers); i++) { const transfer = await wallet.readContract<[string, bigint, number]>( evm.chains[CONFIG.chain], CONFIG.contractAddress, "transfers(uint256) returns (address,uint256,uint8)", [i], ); const status = transfer[2]; // 0 = Pending, 1 = Approved, 2 = Rejected if (status === 0) { pendingCount++; staleTransfers.push(i); } } const report = { timestamp: new Date().toISOString(), totalTransfers: Number(totalTransfers), pendingCount, staleTransferIds: staleTransfers, healthy: pendingCount === 0, }; if (pendingCount > 0) { ctx.logger.error("stale pending transfers detected", report); } else { ctx.logger.info("reconciliation passed", report); } return report; } ``` ## Step 8: Set the secrets The deployed app needs the oracle key (to sign callbacks) and the Webacy key (to screen). Set both as Compose secrets: ```bash theme={"dark"} source .env goldsky compose secret set ORACLE_PRIVATE_KEY --value "$ORACLE_PRIVATE_KEY" goldsky compose secret set WEBACY_API_KEY --value "$WEBACY_API_KEY" ``` Both names must appear under `secrets:` in `compose.yaml` (they do, from Step 4) for the values to be injected into `ctx.env` at runtime. See [Wallets and secrets](/compose/secrets) for details. ## Step 9: Deploy to Goldsky ```bash theme={"dark"} goldsky compose deploy ``` The first deploy can take a minute or two. Once it reports `Deployed compose app: compliance-oracle`, both the event listener and the reconcile cron are live. ## Step 10: Test the flow Drive the full flow from a separate sender wallet (not the oracle key). First mint test USDC to the sender (the MockUSDC has an open `mint`): ```bash theme={"dark"} cast send $USDC_ADDRESS "mint(address,uint256)" $SENDER_ADDRESS 1000000 \ --rpc-url $RPC_URL --private-key $ORACLE_PRIVATE_KEY # 1.00 USDC ``` Then approve the escrow as a spender and request the transfer (ERC-20 pulls require prior approval): ```bash theme={"dark"} cast send $USDC_ADDRESS "approve(address,uint256)" $CONTRACT_ADDRESS 1000000 \ --rpc-url $RPC_URL --private-key $SENDER_KEY cast send $CONTRACT_ADDRESS "requestTransfer(uint256)" 1000000 \ --rpc-url $RPC_URL --private-key $SENDER_KEY ``` Watch the decision land in the logs: ```bash theme={"dark"} goldsky compose logs ``` You should see `deposit received`, `screening complete ... risk score N`, then `transfer #0 APPROVED` (or a rejection warning) with an `oracleTxHash`. Confirm on-chain that the transfer's status is `1` (Approved) or `2` (Rejected), not `0`: ```bash theme={"dark"} cast call $CONTRACT_ADDRESS "transfers(uint256)(address,uint256,uint8)" 0 --rpc-url $RPC_URL ``` A fresh testnet wallet has no on-chain history, so Webacy scores it low and the transfer is approved. To exercise the reject path, screen a known-flagged address or test on mainnet where real risk data exists. ## Troubleshooting * **`approveTransfer`/`rejectTransfer` reverts with `not oracle`.** The Compose wallet's address doesn't match the contract's `oracle`. Both must derive from the same `ORACLE_PRIVATE_KEY`. Check that `cast call $CONTRACT_ADDRESS "oracle()(address)" --rpc-url $RPC_URL` equals `cast wallet address $ORACLE_PRIVATE_KEY`. * **`requestTransfer` reverts with "transfer amount exceeds allowance".** The sender didn't `approve` the escrow to spend their USDC first. * **Task never fires.** Confirm the `contract:` and `network:` in `compose.yaml` match where you deployed, and that `chain` in `constants.ts` agrees. Check the trigger is active with `goldsky compose status`. * **Webacy returns an empty response.** Check `WEBACY_API_KEY` is set as a secret and valid. Transient failures are absorbed by the task's `retry_config`. * **Edits don't take effect after redeploy.** Stale bundle cache: run `rm -rf .compose/` and redeploy. * **`insufficient funds for gas` on deploy.** Only the contract deploy needs gas on the oracle EOA. Fund it from a faucet; runtime callbacks are sponsored. ## Going to production ### Use Base mainnet and native USDC Skip MockUSDC and deploy `ComplianceGatedTransfer` with native USDC on Base (`0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`) as the `_usdc` constructor arg. Then update the chain in both places: `chain: "base"` in `src/lib/constants.ts` and `network: "base"` in `compose.yaml`. Real risk data also makes the reject path meaningful: flagged mainnet wallets will actually score above the threshold. ### The security model Each deployment binds one oracle address, fixed at construction. Only that key can release escrow, so never share `ORACLE_PRIVATE_KEY`, never commit it, and never log it. It exists only in your `.env` and as a Compose secret. If the key is compromised, rotate it: call `setOracle` from the old key with the new oracle address, update the `ORACLE_PRIVATE_KEY` secret, and redeploy. ### Tune the risk threshold `RISK_THRESHOLD` in `constants.ts` sets the cutoff on Webacy's 0-100 scale. A lower threshold rejects more aggressively; where to set it depends on your risk policy. The `transfer-audits` collection keeps the full screening result (score and triggered rules) for every decision, so you can review past decisions when calibrating. See [Compliance monitoring](/solutions/compliance-monitoring) for guidance on screening policies. ### Harden the reconciler The demo cron scans every transfer from ID 0 on each run and only logs. In production, track a cursor in a collection so each run scans only new transfers, and consider having the reconciler re-screen and resolve stale `Pending` transfers itself rather than just alerting. ## Resources * [Compose introduction](/compose/introduction) * [Task triggers](/compose/task-triggers) * [Wallets and secrets](/compose/secrets) * [Collections](/compose/context/collections) * [Compliance monitoring](/solutions/compliance-monitoring) * [Webacy developer docs](https://developers.webacy.co) # Build a corporate-actions distributor Source: https://docs.goldsky.com/compose/guides/build-a-corporate-actions-distributor Pay N share-token holders pro-rata for a tokenized corporate action (dividend, coupon, rebate, airdrop) using Compose to orchestrate an on-demand Goldsky Turbo pipeline as the snapshot subroutine This guide walks you through building a corporate-actions distributor: an HTTP-triggered Compose task that snapshots holders of a share token at an operator-supplied record block, then pays each holder their pro-rata share of an escrowed USDC pool. Compose orchestrates Goldsky Turbo as an ephemeral, on-demand subroutine. When a campaign is declared, the task spawns a one-shot [job-mode](/turbo-pipelines/job-mode) pipeline to snapshot holders, waits for it to finish, pays each holder, and deletes the pipeline. There is no always-on indexing. ## How it works ```mermaid theme={"dark"} flowchart LR Op([Operator]) -->|POST campaignId, recordBlock, totalAmount| T[declare_campaign task] T -->|1. approve + declare| C[DistributionCampaign.sol] T -->|2. POST /api/v1/pipelines| P[Turbo job-mode pipeline] P -->|3. backfill Transfers| DB[(share_balances_id
per-campaign table)] T -->|4. poll /state every 2s| P T -->|5. read snapshot via SQL| DB T -->|6. pay each holder (25 concurrent)| C T -->|7. read escrowRemaining| C T -->|8. DELETE pipeline + drop table| P ``` One HTTP request drives the entire lifecycle. No cron, no off-chain handoff: 1. The operator declares a distribution by `POST`ing `{ campaignId, recordBlock, totalAmount }`. The task validates `recordBlock <= currentBlock`, approves USDC, and calls `DistributionCampaign.declare()`, which atomically pulls the escrow. 2. The same task spawns a job-mode Turbo pipeline filtered to the share-token contract over `block_number BETWEEN AND `. The planner prunes everything outside that window. The sink writes raw `Transfer` rows into a per-campaign Postgres table. 3. The task polls `/state` every 2 seconds until the pipeline reports `completed` (or its k8s deployment auto-cleans up after a successful run, which we infer from `state=unknown` plus the table having rows). 4. The task reads the snapshot with a SQL aggregate over the raw rows (`SUM(credits) - SUM(debits)` per account) and computes pro-rata. Each holder gets `floor(balance × totalAmount / totalSupply)`. The floor remainder goes to the last holder so the sum equals `totalAmount` exactly. 5. The task fires up to 25 sponsored `pay()` calls concurrently via `Promise.allSettled`. Already-paid holders are filtered out by an on-chain `isPaid()` read first. The contract's `require(!paid[id][holder])` guard means duplicates are structurally impossible anyway. 6. The task re-reads `escrowRemaining` on-chain to confirm completion. Zero means done: mark the campaign `complete`, `DELETE` the pipeline, drop the per-campaign table. Non-zero means the operator can re-POST the same `campaignId` to resume. Re-posting the same `campaignId` after any kind of failure picks up cleanly. The contract is the sole source of truth for "did this holder get paid?", so Compose's state machine never has to be. ## Prerequisites * [Goldsky CLI installed](/installation) * [Foundry](https://book.getfoundry.sh/getting-started/installation) for the contract deploys * A small amount of ETH on Base mainnet for the three contract deploys (around 0.0005 ETH) * A project API key for `goldsky compose deploy -t ` and a separate (or same) key set as the `GOLDSKY_PROJECT_KEY` secret so the running app can manage Turbo pipelines ## Project structure ```text theme={"dark"} corporate-actions/ ├── compose.yaml # 1 HTTP task; declares GOLDSKY_PROJECT_KEY secret ├── contracts/ │ ├── ShareToken.sol # Minimal ERC-20, pre-mints to 25 demo holders │ ├── MockUSDC.sol # 6-decimal mock with permissionless mint │ └── DistributionCampaign.sol # AlreadyPaid guard, escrow, audit events ├── scripts/ │ ├── seed-holders.json # 25 demo holders, uneven amounts │ └── deploy.sh # forge create x3 in one go └── src/ ├── lib/ │ ├── constants.ts # CONFIG, polling cadence, concurrency │ ├── turbo.ts # /api/v1/pipelines client + snapshot pipeline builder │ ├── db.ts # Neon HTTP /sql client (via context.fetch) │ └── driver.ts # state-machine driver: snapshot → paying → complete └── tasks/ └── declare-campaign.ts # HTTP trigger; drives full lifecycle inline ``` ## Step 1: Set up the project Clone the example repository: ```bash theme={"dark"} git clone https://github.com/goldsky-io/documentation-examples.git cd documentation-examples/compose/corporate-actions ``` ## Step 2: Understand the task `declare-campaign.ts` is the only task. It validates input, approves USDC, declares the campaign on-chain, spawns the pipeline, and drives the campaign through its state machine inside the HTTP request: ```typescript theme={"dark"} export async function main(context: TaskContext, params?: DeclareParams) { const { evm, collection } = context; // Idempotent on campaignId. A second POST drives an existing campaign // forward instead of declaring a new one. const campaigns = await collection("campaigns", [ { path: "status", type: "text" }, ]); const existing = await campaigns.getById(params.campaignId.toLowerCase()); if (existing) { await driveCampaign(context, campaigns, existing); return responseFor(existing, "resumed"); } // Approve + declare on-chain (atomic escrow pull). const wallet = await evm.wallet({ name: "corp-actions-operator", sponsorGas: true }); await wallet.writeContract(chain, payToken, "approve(address,uint256)", [campaignContract, totalAmount]); const { hash } = await wallet.writeContract(chain, campaignContract, "declare(bytes32,address,address,uint256)", [campaignId, payToken, shareToken, totalAmount]); // Spawn the snapshot pipeline. const pipeline = await createSnapshotPipeline(context, { campaignId, shareToken, recordBlock }); // Persist campaign metadata, then drive the campaign through // snapshot → paying → complete inline. await campaigns.setById(rowId, { ...campaign, status: "snapshotting", pipelineName: pipeline.name }); await driveCampaign(context, campaigns, campaign); return responseFor(campaign, "declared"); } ``` The lifecycle logic lives in `src/lib/driver.ts`. `driveCampaign` is a state-machine dispatcher: `snapshotting` polls the pipeline, then transitions to `paying`; `paying` reads the snapshot, fires `pay()` calls, then checks `escrowRemaining` to decide whether to mark `complete`. ### Key Compose features used * **Compose orchestrating Turbo** via the v1 pipelines REST API. The task spawns, polls, and deletes the pipeline from inside its own HTTP handler. * **Auto-provisioned hosted Neon DB.** Compose-cloud creates a per-app Neon project and a `CORPORATE_ACTIONS` project secret pointing at it. Turbo writes to that DB via the same secret. No glue code on either side. * **Gas-sponsored writes.** `sponsorGas: true` on `evm.wallet()` means the operator wallet never holds ETH. Goldsky pays gas for every `approve()` and `pay()`. * **`context.fetch` for everything external.** The Neon HTTP `/sql` client, the v1 pipelines API client, and the chain RPC reads all go through `context.fetch`. That's the only `--allow-net` egress path the task gets. * **Resumable on `campaignId`.** Compose's collection holds campaign metadata. The contract holds payment truth. Re-POSTing the same id drives the existing row forward. ## Step 3: Understand the contracts `DistributionCampaign.sol` is the core piece. It holds USDC in escrow, gates payouts on a per-holder `paid` bitmap, and emits a rich audit event: ```solidity theme={"dark"} struct Campaign { address operator; address payToken; address shareToken; uint256 totalAmount; uint256 escrowRemaining; uint256 declaredAt; bool declared; bool sealed; } function declare(bytes32 userId, address payToken, address shareToken, uint256 totalAmount) external; function pay(bytes32 id, address holder, uint256 amount, uint256 sharesAtSnapshot) external; function isPaid(bytes32 id, address holder) external view returns (bool); function seal(bytes32 id) external; // operator can recover unspent escrow event HolderPaid( bytes32 indexed id, address indexed holder, address indexed payToken, uint256 amount, uint256 sharesAtSnapshot ); ``` A holder can never be paid twice, regardless of what Compose does: ```solidity theme={"dark"} require(!paid[id][holder], "AlreadyPaid"); paid[id][holder] = true; campaigns[id].escrowRemaining -= amount; IERC20(payToken).transfer(holder, amount); ``` `ShareToken.sol` is a minimal ERC-20 that pre-mints to a demo holder set in its constructor. `MockUSDC.sol` is a 6-decimal mock with permissionless mint, so you can fund the operator without bridging real USDC. ## Step 4: Pre-create the operator wallet The operator wallet is the address that calls `declare()` and `pay()` on the contract. Provision it ahead of the deploy so you can hard-code its address into the contract's deployment if you want to restrict who can call `declare()`: ```bash theme={"dark"} goldsky compose wallet create corp-actions-operator --env cloud ``` The command prints the wallet address. Save it for the next step. ## Step 5: Deploy the contracts `scripts/deploy.sh` deploys all three contracts in one run. It reads `seed-holders.json` to pre-mint share-token balances to 25 demo addresses: ```bash theme={"dark"} PRIVATE_KEY=0x... ./scripts/deploy.sh ``` The script prints the three addresses and the ShareToken's deploy block. You need all four values in the next step. ## Step 6: Wire in the addresses Open `src/lib/constants.ts` and replace the four constants: ```typescript theme={"dark"} export const CONFIG = { chain: "base" as const, shareToken: "0x..." as Hex, // from step 5 payToken: "0x..." as Hex, // MockUSDC from step 5 campaignContract: "0x..." as Hex, // from step 5 shareTokenDeployBlock: 45654954, // block number printed by deploy.sh }; ``` `shareTokenDeployBlock` matters for performance. The job-mode source has to be set to `start_at: "earliest"` (the source-level `end_block` would make it non-hybrid and Turbo refuses to run). So we anchor the scan window in the SQL filter instead: `block_number BETWEEN AND `. The planner prunes everything outside that window before it touches a row. ## Step 7: Set the project secret The running compose app needs a Goldsky project API key so it can spawn, poll, and delete Turbo pipelines via the v1 API. Set it once: ```bash theme={"dark"} goldsky secret create GOLDSKY_PROJECT_KEY ``` You don't have to create the `CORPORATE_ACTIONS` secret. Compose-cloud provisions a Neon DB for the app on first deploy and creates that secret for you, pointed at the new DB. ## Step 8: Deploy to Goldsky ```bash theme={"dark"} goldsky compose deploy ``` The compose-cloud deploy will: 1. Provision a hosted Neon DB for the app. 2. Create the `CORPORATE_ACTIONS` project secret pointed at it. 3. Build and start the task pod. The HTTP trigger is now reachable at `https://api.goldsky.com/api/admin/compose/v1/corporate-actions/tasks/declare_campaign`. ## Step 9: Declare a campaign and verify Fund the operator wallet with MockUSDC (the address was printed at the end of `goldsky compose wallet create`): ```bash theme={"dark"} cast send "mint(address,uint256)" 1000000000000 \ --rpc-url https://mainnet.base.org --private-key $PRIVATE_KEY ``` That mints 1,000,000 mUSDC, enough for many demo campaigns. Pick a record block past finality, then POST: ```bash theme={"dark"} RECORD_BLOCK=$(cast block-number --rpc-url https://mainnet.base.org) RECORD_BLOCK=$((RECORD_BLOCK - 32)) curl -sX POST "https://api.goldsky.com/api/admin/compose/v1/corporate-actions/tasks/declare_campaign" \ -H "content-type: application/json" \ -H "Authorization: Bearer $GOLDSKY_TOKEN" \ -d "{ \"campaignId\": \"0x000000000000000000000000000000000000000000000000000000000000c0a1\", \"recordBlock\": $RECORD_BLOCK, \"totalAmount\": \"10000000000\" }" ``` That declares a 10,000 mUSDC distribution. The request stays open for roughly 10 to 30 seconds while compose snapshots, computes pro-rata, and fires the 25 `pay()` calls in a single batch. The response body includes the final campaign state (`complete` on the happy path, or `paying` if it needs another drive call). Verify on-chain: ```bash theme={"dark"} cast call "getCampaign(bytes32)" \ --rpc-url https://mainnet.base.org ``` `escrowRemaining` is exactly 0 once all 25 holders are paid. The full audit trail is in the contract's `HolderPaid` events. ## Crash-safety walkthrough The contract is the source of truth for "did this holder get paid?". Compose can crash any time and restart any time without double-paying or skipping a holder. To verify: 1. POST a fresh campaign (new `campaignId`). 2. Mid-flight, pause the compose app: `goldsky compose pause`. 3. Resume: `goldsky compose resume`. 4. Re-POST the same `campaignId`. Within a single drive call, every remaining holder gets paid. There are zero duplicates on-chain. Verify by counting `HolderPaid` events for the campaign. What's protecting you: * **Compose's collection only stores campaign metadata** (status, declareTxHash, pipelineName, persisted payouts). It does not cache per-holder paid state, so there's no off-chain table that can diverge from on-chain truth. * **Per-holder `isPaid()` check before each `pay()` call.** Already-paid holders are skipped before the tx is even attempted. * **The contract's `require(!paid[id][holder], "AlreadyPaid")` guard.** Even if a stale tx arrives after restart, the contract rejects it. Double-pay is structurally impossible regardless of compose's state. A pod kill mid-snapshot is also recoverable. Re-POSTing the same `campaignId` polls the existing pipeline. If the pipeline auto-cleaned up after success, we infer completion from the agg table having rows. ## Customization ### Why operator-supplied `recordBlock` In real corporate actions, the record date is set in advance and is the cutoff for who gets the payout. The snapshot is by definition backwards-looking. So the operator passes an explicit `recordBlock`, typically a block past finality like `currentBlock - 32`. The pipeline backfills exactly that range and commits the snapshot. There's no live "wait for finality" gate inside compose. The operator already accommodated finality when they chose the block. Future-dated record blocks (declare today, snapshot tomorrow) are a real corporate-action feature but out of scope for this demo. ### Swap the share token Update `CONFIG.shareToken` and `CONFIG.shareTokenDeployBlock` in `src/lib/constants.ts` and redeploy the compose app. Each campaign's pipeline bakes in the address at declare time, so existing campaigns are unaffected. ### Add a chain Add a `chain` discriminator to `Campaign` and `DeclareParams`, populate `CONFIG` with a per-chain map, and pass `chain` into `buildSnapshotPipeline` so the dataset name (`base.erc20_transfers` vs `arbitrum.erc20_transfers`) is parameterized. ### Use real USDC Replace `MockUSDC.sol` with the real USDC address per chain in `CONFIG.payToken`. Real USDC isn't fee-on-transfer, so `escrowRemaining` math is exact. ### Tune concurrency `CONCURRENCY` in `src/lib/constants.ts` is the upper bound on parallel `pay()` calls. The gas-sponsored bundler caps per-sender throughput around 1 to 5 userOps per second; the default of 25 is sized for the demo's 25-holder set firing in one visible batch. For larger distributions, drop it to keep the bundler happy. ## When NOT to use this pattern This is push-based pro-rata. It scales comfortably up to roughly 100 holders per request. Beyond that, the right shape is a **merkle-claim contract** instead: the operator publishes one merkle root and holders pull. The compose plumbing (orchestrating Turbo for the snapshot, computing pro-rata, building the audit trail) carries over to either model. Only the on-chain shape changes. ## Resources * [Compose introduction](/compose/introduction) * [Task triggers](/compose/task-triggers) * [EVM wallets & gas sponsoring](/compose/context/evm/wallets) * [Turbo job-mode pipelines](/turbo-pipelines/job-mode) * [CMTAT IncomeVault](https://github.com/CMTA/IncomeVault), Swiss-bank reference implementation for tokenized-equity dividends. The example's event schema is anchored on this convention. * [ERC-1726 Dividend-Paying Token](https://github.com/Roger-Wu/erc1726-dividend-paying-token) * [GitHub repository](https://github.com/goldsky-io/documentation-examples/tree/main/compose/corporate-actions) # Build a multi-chain NAV oracle Source: https://docs.goldsky.com/compose/guides/build-a-nav-oracle Publish a tokenized fund's Net Asset Value to multiple chains on a schedule, with a Chainlink-compatible on-chain interface and an operator kill-switch This guide walks you through building a Proof-of-Reserves / NAV oracle for a tokenized RWA fund. A single Compose task runs every 5 minutes, fetches a structured NAV bundle from a custodian endpoint, and publishes it to `ReserveAggregator` contracts on Base Sepolia and Arbitrum Sepolia in one run. The on-chain contract implements `AggregatorV3Interface`, so any existing Chainlink consumer can read it unchanged. ## How it works ```mermaid theme={"dark"} flowchart LR A[Cron Trigger] -->|every 5 min| B[Compose Task] B -->|GET| C[Custodian Endpoint] C -->|"{totalNav, cash, tbills, repo, asOf, ripcord}"| B B -->|updateNav| D[ReserveAggregator on Base Sepolia] B -->|updateNav| E[ReserveAggregator on Arbitrum Sepolia] ``` Each cycle: 1. **Fetch** the NAV bundle from a custodian JSON endpoint. If the response carries `ripcord: true`, the task logs a skip message and returns without publishing. 2. **Scale** human USD numbers to 18-decimal fixed point, matching Chainlink's convention for USD-denominated feeds. 3. **Publish** to both chains independently via `Promise.allSettled`. A failure on one chain does not block the other. The next cron cycle reconciles. ## Prerequisites * [Goldsky CLI installed](/installation) * [Foundry](https://book.getfoundry.sh/getting-started/installation) for contract deploys * Testnet ETH on Base Sepolia and Arbitrum Sepolia to deploy the contracts ## Project structure ```text theme={"dark"} nav-oracle/ ├── compose.yaml # 1 cron task, 2 chains ├── mock-custodian.json # Default data source (swap for your API) ├── contracts/ │ └── ReserveAggregator.sol # AggregatorV3Interface-compatible publisher └── src/ ├── lib/ │ └── scaling.ts # USD → 18-decimal bigint helper └── tasks/ └── nav-oracle.ts # The cron task ``` ## Step 1: Set up the project Clone the example repository: ```bash theme={"dark"} git clone https://github.com/goldsky-io/documentation-examples.git cd documentation-examples/compose/nav-oracle ``` ## Step 2: Understand the task `nav-oracle.ts` fetches the bundle, validates the ripcord, and publishes to both chains: ```typescript theme={"dark"} import type { TaskContext } from "compose"; import { toScaled18 } from "../lib/scaling"; const CUSTODIAN_URL = "https://raw.githubusercontent.com/goldsky-io/documentation-examples/main/compose/nav-oracle/mock-custodian.json"; const BASE_SEPOLIA_AGGREGATOR = "0x8099A30Ac752f86C77A0e0210085a908ba6d02fE"; const ARBITRUM_SEPOLIA_AGGREGATOR = "0x02D9Df62B7AED15739D638B92BAcEA2ce4Cb3d70"; export async function main(context: TaskContext) { const { fetch, evm } = context; // sponsorGas: true lets Goldsky pay gas for every write, so the publisher // wallet never needs to be funded. const wallet = await evm.wallet({ name: "nav-oracle-publisher", sponsorGas: true, }); const bundle = await fetch(CUSTODIAN_URL, { max_attempts: 3, initial_interval_ms: 1000, backoff_factor: 2, }); // Ripcord: operator kill-switch. Skip cleanly — not an error. if (bundle.ripcord) { console.log(`Ripcord engaged for ${bundle.accountName} — skipping publish.`); return { success: true, skipped: "ripcord" }; } const args = [ toScaled18(bundle.cash), toScaled18(bundle.tbills), toScaled18(bundle.repo), toScaled18(bundle.totalNav), BigInt(Math.floor(new Date(bundle.asOf).getTime() / 1000)), ]; const signature = "updateNav(uint256,uint256,uint256,uint256,uint64)"; const results = await Promise.allSettled([ wallet.writeContract(evm.chains.baseSepolia, BASE_SEPOLIA_AGGREGATOR, signature, args), wallet.writeContract(evm.chains.arbitrumSepolia, ARBITRUM_SEPOLIA_AGGREGATOR, signature, args), ]); // ... (summarize per-chain results, throw only if both failed) } ``` ### Key Compose features used * **Multi-chain writes from a single task**: one `wallet.writeContract` call per chain, issued in parallel via `Promise.allSettled`. * **`sponsorGas: true`**: the publisher wallet is a Compose-managed Privy wallet whose transactions are gas-sponsored by Goldsky. No ETH needed on the publisher ever. * **`context.fetch`**: retries the custodian call with exponential backoff before surfacing a failure. * **Ripcord pattern**: the data source itself carries a boolean kill-switch the operator can flip out-of-band. Useful when the upstream has a known issue and you want the oracle to pause without a redeploy. ## Step 3: Understand the contract `ReserveAggregator.sol` is a single-operator, `AggregatorV3Interface`-compatible publisher. The full bundle is stored in one struct; the scalar `totalNav` is exposed via the standard Chainlink reader so existing consumers work unchanged: ```solidity theme={"dark"} function latestRoundData() external view returns ( uint80 roundId, int256 answer, // totalNav scaled to 18 decimals uint256 startedAt, // asOf from the bundle uint256 updatedAt, uint80 answeredInRound ); function latestBundle() external view returns (NavBundle memory); function updateNav( uint256 cash, uint256 tbills, uint256 repo, uint256 totalNav, uint64 asOf ) external; // onlyPublisher ``` Only the `publisher` address set in the constructor can call `updateNav`. That address is your Compose-managed wallet. ## Step 4: Pre-create the publisher wallet Compose's wallet-create command provisions the named wallet in the cloud and prints its address, so you can pass that address as the `publisher` constructor argument before you deploy the contracts: ```bash theme={"dark"} goldsky compose wallet create nav-oracle-publisher --env cloud ``` The command prints the wallet address to stdout. Save it for the next step. ## Step 5: Deploy `ReserveAggregator` on both chains Deploy to Base Sepolia: ```bash theme={"dark"} forge create contracts/ReserveAggregator.sol:ReserveAggregator \ --rpc-url https://sepolia.base.org \ --private-key $PRIVATE_KEY \ --broadcast --root . \ --constructor-args 0xYOUR_PUBLISHER_ADDRESS "Example RWA Fund I NAV / USD" ``` And Arbitrum Sepolia: ```bash theme={"dark"} forge create contracts/ReserveAggregator.sol:ReserveAggregator \ --rpc-url https://sepolia-rollup.arbitrum.io/rpc \ --private-key $PRIVATE_KEY \ --broadcast --root . \ --constructor-args 0xYOUR_PUBLISHER_ADDRESS "Example RWA Fund I NAV / USD" ``` Record both deployed addresses. `--broadcast` must come *before* `--constructor-args`: forge treats `--constructor-args` as variadic, so any flag that follows it gets consumed as another positional argument and the transaction is never sent. ## Step 6: Wire in the addresses Open `src/tasks/nav-oracle.ts` and replace the two address constants near the top with the ones you just deployed: ```typescript theme={"dark"} const BASE_SEPOLIA_AGGREGATOR = "0x..."; // from step 5 const ARBITRUM_SEPOLIA_AGGREGATOR = "0x..."; // from step 5 ``` ## Step 7: Deploy to Goldsky ```bash theme={"dark"} goldsky compose deploy ``` The task fires on the next 5-minute boundary. Watch it: ```bash theme={"dark"} goldsky compose logs ``` You should see a line like: ```text theme={"dark"} Published Example RWA Fund I NAV=$50,825,000 — base:ok, arb:ok ``` Verify on-chain by reading back `latestRoundData()`: ```bash theme={"dark"} cast call --rpc-url https://sepolia.base.org 0xYOUR_BASE_ADDRESS \ "latestRoundData()(uint80,int256,uint256,uint256,uint80)" ``` The `answer` field is the total NAV scaled to 18 decimals; `updatedAt` is the custodian's `asOf` timestamp. ## Customization ### Swap the data source Change `CUSTODIAN_URL` to your own endpoint. Your API must return: ```json theme={"dark"} { "accountName": "Your Fund", "asOf": "2026-04-22T14:00:00Z", "cash": 125000.00, "tbills": 42500000.00, "repo": 8200000.00, "totalNav": 50825000.00, "ripcord": false } ``` Amounts are human-readable USD. The task scales to 18 decimals before writing on-chain. ### Add or swap chains Add another `wallet.writeContract(...)` inside the `Promise.allSettled` block, targeting a different `evm.chains.` and contract address: ```typescript theme={"dark"} wallet.writeContract(evm.chains.optimismSepolia, OP_SEPOLIA_AGGREGATOR, signature, args), ``` Deploy a matching `ReserveAggregator` to that chain first. ### Change the publish cadence Real Proof-of-Reserves / NAV feeds typically publish hourly or daily. Change the cron expression in `compose.yaml`: ```yaml theme={"dark"} triggers: - type: "cron" expression: "0 * * * *" # every hour ``` ### Use the ripcord Any host can flip the kill-switch by returning `"ripcord": true` from the custodian endpoint. The next task run logs `Ripcord engaged …` and skips the publish without erroring, so Compose's retry logic is not triggered. Flip it back to `false` and publishing resumes on the following cycle. ### Rotate the publisher If you need to re-create the Compose wallet or move to a different key, call `setPublisher(newAddress)` from the current publisher. The old wallet loses `updateNav` permissions; only the new one can publish. ## Resources * [Compose introduction](/compose/introduction) * [Task triggers](/compose/task-triggers) * [EVM wallets & gas sponsoring](/compose/context/evm/wallets) * [Chainlink `AggregatorV3Interface` reference](https://docs.chain.link/data-feeds/api-reference#aggregatorv3interface) * [GitHub repository](https://github.com/goldsky-io/documentation-examples/tree/main/compose/nav-oracle) # Build a Polymarket copy-trader Source: https://docs.goldsky.com/compose/guides/build-a-polymarket-copy-trader Mirror Polymarket wallets' trades automatically using Compose and Turbo with a webhook pipeline This guide walks you through building a Polymarket copy-trading bot. A Turbo pipeline decodes on-chain `OrderFilled` events, filters them to a configurable set of wallets, and webhooks each fill into a Compose app that signs and submits the same trade to the Polymarket CLOB. Winning shares auto-redeem on a 5-minute cron. It demonstrates the Turbo → Compose webhook pattern, cron triggers, sponsored-gas wallets, `ctx.fetch` for external APIs, and collection-based state. The example targets [Polymarket V2](https://docs.polymarket.com/v2-migration) (cutover 2026-04-28). V2 introduced new Exchange contracts on Polygon, switched collateral from USDC.e to **pUSD** (a 1:1 ERC-20 backed by USDC.e), and ships a new SDK at `@polymarket/clob-client-v2`. Funding still happens in USDC.e. The `setup_approvals` task wraps it into pUSD via the Collateral Onramp. ## How it works ```mermaid theme={"dark"} flowchart LR A[Polygon on-chain] -->|"OrderFilled events"| B[Turbo Pipeline] B -->|"decode + filter to watched wallets"| B B -->|"webhook per fill"| C[Compose: copy_trade] C -->|"sign + POST order"| D[Fly.io Proxy] D -->|"forward to CLOB"| E[Polymarket CLOB] F[Cron every 5m] --> G[Compose: redeem] G -->|"redeemPositions"| H[ConditionalTokens contract] ``` 1. **Polygon** emits `OrderFilled` from the V2 CTF Exchange (`0xE111…996B`) and V2 NegRisk Exchange (`0xe222…0F59`) contracts 2. **Turbo pipeline** decodes fills, keeps only trades where maker or taker is in your watched list, and posts each to a Compose HTTP task 3. **`copy_trade`** parses the fill, checks the wallet's pUSD balance, looks up market metadata, signs a V2 FAK (Fill-and-Kill) order, and submits it via the Fly.io proxy (Polymarket's CLOB is geo-blocked from US hosts) 4. **`redeem`** runs every 5 minutes, polls Polymarket's data API for redeemable positions, and calls `redeemPositions` on-chain ## Prerequisites * [Goldsky CLI installed](/installation) * A Compose API token from your Goldsky project (for the webhook auth secret) * An EOA private key for the bot's wallet (no Polymarket UI onboarding or proxy wallet required) * USDC.e (`0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174`) on Polygon to fund the bot (the `setup_approvals` task wraps it into pUSD before trading) * A list of wallets you want to mirror (selecting them is out of scope for this guide) ## Project structure ```text theme={"dark"} copy-trader/ ├── compose.yaml # Compose app + env config ├── tsconfig.json # TypeScript config ├── package.json # npm deps (bundled by Compose CLI) ├── pipeline/ │ └── polymarket-ctf-events.yaml # Turbo pipeline → webhook sink └── src/ ├── lib/ │ ├── clob.ts # Polymarket CLOB client │ ├── gamma.ts # Market metadata lookups │ └── types.ts # Contract addresses + types └── tasks/ ├── copy_trade.ts # HTTP: mirror a fill ├── redeem.ts # Cron: redeem winning shares └── setup_approvals.ts # HTTP: one-time approvals ``` ## Step 1: Set up the project Clone the example repository and install dependencies: ```bash theme={"dark"} git clone https://github.com/goldsky-io/documentation-examples.git cd documentation-examples/compose/copy-trader npm install ``` The Compose CLI bundles tasks with esbuild against `node_modules/`, so `npm install` is required before `goldsky compose start` or `deploy`. ## Step 2: Pick wallets to copy and update both configs The pipeline pre-filters on-chain events to the watched list, so the same addresses must appear in two places. In `compose.yaml`: ```yaml theme={"dark"} env: cloud: WATCHED_WALLETS: "0xwhale1,0xwhale2" ``` In `pipeline/polymarket-ctf-events.yaml`, update the `watched_fills` transform: ```yaml theme={"dark"} watched_fills: type: sql primary_key: id sql: | SELECT * FROM order_fills WHERE maker IN ( '0xwhale1', '0xwhale2' ) OR taker IN ( '0xwhale1', '0xwhale2' ) ``` ## Step 3: Set the wallet private key The Compose app signs CLOB orders as an EOA. No Polymarket proxy wallet is involved: ```bash theme={"dark"} goldsky compose secret set PRIVATE_KEY --value "0x..." ``` ## Step 4: Create the webhook auth secret The Turbo webhook authenticates to your Compose app with a Goldsky-level secret. This is a one-time setup per project: ```bash theme={"dark"} goldsky secret create --name COMPOSE_WEBHOOK_AUTH \ --value '{"type": "httpauth", "secretKey": "Authorization", "secretValue": "Bearer YOUR_COMPOSE_API_TOKEN"}' ``` The pipeline references this secret by name in its webhook sink, so every pipeline in the project can reuse it. ## Step 5: Deploy the app and pipeline ```bash theme={"dark"} goldsky compose deploy goldsky turbo apply pipeline/polymarket-ctf-events.yaml ``` The pipeline starts at the latest Polygon block, so fills produced before you deployed will not be backfilled. ## Step 6: Fund the wallet Send USDC.e to the EOA that corresponds to the private key from step 3. Compose sponsors gas on all on-chain calls, so you do not need MATIC in the wallet. ## Step 7: Grant approvals and wrap collateral V2 markets settle in pUSD, so the bot needs to (a) approve the Collateral Onramp to spend USDC.e, (b) wrap the wallet's USDC.e balance into pUSD, and (c) approve pUSD + ConditionalTokens to both V2 Exchanges. The `setup_approvals` task does all of this in one call. Compose sponsors every transaction: ```bash theme={"dark"} curl -X POST -H "Authorization: Bearer $COMPOSE_TOKEN" \ https://api.goldsky.com/api/admin/compose/v1/copy-trader/tasks/setup_approvals ``` The task is idempotent: re-call it after every USDC.e top-up to wrap the new balance. Approvals are max-allowance, so re-approving is a cheap no-op. The bot begins trading as soon as the next fill on a watched wallet lands in the pipeline. ## Understanding the code ### Parsing a fill V2's `OrderFilled` event encodes the maker's side as a `uint8` (`0 = BUY`, `1 = SELL`) and exposes a single `tokenId` instead of the V1 maker/taker asset-id pair. The whale we want to copy can be the maker or the taker (the taker takes the opposite side): ```typescript theme={"dark"} function parseFill( row: OrderFillRow, watchedWallets: Set ): { side: "BUY" | "SELL"; tokenId: string; whalePrice: number } { const makerIsWhale = watchedWallets.has(row.maker.toLowerCase()); const takerIsWhale = watchedWallets.has(row.taker.toLowerCase()); // Maker's side as encoded in the event: "0" = BUY, "1" = SELL. const makerSide: "BUY" | "SELL" = row.side === "0" ? "BUY" : "SELL"; const oppositeSide: "BUY" | "SELL" = makerSide === "BUY" ? "SELL" : "BUY"; const whaleSide = makerIsWhale ? makerSide : oppositeSide; // Price = pUSD per share. Layout depends on the maker's side. // makerSide = BUY: makerAmount = pUSD, takerAmount = shares // makerSide = SELL: makerAmount = shares, takerAmount = pUSD const usdcAmount = makerSide === "BUY" ? row.maker_amount : row.taker_amount; const sharesAmount = makerSide === "BUY" ? row.taker_amount : row.maker_amount; const price = sharesAmount > 0 ? usdcAmount / sharesAmount : 0; return { side: whaleSide, tokenId: row.token_id, whalePrice: price, }; } ``` ### On-chain balance as source of truth Before every BUY, the task reads pUSD balance directly from Polygon rather than keeping a local counter. pUSD has 6 decimals (matching USDC.e): ```typescript theme={"dark"} const balResp = (await ctx.fetch("https://polygon-bor-rpc.publicnode.com", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ jsonrpc: "2.0", method: "eth_call", params: [ { to: "0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB", // pUSD data: "0x70a08231000000000000000000000000" + address.slice(2).toLowerCase(), }, "latest", ], id: 1, }), })) as { result?: string }; const pusdBalance = balResp?.result ? Number(BigInt(balResp.result)) / 1e6 : 0; if (pusdBalance < 1.1) { return { status: "BALANCE_LOW", balance: pusdBalance }; } ``` A local budget collection would drift out of sync with the real wallet after redemptions, unsponsored gas, or manual top-ups. Reading the chain avoids that entirely. ### Signing and submitting via `ctx.fetch` Polymarket's `@polymarket/clob-client-v2` SDK uses axios for HTTP, which fails under Compose's task runtime because task binaries run without `--allow-net`. The template reuses the SDK's pure signing utilities (local crypto only) and routes every HTTP call through `ctx.fetch`. The `version: 2` argument selects the V2 Exchange domain and order struct (V2 fees are computed on-chain, so they are no longer signed): ```typescript theme={"dark"} import { OrderBuilder, Side, OrderType, SignatureTypeV2, createL2Headers, orderToJsonV2, } from "@polymarket/clob-client-v2"; const builder = new OrderBuilder(wallet, 137, SignatureTypeV2.EOA); // Build + sign locally (no HTTP) const signedOrder = await builder.buildMarketOrder( { tokenID, price, amount, side: Side.BUY }, { tickSize, negRisk }, 2 // V2 order version ); // Submit through ctx.fetch → Fly proxy → CLOB const body = orderToJsonV2(signedOrder, creds.key, OrderType.FAK); const bodyStr = JSON.stringify(body); const l2Headers = await createL2Headers(wallet, creds, { method: "POST", requestPath: "/order", body: bodyStr, }); const resp = await ctx.fetch(`${host}/order`, { method: "POST", headers: { ...l2Headers, "Content-Type": "application/json" }, body: bodyStr, }); ``` `ctx.fetch` is host-mediated, which means it has network access even though the task itself does not. This is the general pattern for calling external APIs from a Compose task. See [calling external APIs](/compose/context/fetch) for more. ### Why the Fly.io proxy Polymarket's CLOB API geo-blocks the US. Compose tasks run from `us-west`. The template points `CLOB_HOST` at a shared Goldsky-hosted Fly.io proxy in Amsterdam that forwards every request from an EU IP. If you want to isolate yourself from the shared proxy, deploy your own copy of [`fly-polymarket-proxy`](https://github.com/goldsky-io/fly-polymarket-proxy) and update `CLOB_HOST` in `compose.yaml`. ## Key Compose features used * **Turbo → Compose webhook pattern**: a pipeline sinks decoded on-chain events directly to an HTTP task via a `COMPOSE_WEBHOOK_AUTH` secret * **`ctx.fetch`**: all outbound HTTP (CLOB, Gamma, Polymarket data API, Polygon RPC) goes through Compose's host-mediated fetch * **`ctx.evm.wallet` with `sponsorGas: true`**: approvals and redemptions use a Compose-sponsored wallet so the EOA does not need MATIC * **Cron triggers**: the `redeem` task runs every 5 minutes via `0 */5 * * * *` * **`ctx.collection`**: `positions` and `trades` collections persist bot state across invocations * **Compose secrets**: the wallet private key is stored via `goldsky compose secret set`, not baked into the manifest ## Customization ### Trade size The default is Polymarket's \$1 minimum notional. Raise it in `compose.yaml`: ```yaml theme={"dark"} TRADE_AMOUNT_USD: "10" ``` ### Different markets The pipeline filters by address only, so it picks up every fill on the CTF Exchange and NegRisk Exchange. To scope to a specific market type (e.g. a particular event's outcomes), add a `token_id` filter to the `watched_fills` transform. ### Your own proxy `CLOB_HOST` defaults to the Goldsky-hosted Fly proxy. To isolate from it, deploy [`fly-polymarket-proxy`](https://github.com/goldsky-io/fly-polymarket-proxy) yourself and point `CLOB_HOST` at your deployment. ## Resources * [Compose introduction](/compose/introduction) * [Turbo introduction](/turbo-pipelines/introduction) * [Task triggers](/compose/task-triggers) * [Calling external APIs](/compose/context/fetch) * [Collections](/compose/context/collections) * [Secrets](/compose/secrets) * [GitHub repository](https://github.com/goldsky-io/documentation-examples/tree/main/compose/copy-trader) # Build a binary prediction market Source: https://docs.goldsky.com/compose/guides/build-a-prediction-market Build a binary prediction market on Gnosis ConditionalTokens using Compose, CoinGecko, and multi-task orchestration This guide walks you through building a self-contained binary prediction market on [Gnosis ConditionalTokens (CTF)](https://docs.gnosis.io/conditionaltokens/). A single cron orchestrator runs every 5 minutes, fetches the current BTC/USD price, resolves the previous cycle's market, and prepares a new one for the next 5-minute bucket. It demonstrates multi-task orchestration, `callTask` fan-out, Compose-managed wallets as on-chain oracles, and idempotent chain writes. ## How it works ```mermaid theme={"dark"} flowchart LR A[Cron Trigger] -->|"every 5 min"| B[orchestrator] B -->|callTask| C[market_data] C -->|"BTC/USD price"| D[CoinGecko API] B -->|callTask| E[launch_market] B -->|callTask| F[resolve_market] E -->|prepareCondition| G[Gnosis CTF on Base Sepolia] F -->|reportPayouts| G B -->|"persist state"| H[Collection] ``` Each 5-minute cycle: 1. **`market_data`** fetches the current BTC/USD price from CoinGecko. 2. **`resolve_market`** reports payouts for any market whose `endTime` has passed. Outcome is `[1, 0]` (UP) if the current price is at or above the market's `openPrice`, else `[0, 1]` (DOWN). 3. **`launch_market`** prepares a new condition on the CTF for the current 5-minute bucket, using the same fetched price as the new market's `openPrice`. One price fetch per cycle serves both purposes: the closing tick of the expiring market sits at the same moment as the opening tick of the new one. ## Prerequisites * [Goldsky CLI installed](/installation) ## Project structure ```text theme={"dark"} prediction-market/ ├── compose.yaml # 1 cron + 4 callable tasks ├── package.json # viem dependency ├── tsconfig.json # Compose path alias ├── src/ │ ├── lib/ │ │ ├── constants.ts # Chain, CTF address, wallet name, salt │ │ ├── types.ts # Market type │ │ └── utils.ts # questionId derivation, wallet helper │ └── tasks/ │ ├── orchestrator.ts # Cron: fetch → resolve → launch │ ├── market-data.ts # HTTP: CoinGecko │ ├── launch-market.ts # Chain: prepareCondition │ ├── resolve-market.ts # Chain: reportPayouts │ └── generate-wallet.ts # HTTP: returns oracle address ``` ## Step 1: Set up the project Clone the example repository: ```bash theme={"dark"} git clone https://github.com/goldsky-io/documentation-examples.git cd documentation-examples/compose/prediction-market npm install ``` ## Step 2: Understand the orchestrator `orchestrator.ts` is the only task with a cron trigger. It fans out to the three worker tasks via `context.callTask`: ```typescript theme={"dark"} import type { TaskContext } from "compose"; import { ASSET_PAIR, DURATION_SEC } from "../lib/constants"; import type { Market } from "../lib/types"; import { computeQuestionId, floorToMarketStart } from "../lib/utils"; import type { TaskPayload as LaunchPayload } from "./launch-market"; import type { TaskPayload as ResolvePayload } from "./resolve-market"; import type { ResponsePayload as PriceData } from "./market-data"; export async function main(context: TaskContext) { const { collection, callTask } = context; const nowMs = Date.now(); const currentMarketStart = floorToMarketStart(nowMs); const markets = await collection("markets", [ { path: "endTime", type: "numeric" }, { path: "resolved", type: "boolean" }, ]); // One HTTP hit — used for BOTH the closePrice of the expiring market // AND the openPrice of the new one (same 5-min boundary). const { priceUsd } = await callTask, PriceData>( "market_data", {}, ); // Resolve any overdue, unresolved markets. const overdue = await markets.findMany({ endTime: { $lte: nowMs }, resolved: false, }); for (const market of overdue) { const close = market.closePrice ?? priceUsd; // Snapshot closePrice before the chain call so retries produce a // deterministic outcome even if prices move between attempts. if (market.closePrice === undefined) { await markets.setById(market.questionId, { ...market, closePrice: close }); } await callTask("resolve_market", { market: { ...market, closePrice: close }, }); } // Launch the market for the current 5-min bucket if it doesn't exist yet. const currentQid = computeQuestionId({ assetPair: ASSET_PAIR, durationSec: DURATION_SEC, startTimestampSec: Math.floor(currentMarketStart / 1000), }); if (!(await markets.getById(currentQid))) { await callTask("launch_market", { startTime: currentMarketStart, openPrice: priceUsd, }); } } ``` ### Key Compose features used * **`context.callTask`**: orchestrator delegates work to specialized child tasks with their own retry configs. * **`context.collection`**: persistent document storage indexed by `endTime` and `resolved` for fast lookup of overdue markets. * **`evm.wallet`**: a Compose-managed EOA named `prediction-market-oracle` serves as the CTF oracle. * **`context.fetch`**: CoinGecko HTTP request with built-in retries (see `market-data.ts`). * **`writeContract`**: raw ABI-signature calls for `prepareCondition` and `reportPayouts` on the CTF. ## Step 3: Understand the oracle pattern The Gnosis CTF requires an `oracle` address when a condition is prepared. Only that address can later call `reportPayouts` for the condition. In this example, the oracle is a Compose-managed EOA, the same wallet that signs both transactions: ```typescript theme={"dark"} // src/lib/utils.ts import type { TaskContext, IWallet } from "compose"; import { ORACLE_WALLET_NAME } from "./constants"; export function getOracleWallet(context: TaskContext): Promise { return context.evm.wallet({ name: ORACLE_WALLET_NAME }); } ``` ```typescript theme={"dark"} // src/tasks/launch-market.ts — prepareCondition uses the oracle as an input await oracle.writeContract( evm.chains[CHAIN], CTF_ADDRESS, "prepareCondition(address,bytes32,uint256)", [oracle.address, questionId, "2"], ); ``` ```typescript theme={"dark"} // src/tasks/resolve-market.ts — reportPayouts is signed by the oracle await oracle.writeContract( evm.chains[CHAIN], CTF_ADDRESS, "reportPayouts(bytes32,uint256[])", [market.questionId, payouts], ); ``` Because each deploy of this example produces a fresh oracle address, the conditions it creates on the shared CTF are namespaced cleanly: they never collide with any other user of the same CTF. ## Step 4: Understand questionId derivation Every CTF condition is keyed by a `questionId` the oracle chooses. This example derives one deterministically from the market parameters so retries always compute the same value: ```typescript theme={"dark"} // src/lib/utils.ts export function computeQuestionId(args: { assetPair: string; durationSec: number; startTimestampSec: number; }): Hex { return keccak256( concat([ stringToHex(SALT, { size: 32 }), stringToHex(args.assetPair, { size: 32 }), numberToHex(args.durationSec, { size: 32 }), numberToHex(args.startTimestampSec, { size: 32 }), ]), ); } ``` The `SALT` constant (`"GOLDSKY_COMPOSE_DEMO"`) scopes every questionId to this example. Change it if you fork the app for your own purposes. ## Step 5: Configure the Compose app `compose.yaml` declares one cron plus four callable tasks: ```yaml theme={"dark"} name: "prediction-market" api_version: "stable" tasks: - path: "./src/tasks/orchestrator.ts" name: "orchestrator" triggers: - type: "cron" expression: "10 */5 * * * *" retry_config: max_attempts: 3 initial_interval_ms: 500 backoff_factor: 1 - path: "./src/tasks/launch-market.ts" name: "launch_market" - path: "./src/tasks/resolve-market.ts" name: "resolve_market" - path: "./src/tasks/market-data.ts" name: "market_data" retry_config: max_attempts: 3 initial_interval_ms: 500 backoff_factor: 1 - path: "./src/tasks/generate-wallet.ts" name: "generate_wallet" triggers: - type: "http" authentication: "auth_token" ``` Only tasks with a `triggers` block can be invoked from outside the app. `launch_market`, `resolve_market`, and `market_data` are called exclusively via `context.callTask` from the orchestrator. ## Step 6: Deploy to Goldsky ```bash theme={"dark"} goldsky compose deploy ``` Compose sponsors gas by default, so the oracle wallet needs no funding. The first cron tick fires on the next 5-minute boundary. Watch the cycles: ```bash theme={"dark"} goldsky compose logs ``` Look for `cycle complete:` log lines and on-chain `ConditionPreparation` / `ConditionResolution` events on [BaseScan](https://sepolia.basescan.org/address/0xb04639fB29CC8D27e13727c249EbcAb0CDA92331), filtered by your oracle EOA (topic\[2]). To print the oracle EOA address: ```bash theme={"dark"} goldsky compose wallet list ``` ## Customization ### Change the asset Replace `BTC_USD` and the CoinGecko URL with any asset CoinGecko supports: ```typescript theme={"dark"} // src/lib/constants.ts export const ASSET_PAIR = "ETH_USD" as const; export const PRICE_URL = "https://api.coingecko.com/api/v3/simple/price?ids=ethereum&vs_currencies=usd"; ``` Update the response parsing in `market-data.ts` to read `response.ethereum.usd`. ### Change the market duration ```typescript theme={"dark"} // src/lib/constants.ts export const DURATION_SEC = 900; // 15 minutes export const DURATION_MS = DURATION_SEC * 1000; ``` Update the cron expression to match the new cadence: ```yaml theme={"dark"} triggers: - type: "cron" expression: "10 */15 * * * *" # every 15 minutes ``` ### Change the chain Swap `baseSepolia` for any other EVM testnet. You'll also need a deployed ConditionalTokens contract on that chain. See [Gnosis's ConditionalTokens repository](https://github.com/gnosis/conditional-tokens-contracts) to deploy your own if none exists there. ```typescript theme={"dark"} // src/lib/constants.ts export const CHAIN = "arbitrumSepolia" as const; export const CTF_ADDRESS = "0xYOUR_CTF_ADDRESS"; ``` ## Resources * [Compose introduction](/compose/introduction) * [Task triggers](/compose/task-triggers) * [Collections](/compose/context/collections) * [EVM wallets](/compose/context/evm/wallets) * [Gnosis ConditionalTokens](https://docs.gnosis.io/conditionaltokens/) * [CoinGecko API](https://www.coingecko.com/en/api) * [GitHub repository](https://github.com/goldsky-io/documentation-examples/tree/main/compose/prediction-market) # Build a VRF system Source: https://docs.goldsky.com/compose/guides/build-a-vrf-system Build an on-chain verifiable random function (VRF) system using Compose and drand This guide walks you through building a randomness delivery system using Compose and [drand](https://drand.love), a distributed randomness beacon. The system listens for on-chain randomness requests and fulfills them with drand values that anyone can verify off-chain against drand's BLS public key. This example stores the drand signature on-chain but does not verify the BLS signature inside the Solidity contract (on-chain BLS12-381 verification is expensive and out of scope for this guide). Consumers who need trustless randomness should either verify the signature off-chain before using the result, or add on-chain BLS verification to the contract. ## How it works ```mermaid theme={"dark"} flowchart LR A[Source Contract] -->|"emit event"| B[Compose Task] B -->|"fetch randomness"| C[drand API] C -->|"round, randomness, signature"| B B -->|"fulfillRandomness"| D[Target Contract] ``` 1. **Source contract** emits a `RandomnessRequested` event 2. **Compose task** is triggered by the on-chain event 3. **drand API** provides verifiable randomness with BLS signatures 4. **Target contract** records the randomness along with the drand round and signature so consumers can verify it off-chain ## Prerequisites * [Goldsky CLI installed](/installation) * [Foundry](https://book.getfoundry.sh/getting-started/installation) for contract deployment * A funded wallet on Base Sepolia ## Project structure ```text theme={"dark"} VRF/ ├── compose.yaml # Compose configuration ├── contracts/ │ └── RandomnessConsumer.sol # Example contract ├── src/ │ ├── contracts/ │ │ └── RandomnessConsumer.json # Contract ABI (for codegen) │ ├── lib/ │ │ └── drand.ts # drand API utilities │ └── tasks/ │ ├── generate-wallet.ts # Wallet generation utility │ ├── request-randomness.ts # HTTP endpoint for requests │ └── fulfill-randomness.ts # Main fulfillment task ``` ## Step 1: Set up the project Clone the example repository: ```bash theme={"dark"} git clone https://github.com/goldsky-io/documentation-examples.git cd documentation-examples/compose/VRF ``` ## Step 2: Generate contract types The project includes a `RandomnessConsumer.json` ABI in `src/contracts/`. Generate the typed contract class: ```bash theme={"dark"} goldsky compose codegen ``` This creates a typed `RandomnessConsumer` class that provides type-safe contract interaction instead of raw function signature strings. ## Step 3: Generate your Compose wallet Start Compose locally in one terminal: ```bash theme={"dark"} goldsky compose start --fork-chains ``` `--fork-chains` lets you run a smart wallet locally by forking supported chains with TEVM. You can also use a private key wallet for local development; see [Secrets](/compose/secrets) for how to store the key. In another terminal, get your wallet address: ```bash theme={"dark"} goldsky compose callTask generate_wallet '{}' --env local ``` Save the wallet address. This will be the authorized fulfiller for your contract. ## Step 4: Deploy the smart contract The `RandomnessConsumer.sol` contract handles randomness requests and fulfillment: ```solidity theme={"dark"} // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; contract RandomnessConsumer { struct RandomnessRequest { address requester; bool fulfilled; bytes32 randomness; uint64 round; bytes signature; } address public fulfiller; uint256 public nextRequestId; mapping(uint256 => RandomnessRequest) public requests; event RandomnessRequested(uint256 indexed requestId, address indexed requester); event RandomnessFulfilled(uint256 indexed requestId, bytes32 randomness, uint64 round, bytes signature); constructor(address _fulfiller) { fulfiller = _fulfiller; } function requestRandomness() external returns (uint256 requestId) { requestId = nextRequestId++; requests[requestId] = RandomnessRequest({ requester: msg.sender, fulfilled: false, randomness: bytes32(0), round: 0, signature: "" }); emit RandomnessRequested(requestId, msg.sender); } function fulfillRandomness( uint256 requestId, bytes32 randomness, uint64 round, bytes calldata signature ) external { require(msg.sender == fulfiller, "OnlyFulfiller"); RandomnessRequest storage request = requests[requestId]; require(request.requester != address(0), "RequestNotFound"); require(!request.fulfilled, "AlreadyFulfilled"); request.fulfilled = true; request.randomness = randomness; request.round = round; request.signature = signature; emit RandomnessFulfilled(requestId, randomness, round, signature); } } ``` Deploy to Base Sepolia: ```bash theme={"dark"} forge create contracts/RandomnessConsumer.sol:RandomnessConsumer \ --rpc-url https://sepolia.base.org \ --private-key $PRIVATE_KEY \ --broadcast \ --constructor-args 0xYOUR_COMPOSE_WALLET_ADDRESS ``` Save the deployed contract address. ## Step 5: Configure the Compose app Update `compose.yaml` with your contract address: ```yaml theme={"dark"} name: "compose-vrf" api_version: "stable" tasks: - path: "./src/tasks/generate-wallet.ts" name: "generate_wallet" triggers: - type: "http" authentication: "auth_token" - path: "./src/tasks/request-randomness.ts" name: "request_randomness" triggers: - type: "http" authentication: "auth_token" - path: "./src/tasks/fulfill-randomness.ts" name: "fulfill_randomness" triggers: - type: "onchain_event" network: "base_sepolia" contract: "0xYOUR_DEPLOYED_CONTRACT_ADDRESS" events: - "RandomnessRequested(uint256,address)" retry_config: max_attempts: 3 initial_interval_ms: 1000 backoff_factor: 2 ``` Update the contract address in the task files: * `src/tasks/fulfill-randomness.ts`: `TARGET_CONTRACT` * `src/tasks/request-randomness.ts`: `CONTRACT_ADDRESS` ## Step 6: Understand the fulfillment task The `fulfill-randomness.ts` task handles the core logic: ```typescript theme={"dark"} import { TaskContext, OnchainEvent } from "compose"; import { fetchLatestRandomness, toBytes32, toBytes, DRAND_CHAIN_INFO, } from "../lib/drand.ts"; const CONTRACT_ADDRESS = "0xYOUR_DEPLOYED_CONTRACT_ADDRESS"; export async function main(context: TaskContext, event?: OnchainEvent) { const { fetch, evm } = context; // Extract request ID from the event const requestId = event?.topics[1] ? BigInt(event.topics[1]) : 0n; // Fetch randomness from drand const drandResponse = await fetchLatestRandomness(fetch); console.log(`Fetched drand round ${drandResponse.round}`); // Get wallet and instantiate typed contract (generated from src/contracts/RandomnessConsumer.json) const wallet = await evm.wallet({ name: "randomness-fulfiller", }); const contract = new evm.contracts.RandomnessConsumer( CONTRACT_ADDRESS, evm.chains.baseSepolia, wallet ); // Fulfill the randomness request on-chain const { hash } = await contract.fulfillRandomness( requestId.toString(), toBytes32(drandResponse.randomness), drandResponse.round, toBytes(drandResponse.signature) ); console.log(`Fulfilled request ${requestId} in tx ${hash}`); return { success: true, requestId: requestId.toString(), transactionHash: hash, drand: { round: String(drandResponse.round), randomness: toBytes32(drandResponse.randomness), chainHash: DRAND_CHAIN_INFO.hash, }, }; } ``` Key points: * **Contract codegen**: `evm.contracts.RandomnessConsumer` is generated from the ABI JSON, providing type-safe method calls like `contract.fulfillRandomness(...)` instead of raw function signature strings * Uses `evm.chains.baseSepolia`, a built-in chain, so no custom configuration is needed * Gas is sponsored by default for smart wallets on supported chains. On chains where sponsorship isn't available, fund the wallet directly or pass `sponsorGas: false` and cover gas from the wallet * `fulfillRandomness` does seven or more SSTOREs (the signature is a 96-byte `bytes` field). Gas estimation handles this on Base Sepolia, but if you port this to a chain where you set the gas limit manually, budget \~250k. On Monad, where the full gas limit is charged regardless of gas used, keep the limit as tight as possible ## Step 7: Understand the drand integration The `drand.ts` library fetches verifiable randomness: ```typescript theme={"dark"} export type DrandResponse = { round: number; randomness: string; // hex - sha256(signature) signature: string; // hex - BLS12-381 signature (96 bytes) previous_signature: string; }; export const DRAND_CHAIN_INFO = { hash: "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971", publicKey: "83cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a", genesisTime: 1692803367, period: 3, // seconds between rounds }; export async function fetchLatestRandomness( fetchFn: (url: string) => Promise ): Promise { const response = await fetchFn( `https://api.drand.sh/${DRAND_CHAIN_INFO.hash}/public/latest` ); if (!response) { throw new Error("Failed to fetch randomness from drand"); } return response; } ``` The randomness is verifiable off-chain using drand's BLS12-381 signatures. Anyone can check that the signature is valid against drand's public key, and that `sha256(signature) == randomness`, using a drand client library. ## Step 8: Run locally Start the Compose app: ```bash theme={"dark"} goldsky compose start --fork-chains ``` ## Step 9: Test the system Request randomness by calling the contract: ```bash theme={"dark"} cast send 0xYOUR_CONTRACT_ADDRESS "requestRandomness()" \ --rpc-url https://sepolia.base.org \ --private-key $PRIVATE_KEY ``` Watch the Compose logs. You should see: 1. The `RandomnessRequested` event being detected 2. Randomness fetched from drand 3. The fulfillment transaction submitted ## Step 10: Deploy to Goldsky Once tested locally, deploy to Goldsky's cloud: ```bash theme={"dark"} goldsky compose deploy ``` ## Customization ### Different chains Use any [supported chain](/compose/context/evm/chains), with no custom configuration needed: ```typescript theme={"dark"} const wallet = await evm.wallet({ name: "my-wallet" }); const result = await wallet.writeContract( evm.chains.arbitrumSepolia, // or baseSepolia, polygonAmoy, etc. CONTRACT_ADDRESS, "myFunction(uint256)", [arg1] ); ``` ### Different events Modify the `compose.yaml` to listen for different events: ```yaml theme={"dark"} triggers: - type: "onchain_event" network: "base_sepolia" contract: "0xYOUR_CONTRACT" events: - "YourCustomEvent(uint256,address,bytes32)" ``` ## Resources * [drand documentation](https://docs.drand.love) * [Compose introduction](/compose/introduction) * [Task triggers](/compose/task-triggers) * [EVM wallets](/compose/context/evm/wallets) * [GitHub repository](https://github.com/goldsky-io/documentation-examples/tree/main/compose/VRF) # Solana Transactions with Gill Source: https://docs.goldsky.com/compose/guides/solana-transactions Build, sign, and send Solana transactions from Compose tasks using Gill and a sandboxed RPC transport. Compose tasks can build, sign, and send Solana transactions using [Gill](https://github.com/solana-foundation/gill), a lightweight Solana client library. Since Compose tasks run in a sandboxed environment, you'll wire Gill's RPC transport through the built-in [fetch](../context/fetch) function so that all network activity remains auditable. ## Setup Install Gill in your Compose project: ```bash theme={"dark"} npm install gill ``` Add your Solana RPC URL and keypair as [secrets](../secrets) in `compose.yaml`: ```yaml highlight={3-5} theme={"dark"} name: "my-solana-app" api_version: "stable" secrets: - SOLANA_RPC_URL - SOLANA_KEYPAIR tasks: - path: "./src/tasks/solana-writer.ts" name: "solana_writer" triggers: - type: "http" authentication: "none" ``` ## Sandboxed RPC transport Compose tasks cannot use the global `fetch`: all HTTP requests must go through the provided `context.fetch`. Create a transport adapter that Gill can use: ```typescript theme={"dark"} import { TaskContext } from "compose"; import { createSolanaRpcFromTransport } from "gill"; function createSandboxedTransport( rpcUrl: string, sandboxedFetch: TaskContext["fetch"], ) { return async ({ payload, }: { payload: unknown; signal?: AbortSignal; }): Promise => { const result = await sandboxedFetch(rpcUrl, { method: "POST", headers: { "Content-Type": "application/json", Accept: "application/json", }, body: JSON.stringify(payload), }); if (result === undefined) { throw new Error(`Solana RPC request failed for ${rpcUrl}`); } return result; }; } ``` Then create an RPC client from the transport: ```typescript theme={"dark"} const transport = createSandboxedTransport(rpcUrl, fetch); const rpc = createSolanaRpcFromTransport(transport); ``` This pattern applies to any Solana library that accepts a custom transport or fetch function. The key requirement is routing all network calls through `context.fetch` so they're recorded in Compose's event logs. ## Loading a keypair Store your Solana keypair as a secret in the same JSON byte-array format used by the Solana CLI (the output of `solana-keygen`). Then load it in your task: ```typescript theme={"dark"} import { createKeyPairFromBytes, createSignerFromKeyPair, } from "gill"; const keypairBytes = new Uint8Array(JSON.parse(env.SOLANA_KEYPAIR)); const keyPair = await createKeyPairFromBytes(keypairBytes); const signer = await createSignerFromKeyPair(keyPair); ``` ## Building and sending a transaction Here's a complete example that fetches Bitcoin's price, writes it to a Solana program, and stores the result in a [collection](../context/collections): ```typescript theme={"dark"} import { TaskContext } from "compose"; import { createSolanaRpcFromTransport, createKeyPairFromBytes, createSignerFromKeyPair, address, getAddressEncoder, getProgramDerivedAddress, createTransaction, signTransactionMessageWithSigners, getSignatureFromTransaction, getBase64EncodedWireTransaction, AccountRole, } from "gill"; const PROGRAM_ID = "4MUYDek4T93NNN9dsRfxRTZc4KznZ1vTTe4vLtoS2AEs"; const SYSTEM_PROGRAM = "11111111111111111111111111111111"; const DEVNET_RPC_URL = "https://api.devnet.solana.com"; // Anchor instruction discriminator for "write" (from IDL) const WRITE_DISCRIMINATOR = new Uint8Array([235, 116, 91, 200, 206, 170, 144, 120]); function toBytes32(value: number): Uint8Array { const bytes = new Uint8Array(32); let remaining = value; for (let i = 31; i >= 0 && remaining > 0; i--) { bytes[i] = remaining & 0xff; remaining = Math.floor(remaining / 256); } return bytes; } function createSandboxedTransport( rpcUrl: string, sandboxedFetch: TaskContext["fetch"], ) { return async ({ payload, }: { payload: unknown; signal?: AbortSignal; }): Promise => { const result = await sandboxedFetch(rpcUrl, { method: "POST", headers: { "Content-Type": "application/json", Accept: "application/json", }, body: JSON.stringify(payload), }); if (result === undefined) { throw new Error(`Solana RPC request failed for ${rpcUrl}`); } return result; }; } export async function main(context: TaskContext) { const { fetch, env, collection } = context; // --- Solana RPC setup --- const rpcUrl = env.SOLANA_RPC_URL || DEVNET_RPC_URL; const transport = createSandboxedTransport(rpcUrl, fetch); const rpc = createSolanaRpcFromTransport(transport); // --- Load signer --- const keypairBytes = new Uint8Array(JSON.parse(env.SOLANA_KEYPAIR)); const keyPair = await createKeyPairFromBytes(keypairBytes); const signer = await createSignerFromKeyPair(keyPair); // --- Fetch Bitcoin price --- const response = await fetch<{ bitcoin: { usd: number } }>( "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd", { max_attempts: 3, initial_interval_ms: 1000, backoff_factor: 2 }, ); if (!response) { throw new Error("Failed to fetch Bitcoin price"); } const bitcoinPrice = response.bitcoin.usd; const timestamp = Date.now(); // --- Build transaction --- const key = toBytes32(timestamp); const value = toBytes32(Math.round(bitcoinPrice * 100)); // Derive PDA: seeds = ["data", signer_pubkey, key] const addressEncoder = getAddressEncoder(); const signerPubkeyBytes = addressEncoder.encode(signer.address); const [pda] = await getProgramDerivedAddress({ programAddress: address(PROGRAM_ID), seeds: [new TextEncoder().encode("data"), signerPubkeyBytes, key], }); // Instruction data: 8-byte discriminator + 32-byte key + 32-byte value const instructionData = new Uint8Array(8 + 32 + 32); instructionData.set(WRITE_DISCRIMINATOR, 0); instructionData.set(key, 8); instructionData.set(value, 40); const writeInstruction = { programAddress: address(PROGRAM_ID), accounts: [ { address: pda, role: AccountRole.WRITABLE as const }, { address: signer.address, role: AccountRole.WRITABLE_SIGNER as const }, { address: address(SYSTEM_PROGRAM), role: AccountRole.READONLY as const }, ], data: instructionData, }; // --- Sign and send --- const { value: latestBlockhash } = await rpc.getLatestBlockhash().send(); const tx = createTransaction({ version: "legacy", feePayer: signer, instructions: [writeInstruction], latestBlockhash, }); const signedTx = await signTransactionMessageWithSigners(tx); const signature = getSignatureFromTransaction(signedTx); const encodedTx = getBase64EncodedWireTransaction(signedTx); await rpc.sendTransaction(encodedTx, { encoding: "base64" }).send(); // --- Store result --- const priceHistory = await collection("bitcoin_prices"); const { id } = await priceHistory.insertOne({ price: bitcoinPrice, timestamp, }); return { success: true, signature, price: bitcoinPrice, timestamp, priceId: id }; } ``` ### What's happening 1. **RPC setup**: A sandboxed transport wraps `context.fetch` so Gill's RPC calls go through Compose's auditable network layer. 2. **Load signer**: The keypair is loaded from a Compose secret and converted into a Gill transaction signer. 3. **Fetch off-chain data**: The task fetches Bitcoin's price from CoinGecko with built-in retry logic. 4. **Derive PDA**: A Program Derived Address is computed from seeds so the on-chain program knows where to store the data. 5. **Build instruction**: The instruction data is assembled: an 8-byte Anchor discriminator followed by the key and value. 6. **Sign and send**: The transaction is created, signed, base64-encoded, and submitted to the Solana RPC. 7. **Store metadata**: The price and transaction signature are persisted in a Compose collection for later retrieval. ## Next Steps Learn more about using npm packages in Compose tasks. Store and query state across task runs. Trigger your Solana tasks via cron, HTTP, or on-chain events. Securely manage your Solana keypair and RPC URL. # Build Offchain-x-Onchain Systems with Compose Source: https://docs.goldsky.com/compose/introduction Compose is the offchain-to-onchain framework for high-stakes systems: write durable TypeScript that moves money, data, and events between platforms. Compose is the offchain-to-onchain framework for high-stakes systems. It lets you write code that durably moves money, data, and events between every platform you use, whether it's offchain or onchain. Write simple TypeScript code that runs in verifiable sandboxes, with auditable datastores and traceable functions. Monitor the input and output of every mutation in production, and use TEE-powered attestations to prove that your logic actually ran as intended. Run our install script to get all necessary dependencies and instantly generate your first Compose App. ## What you'll find here Generate and deploy your first Compose app in under 5 minutes. Tasks, triggers, and context APIs: fetch, collections, EVM chains, wallets, and contracts. End-to-end worked examples: oracles, VRF, prediction markets, compliance, and payouts. Environments, secrets, lifecycle, and tracing every execution. ## Use cases Tailored to your app's logic and update cadence Trustless, verifiable and auditable data sources Detect anomalies and pause or reroute activity Market data ingestion with application-specific rules Verify offchain facts (KYC/AML, account status) and write onchain attestations Rebalance strategies, payouts, or maintenance windows Read across chains and external APIs then write atomically, anywhere Triggered notifications from onchain events with guaranteed delivery ## How it works Every Compose app can have multiple tasks, which can be triggered through on-chain events, cron-like scheduling, or an API. Tasks run in auditable sandboxes with immutable tracing on every function call that touches the external world. State is versioned and tracked, and execution persists through downtime. * **Ultracompliance:** Write your code in your local environment, and run exactly the same code in our cloud environment or in a Trusted Executable Environment (TEE). * **Actually useful sandboxes:** Task code runs in a sandbox, but can call safe functions that interact with the outside world. * **Trace everything**: Every step of every task is traced. From the CLI or UI, step through any task execution down to individual function calls. ## Architecture ```mermaid theme={"dark"} flowchart TB subgraph external["External Systems and Clients"] EXT[" "] end subgraph services["External Services"] HTTP((HTTP Calls)) BC((Blockchains)) SDB[(Stage DB)] end subgraph sandbox["Secure Task Sandbox"] direction TB TASK[Compose Task Process] NOTE["Only communicates via IPC bus"] end ES[(Event Storage)] EXT -->|"HTTP task trigger"| HOST EXT -->|"Cron trigger"| HOST EXT -->|"Audit query"| ES HTTP <-->|"fetch"| HOST BC <-->|"reads/writes"| HOST SDB <-->|"cross-task state"| HOST HOST[Compose Host] <-->|"Task run\ntrigger/response"| TASK HOST <-->|"Host function\nrequest/response"| TASK HOST -->|"Log events"| ES ``` Compose executes tasks in auditable sandboxes that route all external communication through the Compose host, which handles durability and guaranteed execution. Every function call that mutates state (databases, blockchains) or accesses external resources is tracked, with inputs and outputs saved and viewable in the UI for tracing and debugging. The task sandbox is isolated and can run as a Trusted Executable Environment or as a normal container. **The same code can be used in all environments.** Code run in a TEE will also generate attestations, with guarantees that the code run is exactly the code you intend, with no side effects. Get started by [setting up your first Compose application](/compose/quick-start) in under 5 minutes. # Using Packages Source: https://docs.goldsky.com/compose/packages Use npm packages such as viem inside Compose tasks, with bundling guidance and sandbox limitations. ## Overview Compose apps are bundled with esbuild and run in secure, auditable sandboxes. The sandboxes disallow OS, filesystem, and direct networking activity. To make external HTTP requests, use the provided [fetch](./context/fetch) function. Because tasks are bundled with esbuild (not resolved by Deno), you can use any packages installed via npm, yarn, or pnpm. Native Node.js packages, or packages that rely on direct filesystem or network access, will not work inside the sandbox. To use third-party packages: 1. Make sure your project has a `package.json` (run `npm init -y` if it doesn't). 2. Install packages with your preferred package manager (`npm install viem`, `yarn add viem`, etc.). 3. Import using bare specifiers in your task files (e.g. `import { keccak256 } from "viem"`). Packages must be installed in `node_modules/`: esbuild resolves imports from there, not from Deno's module cache. Do **not** use Deno-style `npm:` prefixes (e.g. `"npm:viem"`) or URL imports like `https://deno.land/std@.../...` in task files; they won't resolve at bundle time. You can import libraries like viem for more customized functionality. If you use HTTP-enabled functions from viem, you'll need to specify a custom transport backed by the built-in [compose fetch](./context/fetch). The standard viem transports can't reach the network from inside the sandbox. Otherwise, you can use utility functions the same way you would in any TypeScript app. ## npm packages in dashboard deploys Deploying from the dashboard (editing an app in the browser) supports a fixed allowlist of npm packages: * `viem` * `ethers` * `gill` * `@solana/web3.js` * `@solana/spl-token` * `@noble/hashes` * `@noble/curves` * `bs58` * `zod` * `bignumber.js` Versions come from your app's `package.json`. Any package outside the allowlist fails with a `cli-only-package` error; deploy with the CLI instead, which bundles any sandbox-compatible package. HTTP client packages such as `axios`, `node-fetch`, and `got` are deliberately left off the allowlist. All network access from a task must go through [`ctx.fetch`](./context/fetch), so they cannot reach the network from inside the sandbox either way. ## Example ```typescript theme={"dark"} import { TaskContext } from "compose"; import { concat, keccak256, stringToHex, numberToHex, } from "viem"; export async function main({ evm, env }: TaskContext) { const assetPair = "BTC-USD"; const durationInSeconds = 3600; const startTimestamp = Math.floor(Date.now() / 1000); // use viem utilities to compute a deterministic id const resultId = keccak256( concat([ stringToHex("CANDLE", { size: 32 }), stringToHex(assetPair, { size: 32 }), numberToHex(durationInSeconds, { size: 32 }), numberToHex(startTimestamp, { size: 32 }), ]) ); console.log(resultId); } ``` ## Next Steps Debug and monitor your apps Learn about deploying your app to the cloud for production use cases. # Deploy a Compose App Source: https://docs.goldsky.com/compose/quick-start Get up and running with Compose in under 5 minutes. ### 1. Install the Compose CLI Extension If you already have the Goldsky CLI installed, you'll just need to install the Compose extension. ```bash theme={"dark"} goldsky compose install ``` If you don't already have the Goldsky CLI installed you'll need to start by installing that, then run the above command. If you run any `goldsky compose ` before installing the extension, it prints an install hint and exits; it no longer auto-installs. **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. ### 2. Create your app Create a new Compose project with a working Bitcoin oracle example: ```bash theme={"dark"} goldsky compose init ``` This command will: * Prompt you for a project name and create the app under that directory * Scaffold a complete example app with a working Bitcoin oracle ```bash theme={"dark"} demo-app/ compose.yaml # the app manifest tsconfig.json # TypeScript configuration .env # local environment variables .gitignore src/ tasks/ bitcoin-oracle.ts # example task lib/ utils.ts # shared utilities ``` ### 3. Start the app locally `cd` into the project directory that was just created: ```bash theme={"dark"} cd ``` Start the app: ```bash theme={"dark"} goldsky compose start --fork-chains ``` `--fork-chains` lets you run a smart wallet locally. You can also use a private key wallet for your local Compose app. See more [here](/compose/secrets). Your Compose application is now running! The server starts on port 4000 by default. If 4000 is taken, `start` walks up to port 4009 and prints `Port 4000 is in use, using instead.`. To pin an exact port, pass `-p, --port `; `start` fails fast if that port is taken. You can test triggering a task like so: ```bash theme={"dark"} goldsky compose callTask bitcoin_oracle '{}' --env local ``` ## Updating the CLI To update to the latest version, run the update command: ```bash theme={"dark"} goldsky compose update ``` # Wallets and Secrets Source: https://docs.goldsky.com/compose/secrets Manage wallets and secrets for Compose apps, including built-in smart wallets and securely stored EOA private keys. Most Compose apps need some form of credential: an EOA private key, an auth token for an external service, etc. Compose handles both built-in smart wallets and arbitrary user-managed secrets. ### Wallets Many compose apps make blockchain transactions and need gas and payment funds to do so. By default, Compose makes you a smart wallet that lets you pay gas fees in fiat as part of your normal monthly Goldsky bill, which keeps accounting in USD for teams that aren't "blockchain-native". You can fund these smart wallets with any tokens your business logic requires (by default Goldsky will pay gas fees if you haven't funded the wallet yourself). Goldsky hosted wallets are created dynamically and idempotently in your app code, so wallet creation can use any logic. For specifics see [Context](./context). Sometimes a specific EOA wallet is needed for specific transactions, such as owner-only contract methods. In those cases, store your private key in a secret. See below for details. To fund your built-in smart wallet (beyond Goldsky's default gas-sponsorship behavior), you can retrieve its public key from the compose Dashboard at app.goldsky.com. See [monitoring](./deploy-monitor) for details. ### Examples ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main({ env, evm }: TaskContext) { // a default smart wallet // this will make a smart wallet and will sponsor gas by default const mySmartWallet = await evm.wallet({ name: "my-wallet" }); // you can disable gas sponsoring on a smart wallet // allowing you to obtain the public key from your compose dashboard and fund it yourself const mySelfFundedSmartWallet = await evm.wallet({ name: "my-wallet", sponsorGas: false }); // make an EOA based wallet using a private key secret // by default privateKey wallets don't use gas sponsoring // see below for info about storing the secret const myPrivateKeyWallet = await evm.wallet({ privateKey: env.MY_PRIVATE_KEY }); } ``` ### Secrets Compose secrets are scoped to a specific Compose app within your Goldsky project. You can set or update secrets at any time using the CLI, but a running app will only pick up new secret values after a redeploy. This protects running apps from accidental changes and lets you roll forward (or back) safely by pairing a deploy with the secrets it expects. The way secrets are managed in the cloud vs locally is slightly different. Secret names must be in SCREAMING\_SNAKE\_CASE: all uppercase letters, digits, and underscores, starting with a letter (e.g. `MY_SECRET`, `API_KEY_V2`). #### Manage Secrets for Local Dev In local dev, you'll put your secrets in your `.env` file. Every compose app created with `goldsky compose init` comes with a gitignored `.env` file by default. ```bash .env theme={"dark"} # Compose Local Secrets PRIVATE_KEY=132981234adsufyadsf78134asdf ``` #### Manage Secrets for Cloud To add or update a secret in the cloud: ```bash theme={"dark"} goldsky compose secret set MY_PRIVATE_KEY --value xyz123 ``` To update a secret and immediately redeploy so the app picks it up: ```bash theme={"dark"} goldsky compose secret set MY_PRIVATE_KEY --value xyz123 --redeploy ``` To remove a cloud secret: ```bash theme={"dark"} goldsky compose secret delete MY_PRIVATE_KEY ``` To list all secrets for the app: ```bash theme={"dark"} goldsky compose secret list ``` You can also write secrets into your local `.env` with the same command by adding `--env local`: ```bash theme={"dark"} goldsky compose secret set MY_PRIVATE_KEY --value xyz123 --env local ``` #### How secrets are stored Cloud secrets are end-to-end encrypted. When you run `goldsky compose secret set`, the CLI encrypts the value on your machine with your project's public key before uploading it, so the value is never sent or stored in plaintext. There is no way to read a secret value back: not from the CLI, not from the dashboard, and not by Goldsky. `goldsky compose secret list` shows secret names only. A secret is decrypted only inside your running app, where it appears on `ctx.env`. To rotate a secret, set a new value. The previous value is never displayed, and the dashboard secrets page shows names, not values. If a secret value would appear in a task run's trace output, it is redacted in the dashboard. That is intended behavior, not data loss. #### Syncing .env to the cloud at deploy If you've been developing locally with secrets in your `.env` file, `compose deploy --sync-env` uploads every entry from your `.env` as a cloud secret before deploying. This is a convenient way to push a whole app's secrets in one step. ```bash theme={"dark"} goldsky compose deploy --sync-env ``` A running app only picks up new secret values after a redeploy. Use `--redeploy` on `secret set`, or run `goldsky compose deploy` yourself. #### Using Secrets For secrets to be injected into your app at runtime, they have to be listed in the `secrets:` section of the [manifest](./app-configuration). Only secrets named in the manifest of the currently-deployed version are made available to your tasks, so older deploys keep working even as you add, rename, or remove secrets for newer ones. ```yaml compose.yaml highlight={2-5} theme={"dark"} name: "my_app" secrets: - MY_PRIVATE_KEY - MY_API_KEY - CONTRACT_ADDRESS tasks: - name: "price_fetcher" path: "./tasks/fetch_price.ts" - name: "data_processor" path: "./tasks/process_data.ts" ``` Inside a task, each secret is exposed on `ctx.env` under its exact name: ```typescript highlight={4,11,16} theme={"dark"} import { TaskContext } from "compose"; export async function main({ env, evm, fetch }: TaskContext) { const myPrivateKeyWallet = await evm.wallet({ privateKey: env.MY_PRIVATE_KEY }); const address = "0x1234567890abcdef1234567890abcdef12345678" as `0x${string}`; const questionId = "0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd"; const { hash } = await myPrivateKeyWallet.writeContract( evm.chains.polygon, env.CONTRACT_ADDRESS as `0x${string}`, "prepareCondition(address,bytes32,uint256)", [address, questionId, 2] ); const response = await fetch(`https://api-service/api/v1/path?auth_token=${env.MY_API_KEY}`); } ``` ## Next Steps Configure your app manifest, tasks, and secrets. Deploy your app and monitor it in the cloud. # Compose task triggers: cron, HTTP, and onchain Source: https://docs.goldsky.com/compose/task-triggers Configure cron, HTTP, and onchain event triggers for Compose tasks, including parallel processing, max concurrency, confirmations, and failure handling. Your compose tasks can be triggered by several different mechanisms. Triggers are configured in your [manifest file](./app-configuration) for each task. Each task can have multiple triggers (one of each type), so triggers are configured as an array. Below is an overview of all the supported trigger types: `cron`, `http`, and `onchain_event`. ## Local Task Execution For locally testing tasks you can use the `callTask` CLI command. This works regardless of what trigger types a task has configured (and even for tasks with no triggers at all). #### Trigger Task locally with CLI ```bash theme={"dark"} goldsky compose callTask "my_task" '{ "foo": "bar" }' --env local ``` #### Task Code ```typescript theme={"dark"} import { TaskContext } from "compose"; type Payload = { foo: string; }; export async function main({ collection }: TaskContext, payload: Payload) { // the task will be called with the payload sent from the CLI callTask command console.log(payload.foo); } ``` ## Task To Task Execution Tasks can call other tasks directly, with no trigger configuration required on the called task. This is done using the [callTask](./context/call-task) context function. ### Example ```typescript highlight={10-17} theme={"dark"} import { TaskContext } from "compose"; type ProcessDataPayload = { dataId: string; operation: string; }; export async function main({ callTask }: TaskContext, payload: ProcessDataPayload) { // Call another task with a payload const result = await callTask<{ success: boolean; processed: number }>( "process-data", { dataId: payload.dataId, operation: payload.operation, } ); return { status: "completed", result, }; } ``` The `process-data` task will receive the payload and can return a response: ```typescript theme={"dark"} import { TaskContext } from "compose"; type ProcessDataArgs = { dataId: string; operation: string; }; export async function main({ collection }: TaskContext, payload: ProcessDataArgs) { // Process the data based on the operation const processed = await collection("data").findMany({ id: payload.dataId }); return { success: true, processed: processed.length, }; } ``` ## Chain Event Triggers Tasks can be triggered by onchain events. The payload delivered to the task is the raw encoded log. Compose provides helpers for decoding the event in your task code. See [Contracts](./context/evm/contracts) for decoding details. Onchain event triggers only fire when your app is **deployed** to the cloud. They do not fire during local development. To test a task with an onchain trigger locally, use `callTask` with a sample event payload: ```bash theme={"dark"} goldsky compose callTask "my_task" '{"blockNumber":48758053,"address":"0xb74de3F91e04d0920ff26Ac28956272E8d67404D","data":"0x","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"],"transactionHash":"0x2c50...","logIndex":343}' --env local ``` You can copy a real event payload from a block explorer to use as test data. #### Example event object sent as the payload to your task: ```json theme={"dark"} { "blockNumber": 48758053, "blockHash": "0x6794a56583329794f184d50862019ecf7b6d8ba6b3210f68ca4b91a8fa81817d", "transactionIndex": 29, "removed": false, "address": "0xb74de3F91e04d0920ff26Ac28956272E8d67404D", "data": "0x", "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x000000000000000000000000eec2ba9b9f0202c63bba29ea9a4ce5c23f9865fd", "0x0000000000000000000000000000000000000000000000000000000000001099", ], "transactionHash": "0x2c500a55f5c24d587e73805975d91395634a971dca5939f43d34d774d0f7147b", "logIndex": 343, } ``` #### Example configuration for an onchain event trigger: ```yaml highlight={6-10} theme={"dark"} name: "my-app" tasks: - name: "on_transfer" path: "./tasks/on_transfer.ts" triggers: - type: "onchain_event" network: "base_sepolia" contract: "0xb74de3F91e04d0920ff26Ac28956272E8d67404D" events: - "Transfer(address,address,uint256)" ``` #### Task code Here's an example in which we decode the event with a contract class we've generated with `goldsky compose codegen`, see [Contracts](./context/evm/contracts) for more info. ```typescript theme={"dark"} import { TaskContext, OnchainEvent } from "compose"; // the payload for an onchain triggered task will always be our built in OnchainEvent interface export async function main({ evm }: TaskContext, payload: OnchainEvent) { // we can decode the event with our ABI generated contract class // the type of this decodedEvent will be a union of all events that the ABI specifies, allowing you to conditionally process based on the eventName const decodedEvent = evm.contracts.MyNFT.decodeEventLog(payload); if (decodedEvent.eventName === "Transfer") { // in this code block typescript will know the decodedEvent is of type TransferEventDecoded // this pattern is useful when your trigger supports multiple event types console.log("Transfer event:", decodedEvent.args); } // alternative would be to cast, this is useful if your trigger is configured for a single event type const castEvent = evm.contracts.MyNFT.decodeEventLog(payload); } ``` #### Onchain Trigger Properties | Property | Type | Required | Description | | - | - | - | - | | `type` | `"onchain_event"` | Yes | Type discriminator | | `network` | string | Yes | The network slug in snake\_case (e.g. `base_sepolia`, `ethereum_mainnet`). See [Chains](./context/evm/chains) for the full list. | | `contract` | string | Yes | The contract address (`0x` followed by 40 hex characters). | | `events` | string\[] | No | Specific event signatures (human-readable, not encoded) to match, e.g. `"Transfer(address,address,uint256)"`. If omitted, all logs from the contract are delivered. | | `dataset_version` | string | No | Override the dataset version for chains that don't use `1.0.0` (e.g., `megaeth_testnet_v2`). If not specified, the server auto-detects the correct version. | | `parallel_processing` | boolean | No | Process events concurrently through an internal durable queue instead of one at a time. Defaults to `false`. See [Parallel processing](#parallel-processing). | | `max_concurrency` | integer | No | How many events are processed at the same time. Must be a positive integer; defaults to `10`. Only used when `parallel_processing` is `true`. | | `confirmations` | integer | No | Hold each event until its block is this many blocks deep before running the task. Must be a non-negative integer; defaults to `0` (run immediately). Requires `parallel_processing: true`. See [Confirmations](#confirmations). | #### Parallel processing By default, onchain events are delivered one at a time: Goldsky sends an event, waits for your task to finish, then sends the next one. If a task takes 30 seconds and 2,000 events land in a burst, the last event runs hours late. Set `parallel_processing: true` to switch the trigger to queued, concurrent delivery. Events are written to an internal durable queue as they are indexed, and a worker in your app runs up to `max_concurrency` of them at the same time. ```yaml highlight={12-13} theme={"dark"} name: "my-app" api_version: "stable" tasks: - name: "on_transfer" path: "./tasks/on_transfer.ts" triggers: - type: "onchain_event" network: "ethereum" contract: "0xb74de3F91e04d0920ff26Ac28956272E8d67404D" events: - "Transfer(address,address,uint256)" parallel_processing: true max_concurrency: 50 ``` Your task code does not change. `main(context, payload)` still receives a single event, and each event still gets its own run ID, its own context function cache, and the same crash recovery as a serially delivered event. **What to know before enabling it:** * **Ordering is not preserved.** Events run concurrently, so a later event can finish before an earlier one. Only enable this if each event can be handled independently. Keep the default (serial) delivery if your task depends on events arriving in block order. * **Concurrency is app-wide.** One queue worker drains the queue for the whole app, so the first `max_concurrency` it finds on an onchain trigger sets the limit for every parallel trigger in that app. Set the same value on each trigger to avoid confusion. * **Backpressure is handled for you.** If the queue fills up, Compose rejects further deliveries with a `429` and Goldsky retries them with backoff, so events are not lost, just delivered later. * **Reorgs cancel queued events.** If an event is retracted (a reorg) while it is still sitting in the queue, the queued entry is removed and the task never runs for it. Events that have already started running are unaffected. * **Delivery is at-least-once.** If your app restarts while an event is running, the event stays in the queue and runs again after the restart, so no event is lost. Context calls that already finished, such as a `writeContract`, return their saved result instead of running again. Code between those calls can run twice, so make your task safe to repeat. * **Operators can retune concurrency live.** Goldsky can override `max_concurrency` on a running app via the `COMPOSE_TRIGGER_CONCURRENCY` environment variable, without a redeploy. Reach out in [support](/getting-support) if you need this while tuning. #### Confirmations Onchain triggers fire as soon as the event is indexed at the chain head, which means a reorg can retract an event your task already acted on. If the task moved real money (a settlement, a payout, a compliance gate), that is unrecoverable. Set `confirmations: N` to hold each event in the queue until its block is `N` blocks deep. Compose polls the chain head and releases the event once `event block + N <= current block`. ```yaml highlight={10-11} theme={"dark"} name: "my-app" api_version: "stable" tasks: - name: "settle_trade" path: "./tasks/settle_trade.ts" triggers: - type: "onchain_event" network: "ethereum" contract: "0xb74de3F91e04d0920ff26Ac28956272E8d67404D" parallel_processing: true confirmations: 10 ``` * `confirmations` requires `parallel_processing: true`: the confirmation buffer is part of the queue. Setting it without parallel processing fails validation. * `confirmations: 0` (the default) fires immediately, exactly as before. * While an event waits, it is held in the queue. If a reorg retracts it before it is released, the event is cancelled and your task never runs for it. * Choose the depth from your own risk tolerance: deeper is safer but adds latency roughly equal to `N` block times. Removing `confirmations` from your manifest releases anything still waiting on the next deploy. This is the inbound counterpart to the outbound confirmation and reorg options on `writeContract`. See [Reorg handling](./context/evm/reorgs) for transactions your task sends. #### Failure Handling Onchain-triggered tasks honor the task's [`retry_config`](./app-configuration#retry-configuration). When a task throws (or otherwise fails), Compose retries it up to `max_attempts` with the configured backoff. If every attempt fails, **that event is dropped and the pipeline advances to the next one**. It is not replayed. This means an unhandled exception in an onchain-triggered task only stalls delivery for the duration of your retry window, not indefinitely. If you want a failure to be visible without consuming retries, catch the error in your task and return normally. The run is recorded as successful and the pipeline moves on. With `parallel_processing: true` the same retry rules apply per event, but a failing event never stalls the others: each event is claimed from the queue independently, and one exhausting its retries doesn't hold back the rest. ## Cron Triggers Tasks can be triggered on a schedule. Tasks triggered by cron are invoked with an empty payload (`{}`), since each invocation is generic. ### Example ```yaml highlight={6-7} theme={"dark"} name: "my-app" tasks: - name: "hourly_sync" path: "./tasks/sync.ts" triggers: - type: "cron" expression: "0 * * * *" # Every hour at minute 0 ``` ### 6-field (second-granularity) example Pass a 6-field expression if you need second-level precision. The first field becomes seconds: ```yaml theme={"dark"} triggers: - type: "cron" expression: "*/30 * * * * *" # every 30 seconds ``` #### Cron Trigger Properties | Property | Type | Required | Description | | - | - | - | - | | `type` | `"cron"` | Yes | Type discriminator | | `expression` | string | Yes | A cron expression. Supports both 5-field (`minute hour day month weekday`) and 6-field (`second minute hour day month weekday`) formats. Accepts `*`, numbers, ranges (`1-5`), lists (`1,3,5`), and step values (`*/2`). | ## HTTP Triggers Tasks can be triggered by HTTP requests. This is often used to kick off compose tasks from your application logic. HTTP triggers accept any JSON payload. ### Example ```yaml highlight={6-7} theme={"dark"} name: "my-app" tasks: - name: "status" path: "./tasks/status.ts" triggers: - type: "http" authentication: "auth_token" # other option is "none" ``` #### Http Trigger Properties | Property | Type | Required | Description | | - | - | - | - | | `type` | `"http"` | Yes | Type discriminator | | `authentication` | `"auth_token" \| "none"` | Yes | Type of authentication to use on the endpoint. | | `role` | `"Owner" \| "Admin" \| "Editor" \| "Viewer"` | No | The minimum RBAC role required to call the endpoint (only applies when `authentication` is `"auth_token"`). Defaults to `"Viewer"` (any team member). | | `ip_whitelist` | string\[] | No | Restrict access to specific IPs. Supports IPv4, IPv6, and CIDR notation (e.g. `["192.168.1.0/24", "10.0.0.1"]`). | Authenticated triggers require a Goldsky API token when the app is deployed, but can be called without auth when testing locally. Unauthenticated triggers can be called without auth both locally and when deployed. ### Base URL Locally, Compose runs on `http://localhost:4000` by default. If port 4000 is taken, `start` picks the next free port up to 4009 and records it in `.compose/.port`. The base pattern for all task endpoints is: ``` http://localhost:4000/tasks/{taskName} ``` When deployed to the cloud, tasks with an authenticated HTTP trigger (`authentication: "auth_token"`) are reachable at: ``` https://api.goldsky.com/api/admin/compose/v1/{appName}/tasks/{taskName} ``` When deployed to the cloud, tasks with an unauthenticated HTTP trigger (`authentication: "none"`) are reachable at: ``` https://api.goldsky.com/api/public/compose/v1/{projectId}/{appName}/tasks/{taskName} ``` ### HTTP Request Format ```bash theme={"dark"} curl -X POST http://localhost:4000/tasks/{taskName} \ -H "Content-Type: application/json" \ -d '{"key": "value"}' ``` When deployed to the cloud with `authentication: "auth_token"`, you'll need to pass a Goldsky API token: ```bash highlight={2} theme={"dark"} curl -X POST https://api.goldsky.com/api/admin/compose/v1/{appName}/tasks/{taskName} \ -H "Authorization: Bearer {token}" \ -H "Content-Type: application/json" \ -d '{"foo": "foo"}' ``` ### Execute HTTP trigger without parameters ```bash highlight={3} theme={"dark"} curl -X POST http://localhost:4000/tasks/bitcoin-oracle \ -H "Content-Type: application/json" \ -d '{}' ``` ### Execute an HTTP trigger with parameters ```bash highlight={4-5} theme={"dark"} curl -X POST http://localhost:4000/tasks/bitcoin-oracle \ -H "Content-Type: application/json" \ -d '{ "contractAddress": "0x742d35Cc6634C0532925a3b8D6Ac6E7D9C3c1234", "threshold": 1000 }' ``` ### Response Format Tasks return JSON responses with the data returned by the task's `main` function. Calling this task: ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main(_context: TaskContext, payload: { name?: string }) { const name = payload?.name || "World"; return { success: true, greeting: `Hello, ${name}!` }; } ``` via this request: ```bash theme={"dark"} curl -X POST http://localhost:4000/tasks/greeting \ -H "Content-Type: application/json" \ -d '{ "name":"Adam" }' ``` returns this JSON response: ```json theme={"dark"} { "success": true, "greeting": "Hello, Adam!" } ``` ## Next Steps You can use any sandbox compatible typescript packages with any package manager. Debug and monitor your apps # Task Authoring Basics Source: https://docs.goldsky.com/compose/tasks Author Compose tasks as TypeScript modules with a main function, sandboxed runtime, and access to context functions. Tasks are the core execution units in Compose. A task is a durable workflow that can execute its own logic as well as trigger other tasks. Tasks run in a sandboxed environment and cannot access the file system, network, blockchains, etc, without communicating outside of the sandbox by calling [Context Functions](./context). This keeps all task activity auditable and verifiable. Each task is a TypeScript module that exports a `main` function with access to context functions for durable operations. The `main` function receives the injected context as its first argument and the payload sent by the trigger as its second argument. Types for context functions are stored in the local `.compose/` folder and can be referenced from your task files like so: ```typescript theme={"dark"} import { TaskContext } from "compose"; ``` ## Task Structure Every task must export a `main` function with this signature: ```typescript theme={"dark"} import { TaskContext } from "compose"; export async function main( // injected by compose at runtime context: TaskContext, // the payload sent with the trigger (e.g. an HTTP request body or onchain log). // Empty when a task is triggered by cron. payload?: Record, ): Promise { // Task implementation } ``` The runtime loads your task file and looks for an exported `main` function. If none is found, the task fails to load. Default exports, `run`, and lifecycle hooks like `onStart` / `onShutdown` are not supported. `main` is the single entrypoint. ## Task Triggers Tasks are invoked by "triggers" (see [Task Triggers](./task-triggers) for details). The supported trigger types are: * **Cron**: called on a schedule expressed as a cron expression, with no payload. * **HTTP**: called by your application or CLI with various auth options. The request body is passed as the payload. * **Onchain**: triggered by onchain events, called with a raw log payload decodable via [Contract classes](./context/evm/contracts). ## Task-Level Retry Configuration Configure retries in your app manifest: ```yaml highlight={4-7} theme={"dark"} tasks: - name: "unreliable_task" path: "./tasks/flaky.ts" retry_config: max_attempts: 5 initial_interval_ms: 2000 backoff_factor: 1.5 ``` **How Task Retries Work:** 1. **Task Failure**: If the task throws an error, the durable execution engine marks the attempt as failed. 2. **Retry Delay**: Waits `initial_interval_ms` before the first retry. 3. **Exponential Backoff**: Each subsequent retry interval is the previous one multiplied by `backoff_factor`. 4. **Retry Sequence** (for the example above): delays of 2000ms → 3000ms → 4500ms → 6750ms between the 5 attempts. 5. **Final Failure**: After `max_attempts` attempts, the task is permanently failed. 6. **Default Behavior**: When `retry_config` is omitted, tasks default to `max_attempts: 3`, `initial_interval_ms: 1000`, and `backoff_factor: 2`. ## Task Context A task's `main()` function is invoked with a context object (see [Context](./context/overview) for full details). Context covers: * State management: [Collections](./context/collections) * Blockchain interactions: [evm](./context/evm/overview) * HTTP requests: [fetch](./context/fetch) * Task-to-task execution: [callTask](./context/call-task) * Reading env variables: [env](./context/env) ## Next Steps Get detailed API docs for all available context functions for HTTP, blockchain, and database operations. Learn how to trigger tasks and query your application via HTTP API. # Free analytics powered by ClickHouse and Goldsky Source: https://docs.goldsky.com/cryptohouse Query Solana, Ethereum, and Base onchain datasets for free at crypto.clickhouse.com, powered by ClickHouse and Goldsky. Mirror is Goldsky's previous-generation pipeline product. If you're building a new pipeline, use [Turbo](/turbo-pipelines/introduction) instead. See the [Mirror vs. Turbo comparison](/mirror-vs-turbo), or the [migration guide](/turbo-pipelines/migrate-from-mirror) if you have an existing Mirror pipeline. We partnered with [Clickhouse](https://clickhouse.com/) to offer free querying of onchain datasets at [crypto.clickhouse.com](https://crypto.clickhouse.com/). CryptoHouse currently covers Solana blocks, transactions, token\_transfers, block\_rewards, accounts, and tokens, with similar datasets for Ethereum and Base. We plan to expand the data available and expose more blockchains in the coming months. For details on each dataset, see the [reference](/chains/supported-networks#turbo-datasets-by-chain) and [schemas](/turbo-pipelines/reference/schema/non-EVM-schemas#solana) pages. For background on the initiative, see the [Clickhouse blog post](https://clickhouse.com/blog/announcing-cryptohouse-free-blockchain-analytics). # Flashblocks on Edge RPC: sub-block latency on OP Stack Source: https://docs.goldsky.com/edge-rpc/capabilities/flashblocks Route Edge RPC to flashblocks-enabled upstreams on Base, Optimism, and Unichain (mainnet and testnets) with the use-upstream=flashblocks* directive. Flashblocks provide faster block confirmations on OP Stack chains by streaming pre-confirmed blocks before they're finalized on L1. Edge RPC routes to flashblocks-enabled upstreams on supported networks. ## Supported Networks | Network | Chain ID | Alias | | - | - | - | | Base | 8453 | `base` | | Base Sepolia | 84532 | `base-sepolia` | | Optimism | 10 | `optimism-mainnet` | | Optimism Sepolia | 11155420 | `optimism-sepolia` | | Unichain | 130 | `unichain-mainnet` | | Unichain Testnet | 1301 | `unichain-testnet` | ## Usage Target flashblocks-enabled upstreams by adding `use-upstream=flashblocks*` to your request: ```bash theme={"dark"} https://edge.goldsky.com/standard/evm/8453?key=demo&use-upstream=flashblocks* ``` ```bash curl theme={"dark"} curl "https://edge.goldsky.com/standard/evm/8453?key=demo&use-upstream=flashblocks*" \ -X POST \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' ``` ```javascript ethers.js theme={"dark"} import { JsonRpcProvider } from 'ethers' const provider = new JsonRpcProvider( 'https://edge.goldsky.com/standard/evm/8453?key=demo&use-upstream=flashblocks*' ) const blockNumber = await provider.getBlockNumber() ``` ```javascript viem theme={"dark"} import { createPublicClient, http } from 'viem' import { base } from 'viem/chains' const client = createPublicClient({ chain: base, transport: http('https://edge.goldsky.com/standard/evm/8453?key=demo&use-upstream=flashblocks*') }) const blockNumber = await client.getBlockNumber() ``` You can also pass the directive as a header instead of a query parameter: ```bash theme={"dark"} curl "https://edge.goldsky.com/standard/evm/8453?key=demo" \ -X POST \ -H "Content-Type: application/json" \ -H "X-ERPC-Use-Upstream: flashblocks*" \ -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' ``` # HyperEVM system transactions on Edge RPC Source: https://docs.goldsky.com/edge-rpc/capabilities/hyperevm-system-transactions Choose between HyperEVM archive nodes (with system transactions) and realtime nodes (without) on Edge RPC via the use-upstream request directive. HyperEVM (Chain ID: 999) has two distinct node pools with different transaction visibility: | Type | Node | Description | Use Case | | - | - | - | - | | `systx*` | nanoreth | Full archive nodes, **includes system transactions** | Indexing, historical queries, debugging | | `standard*` | hlnode | Realtime-optimized nodes, **excludes system transactions** | Frontend dApps, realtime data | If you don't specify a node type, requests may load-balance across both pools, causing inconsistent results. ## Archive Nodes (with system transactions) ```bash theme={"dark"} https://edge.goldsky.com/standard/evm/999?key=demo&use-upstream=systx* ``` ```bash curl theme={"dark"} curl "https://edge.goldsky.com/standard/evm/999?key=demo&use-upstream=systx*" \ -X POST \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x1", true],"id":1}' ``` ```javascript ethers.js theme={"dark"} import { JsonRpcProvider } from 'ethers' const provider = new JsonRpcProvider( 'https://edge.goldsky.com/standard/evm/999?key=demo&use-upstream=systx*' ) // Archival data with system transactions const block = await provider.getBlock(1) ``` ```javascript viem theme={"dark"} import { createPublicClient, http } from 'viem' const client = createPublicClient({ transport: http('https://edge.goldsky.com/standard/evm/999?key=demo&use-upstream=systx*') }) const block = await client.getBlock({ blockNumber: 1n }) ``` ## Realtime Nodes (without system transactions) ```bash theme={"dark"} https://edge.goldsky.com/standard/evm/999?key=demo&use-upstream=standard* ``` ```bash curl theme={"dark"} curl "https://edge.goldsky.com/standard/evm/999?key=demo&use-upstream=standard*" \ -X POST \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' ``` ```javascript ethers.js theme={"dark"} import { JsonRpcProvider } from 'ethers' const provider = new JsonRpcProvider( 'https://edge.goldsky.com/standard/evm/999?key=demo&use-upstream=standard*' ) const blockNumber = await provider.getBlockNumber() ``` ```javascript viem theme={"dark"} import { createPublicClient, http } from 'viem' const client = createPublicClient({ transport: http('https://edge.goldsky.com/standard/evm/999?key=demo&use-upstream=standard*') }) const blockNumber = await client.getBlockNumber() ``` # x402 nanopayments: pay-per-call access to Edge RPC Source: https://docs.goldsky.com/edge-rpc/capabilities/x402 Pay for Edge RPC in USDC over the x402 HTTP protocol, funded through Circle Gateway. No Goldsky account, no API key, $5 per million calls.
Edge RPC accepts payments over the [x402 protocol](https://www.x402.org/), funded through [Circle Gateway](https://developers.circle.com/gateway). Fund a USDC balance once with Circle and call any chain Edge serves, with no Goldsky account, no API key, and no invoice. Edge does not settle every call with Circle. Your first paid request tops up a small prepaid balance, and later calls are deducted from it. This keeps the price at \$0.000005 per call at high request rates, where one settlement per call would not scale. ```mermaid theme={"dark"} sequenceDiagram autonumber participant Agent as Your agent participant Edge as Edge RPC participant Circle as Circle Gateway Agent->>Edge: POST /standard/evm/{chain} Edge-->>Agent: 402 + top-up amount (5000 atomic USDC) Note over Agent: Sign EIP-712 authorization
against Gateway contract Agent->>Edge: POST + Payment-Signature header Edge-->>Agent: 200 + JSON-RPC result Edge->>Circle: Settle top-up ($0.005) Note over Edge: Credit ~1,000 calls
to your wallet's balance Agent->>Edge: Next call + new Payment-Signature Note over Edge: Check signature, deduct 5 atomic USDC
(no Circle settlement) Edge-->>Agent: 200 + JSON-RPC result ``` x402 is designed for autonomous agents. SDK clients handle the full handshake transparently. ## Pricing **\$5 per million requests, all methods, all chains.** * Each call costs 5 atomic USDC (\$0.000005). A JSON-RPC batch is billed per call in the batch. * A top-up is at least 5000 atomic USDC (\$0.005), which covers about 1,000 calls. If you sign for more than the minimum, the whole amount is credited. * Your balance is held by Goldsky and tied to your wallet address. It does not expire, and it covers every chain Edge serves, whichever chain you paid on. * Settlement is gasless on your side. Circle Gateway debits your deposit once per top-up, not once per call. ## Endpoint Edge RPC endpoints follow a single URL pattern, with the chain ID in the path: ``` https://edge.goldsky.com/standard/evm/{chainId} ``` To discover every chain Edge serves, hit `edge.goldsky.com` with no path. It returns a JSON list of every supported network, with CAIP id, alias, block time, and health status: ```bash theme={"dark"} curl https://edge.goldsky.com | jq '.standard[] | {id, alias, state}' # {"id": "evm:1", "alias": "ethereum-mainnet", "state": "OK"} # {"id": "evm:8453", "alias": "base", "state": "OK"} # {"id": "evm:42161", "alias": "arbitrum", "state": "OK"} # ... ``` ## Supported chains for x402 payments **The chain you pay on is independent of the chain you query.** The table below lists the 12 networks you can *settle payments* on. It mirrors the live list at [`https://gateway-api.circle.com/v1/x402/supported`](https://gateway-api.circle.com/v1/x402/supported). You can pay with USDC on any one of them and then query **any chain Edge serves**, including chains that aren't in this table and chains with no USDC of their own. For example: fund on Base, then read Robinhood Chain. One Gateway balance covers every chain Edge supports, and no API key is involved. | Network | CAIP id | USDC contract | | - | - | - | | Ethereum | `eip155:1` | `0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48` | | Base | `eip155:8453` | `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913` | | Arbitrum One | `eip155:42161` | `0xaf88d065e77c8cC2239327C5EDb3A432268e5831` | | Optimism | `eip155:10` | `0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85` | | Polygon | `eip155:137` | `0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359` | | Avalanche C-Chain | `eip155:43114` | `0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E` | | Unichain | `eip155:130` | `0x078D782b760474a361dDA0AF3839290b0EF57AD6` | | Sonic | `eip155:146` | `0x29219dd400f2Bf60E5a23d13Be72B486D4038894` | | World Chain | `eip155:480` | `0x79A02482A880bCE3F13e09Da970dC34db4CD24d1` | | Sei EVM | `eip155:1329` | `0xe15fC38F6D8c56aF07bbCBe3BAf5708A2Bf42392` | | HyperEVM | `eip155:999` | `0xb88339CB7199b77E23DB6E890353E22632Ba630f` | | Arc | `eip155:5042` | `0x3600000000000000000000000000000000000000` | You only need a Circle Gateway USDC deposit on **one** of these chains. The endpoint advertises every chain in its 402 response, and SDK clients pick whichever you're funded on. ## Quickstart ### 1. Fund a Circle Gateway deposit Use the [Circle Gateway dashboard](https://developers.circle.com/gateway), or do it directly via the SDK: ```ts theme={"dark"} import { GatewayClient } from "@circle-fin/x402-batching/client"; const gateway = new GatewayClient({ chain: "base", // any supported chain privateKey: process.env.PK as `0x${string}`, }); await gateway.deposit("1"); // 1 USDC = 200,000 Edge requests ``` Your deposit takes a few minutes to reflect in Circle's `/v1/balances` API after the on-chain transaction confirms. ### 2. Pay for an Edge request `pay()` handles the full 402 → sign → retry flow for you: ```ts theme={"dark"} const { data, formattedAmount } = await gateway.pay( "https://edge.goldsky.com/standard/evm/1", { method: "POST", headers: { "content-type": "application/json" }, body: { jsonrpc: "2.0", id: 1, method: "eth_chainId", params: [] }, }, ); console.log("signed", formattedAmount, "USDC →", JSON.stringify(data)); // signed 0.005 USDC → {"jsonrpc":"2.0","id":1,"result":"0x1"} ``` `formattedAmount` is the amount the SDK signed, which is the top-up amount from the 402 challenge. It is not the cost of the call. Only the first call settles that amount. Each later call is deducted from your balance at \$0.000005, and its signed authorization is not settled. Read the `x-goldsky-x402-balance` response header to see what is left. That's it. No Goldsky account, no `?key=` query parameter, no invoice. Your wallet address becomes your identity for rate limiting and metrics. ## How it works x402 is an HTTP protocol layered on top of standard requests. The full handshake: Your client sends an unauthenticated request. Edge responds with HTTP 402 and a body listing every accepted (chain, asset) option. The `amount` is the top-up amount, not the price of one call. The `description` says so: ```json theme={"dark"} { "x402Version": 2, "error": "Payment required for this resource", "accepts": [ { "scheme": "exact", "network": "eip155:8453", "amount": "5000", "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "payTo": "0x87aB362fEF2106d24762289410a18e7c42304C68", "description": "Goldsky Edge RPC — prepaid balance, funds ~1000 requests at 5 atomic units each", "maxTimeoutSeconds": 604800, "extra": { "name": "GatewayWalletBatched", "version": "1", "verifyingContract": "0x77777777dcc4d5a8b6e418fd04d8997ef11000ee" } } // ...one entry per supported chain ] } ``` Your client picks an `accepts` entry it can satisfy (typically the chain your Gateway deposit lives on) and signs an EIP-712 `TransferWithAuthorization` message against the `GatewayWalletBatched` contract from the `extra` block. Your client base64-encodes the signed payload and resends the original request with one extra header: ```http theme={"dark"} POST /standard/evm/1 Content-Type: application/json Payment-Signature: ``` If your wallet has no balance, Edge serves the request and then settles the authorization with Circle's facilitator. The settled amount is credited to your wallet's balance, less the cost of this call. If your wallet already has a balance, Edge checks that the authorization's signature matches your wallet, deducts 5 atomic USDC, and serves the request. It does not send the authorization to Circle. The authorization only proves the request comes from your wallet, and Edge rejects any authorization it has already used. When the balance runs out, the next request settles a new top-up. ### Response headers Every paid response says how it was funded: | Header | Meaning | | - | - | | `x-goldsky-x402-funding` | `pending`: a top-up that Edge settles with Circle after responding. `settled`: a payment Circle settled before the response. `credit`: deducted from your prepaid balance, with no settlement. `unpaid`: served without charging you (see below). | | `x-goldsky-x402-balance` | Atomic USDC left in your balance after this request. Present on `credit` responses. | | `x-goldsky-x402-amount-required` | On some `unpaid` responses: the amount to authorize so that Edge can charge you again. | | `PAYMENT-RESPONSE` | The standard x402 settlement receipt. Present only on `settled` responses. | ### When Edge returns 402 A signed request gets a `402` with a fresh challenge when: * Circle reports that your Gateway deposit is too low to cover the top-up, or that the authorization's nonce is already used. After this, Edge answers `402` to your wallet for about 30 seconds without contacting Circle. Top up your Gateway deposit and retry. * The authorization was already used for an earlier request. * The authorization is for less than the price of the request. If the failure is on Goldsky's or Circle's side (for example, Circle is unreachable or rate-limiting Edge), Edge serves the request with `x-goldsky-x402-funding: unpaid` and does not charge you. ## Pay per call instead To settle every call individually with Circle, with no prepaid balance, send the `X-Goldsky-X402-Per-Request: true` header. Clients that can't set headers can use the `x402_per_request=true` query parameter instead. The 402 challenge then asks for 5 atomic USDC, and each payment settles directly: ```ts theme={"dark"} const { data } = await gateway.pay( "https://edge.goldsky.com/standard/evm/1", { method: "POST", headers: { "content-type": "application/json", "X-Goldsky-X402-Per-Request": "true", }, body: { jsonrpc: "2.0", id: 1, method: "eth_chainId", params: [] }, }, ); ``` Each call is then one request to Circle's facilitator, so any rate limit Circle applies to your wallet affects your throughput. If you sign for more than the per-call price, the excess is credited to your balance, but per-request mode does not draw on it. ## Auditing your payments If you compare the authorizations your client signed with the transfers in Circle's Gateway API, most authorizations will have no matching transfer. This is expected: * Each settled transfer is a top-up of at least \$0.005, which pays for about 1,000 calls. * The authorizations signed for later calls are proofs of identity. Edge does not settle them, and it will not settle them later, even though they stay valid until `validBefore`. * To reconcile, add up your settled transfers and subtract the value of the calls you made at \$0.000005 each. The result should match the latest `x-goldsky-x402-balance` header. For example, 25 calls on an empty balance produce one \$0.005 transfer and 24 unsettled authorizations. Those 25 calls cost \$0.000125, and the remaining balance is 4,875 atomic USDC, about 975 calls. ## Limits and operational notes * **Authorization validity window**: Circle Gateway requires the signed authorization's `validBefore` to be at least \~4 days in the future. Edge advertises `maxTimeoutSeconds: 604800` (7 days) so SDK defaults work out of the box. ## See also * [x402 protocol spec](https://www.x402.org/) * [Circle Gateway docs](https://developers.circle.com/gateway) * [`@circle-fin/x402-batching` SDK](https://www.npmjs.com/package/@circle-fin/x402-batching) Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Error Codes Source: https://docs.goldsky.com/edge-rpc/evm/error-codes JSON-RPC error codes returned by Edge RPC ## Error response format ```json theme={"dark"} { "jsonrpc": "2.0", "id": 1, "error": { "code": -32602, "message": "Invalid params" } } ``` ## Standard JSON-RPC errors | Code | Name | Description | | - | - | - | | `-32700` | Parse error | Invalid JSON in request body | | `-32600` | Invalid request | Missing required JSON-RPC fields | | `-32601` | Method not found | Method does not exist or is unsupported | | `-32602` | Invalid params | Wrong parameter types or count | | `-32603` | Internal error | Server-side processing error | ## EVM-specific errors | Code | Name | Description | | - | - | - | | `-32000` | Call exception | Contract call failed (reverted, out of gas, etc.) | | `-32003` | Transaction rejected | Transaction validation failed | | `3` | Execution reverted | Contract execution reverted with reason | ## Edge RPC normalized errors Edge RPC normalizes errors from upstream providers to consistent codes: | Code | Name | Description | | - | - | - | | `-32005` | Rate limit exceeded | Too many requests | | `-32012` | Range too large | Block range in `eth_getLogs` too large | | `-32014` | Missing data | Block, transaction, or state not found | | `-32015` | Node timeout | Upstream node timed out | | `-32016` | Unauthorized | Invalid or missing authentication | # debug_getRawBlock Source: https://docs.goldsky.com/edge-rpc/evm/methods/debug_getRawBlock Call debug_getRawBlock on Goldsky Edge RPC to fetch an RLP-encoded EVM block by number or tag, with curl, JavaScript, and Python request examples. ## Parameters Block number (hex), or `latest` ## Returns RLP-encoded block (hex) ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "debug_getRawBlock", "params": ["latest"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "debug_getRawBlock", "params": [ "latest" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "debug_getRawBlock", "params": [ "latest" ], "id": 1 } ) print(response.json()['result']) ``` # debug_getRawHeader Source: https://docs.goldsky.com/edge-rpc/evm/methods/debug_getRawHeader Call debug_getRawHeader on Goldsky Edge RPC to fetch an RLP-encoded EVM block header by number or tag, with curl, JavaScript, and Python examples. ## Parameters Block number (hex), or `latest` ## Returns RLP-encoded block header (hex) ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "debug_getRawHeader", "params": ["latest"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "debug_getRawHeader", "params": [ "latest" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "debug_getRawHeader", "params": [ "latest" ], "id": 1 } ) print(response.json()['result']) ``` # debug_getRawReceipts Source: https://docs.goldsky.com/edge-rpc/evm/methods/debug_getRawReceipts Call debug_getRawReceipts on Goldsky Edge RPC to fetch RLP-encoded transaction receipts for an EVM block, with curl, JavaScript, and Python examples. ## Parameters Block number (hex), or `latest` ## Returns Array of RLP-encoded receipts ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "debug_getRawReceipts", "params": ["latest"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "debug_getRawReceipts", "params": [ "latest" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "debug_getRawReceipts", "params": [ "latest" ], "id": 1 } ) print(response.json()['result']) ``` # debug_getRawTransaction Source: https://docs.goldsky.com/edge-rpc/evm/methods/debug_getRawTransaction Call debug_getRawTransaction on Goldsky Edge RPC to fetch the RLP-encoded bytes of an EVM transaction by hash, with curl, JavaScript, and Python examples. ## Parameters Transaction hash (32 bytes) ## Returns RLP-encoded transaction (hex) ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "debug_getRawTransaction", "params": ["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "debug_getRawTransaction", "params": [ "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "debug_getRawTransaction", "params": [ "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b" ], "id": 1 } ) print(response.json()['result']) ``` # debug_traceBlockByHash Source: https://docs.goldsky.com/edge-rpc/evm/methods/debug_traceBlockByHash Call debug_traceBlockByHash on Goldsky Edge RPC to return execution traces for every transaction in an EVM block, addressed by block hash. ## Parameters Block hash (32 bytes) Trace options ## Returns Array of trace objects ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "debug_traceBlockByHash", "params": ["0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", {}], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "debug_traceBlockByHash", "params": [ "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", {} ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "debug_traceBlockByHash", "params": [ "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", {} ], "id": 1 } ) print(response.json()['result']) ``` # debug_traceBlockByNumber Source: https://docs.goldsky.com/edge-rpc/evm/methods/debug_traceBlockByNumber Call debug_traceBlockByNumber on Goldsky Edge RPC to return execution traces for every transaction in an EVM block, addressed by block number or tag. ## Parameters Block number (hex) Trace options ## Returns Array of trace objects ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "debug_traceBlockByNumber", "params": ["latest", {}], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "debug_traceBlockByNumber", "params": [ "latest", {} ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "debug_traceBlockByNumber", "params": [ "latest", {} ], "id": 1 } ) print(response.json()['result']) ``` # debug_traceCall Source: https://docs.goldsky.com/edge-rpc/evm/methods/debug_traceCall Call debug_traceCall on Goldsky Edge RPC to trace an EVM message call without submitting a transaction, with curl, JavaScript, and Python examples. ## Parameters Transaction call object Block number (hex), or `latest` Trace options ## Returns Execution trace object ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "debug_traceCall", "params": [{"to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"}, "latest", {}], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "debug_traceCall", "params": [ { "to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" }, "latest", {} ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "debug_traceCall", "params": [ { "to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" }, "latest", {} ], "id": 1 } ) print(response.json()['result']) ``` # debug_traceTransaction Source: https://docs.goldsky.com/edge-rpc/evm/methods/debug_traceTransaction Call debug_traceTransaction on Goldsky Edge RPC to return the step-by-step EVM execution trace of a mined transaction by hash across 250+ chains. ## Parameters Transaction hash (32 bytes) Trace options (tracer, timeout, etc.) ## Returns Execution trace object ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "debug_traceTransaction", "params": ["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b", {}], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "debug_traceTransaction", "params": [ "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b", {} ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "debug_traceTransaction", "params": [ "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b", {} ], "id": 1 } ) print(response.json()['result']) ``` # eth_accounts Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_accounts Call eth_accounts on Goldsky Edge RPC to return the list of EVM addresses owned by the RPC client, with curl, JavaScript, and Python request examples. ## Parameters None ## Returns Array of addresses owned by the client (20 bytes each) ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_accounts", "params": [], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_accounts", "params": [], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_accounts", "params": [], "id": 1 } ) print(response.json()['result']) ``` # eth_blobBaseFee Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_blobBaseFee Call eth_blobBaseFee on Goldsky Edge RPC to fetch the current EIP-4844 blob base fee on any supported EVM chain, with curl, JavaScript, and Python examples. ## Parameters None ## Returns Current blob base fee in wei (hex) ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_blobBaseFee", "params": [], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_blobBaseFee", "params": [], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_blobBaseFee", "params": [], "id": 1 } ) print(response.json()['result']) ``` # eth_blockNumber Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_blockNumber Call eth_blockNumber on Goldsky Edge RPC to fetch the latest EVM block number as a hex string across 250+ chains, with curl, JavaScript, and Python examples. ## Parameters None ## Returns The current block number (hex encoded) ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_blockNumber", "params": [], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_blockNumber", "params": [], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_blockNumber", "params": [], "id": 1 } ) print(response.json()['result']) ``` # eth_call Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_call Call eth_call on Goldsky Edge RPC to execute a read-only EVM message call against contract state without creating a transaction, at any block or tag. ## Parameters The transaction call object Address the transaction is sent from Address the transaction is directed to Gas provided for execution (hex) Gas price in wei (hex) Value sent in wei (hex) Method signature and encoded parameters Block number (hex), or `latest`, `earliest`, `pending`, `safe`, `finalized` ## Returns Return value of the executed contract method (hex) ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_call", "params": [{"to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "data": "0x70a08231000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045"}, "latest"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_call", "params": [ { "to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "data": "0x70a08231000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045" }, "latest" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_call", "params": [ { "to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "data": "0x70a08231000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045" }, "latest" ], "id": 1 } ) print(response.json()['result']) ``` # eth_chainId Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_chainId Call eth_chainId on Goldsky Edge RPC to return the EIP-155 chain ID of the current network as a hex string, with curl, JavaScript, and Python examples. ## Parameters None ## Returns The current chain ID (hex encoded) ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_chainId", "params": [], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_chainId", "params": [], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_chainId", "params": [], "id": 1 } ) print(response.json()['result']) ``` # eth_createAccessList Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_createAccessList Call eth_createAccessList on Goldsky Edge RPC to build an EIP-2930 access list of addresses and storage keys a transaction is expected to touch. ## Parameters Transaction call object Block number (hex), or `latest`, `earliest`, `pending` ## Returns Access list and gas used ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_createAccessList", "params": [{"to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "data": "0x70a08231000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045"}, "latest"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_createAccessList", "params": [ { "to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "data": "0x70a08231000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045" }, "latest" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_createAccessList", "params": [ { "to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "data": "0x70a08231000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045" }, "latest" ], "id": 1 } ) print(response.json()['result']) ``` # eth_estimateGas Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_estimateGas Call eth_estimateGas on Goldsky Edge RPC to estimate the gas an EVM transaction would consume without submitting it, with curl, JavaScript, and Python examples. ## Parameters The transaction call object Address the transaction is sent from Address the transaction is directed to Gas provided for execution (hex) Gas price in wei (hex) Value sent in wei (hex) Method signature and encoded parameters Block number (hex), or `latest`, `earliest`, `pending`, `safe`, `finalized` ## Returns Estimated gas required (hex encoded) ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_estimateGas", "params": [{"to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "data": "0x70a08231000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045"}], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_estimateGas", "params": [ { "to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "data": "0x70a08231000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045" } ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_estimateGas", "params": [ { "to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "data": "0x70a08231000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045" } ], "id": 1 } ) print(response.json()['result']) ``` # eth_feeHistory Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_feeHistory Call eth_feeHistory on Goldsky Edge RPC to return historical base fees, gas usage ratios, and priority-fee reward percentiles across a range of EVM blocks. ## Parameters Number of blocks to return (hex, max 1024) Newest block (hex), or `latest`, `pending` Array of percentiles for priority fee sampling ## Returns Fee history object Oldest block in range (hex) Array of base fees per gas Array of gas used ratios Array of priority fee percentiles ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_feeHistory", "params": [4, "latest", [25, 75]], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_feeHistory", "params": [ 4, "latest", [ 25, 75 ] ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_feeHistory", "params": [ 4, "latest", [ 25, 75 ] ], "id": 1 } ) print(response.json()['result']) ``` # eth_gasPrice Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_gasPrice Call eth_gasPrice on Goldsky Edge RPC to return the current EVM gas price in wei as a hex string, with curl, JavaScript, and Python request examples. ## Parameters None ## Returns Current gas price in wei (hex encoded) ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_gasPrice", "params": [], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_gasPrice", "params": [], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_gasPrice", "params": [], "id": 1 } ) print(response.json()['result']) ``` # eth_getBalance Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_getBalance Call eth_getBalance on Goldsky Edge RPC to return the wei balance of any EVM address at a specific block or tag, with curl, JavaScript, and Python examples. ## Parameters Address to check balance (20 bytes) Block number (hex), or `latest`, `earliest`, `pending`, `safe`, `finalized` ## Returns Current balance in wei (hex encoded) ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_getBalance", "params": ["0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "latest"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_getBalance", "params": [ "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "latest" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_getBalance", "params": [ "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "latest" ], "id": 1 } ) print(response.json()['result']) ``` # eth_getBlockByHash Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_getBlockByHash Call eth_getBlockByHash on Goldsky Edge RPC to return the header and transactions of an EVM block by hash, with full or hash-only transaction lists. ## Parameters Hash of the block (32 bytes) If `true`, returns full transaction objects; if `false`, returns transaction hashes ## Returns Block object or `null` Block number (hex) Block hash (32 bytes) Parent block hash PoW nonce (8 bytes) SHA3 of uncles data Bloom filter for logs Root of transaction trie Root of state trie Root of receipts trie Beneficiary address Block difficulty (hex) Total chain difficulty (hex) Extra data field Block size in bytes (hex) Max gas allowed (hex) Total gas used (hex) Unix timestamp (hex) Transaction objects or hashes Array of uncle hashes Base fee per gas (EIP-1559) ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_getBlockByHash", "params": ["0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", false], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_getBlockByHash", "params": [ "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", false ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_getBlockByHash", "params": [ "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", false ], "id": 1 } ) print(response.json()['result']) ``` # eth_getBlockByNumber Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_getBlockByNumber Call eth_getBlockByNumber on Goldsky Edge RPC to return the header and transactions of an EVM block by number or tag (latest, safe, finalized, pending). ## Parameters Block number (hex), or `latest`, `earliest`, `pending`, `safe`, `finalized` If `true`, returns full transaction objects; if `false`, returns transaction hashes ## Returns Block object or `null` Block number (hex) Block hash (32 bytes) Parent block hash PoW nonce (8 bytes) SHA3 of uncles data Bloom filter for logs Root of transaction trie Root of state trie Root of receipts trie Beneficiary address Block difficulty (hex) Total chain difficulty (hex) Extra data field Block size in bytes (hex) Max gas allowed (hex) Total gas used (hex) Unix timestamp (hex) Transaction objects or hashes Array of uncle hashes Base fee per gas (EIP-1559) ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_getBlockByNumber", "params": ["latest", false], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_getBlockByNumber", "params": [ "latest", false ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_getBlockByNumber", "params": [ "latest", false ], "id": 1 } ) print(response.json()['result']) ``` # eth_getBlockReceipts Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_getBlockReceipts Call eth_getBlockReceipts on Goldsky Edge RPC to return every transaction receipt for an EVM block in one request, with curl, JavaScript, and Python examples. ## Parameters Block number (hex), or `latest`, `earliest`, `pending`, `safe`, `finalized` ## Returns Array of transaction receipt objects ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_getBlockReceipts", "params": ["latest"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_getBlockReceipts", "params": [ "latest" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_getBlockReceipts", "params": [ "latest" ], "id": 1 } ) print(response.json()['result']) ``` # eth_getBlockTransactionCountByHash Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_getBlockTransactionCountByHash Call eth_getBlockTransactionCountByHash on Goldsky Edge RPC to return the number of transactions in an EVM block, addressed by block hash. ## Parameters Hash of the block (32 bytes) ## Returns Number of transactions (hex encoded) ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_getBlockTransactionCountByHash", "params": ["0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_getBlockTransactionCountByHash", "params": [ "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_getBlockTransactionCountByHash", "params": [ "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae" ], "id": 1 } ) print(response.json()['result']) ``` # eth_getBlockTransactionCountByNumber Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_getBlockTransactionCountByNumber Call eth_getBlockTransactionCountByNumber on Goldsky Edge RPC to return the number of transactions in an EVM block, addressed by block number or tag. ## Parameters Block number (hex), or `latest`, `earliest`, `pending`, `safe`, `finalized` ## Returns Number of transactions (hex encoded) ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_getBlockTransactionCountByNumber", "params": ["latest"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_getBlockTransactionCountByNumber", "params": [ "latest" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_getBlockTransactionCountByNumber", "params": [ "latest" ], "id": 1 } ) print(response.json()['result']) ``` # eth_getCode Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_getCode Call eth_getCode on Goldsky Edge RPC to return the deployed EVM bytecode at a contract address at a given block or tag, across 250+ supported chains. ## Parameters Address to get code from (20 bytes) Block number (hex), or `latest`, `earliest`, `pending`, `safe`, `finalized` ## Returns Bytecode at the address (hex encoded) ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_getCode", "params": ["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "latest"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_getCode", "params": [ "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "latest" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_getCode", "params": [ "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "latest" ], "id": 1 } ) print(response.json()['result']) ``` # eth_getFilterChanges Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_getFilterChanges Call eth_getFilterChanges on Goldsky Edge RPC to poll a log, block, or pending-transaction filter for events emitted since the last poll. ## Parameters Filter ID returned by `eth_newFilter` ## Returns Array of log objects or block/transaction hashes ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_getFilterChanges", "params": ["0x1"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_getFilterChanges", "params": [ "0x1" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_getFilterChanges", "params": [ "0x1" ], "id": 1 } ) print(response.json()['result']) ``` # eth_getFilterLogs Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_getFilterLogs Call eth_getFilterLogs on Goldsky Edge RPC to return every log that matches a previously created filter, with curl, JavaScript, and Python examples. ## Parameters Filter ID returned by `eth_newFilter` ## Returns Array of log objects ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_getFilterLogs", "params": ["0x1"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_getFilterLogs", "params": [ "0x1" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_getFilterLogs", "params": [ "0x1" ], "id": 1 } ) print(response.json()['result']) ``` # eth_getLogs Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_getLogs Call eth_getLogs on Goldsky Edge RPC to query EVM event logs by address, topic, and block range, with curl, JavaScript, and Python request examples. ## Parameters Filter options Start block (hex), or `latest`, `earliest`, `pending` End block (hex), or `latest`, `earliest`, `pending` Contract address or list of addresses Array of topic filters (32 bytes each). Use `null` for wildcard. Filter by specific block hash. Cannot use with fromBlock/toBlock. ## Returns Array of log objects Address of log origin Array of indexed log arguments Non-indexed arguments (hex) Block number (hex) Transaction hash Transaction index (hex) Block hash Log index in block (hex) `true` if removed due to reorg ## Limits `eth_getLogs` requests on the edge endpoint are capped per request. The block-range cap varies by chain; address and topic caps apply uniformly across all chains. **Address and topic caps (all chains):** * **Addresses:** up to 1,000 addresses in `address` * **Topics:** up to 16 values in `topics[0]` **Block-range cap by chain tier:** | Tier | Chains | Max block range (inclusive) | | - | - | - | | Default | All other supported EVM chains | 20,000 blocks (`toBlock − fromBlock ≤ 19,999`) | | Heavy chains | Base, Celo, Cronos | 1,000 blocks (`toBlock − fromBlock ≤ 999`) | | Monad | Monad | 10,000 blocks (`toBlock − fromBlock ≤ 9,999`) | Heavy chains have lower caps because their wide-range scans can return very large responses (e.g. a \~12.5k-block Transfer scan on Base can produce \~740 MB). Requests exceeding these limits are rejected with an `ErrGetLogsExceededMaxAllowedRange` error (HTTP 413). To query a larger range, split the request into multiple calls under the per-chain cap. ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_getLogs", "params": [{"fromBlock": "latest", "toBlock": "latest", "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"}], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_getLogs", "params": [ { "fromBlock": "latest", "toBlock": "latest", "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" } ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_getLogs", "params": [ { "fromBlock": "latest", "toBlock": "latest", "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" } ], "id": 1 } ) print(response.json()['result']) ``` # eth_getProof Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_getProof Call eth_getProof on Goldsky Edge RPC to return the account value and storage slots at an EVM address with the Merkle proofs needed to verify them. ## Parameters Address of the account (20 bytes) Array of storage keys to prove Block number (hex), or `latest`, `earliest`, `pending`, `safe`, `finalized` ## Returns Account proof object with balance, nonce, codeHash, storageHash, accountProof, and storageProof ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_getProof", "params": ["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", ["0x0"], "latest"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_getProof", "params": [ "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", [ "0x0" ], "latest" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_getProof", "params": [ "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", [ "0x0" ], "latest" ], "id": 1 } ) print(response.json()['result']) ``` # eth_getStorageAt Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_getStorageAt Call eth_getStorageAt on Goldsky Edge RPC to read the raw 32-byte value at a storage slot of an EVM contract at a specific block or tag. ## Parameters Address of the storage (20 bytes) Storage position (hex encoded) Block number (hex), or `latest`, `earliest`, `pending`, `safe`, `finalized` ## Returns Value at storage position (32 bytes, hex encoded) ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_getStorageAt", "params": ["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "0x0", "latest"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_getStorageAt", "params": [ "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "0x0", "latest" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_getStorageAt", "params": [ "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "0x0", "latest" ], "id": 1 } ) print(response.json()['result']) ``` # eth_getTransactionByBlockHashAndIndex Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_getTransactionByBlockHashAndIndex Call eth_getTransactionByBlockHashAndIndex on Goldsky Edge RPC to fetch an EVM transaction by its parent block hash and its index within that block. ## Parameters Hash of the block (32 bytes) Transaction index position (hex) ## Returns Transaction object or `null` ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_getTransactionByBlockHashAndIndex", "params": ["0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", "0x0"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_getTransactionByBlockHashAndIndex", "params": [ "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", "0x0" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_getTransactionByBlockHashAndIndex", "params": [ "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", "0x0" ], "id": 1 } ) print(response.json()['result']) ``` # eth_getTransactionByBlockNumberAndIndex Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_getTransactionByBlockNumberAndIndex Call eth_getTransactionByBlockNumberAndIndex on Goldsky Edge RPC to fetch an EVM transaction by block number or tag and its index within that block. ## Parameters Block number (hex), or `latest`, `earliest`, `pending` Transaction index position (hex) ## Returns Transaction object or `null` ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_getTransactionByBlockNumberAndIndex", "params": ["latest", "0x0"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_getTransactionByBlockNumberAndIndex", "params": [ "latest", "0x0" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_getTransactionByBlockNumberAndIndex", "params": [ "latest", "0x0" ], "id": 1 } ) print(response.json()['result']) ``` # eth_getTransactionByHash Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_getTransactionByHash Call eth_getTransactionByHash on Goldsky Edge RPC to fetch an EVM transaction by hash, including nonce, value, and input calldata, across 250+ chains. ## Parameters Hash of the transaction (32 bytes) ## Returns Transaction object or `null` Transaction hash Sender nonce (hex) Block hash (null if pending) Block number (null if pending) Transaction index (null if pending) Sender address Recipient address (null for contract creation) Value transferred in wei (hex) Gas price in wei (hex) Gas provided (hex) Transaction data (hex) ECDSA recovery id ECDSA signature r ECDSA signature s ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_getTransactionByHash", "params": ["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_getTransactionByHash", "params": [ "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_getTransactionByHash", "params": [ "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b" ], "id": 1 } ) print(response.json()['result']) ``` # eth_getTransactionCount Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_getTransactionCount Call eth_getTransactionCount on Goldsky Edge RPC to return the nonce (number of transactions sent) for an EVM address at a specific block or tag. ## Parameters Address to check (20 bytes) Block number (hex), or `latest`, `earliest`, `pending`, `safe`, `finalized` ## Returns Number of transactions (nonce, hex encoded) ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_getTransactionCount", "params": ["0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "latest"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_getTransactionCount", "params": [ "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "latest" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_getTransactionCount", "params": [ "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "latest" ], "id": 1 } ) print(response.json()['result']) ``` # eth_getTransactionReceipt Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_getTransactionReceipt Call eth_getTransactionReceipt on Goldsky Edge RPC to return the receipt of a mined EVM transaction by hash, including status, gas used, and event logs. ## Parameters Hash of the transaction (32 bytes) ## Returns Receipt object or `null` Transaction hash Transaction index (hex) Block hash Block number (hex) Sender address Recipient address Total gas used in block up to this tx (hex) Actual gas price paid (hex) Gas used by this tx (hex) Contract address if created, else `null` Array of log objects Bloom filter for logs `0x1` for success, `0x0` for failure ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_getTransactionReceipt", "params": ["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_getTransactionReceipt", "params": [ "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_getTransactionReceipt", "params": [ "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b" ], "id": 1 } ) print(response.json()['result']) ``` # eth_getUncleByBlockHashAndIndex Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_getUncleByBlockHashAndIndex Call eth_getUncleByBlockHashAndIndex on Goldsky Edge RPC to return an uncle block by its parent block hash and the uncle's index within that block. ## Parameters Hash of the block (32 bytes) Uncle index position (hex) ## Returns Uncle block object or `null` ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_getUncleByBlockHashAndIndex", "params": ["0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", "0x0"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_getUncleByBlockHashAndIndex", "params": [ "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", "0x0" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_getUncleByBlockHashAndIndex", "params": [ "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", "0x0" ], "id": 1 } ) print(response.json()['result']) ``` # eth_getUncleByBlockNumberAndIndex Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_getUncleByBlockNumberAndIndex Call eth_getUncleByBlockNumberAndIndex on Goldsky Edge RPC to return an uncle block by parent block number or tag and the uncle's index within that block. ## Parameters Block number (hex), or `latest`, `earliest`, `pending` Uncle index position (hex) ## Returns Uncle block object or `null` ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_getUncleByBlockNumberAndIndex", "params": ["latest", "0x0"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_getUncleByBlockNumberAndIndex", "params": [ "latest", "0x0" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_getUncleByBlockNumberAndIndex", "params": [ "latest", "0x0" ], "id": 1 } ) print(response.json()['result']) ``` # eth_getUncleCountByBlockHash Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_getUncleCountByBlockHash Call eth_getUncleCountByBlockHash on Goldsky Edge RPC to return the number of uncle blocks recorded against an EVM block, addressed by block hash. ## Parameters Hash of the block (32 bytes) ## Returns Number of uncles (hex encoded) ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_getUncleCountByBlockHash", "params": ["0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_getUncleCountByBlockHash", "params": [ "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_getUncleCountByBlockHash", "params": [ "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae" ], "id": 1 } ) print(response.json()['result']) ``` # eth_getUncleCountByBlockNumber Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_getUncleCountByBlockNumber Call eth_getUncleCountByBlockNumber on Goldsky Edge RPC to return the number of uncle blocks against an EVM block, addressed by number or tag. ## Parameters Block number (hex), or `latest`, `earliest`, `pending` ## Returns Number of uncles (hex encoded) ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_getUncleCountByBlockNumber", "params": ["latest"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_getUncleCountByBlockNumber", "params": [ "latest" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_getUncleCountByBlockNumber", "params": [ "latest" ], "id": 1 } ) print(response.json()['result']) ``` # eth_maxPriorityFeePerGas Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_maxPriorityFeePerGas Call eth_maxPriorityFeePerGas on Goldsky Edge RPC to return the currently suggested EIP-1559 priority fee per gas in wei on any supported EVM chain. ## Parameters None ## Returns Max priority fee per gas in wei (hex) ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_maxPriorityFeePerGas", "params": [], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_maxPriorityFeePerGas", "params": [], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_maxPriorityFeePerGas", "params": [], "id": 1 } ) print(response.json()['result']) ``` # eth_newBlockFilter Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_newBlockFilter Call eth_newBlockFilter on Goldsky Edge RPC to create a filter that notifies about new EVM blocks, ready to poll with eth_getFilterChanges. ## Parameters None ## Returns Filter ID for use with `eth_getFilterChanges` ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_newBlockFilter", "params": [], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_newBlockFilter", "params": [], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_newBlockFilter", "params": [], "id": 1 } ) print(response.json()['result']) ``` # eth_newFilter Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_newFilter Call eth_newFilter on Goldsky Edge RPC to create a log filter by address, topics, and block range, ready to poll with eth_getFilterChanges or eth_getFilterLogs. ## Parameters Filter options Start block (hex), or `latest`, `earliest`, `pending` End block (hex), or `latest`, `earliest`, `pending` Contract address or list of addresses Array of topic filters ## Returns Filter ID for use with `eth_getFilterChanges` ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_newFilter", "params": [{"fromBlock": "latest", "toBlock": "latest"}], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_newFilter", "params": [ { "fromBlock": "latest", "toBlock": "latest" } ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_newFilter", "params": [ { "fromBlock": "latest", "toBlock": "latest" } ], "id": 1 } ) print(response.json()['result']) ``` # eth_newPendingTransactionFilter Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_newPendingTransactionFilter Call eth_newPendingTransactionFilter on Goldsky Edge RPC to create a filter for new pending transactions, ready to poll with eth_getFilterChanges. ## Parameters None ## Returns Filter ID for use with `eth_getFilterChanges` ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_newPendingTransactionFilter", "params": [], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_newPendingTransactionFilter", "params": [], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_newPendingTransactionFilter", "params": [], "id": 1 } ) print(response.json()['result']) ``` # eth_pendingTransactions Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_pendingTransactions Call eth_pendingTransactions on Goldsky Edge RPC to return transactions currently waiting in the mempool of the target EVM chain, with curl and code examples. ## Parameters None ## Returns Array of pending transaction objects ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_pendingTransactions", "params": [], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_pendingTransactions", "params": [], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_pendingTransactions", "params": [], "id": 1 } ) print(response.json()['result']) ``` # eth_sendRawTransaction Source: https://docs.goldsky.com/edge-rpc/evm/methods/eth_sendRawTransaction Call eth_sendRawTransaction on Goldsky Edge RPC to broadcast a signed raw EVM transaction to the network and return its resulting transaction hash. ## Parameters Signed transaction data (hex encoded) ## Returns Transaction hash (32 bytes) ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "eth_sendRawTransaction", "params": ["0x...signed_tx_data..."], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "eth_sendRawTransaction", "params": [ "0x...signed_tx_data..." ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "eth_sendRawTransaction", "params": [ "0x...signed_tx_data..." ], "id": 1 } ) print(response.json()['result']) ``` # trace_block Source: https://docs.goldsky.com/edge-rpc/evm/methods/trace_block Call trace_block on Goldsky Edge RPC to return Parity-style traces for every transaction in an EVM block, with curl, JavaScript, and Python examples. ## Parameters Block number (hex), or `latest` ## Returns Array of trace objects ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "trace_block", "params": ["latest"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "trace_block", "params": [ "latest" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "trace_block", "params": [ "latest" ], "id": 1 } ) print(response.json()['result']) ``` # trace_call Source: https://docs.goldsky.com/edge-rpc/evm/methods/trace_call Call trace_call on Goldsky Edge RPC to return a Parity-style trace of an EVM message call at a specific block, without submitting a transaction. ## Parameters Transaction call object Array of trace types: `vmTrace`, `trace`, `stateDiff` Block number (hex), or `latest` ## Returns Trace result object ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "trace_call", "params": [{"to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"}, ["trace"], "latest"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "trace_call", "params": [ { "to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" }, [ "trace" ], "latest" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "trace_call", "params": [ { "to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" }, [ "trace" ], "latest" ], "id": 1 } ) print(response.json()['result']) ``` # trace_callMany Source: https://docs.goldsky.com/edge-rpc/evm/methods/trace_callMany Call trace_callMany on Goldsky Edge RPC to return Parity-style traces for a batch of EVM message calls executed sequentially at a specific block. ## Parameters Array of \[transaction, traceTypes] pairs Block number (hex), or `latest` ## Returns Array of trace results ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "trace_callMany", "params": [[[{"to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"}], ["trace"]], "latest"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "trace_callMany", "params": [ [ [ { "to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" } ], [ "trace" ] ], "latest" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "trace_callMany", "params": [ [ [ { "to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" } ], [ "trace" ] ], "latest" ], "id": 1 } ) print(response.json()['result']) ``` # trace_filter Source: https://docs.goldsky.com/edge-rpc/evm/methods/trace_filter Call trace_filter on Goldsky Edge RPC to return Parity-style traces matching an EVM address, block range, and from/to filter, with curl and code examples. ## Parameters Filter options Start block (hex) End block (hex) Filter by sender addresses Filter by recipient addresses Offset for pagination Number of traces to return ## Returns Array of trace objects ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "trace_filter", "params": [{"fromBlock": "latest", "toBlock": "latest"}], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "trace_filter", "params": [ { "fromBlock": "latest", "toBlock": "latest" } ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "trace_filter", "params": [ { "fromBlock": "latest", "toBlock": "latest" } ], "id": 1 } ) print(response.json()['result']) ``` # trace_get Source: https://docs.goldsky.com/edge-rpc/evm/methods/trace_get Call trace_get on Goldsky Edge RPC to return a single Parity-style EVM trace inside a mined transaction, addressed by transaction hash and trace index. ## Parameters Transaction hash (32 bytes) Array of trace indices ## Returns Trace object ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "trace_get", "params": ["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b", ["0x0"]], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "trace_get", "params": [ "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b", [ "0x0" ] ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "trace_get", "params": [ "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b", [ "0x0" ] ], "id": 1 } ) print(response.json()['result']) ``` # trace_rawTransaction Source: https://docs.goldsky.com/edge-rpc/evm/methods/trace_rawTransaction Call trace_rawTransaction on Goldsky Edge RPC to return a Parity-style trace for a signed raw EVM transaction, without broadcasting it to the network. ## Parameters RLP-encoded transaction (hex) Array of trace types ## Returns Trace result object ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "trace_rawTransaction", "params": ["0x...raw_tx...", ["trace"]], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "trace_rawTransaction", "params": [ "0x...raw_tx...", [ "trace" ] ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "trace_rawTransaction", "params": [ "0x...raw_tx...", [ "trace" ] ], "id": 1 } ) print(response.json()['result']) ``` # trace_replayBlockTransactions Source: https://docs.goldsky.com/edge-rpc/evm/methods/trace_replayBlockTransactions Call trace_replayBlockTransactions on Goldsky Edge RPC to replay every transaction in an EVM block and return the requested Parity trace types. ## Parameters Block number (hex), or `latest` Array of trace types ## Returns Array of trace results ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "trace_replayBlockTransactions", "params": ["latest", ["trace"]], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "trace_replayBlockTransactions", "params": [ "latest", [ "trace" ] ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "trace_replayBlockTransactions", "params": [ "latest", [ "trace" ] ], "id": 1 } ) print(response.json()['result']) ``` # trace_replayTransaction Source: https://docs.goldsky.com/edge-rpc/evm/methods/trace_replayTransaction Call trace_replayTransaction on Goldsky Edge RPC to replay a mined EVM transaction and return the requested Parity trace types (trace, vmTrace, stateDiff). ## Parameters Transaction hash (32 bytes) Array of trace types ## Returns Trace result object ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "trace_replayTransaction", "params": ["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b", ["trace"]], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "trace_replayTransaction", "params": [ "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b", [ "trace" ] ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "trace_replayTransaction", "params": [ "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b", [ "trace" ] ], "id": 1 } ) print(response.json()['result']) ``` # trace_transaction Source: https://docs.goldsky.com/edge-rpc/evm/methods/trace_transaction Call trace_transaction on Goldsky Edge RPC to return the full Parity-style trace of a mined EVM transaction by hash, with curl, JavaScript, and Python examples. ## Parameters Transaction hash (32 bytes) ## Returns Array of trace objects ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "trace_transaction", "params": ["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "trace_transaction", "params": [ "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "trace_transaction", "params": [ "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b" ], "id": 1 } ) print(response.json()['result']) ``` # web3_clientVersion Source: https://docs.goldsky.com/edge-rpc/evm/methods/web3_clientVersion Call web3_clientVersion on Goldsky Edge RPC to return the version string of the upstream EVM client, with curl, JavaScript, and Python request examples. ## Parameters None ## Returns Client version string ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "web3_clientVersion", "params": [], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "web3_clientVersion", "params": [], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "web3_clientVersion", "params": [], "id": 1 } ) print(response.json()['result']) ``` # web3_sha3 Source: https://docs.goldsky.com/edge-rpc/evm/methods/web3_sha3 Call web3_sha3 on Goldsky Edge RPC to return the Keccak-256 hash of the supplied hex data, with curl, JavaScript, and Python request examples. ## Parameters Data to hash (hex encoded) ## Returns Keccak-256 hash (32 bytes) ## Example ```bash cURL theme={"dark"} curl -X POST "https://edge.goldsky.com/standard/evm/1?key=demo" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "method": "web3_sha3", "params": ["0x68656c6c6f"], "id": 1}' ``` ```javascript JavaScript theme={"dark"} const response = await fetch('https://edge.goldsky.com/standard/evm/1?key=demo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ "jsonrpc": "2.0", "method": "web3_sha3", "params": [ "0x68656c6c6f" ], "id": 1 }) }); const { result } = await response.json(); console.log(result); ``` ```python Python theme={"dark"} import requests response = requests.post( 'https://edge.goldsky.com/standard/evm/1?key=demo', json={ "jsonrpc": "2.0", "method": "web3_sha3", "params": [ "0x68656c6c6f" ], "id": 1 } ) print(response.json()['result']) ``` # Edge RPC Source: https://docs.goldsky.com/edge-rpc/introduction Edge RPC delivers low-latency RPC access over a multi-region CDN with caching, automatic failover, and built-in observability for EVM networks. Edge RPC provides low-latency RPC access via a multi-region CDN, with caching, automatic failover, and built-in observability. It is optimized for both indexing backends and frontend applications. Edge RPC is built on top of [eRPC](https://github.com/erpc/erpc), an open source RPC proxy that's been hardened by real-world usage and built by people like you. ## Key features * **Fastest responses**: Edge infrastructure across 8+ regions delivers sub-100ms latency * **Maximum resiliency**: Automatic failover across multiple providers, for 99.9% uptime * **Data integrity**: Cross-validation prevents stale or incorrect data from reaching your app * **Optimized for indexing**: Archive access and batch requests tuned for high-throughput indexers * **Boosted for frontend**: Caching and request deduplication for responsive user experiences * **Simple pricing**: \$5 per million requests, all methods priced equally ## Transport and subscriptions Edge RPC is served over **HTTPS only**: there is no WebSocket (`wss://`) endpoint, and `eth_subscribe` / `eth_unsubscribe` are not supported. To watch chain state, use HTTP polling with the filter methods: * [`eth_newBlockFilter`](/edge-rpc/evm/methods/eth_newBlockFilter): new blocks * [`eth_newFilter`](/edge-rpc/evm/methods/eth_newFilter): logs matching an address/topic filter * [`eth_newPendingTransactionFilter`](/edge-rpc/evm/methods/eth_newPendingTransactionFilter): pending transactions * [`eth_getFilterChanges`](/edge-rpc/evm/methods/eth_getFilterChanges): poll for new results since the last call If you need push-style streaming of blockchain data instead of RPC polling, use [Turbo Pipelines](/turbo-pipelines/introduction) or [Mirror](/mirror/introduction) to stream events, logs, and transactions directly into your database or message queue. Get started in 2 minutes What makes Edge different Pay-per-request, no account required ## What you'll find here Every supported JSON-RPC method (`eth_*`, `debug_*`, `trace_*`, and `web3_*`) with params and runnable examples. What each error means and how to handle it. Flashblocks preconfirmations, HyperEVM system transactions, and x402 nanopayments. How Edge protects your traffic, and the observability you get out of the box. ## Trusted by
Morpho Morpho
Euler Euler
Moonwell Moonwell
Chronicle Chronicle
Tally Tally
Rainbow Rainbow
Monad Monad
Snapshot Snapshot
Yearn Yearn
Angle Angle
Daimo Daimo
Subsquid Subsquid
# Monitoring Source: https://docs.goldsky.com/edge-rpc/platform/monitoring Real-time metrics and logs for Edge RPC Edge RPC includes built-in Grafana dashboards covering your RPC usage, performance, and health. ## Metrics The metrics dashboard has several views: ### Overall The top-level view showing **Total RPC Requests** across all networks, with a time-series sparkline showing request volume trends. Edge RPC Overall Metrics ### Usage * **Network Usage**: Time-series chart showing request volume broken down by blockchain network * **Networks Share**: Pie chart displaying the distribution of traffic across different chains (e.g., plasma-mainnet, monad, base, swell-mainnet) * **Method Usage**: Time-series showing which RPC methods are being called over time * **Methods Share**: Pie chart breakdown of method distribution (e.g., `eth_call`, `eth_getBalance`, `eth_getTransactionByHash`) Edge RPC Network and Method Usage ### Networks * **Network-level Critical Errors**: Track critical failures by network and error type * **Network-level Warnings**: Monitor warnings like missing data from endpoints * **Network-level Notices**: Informational events such as upstream request issues * **Incoming Requests**: Request volume per network over time * **Incoming RPS**: Requests per second breakdown by network * **Successful Responses**: Success rates with empty vs non-empty response tracking Edge RPC Network-level Metrics * **Network-level P99/P90/P50 Resp. time**: Response time percentiles by network for performance analysis Edge RPC Response Time Metrics * **Multiplexed requests**: Requests that were deduplicated across multiple callers * **Response Finality Share**: Distribution of finalized vs real-time responses * **Rate-limited requests**: Self-imposed rate limiting events * **Hedge Effectiveness**: Performance of hedging mechanisms across providers Edge RPC Advanced Metrics ## Logs Edge RPC provides detailed error logging with full context on failed requests, including error type, network, method, and upstream provider information for fast debugging. # Edge RPC security: authentication and rate limiting Source: https://docs.goldsky.com/edge-rpc/platform/security How Edge RPC authenticates requests with API keys via query string or header, and how rate limits are applied per key across chains and methods. Edge RPC provides authentication and rate limiting controls to secure your endpoints. ## Authentication Each Edge RPC endpoint requires an API key for authentication. The key is included in the URL: ``` https://edge.goldsky.com/standard/evm/{chainId}?key=demo ``` Pass the key as a URL query parameter: ```bash theme={"dark"} curl "https://edge.goldsky.com/standard/evm/1?key=demo" \ -X POST \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' ``` ## Rate Limiting Rate limits can be configured per key in the [Goldsky Dashboard](https://app.goldsky.com). The following options are available: | Option | Total RPS | Per-IP RPS | Description | | - | - | - | - | | `None (Unlimited)` | Unlimited | Unlimited | No rate limiting applied | | `edge-tier-6krpm-total-unlimited-per-ip` | \~100 | Unlimited | Low volume, no per-IP restrictions | | `edge-tier-60krpm-total-unlimited-per-ip` | \~1,000 | Unlimited | Medium volume, no per-IP restrictions | | `edge-tier-180krpm-total-unlimited-per-ip` | \~3,000 | Unlimited | High volume, no per-IP restrictions | | `edge-tier-360krpm-total-unlimited-per-ip` | \~6,000 | Unlimited | Very high volume, no per-IP restrictions | | `edge-tier-600krpm-total-unlimited-per-ip` | \~10,000 | Unlimited | Enterprise volume, no per-IP restrictions | | `edge-tier-6krpm-total-500rpm-per-ip` | \~100 | \~8 | Low volume with per-IP protection | | `edge-tier-60krpm-total-500rpm-per-ip` | \~1,000 | \~8 | Medium volume with per-IP protection | | `edge-tier-180krpm-total-500rpm-per-ip` | \~3,000 | \~8 | High volume with per-IP protection | | `edge-tier-360krpm-total-500rpm-per-ip` | \~6,000 | \~8 | Very high volume with per-IP protection | | `edge-tier-600krpm-total-500rpm-per-ip` | \~10,000 | \~8 | Enterprise volume with per-IP protection | | `edge-tier-unlimited-total-100rpm-per-ip` | Unlimited | \~1.7 | Strict per-IP limiting only | | `edge-tier-unlimited-total-500rpm-per-ip` | Unlimited | \~8 | Moderate per-IP limiting only | * **Total RPS**: Maximum requests per second across all IPs using this key * **Per-IP RPS**: Maximum requests per second from a single IP address A **request** here is a JSON-RPC call, not an HTTP request: a batch of 50 calls counts as 50, the same as sending them one at a time. Batching saves round trips, not quota. # Edge RPC quickstart: make your first JSON-RPC call Source: https://docs.goldsky.com/edge-rpc/quickstart Get your first Edge RPC call working in under two minutes with a Goldsky API key, a chain alias, and a curl or JavaScript JSON-RPC request. ## Prerequisites * A [Goldsky account](https://app.goldsky.com) (free to create) Don't want an account? Pay per request with [x402 nanopayments](/edge-rpc/capabilities/x402): fund a Circle Gateway USDC balance once and call Edge directly with no API key. Edge RPC endpoints follow a simple URL format: ``` https://edge.goldsky.com/standard/evm/{chainId}?key={your-key} ``` Replace `{chainId}` with the chain ID (e.g., `1` for Ethereum, `42161` for Arbitrum, `8453` for Base) and `{your-key}` with your API key from the dashboard. **No account? Use `key=demo`.** Every example in these docs uses it, so you can paste and run any of them right now. It is a shared public key, rate limited and intended for demo and testing purposes only. Use your own key from the [dashboard](https://app.goldsky.com) for anything real. See the full list of [supported networks](/chains/supported-networks#coverage-matrix), or hit [`edge.goldsky.com`](https://edge.goldsky.com) directly for a programmatic JSON list of every chain (id, alias, block time, health status). ```bash theme={"dark"} curl https://edge.goldsky.com/standard/evm/1?key=demo \ -X POST \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "method": "eth_blockNumber", "params": [], "id": 1 }' ``` Response: ```json theme={"dark"} { "jsonrpc": "2.0", "id": 1, "result": "0x134a1b0" } ``` ```typescript theme={"dark"} import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http('https://edge.goldsky.com/standard/evm/1?key=demo') }) const blockNumber = await client.getBlockNumber() console.log('Block number:', blockNumber) ``` ```typescript theme={"dark"} import { JsonRpcProvider } from 'ethers' const provider = new JsonRpcProvider( 'https://edge.goldsky.com/standard/evm/1?key=demo' ) const blockNumber = await provider.getBlockNumber() console.log('Block number:', blockNumber) ``` ```typescript theme={"dark"} import Web3 from 'web3' const web3 = new Web3( 'https://edge.goldsky.com/standard/evm/1?key=demo' ) const blockNumber = await web3.eth.getBlockNumber() console.log('Block number:', blockNumber) ``` ## Getting help Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Fanout Source: https://docs.goldsky.com/edge-rpc/tiers/fanout A premium Edge RPC tier that cross-checks every read against multiple independent upstreams and verifies each response with deep data-integrity checks before returning it Built for workloads that can't tolerate a wrong answer: DeFi, AI agents, accounting. A stale, buggy, or manipulated upstream is outvoted rather than served, and a genuine disagreement is returned as an error instead of a guess. The Fanout tier is available on request. [Contact us](https://cal.com/team/goldsky/website-intro) or email [sales@goldsky.com](mailto:sales@goldsky.com) and we'll get you set up. ## Checks & coverage The methods below are fanned out to multiple independent upstreams (the standard tier tries one at a time). How the answer is settled depends on the method; expand any one to see it per network. ### Consensus The request goes to several independent upstreams; the answer is returned only when enough come back identical, so a lone wrong or stale node is outvoted. ### Highest value We query several upstreams and keep the highest, freshest value. A node that has fallen behind reports a number that is too low, which is enough to leave your transaction unmined or rejected. ### Broadcast We push it to every upstream in parallel for the widest, fastest propagation, and return the fastest response. ## Under the hood The tier layers two independent protections: **cross-source consensus** and per-response **data-integrity checks**. For reads with one canonical answer (state, blocks, logs, receipts), consensus sends the request to several independent upstreams in parallel via eRPC's [consensus failsafe](https://docs.erpc.cloud/config/failsafe/consensus) and only returns a value once a quorum agrees. Fields that legitimately differ between client implementations (block timestamps, L1 metadata) are ignored, so only meaningful disagreements count. When sources genuinely disagree it returns an error rather than guessing, routing around any upstream that returned wrong data. The quorum isn't hand-tuned: it's sized per network from how many independent upstreams it actually has. Not everything has a single right answer to vote on. Gas price and priority-fee estimates are computed locally by each node, and `eth_sendRawTransaction` is a write, not a read. So the tier still **fans these out to multiple upstreams**, but applies the rule that fits: it keeps the **highest** value for `eth_gasPrice` / `eth_maxPriorityFeePerGas` / `eth_getTransactionCount` (so a stale, too-low estimate can't stick you), and **broadcasts** `eth_sendRawTransaction` to every upstream in parallel for the widest, fastest propagation. Independently of agreement, every response runs through eRPC's data-integrity checks: | Check | What it verifies | | - | - | | **Structure, shape & encoding** | The response is well-formed and complete: correct structure, field shapes, and hex/RLP encoding. | | **Block tags & ranges** | `latest` resolves to the highest block the network has (not a lagging node's view), tagged blocks are never null, and `eth_getLogs` stays within its requested range. | | **Receipt integrity** | Receipts carry the correct logs bloom, item counts, and index contiguity. | | **Commitment recompute** | State and receipt roots and block hashes are recomputed from the response and must match. | | **Per-item authenticity** | Every transaction, receipt, and log is verified individually against its commitment. | | **Cross-block continuity** | Blocks chain correctly: parent hashes and numbers line up across the requested range. | | **Authoritative fetch** | Anything that can't be confirmed from data already on hand is force-fetched from an authoritative upstream and compared. | Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Why Edge RPC Source: https://docs.goldsky.com/edge-rpc/why-edge Fast, resilient, and accurate blockchain data ## Fastest responses from 8+ edge regions * Multi-region elastic cloud infrastructure serves requests from the closest location * Tip-of-the-chain CDN stores and serves recent blockchain data to you faster * Hedging mechanisms send parallel requests to multiple nodes for faster response times ## Maximum resiliency and failover * Automatic failover keeps requests flowing during provider outages * Internal scoring mechanisms prioritize the historically most reliable nodes * Multiplexing auto-merges identical requests to reduce redundant RPC calls ## Automated data quality checks * Cross-validate responses from multiple RPC nodes for accuracy * Integrity mechanisms track block heights across all providers * Enforce consensus checks to prevent stale/incorrect/partial data * No more partial or missing `eth_getLogs` results in your indexer ## Optimized for indexing * **Auto-split large `eth_getLogs` requests**: breaks down large block ranges to avoid provider limits * **Archive node routing**: requests for historical data automatically routed to archive nodes * **Block range enforcement**: integrity checks verify complete data without gaps ## Boosted for frontend * **Sub-50ms latency**: edge locations serve requests from the nearest region * **Request deduplication**: multiple users requesting the same data share a single upstream call * **Graceful degradation**: automatic retries and failover keep your dApp online * **Real-time data**: tip-of-chain caching serves latest blocks with minimal delay ## Simple pricing * **\$5 per million requests**: straightforward, predictable costs * **All methods priced equally**: no surprise charges for `eth_getLogs` or trace methods * **Volume discounts**: tiered pricing for usage over 500M requests/month *** Built on [eRPC](https://github.com/erpc/erpc), the open-source EVM RPC proxy Built-in rate limiting, DDoS protection, and API authentication Real-time dashboards for tracking usage and performance # Frequently asked questions Source: https://docs.goldsky.com/faq Collection of frequently (and not-so-frequently) asked questions. ## Subgraphs Endpoints are by default publicly accessible but you can make your endpoints private so that it's only accessible by authenticated users, see [private endpoints](./subgraphs/graphql-endpoints). Regardless of the access type, endpoints are typically rate-limited preventing abuse, and are not publicly indexed or searchable. As a best practice, you may want to proxy your requests to prevent leaking your endpoint URL from your front-end. No! If Goldsky has already indexed that subgraph (unique subgraphs identified by their IPFS hash), it will sync instantly, though you will be provided your own endpoint with your own rate limits applied. Query away. By default, the Scale plan is restricted to 50 requests every 10 seconds. However, our Enterprise plans scale horizontally and our highest-use endpoints handle thousands of requests a second at peak. If you need a higher rate limit than what you have enabled on your account, [schedule a call with our team](https://cal.com/team/goldsky/website-intro). Not at the moment, though similar functionality for “live queries” can be accomplished by polling our querying endpoints. We also do support webhooks, which can be similarly useful for certain push-based use cases. Deployments with a lot of metadata can sometimes time out the IPFS server. You can try again (right away, and if that isn't working, a bit later) and eventually one attempt should work. This is a limitation of the IPFS server, but we're exploring options to workaround this. If you continue to face issues, contact our support team at [support@goldsky.com](mailto:support@goldsky.com) and we'll help manually port it over. You may get `store error: column "x" specified more than once` when using Goldsky's [Instant Subgraphs functionality](/subgraphs/guides/create-a-low-code-subgraph). Multiple ABIs might be causing name conflicts due to conflicting fields or event names in the ABI. You can try splitting multiple ABIs into multiple subgraphs. There will be a mitigation for this in a future version. If you run into issues deploying or with the subgraph separately, contact our support team at [support@goldsky.com](mailto:support@goldsky.com). ## Pipelines Pipelines write data from `us-west-2` on AWS from a dynamic range of IP addresses. If you need VPC peering / static IPs for your allow list, see [static IP addresses](/platform/static-ips) or contact us at [support@goldsky.com](mailto:support@goldsky.com) to discuss your use case. Yes! Set `resource_size` at the top level of your Turbo pipeline YAML before you `goldsky turbo apply` it. (For legacy Mirror pipelines, add `--resource-size ` to `goldsky pipeline create `.) Yes. The pipeline uses upsert logic (`INSERT ... ON CONFLICT DO UPDATE`), so when a row with the same primary key already exists in the destination, it will be **updated** with the incoming data. This applies to databases that support upserts, such as PostgreSQL, MySQL, and Elasticsearch. For sinks that don't support upserts (e.g., S3), duplicate data will be written. Your destination sink and indexes kept will vastly influence how much storage you need for your data. We are working on publishing a record count for raw data tables to serve as a starting point for approximation, but in the meantime feel free to contact support for a better estimate for your specific use case! ## Platform API keys are only kept hashed (meaning after it's displayed for the first time, you need to copy and save it locally in order to access it, we won't be able to restore it for you!). If your API key is lost, you can reset / generate a new one from the settings page in the web app. Goldsky can support any EVM-compatible chain. If we don't support it in our shared indexing infrastructure, contact us to get set up with a dedicated indexer. Once set up, we can add new chains to your instance in about an hour turnaround time or less. [Schedule a call with our team](https://cal.com/team/goldsky/website-intro) to get started. Yes, every version of a subgraph incurs a separate worker fee and storage (in terms of entities) is also counted separately. Be sure to delete old versions of a subgraph you no longer need to query to minimize wasteful spend. ## Other It is pronounced `gold` (like the metal) - `sky` (like the region of the atmosphere we can see). NOT `ski` (like the winter sport). Yes, you can find our brand kit [here](https://goldsky.link/brand-kit). It includes logos, fonts, and other brand assets. For help with anything else not answered on this documentation page, feel free to try the doc-wide search with the top-bar, and if that doesn't help you find what you're looking for, don't hesitate to contact our support team at [support@goldsky.com](mailto:support@goldsky.com). # Feeds Source: https://docs.goldsky.com/feeds Feeds are ready-made onchain datasets, such as wallet balances and transfers, that you query over a REST API. No indexing or normalization on your side. Feeds are ready-made onchain datasets. Each feed answers one question about a wallet, such as what it holds or what it sent and received, across every supported chain in one request. Goldsky indexes, normalizes, and prices the data, so you don't run any of that yourself. Make your first Balances and Transfers requests. Endpoints, parameters, and response fields. Feed rows pushed to your database or webhook. Coming soon. \$0.35 per 1,000 requests. No minimum spend.
Onchain data from EVM chains flows into Goldsky Feeds, which produces Transfers and Balances. Your app queries them over the REST API. Streaming to your database is coming soon. Onchain data from EVM chains flows into Goldsky Feeds, which produces Transfers and Balances. Your app queries them over the REST API. Streaming to your database is coming soon.
## Available feeds | Feed | What it returns | | - | - | | [Balances](/feeds/api/balances) | A wallet's native and ERC-20 holdings, with USD values and a total for the wallet. | | [Transfers](/feeds/api/transfers) | A wallet's native and ERC-20 transfers in and out, newest first, with the USD value at transfer time. | Both feeds support Ethereum, Base, Arbitrum One, Optimism, Polygon, BNB Smart Chain, and Robinhood Chain. More feeds and chains are coming. ## What you can build * A portfolio screen with a total at the top and one row per token. * Deposit reconciliation that matches inbound transfers against the deposits you expect. * Notifications such as "You received 50 USDC" when a transfer lands. * Transfer history exports for tax and accounting tools. If you already get balances and transfers from another provider, Feeds works as a second source to cross-check against. ## How you get the data The REST API is self-serve: create an API key in the dashboard and start making requests. See the [quickstart](/feeds/quickstart). Streaming, which pushes feed rows to your own database or webhook as they land, is coming soon. See [streaming](/feeds/streaming) for early access. ## Pricing Requests cost \$0.35 per 1,000, with no minimum spend. A request costs the same whether it covers one chain or all seven. See [Feeds pricing](/pricing/summary#feeds) for rate limits and billing details. Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Balances Source: https://docs.goldsky.com/feeds/api/balances Get the latest native and ERC-20 balances for one wallet across chains, with USD values and a total for the wallet. ```text theme={"dark"} GET https://api.goldsky.com/api/v1/feeds/wallets/balances ``` Returns the latest balance of each token one wallet holds across the requested chains, native tokens included. Each row carries the token's metadata and USD value, and the response includes the wallet's total value. Use it to build a portfolio screen with the total at the top and one row per token. By default, tokens Goldsky has no price source for are left out. Set `include_unknown_price=true` to see them. ## Parameters This endpoint accepts the [shared parameters](/feeds/api/overview#shared-parameters), plus the following. Hide balances worth less than this many US dollars, to filter out dust. Must be `0` or more. Balances without a price are hidden too, since they have no value to compare. `total_value_usd` only counts the balances that pass. Also return zero balances: tokens the wallet held and fully sold, and native tokens it holds none of. ## Response The wallet address, in lowercase. Sum of `value_usd` over every balance that matches your filters, across all pages. Balances without a USD value add nothing, so read it as a lower bound. One entry per token balance, highest `value_usd` first. Balances without a price come last. Chain value, such as `ethereum`. See [supported chains](/feeds/api/overview#supported-chains). `evm`. Token contract address. The zero address for the chain's native token. Token symbol. Token name. Token decimals. URL of the token logo. Balance in the token's smallest unit. Latest token price in USD. Major stablecoins are priced at `1.0`. When Goldsky recorded `price_usd`. The API returns the latest price however old it is, so check this field if stale prices matter to you. A `null` here next to a `price_usd` means a major stablecoin priced at `1.0`. Leave those rows out of any staleness filter. `balance_raw / 10^token_decimals * price_usd`. `null` when the balance has no price. For a native token, the latest block when the API read the balance. For an ERC-20 token, the block of the wallet's most recent balance change. Timestamp of `block_number`. See [pagination](/feeds/api/overview#pagination). ## How the data behaves * **Latest only.** You can't ask for a wallet's balances at a past block. To reconstruct past holdings, use [Transfers](/feeds/api/transfers). * **Native balances are read live.** The API reads each chain's native balance over RPC when you make the request. If a chain doesn't answer, the request fails with `503 NATIVE_BALANCE_UNAVAILABLE`, lists the chains in `error.chains`, and sets `Retry-After`. To get the other chains in the meantime, leave the failing ones out of `chains`. * **Values move without onchain activity.** Prices update on their own schedule, so two requests seconds apart can return different values for the same balances. Pages are ordered by `value_usd`, so a balance whose value changes while you page through can be skipped or repeated. * **Going back re-reads the wallet.** A `prev_page_token` request uses current values, so a balance can land on a different page than it did the first time. ## Example ```bash theme={"dark"} curl "https://api.goldsky.com/api/v1/feeds/wallets/balances?address=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&page_size=2&key=$GOLDSKY_FEEDS_API_KEY" ``` ```json theme={"dark"} { "address": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045", "total_value_usd": 25174.729277920822, "data": [ { "chain": "ethereum", "chain_family": "evm", "token_address": "0x0000000000000000000000000000000000000000", "token_symbol": "ETH", "token_name": "Ether", "token_decimals": 18, "token_logo_url": "https://coin-images.coingecko.com/coins/images/279/large/ethereum.png?1696501628", "balance_raw": "5715987139328012679", "price_usd": 2659.529118748444, "last_priced_at": "2026-09-30T06:46:00.000Z", "value_usd": 15201.834239434469, "block_number": 26088597, "block_timestamp": "2026-09-30T06:47:23.000Z" }, { "chain": "base", "chain_family": "evm", "token_address": "0x0000000000000000000000000000000000000000", "token_symbol": "ETH", "token_name": "Ether", "token_decimals": 18, "token_logo_url": "https://coin-images.coingecko.com/coins/images/279/large/ethereum.png?1696501628", "balance_raw": "3128821803472537280", "price_usd": 2659.529118748444, "last_priced_at": "2026-09-30T06:46:00.000Z", "value_usd": 8321.192693710234, "block_number": 51980751, "block_timestamp": "2026-09-30T06:47:29.000Z" } ], "pagination": { "next_page_token": "eyJzIjoidmFsdWVfdXNkIiwiayI6IiIsInQiOiIiLCJm...", "prev_page_token": null, "page_size": 2 } } ``` # Feeds API overview Source: https://docs.goldsky.com/feeds/api/overview Base URL, authentication, supported chains, shared query parameters, pagination, and errors for the Goldsky Feeds REST API. The Feeds API is a REST API. Each feed is a `GET` endpoint that takes one wallet address and returns JSON. ## Base URL ```text theme={"dark"} https://api.goldsky.com/api/v1/feeds/wallets ``` ## Authentication Pass your API key in the `key` query parameter: ```bash theme={"dark"} curl "https://api.goldsky.com/api/v1/feeds/wallets/balances?address=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&key=$GOLDSKY_FEEDS_API_KEY" ``` Or send it in the `X-API-Key` header, which keeps the key out of URLs and access logs: ```bash theme={"dark"} curl -H "X-API-Key: $GOLDSKY_FEEDS_API_KEY" \ "https://api.goldsky.com/api/v1/feeds/wallets/balances?address=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045" ``` Create a key under [**API Keys**](https://app.goldsky.com/dashboard/feeds?tab=api-keys) on the Feeds page of the Goldsky dashboard. It's a Feeds API key, not the Goldsky API key the CLI uses. Your API key is a secret, so call the API from your server, not from the browser. ## Endpoints | Endpoint | Returns | | - | - | | [`GET /balances`](/feeds/api/balances) | The latest balance of each token a wallet holds, with USD values and a total for the wallet. | | [`GET /transfers`](/feeds/api/transfers) | A wallet's transfers in and out, newest first, with USD values. | Send test requests with your key. For codegen and AI agents. ## Supported chains | Chain | `chains` value | | - | - | | Ethereum | `ethereum` | | Base | `base` | | Arbitrum One | `arbitrum_one` | | Optimism | `optimism` | | Polygon | `polygon` | | BNB Smart Chain | `bsc` | | Robinhood Chain | `robinhood` | `mainnet`, `arbitrum`, and `matic` also work, as aliases for `ethereum`, `arbitrum_one`, and `polygon`. Values are case-insensitive, and a `-` reads as `_`, so `Arbitrum-One` works too. Any other value returns `400 BAD_REQUEST`. How far back the history goes can differ from chain to chain. ## Shared parameters Both endpoints accept these query parameters. Each endpoint page lists its own additional parameters. The wallet to look up: `0x` followed by 40 hex characters, in any case. Each request takes one address, so send one request per wallet. Comma-separated chain values, such as `ethereum,base`. Defaults to every [supported chain](#supported-chains). Comma-separated token contract addresses, up to 100. Use the zero address, `0x0000000000000000000000000000000000000000`, for each chain's native token. Comma-separated token symbols, such as `USDC,WETH`. Up to 100 symbols of at most 32 characters each. Case-insensitive. By default, both feeds leave out tokens Goldsky has no price source for. Set to `true` to include them. They can come back without a price or USD value. Results per page, up to `1000`. The `next_page_token` or `prev_page_token` from a previous response. ## Pagination Every response has a `pagination` object: ```json theme={"dark"} { "pagination": { "next_page_token": "eyJzIjoiYmxvY2tfdGltZXN0YW1wX2Rlc2MiLCJrIjoi...", "prev_page_token": null, "page_size": 100 } } ``` Pass `next_page_token` as `page_token` to get the next page, and keep going until `next_page_token` is `null`. `prev_page_token` takes you back one page and is `null` on the first page. A page token only works with the filters it was issued for. If you change a filter, start again from the first page, or the request returns `400 INVALID_CURSOR`. You can change `page_size` between pages. ## Errors API errors have a JSON body with a stable `code` to branch on and a `message` that explains what went wrong: ```json theme={"dark"} { "error": { "code": "BAD_REQUEST", "message": "`address` takes exactly one wallet per request, not a list. Issue one request per wallet." } } ``` | Status | `code` | Meaning | | - | - | - | | `400` | `BAD_REQUEST` | A parameter is missing or malformed, or a chain or transfer type is not supported. | | `400` | `INVALID_CURSOR` | `page_token` is malformed or was issued for different filters. | | `401` | `UNAUTHORIZED` | The API key is missing or invalid. | | `403` | `PERMISSION_DENIED` | The API key is disabled. Enable it under **API Keys** on the Feeds page. | | `422` | `CONFLICTING_FILTERS` | Two filters contradict each other, such as a `to` before `from`, or a block filter without exactly one chain. | | `502` | `UPSTREAM_CLICKHOUSE` or `UPSTREAM_EDGE` | A backend did not answer. Retry the request. | | `503` | `NATIVE_BALANCE_UNAVAILABLE` | Balances only. Native balances could not be read on the chains listed in `error.chains`. Retry after the number of seconds in the `Retry-After` header. | | `504` | `TIMEOUT` | The query timed out. Retry the request. | A request over your [rate limit](/pricing/summary#rate-limits) gets `429 Too Many Requests` with an empty body and a `Retry-After` header, in seconds. ## Data types * `amount_raw` and `balance_raw` are integers in the token's smallest unit, sent as strings so no precision is lost. Divide by `10^token_decimals` for the token amount. * Timestamps are RFC 3339 in UTC with milliseconds, such as `2026-09-30T06:47:23.000Z`. * Addresses come back in lowercase. * A chain's native token, such as ETH or BNB, has the zero address as its `token_address`. * Token metadata (`token_symbol`, `token_name`, `token_decimals`, `token_logo_url`) and prices can be `null`, and can fill in on a later request. # Transfers Source: https://docs.goldsky.com/feeds/api/transfers Get the native and ERC-20 transfers for one wallet across chains, newest first, with token metadata and the USD value at transfer time. ```text theme={"dark"} GET https://api.goldsky.com/api/v1/feeds/wallets/transfers ``` Returns the native and ERC-20 transfers in and out of one wallet across the requested chains, newest first. Each row carries the token's metadata, the counterparty, and the USD value at transfer time. Use it to send "You received 50 USDC" notifications, match inbound transfers against the deposits you expect, or export a wallet's history for tax tools. ## Parameters This endpoint accepts the [shared parameters](/feeds/api/overview#shared-parameters), plus the following. `native`, `erc20`, or both, comma-separated. Defaults to both. NFT transfer types (`erc721`, `erc1155`) are not supported yet and return `400`. `in` for transfers the wallet received, `out` for transfers it sent. Defaults to both. Only return transfers at or after this time, as an RFC 3339 timestamp such as `2026-09-01T00:00:00Z`. Only return transfers at or before this time, as an RFC 3339 timestamp. Must not be earlier than `from`. Only return transfers at or after this block. Needs exactly one chain in `chains`, because block numbers mean different things on different chains. Without it, the request returns `422 CONFLICTING_FILTERS`. Only return transfers at or before this block. Needs exactly one chain in `chains`, and must not be lower than `from_block`. By default, transfers of tokens Goldsky has no price source for are left out. If you match deposits in less common tokens, set `include_unknown_price=true` so none are missed. ## Response One entry per transfer, newest first by `block_timestamp`. Chain value, such as `base`. See [supported chains](/feeds/api/overview#supported-chains). `evm`. Block number of the transfer. Block timestamp. Transaction hash. Sender address. Recipient address. Reserved for a sender label. Always `null` today. Reserved for a recipient label. Always `null` today. `in` if the wallet you asked about received the transfer, `out` if it sent it. Token contract address. The zero address for the chain's native token. Token symbol. Token name. Token decimals. URL of the token logo. Amount in the token's smallest unit. Token price in USD at the time of the transfer. It's the last price Goldsky recorded shortly before the transfer's block, or `null` if there is none close enough. Major stablecoins are priced at `1.0`. `amount_raw / 10^token_decimals * price_usd`. `null` when `price_usd` or `token_decimals` is `null`. `native` or `erc20`. See [pagination](/feeds/api/overview#pagination). ## How the data behaves * **Transfers have no ID.** One transaction can contain several identical transfers, so deduplicating on `(chain, transaction_hash, from_address, to_address, token_address, amount_raw)` can drop real ones. * **Reorgs remove rows without notice.** There is no `removed` flag. A transfer reversed by a chain reorganization stops appearing in responses. If its transaction lands again, it can have a different `block_number` and `block_timestamp`, so don't build keys from block fields. * **USD values can change.** The API prices each transfer when you request it, so `price_usd` and `amount_usd` for an old transfer can change as Goldsky's price history fills in. * **Chains are merged by time.** Rows from different chains are interleaved by `block_timestamp`. Two transfers on different chains with the same timestamp can have happened in either order. ## Example This request gets the most recent transfer into a wallet on Base: ```bash theme={"dark"} curl "https://api.goldsky.com/api/v1/feeds/wallets/transfers?address=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&chains=base&direction=in&page_size=1&key=$GOLDSKY_FEEDS_API_KEY" ``` ```json theme={"dark"} { "data": [ { "chain": "base", "chain_family": "evm", "block_number": 51496203, "block_timestamp": "2026-09-19T01:35:53.000Z", "transaction_hash": "0x1d56f2edf92fc043da30a3af245a6d97733e57bd6a91b8116cdc0ef169964ec8", "from_address": "0xc5b87910fc3733f8a9cc8f8993cf2c6c7f8a4ab3", "to_address": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045", "from_label": null, "to_label": null, "direction": "in", "token_address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "token_symbol": "USDC", "token_name": "USDC", "token_decimals": 6, "token_logo_url": "https://coin-images.coingecko.com/coins/images/6319/large/USDC.png?1769615602", "amount_raw": "1000000", "price_usd": 1.0, "amount_usd": 1.0, "transfer_type": "erc20" } ], "pagination": { "next_page_token": "eyJzIjoiYmxvY2tfdGltZXN0YW1wX2Rlc2MiLCJrIjoi...", "prev_page_token": null, "page_size": 1 } } ``` # Get started with Feeds Source: https://docs.goldsky.com/feeds/quickstart Create a Feeds API key in the Goldsky dashboard and make your first Balances and Transfers requests for a wallet. This quickstart gets a wallet's balances and transfers from the Feeds REST API in three steps. ## Prerequisites * A [Goldsky account](https://app.goldsky.com) Open [Feeds in the Goldsky dashboard](https://app.goldsky.com/dashboard/feeds), go to [**API Keys**](https://app.goldsky.com/dashboard/feeds?tab=api-keys), and select **Create API key**. If you run a test request in the dashboard first, it creates a key for you. One key works for every feed in your project. This is a Feeds API key, not the Goldsky API key the CLI uses. Save the key in your server's environment: ```bash theme={"dark"} export GOLDSKY_FEEDS_API_KEY=your-api-key ``` Request the balances for a wallet: ```bash theme={"dark"} curl "https://api.goldsky.com/api/v1/feeds/wallets/balances?address=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&key=$GOLDSKY_FEEDS_API_KEY" ``` The response has the wallet's total value and one row per token, highest value first. This one is shortened to its first row: ```json theme={"dark"} { "address": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045", "total_value_usd": 25260.2792825334, "data": [ { "chain": "ethereum", "chain_family": "evm", "token_address": "0x0000000000000000000000000000000000000000", "token_symbol": "ETH", "token_name": "Ether", "token_decimals": 18, "token_logo_url": "https://coin-images.coingecko.com/coins/images/279/large/ethereum.png?1696501628", "balance_raw": "5715987139328012679", "price_usd": 2668.616188843224, "last_priced_at": "2026-09-30T08:19:00.000Z", "value_usd": 15253.775815230401, "block_number": 26089058, "block_timestamp": "2026-09-30T08:19:59.000Z" } ], "pagination": { "next_page_token": "eyJzIjoidmFsdWVfdXNkIiwiayI6IiIsInQiOiJi...", "prev_page_token": null, "page_size": 100 } } ``` Request the transfer history for the same wallet: ```bash theme={"dark"} curl "https://api.goldsky.com/api/v1/feeds/wallets/transfers?address=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&key=$GOLDSKY_FEEDS_API_KEY" ``` You get the wallet's transfers across every supported chain, newest first, 100 per page. This one is shortened to its first row: ```json theme={"dark"} { "data": [ { "chain": "ethereum", "chain_family": "evm", "block_number": 26088909, "block_timestamp": "2026-09-30T07:49:59.000Z", "transaction_hash": "0x1a4b7361a7700a95158ab51ace260ad29089c37144348f892af384b193e90159", "from_address": "0xc2363b7155ee8391c5395b72c46a6d22bf49151c", "to_address": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045", "from_label": null, "to_label": null, "direction": "in", "token_address": "0x6b175474e89094c44da98b954eedeac495271d0f", "token_symbol": "DAI", "token_name": "Dai", "token_decimals": 18, "token_logo_url": "https://coin-images.coingecko.com/coins/images/9956/large/Badge_Dai.png?1696509996", "amount_raw": "9800000000000000000", "price_usd": 1.0, "amount_usd": 9.8, "transfer_type": "erc20" } ], "pagination": { "next_page_token": "eyJzIjoiYmxvY2tfdGltZXN0YW1wX2Rlc2MiLCJr...", "prev_page_token": null, "page_size": 100 } } ``` To get the next page, pass `pagination.next_page_token` back as `page_token`. Each successful request is billed as one request, at \$0.35 per 1,000. ## Next steps Filter by chain or token, hide dust, and page through holdings. Filter by direction, transfer type, time, or block range. # Stream Feeds to your database Source: https://docs.goldsky.com/feeds/streaming Feeds streaming will push rows such as Transfers to your own database or webhook as they land. It's coming soon, with early access on request. Streaming is coming soon. Early access is available on request. Streaming will push feed rows to your own database or webhook as they land, so you don't have to poll the API for new data. For early access, email [support@goldsky.com](mailto:support@goldsky.com?subject=Feeds%20streaming%20early%20access). Tell us which feed you want and where it should go. # Support Source: https://docs.goldsky.com/getting-support Our team is on standby to help you get the most out of our products. ## Starter + Scale You can reach out to us any time with any questions, issues, concerns, or product ideas & feedback via email at [support@goldsky.com](mailto:support@goldsky.com) For Starter users, we do not provide any response time estimates. For Scale users, we target a response time of 24-48 hours on a best-effort basis. ## Enterprise If you are an Enterprise user, you have additional options for getting help: * Directly to your named Customer Success Manager via email * Via your dedicated Slack support channel * Via our Telegram support bot Response times are defined on a company-by-company basis in your Support SLA. Please reach out to your Account Manager if you have any questions. # GitHub Source: https://docs.goldsky.com/github-repo Browse Goldsky documentation examples and reference projects on GitHub. # Installation Source: https://docs.goldsky.com/installation Install the Goldsky CLI to deploy and manage your data pipelines The Goldsky CLI is the primary tool for deploying and managing subgraphs and Turbo pipelines. ## Install the CLI **For macOS/Linux:** ```shell theme={"dark"} curl https://goldsky.com | sh ``` **For Windows:** ```shell theme={"dark"} npm install -g @goldskycom/cli ``` Windows users need to have Node.js and npm installed first. Download from [nodejs.org](https://nodejs.org) if not already installed. ## Verify Installation After installation, verify the CLI is working: ```bash theme={"dark"} goldsky --version ``` ## Next Steps After installing the CLI, you'll need to authenticate: ```bash theme={"dark"} goldsky login ``` This will open your browser to complete authentication with your Goldsky account. Get started with subgraph indexing Stream blockchain data to your database Compare Subgraphs, Turbo, Edge RPC, and Compose Explore all CLI commands # Introduction to Goldsky Source: https://docs.goldsky.com/introduction Goldsky is the modern back-end for crypto-enabled products: real-time blockchain data and execution infrastructure, delivered as managed services. Goldsky is the modern back-end for crypto-enabled products: real-time blockchain data and execution infrastructure, delivered as managed services. Index it, stream it, query it, act on it, without running any of the infrastructure yourself. ## Set up in 60 seconds Install the CLI and log in: ```bash theme={"dark"} curl https://goldsky.com | sh goldsky login ``` Or hand setup to your AI assistant: copy this prompt to install the [Goldsky agent skills](/ai-skills) and connect the [docs MCP server](/mcp-server): ```text Agent setup prompt theme={"dark"} Set up Goldsky for me: run `npx skills add goldsky-io/goldsky-agent` to install the Goldsky agent skills, add the docs MCP server at https://docs.goldsky.com/mcp, then install the Goldsky CLI (curl https://goldsky.com | sh) and log in with `goldsky login`. ``` ## Find your starting point Choose the problem you are solving and we'll point you at the right product and quickstart. Some paths ask one follow-up question. ## What are you building? Move regulated money onchain: stablecoin flows, payment rails, and settlement. Track tokenized equities, RWAs, and permissioned securities in real time. Screen wallets, monitor transfers, and keep a durable audit trail. Reconcile onchain activity against your ledger, as it happens. ## Products Five products, one platform. Pick the shape of access you need: hosted API, streaming pipeline, cache-first RPC, managed RPC, or durable execution. Stream real-time chain data into your own database, warehouse, or queue. **Start:** [Turbo quickstart](/turbo-pipelines/quickstart) Keep your RPC provider while Goldsky serves eligible historical reads. **Start:** [Boost quickstart](/boost/quickstart) High-performance RPC endpoints for EVM networks. **Start:** [Edge RPC quickstart](/edge-rpc/quickstart) The execution layer for onchain/offchain workflows. **Start:** [Compose quickstart](/compose/quick-start) Instant GraphQL APIs with zero maintenance. **Start:** [Deploy a subgraph](/subgraphs/deploying-subgraphs) Not sure which fits, or how they combine? See [Which product do I need?](/which-product) To check chain support, see [Supported networks](/chains/supported-networks): 150+ networks across EVM, Solana, Bitcoin, and Move ecosystems. ## Trusted by teams like ## Get started Stream your first dataset in minutes. Build with Goldsky from your AI editor or agent. Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Goldsky MCP Server Source: https://docs.goldsky.com/mcp-server Connect Goldsky documentation to AI tools with our hosted MCP server ## About the Goldsky MCP server The Model Context Protocol (MCP) is an open standard for connecting AI applications to external services. Goldsky hosts an MCP server so AI tools like Claude, Cursor, and other MCP clients can search our documentation directly: * Find relevant documentation while coding * Get accurate answers about Goldsky's capabilities * Pull examples into your editor's context * Navigate between related features across products ### How the Goldsky MCP server works When an AI tool has the Goldsky MCP server connected, it can search our documentation while generating a response: * The AI searches Goldsky docs when relevant to your question * Searches span all core Goldsky products (Subgraphs, Turbo, Edge RPC, and Compose) * Results come from the live docs, so answers stay current ## Access the Goldsky MCP server The Goldsky MCP server is hosted at: ``` https://docs.goldsky.com/mcp ``` ## Connect the Goldsky MCP server Choose your preferred AI tool to get started with the Goldsky MCP server: To connect the Goldsky MCP server to Cursor: 1. Use Command + Shift + P (Ctrl + Shift + P on Windows) to open the command palette. 2. Search for "Open MCP settings". 3. Select **Add custom MCP**. This opens the `mcp.json` file. In `mcp.json`, add the Goldsky server: ```json theme={"dark"} { "mcpServers": { "Goldsky": { "url": "https://docs.goldsky.com/mcp" } } } ``` In Cursor's chat, ask "What tools do you have available?" Cursor should show the Goldsky MCP server as an available tool. Try asking: "How do I deploy a subgraph on Goldsky?" or "What data sinks does Turbo support?" See the [Cursor documentation](https://docs.cursor.com/en/context/mcp#installing-mcp-servers) for more details. To connect the Goldsky MCP server to VS Code: 1. Create a `.vscode/mcp.json` file in your project root. 2. In `mcp.json`, configure the Goldsky server: ```json theme={"dark"} { "servers": { "Goldsky": { "type": "http", "url": "https://docs.goldsky.com/mcp" } } } ``` Restart VS Code to load the MCP configuration. Use GitHub Copilot Chat and ask about Goldsky features. The AI should be able to access Goldsky documentation through the MCP server. Try asking: "Show me how to create a Turbo pipeline" or "What's the difference between Subgraphs and Turbo?" See the [VS Code documentation](https://code.visualstudio.com/docs/copilot/chat/mcp-servers) for more details. To use the Goldsky MCP server with Claude: 1. Navigate to the [Connectors](https://claude.ai/settings/connectors) page in Claude settings. 2. Select **Add custom connector**. 3. Add the Goldsky MCP server: * Name: `Goldsky` * URL: `https://docs.goldsky.com/mcp` 4. Select **Add**. 1. When using Claude, select the attachments button (the plus icon). 2. Select the Goldsky MCP server. 3. Ask Claude questions about Goldsky. Try asking: "How do I migrate a Mirror pipeline to Turbo?" or "Show me examples of Compose task triggers" See the [Model Context Protocol documentation](https://modelcontextprotocol.io/docs/tutorials/use-remote-mcp-server) for more details. To use the Goldsky MCP server with Claude Code, run the following command: ```bash theme={"dark"} claude mcp add --transport http Goldsky https://docs.goldsky.com/mcp ``` Test the connection by running: ```bash theme={"dark"} claude mcp list ``` Verify that "Goldsky" appears in the list of available MCP servers. See the [Claude Code documentation](https://docs.anthropic.com/en/docs/claude-code/mcp#installing-mcp-servers) for more details. ## Agent skills for AI coding assistants Beyond documentation search, Goldsky provides [Agent Skills](/ai-skills): workflow-based skills that guide AI assistants through tasks like deploying pipelines, managing secrets, and debugging issues. See the [AI agent skills](/ai-skills) page for installation instructions and available skills. ## Using the Goldsky MCP server effectively ### Best practices for AI-assisted development Once connected, your AI assistant can help you with: **When to use**: Starting a new project or evaluating options Ask questions like: * "Should I use Subgraphs or Turbo for my NFT marketplace?" * "When should I choose Turbo over Subgraphs?" The AI will search across product documentation to provide comparative guidance. **When to use**: Setting up pipelines, subgraphs, or compose apps Ask questions like: * "Show me a Turbo pipeline config for decoding Uniswap events" * "How do I configure a Turbo pipeline with TypeScript transforms?" * "What's the syntax for Compose task triggers on ERC-20 transfers?" The AI will find relevant configuration examples and syntax. **When to use**: Fixing issues or understanding errors Ask questions like: * "My subgraph deployment failed with error X, what does this mean?" * "How do I debug a failing Turbo transform?" * "What are common issues with Compose task execution?" The AI will search documentation for error explanations and solutions. If it can't help, email our support team and mention that you're using the MCP server for priority support. We keep adding debugging guidance to the docs to improve MCP results. ### Product-specific search tips **Key topics to search:** * Deploying and managing subgraphs * GraphQL schema and queries * Instant subgraphs (no-code) * Cross-chain/multi-chain indexing * Webhooks and event notifications * Migration from The Graph or Alchemy **Example queries:** * "How do I create an instant subgraph?" * "Show me how to deploy a cross-chain subgraph" * "What's the webhook payload format?" **Key topics to search:** * JSON-RPC method reference (`eth_*`, `debug_*`, `trace_*`) * Endpoint setup and authentication * Rate limits and transport options * Error codes * Capabilities (Flashblocks, x402) **Example queries:** * "What parameters does eth\_getLogs take?" * "Show me the Edge RPC endpoint format for Base" * "What Edge RPC error codes mean I'm rate limited?" **Key topics to search:** * Pipeline configuration syntax * TypeScript transform syntax * Data sources (EVM, Solana, Stellar) * Dynamic tables and schemas * HTTP handlers and webhooks * Job mode vs streaming mode **Example queries:** * "Show me TypeScript transform examples" * "How do I configure Solana source in Turbo?" * "What's the syntax for dynamic table definitions?" **Key topics to search:** * Task authoring and structure * Task triggers (time-based, blockchain events) * Context functions (fetch, EVM, collections) * Environment variables and secrets * Deployment and monitoring * Package imports **Example queries:** * "How do I create a task triggered by contract events?" * "Show me how to use EVM context to read contract state" * "How do I deploy and monitor Compose apps?" **Be specific about products**: mention the Goldsky product you mean (Subgraphs, Turbo, Edge RPC, or Compose) to get more targeted results. Example: "How do I configure a **Turbo** pipeline?" vs "How do I configure a pipeline?" (ambiguous between products) # Data quality Source: https://docs.goldsky.com/platform/data-quality How Goldsky ensures data quality during ingestion, including chain continuity, write guarantees, schema strictness, and delivery guarantees. ## Indexing Goldsky datasets are populated through various indexers, which write the data into a data stream. The data stream is accessible directly by users through [Turbo](/turbo-pipelines/introduction) and legacy [Mirror](/mirror/introduction) pipelines. Internally, we copy the data to a data lake which is then used to power various features and also used for data QA. Data quality is managed during ingestion, and also through periodic checks. Emitted data quality is managed through various database guarantees, depending on the destination of the data. ## Ingestion-level consistency ### Chain continuity When first ingesting a block, we check for a continuous block hash chain. If the chain is not valid (i.e. the parent hash does not match the hash we have of the preceding block number), we issue deletes and updates into our dataset and walk backwards until we reach a consistent chain again. All deletes and updates are propagated through to downstream sinks. This means if you have a pipeline writing chain data into a database, and that chain goes through a reorg or a rollback, **all the changes will automatically propagate to your database as well.** ### Write guarantees During ingestion, we ensure we have the full set of data for a block before emitting it into the various datasets. When emitting, we acquire full consistency acknowledgement from our various data sinks before marking the block as ingested. ### Schema strictness Our datasets follow strict typed schemas, causing writes that don't fit into said schemas to fail completely. ## Dataset validation checks In rare cases, RPC nodes can give us invalid data that may be missed during ingestion checks. For every dataset, we run checks on a daily basis and repair the data if any issues are seen. These checks validate: 1. Missing blocks (EVM) - we record the minimum and maximum block numbers for each date, and look for gaps in the data 2. Missing transactions (EVM) - We count unique transaction hashes per block and compare it with the `transaction_count` for the block. 3. Missing logs (EVM) - We compare the maximum log index per block with the number of logs per block. These checks work like unit tests: write one for a chain, and it runs against every chain from then on, catching regressions before you see them in your data. ## Destination-level consistency To prevent missing data when writing, both Turbo and Mirror pipelines are built with an **at-least-once guarantee**. **Turbo pipelines** coordinate source commits and sink flushes through a checkpointing protocol: a sink writes records to its destination first, and only after every sink confirms its write does the source commit its read position. See [Delivery guarantees](/turbo-pipelines/delivery-guarantees) for how the protocol works, when duplicates can occur, and how to design idempotent sinks. ### Mirror (legacy) consistency [Mirror](/mirror/introduction) pipelines achieve the same at-least-once guarantee with periodic snapshots instead of checkpoints: * **Snapshots**: automatic fault tolerance every minute with snapshot recovery every 4 hours. When a pipeline is updated or forced to terminate, a snapshot is persisted and used for the next incarnation of the pipeline, preserving continuity of the data being sent. * **Database acknowledgement**: every row requires full acknowledgement from the database before the pipeline moves to the next batch. Unacknowledged data is not marked sent in the snapshot, so on restart the pipeline is pessimistic and risks resending data over missing it. * **Sink downtime handling**: a failed write retries just that batch for that sink, then restarts the writers, and after prolonged failure the pipeline fails and resumes from the last saved snapshot when restarted. # Secrets Source: https://docs.goldsky.com/platform/secrets Create and manage credentials for pipeline sinks, transforms, and webhooks with the goldsky secret CLI. ## Overview Secrets store the credentials Goldsky needs to connect to your infrastructure: database connection details, message queue credentials, cloud provider keys, and HTTP auth headers. They are stored securely in your Goldsky project and referenced by name from your pipeline configuration, so credentials never appear in your YAML. ## Managing secrets Create and manage secrets with the `goldsky secret` command: ```bash theme={"dark"} # Create a secret (the CLI prompts for the type and value) goldsky secret create MY_POSTGRES_SECRET # List existing secrets goldsky secret list # Show a secret's stored value goldsky secret reveal MY_POSTGRES_SECRET # Delete a secret (add -f to skip the confirmation prompt in scripts) goldsky secret delete MY_POSTGRES_SECRET ``` Run `goldsky secret -h` for the full list of commands. Deleting a secret that a running pipeline references causes that pipeline to fail on its next connection. Check for references before deleting. ### Secret types and the interactive prompt Running `goldsky secret create` with no `--value` starts an interactive prompt that first asks you to pick a secret type, then collects the fields that type requires (host, credentials, region, etc.) and prints the permissions the credentials need before you paste them in. Every stored secret is tagged with one of these types: | Type | Used for | | - | - | | `jdbc` | Postgres and MySQL sinks. Enter a connection string or type in host/port/user/pass etc. | | `clickHouse` | ClickHouse sinks. URL, username, password, database name | | `elasticSearch` | Elasticsearch sinks (Mirror legacy). Host URL, username, password | | `opensearch` | OpenSearch sinks. Host URL, username, password | | `kafka` | Kafka sinks, with `PLAINTEXT`, `SASL_PLAINTEXT`, or `SASL_SSL` protocols | | `s3` | S3 and S3-compatible object storage sinks. Access key, secret key, region | | `sqs` | AWS SQS sinks. Access key, secret key, region | | `pubsub` | Google Cloud Pub/Sub sinks. GCP project ID plus a service-account JSON key | | `dynamodb` | AWS DynamoDB sinks. Access key, secret key, region | | `httpauth` | Webhook sinks. Stores a single auth header as a `secretKey` / `secretValue` pair | Compose secrets are created through the [`goldsky compose` CLI](/compose/cli-reference#secrets). Turbo webhook sinks accept an `httpauth` secret via `secret_name`, but the header it injects cannot also appear in the sink's inline `headers:` field. Pick one or the other. See the [Turbo webhook sink](/turbo-pipelines/sinks/webhook#secret-creation) for details. ### Naming secrets Secret names can only contain alphanumeric characters, underscores (`_`), and hyphens (`-`). Use descriptive uppercase names that encode environment and purpose (`PROD_POSTGRES_MAIN`, `STAGING_CLICKHOUSE`) rather than `secret1` or `postgres`, so a `goldsky secret list` stays legible as your project grows. ### Rotating credentials Update a secret in place to rotate credentials without touching any pipeline YAML: ```bash theme={"dark"} goldsky secret update MY_POSTGRES_SECRET --value 'postgres://admin:NEW_PASSWORD@db.example.com:5432/mydb' ``` Running pipelines pick up the new value on their next connection. ## Referencing a secret in a pipeline Reference a secret by name in the `secret_name` field of a sink or transform: ```yaml theme={"dark"} sinks: postgres_output: type: postgres from: filtered_transfers schema: public table: erc20_transfers secret_name: MY_POSTGRES_SECRET # References the stored secret primary_key: id ``` ## Secret formats Each sink or transform type expects its own secret format. For [Turbo pipelines](/turbo-pipelines/introduction), database secrets are created from a connection string; queue and storage secrets are JSON objects; HTTP secrets store a header name and value. | Used by | Format | Details | | - | - | - | | [PostgreSQL sink](/turbo-pipelines/sinks/postgres), [dynamic tables](/turbo-pipelines/transforms/dynamic-tables) | `postgres://user:password@host:port/database` | [Postgres sink](/turbo-pipelines/sinks/postgres) | | [ClickHouse sink](/turbo-pipelines/sinks/clickhouse) | `https://user:password@host:port/database` (`clickHouse` type) | [ClickHouse sink § Secret format](/turbo-pipelines/sinks/clickhouse#secret-format) | | [MySQL sink](/turbo-pipelines/sinks/mysql) | `mysql://user:password@host:3306/database` or individual fields | [MySQL sink § Secret format](/turbo-pipelines/sinks/mysql#secret-format) | | [Kafka sink](/turbo-pipelines/sinks/kafka) | JSON object (`bootstrapServers`, SASL credentials, schema registry) | [Kafka sink § Secret structure](/turbo-pipelines/sinks/kafka#secret-structure) | | [SQS sink](/turbo-pipelines/sinks/sqs) | JSON object (`accessKeyId`, `secretAccessKey`, `region`) | [SQS sink § Secret format](/turbo-pipelines/sinks/sqs#secret-format) | | [S3 sink](/turbo-pipelines/sinks/s3) | JSON object (`accessKeyId`, `secretAccessKey`, `region`) | [S3 sink § Secret format](/turbo-pipelines/sinks/s3#secret-format) | | [Pub/Sub sink](/turbo-pipelines/sinks/pubsub) | `pubsub` type (GCP project id + service account key) | [Pub/Sub sink § Secret format](/turbo-pipelines/sinks/pubsub#secret-format) | | [Webhook sinks](/turbo-pipelines/sinks/webhook), [HTTP handler transforms](/turbo-pipelines/transforms/http-handler) | `httpauth` type (header name + value) | [Webhook sink § Secret creation](/turbo-pipelines/sinks/webhook#secret-creation) | ### Example: PostgreSQL Postgres is the most common case. Create the secret and paste a standard connection string when prompted: ```bash theme={"dark"} goldsky secret create MY_POSTGRES_SECRET ``` ``` postgres://goldsky_writer:your_secure_password@db.example.com:5432/your_database?sslmode=require ``` See the [Postgres sink](/turbo-pipelines/sinks/postgres) page for database role setup, provider-specific notes, and the inline JSON alternative. If you use [Goldsky-hosted Postgres](/turbo-pipelines/sinks/postgres), provisioning the database automatically registers a secret in your project. There is no separate `goldsky secret create` step. ## Mirror (legacy) secrets [Mirror](/mirror/introduction) pipelines use a different format for database secrets: a JSON object with individual connection fields instead of a connection string. For example, a Mirror Postgres secret looks like: ```bash theme={"dark"} goldsky secret create --name MY_POSTGRES_SECRET --value '{ "type": "jdbc", "protocol": "postgresql", "host": "db.host.com", "port": 5432, "databaseName": "myDatabase", "user": "myUser", "password": "myPassword" }' ``` When migrating a Mirror pipeline to Turbo, recreate database secrets in the Turbo connection-string format; see the [migration guide](/turbo-pipelines/migrate-from-mirror). Formats for Mirror-only sinks are documented on the surviving legacy pages, for example [Elasticsearch](/mirror/sinks/elasticsearch). Mirror pipelines: the guided `goldsky pipeline create ` flow lists your existing secrets and offers to create a new one as part of pipeline creation, so you don't need to create a secret beforehand. ## Troubleshooting | Symptom | Cause and fix | | - | - | | `Secret 'MY_SECRET' not found` | The name doesn't exist or is misspelled. Run `goldsky secret list` and check the exact name. | | `Secret 'MY_SECRET' already exists` | The name is taken. Use `goldsky secret update MY_SECRET --value "..."` to change its value, or pick a different name. | | `Invalid JSON in secret value` | Syntax error in a JSON-typed secret. Validate first with `echo '{...}' \| jq .` before creating. | | Pipeline fails with `connection refused` | Credentials are wrong or the database is unreachable. Verify outside Goldsky (`psql "postgresql://..."`), check the stored value with `goldsky secret reveal`, and make sure your database accepts connections from [Goldsky's IPs](/platform/static-ips). | | Pipeline fails with `authentication failed` | Wrong username or password. Update the secret with corrected credentials. | | Password contains special characters | In connection strings, URL-encode special characters. In JSON-typed secrets the password is its own field, so most characters work as-is; escape backslashes (`\\`), quotes (`\"`), and newlines (`\n`). | # Static IPs Source: https://docs.goldsky.com/platform/static-ips Restrict access to your sinks by allowlisting Goldsky's static egress IPs. ## Overview Goldsky can connect to your sinks using static IPs. This is helpful if you want to further restrict access to your sinks and ensure that only Goldsky-owned services can reach them. It works the same way for [Turbo](/turbo-pipelines/introduction) and legacy [Mirror](/mirror/introduction) pipelines. This feature is available for enterprise customers. Contact us at [support@goldsky.com](mailto:support@goldsky.com) (or through Slack/Telegram) to request access to this feature, or [schedule a call with our team](https://cal.com/team/goldsky/website-intro). ## Usage 1. Reach out to us to have this feature enabled for your account. 2. Allowlist the following IPs on your database or network firewall: `100.21.15.214`, `44.229.26.196`, `44.230.239.184`, `52.38.124.121` 3. Make sure you're using the latest version of the CLI; see the [installation guide](/installation). 4. Set `use_dedicated_ip: true` at the top level of your pipeline YAML and deploy. Example Turbo pipeline: ```yaml theme={"dark"} name: private-ip-pipeline resource_size: s use_dedicated_ip: true # Route this pipeline's traffic through Goldsky's static egress IPs sources: ethereum_erc20_transfers: type: dataset dataset_name: ethereum.erc20_transfers version: 1.2.0 # Dataset version start_at: latest sinks: postgres_transfers: type: postgres from: ethereum_erc20_transfers schema: public table: erc20_transfers secret_name: DB_WITH_IP_ALLOWLISTED primary_key: id ``` Mirror pipelines use the same top-level `use_dedicated_ip: true` flag in their YAML (alongside Mirror's required `apiVersion: 3` field). Without `use_dedicated_ip: true`, pipelines connect from dynamic IPs and an IP-restricted firewall will reject the connection. # Pricing: plans, metering, and product costs Source: https://docs.goldsky.com/pricing/summary How Goldsky bills Subgraphs, Mirror, Turbo, Edge RPC, Feeds, and Compose usage with hourly metering, compute and storage tiers, bandwidth, and function calls. ## Overview The [pricing calculator on the Goldsky website](https://goldsky.com/pricing) is a good resource for estimating run rate costs. ## Plans Goldsky offers three plans: **Starter (free)** Access to Subgraphs, Mirror/Turbo pipelines, Edge RPC calls, and Feeds. All customers begin on the Starter plan, which includes a one-time \$100 credit toward usage. See [Starter credits](#starter-credits). **Scale (pay-as-you-go)** Everything in Starter, plus Hosted Databases and Compose. Adding a credit card upgrades your account to Scale. Usage-based pricing, with a monthly free allowance on every meter (the "Free" rows in the tables below). **Enterprise** Everything in Scale, plus dedicated support, advanced features (e.g., static IP addresses, custom network integrations), and committed-use discounts. Pricing is based on individual contract terms. ## Starter credits Every new [team](/teams-and-projects) receives **\$100 in Starter credits**. Subgraph, pipeline, and Feeds usage draws down that balance at the standard rates listed in the tables below. Two things to know about how this differs from Scale: * **Credits are one-time, not monthly.** The balance does not reset at the start of each billing cycle. Each team receives one grant, and upgrading to Scale and later returning to Starter does not produce a new one. * **The monthly free allowances do not apply on Starter.** The "Free" rows in the tables below describe the Scale plan. On Starter, metered subgraph and pipeline usage is priced from the first unit and deducted from your credit balance. Your remaining balance is shown as **Starter credits** in the [Goldsky Dashboard](https://app.goldsky.com). We email you when you have used 50% and 90% of the balance. ### When credits run out Once the balance reaches zero, your Starter resources (subgraphs, pipelines, and endpoints) are paused. **You are never charged for usage on the Starter plan**; if usage accrued past the credit balance, that amount is written off rather than billed. To resume, add a credit card to upgrade to Scale. Your resources come back online, and Scale's monthly free allowances apply from that point forward. ## Hourly metering Our prices are quoted on a monthly basis for simpler presentation, but metered and billed on an hourly basis. This has a few key implications: 1. To account for the varying number of days in each month of the year, we conservatively estimate that each month has 730 hours. For hosted databases, the assumption is 720 hours per month. 2. All estimations on this page assume "always-on" capacity. In practice, you can run double the number of subgraph workers or pipeline workers for half the time and pay the same price. This similarly holds for the "entities stored" metric in subgraphs, etc. ## Billing Usage across all products is tracked and billed monthly through the [Goldsky Dashboard](https://app.goldsky.com). You can monitor your usage and costs in real-time across all meters including subgraph workers, pipeline workers, storage, bandwidth, and RPC requests. For high-volume pricing or enterprise agreements, [schedule a call with our team](https://cal.com/team/goldsky/website-intro). In the per-product tables that follow, the **"Free" row is the Scale plan's monthly allowance**, which resets each billing cycle. On the Starter plan there is no monthly allowance: subgraph and pipeline usage is priced at the paid rate from the first unit and drawn from your [Starter credits](#starter-credits). ## Subgraphs We bill for usage based on two metrics: 1. The number of active subgraphs 2. The amount of data stored across all subgraphs in your team. ### Compute The number of active subgraph workers, tracked hourly. If you pause or delete a subgraph, it is no longer billed. One subgraph run for an entire month therefore costs the same as two subgraphs run for half a month. Pausing a subgraph stops billing, but it is not a long-term storage mechanism. Subgraphs left paused for an extended period are subject to permanent deletion along with their indexed data. | Monthly Count | Worker Hours | Monthly Cost | Hourly Cost | | - | - | - | - | | 3 | 2,250 | Free | \$0.00 | | >3 | 2,251+ | \~\$36.50 | \$0.05 | ### Storage The number of entities stored across all subgraphs in your team, tracked hourly. Each stored entity counts once: updating an entity does not add to the count, and deleting an entity removes it from the count from the next hour onward. Hours already recorded are not reduced. If you delete a subgraph, its stored entities are no longer tracked. Costs below are **per 100K entities**. Tiers are set in storage hours (entities stored × hours), and each tier applies only to the storage hours within its range. The entity counts shown are approximate. Monthly costs assume an average 730-hour month; you are billed for the actual hours in each month. | Entities Stored | Storage Hours | Monthly Cost per 100K | Hourly Cost per 100K | | - | - | - | - | | First \~100K | 75,000,000 | Free | \$0.0000 | | \~100K-10M | 75M-7.5B | \~\$3.89 | \$0.0053 | | \~10M+ | >7.5B | \~\$0.97 | \$0.0013 | For example, storing 100M entities for a 730-hour month uses 73B storage hours: the first 75M storage hours are free, the next 7.425B cost \$396, and the remaining 65.5B cost \$873, for a total of about \$1,269. ## Mirror/Turbo We bill for usage based on two metrics: 1. The number of active Mirror/Turbo pipeline workers 2. The amount of data written to your sinks by Mirror/Turbo pipelines ### Compute The number of active workers, billed hourly. Pipeline resources can have multiple parallel workers, and each worker incurs usage separately. | Resource Size | Workers | | - | - | | small (default) | 1 | | medium | 4 | | large | 10 | | x-large | 20 | | xx-large | 40 | If you have one small pipeline and one large pipeline each deployed for 2 hours, you will accumulate `1*2*1 + 1*2*10 = 2 + 20 = 22` hours of usage. Note: Pipelines that use a single subgraph as a source, and webhooks or GraphQL APIs as sink(s), are not metered as pipelines. However, you still accumulate hourly subgraph usage. Examples: 1. If you have **1** small pipeline, you use **1** *pipeline worker-hour* every hour. At 730 hours in the average month, you would incur **730** *pipeline worker-hours* for that month. 2. If you start with **10** small pipelines in a billing period and delete all of them halfway through the billing period, you are charged the equivalent of 5 pipeline workers for the full billing period. 3. If you have **2** large pipelines, you will be using **20** *pipeline worker-hours* every hour, equating to **14,600** *pipeline worker-hours* if you run them the entire month. | Monthly Count | Worker Hours | Monthly Cost | Hourly Cost | | - | - | - | - | | 1 | 750 | Free | \$0.0000 | | >1 | 750+ | \~\$73.00 | \$0.10 | ### Bandwidth The number of records written by pipelines in your project. For example, for a PostgreSQL sink, every row created, updated, or deleted, counts as a 'write'. For a Kafka sink, every message counts as write. Examples: 1. If you have a pipeline that writes **20,000** records per day for 10 days, and then **20** records per day for 10 days, you will be using **200,200** pipeline event writes. 2. If you have two pipelines that each write 1 million events in one month, you accumulate 2 million event writes. On Scale, the first million falls under the monthly free allowance and the second million costs \$10.00 (\$1.00 per 100,000 events). On Starter, all 2 million events are drawn from your credits. | Count | Cost | | - | - | | 1M | Free | | 1M-100M | \$1.00 per 100,000 events | | 100M+ | \$0.10 per 100,000 events | ## Edge RPC Edge RPC provides high-performance RPC endpoints for EVM networks. All RPC methods are priced equally. | Monthly Requests | Cost per Million Requests | | - | - | | Up to 500M | \$5.00 | | 500M+ | Volume discounts available | For tiered volume discount details, [contact our team](mailto:support@goldsky.com). Learn more about Edge RPC in the [Edge documentation](/edge-rpc/introduction). ## Feeds Feeds API requests cost \$0.35 per 1,000 (\$350 per 1M). There is no minimum spend, so you pay only for the requests you make. | | | | - | - | | Rate | \$0.35 per 1,000 requests | | Minimum spend | None | | Unit | One successful request to any feed endpoint, however many chains it covers | | Starter plan | Drawn from your \$100 [Starter credits](#starter-credits) | | Billing | Monthly in arrears | Every request costs the same. There are no per-endpoint multipliers or per-chain surcharges, so a Balances request across all seven supported chains costs the same as a Transfers request for one. Every `200` response is billed, including one with an empty page. Error responses are not billed. ### Rate limits Rate limits apply per project, not per API key. | Tier | Requests per second | Monthly fee | How to get it | | - | - | - | - | | Starter | 5 | \$0 | Included on the Starter plan. No card required. | | Scale | 50 | \$0 | Included on the Scale plan. Add a card to upgrade. | | Raise | 100 | +\$500 | [Email support](mailto:support@goldsky.com) | | Raise | 250 | +\$1,500 | [Email support](mailto:support@goldsky.com) | | Raise | 500 | +\$2,500 | [Email support](mailto:support@goldsky.com) | | Enterprise | 500+, guaranteed | Contract | [Contact sales](mailto:sales@goldsky.com) | Raise fees are on top of usage, and requests are still billed at \$0.35 per 1,000. A request over your limit gets `429 Too Many Requests` with a `Retry-After` header that says how many seconds to wait. [Streaming](/feeds/streaming) is coming soon and will be priced separately. Learn more in the [Feeds documentation](/feeds). ## Compose Compose is only available on **Scale** plans. We bill for usage based on three metrics: 1. **Compute:** The number of active Compose worker hours 2. **Function calls:** The number of billable function calls made by your Compose applications 3. **Gas sponsoring:** A surcharge on gas spent through Goldsky-sponsored transactions ### Compute The number of active Compose app workers, tracked hourly. | Monthly Count | Worker Hours | Monthly Cost | Hourly Cost | | - | - | - | - | | 1 | 720 | Free | \$0.00 | | >1 | 721+ | \~\$36.50 | \$0.05 | ### Function calls The number of billable function calls made by your Compose applications. Billable call types include: `FETCH_CALL`, `READ_CONTRACT_CALL`, `WRITE_CONTRACT_CALL`, `SIMULATE_CONTRACT_CALL`, `EXECUTE_SIGNED_TRANSACTION_CALL`, and `GET_BALANCE_CALL`. | Monthly Count | Monthly Cost | Per-Call Cost | | - | - | - | | 10,000 | Free | \$0.0000 | | 10,001+ | \$6.00 per 1,000 calls | \$0.0060 | ### Gas sponsoring If you use Goldsky for gas sponsoring, a 10% surcharge is applied on top of the gas spent. Gas sponsoring is optional: this charge only applies if you enable it for your Compose applications. Learn more about Compose in the [Compose documentation](/compose/introduction). ## Hosted databases Hosted databases are only available on Scale plans. Hosted databases are used for both Mirror and Turbo pipelines as a sink option, and for Compose applications. We bill for usage based on two metrics: 1. **Storage:** The amount of total storage used 2. **Compute:** The amount of compute time (memory and CPU) used ### Storage We bill for database storage based on the amount of storage you use during your billing cycle, measured hourly. | Count | GB-Storage Hours | Monthly Cost | Hourly Cost | | - | - | - | - | | 250MB | 180 | Free | \$0.0000 | | 250MB+ | 181+ | \~\$1.50 | \$0.0021 | ### Compute The total active CPU hours across all databases, multiplied by the number of vCPUs in use. This is tracked hourly. If you delete or pause a pipeline that uses a hosted Postgres database, the database will transition to idle mode and **you won't incur utilization charges** during that time. Note that if you query the database from an external source, like a DB visualization tool, you will be charged for utilization since the database is actively being queried. VCUs are auto-scaled, so you'll be charged a variable hourly rate depending on how much time is spent in each VCU range. | Count | CPU-Hours | Monthly Cost | Hourly Cost | | :- | :- | :- | :- | | 1 | 1+ | \~\$115 | \$0.16 | ## AWS Marketplace [Goldsky is available on AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-hkxwqutlje2cq) as an approved AWS Partner (APN). This provides an alternative purchasing option for customers who want to consolidate their cloud spending. ### Benefits * **Consolidated billing**: Goldsky charges appear directly on your AWS invoice * **Use existing AWS commit**: AWS Marketplace purchases can count toward retiring up to 25% of your annual AWS commitment * **Simplified procurement**: Purchase through your existing AWS account without additional vendor onboarding To purchase Goldsky through AWS Marketplace, [contact our team](mailto:support@goldsky.com). # Role-based access control Source: https://docs.goldsky.com/rbac Use RBAC to determine who can do what on your Goldsky project ## Overview Goldsky supports Role Based Access Control (RBAC) to help you restrict what actions can be taken by different members of the team. We support 4 different roles: `Owner`, `Admin`, `Editor` and `Viewer`. The permissions are listed below: * `Owner` * Can do everything an `Admin` can do * Can add other `Owner`s to the project * Can remove other `Owner`s from the project * Can update the role of teammates to `Owner` * Can change the subscription and billing information of the project * `Admin` * Can do everything an `Editor` can do * Can invite non-`Owner` teammates to a project * Can remove non-`Owner` teammates from a project * Can update the role of non-`Owner` teammates on a project * `Editor` * Can do everything a `Viewer` can do * Can create, update, and delete API keys * Can create, update and delete subgraphs * Can create, update and delete pipelines * Can create, update and delete secrets * Can create, update and delete webhooks * Can edit the name of a project * `Viewer` * Can view and reveal API keys * Can view subgraphs * Can view pipelines * Can view secrets * Can view webhooks * Can view metrics * Can view teammates * Can leave a project * Can create new projects ## Using the Webapp ### Adding a teammate to your project When adding a teammate you will be prompted to select the desired role for the new teammate(s). The default selected role is `Viewer` ### Changing the role of teammates You must be an `Admin` to change the role of your teammate(s). To manage the RBAC settings for the team members of a given project, select the project and navigate to the [Settings](https://app.goldsky.com/dashboard/settings#team) menu. Click on the overflow menu and click on `Update Role` ## Using the Command Line ### Adding a teammate to your project Use the `--role` flag of `goldsky project users invite` to select which role the invited users will have. The default role is `Viewer`. ``` goldsky project users invite --emails "" "" (passing as many emails as you want) --role ``` ### Changing the role of teammates Use the `--role` flag of `goldsky project users update` to change the role a user defined by the `--email` ``` goldsky project users update --email "" --role ``` # CLI Reference Source: https://docs.goldsky.com/reference/cli Goldsky's command line interface reference ``` goldsky args ``` How to use: ``` goldsky args Commands: goldsky Get started with Goldsky [default] goldsky login Log in to Goldsky to enable authenticated CLI commands goldsky logout Log out of Goldsky on this computer goldsky subgraph Commands related to subgraphs goldsky project Commands related to project management goldsky pipeline Commands related to Goldsky pipelines goldsky hosted-sink Commands related to Goldsky-hosted databases goldsky dataset Commands related to Goldsky datasets goldsky indexed Analyze blockchain data with indexed.xyz goldsky secret Commands related to secret management goldsky edge Commands related to Edge endpoint management goldsky boost Commands related to Boost: cache-first EVM JSON-RPC endpoints backed by your own providers goldsky telemetry Commands related to CLI telemetry goldsky turbo Commands related to Goldsky Turbo goldsky compose [passthrough...] commands for the compose CLI Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -v, --version Show version number [boolean] -h, --help Show help [boolean] ``` ## login ``` goldsky login ``` Opens your browser to sign in to Goldsky (Google, GitHub, SSO, or email) and authenticates the CLI automatically — there's no API key to copy. For scripted or headless environments, pass a pre-created API key with `--token`, or use `--no-browser` to print the login URL instead of opening a browser. How to use: ``` goldsky login Log in to Goldsky to enable authenticated CLI commands Options: --token CLI Auth Token [string] [default: ""] --browser Open the login page in a browser automatically. Use --no-browser to print the URL instead (e.g. remote/headless shells). [boolean] [default: true] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ## logout ``` goldsky logout ``` How to use: ``` goldsky logout Log out of Goldsky on this computer Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ## subgraph ``` goldsky subgraph ``` How to use: ``` goldsky subgraph Commands related to subgraphs Commands: goldsky subgraph deploy Deploy a subgraph to Goldsky goldsky subgraph list [nameAndVersion] View deployed subgraphs and tags goldsky subgraph delete Delete a subgraph from Goldsky goldsky subgraph tag Commands related to tags goldsky subgraph webhook Commands related to webhooks goldsky subgraph log Tail a subgraph's logs goldsky subgraph pause Pause a subgraph goldsky subgraph start Start a subgraph goldsky subgraph update Update a subgraph goldsky subgraph init [nameAndVersion] Initialize a new subgraph project with basic scaffolding Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### subgraph deploy ``` goldsky subgraph deploy ``` How to use: ``` goldsky subgraph deploy Deploy a subgraph to Goldsky Positionals: nameAndVersion Name and version of the subgraph, e.g. 'my-subgraph/1.0.0' [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --path Path to subgraph [string] --description Description/notes for the subgraph [string] --from-ipfs-hash IPFS hash of a publicly deployed subgraph [string] --ipfs-gateway IPFS gateway to use if downloading the subgraph from IPFS [string] [default: "https://ipfs.network.thegraph.com"] --from-abi Generate a subgraph from an ABI [string] --from-url GraphQL endpoint for a publicly deployed subgraph [string] --remove-graft Remove grafts from the subgraph prior to deployment [boolean] [default: false] --start-block Change start block of your subgraph prior to deployment. If used in conjunction with --graft-from, this will be the graft block as well. [number] --graft-from Graft from the latest block of an existing subgraph in the format / [string] --enable-call-handlers Generate a subgraph from an ABI with call handlers enabled. Only meaningful when used with --from-abi [boolean] [default: false] --tag Tag the subgraph after deployment, comma separated for multiple tags [string] -h, --help Show help [boolean] ``` ### subgraph list ``` goldsky subgraph list [nameAndVersion] ``` How to use: ``` goldsky subgraph list [nameAndVersion] View deployed subgraphs and tags Positionals: nameAndVersion Name and version of the subgraph, e.g. 'my-subgraph/1.0.0' [string] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --filter Limit results to just tags or deployments [choices: "tags", "deployments"] --summary Summarize subgraphs & versions without all their details [boolean] [default: false] -h, --help Show help [boolean] ``` ### subgraph delete ``` goldsky subgraph delete ``` How to use: ``` goldsky subgraph delete Delete a subgraph from Goldsky Positionals: nameAndVersion Name and version of the subgraph, e.g. 'my-subgraph/1.0.0' [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -f, --force Force the deletion without prompting for confirmation [boolean] [default: false] -h, --help Show help [boolean] ``` ### subgraph tag ``` goldsky subgraph tag ``` How to use: ``` goldsky subgraph tag Commands related to tags Commands: goldsky subgraph tag create Create a new tag goldsky subgraph tag delete Delete a tag Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` #### subgraph tag create ``` goldsky subgraph tag create ``` How to use: ``` goldsky subgraph tag create Create a new tag Positionals: nameAndVersion Name and version of the subgraph, e.g. 'my-subgraph/1.0.0' [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -t, --tag The name of the tag [string] [required] -h, --help Show help [boolean] ``` #### subgraph tag delete ``` goldsky subgraph tag delete ``` How to use: ``` goldsky subgraph tag delete Delete a tag Positionals: nameAndVersion Name and version of the subgraph, e.g. 'my-subgraph/1.0.0' [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -t, --tag The name of the tag to delete [string] [required] -f, --force Force the deletion without prompting for confirmation [boolean] [default: false] -h, --help Show help [boolean] ``` ### subgraph webhook ``` goldsky subgraph webhook ``` How to use: ``` goldsky subgraph webhook Commands related to webhooks Commands: goldsky subgraph webhook create Create a webhook goldsky subgraph webhook delete [webhook-name] Delete a webhook goldsky subgraph webhook list List webhooks goldsky subgraph webhook list-entities List possible webhook entities for a subgraph Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` #### subgraph webhook create ``` goldsky subgraph webhook create ``` How to use: ``` goldsky subgraph webhook create Create a webhook Positionals: nameAndVersion Name and version of the subgraph, e.g. 'my-subgraph/1.0.0' [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --name Name of the webhook, must be unique [string] [required] --url URL to send events to [string] [required] --entity Subgraph entity to send events for [string] [required] --secret The secret you will receive with each webhook request Goldsky sends [string] -h, --help Show help [boolean] ``` #### subgraph webhook delete ``` goldsky subgraph webhook delete [webhook-name] ``` How to use: ``` goldsky subgraph webhook delete [webhook-name] Delete a webhook Positionals: webhook-name Name of the webhook to delete [string] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --name Name of the webhook to delete [deprecated: Please use the positional argument instead.] [string] -f, --force Force the deletion without prompting for confirmation [boolean] [default: false] -h, --help Show help [boolean] ``` #### subgraph webhook list ``` goldsky subgraph webhook list ``` How to use: ``` goldsky subgraph webhook list List webhooks Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` #### subgraph webhook list-entities ``` goldsky subgraph webhook list-entities ``` How to use: ``` goldsky subgraph webhook list-entities List possible webhook entities for a subgraph Positionals: nameAndVersion Name and version of the subgraph, e.g. 'my-subgraph/1.0.0' [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### subgraph log ``` goldsky subgraph log ``` How to use: ``` goldsky subgraph log Tail a subgraph's logs Positionals: nameAndVersion Name and version of the subgraph, e.g. 'my-subgraph/1.0.0' [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --since Return logs newer than a relative duration like now, 5s, 2m, or 3h [default: "1m"] --format The format used to output logs, use text or json for easier parsed output, use pretty for more readable console output [choices: "pretty", "json", "text"] [default: "text"] --filter The minimum log level to output [choices: "error", "warn", "info", "debug"] [default: "info"] --levels The explicit comma separated log levels to include (error, warn, info, debug) --interval The time in seconds to wait between checking for new logs [number] [default: 5] -h, --help Show help [boolean] ``` ### subgraph pause ``` goldsky subgraph pause ``` How to use: ``` goldsky subgraph pause Pause a subgraph Positionals: nameAndVersion Name and version of the subgraph, e.g. 'my-subgraph/1.0.0' [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### subgraph start ``` goldsky subgraph start ``` How to use: ``` goldsky subgraph start Start a subgraph Positionals: nameAndVersion Name and version of the subgraph, e.g. 'my-subgraph/1.0.0' [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### subgraph update ``` goldsky subgraph update ``` How to use: ``` goldsky subgraph update Update a subgraph Positionals: nameAndVersion Name and version of the subgraph, e.g. 'my-subgraph/1.0.0' [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --public-endpoint Toggle public endpoint for the subgraph [string] [choices: "enabled", "disabled"] --private-endpoint Toggle private endpoint for the subgraph [string] [choices: "enabled", "disabled"] --description Description/notes for the subgraph [string] -h, --help Show help [boolean] ``` ### subgraph init ``` goldsky subgraph init [nameAndVersion] ``` How to use: ``` goldsky subgraph init [nameAndVersion] Initialize a new subgraph project with basic scaffolding Positionals: nameAndVersion Name and version of the subgraph, e.g. 'my-subgraph/1.0.0' [string] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --target-path Target path to write subgraph files to [string] --force Overwrite existing files at the target path [boolean] [default: false] --from-config Path to instant subgraph JSON configuration file [string] --abi ABI source(s) for contract(s) [string] --contract Contract address(es) to watch for events [string] --contract-events Event names to index for the contract(s) [string] --contract-calls Call names to index for the contract(s) [string] --network Network(s) to use for contract(s) reference our docs for supported subgraph networks: https://docs.goldsky.com/chains/supported-networks [string] --contract-name Name of the contract(s) [string] --start-block Block to start at for a contract on a specific network [string] --description Subgraph description [string] --call-handlers Enable call handlers for the subgraph [boolean] --build Build the subgraph after writing files [boolean] --deploy Deploy the subgraph after build [boolean] -h, --help Show help [boolean] ``` ## project ``` goldsky project ``` How to use: ``` goldsky project Commands related to project management Commands: goldsky project users Commands related to the users of a project goldsky project leave Leave a project goldsky project list List all of the projects you belong to goldsky project update Update a project goldsky project create Create a project Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### project users ``` goldsky project users ``` How to use: ``` goldsky project users Commands related to the users of a project Commands: goldsky project users list List all users for this project goldsky project users invite Invite a user to your project goldsky project users remove Remove a user from your project goldsky project users update Update a user's project permissions Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` #### project users list ``` goldsky project users list ``` How to use: ``` goldsky project users list List all users for this project Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` #### project users invite ``` goldsky project users invite ``` How to use: ``` goldsky project users invite Invite a user to your project Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --emails emails of users to invite [array] [required] --role desired role of invited user(s) [string] [required] [choices: "Owner", "Admin", "Editor", "Viewer"] [default: "Viewer"] -h, --help Show help [boolean] ``` #### project users remove ``` goldsky project users remove ``` How to use: ``` goldsky project users remove Remove a user from your project Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --email email of user to remove [string] [required] -h, --help Show help [boolean] ``` #### project users update ``` goldsky project users update ``` How to use: ``` goldsky project users update Update a user's project permissions Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --email email of user to remove [string] [required] --role role of user to update [string] [required] [choices: "Owner", "Admin", "Editor", "Viewer"] -h, --help Show help [boolean] ``` ### project leave ``` goldsky project leave ``` How to use: ``` goldsky project leave Leave a project Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --projectId the ID of the project you want to leave [string] [required] -h, --help Show help [boolean] ``` ### project list ``` goldsky project list ``` How to use: ``` goldsky project list List all of the projects you belong to Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### project update ``` goldsky project update ``` How to use: ``` goldsky project update Update a project Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --name the new name of the project [string] [required] -h, --help Show help [boolean] ``` ### project create ``` goldsky project create ``` How to use: ``` goldsky project create Create a project Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --name the name of the new project [string] [required] -h, --help Show help [boolean] ``` ## pipeline ``` goldsky pipeline ``` How to use: ``` goldsky pipeline Commands related to Goldsky pipelines Commands: goldsky pipeline get Get a pipeline goldsky pipeline export [name] Export pipeline configurations goldsky pipeline apply Apply the provided pipeline yaml config. This command creates the pipeline if it doesn't exist or updates the existing pipeline. This command is idempotent. goldsky pipeline get-definition [deprecated] Get a shareable pipeline definition. Use "pipeline get --definition" instead. goldsky pipeline create Create a pipeline goldsky pipeline update [deprecated] Update a pipeline. Use "pipeline apply" instead. goldsky pipeline delete Delete a pipeline goldsky pipeline list List all pipelines goldsky pipeline monitor Monitor a pipeline runtime goldsky pipeline pause Pause a pipeline goldsky pipeline start Start a pipeline goldsky pipeline stop Stop a pipeline goldsky pipeline info Display pipeline information goldsky pipeline resize Resize a pipeline goldsky pipeline validate [config-path] Validate a pipeline definition or config. goldsky pipeline cancel-update Cancel in-flight update request goldsky pipeline restart Restart a pipeline. Useful in scenarios where pipeline needs to be restarted without any configuration changes. goldsky pipeline snapshots Commands related to snapshots [aliases: snapshot] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### pipeline get ``` goldsky pipeline get ``` How to use: ``` goldsky pipeline get Get a pipeline Positionals: nameOrConfigPath pipeline name or config file path [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --outputFormat, --output format of the output. Either json or table. Defaults to json. [deprecated] [string] [choices: "json", "table", "yaml"] [default: "yaml"] --definition print the pipeline's definition only (sources, transforms, sinks) [boolean] -v, --version pipeline version. Returns latest version of the pipeline if not set. [string] -h, --help Show help [boolean] ``` ### pipeline export ``` goldsky pipeline export [name] ``` How to use: ``` goldsky pipeline export [name] Export pipeline configurations Positionals: name pipeline name [string] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --all Export pipeline configurations for all available pipelines [boolean] -h, --help Show help [boolean] ``` ### pipeline apply ``` goldsky pipeline apply ``` How to use: ``` goldsky pipeline apply Apply the provided pipeline yaml config. This command creates the pipeline if it doesn't exist or updates the existing pipeline. This command is idempotent. Positionals: config-path path to the yaml pipeline config file. [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --from-snapshot Snapshot that will be used to start the pipeline. Applicable values are: 'last', 'new', 'none' or a snapshot-id. 'last' uses latest available snapshot. 'new' creates a new snapshot to use. 'none': does not use any snapshot aka starts from scratch. Including the option without any argument will start an interactive mode to select from a list of available snapshots. Defaults to 'new' [string] --save-progress Attempt a snapshot of the pipeline before applying the update. Only applies if the pipeline already has status: ACTIVE and is running without issues. Defaults to saving progress unless pipeline is being updated to status=INACTIVE. [deprecated: Use '--from-snapshot'] [boolean] --skip-transform-validation skips the validation of the transforms when updating the pipeline. Defaults to false [boolean] --skip-validation skips the validation of the transforms when updating the pipeline. Defaults to false [deprecated] [boolean] --use-latest-snapshot attempts to use the latest available snapshot. [deprecated: Use '--from-snapshot'] [boolean] --status Status of the pipeline [string] [choices: "ACTIVE", "INACTIVE", "PAUSED"] --force Forces apply without any prompts, useful for using apply in CI [boolean] -h, --help Show help [boolean] ``` ### pipeline get-definition ``` goldsky pipeline get-definition ``` How to use: ``` goldsky pipeline get-definition [deprecated] Get a shareable pipeline definition. Use "pipeline get --definition" instead. Positionals: name pipeline name [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --outputFormat, --output format of the output. Either json or yaml. Defaults to yaml. [deprecated] [string] [choices: "json", "yaml"] [default: "yaml"] -h, --help Show help [boolean] ``` ### pipeline create ``` goldsky pipeline create ``` How to use: ``` goldsky pipeline create Create a pipeline Positionals: name name of the new pipeline [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --output, --outputFormat format of the output. Either json or table. Defaults to table. [string] [choices: "json", "table", "yaml"] [default: "yaml"] --resource-size, --resourceSize runtime resource size for when the pipeline runs [deprecated: Use 'pipeline resize'] [string] [required] [choices: "s", "m", "l", "xl", "xxl", "mem.l", "mem.xl", "mem.xxl"] [default: "s"] --skip-transform-validation skips the validation of the transforms when creating the pipeline. [boolean] --description the description of the new pipeline [deprecated: Use 'pipeline apply'] [string] --definition definition of the pipeline that includes sources, transforms, sinks. Provided as json eg: `{sources: [], transforms: [], sinks:[]}` [deprecated: Use 'pipeline apply'] [string] --definition-path path to a json/yaml file with the definition of the pipeline that includes sources, transforms, sinks. [deprecated: Use 'pipeline apply'] [string] --status the desired status of the pipeline [deprecated: Use 'pipeline start/stop/pause'] [string] [choices: "ACTIVE", "INACTIVE"] [default: "ACTIVE"] --use-dedicated-ip Whether the pipeline should use dedicated egress IPs [boolean] [required] [default: false] -h, --help Show help [boolean] ``` ### pipeline update ``` goldsky pipeline update ``` How to use: ``` goldsky pipeline update [deprecated] Update a pipeline. Use "pipeline apply" instead. Positionals: name name of the pipeline to update. [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --outputFormat, --output format of the output. Either json or table. Defaults to json. [deprecated] [string] [required] [choices: "json", "table", "yaml"] [default: "yaml"] --resource-size, --resourceSize runtime resource size for when the pipeline runs [string] [choices: "s", "m", "l", "xl", "xxl", "mem.l", "mem.xl", "mem.xxl"] --status status of the pipeline [string] [choices: "ACTIVE", "INACTIVE", "PAUSED"] --save-progress takes a snapshot of the pipeline before applying the update. Only applies if the pipeline already has status: ACTIVE. Defaults to saving progress unless pipeline is being updated to status=INACTIVE. [boolean] --skip-transform-validation skips the validation of the transforms when updating the pipeline. [boolean] --use-latest-snapshot attempts to use the latest available snapshot. [boolean] --definition definition of the pipeline that includes sources, transforms, sinks. Provided as json eg: `{sources: [], transforms: [], sinks:[]}` [string] --definition-path path to a json/yaml file with the definition of the pipeline that includes sources, transforms, sinks. [string] --description description of the pipeline` [string] -h, --help Show help [boolean] ``` ### pipeline delete ``` goldsky pipeline delete ``` How to use: ``` goldsky pipeline delete Delete a pipeline Positionals: nameOrConfigPath pipeline name or config file path [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -f, --force Force the deletion without prompting for confirmation [boolean] [default: false] -h, --help Show help [boolean] ``` ### pipeline list ``` goldsky pipeline list ``` How to use: ``` goldsky pipeline list List all pipelines Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --output, --outputFormat format of the output. Either json or table. Defaults to json. [string] [choices: "json", "table", "yaml"] [default: "table"] --outputVerbosity Either summary or all. Defaults to summary. [string] [choices: "summary", "usablewithapplycmd", "all"] [default: "summary"] --include-runtime-details includes runtime details for each pipeline like runtime status and errors. Defaults to false. [boolean] [default: false] -h, --help Show help [boolean] ``` ### pipeline monitor ``` goldsky pipeline monitor ``` How to use: ``` goldsky pipeline monitor Monitor a pipeline runtime Positionals: nameOrConfigPath pipeline name or config file path [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --update-request monitor update request [boolean] --max-refreshes, --maxRefreshes max. number of data refreshes. [number] -v, --version pipeline version, uses latest version if not set. [string] -h, --help Show help [boolean] ``` ### pipeline pause ``` goldsky pipeline pause ``` How to use: ``` goldsky pipeline pause Pause a pipeline Positionals: nameOrConfigPath pipeline name or config file path [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### pipeline start ``` goldsky pipeline start ``` How to use: ``` goldsky pipeline start Start a pipeline Positionals: nameOrConfigPath pipeline name or config path [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --use-latest-snapshot attempts to use the latest available snapshot. [deprecated: Use '--from-snapshot'] [boolean] --from-snapshot Snapshot that will be used to start the pipeline. Applicable values are: 'last', 'new', 'none' or a snapshot-id. 'last' uses latest available snapshot. 'new' creates a new snapshot to use. 'none': does not use any snapshot aka starts from scratch. Including the option without any argument will start an interactive mode to select from a list of available snapshots. Defaults to 'new' [string] -h, --help Show help [boolean] ``` ### pipeline stop ``` goldsky pipeline stop ``` How to use: ``` goldsky pipeline stop Stop a pipeline Positionals: nameOrConfigPath pipeline name or config file path [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### pipeline info ``` goldsky pipeline info ``` How to use: ``` goldsky pipeline info Display pipeline information Positionals: nameOrConfigPath pipeline name or config file path [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -v, --version pipeline version. Returns latest version of the pipeline if not set. [string] -h, --help Show help [boolean] ``` ### pipeline resize ``` goldsky pipeline resize ``` How to use: ``` goldsky pipeline resize Resize a pipeline Positionals: nameOrConfigPath pipeline name or config file path [string] [required] resource-size, resourceSize runtime resource size [string] [choices: "s", "m", "l", "xl", "xxl", "mem.l", "mem.xl", "mem.xxl"] [default: "s"] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### pipeline validate ``` goldsky pipeline validate [config-path] ``` How to use: ``` goldsky pipeline validate [config-path] Validate a pipeline definition or config. Positionals: config-path path to the yaml pipeline config file. [string] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --definition definition of the pipeline that includes sources, transforms, sinks. Provided as json eg: `{sources: [], transforms: [], sinks:[]}` [deprecated: use config-path positional instead.] [string] --definition-path path to a json/yaml file with the definition of the pipeline that includes sources, transforms, sinks. [deprecated: use config-path positional instead.] [string] -h, --help Show help [boolean] ``` ### pipeline cancel-update ``` goldsky pipeline cancel-update ``` How to use: ``` goldsky pipeline cancel-update Cancel in-flight update request Positionals: nameOrConfigPath pipeline name or config file path [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### pipeline restart ``` goldsky pipeline restart ``` How to use: ``` goldsky pipeline restart Restart a pipeline. Useful in scenarios where pipeline needs to be restarted without any configuration changes. Positionals: nameOrConfigPath pipeline name or config path [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --from-snapshot Snapshot that will be used to start the pipeline. Applicable values are: 'last', 'new', 'none' or a snapshot-id. 'last' uses latest available snapshot. 'new' creates a new snapshot to use. 'none': does not use any snapshot aka starts from scratch. Including the option without any argument will start an interactive mode to select from a list of available snapshots. Defaults to 'new' [string] [required] --disable-monitoring Disables monitoring after the command is run. Defaults to false. [boolean] [default: false] -h, --help Show help [boolean] ``` ### pipeline snapshots ``` goldsky pipeline snapshots ``` How to use: ``` undefined ``` #### pipeline snapshots list ``` goldsky pipeline snapshots list ``` How to use: ``` goldsky pipeline snapshots list List snapshots in a pipeline Positionals: nameOrConfigPath pipeline name or config file path [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -v, --version pipeline version. Returns snapshots across all versions if not set. [string] -h, --help Show help [boolean] ``` #### pipeline snapshots create ``` goldsky pipeline snapshots create ``` How to use: ``` goldsky pipeline snapshots create Attempts to take a snapshot of the pipeline Positionals: nameOrConfigPath pipeline name or config file path [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ## dataset ``` goldsky dataset ``` How to use: ``` goldsky dataset Commands related to Goldsky datasets Commands: goldsky dataset get Get a dataset goldsky dataset list List datasets Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### dataset get ``` goldsky dataset get ``` How to use: ``` goldsky dataset get Get a dataset Positionals: name dataset name [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --outputFormat the output format. Either json or yaml. Defaults to yaml [string] -v, --version dataset version [string] -h, --help Show help [boolean] ``` ### dataset list ``` goldsky dataset list ``` How to use: ``` goldsky dataset list List datasets Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --output, --outputFormat format of the output. One of table, json, or yaml. Defaults to table. [string] [choices: "json", "table", "yaml"] [default: "table"] --group filter datasets to a single group (e.g. robinhood_mainnet). Skips the interactive group picker. [string] -h, --help Show help [boolean] ``` ## indexed ``` goldsky indexed ``` How to use: ``` goldsky indexed Analyze blockchain data with indexed.xyz Commands: goldsky indexed sync Commands related to syncing indexed.xyz real-time raw & decoded crypto datasets Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### indexed sync ``` goldsky indexed sync ``` How to use: ``` goldsky indexed sync Commands related to syncing indexed.xyz real-time raw & decoded crypto datasets Commands: goldsky indexed sync decoded-logs Sync decoded logs for a smart contract from a network to this computer goldsky indexed sync raw-blocks Sync all blocks from a network goldsky indexed sync raw-logs Sync all logs from a network goldsky indexed sync raw-transactions Sync all transactions from a network Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` #### indexed sync decoded-logs ``` goldsky indexed sync decoded-logs ``` How to use: ``` goldsky indexed sync decoded-logs Sync decoded logs for a smart contract from a network to this computer Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --contract-address The contract address you are interested in [string] [default: ""] --network The network of indexed.xyz data to synchronize [string] [default: "ethereum"] -h, --help Show help [boolean] ``` #### indexed sync raw-blocks ``` goldsky indexed sync raw-blocks ``` How to use: ``` goldsky indexed sync raw-blocks Sync all blocks from a network Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --network The network of indexed.xyz data to synchronize [string] [default: "ethereum"] -h, --help Show help [boolean] ``` #### indexed sync raw-logs ``` goldsky indexed sync raw-logs ``` How to use: ``` goldsky indexed sync raw-logs Sync all logs from a network Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --contract-address The contract address you are interested in [string] [default: ""] --network The network of indexed.xyz data to synchronize [string] [default: "ethereum"] -h, --help Show help [boolean] ``` #### indexed sync raw-transactions ``` goldsky indexed sync raw-transactions ``` How to use: ``` goldsky indexed sync raw-transactions Sync all transactions from a network Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --network The network of indexed.xyz data to synchronize [string] [default: "ethereum"] -h, --help Show help [boolean] ``` ## secret ``` goldsky secret ``` How to use: ``` goldsky secret Commands related to secret management Commands: goldsky secret create create a secret goldsky secret list list all secrets goldsky secret reveal reveal a secret goldsky secret update update a secret goldsky secret delete delete a secret Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### secret create ``` goldsky secret create ``` How to use: ``` goldsky secret create create a secret Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --name the name of the new secret [string] --value the value of the new secret in json [string] --description the description of the new secret [string] -h, --help Show help [boolean] ``` Running `goldsky secret create` with no `--value` launches an interactive prompt that first asks you to select a **secret type** (`jdbc`, `clickHouse`, `elasticSearch`, `opensearch`, `kafka`, `s3`, `sqs`, `pubsub`, `dynamodb`, or `httpauth`) and then collects the fields that type requires. Passing both `--name` and `--value` (JSON) creates the secret non-interactively and skips the type selector. See [Mirror secrets](/mirror/manage-secrets) for details on each type and the JSON schema for `--value`. ### secret list ``` goldsky secret list ``` How to use: ``` goldsky secret list list all secrets Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### secret reveal ``` goldsky secret reveal ``` How to use: ``` goldsky secret reveal reveal a secret Positionals: name the name of the secret [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### secret update ``` goldsky secret update ``` How to use: ``` goldsky secret update update a secret Positionals: name the name of the secret [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --value the new value of the secret [string] --description the new description of the secret [string] -h, --help Show help [boolean] ``` ### secret delete ``` goldsky secret delete ``` How to use: ``` goldsky secret delete delete a secret Positionals: name the name of the secret to delete [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -f, --force Force the deletion without prompting for confirmation [boolean] [default: false] -h, --help Show help [boolean] ``` ## hosted-sink ``` goldsky hosted-sink ``` Commands related to Goldsky-hosted databases. Provisions a fully managed Postgres (Neon) database and stores its credentials as a Goldsky secret, so you can use it as a pipeline sink without bringing your own database. `goldsky hosted-sink` requires the **Scale plan or above**. On an account without access, the command fails with a message pointing to your team's billing page (`https://app.goldsky.com/teams//billing`). How to use: ``` goldsky hosted-sink Commands related to Goldsky-hosted databases Commands: goldsky hosted-sink create Provision a Goldsky-hosted database Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### hosted-sink create ``` goldsky hosted-sink create --type postgres ``` Provisions a Goldsky-hosted Postgres (Neon) database and stores its credentials as a secret. When `--name` is omitted, a name is generated automatically as `HOSTED_POSTGRES_`. How to use: ``` goldsky hosted-sink create Provision a Goldsky-hosted database Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --type the type of hosted database to provision [string] [required] [choices: "postgres"] --name the name of the hosted database secret (auto-generated when omitted) [string] --description the description of the hosted database secret [string] -h, --help Show help [boolean] ``` On success the command prints the created secret's **name**, **ID**, and **type**: ``` Name: HOSTED_POSTGRES_1A2B3C4D ID: clxy... Type: jdbc ``` The database connection string is intentionally **not** printed, so credentials are never written to logs. Reference the database from a pipeline by using the printed secret **name** as the sink's `secret_name`. ## edge ``` goldsky edge ``` Commands related to Edge endpoint management. Create and manage [Edge](/edge) endpoints (API keys) from the terminal, and inspect the networks and datasets Edge exposes. How to use: ``` goldsky edge Commands related to Edge endpoint management Commands: goldsky edge create create an Edge endpoint goldsky edge list list Edge endpoints goldsky edge get show details for an Edge endpoint goldsky edge update update an Edge endpoint's rate limit or allowed domains (Boost providers: goldsky boost) goldsky edge delete delete an Edge endpoint goldsky edge pause pause an Edge endpoint goldsky edge resume resume a paused Edge endpoint goldsky edge reveal print the API key for an Edge endpoint goldsky edge metrics print request/error metrics for an Edge endpoint as JSON (boost endpoints report cache hits, latencies, miss reasons, and savings) goldsky edge networks list the chains/networks supported by Edge RPC goldsky edge sources list the datasets available through Edge Data Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` Each endpoint belongs to one **product**: `rpc` ([Edge RPC](/edge-rpc/introduction)), `data` ([Edge Data](/edge#edge-data)), or `boost` ([Boost](/boost)). Boost endpoints also have their own command group, [`goldsky boost`](#boost), for configuring providers. ### edge create ``` goldsky edge create ``` Creates an Edge endpoint. The name is a label you choose; the API key is generated for you and can be printed at any time with [`edge reveal`](#edge-reveal). How to use: ``` goldsky edge create create an Edge endpoint Positionals: name the name of the new endpoint [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --product the Edge product to create the endpoint for [choices: "rpc", "data", "boost"] [default: "rpc"] --rate-limit named rate-limit budget (run with an invalid value to list the valid budgets) [string] --allowed-domains comma-separated web origins allowed to call this endpoint from a browser [string] -h, --help Show help [boolean] ``` `--rate-limit` takes a named budget. Budgets are named `edge-tier--total--per-ip`, where the total is the requests-per-minute cap across all callers of the endpoint and the per-IP part is the cap for any single client IP. Pass an invalid value to print the current list: ``` edge-tier-6krpm-total-unlimited-per-ip edge-tier-60krpm-total-unlimited-per-ip edge-tier-180krpm-total-unlimited-per-ip edge-tier-360krpm-total-unlimited-per-ip edge-tier-600krpm-total-unlimited-per-ip edge-tier-6krpm-total-500rpm-per-ip edge-tier-60krpm-total-500rpm-per-ip edge-tier-180krpm-total-500rpm-per-ip edge-tier-360krpm-total-500rpm-per-ip edge-tier-600krpm-total-500rpm-per-ip edge-tier-unlimited-total-100rpm-per-ip edge-tier-unlimited-total-500rpm-per-ip ``` When `--rate-limit` is omitted the endpoint uses your plan's default budget. `--allowed-domains` restricts browser callers to the listed web origins (for example `https://app.example.com,https://staging.example.com`); server-side callers are unaffected. Endpoints are unrestricted by default. ### edge list ``` goldsky edge list ``` How to use: ``` goldsky edge list list Edge endpoints Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --product only list endpoints for this Edge product [choices: "rpc", "data", "boost"] -h, --help Show help [boolean] ``` Prints a table with each endpoint's name, product, status (for example `ACTIVE`, or `PAUSED` after `edge pause`), rate-limit budget, allowed domains, and creation time. ### edge get ``` goldsky edge get ``` How to use: ``` goldsky edge get show details for an Edge endpoint Positionals: name the endpoint name [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` Example output: ``` Name: grand-pulse Product: rpc Status: ACTIVE Rate limit: default Allowed domains: unrestricted Created at: 6/10/2026, 9:09:37 AM ``` The API key is not included; use [`edge reveal`](#edge-reveal) for that. ### edge update ``` goldsky edge update ``` How to use: ``` goldsky edge update update an Edge endpoint's rate limit or allowed domains (Boost providers: goldsky boost) Positionals: name the endpoint name [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --rate-limit named rate-limit budget, or "default" to reset to the default budget (run with an invalid value to list the valid budgets) [string] --allowed-domains comma-separated web origins allowed to call this endpoint from a browser; pass an empty string to remove the restriction [string] -h, --help Show help [boolean] ``` Pass `--rate-limit default` to return to your plan's default budget, and `--allowed-domains ""` to remove the browser-origin restriction. See [`edge create`](#edge-create) for the list of budgets. ### edge delete ``` goldsky edge delete ``` How to use: ``` goldsky edge delete delete an Edge endpoint Positionals: name the endpoint name [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --force skip the confirmation prompt [boolean] [default: false] -h, --help Show help [boolean] ``` Deleting an endpoint revokes its API key immediately. Any client still using the key gets authentication errors. Use [`edge pause`](#edge-pause) if you want to stop traffic without losing the key. ### edge pause ``` goldsky edge pause ``` Stops the endpoint from serving requests while keeping its key and configuration. Requests to a paused endpoint are rejected until it is resumed. How to use: ``` goldsky edge pause pause an Edge endpoint Positionals: name the endpoint name [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### edge resume ``` goldsky edge resume ``` How to use: ``` goldsky edge resume resume a paused Edge endpoint Positionals: name the endpoint name [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### edge reveal ``` goldsky edge reveal ``` Prints the endpoint's API key. Treat the output as a secret; it is the same key shown in the dashboard. How to use: ``` goldsky edge reveal print the API key for an Edge endpoint Positionals: name the endpoint name [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### edge metrics ``` goldsky edge metrics ``` Prints request and error counts for the endpoint as JSON, bucketed over the window you choose. Defaults to the last 24 hours. The output has two arrays, `requests` and `errors`, one entry per bucket. How to use: ``` goldsky edge metrics print request/error metrics for an Edge endpoint as JSON (boost endpoints report cache hits, latencies, miss reasons, and savings) Positionals: name the endpoint name [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --from start of the window as an ISO timestamp (default: 24h ago) [string] --to end of the window as an ISO timestamp (default: now) [string] --bucket-size aggregation bucket [choices: "1m", "5m", "1h", "6h", "1d"] -h, --help Show help [boolean] ``` ### edge networks ``` goldsky edge networks ``` Lists the chains Edge RPC serves: the network slug, display name, parent chain, and chain ID. The chain ID is what goes in the endpoint URL (`https://edge.goldsky.com/standard/evm/{chainId}?key={your-key}`). See [supported networks](/chains/supported-networks#edge-rpc) for the same list with per-chain details. How to use: ``` goldsky edge networks list the chains/networks supported by Edge RPC Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### edge sources ``` goldsky edge sources ``` Lists the datasets available through Edge Data (for example `blocks/{chain}`, `blocks/{chain}/head`, and the Polymarket datasets), with the provider and a one-line description of each. How to use: ``` goldsky edge sources list the datasets available through Edge Data Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ## boost ``` goldsky boost ``` How to use: ``` goldsky boost Commands related to Boost: cache-first EVM JSON-RPC endpoints backed by your own providers. A project has one Boost, so no command takes its name Commands: goldsky boost enable enable this project's Boost — a first enable walks through provider setup; a disabled Boost is switched back on goldsky boost disable disable this project's Boost (stops serving, keeps configuration and key) goldsky boost get show this project's Boost: providers, serving URLs, and status per chain goldsky boost update update Boost's allowed domains or provider rate (rate limits are Goldsky-managed) goldsky boost reveal reveal the API key Boost serves traffic under goldsky boost metrics print Boost metrics as JSON: cache hits, latencies, miss reasons, per-provider stats, and credit savings goldsky boost requests print the requests Boost served: method, chain, cache hit or forward, which provider answered, and how long it took goldsky boost chains list the chains Boost can cache, and how far back each one is cached goldsky boost validate probe a provider RPC URL: detects its chain and checks that it answers goldsky boost set switch a chain on or off, or set its timeouts (provider-level knobs: goldsky boost provider set) goldsky boost provider manage Boost's providers: connect a provider account, or point a chain at a URL you already hold Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` Boost is project-scoped, so its commands do not take an endpoint name. `provider connect` supports QuickNode, Alchemy, Chainstack, and dRPC. The first three create dedicated resources in your provider account; dRPC reuses an existing unrestricted key and creates nothing. ### boost enable ``` goldsky boost enable ``` How to use: ``` goldsky boost enable enable this project's Boost — a first enable walks through provider setup; a disabled Boost is switched back on Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --allowed-domains comma-separated web origins allowed to call Boost from a browser [string] --chain one-shot setup: configure this chain's first provider right after enabling [string] --provider-url the provider RPC URL for --chain [string] --header a provider request header in the form key:value; repeatable [array] -h, --help Show help [boolean] ``` ### boost disable ``` goldsky boost disable ``` How to use: ``` goldsky boost disable disable this project's Boost (stops serving, keeps configuration and key) Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### boost get ``` goldsky boost get ``` How to use: ``` goldsky boost get show this project's Boost: providers, serving URLs, and status per chain Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### boost update ``` goldsky boost update ``` How to use: ``` goldsky boost update update Boost's allowed domains or provider rate (rate limits are Goldsky-managed) Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --allowed-domains comma-separated web origins allowed to call Boost from a browser; pass an empty string to remove the restriction [string] --provider-rate what your provider charges per million requests, in USD; prices the estimated saving where no vendor rate card applies [number] -h, --help Show help [boolean] ``` ### boost reveal ``` goldsky boost reveal ``` How to use: ``` goldsky boost reveal reveal the API key Boost serves traffic under Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### boost metrics ``` goldsky boost metrics ``` How to use: ``` goldsky boost metrics print Boost metrics as JSON: cache hits, latencies, miss reasons, per-provider stats, and credit savings Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --from start of the window as an ISO timestamp (default: 24h ago) [string] --to end of the window as an ISO timestamp (default: now) [string] --bucket-size aggregation bucket [choices: "1m", "5m", "1h", "6h", "1d"] --chain narrow the chain-dimensioned panels to one chain (upstreams, credits, savings, byChain, byMethod) [string] -h, --help Show help [boolean] ``` ### boost requests ``` goldsky boost requests ``` How to use: ``` goldsky boost requests print the requests Boost served: method, chain, cache hit or forward, which provider answered, and how long it took Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --chain only requests on this chain [string] --method only this JSON-RPC method, e.g. eth_getLogs [string] --errors only requests that failed [boolean] [default: false] --limit how many rows to print (pages are 50) [number] [default: 50] -h, --help Show help [boolean] ``` ### boost chains ``` goldsky boost chains ``` How to use: ``` goldsky boost chains list the chains Boost can cache, and how far back each one is cached Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### boost validate ``` goldsky boost validate ``` How to use: ``` goldsky boost validate probe a provider RPC URL: detects its chain and checks that it answers Positionals: url the provider RPC URL to probe [string] [required] Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --chain the chain you intend to use it for (verifies they match) [string] --header a request header in the form key:value; repeatable [array] -h, --help Show help [boolean] ``` ### boost set ``` goldsky boost set ``` How to use: ``` goldsky boost set switch a chain on or off, or set its timeouts (provider-level knobs: goldsky boost provider set) Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --chain the chain to configure [string] [required] --enabled switch the chain on (true) or off (false); off refuses requests at its Boost URL and keeps providers and settings [boolean] --forward-timeout the chain's forward timeout in milliseconds, or "default" [string] --cache-timeout the chain's cache timeout in milliseconds, or "default" [string] -h, --help Show help [boolean] ``` ### boost provider ``` goldsky boost provider ``` How to use: ``` goldsky boost provider manage Boost's providers: connect a provider account, or point a chain at a URL you already hold Commands: goldsky boost provider connect connect a provider account and create its endpoints per chain goldsky boost provider disconnect disconnect a provider account and delete the endpoints Boost created in it goldsky boost provider add add a provider for a chain goldsky boost provider replace replace a provider's URL (credential rotation: the new URL is sent whole, the old one is never read) goldsky boost provider activate make this provider the active one serving its chain goldsky boost provider remove remove a provider from a chain (removing the active one promotes a fallback when available) goldsky boost provider set set a provider's forward timeout or pinned pricing vendor Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` #### boost provider connect ``` goldsky boost provider connect ``` How to use: ``` goldsky boost provider connect connect a provider account and create its endpoints per chain Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --vendor the provider account to connect [string] [required] [choices: "quicknode", "alchemy", "chainstack", "drpc"] --key the provider's management credential (QuickNode: an admin API key; Alchemy: an access key with App Management read+write; Chainstack: a Platform API key; dRPC: a dashboard token, which only needs read access); prompted for when omitted, which keeps it out of shell history [string] --chain a chain to create an endpoint for; repeatable (default: every chain Boost offers) [array] -h, --help Show help [boolean] ``` #### boost provider disconnect ``` goldsky boost provider disconnect ``` How to use: ``` goldsky boost provider disconnect disconnect a provider account and delete the endpoints Boost created in it Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --vendor the provider account to disconnect [string] [required] [choices: "quicknode", "alchemy", "chainstack", "drpc"] --force skip the confirmation prompt [boolean] [default: false] -h, --help Show help [boolean] ``` #### boost provider add ``` goldsky boost provider add ``` How to use: ``` goldsky boost provider add add a provider for a chain Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --chain the chain this provider serves [string] [required] --url the provider RPC URL [string] [required] --header a provider request header in the form key:value; repeatable [array] --id your id for this provider (default: -primary, then -N) [string] -h, --help Show help [boolean] ``` #### boost provider replace ``` goldsky boost provider replace ``` How to use: ``` goldsky boost provider replace replace a provider's URL (credential rotation: the new URL is sent whole, the old one is never read) Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --chain the provider's chain [string] [required] --id the provider id to replace the URL of [string] [required] --url the new provider RPC URL [string] [required] --header replace the stored headers with these key:value entries; repeatable; omit to keep the stored headers [array] --clear-headers delete all stored headers on this provider [boolean] [default: false] -h, --help Show help [boolean] ``` #### boost provider activate ``` goldsky boost provider activate ``` How to use: ``` goldsky boost provider activate make this provider the active one serving its chain Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --chain the provider's chain [string] [required] --id the provider id to activate [string] [required] -h, --help Show help [boolean] ``` #### boost provider remove ``` goldsky boost provider remove ``` How to use: ``` goldsky boost provider remove remove a provider from a chain (removing the active one promotes a fallback when available) Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --chain the provider's chain [string] [required] --id the provider id to remove [string] [required] --force skip the confirmation prompt when removing a chain's last provider [boolean] [default: false] -h, --help Show help [boolean] ``` #### boost provider set ``` goldsky boost provider set ``` How to use: ``` goldsky boost provider set set a provider's forward timeout or pinned pricing vendor Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] --chain the provider's chain [string] [required] --id the provider id [string] [required] --timeout the provider's forward timeout in milliseconds, or "default" [string] --vendor the pinned pricing vendor, or "auto" to auto-detect [string] -h, --help Show help [boolean] ``` ## telemetry ``` goldsky telemetry ``` How to use: ``` goldsky telemetry Commands related to CLI telemetry Commands: goldsky telemetry status Display the CLI telemetry status goldsky telemetry enable Enable anonymous CLI telemetry goldsky telemetry disable Disable anonymous CLI telemetry Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### telemetry status ``` goldsky telemetry status ``` How to use: ``` goldsky telemetry status Display the CLI telemetry status Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### telemetry enable ``` goldsky telemetry enable ``` How to use: ``` goldsky telemetry enable Enable anonymous CLI telemetry Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ### telemetry disable ``` goldsky telemetry disable ``` How to use: ``` goldsky telemetry disable Disable anonymous CLI telemetry Options: --token CLI Auth Token [string] [default: ""] --color Colorize output [boolean] [default: true] -h, --help Show help [boolean] ``` ## turbo pipelines ``` goldsky turbo ``` How to use: ``` goldsky turbo Commands related to Turbo Pipelines Commands: goldsky turbo apply Apply a pipeline definition from YAML file goldsky turbo delete Delete a pipeline by name goldsky turbo pause Pause a pipeline by name goldsky turbo list List all pipelines in the current project goldsky turbo logs Stream logs from a pipeline goldsky turbo validate Validate a pipeline definition without applying it goldsky turbo inspect Inspect live data flowing through a pipeline goldsky turbo get Get pipeline details goldsky turbo state Manage pipeline state goldsky turbo help Print this message or the help of the given subcommand(s) Options: -h, --help Print help -V, --version Print version ``` ### turbo apply ``` goldsky turbo apply ``` How to use: ``` goldsky turbo apply Apply a pipeline definition from YAML file Positionals: config-path Path to the YAML pipeline config file [string] [required] Options: -h, --help Print help ``` ### turbo delete ``` goldsky turbo delete ``` How to use: ``` goldsky turbo delete Delete a pipeline by name Positionals: name Pipeline name [string] [required] Options: -h, --help Print help ``` ### turbo pause ``` goldsky turbo pause ``` How to use: ``` goldsky turbo pause Pause a pipeline by name Positionals: name Pipeline name [string] [required] Options: -h, --help Print help ``` ### turbo list ``` goldsky turbo list ``` How to use: ``` goldsky turbo list List all pipelines in the current project Options: -h, --help Print help ``` ### turbo logs ``` goldsky turbo logs ``` How to use: ``` goldsky turbo logs Stream logs from a pipeline Positionals: name Pipeline name [string] [required] Options: -h, --help Print help ``` ### turbo validate ``` goldsky turbo validate ``` How to use: ``` goldsky turbo validate Validate a pipeline definition without applying it Positionals: config-path Path to the YAML pipeline config file [string] [required] Options: -h, --help Print help ``` ### turbo inspect ``` goldsky turbo inspect ``` How to use: ``` goldsky turbo inspect Inspect live data flowing through a pipeline Positionals: name Pipeline name or path to YAML config file [string] [required] Options: -n, --topology-node-keys Comma-separated list of topology node keys to filter [string] -b, --buffer-size Maximum records to keep in buffer [number] [default: 10000] -p, --print Print records to stdout instead of opening the TUI [boolean] [default: false] -h, --help Print help ``` Use `--print` / `-p` to bypass the interactive TUI and stream records directly to stdout. This makes output fully selectable and allows piping to tools like `jq`: ```bash theme={"dark"} goldsky turbo inspect my-pipeline -p | jq '.signature' ``` See [Live Inspect - Print mode](/turbo-pipelines/live-inspect#print-mode) for more details. ### turbo get ``` goldsky turbo get ``` How to use: ``` goldsky turbo get Get pipeline details Positionals: name Pipeline name [string] [required] Options: -h, --help Print help ``` ### turbo state ``` goldsky turbo state ``` How to use: ``` goldsky turbo state Manage pipeline state Positionals: name Pipeline name [string] [required] Options: -h, --help Print help ``` # Stablecoin compliance & AML monitoring Source: https://docs.goldsky.com/solutions/compliance-monitoring Screen stablecoin transfers against a live sanctions watchlist with Turbo, react to sanctions updates in seconds, and attest every decision with Compose. Onchain settlement is often described as a compliance problem. In practice it is a compliance *advantage*: every transfer is visible, in real time, on a public ledger. The challenge is operational: you need to watch every flow as it happens, react to sanctions changes in minutes, and prove to a regulator exactly what you did and why. This guide builds that surveillance layer. A [Turbo pipeline](/turbo-pipelines/introduction) screens every stablecoin transfer against a **live watchlist** you can update in seconds, and [Compose](/compose/introduction) turns a hit into an attested, auditable decision. ## Why real-time and provable Two properties make onchain monitoring different from a nightly batch screen: * **Sanctions lists change without warning.** When OFAC adds an address, you cannot wait for tomorrow's redeploy. A [dynamic table](/turbo-pipelines/transforms/dynamic-tables) lets you push a new address to a *running* pipeline and start flagging within seconds. * **Regulators want the "why," not just the "what."** [Compose](/compose/introduction) traces every external call with inputs and outputs and can run in a Trusted Execution Environment that attests the exact code executed. Each freeze, alert, or SAR trigger comes with a verifiable record. ## How it works ```mermaid theme={"dark"} flowchart LR A[TIP-20 transfers on Tempo] --> B[Turbo pipeline] W[(Live watchlist
dynamic table)] --> B B -->|no hit| C[(Compliance ledger)] B -->|hit| D[Compose screening task] D -->|verify| E[Sanctions / KYC provider] D -->|attest + notify| F[Case management + on-chain attestation] OFAC[OFAC / internal update] -.->|INSERT, no redeploy| W ``` ## Prerequisites * The [Turbo CLI extension](/turbo-pipelines/cli#installation) installed and logged in. * A Postgres database and a [Goldsky secret](/turbo-pipelines/pipeline-config#secrets). This database also backs the dynamic-table watchlist, so you can keep it inside your own compliance boundary. * The stablecoin/TIP-20 contract addresses you settle in. Confirm the Tempo dataset name in the [Datasource explorer](https://app.goldsky.com/explore). ## Step 1: Screen transfers against a live watchlist The watchlist lives in a dynamic table. The pipeline checks both counterparties of every transfer against it with `dynamic_table_check()`. ```yaml aml-screening.yaml expandable theme={"dark"} name: stablecoin-aml-screening resource_size: s sources: tempo_transfers: type: dataset dataset_name: tempo.tip20_transfers version: 1.0.0 start_at: latest transforms: # The watchlist - updatable at runtime with no redeploy watchlist: type: dynamic_table backend_type: Postgres backend_entity_name: sanctioned_addresses secret_name: MY_POSTGRES # Flag any transfer touching a watchlisted address flagged_transfers: type: sql primary_key: id sql: | SELECT id, address AS token, sender, recipient, amount, block_timestamp, transaction_hash, CASE WHEN dynamic_table_check('watchlist', sender) THEN 'sender' WHEN dynamic_table_check('watchlist', recipient) THEN 'recipient' END AS watchlist_hit, _gs_op FROM tempo_transfers WHERE dynamic_table_check('watchlist', sender) OR dynamic_table_check('watchlist', recipient) sinks: # Persist every hit for case management and audit flagged_sink: type: postgres from: flagged_transfers schema: compliance table: flagged_transfers secret_name: MY_POSTGRES primary_key: id # Push each hit to your case-management system immediately case_management: type: webhook from: flagged_transfers url: https://compliance.example.com/alerts/aml-hit one_row_per_request: true secret_name: COMPLIANCE_WEBHOOK_AUTH ``` ```bash theme={"dark"} goldsky turbo apply aml-screening.yaml ``` ## Step 2: React to a sanctions update in seconds This is the capability that batch systems cannot match. When a new address must be watched, insert it into the dynamic table from any Postgres client. No redeploy, no re-sync: ```sql theme={"dark"} -- New OFAC SDN address - live within seconds INSERT INTO streamling.sanctioned_addresses (value) VALUES (lower('0xNEWLY_SANCTIONED_ADDRESS')); ``` The running pipeline picks it up on the next batch and begins flagging matching transfers immediately. You can automate this by having your sanctions-list ingestion job write directly to the table. Because the watchlist is a table in *your* database, you can populate it from OFAC's published SDN list, a vendor feed (Chainalysis, TRM, Elliptic), and your own internal blocklist at once, and you can prune it by `updated_at` to satisfy data-retention rules. ## Step 3: Monitor issuer-level enforcement TIP-20's compliance controls emit their own events. Decode them from `raw_logs` to keep a real-time view of every policy change and blocked transfer, the issuer-side counterpart to your own screening. Decoding happens in two steps (one transform defines `decoded`, the next filters on it) because the SQL engine can't reference a column alias in the `WHERE` of the same query. ```yaml policy-events.yaml expandable theme={"dark"} name: tip20-policy-events resource_size: s sources: tempo_tip20_logs: type: dataset dataset_name: tempo.raw_logs version: 1.0.0 start_at: latest filter: address = lower('0xYOUR_TIP20_TOKEN') transforms: # 1. Decode every log with the TIP-20 ABI decoded_logs: type: sql primary_key: id sql: | SELECT id, address AS token, _gs_log_decode( _gs_fetch_abi('https://raw.githubusercontent.com/your-org/abis/main/tip20.json', 'raw'), topics, data ) AS decoded, block_timestamp, transaction_hash, _gs_op FROM tempo_tip20_logs # 2. Keep only compliance/policy events (this transform can filter on `decoded`) policy_events: type: sql primary_key: id sql: | SELECT id, token, decoded.event_signature AS event, to_timestamp(block_timestamp) AS at, transaction_hash, _gs_op FROM decoded_logs WHERE decoded IS NOT NULL AND decoded.event_signature IN ( 'TransferPolicyUpdate', 'TransferBlocked', 'BurnBlocked', 'PauseStateUpdate' ) sinks: policy_ledger: type: postgres from: policy_events schema: compliance table: policy_events secret_name: MY_POSTGRES primary_key: id ``` The four events this keeps are the issuer-side enforcement signals: * `TransferPolicyUpdate`: the token's whitelist/blacklist policy (TIP-403) changed. * `TransferBlocked`: a transfer was redirected by receive-policy enforcement. * `BurnBlocked`: tokens were removed from a policy-restricted address. * `PauseStateUpdate`: the token was paused or unpaused. ## Step 4: Attest every decision with Compose A flag is not a decision. Route each hit to a Compose task that verifies against your KYC/sanctions provider and records the outcome. Running the task in a TEE produces an attestation that the exact screening logic ran, which is what makes the decision defensible. ```typescript src/tasks/screen-transfer.ts theme={"dark"} import type { TaskContext } from "compose"; export async function main( context: TaskContext, payload: { transaction_hash: string; sender: string; recipient: string; amount: string; watchlist_hit: string }, ) { const { fetch, evm } = context; // 1. Verify against your sanctions / KYC provider (retried durably) const screen = await fetch<{ decision: "clear" | "block"; caseId: string }>( "https://screening.example.com/v1/screen", { method: "POST", body: JSON.stringify(payload), max_attempts: 3, initial_interval_ms: 1000, backoff_factor: 2, }, ); // 2. Write a tamper-evident attestation on-chain const wallet = await evm.wallet({ name: "compliance-attestor", sponsorGas: true }); await wallet.writeContract( evm.chains.tempo, "0xYOUR_ATTESTATION_REGISTRY", "recordDecision(bytes32,string,string)", [payload.transaction_hash, screen.decision, screen.caseId], ); // 3. Return the decision - the full trace (inputs, outputs, attestation) is saved return { decision: screen.decision, caseId: screen.caseId }; } ``` Trigger this task from the `case_management` webhook in Step 1, or directly from an [onchain event trigger](/compose/task-triggers). Every run is [traceable](/compose/debugging) step by step in the CLI and UI. ## Business outcomes * **Minutes, not days, to enforce a sanctions change**: the watchlist updates a running pipeline in seconds. * **Defensible decisions**: TEE attestations and full execution traces answer "how did you decide?" with a record, not a reconstruction. * **Data stays in your boundary**: the watchlist and flagged-transfer tables live in your database, easing residency and retention obligations. * **One surveillance layer across chains and tokens**: the same pipeline pattern covers TIP-20 on Tempo and standard stablecoins on any [supported chain](/chains/supported-networks). ## Resources * [Build a compliance oracle](/compose/guides/build-a-compliance-oracle): end-to-end worked example of this pattern * [Dynamic tables](/turbo-pipelines/transforms/dynamic-tables) * [Compose task authoring](/compose/tasks) and [triggers](/compose/task-triggers) * [Real-time reconciliation](/solutions/real-time-reconciliation) Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Cross-chain USDC settlement ledger Source: https://docs.goldsky.com/solutions/cross-chain-settlement Track CCTP V2 burn-and-mint USDC transfers across every chain in one ledger with Turbo, and catch in-flight transfers with Compose. Stablecoin liquidity does not live on one chain. With [Circle's CCTP V2](https://www.circle.com/blog/cctp-v2-the-future-of-cross-chain), USDC moves natively across 13+ chains by burning on the source and minting on the destination: no wrapped tokens, no bridge pools. That is great for liquidity and a problem for whoever has to account for it: a single dollar can be *burned on Ethereum but not yet minted on Base*, and your cash position is now split across two ledgers and a few minutes of uncertainty. This guide builds one **cross-chain settlement ledger**. A multi-chain [Turbo pipeline](/turbo-pipelines/introduction) indexes every burn and every mint, matches them by nonce, and gives your treasury a single table showing exactly where every dollar is: settled, or in-flight. ## How CCTP transfers work Every CCTP transfer produces two onchain events on two different chains, correlated by a **nonce** (and a message hash): ```mermaid theme={"dark"} flowchart LR A[User burns USDC
on source chain] -->|DepositForBurn
TokenMessenger| B[Iris attestation] B --> C[Mint USDC
on destination chain] C -->|MintAndWithdraw
MessageTransmitter| D[(Cross-chain ledger)] A -->|nonce + amount + destinationDomain| D D --> E{Matched by nonce?} E -->|yes| F[Settled] E -->|no, past SLA| G[In-flight / delayed] ``` * **Source**: `DepositForBurn` on the `TokenMessenger` contract, carrying the `nonce`, burn `amount`, `destinationDomain`, and `mintRecipient`. * **Destination**: `MintAndWithdraw` on the `MessageTransmitter`/`TokenMinter`, carrying the matching `nonce` and mint `amount`. * **In-flight** means the burn exists but the mint has not landed yet. Fast Transfers resolve in seconds; Standard Transfers wait for source-chain hard finality (\~13-19 minutes on Ethereum). CCTP identifies each chain by a numeric **domain ID**, not a chain ID: Ethereum `0`, Avalanche `1`, Optimism `2`, Arbitrum `3`, Noble `4`, Solana `5`, Base `6`, Polygon PoS `7`. Confirm the current list and contract addresses in [Circle's CCTP docs](https://developers.circle.com/cctp). ## Prerequisites * The [Turbo CLI extension](/turbo-pipelines/cli#installation) installed and logged in. * A Postgres database and a [Goldsky secret](/turbo-pipelines/pipeline-config#secrets). * The `TokenMessenger` and `MessageTransmitter` contract addresses for each chain you settle on (from Circle's docs). CCTP V2 is live on Ethereum, Base, Arbitrum, Optimism, Polygon, and Avalanche, all [supported by Goldsky](/chains/supported-networks) across every product. ## Step 1: Index burns across every source chain Stream `DepositForBurn` from the `TokenMessenger` on each chain and combine them with `UNION ALL`. This is the [multi-chain monitoring](/turbo-pipelines/sources/evm#guide-multi-chain-monitoring) pattern with a decode step. ```yaml cctp-burns.yaml expandable theme={"dark"} name: cctp-burns resource_size: m sources: ethereum_logs: type: dataset dataset_name: ethereum.raw_logs version: 1.2.0 start_at: latest filter: address = lower('0xETH_TOKENMESSENGER') base_logs: type: dataset dataset_name: base.raw_logs version: 1.0.0 start_at: latest filter: address = lower('0xBASE_TOKENMESSENGER') arbitrum_logs: type: dataset dataset_name: arbitrum_one.raw_logs version: 1.0.0 start_at: latest filter: address = lower('0xARB_TOKENMESSENGER') transforms: burns: type: sql primary_key: id sql: | SELECT id, 0 AS source_domain, decoded, block_timestamp, transaction_hash, _gs_op FROM ( SELECT id, _gs_log_decode(_gs_fetch_abi('https://raw.githubusercontent.com/your-org/abis/main/token-messenger.json', 'raw'), topics, data) AS decoded, block_timestamp, transaction_hash, _gs_op FROM ethereum_logs ) WHERE decoded IS NOT NULL AND decoded.event_signature = 'DepositForBurn' UNION ALL SELECT id, 6 AS source_domain, decoded, block_timestamp, transaction_hash, _gs_op FROM ( SELECT id, _gs_log_decode(_gs_fetch_abi('https://raw.githubusercontent.com/your-org/abis/main/token-messenger.json', 'raw'), topics, data) AS decoded, block_timestamp, transaction_hash, _gs_op FROM base_logs ) WHERE decoded IS NOT NULL AND decoded.event_signature = 'DepositForBurn' UNION ALL SELECT id, 3 AS source_domain, decoded, block_timestamp, transaction_hash, _gs_op FROM ( SELECT id, _gs_log_decode(_gs_fetch_abi('https://raw.githubusercontent.com/your-org/abis/main/token-messenger.json', 'raw'), topics, data) AS decoded, block_timestamp, transaction_hash, _gs_op FROM arbitrum_logs ) WHERE decoded IS NOT NULL AND decoded.event_signature = 'DepositForBurn' burns_clean: type: sql primary_key: id sql: | SELECT id, source_domain, decoded.event_params[1] AS nonce, CAST(decoded.event_params[3] AS DECIMAL(38, 0)) AS amount, CAST(decoded.event_params[4] AS INT) AS destination_domain, decoded.event_params[5] AS mint_recipient, to_timestamp(block_timestamp) AS burned_at, transaction_hash AS burn_tx, _gs_op FROM burns sinks: cctp_burns: type: postgres from: burns_clean schema: cctp table: burns secret_name: MY_POSTGRES primary_key: id ``` The `event_params[n]` positions above follow the CCTP ABI field order. Confirm them against the ABI you fetch, since V1 and V2 differ. Fetching the ABI with `_gs_fetch_abi` (rather than hardcoding) keeps the pipeline correct across upgrades. ## Step 2: Index mints on every destination chain Mirror Step 1 for the destination side. Exactly as each source chain tagged its burns with a constant `source_domain`, **each destination chain tags its mints with its own `destination_domain`**, persisted so the ledger records where each mint landed. The join key itself is (`source_domain`, `nonce`), and both come from the `MessageReceived` event on each chain's `MessageTransmitter` (the `MintAndWithdraw` event does not carry the nonce). ```yaml cctp-mints.yaml expandable theme={"dark"} name: cctp-mints resource_size: m sources: ethereum_mints: type: dataset dataset_name: ethereum.raw_logs version: 1.2.0 start_at: latest filter: address = lower('0xETH_MESSAGETRANSMITTER') base_mints: type: dataset dataset_name: base.raw_logs version: 1.0.0 start_at: latest filter: address = lower('0xBASE_MESSAGETRANSMITTER') arbitrum_mints: type: dataset dataset_name: arbitrum_one.raw_logs version: 1.0.0 start_at: latest filter: address = lower('0xARB_MESSAGETRANSMITTER') transforms: mints: type: sql primary_key: id sql: | -- Tag each chain's mints with its own domain (the destination_domain) SELECT id, 0 AS destination_domain, decoded, block_timestamp, transaction_hash, _gs_op FROM ( SELECT id, _gs_log_decode(_gs_fetch_abi('https://raw.githubusercontent.com/your-org/abis/main/message-transmitter.json', 'raw'), topics, data) AS decoded, block_timestamp, transaction_hash, _gs_op FROM ethereum_mints ) WHERE decoded IS NOT NULL AND decoded.event_signature = 'MessageReceived' UNION ALL SELECT id, 6 AS destination_domain, decoded, block_timestamp, transaction_hash, _gs_op FROM ( SELECT id, _gs_log_decode(_gs_fetch_abi('https://raw.githubusercontent.com/your-org/abis/main/message-transmitter.json', 'raw'), topics, data) AS decoded, block_timestamp, transaction_hash, _gs_op FROM base_mints ) WHERE decoded IS NOT NULL AND decoded.event_signature = 'MessageReceived' UNION ALL SELECT id, 3 AS destination_domain, decoded, block_timestamp, transaction_hash, _gs_op FROM ( SELECT id, _gs_log_decode(_gs_fetch_abi('https://raw.githubusercontent.com/your-org/abis/main/message-transmitter.json', 'raw'), topics, data) AS decoded, block_timestamp, transaction_hash, _gs_op FROM arbitrum_mints ) WHERE decoded IS NOT NULL AND decoded.event_signature = 'MessageReceived' mints_clean: type: sql primary_key: id sql: | SELECT id, destination_domain, -- chain this mint landed on CAST(decoded.event_params[2] AS INT) AS source_domain, -- origin domain (from MessageReceived) decoded.event_params[3] AS nonce, -- per-source-domain nonce to_timestamp(block_timestamp) AS minted_at, transaction_hash AS mint_tx, _gs_op FROM mints sinks: cctp_mints: type: postgres from: mints_clean schema: cctp table: mints secret_name: MY_POSTGRES primary_key: id ``` Confirm the `MessageReceived` event name and `event_params` positions against the ABI you fetch; they differ between CCTP V1 and V2. CCTP nonces are scoped **per source domain**, so the join key is (`source_domain`, `nonce`). Both come from `MessageReceived`, while `destination_domain` records the chain the mint landed on. Amount and recipient already live on the burn row, so the mint row only needs those keys plus timing. A chain is both a source and a destination, so you can fold burns and mints into one pipeline with more sinks, or keep them split for clarity. ## Step 3: Reconcile into one ledger With both tables filling in real time, the cross-chain ledger is a single join on the message identity, `(source_domain, nonce)`: ```sql theme={"dark"} SELECT b.nonce, b.source_domain, b.destination_domain, b.amount, b.burned_at, m.minted_at, m.mint_tx, CASE WHEN m.nonce IS NOT NULL THEN 'settled' WHEN b.burned_at < NOW() - INTERVAL '20 minutes' THEN 'delayed' ELSE 'in_flight' END AS status, EXTRACT(EPOCH FROM (m.minted_at - b.burned_at)) AS settlement_seconds FROM cctp.burns b LEFT JOIN cctp.mints m ON b.nonce = m.nonce AND b.source_domain = m.source_domain; ``` You now have, in one query: * **Where every dollar is**: settled on the destination, or in-flight between chains. * **Your true cross-chain cash position**: sum settled balances per domain, plus in-flight amounts by destination. * **Corridor analytics**: volume and settlement latency by `(source_domain → destination_domain)`. * **Stuck-transfer detection**: anything `delayed` past your SLA. ## Step 4: Alert on stuck transfers with Compose Turn `delayed` from a dashboard row into an action. A scheduled [Compose](/compose/introduction) task checks pending transfers against Circle's Iris attestation service and escalates anything unresolved. ```typescript src/tasks/cctp-watchdog.ts theme={"dark"} import type { TaskContext } from "compose"; export async function main(context: TaskContext) { const { fetch } = context; // Burns with no matching mint past SLA, from your ledger service (backed by // the Step 3 reconciliation view). nonce, sourceDomain, and burnTx all come // straight from the cctp.burns table - no extra fields needed. const pending = await fetch<{ nonce: string; sourceDomain: number; burnTx: string }[]>( "https://ledger.example.com/cctp/in-flight?olderThanMinutes=20", ); for (const t of pending) { // Iris v2 looks up a transfer by source domain + burn transaction hash, and // reports whether the attestation is ready ("complete") or still pending. const res = await fetch<{ messages: { status: string }[] }>( `https://iris-api.circle.com/v2/messages/${t.sourceDomain}?transactionHash=${t.burnTx}`, { max_attempts: 3, initial_interval_ms: 1000, backoff_factor: 2 }, ); const status = res.messages?.[0]?.status ?? "not_found"; if (status !== "complete") { await fetch("https://ops.example.com/alerts/cctp-stuck", { method: "POST", body: JSON.stringify({ nonce: t.nonce, burnTx: t.burnTx, status }), }); } } return { checked: pending.length }; } ``` Every check is [traced](/compose/debugging) and the task retries durably, so the watchdog itself never silently dies. ## Business outcomes * **One cross-chain cash position** instead of a spreadsheet per chain. * **In-flight visibility**: you know the moment a transfer is late, with the exact nonce to investigate. * **Corridor intelligence**: real settlement times and volumes per route, to tune where you hold liquidity. * **Works with Circle Gateway too**: the same burn/mint ledger underpins reporting on [unified USDC balances](https://www.circle.com/gateway). ## Resources * [Multi-chain monitoring with Turbo](/turbo-pipelines/sources/evm#guide-multi-chain-monitoring) * [Circle CCTP documentation](https://developers.circle.com/cctp) * [Real-time reconciliation](/solutions/real-time-reconciliation) Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Detect incoming assets to a set of addresses Source: https://docs.goldsky.com/solutions/deposit-detection Maintain a live set of addresses and know the moment assets land in any of them, with a queryable index, running balances, and webhook alerts. ## Overview Many products need to answer one deceptively simple question: **"Did assets just land in one of our addresses?"** Exchanges, neobanks, on-ramps, and payment apps all maintain a large, changing set of receiving addresses and need to react the instant funds arrive. Doing this with raw RPC polling is inefficient (you poll thousands of addresses on every block), and standing up custom indexing infrastructure is overkill. Turbo sits in between: you get a **fast, queryable index** that you point at a set of addresses you maintain, without running any indexing infrastructure yourself. This guide shows how to build that with a Turbo pipeline: Store the addresses you care about in a [dynamic table](/turbo-pipelines/transforms/dynamic-tables) and add/remove them at any time, no redeploy. Filter the transfer stream down to your addresses and land the matches in Postgres you can query directly. Fire a [webhook](/turbo-pipelines/sinks/webhook) the moment a watched address receives funds. ## How it works ```mermaid actions={false} theme={"dark"} flowchart LR A[Transfers dataset
e.g. base.erc20_transfers] -->|token transfers| C{SQL filter
recipient ∈ watched set} B[(Dynamic table
your addresses)] --> C C -->|matches| D[(Postgres sink
queryable index)] C -->|matches| E[Webhook sink
real-time alert] C -->|matches| F[(Postgres aggregate
running balances)] ``` * The **source** is a curated transfer dataset (for example `base.erc20_transfers`), a normalized, cross-chain stream of token transfers. * The **dynamic table** holds the addresses you're watching. It's backed by Postgres, so you can `INSERT`/`DELETE` addresses live and the pipeline picks up changes within a second or two, no redeploy. * A **SQL transform** keeps only transfers whose `recipient` is in your watched set, using [`dynamic_table_check()`](/turbo-pipelines/reference/sql-functions#dynamic_table_check). * **Sinks** deliver the result: a Postgres table you can query, a webhook for real-time alerts, or a running-balance table (all three can run in the same pipeline). ## Prerequisites * The [Turbo CLI extension](/turbo-pipelines/cli#installation) installed, and a Goldsky account logged in to your project. * A Postgres database for the dynamic table and sinks. You have two options: * **Goldsky-hosted Postgres** (recommended): Goldsky provisions and manages it for you. Available on **Scale** plans and above. * **Bring your own Postgres**: Neon, Supabase, RDS, Cloud SQL, or self-hosted. ## Step 1: Provision Postgres The dynamic table and the sinks all connect to Postgres through a Goldsky [secret](/turbo-pipelines/pipeline-config#secrets). You can use one secret for everything in the pipeline. Provision a managed database and register its secret in one step: ```bash theme={"dark"} goldsky hosted-sink create --type postgres --name MY_POSTGRES ``` The command prints the secret's **name**, **ID**, and **type**. Look up the raw connection string in the web app under **Sinks** when you need to connect a SQL client. You can also provision from the [web app](https://app.goldsky.com) under **Sinks → New sink → Hosted Postgres**. Hosted Postgres is a **Scale** plan feature (and above). Adding a credit card to your account upgrades you to Scale. See [pricing](/pricing/summary#hosted-databases). Create a writer role Goldsky can use: ```sql theme={"dark"} CREATE ROLE goldsky_writer WITH LOGIN PASSWORD 'your_secure_password'; GRANT CREATE ON DATABASE your_database TO goldsky_writer; GRANT USAGE, CREATE ON SCHEMA public TO goldsky_writer; ``` Then store the connection string as a secret: ```bash theme={"dark"} goldsky secret create MY_POSTGRES ``` When prompted, paste your connection string: ``` postgres://goldsky_writer:your_secure_password@db.example.com:5432/your_database?sslmode=require ``` If your database only accepts connections from allowlisted IPs, see [static IPs and `use_dedicated_ip`](/turbo-pipelines/transforms/dynamic-tables#postgresql-setup). Whichever path you choose, the rest of this guide refers to the secret as `MY_POSTGRES`. ## Step 2: Create the pipeline Create a file named `address-watcher.yaml`. This pipeline maintains a `watched_addresses` table, filters the Base ERC-20 transfer stream down to transfers **received** by one of those addresses, and writes the matches to a Postgres table you can query. ```yaml address-watcher.yaml theme={"dark"} name: address-watcher resource_size: s sources: base_transfers: type: dataset dataset_name: base.erc20_transfers version: 1.2.0 start_at: latest transforms: # The set of addresses you're watching. Backed by Postgres so you can # add/remove addresses live without redeploying the pipeline. watched_addresses: type: dynamic_table backend_type: Postgres backend_entity_name: watched_addresses schema: public secret_name: MY_POSTGRES # Keep only transfers received by a watched address. incoming_transfers: type: sql primary_key: id sql: | SELECT id, address AS token, -- ERC-20 contract address sender, recipient, amount, block_number, to_timestamp(block_timestamp) AS block_time, transaction_hash, _gs_op FROM base_transfers WHERE dynamic_table_check('watched_addresses', recipient) sinks: # A queryable index of every transfer landing in a watched address. incoming_index: type: postgres from: incoming_transfers schema: public table: incoming_transfers secret_name: MY_POSTGRES primary_key: id ``` * **`sources.base_transfers`**: the curated `base.erc20_transfers` dataset. `start_at: latest` processes only new transfers going forward. Use `start_at: earliest` to backfill history first. * **`transforms.watched_addresses`**: the dynamic table. `schema: public` creates `public.watched_addresses` with a `value` (primary key) column and an `updated_at` timestamp. (If you omit `schema`, the dynamic table defaults to a `streamling` schema; setting it explicitly keeps everything in one place.) * **`transforms.incoming_transfers`**: filters the stream with `dynamic_table_check('watched_addresses', recipient)`, which returns `true` when `recipient` exists in the dynamic table. Change `recipient` to `sender` (or check both) to track outgoing transfers too. * **`sinks.incoming_index`**: writes matches to `public.incoming_transfers`. `primary_key: id` makes writes idempotent upserts. Store and match addresses in **lowercase**. Curated dataset addresses are already lowercased, and inserting your watched addresses with `lower(...)` (Step 4) keeps the match consistent. ## Step 3: Deploy Validate, then apply: ```bash theme={"dark"} goldsky turbo validate address-watcher.yaml goldsky turbo apply address-watcher.yaml ``` The dynamic table starts empty, so nothing matches yet. That's expected. Watch data flow through the pipeline with live inspect: ```bash theme={"dark"} goldsky turbo inspect address-watcher.yaml -n incoming_transfers ``` ## Step 4: Add addresses to watch The dynamic table is just a Postgres table. Connect any SQL client to the same database and insert the addresses you want to watch. Changes take effect within a second or two, no redeploy. ```sql theme={"dark"} -- Watch a single address (example placeholder address) INSERT INTO public.watched_addresses (value) VALUES (lower('0x1111111111111111111111111111111111111111')); -- Watch several at once INSERT INTO public.watched_addresses (value) VALUES (lower('0x1111111111111111111111111111111111111111')), (lower('0x2222222222222222222222222222222222222222')), (lower('0x3333333333333333333333333333333333333333')) ON CONFLICT (value) DO NOTHING; ``` To stop watching an address, delete it: ```sql theme={"dark"} DELETE FROM public.watched_addresses WHERE value = lower('0x1111111111111111111111111111111111111111'); ``` Inspect the current set at any time: ```sql theme={"dark"} SELECT * FROM public.watched_addresses ORDER BY updated_at DESC; ``` ## Step 5: Query the index Once addresses are being watched and matching transfers arrive, query the Postgres table directly: ```sql theme={"dark"} -- Most recent assets received across all watched addresses SELECT recipient, token, amount, block_time, transaction_hash FROM public.incoming_transfers ORDER BY block_time DESC LIMIT 20; -- Everything a specific address has received SELECT token, amount, block_time, transaction_hash FROM public.incoming_transfers WHERE recipient = lower('0x1111111111111111111111111111111111111111') ORDER BY block_time DESC; ``` ## Get a webhook when funds land To be notified the moment a watched address receives funds, add a [webhook sink](/turbo-pipelines/sinks/webhook). It POSTs each matching transfer to your endpoint. You can run it **alongside** the Postgres sink in the same pipeline. First, create an auth secret for your endpoint: ```bash theme={"dark"} goldsky secret create # Choose "httpauth", then set a header (e.g. Authorization) and value (e.g. "Bearer ") ``` Then add the sink under `sinks:` in `address-watcher.yaml`: ```yaml theme={"dark"} sinks: incoming_index: type: postgres from: incoming_transfers schema: public table: incoming_transfers secret_name: MY_POSTGRES primary_key: id # Fire one webhook request per transfer as soon as it's detected. arrival_alerts: type: webhook from: incoming_transfers url: https://api.example.com/asset-arrived secret_name: MY_WEBHOOK_AUTH one_row_per_request: true ``` Redeploy: ```bash theme={"dark"} goldsky turbo apply address-watcher.yaml ``` Each request body is a single JSON object for the matched transfer: ```json theme={"dark"} { "id": "...", "token": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "sender": "0x...", "recipient": "0x1111111111111111111111111111111111111111", "amount": "1000000", "block_time": "2026-07-09T18:36:00Z", "transaction_hash": "0x..." } ``` The webhook sink guarantees **at-least-once** delivery and retries `5xx`/timeout responses with backoff. Your endpoint should be idempotent: dedupe on `id` (or `transaction_hash`) in case a batch is retried. ## Optional: track a running balance per address The queryable index above logs every transfer that landed. If you also want to answer "which of these addresses currently hold funds?", you can optionally add a **running balance per watched address** using the [`postgres_aggregate` sink](/turbo-pipelines/sinks/postgres-aggregate), which maintains a live sum in a database trigger. The example below is a self-contained pipeline you can adapt: add its transform and sink to `address-watcher.yaml`, or run it on its own. Take the parts you need. It tracks the net balance each watched address holds of a single token (USDC on Base). It counts credits (incoming) as positive and debits (outgoing) as negative, so the balance reflects deposits minus withdrawals. ```yaml balance-watcher.yaml theme={"dark"} name: balance-watcher resource_size: s sources: base_transfers: type: dataset dataset_name: base.erc20_transfers version: 1.2.0 start_at: latest transforms: watched_addresses: type: dynamic_table backend_type: Postgres backend_entity_name: watched_addresses schema: public secret_name: MY_POSTGRES # Emit one signed balance-change row per watched address involved in a # USDC transfer: +amount when it receives, -amount when it sends. # `amount` is a 256-bit integer, so use the I256 helpers (a plain CAST # to DECIMAL is not supported on 256-bit columns). balance_changes: type: sql primary_key: entry_id sql: | SELECT concat(id, '-credit') AS entry_id, lower(recipient) AS account, to_i256(amount) AS delta FROM base_transfers -- 0x8335...2913 is the USDC token contract on Base WHERE lower(address) = lower('0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913') AND dynamic_table_check('watched_addresses', recipient) UNION ALL SELECT concat(id, '-debit') AS entry_id, lower(sender) AS account, i256_neg(to_i256(amount)) AS delta FROM base_transfers -- 0x8335...2913 is the USDC token contract on Base WHERE lower(address) = lower('0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913') AND dynamic_table_check('watched_addresses', sender) sinks: balances: type: postgres_aggregate from: balance_changes schema: public landing_table: usdc_balance_log agg_table: usdc_balances primary_key: entry_id secret_name: MY_POSTGRES group_by: account: type: text aggregate: balance: from: delta fn: sum type: numeric(78, 0) ``` Each transfer produces two distinct rows (a `-credit` entry for the recipient and a `-debit` entry for the sender), so `entry_id` (not the raw transfer `id`) is the primary key. Reusing `id` would make the two rows collide in the aggregate's landing table. Query which watched addresses currently hold a balance: ```sql theme={"dark"} SELECT account, balance FROM public.usdc_balances WHERE balance > 0 ORDER BY balance DESC; ``` Balances here are in the token's **base units** (USDC has 6 decimals, so `1000000` = 1 USDC). Divide by `10^decimals` when displaying. The `sum` aggregation supports insert/delete streams but **not** updates; see the [`postgres_aggregate` caveats](/turbo-pipelines/sinks/postgres-aggregate#supported-aggregation-functions). ## Coverage and limitations Add more sources (`ethereum.erc20_transfers`, `arbitrum.erc20_transfers`, and so on) and `UNION ALL` them in the SQL transform, tagging each with a `chain` column. See [multi-chain monitoring](/turbo-pipelines/sources/evm#guide-multi-chain-monitoring). The same `watched_addresses` table can back all chains. Some chains expose dedicated balance datasets (for example `solana.native_balances`, `stellar_mainnet.balances`). For EVM token balances, derive them from the transfer stream as shown above. For **native** balances (ETH and the native asset of other EVM chains), see the [native balances guide](/turbo-pipelines/guides/native-balances), which hydrates exact balances from your RPC only when a watched address moves value. ## Related * [Dynamic Tables](/turbo-pipelines/transforms/dynamic-tables): full reference for the watched-address table * [EVM Sources](/turbo-pipelines/sources/evm): available datasets and fields * [PostgreSQL sink](/turbo-pipelines/sinks/postgres) and [PostgreSQL aggregation sink](/turbo-pipelines/sinks/postgres-aggregate) * [Webhook sink](/turbo-pipelines/sinks/webhook) Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # On-chain FX & multi-currency corridors Source: https://docs.goldsky.com/solutions/onchain-fx Index Circle StableFX quotes and settlements on Arc with Turbo, and publish FX rates and exposure controls with Compose. The first wave of stablecoins was dollar-only. The next is multi-currency. [Circle's Arc](/chains/supported-networks?chain=arc) ships with [Circle StableFX](https://www.circle.com/blog/introducing-circle-stablefx-and-circle-partner-stablecoins), an **on-chain FX engine**: RFQ price discovery and 24/7 payment-versus-payment settlement across USDC, EURC, and regional partner stablecoins. On-chain FX gives a treasury something it has never had: every quote and every fill, for every currency pair, as a queryable event stream. This guide turns that stream into FX analytics, a published rate oracle, and exposure controls. ## What you'll build ```mermaid theme={"dark"} flowchart LR A[Circle StableFX on Arc] -->|quotes + settlements| B[Turbo pipeline] B --> C[(FX warehouse)] C --> D[Volume, VWAP, spreads,
corridor analytics] C --> E[Compose: publish FX rate oracle] C --> F[Compose: exposure / limit monitor] ``` ## Step 1: Index quotes and settlements StableFX settlements are onchain events. Decode them from Arc's `raw_logs` with the StableFX ABI, extracting the currency pair, the amounts on each leg, and the counterparties. ```yaml stablefx-settlements.yaml expandable theme={"dark"} name: stablefx-settlements resource_size: s sources: arc_logs: type: dataset dataset_name: arc_testnet.raw_logs version: 1.0.0 start_at: latest filter: address = lower('0xSTABLEFX_SETTLEMENT') transforms: decoded: type: sql primary_key: id sql: | SELECT id, _gs_log_decode( _gs_fetch_abi('https://raw.githubusercontent.com/your-org/abis/main/stablefx.json', 'raw'), topics, data ) AS decoded, block_timestamp, transaction_hash, _gs_op FROM arc_logs fx_settlements: type: sql primary_key: id sql: | SELECT id, decoded.event_params[1] AS base_currency, -- e.g. USDC decoded.event_params[2] AS quote_currency, -- e.g. EURC CAST(decoded.event_params[3] AS DECIMAL(38, 0)) AS base_amount, CAST(decoded.event_params[4] AS DECIMAL(38, 0)) AS quote_amount, decoded.event_params[5] AS maker, decoded.event_params[6] AS taker, to_timestamp(block_timestamp) AS settled_at, transaction_hash, _gs_op FROM decoded WHERE decoded IS NOT NULL AND decoded.event_signature = 'Settlement' sinks: fx_warehouse: type: clickhouse from: fx_settlements table: fx_settlements secret_name: MY_CLICKHOUSE primary_key: id ``` StableFX is new, and its published interface is the source of truth for event names and field order. Fetch the ABI with `_gs_fetch_abi` and confirm the `Settlement` event signature and `event_params` positions against Circle's StableFX contracts before relying on the extraction above. ## Step 2: Compute FX analytics With settlements in your warehouse, the desk's core metrics are SQL: ```sql theme={"dark"} -- Volume-weighted rate and spread per pair, last hour SELECT base_currency, quote_currency, sum(quote_amount) / sum(base_amount) AS vwap_rate, count() AS fills, sum(base_amount) AS base_volume FROM fx_settlements WHERE settled_at > now() - INTERVAL 1 HOUR GROUP BY base_currency, quote_currency; ``` From the same table you get **corridor flows** (net USD→EUR movement), **realized spread** versus a reference rate, and **maker/taker league tables**. Maintain a live last-rate per pair with the [PostgreSQL aggregate sink](/turbo-pipelines/sinks/postgres-aggregate). ## Step 3: Publish an FX rate oracle Other contracts and apps need the rate you just computed. A scheduled [Compose](/compose/introduction) task reads the VWAP and publishes it on-chain, the same mechanism as the [NAV oracle](/compose/guides/build-a-nav-oracle), pointed at an FX pair. ```typescript src/tasks/publish-fx-rate.ts theme={"dark"} import type { TaskContext, Chain } from "compose"; // Publish to the same network your StableFX pipeline reads from (Arc). Arc // isn't a built-in Edge RPC chain yet, so define it as a custom chain; swap for // evm.chains. once it's available on Edge. Note Arc pays gas in USDC. const ARC_CHAIN: Chain = { id: 0, // Arc testnet chain ID name: "Arc Testnet", testnet: true, nativeCurrency: { name: "USD Coin", symbol: "USDC", decimals: 6 }, rpcUrls: { default: { http: ["https://"] }, public: { http: ["https://"] }, }, blockExplorers: { default: { name: "Explorer", url: "https://" } }, }; export async function main(context: TaskContext) { const { fetch, evm } = context; const rate = await fetch<{ pair: string; vwap: number; asOf: string }>( "https://fx.example.com/vwap?pair=USDC-EURC", ); const wallet = await evm.wallet({ name: "fx-oracle", sponsorGas: true }); await wallet.writeContract( ARC_CHAIN, "0xFX_ORACLE", "updateRate(bytes32,uint256,uint64)", [ "0x555344432d45555243", // "USDC-EURC" BigInt(Math.round(rate.vwap * 1e18)), BigInt(Math.floor(new Date(rate.asOf).getTime() / 1000)), ], ); return { pair: rate.pair, vwap: rate.vwap }; } ``` ## Step 4: Monitor exposure and enforce limits FX desks live and die by position limits. Because you have every fill, net exposure per currency is a running sum, and a [Compose](/compose/introduction) task can watch it and act (alert, hedge, or halt quoting) when a limit is breached. Compose's [durable execution](/compose/introduction) guarantees the control fires, and every decision is [traced](/compose/debugging) for the desk's risk review. This is a live version of the [circuit-breaker pattern](/solutions/treasury-and-reserves#circuit-breaker-pattern). ## Business outcomes * **Every quote and fill is data**: true VWAP, realized spreads, and corridor flows, not a dealer's end-of-day summary. * **Multi-currency treasury**: real-time positions across USD, EUR, and regional stablecoins in one warehouse. * **A rate you can publish and defend**: on-chain FX oracle sourced from actual settlements, with an audit trail. * **Automated limit enforcement**: exposure breaches trigger controls in seconds. ## Resources * [Circle StableFX](https://www.circle.com/blog/introducing-circle-stablefx-and-circle-partner-stablecoins) * [Build a multi-chain NAV oracle](/compose/guides/build-a-nav-oracle) * [ClickHouse sink](/turbo-pipelines/sinks/clickhouse) Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Payments & fintech on Goldsky Source: https://docs.goldsky.com/solutions/payments-fintech Real-time data, reliable connectivity, and durable execution for stablecoin payments and tokenized finance. Money is moving onchain. Stablecoins now settle trillions of dollars a year, and payments-first networks like [Tempo](/chains/supported-networks?chain=tempo) (the EVM chain incubated by Stripe and Paradigm) are being built specifically so banks, card networks, neobanks, and marketplaces can move regulated dollars with card-network throughput and sub-second, re-org-free finality. Moving the money is the easy part. The hard part is everything a finance organization needs *around* the money: **seeing** every settlement in real time, **reconciling** it against your books, **controlling** it when something looks wrong, and **proving** it to auditors and regulators, all with the reliability tradfi expects. That is what Goldsky does. ## The stack A payments or tokenized-finance product needs three things from its data infrastructure: a **real-time view** of what happened, a **reliable connection** to the chain, and a **durable way to act** on it. Goldsky maps one product to each. | Product | Role in a payments stack | | - | - | | [**Turbo**](/turbo-pipelines/introduction) | **Real-time data plane.** Stream every settlement, mint, burn, and policy change into your own ledger, warehouse, or Kafka in seconds. Decode custom events (like TIP-20 memos) on the fly. | | [**Edge RPC**](/edge-rpc/introduction) | **Reliable connectivity.** Cross-validated, low-latency reads and writes, so your apps and reconciliation jobs never run on stale, partial, or reorged data. | | [**Compose**](/compose/introduction) | **Durable execution.** Move money, publish oracles, screen transactions, and trip circuit breakers, with retries, full tracing, and TEE attestations that *prove* your logic ran as written. | | [**Subgraphs**](/subgraphs/introduction) | **Indexed history.** Hosted GraphQL APIs for customer-facing statements and transaction history, with full replication into Postgres, ClickHouse, or your warehouse via Turbo. | ## Why TIP-20 changes the reconciliation story Traditional onchain transfers are anonymous value movements: great for settlement, useless for accounting. You see that `0xabc…` paid `0xdef…`, but not *which invoice* it settled. [TIP-20](https://tempo.xyz/blog/tip20/), Tempo's native token standard, fixes this at the protocol level. It extends ERC-20 with the primitives a finance team actually needs, and each one emits an onchain event that Goldsky indexes: * **Transfer memos**: a 32-byte reference (`TransferWithMemo`) carried on every payment. Put your invoice ID, order number, or PSP reference here and reconciliation becomes a join. * **Compliance policies**: whitelist/blacklist enforcement via the TIP-403 Policy Registry (`TransferPolicyUpdate`, `TransferBlocked`, `BurnBlocked`). * **Issuance controls**: mint, burn, supply caps, and pause (`Mint`, `Burn`, `SupplyCapUpdate`, `PauseStateUpdate`) for real-time supply and reserve monitoring. * **Reward distribution**: yield paid to holders (`RewardDistributed`) for accurate interest accrual. These are ordinary Solidity events, so they land in Goldsky's `raw_logs` datasets and can be decoded inside a Turbo pipeline. Everything in these guides also works for standard ERC-20 stablecoins (USDC, USDT, PYUSD) on any [supported chain](/chains/supported-networks). TIP-20 just gives you the memo and policy events for free. ## The rails are multiplying Money is arriving on-chain on several rails at once, and each pursues a different thesis: A payments rail for stablecoins from Stripe and Paradigm, with memos and compliance built into the [TIP-20](https://tempo.xyz/blog/tip20/) token. An L1 for stablecoin *finance*: USDC-native gas, an on-chain [FX engine](/solutions/onchain-fx), and [CCTP](/solutions/cross-chain-settlement) moving USDC natively across 13+ chains. Tokenized *equities*: thousands of stock and ETF tokens trading 24/7, built on the [ERC-3643](https://eips.ethereum.org/EIPS/eip-3643) securities standard. Goldsky already indexes all of them, plus Plasma, Codex, Stable, Ethena, Plume, and Mantra. Pick any rail; the patterns below port across chains. ## Use cases ### Payments & stablecoins Decode `TransferWithMemo`, stream it into your ledger, and match settlements to invoices on the memo in under five seconds. Push a new OFAC address to a running pipeline in seconds, flag matching flows, and attest every decision in a TEE. Track circulating supply and collateralization in real time, and alert the moment backing slips. Match burn-and-mint USDC across every chain into one ledger, and catch in-flight transfers. Index Circle StableFX quotes and settlements for multi-currency analytics and a rate oracle. Durable, gas-sponsored disbursements (payroll, marketplace payouts, remittance) with per-payment memos. ### Tokenized assets & markets Holder registry, 24/7 price feeds, and automated dividends for tokenized stocks and RWAs. Monitor ERC-3643 identity and freeze events, and surveil for wash trading and best execution. Publish a tokenized fund's NAV to any chain on a schedule, with a Chainlink-compatible interface and a kill-switch. Sub-50ms reads for balances and history, plus indexed statements via Subgraphs and webhooks. ## Why Goldsky for regulated money Finance and risk teams evaluate infrastructure differently than growth teams. Here is how Goldsky maps to that checklist. A ledger is only as trustworthy as its inputs. [Edge RPC](/edge-rpc/why-edge) cross-validates responses across multiple nodes, enforces complete block ranges, and never returns partial `eth_getLogs` results, so you never reconcile against a missing settlement. On Tempo, sub-second and re-org-free finality means a payment you record is final; it will not unwind under your books. [Compose](/compose/introduction) traces every function call that touches an external system, with inputs and outputs saved, and can run in a Trusted Execution Environment that produces attestations proving the exact code ran with no side effects. When an examiner asks "how did you decide to freeze this account?", you have the record. Turbo replicates into *your* database (Postgres, ClickHouse, Snowflake, Kafka), co-located with your customer and product data. That keeps regulated data inside your compliance boundary and makes GDPR/data-residency obligations tractable: the data never has to live behind someone else's API. Goldsky has no token. Your finance team never has to operate a trading desk to pay an infrastructure vendor or model volatile per-query costs. Edge RPC is a flat \$5 per million requests; Turbo bills on predictable resource sizing. 24/7 on-call support with engineers who help debug pipelines and resolve incidents, the operational posture a payments business needs. ## Get started The flagship pattern: decode TIP-20 memos and match to your ledger. Stream token transfers into a database in minutes. Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Real-time payment reconciliation Source: https://docs.goldsky.com/solutions/real-time-reconciliation Decode TIP-20 transfer memos with Turbo, match onchain settlements to your ledger in real time, and auto-resolve reconciliation breaks with Compose. Traditional payment reconciliation is a batch, T+1/T+2 process: at the end of the day, an operations team matches a settlement file against the ledger and chases the breaks by hand. It is slow, expensive, and it hides problems until the next morning. Stablecoin settlement on a payments chain removes the delay from the *movement* of money. This guide removes the delay from the *accounting* for it. You will decode [TIP-20](https://tempo.xyz/blog/tip20/) transfer memos with a [Turbo pipeline](/turbo-pipelines/introduction), stream them into your own ledger database, and match each settlement to an invoice on its memo, continuously, in seconds. ## Why the memo is the missing piece A plain ERC-20 `Transfer` tells you *who paid whom, how much*. It does not tell you *what for*. That single missing field is why onchain payments have historically needed a separate, off-chain mapping to be reconcilable at all. TIP-20 adds it at the protocol level. Every payment can carry a 32-byte memo: ```solidity theme={"dark"} event TransferWithMemo( address indexed from, address indexed to, uint256 amount, bytes32 indexed memo // your invoice ID, order number, or PSP reference ); ``` Put your reference in the memo when you initiate the payment, and reconciliation stops being a fuzzy amount-and-timestamp match. It becomes a deterministic join on a key you control. ## How it works ```mermaid theme={"dark"} flowchart LR A[TIP-20 token on Tempo] -->|TransferWithMemo events| B[Turbo pipeline] B -->|decode + reshape| C[(Ledger DB
onchain_settlements)] D[(Your invoices
orders / AR)] --> E{Match on memo} C --> E E -->|matched| F[Reconciled] E -->|no match / short pay| G[Exception queue] ``` 1. **Stream** TIP-20 logs from Tempo with Turbo. 2. **Decode** `TransferWithMemo` on the fly using the token's ABI. 3. **Write** each settlement, memo included, into an `onchain_settlements` table co-located with your invoices. 4. **Match** settlements to invoices on the memo. Anything unmatched or short-paid surfaces as an exception the instant it settles. ## Prerequisites * The [Turbo CLI extension](/turbo-pipelines/cli#installation) installed and logged in to your project. * A Postgres database and a [Goldsky secret](/turbo-pipelines/pipeline-config#secrets) with its connection string. * The contract address of the TIP-20 token you settle in, and its ABI. Confirm the exact Tempo dataset name in the [Datasource explorer](https://app.goldsky.com/explore) or with `goldsky dataset list`. ## Step 1: Stream and decode settlements TIP-20 events are ordinary Solidity logs, so they land in the `raw_logs` dataset and can be decoded inside the pipeline. This mirrors the [decode custom contract events](/turbo-pipelines/sources/evm#guide-decode-custom-contract-events) pattern. ```yaml reconciliation-pipeline.yaml expandable theme={"dark"} name: tip20-reconciliation resource_size: s sources: tempo_tip20_logs: type: dataset dataset_name: tempo.raw_logs version: 1.0.0 start_at: latest # Fast-scan: only ingest logs from your settlement token filter: address = lower('0xYOUR_TIP20_TOKEN') transforms: # 1. Decode the raw log with the TIP-20 ABI decoded_payments: type: sql primary_key: id sql: | SELECT id, address AS token, _gs_log_decode( _gs_fetch_abi('https://raw.githubusercontent.com/your-org/abis/main/tip20.json', 'raw'), topics, data ) AS decoded, block_number, block_timestamp, transaction_hash, _gs_op FROM tempo_tip20_logs WHERE address = lower('0xYOUR_TIP20_TOKEN') # 2. Keep only TransferWithMemo events and flatten the fields settlements: type: sql primary_key: id sql: | SELECT id, token, decoded.event_params[1] AS from_address, decoded.event_params[2] AS to_address, CAST(decoded.event_params[3] AS DECIMAL(38, 0)) AS amount, decoded.event_params[4] AS memo, to_timestamp(block_timestamp) AS settled_at, transaction_hash, _gs_op FROM decoded_payments WHERE decoded IS NOT NULL AND decoded.event_signature = 'TransferWithMemo' sinks: ledger_settlements: type: postgres from: settlements schema: ledger table: onchain_settlements secret_name: MY_POSTGRES primary_key: id ``` Deploy and watch it live: ```bash theme={"dark"} goldsky turbo apply reconciliation-pipeline.yaml goldsky turbo inspect reconciliation-pipeline.yaml -n settlements ``` Don't want to hardcode the ABI? `_gs_fetch_abi` can pull it from a block explorer with an Etherscan-compatible API (`_gs_fetch_abi('', 'etherscan')`). Fetching keeps the pipeline in sync if the token's interface is upgraded. ## Step 2: Reconcile against your ledger Your `onchain_settlements` table now fills in real time, next to your existing `invoices` table. Because you control the memo, matching is a single join. Encode your invoice reference into the 32-byte memo when you create the payment (for example a zero-padded ID or a hash), and store the same encoding on the invoice. ```sql theme={"dark"} SELECT i.invoice_id, i.amount_due, s.amount AS amount_settled, s.settled_at, s.transaction_hash, CASE WHEN s.id IS NULL THEN 'unpaid' WHEN s.amount >= i.amount_due THEN 'reconciled' WHEN s.amount < i.amount_due THEN 'short_paid' END AS status FROM ledger.invoices i LEFT JOIN ledger.onchain_settlements s ON lower(s.memo) = lower(i.memo_ref) WHERE i.status = 'open'; ``` Everything that returns `unpaid` past its due date, `short_paid`, or arrives with a memo that matches no invoice (an *unexpected* payment) is a reconciliation break, surfaced the moment it settles, not the next morning. ## Step 3: Make exceptions live Two options turn the query above into an always-on control. Use the [PostgreSQL aggregate sink](/turbo-pipelines/sinks/postgres-aggregate) to maintain a running, real-time rollup (for example, a running total settled per token) without a scheduled job. ```yaml theme={"dark"} sinks: settled_totals: type: postgres_aggregate from: settlements schema: ledger landing_table: settlements_log agg_table: settled_totals primary_key: id secret_name: MY_POSTGRES group_by: token: type: text aggregate: total_settled: # running sum, maintained by a DB trigger from: amount fn: sum type: numeric(38,0) settlement_count: fn: count ``` Send unmatched settlements straight to your ops tooling. Add a transform that flags settlements whose memo is not in your open-invoice set (a [dynamic table](/turbo-pipelines/transforms/dynamic-tables) of expected references), then route it to a [webhook sink](/turbo-pipelines/sinks/webhook): ```yaml theme={"dark"} transforms: # Expected payment references, kept in sync from your invoicing system open_invoices: type: dynamic_table backend_type: Postgres backend_entity_name: open_invoices secret_name: MY_POSTGRES # A settlement whose memo matches no open invoice is a break unmatched_settlements: type: sql primary_key: id sql: | SELECT id, token, from_address, amount, memo, settled_at, transaction_hash, _gs_op FROM settlements WHERE NOT dynamic_table_check('open_invoices', lower(memo)) sinks: # Only unmatched settlements reach the break URL - reconciled payments do not break_alerts: type: webhook from: unmatched_settlements url: https://ops.example.com/reconciliation/break one_row_per_request: true secret_name: OPS_WEBHOOK_AUTH ``` Keep `open_invoices` current from your invoicing system (insert a reference when an invoice opens, delete it when it is paid or cancelled) so the break feed carries only genuinely unexpected settlements. ## Step 4: Trust your reads Reconciliation is only as reliable as the data feeding it. Point the indexers and verification jobs behind this workflow at [Edge RPC](/edge-rpc/why-edge): * **Cross-validation and block-range enforcement** mean you never reconcile against a missing log or a gap in `eth_getLogs`. * **Automatic failover** keeps the ledger current through provider outages. On Tempo specifically, transactions reach **sub-second, re-org-free finality**, so a settlement you record will not later be unwound. That is the property tradfi back-offices have always wanted from a settlement rail. ## Optional: auto-resolve breaks with Compose For breaks that can be handled programmatically (retrying a failed payout, issuing a refund for an overpayment, or opening a ticket), trigger a [Compose](/compose/introduction) task from the exception. Compose gives you **durable execution** (the action completes even through failures) and a **full trace** of every step, so each automated resolution is auditable. See [task triggers](/compose/task-triggers) to fire a task from a webhook or onchain event. ## Business outcomes * **Reconciliation moves from overnight to real time.** Breaks surface in seconds, not the next business day. * **Fewer manual matches.** A deterministic memo join replaces amount-and-timestamp guesswork, shrinking the exception queue. * **Faster cash application.** Payments apply to invoices as they settle, tightening working-capital cycles. * **A clean audit trail.** Every settlement, its memo, and its match status live in your own database. ## Resources * [Decode custom contract events with Turbo](/turbo-pipelines/sources/evm#guide-decode-custom-contract-events) * [PostgreSQL aggregate sink](/turbo-pipelines/sinks/postgres-aggregate) * [Stablecoin transfers guide](/turbo-pipelines/guides/token-transfers/stablecoin-transfers) * [Tempo chain reference](/chains/supported-networks?chain=tempo) Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Securities compliance & market surveillance Source: https://docs.goldsky.com/solutions/securities-compliance Monitor ERC-3643 identity and freeze events and run real-time market surveillance on tokenized securities with Turbo and Compose. Tokenized stocks are securities, and securities carry obligations that payment stablecoins do not: only eligible, identity-verified investors may hold them, transfers must respect restrictions, and the market they trade in must be surveilled for abuse. The [ERC-3643](https://eips.ethereum.org/EIPS/eip-3643) standard builds identity and compliance into the token itself, and every check it performs emits an onchain event. This guide covers both halves of securities compliance: **transfer-level compliance** (identity, eligibility, freezes) and **market surveillance** (wash trading, best execution). It is the securities counterpart to the payments-focused [AML monitoring](/solutions/compliance-monitoring) guide. ## Part A - transfer & identity compliance ERC-3643 tokens enforce rules through an identity registry and a compliance contract, and they can freeze holdings or force recovery. Stream those events to keep a real-time compliance picture. ```mermaid theme={"dark"} flowchart LR A[ERC-3643 token] -->|identity + freeze events| B[Turbo pipeline] B --> C[(Compliance ledger)] B -->|eligibility check needed| D[Compose task] D -->|verify + attest| E[Identity provider / registry] ``` ### Stream identity and freeze events ```yaml erc3643-compliance.yaml expandable theme={"dark"} name: erc3643-compliance resource_size: s sources: security_logs: type: dataset dataset_name: ethereum.raw_logs version: 1.2.0 start_at: latest filter: address = lower('0xTOKENIZED_SECURITY') transforms: events: type: sql primary_key: id sql: | SELECT id, address AS token, _gs_log_decode( _gs_fetch_abi('https://raw.githubusercontent.com/your-org/abis/main/erc3643.json', 'raw'), topics, data ) AS decoded, block_timestamp, transaction_hash, _gs_op FROM security_logs compliance_events: type: sql primary_key: id sql: | SELECT id, token, decoded.event_signature AS event, decoded.event_params[1] AS subject, to_timestamp(block_timestamp) AS at, transaction_hash, _gs_op FROM events WHERE decoded IS NOT NULL AND decoded.event_signature IN ( 'IdentityRegistered', 'IdentityRemoved', 'AddressFrozen', 'TokensFrozen', 'TokensUnfrozen', 'RecoverySuccess', 'Paused', 'Unpaused' ) sinks: compliance_ledger: type: postgres from: compliance_events schema: compliance table: security_events secret_name: MY_POSTGRES primary_key: id ``` This gives compliance a live feed of every registration, freeze, and recovery: the events an examiner will ask you to produce. ### Attest eligibility decisions with Compose When a new holder must be onboarded or a transfer needs an eligibility check, route it to a [Compose](/compose/introduction) task that verifies against your identity provider and records the outcome in a TEE. The pattern is identical to the [AML screening task](/solutions/compliance-monitoring#step-4-attest-every-decision-with-compose): fetch the verification, write an attestation on-chain, and keep the full trace. That attestation is what makes an eligibility decision defensible. ## Part B - market surveillance Tokenized equities trade 24/7 on open venues, which means the market-integrity checks a broker-dealer runs (wash trading, spoofing, best execution) now run against public onchain data in real time. ### Detect wash trades A wash trade is a sale with **no change in beneficial ownership**: the same owner on both sides, usually across two different addresses. The operative word is *same*: it is not enough for both parties to be known investors. You have to resolve each address to its beneficial owner and check that the two owners **match**. A membership test like `dynamic_table_check('watchlist', sender) AND dynamic_table_check('watchlist', recipient)` is **wrong** here: it fires on *any* trade between two listed investors, not just self-trades, flooding surveillance with false positives. Dynamic tables answer "is this address known?", not "do these two addresses share an owner?" Resolve both counterparties to a beneficial-owner ID with an [HTTP handler](/turbo-pipelines/transforms/http-handler) that calls your identity/KYC system, then flag trades where the two owners are equal. ```yaml wash-trade-surveillance.yaml expandable theme={"dark"} name: wash-trade-surveillance resource_size: s sources: trades: type: dataset dataset_name: robinhood_testnet.erc20_transfers version: 1.0.0 start_at: latest transforms: # Resolve each side to its beneficial owner via your identity service. # The endpoint echoes each row and adds sender_owner, recipient_owner, # and wash_suspect (true when both addresses resolve to the SAME # non-null owner - the same-owner comparison happens in the resolver, # which already has both owner IDs in hand). with_owners: type: handler from: trades url: https://identity.example.com/resolve-beneficial-owners primary_key: id secret_name: IDENTITY_API_SECRET schema_override: sender_owner: Utf8 recipient_owner: Utf8 wash_suspect: Boolean sinks: surveillance_alerts: type: webhook from: with_owners url: https://surveillance.example.com/alerts/wash-trade one_row_per_request: true secret_name: SURVEILLANCE_WEBHOOK_AUTH ``` Your resolver's ownership graph is the source of truth and is queried live, so linking new addresses to an owner takes effect on the next trade with no redeploy. The surveillance receiver routes on `wash_suspect`: every trade arrives with its resolved owners attached, so the alert record and the audit trail are the same stream. To cut volume, add a SQL pre-filter before the handler that drops trades where neither side is a known investor; a [dynamic table](/turbo-pipelines/transforms/dynamic-tables) membership check is fine for *that*. Just don't mistake membership for detection; the same-owner comparison is what identifies a wash trade. If you maintain the address→owner map as a table, you can equivalently detect downstream with a Postgres self-join: join trades to the mapping on both `sender` and `recipient` and keep rows where the owner IDs match. ### Best execution Compare each fill to the prevailing market price at the moment of the trade. Join your trade stream to the VWAP price feed from the [tokenized-equities data layer](/solutions/tokenized-equities#step-2-publish-a-24/7-price-feed) and flag fills that executed materially outside the spread, the raw material for a best-execution report. ### Attest and report with Compose A surveillance alert becomes a case, and a case becomes a filing. A [Compose](/compose/introduction) task enriches each alert, opens a case in your surveillance system, and, where required, files a regulatory report, with every step [traced](/compose/debugging) and TEE-attested. Durable execution means a required report is never dropped because a downstream API blipped. ## Business outcomes * **Real-time, not T+1, surveillance**: abuse is flagged as it settles. * **Provable eligibility and freezes**: a live compliance ledger plus TEE-attested decisions answer "who was allowed to hold this, and why?" * **One widening net**: the identity graph updates a running pipeline in seconds. * **Data stays in your boundary**: compliance events and identity data live in your own database. ## Resources * [ERC-3643 standard](https://eips.ethereum.org/EIPS/eip-3643) * [AML monitoring (payments)](/solutions/compliance-monitoring) * [Tokenized equities & RWA data layer](/solutions/tokenized-equities) Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Tokenized equities & RWA data layer Source: https://docs.goldsky.com/solutions/tokenized-equities Build the holder registry, price feed, and corporate-action engine for tokenized stocks and RWAs with Subgraphs, Turbo, and Compose. Tokenized equities are here. [Robinhood Chain](/chains/supported-networks?chain=robinhood-chain), an Arbitrum-based L2, lists thousands of tokenized stocks and ETFs that trade 24/7 and self-custody in a wallet, and the broader RWA market runs largely on the [ERC-3643](https://eips.ethereum.org/EIPS/eip-3643) permissioned-token standard. A tokenized stock is not just an ERC-20 with a ticker. It is a security, and it needs the data infrastructure a security has always needed: a **holder registry** (who owns what, right now), a **price feed** that never closes, and a **corporate-actions engine** for dividends and splits. This guide builds all three on Goldsky. ## The three data services ```mermaid theme={"dark"} flowchart TB A[Tokenized stock
ERC-3643 token] --> B[Subgraph
holder registry / cap table] A --> C[Turbo
24/7 trades & price] B --> D[Compose
dividend & corporate actions] C --> D D -->|pay holders| E[Stablecoin distribution] ``` | Service | Product | Output | | - | - | - | | Holder registry / cap table | [Subgraphs](/subgraphs/introduction) or [Turbo](/turbo-pipelines/introduction) | Current balance per holder, per token | | 24/7 price & trade feed | [Turbo](/turbo-pipelines/introduction) | OHLC, VWAP, last trade | | Dividends & corporate actions | [Compose](/compose/introduction) | Pro-rata stablecoin payouts, splits | ## Step 1: Maintain a live holder registry The cap table is the foundation: every downstream service (dividends, reporting, compliance) reads from it. Stream transfers of the tokenized stock and keep a running balance per holder. ```yaml holder-registry.yaml expandable theme={"dark"} name: tokenized-stock-holders resource_size: s sources: rh_transfers: type: dataset dataset_name: robinhood_testnet.erc20_transfers version: 1.0.0 start_at: earliest transforms: # Every transfer moves a balance: CREDIT the recipient (+amount) and # DEBIT the sender (-amount). Emitting both rows is what makes the # running balance net correctly - a credit-only stream overstates holdings. balance_deltas: type: sql primary_key: id sql: | -- Credit: tokens received (also covers mints, where the sender is the zero address) SELECT CONCAT(id, '-in') AS id, lower(recipient) AS holder, lower(address) AS token, CAST(u256_to_string(to_u256(amount)) AS DECIMAL(38, 0)) AS delta, _gs_op FROM rh_transfers WHERE recipient <> '0x0000000000000000000000000000000000000000' UNION ALL -- Debit: tokens sent (also covers burns, where the recipient is the zero address) SELECT CONCAT(id, '-out') AS id, lower(sender) AS holder, lower(address) AS token, -CAST(u256_to_string(to_u256(amount)) AS DECIMAL(38, 0)) AS delta, _gs_op FROM rh_transfers WHERE sender <> '0x0000000000000000000000000000000000000000' sinks: # The aggregate sink sums delta per (holder, token) via a DB trigger, # maintaining the current balance incrementally. holdings: type: postgres_aggregate from: balance_deltas schema: registry landing_table: holdings_log agg_table: holdings primary_key: id secret_name: MY_POSTGRES group_by: holder: type: text token: type: text aggregate: balance: from: delta fn: sum type: numeric(38,0) ``` Two details make this correct: each emitted row gets a **unique `id`** (`-in`/`-out` suffix) so the landing table never dedupes distinct transfers, and the zero address is excluded so mints and burns adjust only the real holder. Filter out `balance = 0` rows when you read the `holdings` table to get the live holder set. For ERC-3643 securities, decode the `raw_logs` instead and also capture identity events (`IdentityRegistered`) so your registry links each holder to a verified identity, not just an address. A [Subgraph](/subgraphs/introduction) is often the cleaner home for a registry you query by holder: it gives you a GraphQL API for statements and positions with no extra service. Confirm the dataset slug for your chain in the [Datasource explorer](https://app.goldsky.com/explore). The registry answers the questions a transfer agent lives on: *who holds this security, how much, and since when*, as of the latest block, not last night's snapshot. ## Step 2: Publish a 24/7 price feed Tokenized equities trade around the clock, so the "closing price" is a live figure. Index trades from the venue (a DEX pool or the chain's matching contract) and roll them into OHLC/VWAP. This is the [DEX trades](/turbo-pipelines/guides/stream-dex-trades) pattern applied to a stock token; write to [ClickHouse](/turbo-pipelines/sinks/clickhouse) for fast time-series queries, or maintain a live last-price with the [PostgreSQL aggregate sink](/turbo-pipelines/sinks/postgres-aggregate). ```sql theme={"dark"} -- 1-minute OHLC from a trades table SELECT token, toStartOfMinute(traded_at) AS minute, argMin(price, traded_at) AS open, max(price) AS high, min(price) AS low, argMax(price, traded_at) AS close, sum(quantity) AS volume FROM trades GROUP BY token, minute; ``` ## Step 3: Distribute dividends and corporate actions This is where the cap table pays off, literally. A [Compose](/compose/introduction) task reads the holder registry at a record-date block and pays each holder their pro-rata dividend in a standard ERC-20 stablecoin, recording the batch in your ledger for reconciliation. ```typescript src/tasks/pay-dividend.ts theme={"dark"} import type { TaskContext, Chain } from "compose"; // Dividends must go out on the SAME network the stock token lives on - the // chain this guide indexes holders from. const STOCK_CHAIN: Chain = { id: 46630, name: "Robinhood Chain Testnet", testnet: true, nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 }, rpcUrls: { default: { http: ["https://edge.goldsky.com/standard/evm/46630?secret=YOUR_SECRET"] }, public: { http: ["https://edge.goldsky.com/standard/evm/46630?secret=YOUR_SECRET"] }, }, blockExplorers: { default: { name: "Explorer", url: "https://explorer.testnet.chain.robinhood.com" } }, }; export async function main( context: TaskContext, payload: { token: string; dividendPerToken: string; recordBlock: number }, ) { const { fetch, evm } = context; // Holders as of the record-date block, from your registry service const holders = await fetch<{ address: string; balance: string }[]>( `https://registry.example.com/holders?token=${payload.token}&block=${payload.recordBlock}`, ); const wallet = await evm.wallet({ name: "dividend-payer", sponsorGas: true }); const results = await Promise.allSettled( holders.map((h) => { const amount = (BigInt(h.balance) * BigInt(payload.dividendPerToken)) / 10n ** 18n; // Robinhood Chain stablecoins are ERC-20 - pay with the standard transfer. return wallet.writeContract( STOCK_CHAIN, "0xDIVIDEND_STABLECOIN", "transfer(address,uint256)", [h.address, amount], ); }), ); const paid = results.filter((r) => r.status === "fulfilled").length; return { holders: holders.length, paid }; } ``` Pay on the network your tokenized stock lives on. This task indexes holders from Robinhood Chain, so `STOCK_CHAIN` must be Robinhood Chain. Sending to any other network (the example previously defaulted to Arbitrum) would deliver dividends to look-alike addresses that never held the stock. Every payout is durable (it completes through failures) and [traced](/compose/debugging) end to end. For stock splits, reverse splits, and mergers, follow the [corporate-actions distributor guide](/compose/guides/build-a-corporate-actions-distributor), which handles the ratio math and multi-step distributions. ## Step 4: Reconcile with your transfer agent Because the registry lives in *your* database, reconciling the on-chain holder list against your books of record is a query, not a project: the same [real-time reconciliation](/solutions/real-time-reconciliation) pattern, applied to positions instead of payments. Breaks (an address holding tokens with no matching book entry, or vice versa) surface immediately. ## Business outcomes * **A real-time cap table** replaces end-of-day position files. * **A market that never closes** gets a price feed that never closes. * **Automated, auditable corporate actions**: dividends and splits execute as code, with a trace for every payment. * **Chain-agnostic**: the same pattern covers Robinhood Chain, ERC-3643 securities on Ethereum/Polygon, and RWA chains like [Plume](/chains/supported-networks?chain=plume) and [Mantra](/chains/supported-networks?chain=mantra). ## Resources * [Stream DEX trades](/turbo-pipelines/guides/stream-dex-trades) * [Build a corporate-actions distributor](/compose/guides/build-a-corporate-actions-distributor) * [Securities compliance & surveillance](/solutions/securities-compliance) Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Proof-of-reserves & treasury intelligence Source: https://docs.goldsky.com/solutions/treasury-and-reserves Track stablecoin supply and collateralization in real time with Turbo, and attest reserves continuously with Compose. A stablecoin issuer's most important number is its collateralization ratio: is every token in circulation backed by reserves? Today that assurance usually arrives as a **quarterly attestation PDF**. Between reports, holders, treasurers, and risk teams are flying blind. This guide replaces the PDF with a live signal. [Turbo](/turbo-pipelines/introduction) tracks circulating supply as it changes; [Compose](/compose/introduction) continuously checks it against custodial reserves and attests the result on-chain, the *monitoring and verification* counterpart to the [NAV oracle publisher](/compose/guides/build-a-nav-oracle). ## What you get * **Real-time circulating supply** per token and per chain, from mint/burn events. * **A continuous collateralization ratio**: onchain supply checked against off-chain reserves on a schedule. * **An automatic alert (and optional pause)** the moment backing slips below a threshold. * **Treasury analytics**: velocity, holder concentration, and float in your warehouse. ## How it works ```mermaid theme={"dark"} flowchart LR A[TIP-20 mint / burn / supply events] --> B[Turbo pipeline] B --> C[(Supply ledger)] D[Compose cron task
every 5 min] -->|read on-chain supply| C D -->|fetch reserves| E[Custodian / bank API] D -->|ratio < threshold?| F{Decision} F -->|healthy| G[Attest ratio on-chain] F -->|breach| H[Alert + optional pause] ``` ## Step 1: Stream supply changes with Turbo TIP-20 emits explicit `Mint`, `Burn`, `SupplyCapUpdate`, and `RewardDistributed` events. Decode them from `raw_logs` to build a supply ledger. ```yaml supply-monitor.yaml expandable theme={"dark"} name: tip20-supply-monitor resource_size: s sources: tempo_tip20_logs: type: dataset dataset_name: tempo.raw_logs version: 1.0.0 start_at: latest filter: address = lower('0xYOUR_TIP20_TOKEN') transforms: decoded: type: sql primary_key: id sql: | SELECT id, address AS token, _gs_log_decode( _gs_fetch_abi('https://raw.githubusercontent.com/your-org/abis/main/tip20.json', 'raw'), topics, data ) AS decoded, block_timestamp, transaction_hash, _gs_op FROM tempo_tip20_logs supply_events: type: sql primary_key: id sql: | SELECT id, token, decoded.event_signature AS event, CAST(decoded.event_params[2] AS DECIMAL(38, 0)) AS amount, to_timestamp(block_timestamp) AS at, transaction_hash, _gs_op FROM decoded WHERE decoded IS NOT NULL AND decoded.event_signature IN ('Mint', 'Burn') sinks: supply_ledger: type: postgres from: supply_events schema: treasury table: supply_events secret_name: MY_POSTGRES primary_key: id ``` For standard ERC-20 stablecoins that mint and burn via transfers to and from the zero address, use the curated `erc20_transfers` dataset (`tip20_transfers` on Tempo) and detect `sender = '0x0000000000000000000000000000000000000000'` (mint) or `recipient = '0x0000000000000000000000000000000000000000'` (burn) instead of decoding custom events. Circulating supply is then a running total of mints minus burns. Maintain it incrementally with the [PostgreSQL aggregate sink](/turbo-pipelines/sinks/postgres-aggregate), or as a view: ```sql theme={"dark"} SELECT token, SUM(CASE WHEN event = 'Mint' THEN amount ELSE -amount END) AS circulating_supply FROM treasury.supply_events GROUP BY token; ``` For deeper treasury analytics (velocity, holder concentration, per-chain float), route the same stream to [ClickHouse](/turbo-pipelines/sinks/clickhouse) or your warehouse. ## Step 2: Attest collateralization with Compose A scheduled Compose task closes the loop: read on-chain supply, fetch reserves, compare, and act. Running it in a TEE means the attestation proves the exact reconciliation logic ran. ```typescript src/tasks/reserve-check.ts theme={"dark"} import type { TaskContext } from "compose"; const TOKEN = "0xYOUR_TIP20_TOKEN"; const ATTESTOR = "0xYOUR_RESERVE_ATTESTOR"; const MIN_RATIO = 1.0; // 100% backing export async function main(context: TaskContext) { const { fetch, evm } = context; const wallet = await evm.wallet({ name: "reserve-attestor", sponsorGas: true }); // 1. On-chain circulating supply - readContract is a wallet method (see Contracts) const supply = await wallet.readContract( evm.chains.tempo, TOKEN, "totalSupply() returns (uint256)", [], ); // 2. Off-chain reserves from the custodian, retried durably const reserves = await fetch<{ totalReservesUsd: number; asOf: string }>( "https://custodian.example.com/v1/reserves", { max_attempts: 3, initial_interval_ms: 1000, backoff_factor: 2 }, ); const ratio = reserves.totalReservesUsd / Number(supply / 10n ** 6n); // 6-decimal USD token if (ratio < MIN_RATIO) { // 3a. Breach - alert, and optionally pause the token (requires PAUSE_ROLE) await fetch("https://ops.example.com/alerts/reserve-breach", { method: "POST", body: JSON.stringify({ token: TOKEN, ratio, reserves, supply: supply.toString() }), }); return { healthy: false, ratio }; } // 3b. Healthy - record the ratio on-chain await wallet.writeContract( evm.chains.tempo, ATTESTOR, "recordReserveRatio(address,uint256,uint64)", [TOKEN, BigInt(Math.round(ratio * 1e18)), BigInt(Math.floor(new Date(reserves.asOf).getTime() / 1000))], ); return { healthy: true, ratio }; } ``` Schedule it in `compose.yaml`: ```yaml theme={"dark"} triggers: - type: "cron" expression: "*/5 * * * *" # every 5 minutes ``` On-chain reads go through `wallet.readContract` (see [Smart Contracts](/compose/context/evm/contracts)). View calls return the decoded value directly and cost no gas, so the read reuses the same sponsored wallet. That wallet's writes are gas-sponsored (`sponsorGas: true`), so the attestor never needs funding. ## Step 3: Publish the feed (optional) To expose reserves to other applications with a Chainlink-compatible interface and an operator kill-switch, follow the [multi-chain NAV oracle guide](/compose/guides/build-a-nav-oracle). It is the publishing complement to the monitoring in this guide: this task decides *whether* reserves are healthy; the NAV oracle *broadcasts* the figure to every chain that needs it. ## Circuit breaker pattern Because the check runs continuously, you can wire the breach branch to a real control instead of just an alert: pause the token via `PAUSE_ROLE`, halt a payout keeper, or throttle minting. Compose's [durable execution](/compose/introduction) guarantees the breaker actually fires and completes even through transient failures, and the whole sequence is traced for the post-incident review. ## Business outcomes * **Continuous assurance replaces a quarterly PDF.** Collateralization is a live number, attested on-chain. * **Regulatory readiness.** Reserve monitoring and attestation map directly onto stablecoin reserve-reporting regimes. * **Faster incident response.** A breach triggers an alert (or a pause) in minutes, with a full audit trail. * **One source of treasury truth.** Supply, velocity, and reserves live in your own database and warehouse. ## Resources * [Build a multi-chain NAV oracle](/compose/guides/build-a-nav-oracle) * [PostgreSQL aggregate sink](/turbo-pipelines/sinks/postgres-aggregate) * [Compose EVM context](/compose/context/evm/overview) * [Compliance & AML monitoring](/solutions/compliance-monitoring) Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help. # Blocks Subgraphs Source: https://docs.goldsky.com/subgraphs/blocks-subgraphs The free blocks subgraphs were sunset on 31 August 2026 The free blocks subgraphs were sunset on **Monday, 31 August 2026 at 12:00 UTC**. A few endpoints still respond, but they are no longer maintained and will be removed without further notice. Any copy of one you deployed into your own project bills as normal subgraph usage. For block number, hash and timestamp lookups, [`eth_getBlockByNumber`](/edge-rpc/evm/methods/eth_getBlockByNumber) on [Goldsky Edge](/edge-rpc/introduction) covers the same ground. For anything else, contact [support@goldsky.com](mailto:support@goldsky.com) and we'll help you find the right path. Blocks subgraphs are commonly needed for applications that require block-level data such as timestamps, block numbers, and other metadata. However, indexing blocks across an entire chain can be resource-intensive and expensive. ## Free blocks subgraphs Goldsky provided free, pre-indexed blocks subgraphs on the shared community project. They were always meant for exploratory use and lightweight testing with a 50/10s rate limit, never for production or scraping workloads. They are no longer maintained. Do not build on them. ### Endpoint format ``` https://api.goldsky.com/api/public/project_cl8ylkiw00krx0hvza0qw17vn/subgraphs/blocks/{chain-slug}/gn ``` Replace `{chain-slug}` with the chain slug from the list below. ### Example To query the Base blocks subgraph: ``` https://api.goldsky.com/api/public/project_cl8ylkiw00krx0hvza0qw17vn/subgraphs/blocks/base/gn ``` ## Endpoints still responding Most of these endpoints are already gone. The following still answer, unmaintained, and may stop at any time: | Chain | Slug | | - | - | | Base | `base` | | Blast | `blast` | | BNB Smart Chain | `bsc` | | Celo | `celo` | | Ethereum | `mainnet` | | Filecoin | `filecoin-4760001` | | HyperEVM | `hyperevm` | | Linea | `linea` | | Mantle | `mantle` | | Optimism | `optimism` | | Plasma | `plasma-mainnet` | | Plume Mainnet | `plume-mainnet` | | Polygon | `matic` | | World Chain | `worldchain-mainnet` | Any network not in this list has already been removed. ## Migrating [Goldsky Edge](/edge-rpc/introduction) serves block data per request, with no subgraph to run or pay storage on. [`eth_getBlockByNumber`](/edge-rpc/evm/methods/eth_getBlockByNumber) returns the number, hash, parent hash and timestamp for a block, which covers most of what these subgraphs are used for. If you query blocks in a way that request-level lookups don't cover, or you need a chain Edge doesn't serve yet, contact [support@goldsky.com](mailto:support@goldsky.com) and we'll work out the right option with you. # Deploy a subgraph Source: https://docs.goldsky.com/subgraphs/deploying-subgraphs Deploy a subgraph to Goldsky from source code, via migration, or with instant no-code subgraphs.